diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 # Revision history for type-of-html
 
+## 1.3.1.0  -- 2017-12-28
+
+* internal cleanup
+* make constraints more concise
+
 ## 1.3.0.0  -- 2017-12-12
 
 * add Either
diff --git a/src/Html.hs b/src/Html.hs
--- a/src/Html.hs
+++ b/src/Html.hs
@@ -55,5 +55,6 @@
 -- | Orphan show instances to faciliate ghci development.
 instance                     Document ((a :@: b) c) => Show ((a :@: b) c) where show = renderString
 instance {-# OVERLAPPING #-} Document ((a :@: b) c) => Show [(a :@: b) c] where show = renderString
+instance                     Document (a := b)      => Show (a := b)      where show = renderString
 instance                     Document (a # b)       => Show (a # b)       where show = renderString
 instance {-# OVERLAPPING #-} Document (a # b)       => Show [a # b]       where show = renderString
diff --git a/src/Html/Attribute.hs b/src/Html/Attribute.hs
--- a/src/Html/Attribute.hs
+++ b/src/Html/Attribute.hs
@@ -389,5 +389,5 @@
 wrap_ :: a -> 'WrapA := a
 wrap_ = AT
 
-addAttributes :: (a ??> (b # b'), a ?> c) => b' -> (a :@: b) c -> (a :@: (b # b')) c
+addAttributes :: (a <?> (b # b')) c => b' -> (a :@: b) c -> (a :@: (b # b')) c
 addAttributes b' (WithAttributes b c) = WithAttributes (b # b') c
diff --git a/src/Html/Convert.hs b/src/Html/Convert.hs
--- a/src/Html/Convert.hs
+++ b/src/Html/Convert.hs
@@ -34,7 +34,7 @@
 newtype Converted = Converted {unConv :: B.Builder} deriving (M.Monoid,S.Semigroup)
 instance IsString Converted where fromString = convert
 
-{-| Convert a type efficienctly to different string like types.  Add
+{-| Convert a type efficienctly to a renderable representation.  Add
   instances if you want use custom types in your document.
 
 @
@@ -75,58 +75,25 @@
 class Convert a where
   convert :: a -> Converted
 
-instance Convert () where
-  {-# INLINE convert #-}
-  convert _ = mempty
-instance Convert (Raw Char) where
-  {-# INLINE convert #-}
-  convert (Raw c) = Converted (B.charUtf8 c)
-instance Convert (Raw String) where
-  {-# INLINE convert #-}
-  convert (Raw x) = stringConvRaw x
-instance Convert (Raw T.Text) where
-  {-# INLINE convert #-}
-  convert (Raw x) = Converted (T.encodeUtf8Builder x)
-instance Convert (Raw TL.Text) where
-  {-# INLINE convert #-}
-  convert (Raw x) = Converted (TL.encodeUtf8Builder x)
-instance Convert (Raw B.Builder) where
-  {-# INLINE convert #-}
-  convert (Raw x) = Converted x
-instance Convert Char where
-  {-# INLINE convert #-}
-  convert = Converted . BP.primBounded escapeUtf8
-instance Convert String where
-  {-# INLINE convert #-}
-  convert = stringConv
-instance Convert T.Text where
-  {-# INLINE convert #-}
-  convert = Converted . T.encodeUtf8BuilderEscaped escape
-instance Convert TL.Text where
-  {-# INLINE convert #-}
-  convert = Converted . TL.encodeUtf8BuilderEscaped escape
-instance Convert Int where
-  {-# INLINE convert #-}
-  convert = Converted . B.intDec
-instance Convert Integer where
-  {-# INLINE convert #-}
-  convert = Converted . B.integerDec
-instance Convert Natural where
-  {-# INLINE convert #-}
-  convert = Converted . B.integerDec . fromIntegral
-instance Convert Float where
-  {-# INLINE convert #-}
-  convert = Converted . U.byteStringCopy . toShortest . realToFrac
-instance Convert Double where
-  {-# INLINE convert #-}
-  convert = Converted . U.byteStringCopy . toShortest
-instance Convert Word where
-  {-# INLINE convert #-}
-  convert = Converted . B.wordDec
-instance KnownSymbol a => Convert (Proxy a) where
-  {-# INLINE convert #-}
-  convert = Converted . U.byteStringCopy . fromString . symbolVal
+instance KnownSymbol a => Convert (Proxy a) where {-# INLINE convert #-}; convert = Converted . U.byteStringCopy . fromString . symbolVal
 
+instance Convert ()              where {-# INLINE convert #-}; convert = const mempty
+instance Convert (Raw Char)      where {-# INLINE convert #-}; convert = Converted . B.charUtf8 . fromRaw
+instance Convert (Raw String)    where {-# INLINE convert #-}; convert = stringConvRaw . fromRaw
+instance Convert (Raw T.Text)    where {-# INLINE convert #-}; convert = Converted . T.encodeUtf8Builder . fromRaw
+instance Convert (Raw TL.Text)   where {-# INLINE convert #-}; convert = Converted . TL.encodeUtf8Builder . fromRaw
+instance Convert (Raw B.Builder) where {-# INLINE convert #-}; convert = Converted . fromRaw
+instance Convert Char            where {-# INLINE convert #-}; convert = Converted . BP.primBounded escapeUtf8
+instance Convert String          where {-# INLINE convert #-}; convert = stringConv
+instance Convert T.Text          where {-# INLINE convert #-}; convert = Converted . T.encodeUtf8BuilderEscaped escape
+instance Convert TL.Text         where {-# INLINE convert #-}; convert = Converted . TL.encodeUtf8BuilderEscaped escape
+instance Convert Int             where {-# INLINE convert #-}; convert = Converted . B.intDec
+instance Convert Integer         where {-# INLINE convert #-}; convert = Converted . B.integerDec
+instance Convert Natural         where {-# INLINE convert #-}; convert = Converted . B.integerDec . fromIntegral
+instance Convert Float           where {-# INLINE convert #-}; convert = Converted . U.byteStringCopy . toShortest . realToFrac
+instance Convert Double          where {-# INLINE convert #-}; convert = Converted . U.byteStringCopy . toShortest
+instance Convert Word            where {-# INLINE convert #-}; convert = Converted . B.wordDec
+
 {-# INLINE builderCString# #-}
 builderCString# :: BP.BoundedPrim Word8 -> Addr# -> Converted
 builderCString# bp addr = Converted $ BP.primUnfoldrBounded bp go 0
@@ -184,17 +151,13 @@
       BP.word8 BP.>*< BP.word8 BP.>*< BP.word8 BP.>*< BP.word8 BP.>*< BP.word8
 
 {-# RULES "CONVERTED literal" forall a.
-    stringConv (unpackCString# a)
-      = builderCString# escape a #-}
+    stringConv (unpackCString# a) = builderCString# escape a #-}
 
 {-# RULES "CONVERTED literal raw" forall a.
-    stringConvRaw (unpackCString# a)
-      = builderCString# (BP.liftFixedToBounded BP.word8) a #-}
+    stringConvRaw (unpackCString# a) = builderCString# (BP.liftFixedToBounded BP.word8) a #-}
 
 {-# RULES "CONVERTED literal utf8" forall a.
-    stringConv (unpackCStringUtf8# a)
-      = convert (T.pack (unpackCStringUtf8# a)) #-}
+    stringConv (unpackCStringUtf8# a) = convert (T.pack (unpackCStringUtf8# a)) #-}
 
 {-# RULES "CONVERTED literal utf8 raw" forall a.
-    stringConvRaw (unpackCStringUtf8# a)
-      = convert (Raw (T.pack (unpackCStringUtf8# a))) #-}
+    stringConvRaw (unpackCStringUtf8# a) = convert (Raw (T.pack (unpackCStringUtf8# a))) #-}
diff --git a/src/Html/Element.hs b/src/Html/Element.hs
--- a/src/Html/Element.hs
+++ b/src/Html/Element.hs
@@ -13,875 +13,875 @@
 a_ :: ('A ?> a) => a -> 'A > a
 a_ = WithAttributes ()
 
-a_A :: ('A ??> a, 'A ?> b) => a -> b -> ('A :@: a) b
+a_A :: ('A <?> a) b => a -> b -> ('A :@: a) b
 a_A = WithAttributes
 
 abbr_ :: ('Abbr ?> a) => a -> 'Abbr > a
 abbr_ = WithAttributes ()
 
-abbr_A :: ('Abbr ??> a, 'Abbr ?> b) => a -> b -> ('Abbr :@: a) b
+abbr_A :: ('Abbr <?> a) b => a -> b -> ('Abbr :@: a) b
 abbr_A = WithAttributes
 
 acronym_ :: ('Acronym ?> a) => a -> 'Acronym > a
 acronym_ = WithAttributes ()
 
-acronym_A :: ('Acronym ??> a, 'Acronym ?> b) => a -> b -> ('Acronym :@: a) b
+acronym_A :: ('Acronym <?> a) b  => a -> b -> ('Acronym :@: a) b
 acronym_A = WithAttributes
 
 address_ :: ('Address ?> a) => a -> 'Address > a
 address_ = WithAttributes ()
 
-address_A :: ('Address ??> a, 'Address ?> b) => a -> b -> ('Address :@: a) b
+address_A :: ('Address <?> a) b  => a -> b -> ('Address :@: a) b
 address_A = WithAttributes
 
 applet_ :: ('Applet ?> a) => a -> 'Applet > a
 applet_ = WithAttributes ()
 
-applet_A :: ('Applet ??> a, 'Applet ?> b) => a -> b -> ('Applet :@: a) b
+applet_A :: ('Applet <?> a) b  => a -> b -> ('Applet :@: a) b
 applet_A = WithAttributes
 
 area_ :: 'Area > ()
 area_ = WithAttributes () ()
 
-area_A :: 'Area ??> a => a -> ('Area :@: a) ()
+area_A :: ('Area <?> a) () => a -> ('Area :@: a) ()
 area_A = flip WithAttributes ()
 
 article_ :: ('Article ?> a) => a -> 'Article > a
 article_ = WithAttributes ()
 
-article_A :: ('Article ??> a, 'Article ?> b) => a -> b -> ('Article :@: a) b
+article_A :: ('Article <?> a) b => a -> b -> ('Article :@: a) b
 article_A = WithAttributes
 
 aside_ :: ('Aside ?> a) => a -> 'Aside > a
 aside_ = WithAttributes ()
 
-aside_A :: ('Aside ??> a, 'Aside ?> b) => a -> b -> ('Aside :@: a) b
+aside_A :: ('Aside <?> a) b => a -> b -> ('Aside :@: a) b
 aside_A = WithAttributes
 
 audio_ :: ('Audio ?> a) => a -> 'Audio > a
 audio_ = WithAttributes ()
 
-audio_A :: ('Audio ??> a, 'Audio ?> b) => a -> b -> ('Audio :@: a) b
+audio_A :: ('Audio <?> a) b => a -> b -> ('Audio :@: a) b
 audio_A = WithAttributes
 
 b_ :: ('B ?> a) => a -> 'B > a
 b_ = WithAttributes ()
 
-b_A :: ('B ??> a, 'B ?> b) => a -> b -> ('B :@: a) b
+b_A :: ('B <?> a) b => a -> b -> ('B :@: a) b
 b_A = WithAttributes
 
 base_ :: 'Base > ()
 base_ = WithAttributes () ()
 
-base_A :: 'Base ??> a => a -> ('Base :@: a) ()
+base_A :: ('Base <?> a) () => a -> ('Base :@: a) ()
 base_A = flip WithAttributes ()
 
 basefont_ :: ('Basefont ?> a) => a -> 'Basefont > a
 basefont_ = WithAttributes ()
 
-basefont_A :: ('Basefont ??> a, 'Basefont ?> b) => a -> b -> ('Basefont :@: a) b
+basefont_A :: ('Basefont <?> a) b => a -> b -> ('Basefont :@: a) b
 basefont_A = WithAttributes
 
 bdi_ :: ('Bdi ?> a) => a -> 'Bdi > a
 bdi_ = WithAttributes ()
 
-bdi_A :: ('Bdi ??> a, 'Bdi ?> b) => a -> b -> ('Bdi :@: a) b
+bdi_A :: ('Bdi <?> a) b => a -> b -> ('Bdi :@: a) b
 bdi_A = WithAttributes
 
 bdo_ :: ('Bdo ?> a) => a -> 'Bdo > a
 bdo_ = WithAttributes ()
 
-bdo_A :: ('Bdo ??> a, 'Bdo ?> b) => a -> b -> ('Bdo :@: a) b
+bdo_A :: ('Bdo <?> a) b => a -> b -> ('Bdo :@: a) b
 bdo_A = WithAttributes
 
 bgsound_ :: ('Bgsound ?> a) => a -> 'Bgsound > a
 bgsound_ = WithAttributes ()
 
-bgsound_A :: ('Bgsound ??> a, 'Bgsound ?> b) => a -> b -> ('Bgsound :@: a) b
+bgsound_A :: ('Bgsound <?> a) b => a -> b -> ('Bgsound :@: a) b
 bgsound_A = WithAttributes
 
 big_ :: ('Big ?> a) => a -> 'Big > a
 big_ = WithAttributes ()
 
-big_A :: ('Big ??> a, 'Big ?> b) => a -> b -> ('Big :@: a) b
+big_A :: ('Big <?> a) b => a -> b -> ('Big :@: a) b
 big_A = WithAttributes
 
 blink_ :: ('Blink ?> a) => a -> 'Blink > a
 blink_ = WithAttributes ()
 
-blink_A :: ('Blink ??> a, 'Blink ?> b) => a -> b -> ('Blink :@: a) b
+blink_A :: ('Blink <?> a) b => a -> b -> ('Blink :@: a) b
 blink_A = WithAttributes
 
 blockquote_ :: ('Blockquote ?> a) => a -> 'Blockquote > a
 blockquote_ = WithAttributes ()
 
-blockquote_A :: ('Blockquote ??> a, 'Blockquote ?> b) => a -> b -> ('Blockquote :@: a) b
+blockquote_A :: ('Blockquote <?> a) b => a -> b -> ('Blockquote :@: a) b
 blockquote_A = WithAttributes
 
 body_ :: ('Body ?> a) => a -> 'Body > a
 body_ = WithAttributes ()
 
-body_A :: ('Body ??> a, 'Body ?> b) => a -> b -> ('Body :@: a) b
+body_A :: ('Body <?> a) b => a -> b -> ('Body :@: a) b
 body_A = WithAttributes
 
 br_ :: 'Br > ()
 br_ = WithAttributes () ()
 
-br_A :: 'Br ??> a => a -> ('Br :@: a) ()
+br_A :: ('Br <?> a) () => a -> ('Br :@: a) ()
 br_A = flip WithAttributes ()
 
 button_ :: ('Button ?> a) => a -> 'Button > a
 button_ = WithAttributes ()
 
-button_A :: ('Button ??> a, 'Button ?> b) => a -> b -> ('Button :@: a) b
+button_A :: ('Button <?> a) b => a -> b -> ('Button :@: a) b
 button_A = WithAttributes
 
 canvas_ :: ('Canvas ?> a) => a -> 'Canvas > a
 canvas_ = WithAttributes ()
 
-canvas_A :: ('Canvas ??> a, 'Canvas ?> b) => a -> b -> ('Canvas :@: a) b
+canvas_A :: ('Canvas <?> a) b => a -> b -> ('Canvas :@: a) b
 canvas_A = WithAttributes
 
 caption_ :: ('Caption ?> a) => a -> 'Caption > a
 caption_ = WithAttributes ()
 
-caption_A :: ('Caption ??> a, 'Caption ?> b) => a -> b -> ('Caption :@: a) b
+caption_A :: ('Caption <?> a) b => a -> b -> ('Caption :@: a) b
 caption_A = WithAttributes
 
 center_ :: ('Center ?> a) => a -> 'Center > a
 center_ = WithAttributes ()
 
-center_A :: ('Center ??> a, 'Center ?> b) => a -> b -> ('Center :@: a) b
+center_A :: ('Center <?> a) b => a -> b -> ('Center :@: a) b
 center_A = WithAttributes
 
 cite_ :: ('Cite ?> a) => a -> 'Cite > a
 cite_ = WithAttributes ()
 
-cite_A :: ('Cite ??> a, 'Cite ?> b) => a -> b -> ('Cite :@: a) b
+cite_A :: ('Cite <?> a) b => a -> b -> ('Cite :@: a) b
 cite_A = WithAttributes
 
 code_ :: ('Code ?> a) => a -> 'Code > a
 code_ = WithAttributes ()
 
-code_A :: ('Code ??> a, 'Code ?> b) => a -> b -> ('Code :@: a) b
+code_A :: ('Code <?> a) b => a -> b -> ('Code :@: a) b
 code_A = WithAttributes
 
 col_ :: 'Col > ()
 col_ = WithAttributes () ()
 
-col_A :: 'Col ??> a => a -> ('Col :@: a) ()
+col_A :: ('Col <?> a) () => a -> ('Col :@: a) ()
 col_A = flip WithAttributes ()
 
 colgroup_ :: ('Colgroup ?> a) => a -> 'Colgroup > a
 colgroup_ = WithAttributes ()
 
-colgroup_A :: ('Colgroup ??> a, 'Colgroup ?> b) => a -> b -> ('Colgroup :@: a) b
+colgroup_A :: ('Colgroup <?> a) b => a -> b -> ('Colgroup :@: a) b
 colgroup_A = WithAttributes
 
 command_ :: ('Command ?> a) => a -> 'Command > a
 command_ = WithAttributes ()
 
-command_A :: ('Command ??> a, 'Command ?> b) => a -> b -> ('Command :@: a) b
+command_A :: ('Command <?> a) b => a -> b -> ('Command :@: a) b
 command_A = WithAttributes
 
 content_ :: ('Content ?> a) => a -> 'Content > a
 content_ = WithAttributes ()
 
-content_A :: ('Content ??> a, 'Content ?> b) => a -> b -> ('Content :@: a) b
+content_A :: ('Content <?> a) b => a -> b -> ('Content :@: a) b
 content_A = WithAttributes
 
 data_ :: ('Data ?> a) => a -> 'Data > a
 data_ = WithAttributes ()
 
-data_A :: ('Data ??> a, 'Data ?> b) => a -> b -> ('Data :@: a) b
+data_A :: ('Data <?> a) b => a -> b -> ('Data :@: a) b
 data_A = WithAttributes
 
 datalist_ :: ('Datalist ?> a) => a -> 'Datalist > a
 datalist_ = WithAttributes ()
 
-datalist_A :: ('Datalist ??> a, 'Datalist ?> b) => a -> b -> ('Datalist :@: a) b
+datalist_A :: ('Datalist <?> a) b => a -> b -> ('Datalist :@: a) b
 datalist_A = WithAttributes
 
 dd_ :: ('Dd ?> a) => a -> 'Dd > a
 dd_ = WithAttributes ()
 
-dd_A :: ('Dd ??> a, 'Dd ?> b) => a -> b -> ('Dd :@: a) b
+dd_A :: ('Dd <?> a) b => a -> b -> ('Dd :@: a) b
 dd_A = WithAttributes
 
 del_ :: ('Del ?> a) => a -> 'Del > a
 del_ = WithAttributes ()
 
-del_A :: ('Del ??> a, 'Del ?> b) => a -> b -> ('Del :@: a) b
+del_A :: ('Del <?> a) b => a -> b -> ('Del :@: a) b
 del_A = WithAttributes
 
 details_ :: ('Details ?> a) => a -> 'Details > a
 details_ = WithAttributes ()
 
-details_A :: ('Details ??> a, 'Details ?> b) => a -> b -> ('Details :@: a) b
+details_A :: ('Details <?> a) b => a -> b -> ('Details :@: a) b
 details_A = WithAttributes
 
 dfn_ :: ('Dfn ?> a) => a -> 'Dfn > a
 dfn_ = WithAttributes ()
 
-dfn_A :: ('Dfn ??> a, 'Dfn ?> b) => a -> b -> ('Dfn :@: a) b
+dfn_A :: ('Dfn <?> a) b => a -> b -> ('Dfn :@: a) b
 dfn_A = WithAttributes
 
 dialog_ :: ('Dialog ?> a) => a -> 'Dialog > a
 dialog_ = WithAttributes ()
 
-dialog_A :: ('Dialog ??> a, 'Dialog ?> b) => a -> b -> ('Dialog :@: a) b
+dialog_A :: ('Dialog <?> a) b => a -> b -> ('Dialog :@: a) b
 dialog_A = WithAttributes
 
 dir_ :: ('Dir ?> a) => a -> 'Dir > a
 dir_ = WithAttributes ()
 
-dir_A :: ('Dir ??> a, 'Dir ?> b) => a -> b -> ('Dir :@: a) b
+dir_A :: ('Dir <?> a) b => a -> b -> ('Dir :@: a) b
 dir_A = WithAttributes
 
 div_ :: ('Div ?> a) => a -> 'Div > a
 div_ = WithAttributes ()
 
-div_A :: ('Div ??> a, 'Div ?> b) => a -> b -> ('Div :@: a) b
+div_A :: ('Div <?> a) b => a -> b -> ('Div :@: a) b
 div_A = WithAttributes
 
 dl_ :: ('Dl ?> a) => a -> 'Dl > a
 dl_ = WithAttributes ()
 
-dl_A :: ('Dl ??> a, 'Dl ?> b) => a -> b -> ('Dl :@: a) b
+dl_A :: ('Dl <?> a) b => a -> b -> ('Dl :@: a) b
 dl_A = WithAttributes
 
 dt_ :: ('Dt ?> a) => a -> 'Dt > a
 dt_ = WithAttributes ()
 
-dt_A :: ('Dt ??> a, 'Dt ?> b) => a -> b -> ('Dt :@: a) b
+dt_A :: ('Dt <?> a) b => a -> b -> ('Dt :@: a) b
 dt_A = WithAttributes
 
 element_ :: ('Element ?> a) => a -> 'Element > a
 element_ = WithAttributes ()
 
-element_A :: ('Element ??> a, 'Element ?> b) => a -> b -> ('Element :@: a) b
+element_A :: ('Element <?> a) b => a -> b -> ('Element :@: a) b
 element_A = WithAttributes
 
 em_ :: ('Em ?> a) => a -> 'Em > a
 em_ = WithAttributes ()
 
-em_A :: ('Em ??> a, 'Em ?> b) => a -> b -> ('Em :@: a) b
+em_A :: ('Em <?> a) b => a -> b -> ('Em :@: a) b
 em_A = WithAttributes
 
 embed_ :: 'Embed > ()
 embed_ = WithAttributes () ()
 
-embed_A :: 'Embed ??> a => a -> ('Embed :@: a) ()
+embed_A :: ('Embed <?> a) () => a -> ('Embed :@: a) ()
 embed_A = flip WithAttributes ()
 
 fieldset_ :: ('Fieldset ?> a) => a -> 'Fieldset > a
 fieldset_ = WithAttributes ()
 
-fieldset_A :: ('Fieldset ??> a, 'Fieldset ?> b) => a -> b -> ('Fieldset :@: a) b
+fieldset_A :: ('Fieldset <?> a) b => a -> b -> ('Fieldset :@: a) b
 fieldset_A = WithAttributes
 
 figcaption_ :: ('Figcaption ?> a) => a -> 'Figcaption > a
 figcaption_ = WithAttributes ()
 
-figcaption_A :: ('Figcaption ??> a, 'Figcaption ?> b) => a -> b -> ('Figcaption :@: a) b
+figcaption_A :: ('Figcaption <?> a) b => a -> b -> ('Figcaption :@: a) b
 figcaption_A = WithAttributes
 
 figure_ :: ('Figure ?> a) => a -> 'Figure > a
 figure_ = WithAttributes ()
 
-figure_A :: ('Figure ??> a, 'Figure ?> b) => a -> b -> ('Figure :@: a) b
+figure_A :: ('Figure <?> a) b => a -> b -> ('Figure :@: a) b
 figure_A = WithAttributes
 
 font_ :: ('Font ?> a) => a -> 'Font > a
 font_ = WithAttributes ()
 
-font_A :: ('Font ??> a, 'Font ?> b) => a -> b -> ('Font :@: a) b
+font_A :: ('Font <?> a) b => a -> b -> ('Font :@: a) b
 font_A = WithAttributes
 
 footer_ :: ('Footer ?> a) => a -> 'Footer > a
 footer_ = WithAttributes ()
 
-footer_A :: ('Footer ??> a, 'Footer ?> b) => a -> b -> ('Footer :@: a) b
+footer_A :: ('Footer <?> a) b => a -> b -> ('Footer :@: a) b
 footer_A = WithAttributes
 
 form_ :: ('Form ?> a) => a -> 'Form > a
 form_ = WithAttributes ()
 
-form_A :: ('Form ??> a, 'Form ?> b) => a -> b -> ('Form :@: a) b
+form_A :: ('Form <?> a) b => a -> b -> ('Form :@: a) b
 form_A = WithAttributes
 
 frame_ :: ('Frame ?> a) => a -> 'Frame > a
 frame_ = WithAttributes ()
 
-frame_A :: ('Frame ??> a, 'Frame ?> b) => a -> b -> ('Frame :@: a) b
+frame_A :: ('Frame <?> a) b => a -> b -> ('Frame :@: a) b
 frame_A = WithAttributes
 
 frameset_ :: ('Frameset ?> a) => a -> 'Frameset > a
 frameset_ = WithAttributes ()
 
-frameset_A :: ('Frameset ??> a, 'Frameset ?> b) => a -> b -> ('Frameset :@: a) b
+frameset_A :: ('Frameset <?> a) b => a -> b -> ('Frameset :@: a) b
 frameset_A = WithAttributes
 
 h1_ :: ('H1 ?> a) => a -> 'H1 > a
 h1_ = WithAttributes ()
 
-h1_A :: ('H1 ??> a, 'H1 ?> b) => a -> b -> ('H1 :@: a) b
+h1_A :: ('H1 <?> a) b => a -> b -> ('H1 :@: a) b
 h1_A = WithAttributes
 
 h2_ :: ('H2 ?> a) => a -> 'H2 > a
 h2_ = WithAttributes ()
 
-h2_A :: ('H2 ??> a, 'H2 ?> b) => a -> b -> ('H2 :@: a) b
+h2_A :: ('H2 <?> a) b => a -> b -> ('H2 :@: a) b
 h2_A = WithAttributes
 
 h3_ :: ('H3 ?> a) => a -> 'H3 > a
 h3_ = WithAttributes ()
 
-h3_A :: ('H3 ??> a, 'H3 ?> b) => a -> b -> ('H3 :@: a) b
+h3_A :: ('H3 <?> a) b => a -> b -> ('H3 :@: a) b
 h3_A = WithAttributes
 
 h4_ :: ('H4 ?> a) => a -> 'H4 > a
 h4_ = WithAttributes ()
 
-h4_A :: ('H4 ??> a, 'H4 ?> b) => a -> b -> ('H4 :@: a) b
+h4_A :: ('H4 <?> a) b => a -> b -> ('H4 :@: a) b
 h4_A = WithAttributes
 
 h5_ :: ('H5 ?> a) => a -> 'H5 > a
 h5_ = WithAttributes ()
 
-h5_A :: ('H5 ??> a, 'H5 ?> b) => a -> b -> ('H5 :@: a) b
+h5_A :: ('H5 <?> a) b => a -> b -> ('H5 :@: a) b
 h5_A = WithAttributes
 
 h6_ :: ('H6 ?> a) => a -> 'H6 > a
 h6_ = WithAttributes ()
 
-h6_A :: ('H6 ??> a, 'H6 ?> b) => a -> b -> ('H6 :@: a) b
+h6_A :: ('H6 <?> a) b => a -> b -> ('H6 :@: a) b
 h6_A = WithAttributes
 
 head_ :: ('Head ?> a) => a -> 'Head > a
 head_ = WithAttributes ()
 
-head_A :: ('Head ??> a, 'Head ?> b) => a -> b -> ('Head :@: a) b
+head_A :: ('Head <?> a) b => a -> b -> ('Head :@: a) b
 head_A = WithAttributes
 
 header_ :: ('Header ?> a) => a -> 'Header > a
 header_ = WithAttributes ()
 
-header_A :: ('Header ??> a, 'Header ?> b) => a -> b -> ('Header :@: a) b
+header_A :: ('Header <?> a) b => a -> b -> ('Header :@: a) b
 header_A = WithAttributes
 
 hgroup_ :: ('Hgroup ?> a) => a -> 'Hgroup > a
 hgroup_ = WithAttributes ()
 
-hgroup_A :: ('Hgroup ??> a, 'Hgroup ?> b) => a -> b -> ('Hgroup :@: a) b
+hgroup_A :: ('Hgroup <?> a) b => a -> b -> ('Hgroup :@: a) b
 hgroup_A = WithAttributes
 
 hr_ :: 'Hr > ()
 hr_ = WithAttributes () ()
 
-hr_A :: 'Hr ??> a => a -> ('Hr :@: a) ()
+hr_A :: ('Hr <?> a) () => a -> ('Hr :@: a) ()
 hr_A = flip WithAttributes ()
 
 html_ :: ('Html ?> a) => a -> 'Html > a
 html_ = WithAttributes ()
 
-html_A :: ('Html ??> a, 'Html ?> b) => a -> b -> ('Html :@: a) b
+html_A :: ('Html <?> a) b => a -> b -> ('Html :@: a) b
 html_A = WithAttributes
 
 i_ :: ('I ?> a) => a -> 'I > a
 i_ = WithAttributes ()
 
-i_A :: ('I ??> a, 'I ?> b) => a -> b -> ('I :@: a) b
+i_A :: ('I <?> a) b => a -> b -> ('I :@: a) b
 i_A = WithAttributes
 
 iframe_ :: 'Iframe > ()
 iframe_ = WithAttributes () ()
 
-iframe_A :: 'Iframe ??> a => a -> ('Iframe :@: a) ()
+iframe_A :: ('Iframe <?> a) () => a -> ('Iframe :@: a) ()
 iframe_A = flip WithAttributes ()
 
 image_ :: ('Image ?> a) => a -> 'Image > a
 image_ = WithAttributes ()
 
-image_A :: ('Image ??> a, 'Image ?> b) => a -> b -> ('Image :@: a) b
+image_A :: ('Image <?> a) b => a -> b -> ('Image :@: a) b
 image_A = WithAttributes
 
 img_ :: 'Img > ()
 img_ = WithAttributes () ()
 
-img_A :: 'Img ??> a => a -> ('Img :@: a) ()
+img_A :: ('Img <?> a) () => a -> ('Img :@: a) ()
 img_A = flip WithAttributes ()
 
 input_ :: ('Input ?> a) => a -> 'Input > a
 input_ = WithAttributes ()
 
-input_A :: ('Input ??> a, 'Input ?> b) => a -> b -> ('Input :@: a) b
+input_A :: ('Input <?> a) b => a -> b -> ('Input :@: a) b
 input_A = WithAttributes
 
 ins_ :: ('Ins ?> a) => a -> 'Ins > a
 ins_ = WithAttributes ()
 
-ins_A :: ('Ins ??> a, 'Ins ?> b) => a -> b -> ('Ins :@: a) b
+ins_A :: ('Ins <?> a) b => a -> b -> ('Ins :@: a) b
 ins_A = WithAttributes
 
 isindex_ :: ('Isindex ?> a) => a -> 'Isindex > a
 isindex_ = WithAttributes ()
 
-isindex_A :: ('Isindex ??> a, 'Isindex ?> b) => a -> b -> ('Isindex :@: a) b
+isindex_A :: ('Isindex <?> a) b => a -> b -> ('Isindex :@: a) b
 isindex_A = WithAttributes
 
 kbd_ :: ('Kbd ?> a) => a -> 'Kbd > a
 kbd_ = WithAttributes ()
 
-kbd_A :: ('Kbd ??> a, 'Kbd ?> b) => a -> b -> ('Kbd :@: a) b
+kbd_A :: ('Kbd <?> a) b => a -> b -> ('Kbd :@: a) b
 kbd_A = WithAttributes
 
 keygen_ :: ('Keygen ?> a) => a -> 'Keygen > a
 keygen_ = WithAttributes ()
 
-keygen_A :: ('Keygen ??> a, 'Keygen ?> b) => a -> b -> ('Keygen :@: a) b
+keygen_A :: ('Keygen <?> a) b => a -> b -> ('Keygen :@: a) b
 keygen_A = WithAttributes
 
 label_ :: ('Label ?> a) => a -> 'Label > a
 label_ = WithAttributes ()
 
-label_A :: ('Label ??> a, 'Label ?> b) => a -> b -> ('Label :@: a) b
+label_A :: ('Label <?> a) b => a -> b -> ('Label :@: a) b
 label_A = WithAttributes
 
 legend_ :: ('Legend ?> a) => a -> 'Legend > a
 legend_ = WithAttributes ()
 
-legend_A :: ('Legend ??> a, 'Legend ?> b) => a -> b -> ('Legend :@: a) b
+legend_A :: ('Legend <?> a) b => a -> b -> ('Legend :@: a) b
 legend_A = WithAttributes
 
 li_ :: ('Li ?> a) => a -> 'Li > a
 li_ = WithAttributes ()
 
-li_A :: ('Li ??> a, 'Li ?> b) => a -> b -> ('Li :@: a) b
+li_A :: ('Li <?> a) b => a -> b -> ('Li :@: a) b
 li_A = WithAttributes
 
 link_ :: 'Link > ()
 link_ = WithAttributes () ()
 
-link_A :: 'Link ??> a => a -> ('Link :@: a) ()
+link_A :: ('Link <?> a) () => a -> ('Link :@: a) ()
 link_A = flip WithAttributes ()
 
 listing_ :: ('Listing ?> a) => a -> 'Listing > a
 listing_ = WithAttributes ()
 
-listing_A :: ('Listing ??> a, 'Listing ?> b) => a -> b -> ('Listing :@: a) b
+listing_A :: ('Listing <?> a) b => a -> b -> ('Listing :@: a) b
 listing_A = WithAttributes
 
 main_ :: ('Main ?> a) => a -> 'Main > a
 main_ = WithAttributes ()
 
-main_A :: ('Main ??> a, 'Main ?> b) => a -> b -> ('Main :@: a) b
+main_A :: ('Main <?> a) b => a -> b -> ('Main :@: a) b
 main_A = WithAttributes
 
 map_ :: ('Map ?> a) => a -> 'Map > a
 map_ = WithAttributes ()
 
-map_A :: ('Map ??> a, 'Map ?> b) => a -> b -> ('Map :@: a) b
+map_A :: ('Map <?> a) b => a -> b -> ('Map :@: a) b
 map_A = WithAttributes
 
 mark_ :: ('Mark ?> a) => a -> 'Mark > a
 mark_ = WithAttributes ()
 
-mark_A :: ('Mark ??> a, 'Mark ?> b) => a -> b -> ('Mark :@: a) b
+mark_A :: ('Mark <?> a) b => a -> b -> ('Mark :@: a) b
 mark_A = WithAttributes
 
 marquee_ :: ('Marquee ?> a) => a -> 'Marquee > a
 marquee_ = WithAttributes ()
 
-marquee_A :: ('Marquee ??> a, 'Marquee ?> b) => a -> b -> ('Marquee :@: a) b
+marquee_A :: ('Marquee <?> a) b => a -> b -> ('Marquee :@: a) b
 marquee_A = WithAttributes
 
 math_ :: ('Math ?> a) => a -> 'Math > a
 math_ = WithAttributes ()
 
-math_A :: ('Math ??> a, 'Math ?> b) => a -> b -> ('Math :@: a) b
+math_A :: ('Math <?> a) b => a -> b -> ('Math :@: a) b
 math_A = WithAttributes
 
 menu_ :: ('Menu ?> a) => a -> 'Menu > a
 menu_ = WithAttributes ()
 
-menu_A :: ('Menu ??> a, 'Menu ?> b) => a -> b -> ('Menu :@: a) b
+menu_A :: ('Menu <?> a) b => a -> b -> ('Menu :@: a) b
 menu_A = WithAttributes
 
 menuitem_ :: 'Menuitem > ()
 menuitem_ = WithAttributes () ()
 
-menuitem_A :: 'Menuitem ??> a => a -> ('Menuitem :@: a) ()
+menuitem_A :: ('Menuitem <?> a) () => a -> ('Menuitem :@: a) ()
 menuitem_A = flip WithAttributes ()
 
 meta_ :: 'Meta > ()
 meta_ = WithAttributes () ()
 
-meta_A :: 'Meta ??> a => a -> ('Meta :@: a) ()
+meta_A :: ('Meta <?> a) () => a -> ('Meta :@: a) ()
 meta_A = flip WithAttributes ()
 
 meter_ :: ('Meter ?> a) => a -> 'Meter > a
 meter_ = WithAttributes ()
 
-meter_A :: ('Meter ??> a, 'Meter ?> b) => a -> b -> ('Meter :@: a) b
+meter_A :: ('Meter <?> a) b => a -> b -> ('Meter :@: a) b
 meter_A = WithAttributes
 
 multicol_ :: ('Multicol ?> a) => a -> 'Multicol > a
 multicol_ = WithAttributes ()
 
-multicol_A :: ('Multicol ??> a, 'Multicol ?> b) => a -> b -> ('Multicol :@: a) b
+multicol_A :: ('Multicol <?> a) b => a -> b -> ('Multicol :@: a) b
 multicol_A = WithAttributes
 
 nav_ :: ('Nav ?> a) => a -> 'Nav > a
 nav_ = WithAttributes ()
 
-nav_A :: ('Nav ??> a, 'Nav ?> b) => a -> b -> ('Nav :@: a) b
+nav_A :: ('Nav <?> a) b => a -> b -> ('Nav :@: a) b
 nav_A = WithAttributes
 
 nextid_ :: ('Nextid ?> a) => a -> 'Nextid > a
 nextid_ = WithAttributes ()
 
-nextid_A :: ('Nextid ??> a, 'Nextid ?> b) => a -> b -> ('Nextid :@: a) b
+nextid_A :: ('Nextid <?> a) b => a -> b -> ('Nextid :@: a) b
 nextid_A = WithAttributes
 
 nobr_ :: ('Nobr ?> a) => a -> 'Nobr > a
 nobr_ = WithAttributes ()
 
-nobr_A :: ('Nobr ??> a, 'Nobr ?> b) => a -> b -> ('Nobr :@: a) b
+nobr_A :: ('Nobr <?> a) b => a -> b -> ('Nobr :@: a) b
 nobr_A = WithAttributes
 
 noembed_ :: ('Noembed ?> a) => a -> 'Noembed > a
 noembed_ = WithAttributes ()
 
-noembed_A :: ('Noembed ??> a, 'Noembed ?> b) => a -> b -> ('Noembed :@: a) b
+noembed_A :: ('Noembed <?> a) b => a -> b -> ('Noembed :@: a) b
 noembed_A = WithAttributes
 
 noframes_ :: ('Noframes ?> a) => a -> 'Noframes > a
 noframes_ = WithAttributes ()
 
-noframes_A :: ('Noframes ??> a, 'Noframes ?> b) => a -> b -> ('Noframes :@: a) b
+noframes_A :: ('Noframes <?> a) b => a -> b -> ('Noframes :@: a) b
 noframes_A = WithAttributes
 
 noscript_ :: ('Noscript ?> a) => a -> 'Noscript > a
 noscript_ = WithAttributes ()
 
-noscript_A :: ('Noscript ??> a, 'Noscript ?> b) => a -> b -> ('Noscript :@: a) b
+noscript_A :: ('Noscript <?> a) b => a -> b -> ('Noscript :@: a) b
 noscript_A = WithAttributes
 
 object_ :: ('Object ?> a) => a -> 'Object > a
 object_ = WithAttributes ()
 
-object_A :: ('Object ??> a, 'Object ?> b) => a -> b -> ('Object :@: a) b
+object_A :: ('Object <?> a) b => a -> b -> ('Object :@: a) b
 object_A = WithAttributes
 
 ol_ :: ('Ol ?> a) => a -> 'Ol > a
 ol_ = WithAttributes ()
 
-ol_A :: ('Ol ??> a, 'Ol ?> b) => a -> b -> ('Ol :@: a) b
+ol_A :: ('Ol <?> a) b => a -> b -> ('Ol :@: a) b
 ol_A = WithAttributes
 
 optgroup_ :: ('Optgroup ?> a) => a -> 'Optgroup > a
 optgroup_ = WithAttributes ()
 
-optgroup_A :: ('Optgroup ??> a, 'Optgroup ?> b) => a -> b -> ('Optgroup :@: a) b
+optgroup_A :: ('Optgroup <?> a) b => a -> b -> ('Optgroup :@: a) b
 optgroup_A = WithAttributes
 
 option_ :: ('Option ?> a) => a -> 'Option > a
 option_ = WithAttributes ()
 
-option_A :: ('Option ??> a, 'Option ?> b) => a -> b -> ('Option :@: a) b
+option_A :: ('Option <?> a) b => a -> b -> ('Option :@: a) b
 option_A = WithAttributes
 
 output_ :: ('Output ?> a) => a -> 'Output > a
 output_ = WithAttributes ()
 
-output_A :: ('Output ??> a, 'Output ?> b) => a -> b -> ('Output :@: a) b
+output_A :: ('Output <?> a) b => a -> b -> ('Output :@: a) b
 output_A = WithAttributes
 
 p_ :: ('P ?> a) => a -> 'P > a
 p_ = WithAttributes ()
 
-p_A :: ('P ??> a, 'P ?> b) => a -> b -> ('P :@: a) b
+p_A :: ('P <?> a) b => a -> b -> ('P :@: a) b
 p_A = WithAttributes
 
 param_ :: 'Param > ()
 param_ = WithAttributes () ()
 
-param_A :: 'Param ??> a => a -> ('Param :@: a) ()
+param_A :: ('Param <?> a) () => a -> ('Param :@: a) ()
 param_A = flip WithAttributes ()
 
 picture_ :: ('Picture ?> a) => a -> 'Picture > a
 picture_ = WithAttributes ()
 
-picture_A :: ('Picture ??> a, 'Picture ?> b) => a -> b -> ('Picture :@: a) b
+picture_A :: ('Picture <?> a) b => a -> b -> ('Picture :@: a) b
 picture_A = WithAttributes
 
 plaintext_ :: ('Plaintext ?> a) => a -> 'Plaintext > a
 plaintext_ = WithAttributes ()
 
-plaintext_A :: ('Plaintext ??> a, 'Plaintext ?> b) => a -> b -> ('Plaintext :@: a) b
+plaintext_A :: ('Plaintext <?> a) b => a -> b -> ('Plaintext :@: a) b
 plaintext_A = WithAttributes
 
 pre_ :: ('Pre ?> a) => a -> 'Pre > a
 pre_ = WithAttributes ()
 
-pre_A :: ('Pre ??> a, 'Pre ?> b) => a -> b -> ('Pre :@: a) b
+pre_A :: ('Pre <?> a) b => a -> b -> ('Pre :@: a) b
 pre_A = WithAttributes
 
 progress_ :: ('Progress ?> a) => a -> 'Progress > a
 progress_ = WithAttributes ()
 
-progress_A :: ('Progress ??> a, 'Progress ?> b) => a -> b -> ('Progress :@: a) b
+progress_A :: ('Progress <?> a) b => a -> b -> ('Progress :@: a) b
 progress_A = WithAttributes
 
 q_ :: ('Q ?> a) => a -> 'Q > a
 q_ = WithAttributes ()
 
-q_A :: ('Q ??> a, 'Q ?> b) => a -> b -> ('Q :@: a) b
+q_A :: ('Q <?> a) b => a -> b -> ('Q :@: a) b
 q_A = WithAttributes
 
 rp_ :: ('Rp ?> a) => a -> 'Rp > a
 rp_ = WithAttributes ()
 
-rp_A :: ('Rp ??> a, 'Rp ?> b) => a -> b -> ('Rp :@: a) b
+rp_A :: ('Rp <?> a) b => a -> b -> ('Rp :@: a) b
 rp_A = WithAttributes
 
 rt_ :: ('Rt ?> a) => a -> 'Rt > a
 rt_ = WithAttributes ()
 
-rt_A :: ('Rt ??> a, 'Rt ?> b) => a -> b -> ('Rt :@: a) b
+rt_A :: ('Rt <?> a) b => a -> b -> ('Rt :@: a) b
 rt_A = WithAttributes
 
 rtc_ :: ('Rtc ?> a) => a -> 'Rtc > a
 rtc_ = WithAttributes ()
 
-rtc_A :: ('Rtc ??> a, 'Rtc ?> b) => a -> b -> ('Rtc :@: a) b
+rtc_A :: ('Rtc <?> a) b => a -> b -> ('Rtc :@: a) b
 rtc_A = WithAttributes
 
 ruby_ :: ('Ruby ?> a) => a -> 'Ruby > a
 ruby_ = WithAttributes ()
 
-ruby_A :: ('Ruby ??> a, 'Ruby ?> b) => a -> b -> ('Ruby :@: a) b
+ruby_A :: ('Ruby <?> a) b => a -> b -> ('Ruby :@: a) b
 ruby_A = WithAttributes
 
 s_ :: ('S ?> a) => a -> 'S > a
 s_ = WithAttributes ()
 
-s_A :: ('S ??> a, 'S ?> b) => a -> b -> ('S :@: a) b
+s_A :: ('S <?> a) b => a -> b -> ('S :@: a) b
 s_A = WithAttributes
 
 samp_ :: ('Samp ?> a) => a -> 'Samp > a
 samp_ = WithAttributes ()
 
-samp_A :: ('Samp ??> a, 'Samp ?> b) => a -> b -> ('Samp :@: a) b
+samp_A :: ('Samp <?> a) b => a -> b -> ('Samp :@: a) b
 samp_A = WithAttributes
 
 script_ :: ('Script ?> a) => a -> 'Script > a
 script_ = WithAttributes ()
 
-script_A :: ('Script ??> a, 'Script ?> b) => a -> b -> ('Script :@: a) b
+script_A :: ('Script <?> a) b => a -> b -> ('Script :@: a) b
 script_A = WithAttributes
 
 section_ :: ('Section ?> a) => a -> 'Section > a
 section_ = WithAttributes ()
 
-section_A :: ('Section ??> a, 'Section ?> b) => a -> b -> ('Section :@: a) b
+section_A :: ('Section <?> a) b => a -> b -> ('Section :@: a) b
 section_A = WithAttributes
 
 select_ :: ('Select ?> a) => a -> 'Select > a
 select_ = WithAttributes ()
 
-select_A :: ('Select ??> a, 'Select ?> b) => a -> b -> ('Select :@: a) b
+select_A :: ('Select <?> a) b => a -> b -> ('Select :@: a) b
 select_A = WithAttributes
 
 shadow_ :: ('Shadow ?> a) => a -> 'Shadow > a
 shadow_ = WithAttributes ()
 
-shadow_A :: ('Shadow ??> a, 'Shadow ?> b) => a -> b -> ('Shadow :@: a) b
+shadow_A :: ('Shadow <?> a) b => a -> b -> ('Shadow :@: a) b
 shadow_A = WithAttributes
 
 slot_ :: ('Slot ?> a) => a -> 'Slot > a
 slot_ = WithAttributes ()
 
-slot_A :: ('Slot ??> a, 'Slot ?> b) => a -> b -> ('Slot :@: a) b
+slot_A :: ('Slot <?> a) b => a -> b -> ('Slot :@: a) b
 slot_A = WithAttributes
 
 small_ :: ('Small ?> a) => a -> 'Small > a
 small_ = WithAttributes ()
 
-small_A :: ('Small ??> a, 'Small ?> b) => a -> b -> ('Small :@: a) b
+small_A :: ('Small <?> a) b => a -> b -> ('Small :@: a) b
 small_A = WithAttributes
 
 source_ :: 'Source > ()
 source_ = WithAttributes () ()
 
-source_A :: 'Source ??> a => a -> ('Source :@: a) ()
+source_A :: ('Source <?> a) () => a -> ('Source :@: a) ()
 source_A = flip WithAttributes ()
 
 spacer_ :: ('Spacer ?> a) => a -> 'Spacer > a
 spacer_ = WithAttributes ()
 
-spacer_A :: ('Spacer ??> a, 'Spacer ?> b) => a -> b -> ('Spacer :@: a) b
+spacer_A :: ('Spacer <?> a) b => a -> b -> ('Spacer :@: a) b
 spacer_A = WithAttributes
 
 span_ :: ('Span ?> a) => a -> 'Span > a
 span_ = WithAttributes ()
 
-span_A :: ('Span ??> a, 'Span ?> b) => a -> b -> ('Span :@: a) b
+span_A :: ('Span <?> a) b => a -> b -> ('Span :@: a) b
 span_A = WithAttributes
 
 strike_ :: ('Strike ?> a) => a -> 'Strike > a
 strike_ = WithAttributes ()
 
-strike_A :: ('Strike ??> a, 'Strike ?> b) => a -> b -> ('Strike :@: a) b
+strike_A :: ('Strike <?> a) b => a -> b -> ('Strike :@: a) b
 strike_A = WithAttributes
 
 strong_ :: ('Strong ?> a) => a -> 'Strong > a
 strong_ = WithAttributes ()
 
-strong_A :: ('Strong ??> a, 'Strong ?> b) => a -> b -> ('Strong :@: a) b
+strong_A :: ('Strong <?> a) b => a -> b -> ('Strong :@: a) b
 strong_A = WithAttributes
 
 style_ :: ('Style ?> a) => a -> 'Style > a
 style_ = WithAttributes ()
 
-style_A :: ('Style ??> a, 'Style ?> b) => a -> b -> ('Style :@: a) b
+style_A :: ('Style <?> a) b => a -> b -> ('Style :@: a) b
 style_A = WithAttributes
 
 sub_ :: ('Sub ?> a) => a -> 'Sub > a
 sub_ = WithAttributes ()
 
-sub_A :: ('Sub ??> a, 'Sub ?> b) => a -> b -> ('Sub :@: a) b
+sub_A :: ('Sub <?> a) b => a -> b -> ('Sub :@: a) b
 sub_A = WithAttributes
 
 summary_ :: ('Summary ?> a) => a -> 'Summary > a
 summary_ = WithAttributes ()
 
-summary_A :: ('Summary ??> a, 'Summary ?> b) => a -> b -> ('Summary :@: a) b
+summary_A :: ('Summary <?> a) b => a -> b -> ('Summary :@: a) b
 summary_A = WithAttributes
 
 sup_ :: ('Sup ?> a) => a -> 'Sup > a
 sup_ = WithAttributes ()
 
-sup_A :: ('Sup ??> a, 'Sup ?> b) => a -> b -> ('Sup :@: a) b
+sup_A :: ('Sup <?> a) b => a -> b -> ('Sup :@: a) b
 sup_A = WithAttributes
 
 svg_ :: ('Svg ?> a) => a -> 'Svg > a
 svg_ = WithAttributes ()
 
-svg_A :: ('Svg ??> a, 'Svg ?> b) => a -> b -> ('Svg :@: a) b
+svg_A :: ('Svg <?> a) b => a -> b -> ('Svg :@: a) b
 svg_A = WithAttributes
 
 table_ :: ('Table ?> a) => a -> 'Table > a
 table_ = WithAttributes ()
 
-table_A :: ('Table ??> a, 'Table ?> b) => a -> b -> ('Table :@: a) b
+table_A :: ('Table <?> a) b => a -> b -> ('Table :@: a) b
 table_A = WithAttributes
 
 tbody_ :: ('Tbody ?> a) => a -> 'Tbody > a
 tbody_ = WithAttributes ()
 
-tbody_A :: ('Tbody ??> a, 'Tbody ?> b) => a -> b -> ('Tbody :@: a) b
+tbody_A :: ('Tbody <?> a) b => a -> b -> ('Tbody :@: a) b
 tbody_A = WithAttributes
 
 td_ :: ('Td ?> a) => a -> 'Td > a
 td_ = WithAttributes ()
 
-td_A :: ('Td ??> a, 'Td ?> b) => a -> b -> ('Td :@: a) b
+td_A :: ('Td <?> a) b => a -> b -> ('Td :@: a) b
 td_A = WithAttributes
 
 template_ :: ('Template ?> a) => a -> 'Template > a
 template_ = WithAttributes ()
 
-template_A :: ('Template ??> a, 'Template ?> b) => a -> b -> ('Template :@: a) b
+template_A :: ('Template <?> a) b => a -> b -> ('Template :@: a) b
 template_A = WithAttributes
 
 textarea_ :: ('Textarea ?> a) => a -> 'Textarea > a
 textarea_ = WithAttributes ()
 
-textarea_A :: ('Textarea ??> a, 'Textarea ?> b) => a -> b -> ('Textarea :@: a) b
+textarea_A :: ('Textarea <?> a) b => a -> b -> ('Textarea :@: a) b
 textarea_A = WithAttributes
 
 tfoot_ :: ('Tfoot ?> a) => a -> 'Tfoot > a
 tfoot_ = WithAttributes ()
 
-tfoot_A :: ('Tfoot ??> a, 'Tfoot ?> b) => a -> b -> ('Tfoot :@: a) b
+tfoot_A :: ('Tfoot <?> a) b => a -> b -> ('Tfoot :@: a) b
 tfoot_A = WithAttributes
 
 th_ :: ('Th ?> a) => a -> 'Th > a
 th_ = WithAttributes ()
 
-th_A :: ('Th ??> a, 'Th ?> b) => a -> b -> ('Th :@: a) b
+th_A :: ('Th <?> a) b => a -> b -> ('Th :@: a) b
 th_A = WithAttributes
 
 thead_ :: ('Thead ?> a) => a -> 'Thead > a
 thead_ = WithAttributes ()
 
-thead_A :: ('Thead ??> a, 'Thead ?> b) => a -> b -> ('Thead :@: a) b
+thead_A :: ('Thead <?> a) b => a -> b -> ('Thead :@: a) b
 thead_A = WithAttributes
 
 time_ :: ('Time ?> a) => a -> 'Time > a
 time_ = WithAttributes ()
 
-time_A :: ('Time ??> a, 'Time ?> b) => a -> b -> ('Time :@: a) b
+time_A :: ('Time <?> a) b => a -> b -> ('Time :@: a) b
 time_A = WithAttributes
 
 title_ :: ('Title ?> a) => a -> 'Title > a
 title_ = WithAttributes ()
 
-title_A :: ('Title ??> a, 'Title ?> b) => a -> b -> ('Title :@: a) b
+title_A :: ('Title <?> a) b => a -> b -> ('Title :@: a) b
 title_A = WithAttributes
 
 tr_ :: ('Tr ?> a) => a -> 'Tr > a
 tr_ = WithAttributes ()
 
-tr_A :: ('Tr ??> a, 'Tr ?> b) => a -> b -> ('Tr :@: a) b
+tr_A :: ('Tr <?> a) b => a -> b -> ('Tr :@: a) b
 tr_A = WithAttributes
 
 track_ :: 'Track > ()
 track_ = WithAttributes () ()
 
-track_A :: 'Track ??> a => a -> ('Track :@: a) ()
+track_A :: ('Track <?> a) () => a -> ('Track :@: a) ()
 track_A = flip WithAttributes ()
 
 tt_ :: ('Tt ?> a) => a -> 'Tt > a
 tt_ = WithAttributes ()
 
-tt_A :: ('Tt ??> a, 'Tt ?> b) => a -> b -> ('Tt :@: a) b
+tt_A :: ('Tt <?> a) b => a -> b -> ('Tt :@: a) b
 tt_A = WithAttributes
 
 u_ :: ('U ?> a) => a -> 'U > a
 u_ = WithAttributes ()
 
-u_A :: ('U ??> a, 'U ?> b) => a -> b -> ('U :@: a) b
+u_A :: ('U <?> a) b => a -> b -> ('U :@: a) b
 u_A = WithAttributes
 
 ul_ :: ('Ul ?> a) => a -> 'Ul > a
 ul_ = WithAttributes ()
 
-ul_A :: ('Ul ??> a, 'Ul ?> b) => a -> b -> ('Ul :@: a) b
+ul_A :: ('Ul <?> a) b => a -> b -> ('Ul :@: a) b
 ul_A = WithAttributes
 
 var_ :: ('Var ?> a) => a -> 'Var > a
 var_ = WithAttributes ()
 
-var_A :: ('Var ??> a, 'Var ?> b) => a -> b -> ('Var :@: a) b
+var_A :: ('Var <?> a) b => a -> b -> ('Var :@: a) b
 var_A = WithAttributes
 
 video_ :: ('Video ?> a) => a -> 'Video > a
 video_ = WithAttributes ()
 
-video_A :: ('Video ??> a, 'Video ?> b) => a -> b -> ('Video :@: a) b
+video_A :: ('Video <?> a) b => a -> b -> ('Video :@: a) b
 video_A = WithAttributes
 
 wbr_ :: 'Wbr > ()
 wbr_ = WithAttributes () ()
 
-wbr_A :: 'Wbr ??> a => a -> ('Wbr :@: a) ()
+wbr_A :: ('Wbr <?> a) () => a -> ('Wbr :@: a) ()
 wbr_A = flip WithAttributes ()
 
 xmp_ :: ('Xmp ?> a) => a -> 'Xmp > a
 xmp_ = WithAttributes ()
 
-xmp_A :: ('Xmp ??> a, 'Xmp ?> b) => a -> b -> ('Xmp :@: a) b
+xmp_A :: ('Xmp <?> a) b => a -> b -> ('Xmp :@: a) b
 xmp_A = WithAttributes
diff --git a/src/Html/Reify.hs b/src/Html/Reify.hs
--- a/src/Html/Reify.hs
+++ b/src/Html/Reify.hs
@@ -6,7 +6,9 @@
 {-# LANGUAGE DataKinds            #-}
 {-# LANGUAGE PolyKinds            #-}
 
-module Html.Reify where
+module Html.Reify
+  ( R(..)
+  ) where
 
 import Html.Type.Internal
 import Html.Convert
diff --git a/src/Html/Type.hs b/src/Html/Type.hs
--- a/src/Html/Type.hs
+++ b/src/Html/Type.hs
@@ -7,6 +7,7 @@
   , (#)
   , type (?>)
   , type (??>)
+  , type (<?>)
   , type (:=)(..)
   , Raw(..)
   , Attribute(..)
diff --git a/src/Html/Type/Internal.hs b/src/Html/Type/Internal.hs
--- a/src/Html/Type/Internal.hs
+++ b/src/Html/Type/Internal.hs
@@ -2,6 +2,7 @@
 
 {-# LANGUAGE TypeFamilyDependencies #-}
 {-# LANGUAGE UndecidableInstances   #-}
+{-# LANGUAGE ConstraintKinds        #-}
 {-# LANGUAGE TypeOperators          #-}
 {-# LANGUAGE TypeFamilies           #-}
 {-# LANGUAGE DataKinds              #-}
@@ -370,30 +371,29 @@
 
 newtype (:=) (a :: Attribute) b = AT b
 
--- | Check whether `b` is a valid child of `a`.  You'll propably never
--- need to call this directly.  Through a GADT, it is enforced that
--- every child is lawful.
-type family (a :: Element) ?> b :: Constraint where
-  a ?> (b :@: _) _     = MaybeTypeError a b (CheckContentCategory (EInfoContent (GetEInfo a)) (SingleElement b ': EInfoCategories (GetEInfo b)))
-  a ?> (b # c)         = (a ?> b, a ?> c)
-  a ?> Maybe b         = a ?> b
-  a ?> Either b c      = (a ?> b, a ?> c)
-  a ?> f ((b :@: c) d) = a ?> (b :@: c) d
-  a ?> f (b # c)       = a ?> (b # c)
-  a ?> ()              = ()
-  a ?> (b -> c)        = TypeError (Text "Html elements can't contain functions")
-  a ?> b               = CheckString a b
+-- | Check whether `b` is a valid child of `a`.
+type a ?> b = Check Element a b
 
-type family (a :: Element) ??> b :: Constraint where
-  a ??> () = ()
-  a ??> (b # c)  = (a ??> b, a ??> c)
-  a ??> Maybe b = a ??> b
-  a ??> Either b c = (a ??> b, a ??> c)
-  a ??> (b := _) = If (Elem a (AInfoElements (GetAInfo b)) || Null (AInfoElements (GetAInfo b)))
-                   (() :: Constraint)
-                   (TypeError (ShowType b :<>: Text " is not a valid attribute of " :<>: ShowType a))
-  a ??> b        = TypeError (ShowType b :<>: Text " is not an attribute.")
+-- | Check whether `a` is a valid attribute and `b` is a valid child of `p`.
+type (<?>) p a b = (Check Attribute p a, Check Element p b)
 
+{-# DEPRECATED (??>) "This will be removed in a future release, use <?> instead" #-}
+type a ??> b = Check Attribute a b
+
+type family Check f a b :: Constraint where
+  Check _ _ ()                      = ()
+  Check f a (b # c)                 = (Check f a b, Check f a c)
+  Check f a (Maybe b)               = Check f a b
+  Check f a (Either b c)            = (Check f a b, Check f a c)
+  Check Element a (f ((b :@: c) d)) = Check Element a ((b :@: c) d)
+  Check Element a (f (b # c))       = Check Element a (b # c)
+  Check Element a ((b :@: _) _)     = MaybeTypeError a b (CheckContentCategory (EInfoContent (GetEInfo a)) (SingleElement b ': EInfoCategories (GetEInfo b)))
+  Check Element a b                 = CheckString a b
+  Check Attribute a (b := _)        = If (Elem a (AInfoElements (GetAInfo b)) || Null (AInfoElements (GetAInfo b)))
+                                        (() :: Constraint)
+                                        (TypeError (ShowType b :<>: Text " is not a valid attribute of " :<>: ShowType a))
+  Check Attribute _ b               = TypeError (ShowType b :<>: Text " is not an attribute.")
+
 -- | Combine two elements or attributes sequentially.
 --
 -- >>> i_ () # div_ ()
@@ -422,15 +422,11 @@
 -- >>> div_ "a"
 -- <div>a</div>
 data (:@:) (a :: Element) b c where
-  WithAttributes :: (a ??> b, a ?> c) => b -> c -> (a :@: b) c
+  WithAttributes :: (a <?> b) c => b -> c -> (a :@: b) c
 infixr 8 :@:
 
 -- | Wrapper for types which won't be escaped.
-newtype Raw a = Raw a
-
-  -------------------
-  -- internal code --
-  -------------------
+newtype Raw a = Raw {fromRaw :: a}
 
 type family Null xs where
   Null '[] = True
@@ -512,9 +508,9 @@
   (contentCategories :: [ContentCategory])
   (permittedContent  :: ContentCategory)
 
-type family EInfoName x       where EInfoName       (EInfo n _ _)  = n
+type family EInfoName x       where EInfoName       (EInfo n _  _) = n
 type family EInfoCategories x where EInfoCategories (EInfo _ cs _) = cs
-type family EInfoContent x    where EInfoContent    (EInfo _ _ c)  = c
+type family EInfoContent x    where EInfoContent    (EInfo _ _  c) = c
 
 type ShowElement (x :: Element) = EInfoName (GetEInfo x)
 
@@ -524,7 +520,7 @@
   CheckContentCategory (NOT a) c   = Not (CheckContentCategory a c)
   CheckContentCategory a c         = Elem a c
 
--- | Check whether a given element may contain a string.
+-- | Check whether a given element may contain a non document type.
 type family CheckString (a :: Element) b where
   CheckString a b = If (CheckContentCategory (EInfoContent (GetEInfo a)) '[OnlyText, FlowContent, PhrasingContent])
                        (() :: Constraint)
@@ -565,704 +561,249 @@
 
 -- | Get type list of valid elements for a given attribute.  An empty list signifies global attribute.
 type family GetAInfo a = r | r -> a where
-  GetAInfo AcceptA              = AInfo "accept" '[Form, Input]
-  GetAInfo AcceptCharsetA       = AInfo "accept-charset" '[Form]
-  GetAInfo AccesskeyA           = AInfo "accesskey" '[]
-  GetAInfo ActionA              = AInfo "action" '[Form]
-  GetAInfo AllowfullscreenA     = AInfo "allowfullscreen" '[Iframe]
+  GetAInfo AcceptA              = AInfo "accept"              '[Form, Input]
+  GetAInfo AcceptCharsetA       = AInfo "accept-charset"      '[Form]
+  GetAInfo AccesskeyA           = AInfo "accesskey"           '[]
+  GetAInfo ActionA              = AInfo "action"              '[Form]
+  GetAInfo AllowfullscreenA     = AInfo "allowfullscreen"     '[Iframe]
   GetAInfo AllowpaymentrequestA = AInfo "allowpaymentrequest" '[Iframe]
-  GetAInfo AlignA               = AInfo "align" '[Applet, Caption, Col, Colgroup, Hr, Iframe, Img, Table, Tbody, Td, Tfoot, Th, Thead, Tr]
-  GetAInfo AltA                 = AInfo "alt" '[Applet, Area, Img, Input]
-  GetAInfo AsyncA               = AInfo "async" '[Script]
-  GetAInfo AutocompleteA        = AInfo "autocomplete" '[Form, Input]
-  GetAInfo AutofocusA           = AInfo "autofocus" '[Button, Input, Keygen, Select, Textarea]
-  GetAInfo AutoplayA            = AInfo "autoplay" '[Audio, Video]
-  GetAInfo AutosaveA            = AInfo "autosave" '[Input]
-  GetAInfo BgcolorA             = AInfo "bgcolor" '[Body, Col, Colgroup, Marquee, Table, Tbody, Tfoot, Td, Th, Tr]
-  GetAInfo BorderA              = AInfo "border" '[Img, Object, Table]
-  GetAInfo BufferedA            = AInfo "buffered" '[Audio, Video]
-  GetAInfo ChallengeA           = AInfo "challenge" '[Keygen]
-  GetAInfo CharsetA             = AInfo "charset" '[Meta, Script]
-  GetAInfo CheckedA             = AInfo "checked" '[Command, Input]
-  GetAInfo CiteA                = AInfo "cite" '[Blockquote, Del, Ins, Q]
-  GetAInfo ClassA               = AInfo "class" '[]
-  GetAInfo CodeA                = AInfo "code" '[Applet]
-  GetAInfo CodebaseA            = AInfo "codebase" '[Applet]
-  GetAInfo ColorA               = AInfo "color" '[Basefont, Font, Hr]
-  GetAInfo ColsA                = AInfo "cols" '[Textarea]
-  GetAInfo ColspanA             = AInfo "colspan" '[Td, Th]
-  GetAInfo ContentA             = AInfo "content" '[Meta]
-  GetAInfo ContenteditableA     = AInfo "contenteditable" '[]
-  GetAInfo ContextmenuA         = AInfo "contextmenu" '[]
-  GetAInfo ControlsA            = AInfo "controls" '[Audio, Video]
-  GetAInfo CoordsA              = AInfo "coords" '[Area]
-  GetAInfo CrossoriginA         = AInfo "crossorigin" '[Audio, Img, Link, Script, Video]
-  GetAInfo DataA                = AInfo "data" '[Object]
-  GetAInfo DatetimeA            = AInfo "datetime" '[Del, Ins, Time]
-  GetAInfo DefaultA             = AInfo "default" '[Track]
-  GetAInfo DeferA               = AInfo "defer" '[Script]
-  GetAInfo DirA                 = AInfo "dir" '[]
-  GetAInfo DirnameA             = AInfo "dirname" '[Input, Textarea]
-  GetAInfo DisabledA            = AInfo "disabled" '[Button, Command, Fieldset, Input, Keygen, Optgroup, Option, Select, Textarea]
-  GetAInfo DownloadA            = AInfo "download" '[A, Area]
-  GetAInfo DraggableA           = AInfo "draggable" '[]
-  GetAInfo DropzoneA            = AInfo "dropzone" '[]
-  GetAInfo EnctypeA             = AInfo "enctype" '[Form]
-  GetAInfo ForA                 = AInfo "for" '[Label, Output]
-  GetAInfo FormA                = AInfo "form" '[Button, Fieldset, Input, Keygen, Label, Meter, Object, Output, Progress, Select, Textarea]
-  GetAInfo FormactionA          = AInfo "formaction" '[Input, Button]
-  GetAInfo FormenctypeA         = AInfo "formenctype" '[Button, Input]
-  GetAInfo FormmethodA          = AInfo "formmethod" '[Button, Input]
-  GetAInfo FormnovalidateA      = AInfo "formnovalidate" '[Button, Input]
-  GetAInfo FormtargetA          = AInfo "formtarget" '[Button, Input]
-  GetAInfo HeadersA             = AInfo "headers" '[Td, Th]
-  GetAInfo HeightA              = AInfo "height" '[Canvas, Embed, Iframe, Img, Input, Object, Video]
-  GetAInfo HiddenA              = AInfo "hidden" '[]
-  GetAInfo HighA                = AInfo "high" '[Meter]
-  GetAInfo HrefA                = AInfo "href" '[A, Area, Base, Link]
-  GetAInfo HreflangA            = AInfo "hreflang" '[A, Area, Link]
-  GetAInfo HttpEquivA           = AInfo "httpEquiv" '[Meta]
-  GetAInfo IconA                = AInfo "icon" '[Command]
-  GetAInfo IdA                  = AInfo "id" '[]
-  GetAInfo IntegrityA           = AInfo "integrity" '[Link, Script]
-  GetAInfo IsmapA               = AInfo "ismap" '[Img]
-  GetAInfo ItempropA            = AInfo "itemprop" '[]
-  GetAInfo KeytypeA             = AInfo "keytype" '[Keygen]
-  GetAInfo KindA                = AInfo "kind" '[Track]
-  GetAInfo LabelA               = AInfo "label" '[Track]
-  GetAInfo LangA                = AInfo "lang" '[]
-  GetAInfo LanguageA            = AInfo "language" '[Script]
-  GetAInfo ListA                = AInfo "list" '[Input]
-  GetAInfo LongdescA            = AInfo "longdesc" '[Img]
-  GetAInfo LoopA                = AInfo "loop" '[Audio, Bgsound, Marquee, Video]
-  GetAInfo LowA                 = AInfo "low" '[Meter]
-  GetAInfo ManifestA            = AInfo "manifest" '[Html]
-  GetAInfo MaxA                 = AInfo "max" '[Input, Meter, Progress]
-  GetAInfo MaxlengthA           = AInfo "maxlength" '[Input, Textarea]
-  GetAInfo MediaA               = AInfo "media" '[A, Area, Link, Source, Style]
-  GetAInfo MethodA              = AInfo "method" '[Form]
-  GetAInfo MinA                 = AInfo "min" '[Input, Meter]
-  GetAInfo MinlengthA           = AInfo "minlength" '[Input, Textarea]
-  GetAInfo MultipleA            = AInfo "multiple" '[Input, Select]
-  GetAInfo MutedA               = AInfo "muted" '[Video]
-  GetAInfo NameA                = AInfo "name" '[Button, Form, Fieldset, Iframe, Input, Keygen, Object, Output, Select, Textarea, Map, Meta, Param]
-  GetAInfo NonceA               = AInfo "nonce" '[Link, Script, Style]
-  GetAInfo NovalidateA          = AInfo "novalidate" '[Form]
-  GetAInfo OpenA                = AInfo "open" '[Details]
-  GetAInfo OptimumA             = AInfo "optimum" '[Meter]
-  GetAInfo PatternA             = AInfo "pattern" '[Input]
-  GetAInfo PingA                = AInfo "ping" '[A, Area]
-  GetAInfo PlaceholderA         = AInfo "placeholder" '[Input, Textarea]
-  GetAInfo PosterA              = AInfo "poster" '[Video]
-  GetAInfo PreloadA             = AInfo "preload" '[Audio, Video]
-  GetAInfo RadiogroupA          = AInfo "radiogroup" '[Command]
-  GetAInfo ReadonlyA            = AInfo "readonly" '[Input, Textarea]
-  GetAInfo ReferrerpolicyA      = AInfo "referrerpolicy" '[A, Area, Iframe, Img, Link]
-  GetAInfo RelA                 = AInfo "rel" '[A, Area, Link]
-  GetAInfo RequiredA            = AInfo "required" '[Input, Select, Textarea]
-  GetAInfo RevA                 = AInfo "rev" '[A, Link]
-  GetAInfo ReversedA            = AInfo "reversed" '[Ol]
-  GetAInfo RowsA                = AInfo "rows" '[Textarea]
-  GetAInfo RowspanA             = AInfo "rowspan" '[Td, Th]
-  GetAInfo SandboxA             = AInfo "sandbox" '[Iframe]
-  GetAInfo ScopeA               = AInfo "scope" '[Th]
-  GetAInfo ScopedA              = AInfo "scoped" '[Style]
-  GetAInfo SeamlessA            = AInfo "seamless" '[Iframe]
-  GetAInfo SelectedA            = AInfo "selected" '[Option]
-  GetAInfo ShapeA               = AInfo "shape" '[A, Area]
-  GetAInfo SizeA                = AInfo "size" '[Input, Select]
-  GetAInfo SizesA               = AInfo "sizes" '[Link, Img, Source]
-  GetAInfo SlotA                = AInfo "slot" '[]
-  GetAInfo SpanA                = AInfo "span" '[Col, Colgroup]
-  GetAInfo SpellcheckA          = AInfo "spellcheck" '[]
-  GetAInfo SrcA                 = AInfo "src" '[Audio, Embed, Iframe, Img, Input, Script, Source, Track, Video]
-  GetAInfo SrcdocA              = AInfo "srcdoc" '[Iframe]
-  GetAInfo SrclangA             = AInfo "srclang" '[Track]
-  GetAInfo SrcsetA              = AInfo "srcset" '[Img]
-  GetAInfo StartA               = AInfo "start" '[Ol]
-  GetAInfo StepA                = AInfo "step" '[Input]
-  GetAInfo StyleA               = AInfo "style" '[]
-  GetAInfo SummaryA             = AInfo "summary" '[Table]
-  GetAInfo TabindexA            = AInfo "tabindex" '[]
-  GetAInfo TargetA              = AInfo "target" '[A, Area, Base, Form]
-  GetAInfo TitleA               = AInfo "title" '[]
-  GetAInfo TranslateA           = AInfo "translate" '[]
-  GetAInfo TypeA                = AInfo "type" '[Button, Input, Command, Embed, Object, Script, Source, Style, Menu, Ol, A, Area, Link]
-  GetAInfo TypemustmatchA       = AInfo "typemustmatch" '[Object]
-  GetAInfo UsemapA              = AInfo "usemap" '[Img, Input, Object]
-  GetAInfo ValueA               = AInfo "value" '[Button, Option, Input, Li, Meter, Progress, Param, Data]
-  GetAInfo WidthA               = AInfo "width" '[Canvas, Embed, Iframe, Img, Input, Object, Video]
-  GetAInfo WrapA                = AInfo "wrap" '[Textarea]
+  GetAInfo AlignA               = AInfo "align"               '[Applet, Caption, Col, Colgroup, Hr, Iframe, Img, Table, Tbody, Td, Tfoot, Th, Thead, Tr]
+  GetAInfo AltA                 = AInfo "alt"                 '[Applet, Area, Img, Input]
+  GetAInfo AsyncA               = AInfo "async"               '[Script]
+  GetAInfo AutocompleteA        = AInfo "autocomplete"        '[Form, Input]
+  GetAInfo AutofocusA           = AInfo "autofocus"           '[Button, Input, Keygen, Select, Textarea]
+  GetAInfo AutoplayA            = AInfo "autoplay"            '[Audio, Video]
+  GetAInfo AutosaveA            = AInfo "autosave"            '[Input]
+  GetAInfo BgcolorA             = AInfo "bgcolor"             '[Body, Col, Colgroup, Marquee, Table, Tbody, Tfoot, Td, Th, Tr]
+  GetAInfo BorderA              = AInfo "border"              '[Img, Object, Table]
+  GetAInfo BufferedA            = AInfo "buffered"            '[Audio, Video]
+  GetAInfo ChallengeA           = AInfo "challenge"           '[Keygen]
+  GetAInfo CharsetA             = AInfo "charset"             '[Meta, Script]
+  GetAInfo CheckedA             = AInfo "checked"             '[Command, Input]
+  GetAInfo CiteA                = AInfo "cite"                '[Blockquote, Del, Ins, Q]
+  GetAInfo ClassA               = AInfo "class"               '[]
+  GetAInfo CodeA                = AInfo "code"                '[Applet]
+  GetAInfo CodebaseA            = AInfo "codebase"            '[Applet]
+  GetAInfo ColorA               = AInfo "color"               '[Basefont, Font, Hr]
+  GetAInfo ColsA                = AInfo "cols"                '[Textarea]
+  GetAInfo ColspanA             = AInfo "colspan"             '[Td, Th]
+  GetAInfo ContentA             = AInfo "content"             '[Meta]
+  GetAInfo ContenteditableA     = AInfo "contenteditable"     '[]
+  GetAInfo ContextmenuA         = AInfo "contextmenu"         '[]
+  GetAInfo ControlsA            = AInfo "controls"            '[Audio, Video]
+  GetAInfo CoordsA              = AInfo "coords"              '[Area]
+  GetAInfo CrossoriginA         = AInfo "crossorigin"         '[Audio, Img, Link, Script, Video]
+  GetAInfo DataA                = AInfo "data"                '[Object]
+  GetAInfo DatetimeA            = AInfo "datetime"            '[Del, Ins, Time]
+  GetAInfo DefaultA             = AInfo "default"             '[Track]
+  GetAInfo DeferA               = AInfo "defer"               '[Script]
+  GetAInfo DirA                 = AInfo "dir"                 '[]
+  GetAInfo DirnameA             = AInfo "dirname"             '[Input, Textarea]
+  GetAInfo DisabledA            = AInfo "disabled"            '[Button, Command, Fieldset, Input, Keygen, Optgroup, Option, Select, Textarea]
+  GetAInfo DownloadA            = AInfo "download"            '[A, Area]
+  GetAInfo DraggableA           = AInfo "draggable"           '[]
+  GetAInfo DropzoneA            = AInfo "dropzone"            '[]
+  GetAInfo EnctypeA             = AInfo "enctype"             '[Form]
+  GetAInfo ForA                 = AInfo "for"                 '[Label, Output]
+  GetAInfo FormA                = AInfo "form"                '[Button, Fieldset, Input, Keygen, Label, Meter, Object, Output, Progress, Select, Textarea]
+  GetAInfo FormactionA          = AInfo "formaction"          '[Input, Button]
+  GetAInfo FormenctypeA         = AInfo "formenctype"         '[Button, Input]
+  GetAInfo FormmethodA          = AInfo "formmethod"          '[Button, Input]
+  GetAInfo FormnovalidateA      = AInfo "formnovalidate"      '[Button, Input]
+  GetAInfo FormtargetA          = AInfo "formtarget"          '[Button, Input]
+  GetAInfo HeadersA             = AInfo "headers"             '[Td, Th]
+  GetAInfo HeightA              = AInfo "height"              '[Canvas, Embed, Iframe, Img, Input, Object, Video]
+  GetAInfo HiddenA              = AInfo "hidden"              '[]
+  GetAInfo HighA                = AInfo "high"                '[Meter]
+  GetAInfo HrefA                = AInfo "href"                '[A, Area, Base, Link]
+  GetAInfo HreflangA            = AInfo "hreflang"            '[A, Area, Link]
+  GetAInfo HttpEquivA           = AInfo "httpEquiv"           '[Meta]
+  GetAInfo IconA                = AInfo "icon"                '[Command]
+  GetAInfo IdA                  = AInfo "id"                  '[]
+  GetAInfo IntegrityA           = AInfo "integrity"           '[Link, Script]
+  GetAInfo IsmapA               = AInfo "ismap"               '[Img]
+  GetAInfo ItempropA            = AInfo "itemprop"            '[]
+  GetAInfo KeytypeA             = AInfo "keytype"             '[Keygen]
+  GetAInfo KindA                = AInfo "kind"                '[Track]
+  GetAInfo LabelA               = AInfo "label"               '[Track]
+  GetAInfo LangA                = AInfo "lang"                '[]
+  GetAInfo LanguageA            = AInfo "language"            '[Script]
+  GetAInfo ListA                = AInfo "list"                '[Input]
+  GetAInfo LongdescA            = AInfo "longdesc"            '[Img]
+  GetAInfo LoopA                = AInfo "loop"                '[Audio, Bgsound, Marquee, Video]
+  GetAInfo LowA                 = AInfo "low"                 '[Meter]
+  GetAInfo ManifestA            = AInfo "manifest"            '[Html]
+  GetAInfo MaxA                 = AInfo "max"                 '[Input, Meter, Progress]
+  GetAInfo MaxlengthA           = AInfo "maxlength"           '[Input, Textarea]
+  GetAInfo MediaA               = AInfo "media"               '[A, Area, Link, Source, Style]
+  GetAInfo MethodA              = AInfo "method"              '[Form]
+  GetAInfo MinA                 = AInfo "min"                 '[Input, Meter]
+  GetAInfo MinlengthA           = AInfo "minlength"           '[Input, Textarea]
+  GetAInfo MultipleA            = AInfo "multiple"            '[Input, Select]
+  GetAInfo MutedA               = AInfo "muted"               '[Video]
+  GetAInfo NameA                = AInfo "name"                '[Button, Form, Fieldset, Iframe, Input, Keygen, Object, Output, Select, Textarea, Map, Meta, Param]
+  GetAInfo NonceA               = AInfo "nonce"               '[Link, Script, Style]
+  GetAInfo NovalidateA          = AInfo "novalidate"          '[Form]
+  GetAInfo OpenA                = AInfo "open"                '[Details]
+  GetAInfo OptimumA             = AInfo "optimum"             '[Meter]
+  GetAInfo PatternA             = AInfo "pattern"             '[Input]
+  GetAInfo PingA                = AInfo "ping"                '[A, Area]
+  GetAInfo PlaceholderA         = AInfo "placeholder"         '[Input, Textarea]
+  GetAInfo PosterA              = AInfo "poster"              '[Video]
+  GetAInfo PreloadA             = AInfo "preload"             '[Audio, Video]
+  GetAInfo RadiogroupA          = AInfo "radiogroup"          '[Command]
+  GetAInfo ReadonlyA            = AInfo "readonly"            '[Input, Textarea]
+  GetAInfo ReferrerpolicyA      = AInfo "referrerpolicy"      '[A, Area, Iframe, Img, Link]
+  GetAInfo RelA                 = AInfo "rel"                 '[A, Area, Link]
+  GetAInfo RequiredA            = AInfo "required"            '[Input, Select, Textarea]
+  GetAInfo RevA                 = AInfo "rev"                 '[A, Link]
+  GetAInfo ReversedA            = AInfo "reversed"            '[Ol]
+  GetAInfo RowsA                = AInfo "rows"                '[Textarea]
+  GetAInfo RowspanA             = AInfo "rowspan"             '[Td, Th]
+  GetAInfo SandboxA             = AInfo "sandbox"             '[Iframe]
+  GetAInfo ScopeA               = AInfo "scope"               '[Th]
+  GetAInfo ScopedA              = AInfo "scoped"              '[Style]
+  GetAInfo SeamlessA            = AInfo "seamless"            '[Iframe]
+  GetAInfo SelectedA            = AInfo "selected"            '[Option]
+  GetAInfo ShapeA               = AInfo "shape"               '[A, Area]
+  GetAInfo SizeA                = AInfo "size"                '[Input, Select]
+  GetAInfo SizesA               = AInfo "sizes"               '[Link, Img, Source]
+  GetAInfo SlotA                = AInfo "slot"                '[]
+  GetAInfo SpanA                = AInfo "span"                '[Col, Colgroup]
+  GetAInfo SpellcheckA          = AInfo "spellcheck"          '[]
+  GetAInfo SrcA                 = AInfo "src"                 '[Audio, Embed, Iframe, Img, Input, Script, Source, Track, Video]
+  GetAInfo SrcdocA              = AInfo "srcdoc"              '[Iframe]
+  GetAInfo SrclangA             = AInfo "srclang"             '[Track]
+  GetAInfo SrcsetA              = AInfo "srcset"              '[Img]
+  GetAInfo StartA               = AInfo "start"               '[Ol]
+  GetAInfo StepA                = AInfo "step"                '[Input]
+  GetAInfo StyleA               = AInfo "style"               '[]
+  GetAInfo SummaryA             = AInfo "summary"             '[Table]
+  GetAInfo TabindexA            = AInfo "tabindex"            '[]
+  GetAInfo TargetA              = AInfo "target"              '[A, Area, Base, Form]
+  GetAInfo TitleA               = AInfo "title"               '[]
+  GetAInfo TranslateA           = AInfo "translate"           '[]
+  GetAInfo TypeA                = AInfo "type"                '[Button, Input, Command, Embed, Object, Script, Source, Style, Menu, Ol, A, Area, Link]
+  GetAInfo TypemustmatchA       = AInfo "typemustmatch"       '[Object]
+  GetAInfo UsemapA              = AInfo "usemap"              '[Img, Input, Object]
+  GetAInfo ValueA               = AInfo "value"               '[Button, Option, Input, Li, Meter, Progress, Param, Data]
+  GetAInfo WidthA               = AInfo "width"               '[Canvas, Embed, Iframe, Img, Input, Object, Video]
+  GetAInfo WrapA                = AInfo "wrap"                '[Textarea]
 
 -- | Retrieve type level meta data about elements.
 type family GetEInfo a = r | r -> a where
 
-  GetEInfo DOCTYPE = EInfo
-    "!DOCTYPE html"
-    '[]
-    NoContent
-
-  GetEInfo A = EInfo
-    "a"
-    '[ FlowContent, PhrasingContent ]
-    (FlowContent :&: NOT (SingleElement Details) :|: PhrasingContent)
-
-  GetEInfo Abbr = EInfo
-    "abbr"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Address = EInfo
-    "address"
-    '[ FlowContent ]
-    (FlowContent :&: NOT (HeadingContent :|: SectioningContent :|: SingleElement Address :|: SingleElement Header :|: SingleElement Footer))
-
-  GetEInfo Area = EInfo
-    "area"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Article = EInfo
-    "article"
-    '[ FlowContent, SectioningContent ]
-    FlowContent
-
-  GetEInfo Aside = EInfo
-    "aside"
-    '[ FlowContent, SectioningContent ]
-    FlowContent
-
-  GetEInfo Audio = EInfo
-    "audio"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement Source :|: SingleElement Track)
-
-  GetEInfo B = EInfo
-    "b"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Base = EInfo
-    "base"
-    '[ MetadataContent ]
-    NoContent
-
-  GetEInfo Bdi = EInfo
-    "bdi"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Bdo = EInfo
-    "bdo"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Blockquote = EInfo
-    "blockquote"
-    '[ FlowContent ]
-    FlowContent
-
-  GetEInfo Body = EInfo
-    "body"
-    '[]
-    FlowContent
-
-  GetEInfo Br = EInfo
-    "br"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Button = EInfo
-    "button"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Canvas = EInfo
-    "canvas"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement A :|: SingleElement Button :|: SingleElement Input)
-
-  GetEInfo Caption = EInfo
-    "caption"
-    '[]
-    FlowContent
-
-  GetEInfo Cite = EInfo
-    "cite"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Code = EInfo
-    "code"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Col = EInfo
-    "col"
-    '[]
-    NoContent
-
-  GetEInfo Colgroup = EInfo
-    "colgroup"
-    '[]
-    (SingleElement Col)
-
-  GetEInfo Data = EInfo
-    "data"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Datalist = EInfo
-    "datalist"
-    '[ FlowContent, PhrasingContent ]
-    (PhrasingContent :|: SingleElement Option)
-
-  GetEInfo Dd = EInfo
-    "dd"
-    '[]
-    FlowContent
-
-  GetEInfo Del = EInfo
-    "del"
-    '[ FlowContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Details = EInfo
-    "details"
-    '[ FlowContent ]
-    ( FlowContent :|: SingleElement Summary)
-
-  GetEInfo Dfn = EInfo
-    "dfn"
-    '[ FlowContent, PhrasingContent ]
-    (PhrasingContent :&: NOT (SingleElement Dfn))
-
-  GetEInfo Dialog = EInfo
-    "dialog"
-    '[ FlowContent ]
-    FlowContent
-
-  GetEInfo Div = EInfo
-    "div"
-    '[ FlowContent ]
-    (FlowContent :|: SingleElement Dt :|: SingleElement Dd :|: SingleElement Script :|: SingleElement Template)
-
-  GetEInfo Dl = EInfo
-    "dl"
-    '[ FlowContent ]
-    (SingleElement Dt :|: SingleElement Dd :|: SingleElement Script :|: SingleElement Template :|: SingleElement Div)
-
-  GetEInfo Dt = EInfo
-    "dt"
-    '[]
-    (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer :|: SectioningContent :|: HeadingContent))
-
-  GetEInfo Em = EInfo
-    "em"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Embed = EInfo
-    "embed"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Fieldset = EInfo
-    "fieldset"
-    '[ FlowContent ]
-    (FlowContent :|: SingleElement Legend)
-
-  GetEInfo Figcaption = EInfo
-    "figcaption"
-    '[]
-    FlowContent
-
-  GetEInfo Figure = EInfo
-    "figure"
-    '[ FlowContent ]
-    (FlowContent :|: SingleElement Figcaption)
-
-  GetEInfo Footer = EInfo
-    "footer"
-    '[ FlowContent ]
-    (FlowContent :&: NOT (SingleElement Footer :|: SingleElement Header))
-
-  GetEInfo Form = EInfo
-    "form"
-    '[ FlowContent ]
-    (FlowContent :&: NOT (SingleElement Form))
-
-  GetEInfo H1 = EInfo
-    "h1"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo H2 = EInfo
-    "h2"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo H3 = EInfo
-    "h3"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo H4 = EInfo
-    "h4"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo H5 = EInfo
-    "h5"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo H6 = EInfo
-    "h6"
-    '[ FlowContent, HeadingContent ]
-    PhrasingContent
-
-  GetEInfo Head = EInfo
-    "head"
-    '[]
-    MetadataContent
-
-  GetEInfo Header = EInfo
-    "header"
-    '[ FlowContent ]
-    (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer))
-
-  GetEInfo Hgroup = EInfo
-    "hgroup"
-    '[ FlowContent, HeadingContent ]
-    (SingleElement H1 :|: SingleElement H2 :|: SingleElement H3 :|: SingleElement H4 :|: SingleElement H5 :|: SingleElement H6)
-
-  GetEInfo Hr = EInfo
-    "hr"
-    '[ FlowContent ]
-    NoContent
-
-  GetEInfo Html = EInfo
-    "html"
-    '[]
-    (SingleElement Head :|: SingleElement Body)
-
-  GetEInfo I = EInfo
-    "i"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Iframe = EInfo
-    "iframe"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Img = EInfo
-    "img"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Ins = EInfo
-    "ins"
-    '[ FlowContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Kbd = EInfo
-    "kbd"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Label = EInfo
-    "label"
-    '[ FlowContent, PhrasingContent ]
-    (PhrasingContent :&: NOT (SingleElement Label))
-
-  GetEInfo Legend = EInfo
-    "legend"
-    '[]
-    PhrasingContent
-
-  GetEInfo Li = EInfo
-    "li"
-    '[]
-    FlowContent
-
-  GetEInfo Link = EInfo
-    "link"
-    '[ FlowContent, PhrasingContent, MetadataContent ]
-    NoContent
-
-  GetEInfo Main = EInfo
-    "main"
-    '[ FlowContent ]
-    FlowContent
-
-  GetEInfo Map = EInfo
-    "map"
-    '[ FlowContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Mark = EInfo
-    "mark"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Menu = EInfo
-    "menu"
-    '[ FlowContent ]
-    (FlowContent :|: SingleElement Li :|: SingleElement Script :|: SingleElement Template :|: SingleElement Menu :|: SingleElement Menuitem :|: SingleElement Hr)
-
-  GetEInfo Menuitem = EInfo
-    "menuitem"
-    '[]
-    NoContent
-
-  GetEInfo Meta = EInfo
-    "meta"
-    '[ FlowContent, MetadataContent, PhrasingContent ]
-    NoContent
-
-  GetEInfo Meter = EInfo
-    "meter"
-    '[ FlowContent, PhrasingContent ]
-    (PhrasingContent :&: NOT (SingleElement Meter))
-
-  GetEInfo Nav = EInfo
-    "nav"
-    '[ FlowContent, SectioningContent ]
-    FlowContent
-
-  GetEInfo Noscript = EInfo
-    "noscript"
-    '[ FlowContent, MetadataContent, PhrasingContent ]
-    (FlowContent :|: PhrasingContent :|: SingleElement Link :|: SingleElement Style :|: SingleElement Meta)
-
-  GetEInfo Object = EInfo
-    "object"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement Param)
-
-  GetEInfo Ol = EInfo
-    "ol"
-    '[ FlowContent ]
-    (SingleElement Li)
-
-  GetEInfo Optgroup = EInfo
-    "optgroup"
-    '[]
-    (SingleElement Option)
-
-  GetEInfo Option = EInfo
-    "option"
-    '[]
-    OnlyText
-
-  GetEInfo Output = EInfo
-    "output"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo P = EInfo
-    "p"
-    '[ FlowContent ]
-    PhrasingContent
-
-  GetEInfo Param = EInfo
-    "param"
-    '[]
-    NoContent
-
-  GetEInfo Picture = EInfo
-    "picture"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement Source :|: SingleElement Img)
-
-  GetEInfo Pre = EInfo
-    "pre"
-    '[ FlowContent ]
-    PhrasingContent
-
-  GetEInfo Progress = EInfo
-    "progress"
-    '[ FlowContent, PhrasingContent ]
-    (PhrasingContent :&: NOT (SingleElement Progress))
-
-  GetEInfo Q = EInfo
-    "q"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Rp = EInfo
-    "rp"
-    '[]
-    OnlyText
-
-  GetEInfo Rt = EInfo
-    "rt"
-    '[]
-    PhrasingContent
-
-  GetEInfo Rtc = EInfo
-    "rtc"
-    '[]
-    (PhrasingContent :|: SingleElement Rt)
-
-  GetEInfo Ruby = EInfo
-    "ruby"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo S = EInfo
-    "s"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Samp = EInfo
-    "samp"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Script = EInfo
-    "script"
-    '[ FlowContent, MetadataContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Section = EInfo
-    "section"
-    '[ FlowContent, SectioningContent ]
-    FlowContent
-
-  GetEInfo Select = EInfo
-    "select"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement Option :|: SingleElement Optgroup)
-
-  GetEInfo Slot = EInfo
-    "slot"
-    '[ FlowContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Small = EInfo
-    "small"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Source = EInfo
-    "source"
-    '[]
-    NoContent
-
-  GetEInfo Span = EInfo
-    "span"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Strong = EInfo
-    "strong"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Style = EInfo
-    "style"
-    '[ FlowContent, MetadataContent ]
-    OnlyText
-
-  GetEInfo Sub = EInfo
-    "sub"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Summary = EInfo
-    "summary"
-    '[]
-    (PhrasingContent :|: HeadingContent)
-
-  GetEInfo Sup = EInfo
-    "sup"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Table = EInfo
-    "table"
-    '[FlowContent]
-    (SingleElement Caption :|: SingleElement Colgroup :|: SingleElement Thead :|: SingleElement Tbody :|: SingleElement Tr :|: SingleElement Tfoot)
-
-  GetEInfo Tbody = EInfo
-    "tbody"
-    '[]
-    (SingleElement Tr)
-
-  GetEInfo Td = EInfo
-    "td"
-    '[]
-    FlowContent
-
-  GetEInfo Template = EInfo
-    "template"
-    '[ FlowContent, MetadataContent, PhrasingContent ]
-    (FlowContent :|: MetadataContent)
-
-  GetEInfo Textarea = EInfo
-    "textarea"
-    '[ FlowContent, PhrasingContent ]
-    OnlyText
-
-  GetEInfo Tfoot = EInfo
-    "tfoot"
-    '[]
-    (SingleElement Tr)
-
-  GetEInfo Th = EInfo
-    "th"
-    '[]
-    (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer :|: SectioningContent :|: HeadingContent))
-
-  GetEInfo Thead = EInfo
-    "thead"
-    '[]
-    (SingleElement Tr)
-
-  GetEInfo Time = EInfo
-    "time"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Title = EInfo
-    "title"
-    '[ MetadataContent ]
-    OnlyText
-
-  GetEInfo Tr = EInfo
-    "tr"
-    '[]
-    (SingleElement Td :|: SingleElement Th)
-
-  GetEInfo Track = EInfo
-    "track"
-    '[]
-    NoContent
-
-  GetEInfo U = EInfo
-    "u"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Ul = EInfo
-    "ul"
-    '[ FlowContent ]
-    (SingleElement Li)
-
-  GetEInfo Var = EInfo
-    "var"
-    '[ FlowContent, PhrasingContent ]
-    PhrasingContent
-
-  GetEInfo Video = EInfo
-    "video"
-    '[ FlowContent, PhrasingContent ]
-    (SingleElement Track :|: SingleElement Source)
-
-  GetEInfo Wbr = EInfo
-    "wbr"
-    '[ FlowContent, PhrasingContent ]
-    NoContent
+  GetEInfo DOCTYPE    = EInfo "!DOCTYPE html" '[]                                                NoContent
+  GetEInfo A          = EInfo "a"             '[ FlowContent, PhrasingContent ]                  (FlowContent :&: NOT (SingleElement Details) :|: PhrasingContent)
+  GetEInfo Abbr       = EInfo "abbr"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Address    = EInfo "address"       '[ FlowContent ]                                   (FlowContent :&: NOT (HeadingContent :|: SectioningContent :|: SingleElement Address :|: SingleElement Header :|: SingleElement Footer))
+  GetEInfo Area       = EInfo "area"          '[ FlowContent, PhrasingContent ]                  NoContent
+  GetEInfo Article    = EInfo "article"       '[ FlowContent, SectioningContent ]                FlowContent
+  GetEInfo Aside      = EInfo "aside"         '[ FlowContent, SectioningContent ]                FlowContent
+  GetEInfo Audio      = EInfo "audio"         '[ FlowContent, PhrasingContent ]                  (SingleElement Source :|: SingleElement Track)
+  GetEInfo B          = EInfo "b"             '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Base       = EInfo "base"          '[ MetadataContent ]                               NoContent
+  GetEInfo Bdi        = EInfo "bdi"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Bdo        = EInfo "bdo"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Blockquote = EInfo "blockquote"    '[ FlowContent ]                                   FlowContent
+  GetEInfo Body       = EInfo "body"          '[]                                                FlowContent
+  GetEInfo Br         = EInfo "br"            '[ FlowContent, PhrasingContent ]                  NoContent
+  GetEInfo Button     = EInfo "button"        '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Canvas     = EInfo "canvas"        '[ FlowContent, PhrasingContent ]                  (SingleElement A :|: SingleElement Button :|: SingleElement Input)
+  GetEInfo Caption    = EInfo "caption"       '[]                                                FlowContent
+  GetEInfo Cite       = EInfo "cite"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Code       = EInfo "code"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Col        = EInfo "col"           '[]                                                NoContent
+  GetEInfo Colgroup   = EInfo "colgroup"      '[]                                                (SingleElement Col)
+  GetEInfo Data       = EInfo "data"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Datalist   = EInfo "datalist"      '[ FlowContent, PhrasingContent ]                  (PhrasingContent :|: SingleElement Option)
+  GetEInfo Dd         = EInfo "dd"            '[]                                                FlowContent
+  GetEInfo Del        = EInfo "del"           '[ FlowContent, PhrasingContent ]                  OnlyText
+  GetEInfo Details    = EInfo "details"       '[ FlowContent ]                                   ( FlowContent :|: SingleElement Summary)
+  GetEInfo Dfn        = EInfo "dfn"           '[ FlowContent, PhrasingContent ]                  (PhrasingContent :&: NOT (SingleElement Dfn))
+  GetEInfo Dialog     = EInfo "dialog"        '[ FlowContent ]                                   FlowContent
+  GetEInfo Div        = EInfo "div"           '[ FlowContent ]                                   (FlowContent :|: SingleElement Dt :|: SingleElement Dd :|: SingleElement Script :|: SingleElement Template)
+  GetEInfo Dl         = EInfo "dl"            '[ FlowContent ]                                   (SingleElement Dt :|: SingleElement Dd :|: SingleElement Script :|: SingleElement Template :|: SingleElement Div)
+  GetEInfo Dt         = EInfo "dt"            '[]                                                (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer :|: SectioningContent :|: HeadingContent))
+  GetEInfo Em         = EInfo "em"            '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Embed      = EInfo "embed"         '[ FlowContent, PhrasingContent ]                  NoContent
+  GetEInfo Fieldset   = EInfo "fieldset"      '[ FlowContent ]                                   (FlowContent :|: SingleElement Legend)
+  GetEInfo Figcaption = EInfo "figcaption"    '[]                                                FlowContent
+  GetEInfo Figure     = EInfo "figure"        '[ FlowContent ]                                   (FlowContent :|: SingleElement Figcaption)
+  GetEInfo Footer     = EInfo "footer"        '[ FlowContent ]                                   (FlowContent :&: NOT (SingleElement Footer :|: SingleElement Header))
+  GetEInfo Form       = EInfo "form"          '[ FlowContent ]                                   (FlowContent :&: NOT (SingleElement Form))
+  GetEInfo H1         = EInfo "h1"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo H2         = EInfo "h2"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo H3         = EInfo "h3"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo H4         = EInfo "h4"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo H5         = EInfo "h5"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo H6         = EInfo "h6"            '[ FlowContent, HeadingContent ]                   PhrasingContent
+  GetEInfo Head       = EInfo "head"          '[]                                                MetadataContent
+  GetEInfo Header     = EInfo "header"        '[ FlowContent ]                                   (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer))
+  GetEInfo Hgroup     = EInfo "hgroup"        '[ FlowContent, HeadingContent ]                   (SingleElement H1 :|: SingleElement H2 :|: SingleElement H3 :|: SingleElement H4 :|: SingleElement H5 :|: SingleElement H6)
+  GetEInfo Hr         = EInfo "hr"            '[ FlowContent ]                                   NoContent
+  GetEInfo Html       = EInfo "html"          '[]                                                (SingleElement Head :|: SingleElement Body)
+  GetEInfo I          = EInfo "i"             '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Iframe     = EInfo "iframe"        '[ FlowContent, PhrasingContent ]                  NoContent
+  GetEInfo Img        = EInfo "img"           '[ FlowContent, PhrasingContent ]                  NoContent
+  GetEInfo Ins        = EInfo "ins"           '[ FlowContent, PhrasingContent ]                  OnlyText
+  GetEInfo Kbd        = EInfo "kbd"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Label      = EInfo "label"         '[ FlowContent, PhrasingContent ]                  (PhrasingContent :&: NOT (SingleElement Label))
+  GetEInfo Legend     = EInfo "legend"        '[]                                                PhrasingContent
+  GetEInfo Li         = EInfo "li"            '[]                                                FlowContent
+  GetEInfo Link       = EInfo "link"          '[ FlowContent, PhrasingContent, MetadataContent ] NoContent
+  GetEInfo Main       = EInfo "main"          '[ FlowContent ]                                   FlowContent
+  GetEInfo Map        = EInfo "map"           '[ FlowContent, PhrasingContent ]                  OnlyText
+  GetEInfo Mark       = EInfo "mark"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Menu       = EInfo "menu"          '[ FlowContent ]                                   (FlowContent :|: SingleElement Li :|: SingleElement Script :|: SingleElement Template :|: SingleElement Menu :|: SingleElement Menuitem :|: SingleElement Hr)
+  GetEInfo Menuitem   = EInfo "menuitem"      '[]                                                NoContent
+  GetEInfo Meta       = EInfo "meta"          '[ FlowContent, MetadataContent, PhrasingContent ] NoContent
+  GetEInfo Meter      = EInfo "meter"         '[ FlowContent, PhrasingContent ]                  (PhrasingContent :&: NOT (SingleElement Meter))
+  GetEInfo Nav        = EInfo "nav"           '[ FlowContent, SectioningContent ]                FlowContent
+  GetEInfo Noscript   = EInfo "noscript"      '[ FlowContent, MetadataContent, PhrasingContent ] (FlowContent :|: PhrasingContent :|: SingleElement Link :|: SingleElement Style :|: SingleElement Meta)
+  GetEInfo Object     = EInfo "object"        '[ FlowContent, PhrasingContent ]                  (SingleElement Param)
+  GetEInfo Ol         = EInfo "ol"            '[ FlowContent ]                                   (SingleElement Li)
+  GetEInfo Optgroup   = EInfo "optgroup"      '[]                                                (SingleElement Option)
+  GetEInfo Option     = EInfo "option"        '[]                                                OnlyText
+  GetEInfo Output     = EInfo "output"        '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo P          = EInfo "p"             '[ FlowContent ]                                   PhrasingContent
+  GetEInfo Param      = EInfo "param"         '[]                                                NoContent
+  GetEInfo Picture    = EInfo "picture"       '[ FlowContent, PhrasingContent ]                  (SingleElement Source :|: SingleElement Img)
+  GetEInfo Pre        = EInfo "pre"           '[ FlowContent ]                                   PhrasingContent
+  GetEInfo Progress   = EInfo "progress"      '[ FlowContent, PhrasingContent ]                  (PhrasingContent :&: NOT (SingleElement Progress))
+  GetEInfo Q          = EInfo "q"             '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Rp         = EInfo "rp"            '[]                                                OnlyText
+  GetEInfo Rt         = EInfo "rt"            '[]                                                PhrasingContent
+  GetEInfo Rtc        = EInfo "rtc"           '[]                                                (PhrasingContent :|: SingleElement Rt)
+  GetEInfo Ruby       = EInfo "ruby"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo S          = EInfo "s"             '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Samp       = EInfo "samp"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Script     = EInfo "script"        '[ FlowContent, MetadataContent, PhrasingContent ] OnlyText
+  GetEInfo Section    = EInfo "section"       '[ FlowContent, SectioningContent ]                FlowContent
+  GetEInfo Select     = EInfo "select"        '[ FlowContent, PhrasingContent ]                  (SingleElement Option :|: SingleElement Optgroup)
+  GetEInfo Slot       = EInfo "slot"          '[ FlowContent, PhrasingContent ]                  OnlyText
+  GetEInfo Small      = EInfo "small"         '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Source     = EInfo "source"        '[]                                                NoContent
+  GetEInfo Span       = EInfo "span"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Strong     = EInfo "strong"        '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Style      = EInfo "style"         '[ FlowContent, MetadataContent ]                  OnlyText
+  GetEInfo Sub        = EInfo "sub"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Summary    = EInfo "summary"       '[]                                                (PhrasingContent :|: HeadingContent)
+  GetEInfo Sup        = EInfo "sup"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Table      = EInfo "table"         '[ FlowContent ]                                   (SingleElement Caption :|: SingleElement Colgroup :|: SingleElement Thead :|: SingleElement Tbody :|: SingleElement Tr :|: SingleElement Tfoot)
+  GetEInfo Tbody      = EInfo "tbody"         '[]                                                (SingleElement Tr)
+  GetEInfo Td         = EInfo "td"            '[]                                                FlowContent
+  GetEInfo Template   = EInfo "template"      '[ FlowContent, MetadataContent, PhrasingContent ] (FlowContent :|: MetadataContent)
+  GetEInfo Textarea   = EInfo "textarea"      '[ FlowContent, PhrasingContent ]                  OnlyText
+  GetEInfo Tfoot      = EInfo "tfoot"         '[]                                                (SingleElement Tr)
+  GetEInfo Th         = EInfo "th"            '[]                                                (FlowContent :&: NOT (SingleElement Header :|: SingleElement Footer :|: SectioningContent :|: HeadingContent))
+  GetEInfo Thead      = EInfo "thead"         '[]                                                (SingleElement Tr)
+  GetEInfo Time       = EInfo "time"          '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Title      = EInfo "title"         '[ MetadataContent ]                               OnlyText
+  GetEInfo Tr         = EInfo "tr"            '[]                                                (SingleElement Td :|: SingleElement Th)
+  GetEInfo Track      = EInfo "track"         '[]                                                NoContent
+  GetEInfo U          = EInfo "u"             '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Ul         = EInfo "ul"            '[ FlowContent ]                                   (SingleElement Li)
+  GetEInfo Var        = EInfo "var"           '[ FlowContent, PhrasingContent ]                  PhrasingContent
+  GetEInfo Video      = EInfo "video"         '[ FlowContent, PhrasingContent ]                  (SingleElement Track :|: SingleElement Source)
+  GetEInfo Wbr        = EInfo "wbr"           '[ FlowContent, PhrasingContent ]                  NoContent
diff --git a/type-of-html.cabal b/type-of-html.cabal
--- a/type-of-html.cabal
+++ b/type-of-html.cabal
@@ -1,5 +1,5 @@
 name:                 type-of-html
-version:              1.3.0.1
+version:              1.3.1.0
 synopsis:             High performance type driven html generation.
 description:          This library makes most invalid html documents compile time errors and uses advanced type level features to realise compile time computations.
 license:              BSD3
@@ -8,10 +8,9 @@
 maintainer:           fknupfer@gmail.com
 homepage:             https://github.com/knupfer/type-of-html
 tested-with:          GHC == 8.0.2
-                    , GHC == 8.2.1
                     , GHC == 8.2.2
 copyright:            2017, Florian Knupfer
-category:             Language
+category:             Language, Text, Web, HTML
 build-type:           Simple
 extra-source-files:   ChangeLog.md
                     , Readme.md
