diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,13 @@
 # miso-css changelog
 
+## Version 0.0.3 2026-10-17
+  * upgrade to miso-1.14
+  * aria-labelledby
+  * aria-describedby
+  * label for
+  * accesskey
+  * tabindex
+
 ## Version 0.0.2 2026-06-02
   * upgrade to miso-1.11
 
diff --git a/miso-css.cabal b/miso-css.cabal
--- a/miso-css.cabal
+++ b/miso-css.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name:          miso-css
-version:       0.0.2
+version:       0.0.3
 
 synopsis:      wrapper over miso checking CSS classes applicability through dependent types
 description:
@@ -248,6 +248,8 @@
     #e-type#
     
     > data E
+    >      context
+    >      props
     >      model
     >      action
     >      (en :: Symbol)
@@ -259,8 +261,12 @@
     >      (cls :: [Symbol])
     >      (l :: [[[Seg]]])
     >      (children :: [[SubSeg]])
+    >      (wantedIds :: [Symbol])
+    >      (usedTabIndexes :: [Maybe Natural])
+    >      (usedAccessKey :: [Char])
     
-    First two parameters __model__ and __action__ are forwarded to miso
+    First 4 parameters __context__, __props__, __model__ and __action__ are
+    forwarded to miso
     <https://hackage-content.haskell.org/package/miso/docs/Miso-Types.html#t:View VNode>
     type.
     
@@ -346,6 +352,38 @@
     >        [[I "x", T "ol"], [T "ul", C "b", C "a"]]
     > ...
     
+    ==== wantedIds
+    #wantedids#
+    
+    List of tag ids that are referenced somewhere by other tags through
+    <https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA ARIA>
+    attributes: - @\<label for=\"\"\/>@ - aria-labelledby - aria-describedby
+    
+    > """<div>
+    >      <span id="aa">hi</span>
+    >      <span id="bb">bye</span>
+    >      <input aria-describedby="aa bb"/>
+    >    </div>"""
+    > `go` div_ </ (span_ =# Aa <@ "hi") </ (span_ =# Bb <@ "bye")
+    >           </ input_ `ariaDescribedBy` Aa `ariaDescribedBy` Bb
+    
+    ==== usedTabIndexes
+    #usedtabindexes#
+    
+    Tab indexes are global and should be unique as tag ids. Except values
+    __-1__* and __0__.
+    
+    > """<div tabindex="-1">x</div>""" `go` tabIndexMinus1 (div_ <@ "x")
+    >
+    > """<div tabindex="1">x</div>""" `go` div_ `tabIndex` 1 <@ "x"
+    
+    ==== accessKey
+    #accesskey#
+    
+    Access keys are global too.
+    
+    > """<div accesskey="a">x</div>""" `go` div_ `accessKey` 'a' <@ "x"
+    
     === Hello World
     #hello-world#
     
@@ -395,7 +433,7 @@
     > (e.g. html_ satisfies :root pseudo class)
     >
     > -}
-    > viewModel :: Model -> View Model Action
+    > viewModel :: Model -> View () () Model Action
     > viewModel () = toView . html_ . body_ $
     >   div_ =. c
     >   </ (div_ =. b
@@ -477,7 +515,7 @@
     , containers         < 1
     , css-parser         < 1
     , filepath           < 2
-    , miso               >= 1.11 && < 1.12
+    , miso               >= 1.14 && < 1.15
     , mtl                < 3
     , tagged             < 1
     , template-haskell   < 3
@@ -498,14 +536,18 @@
     Miso.Css.Test.QqAsserts
     Miso.Css.Test.Style
     Miso.Css.Test.StyleMock
+    Miso.Css.Test.Th.AccessKey
     Miso.Css.Test.Th.AmoreBmoreC
     Miso.Css.Test.Th.AplusBplusC
+    Miso.Css.Test.Th.Aria
     Miso.Css.Test.Th.DivPlusPtildeSpanMoreAplusB
     Miso.Css.Test.Th.DotAdotB
+    Miso.Css.Test.Th.For
     Miso.Css.Test.Th.ForkBranchOnJnMatchAfterNol
     Miso.Css.Test.Th.ForkBranchSibling
     Miso.Css.Test.Th.PmoreXplusYplusZmoreAspaceBmoreC
     Miso.Css.Test.Th.RootMoreA
+    Miso.Css.Test.Th.TabIndex
     Discovery
   hs-source-dirs:
     test
diff --git a/src/Miso/Css/Event.hs b/src/Miso/Css/Event.hs
--- a/src/Miso/Css/Event.hs
+++ b/src/Miso/Css/Event.hs
@@ -5,38 +5,38 @@
 import Miso.Event as E
 import Miso.Css.Prelude
 
-class EventFactory ef a | ef -> a where
+class EventFactory ef m a | ef -> m a where
   eventName :: ef -> MisoString
-  mkActionAttribute :: ef -> Attribute a
+  mkActionAttribute :: ef -> Attribute m a
 
-data AtomicEvent a = AtomicEvent MisoString a deriving (Show, Eq, Ord)
+data AtomicEvent m a = AtomicEvent MisoString a deriving (Show, Eq, Ord)
 
-instance EventFactory (AtomicEvent a) a where
+instance EventFactory (AtomicEvent m a) m a where
   eventName (AtomicEvent e _) = e
   mkActionAttribute (AtomicEvent e a) =
-    E.on e emptyDecoder $ \() _ -> a
+    E.on e emptyDecoder $ \() _ _ -> a
 
-data VarEvent a = forall r. VarEvent MisoString (Decoder r) (r -> DOMRef -> a)
+data VarEvent m a = forall r. VarEvent MisoString (Decoder r) (r -> m -> DOMRef -> a)
 
-instance EventFactory (VarEvent a) a where
+instance EventFactory (VarEvent m a) m a where
   eventName (VarEvent en _ _) = en
   mkActionAttribute (VarEvent en decoder af) =
     on en decoder af
 
-onClick :: a -> AtomicEvent a
+onClick :: forall m a. a -> AtomicEvent m a
 onClick = AtomicEvent "click"
 
-onVar :: Decoder r -> MisoString -> (r -> a) -> VarEvent a
-onVar d n f = VarEvent n d (\a _ -> f a)
+onVar :: Decoder r -> MisoString -> (r -> a) -> VarEvent m a
+onVar d n f = VarEvent n d (\a _ _ -> f a)
 
-onInput :: (MisoString -> a) -> VarEvent a
+onInput :: forall m a. (MisoString -> a) -> VarEvent m a
 onInput = onVar valueDecoder "input"
 
-onChange :: (MisoString -> a) -> VarEvent a
+onChange :: forall m a. (MisoString -> a) -> VarEvent m a
 onChange = onVar valueDecoder "change"
 
-onKeyPress :: (KeyCode -> a) -> VarEvent a
+onKeyPress :: forall m a. (KeyCode -> a) -> VarEvent m a
 onKeyPress = onVar keycodeDecoder "keypress"
 
-onKeyUp :: (KeyCode -> a) -> VarEvent a
+onKeyUp :: (KeyCode -> a) -> VarEvent m a
 onKeyUp = onVar keycodeDecoder "keyup"
diff --git a/src/Miso/Css/List.hs b/src/Miso/Css/List.hs
--- a/src/Miso/Css/List.hs
+++ b/src/Miso/Css/List.hs
@@ -18,6 +18,20 @@
       (Just '( k, Append s t))
       (RemoveElem (h : s) k t)
 
+type family FilterOut x l where
+  FilterOut x '[] = '[]
+  FilterOut x (h:t) = If (x == h) (FilterOut x t) (h : FilterOut x t)
+
+type family CatMaybes l where
+  CatMaybes '[] = '[]
+  CatMaybes (Just h : t) = h : CatMaybes t
+  CatMaybes (Nothing : t) = CatMaybes t
+
+type family Diff l1 l2 where
+  Diff l1 '[] = l1
+  Diff '[] _ = '[]
+  Diff t1 (h2:t2) = Diff (FilterOut h2 t1) t2
+
 type family PrependMb mb l where
   PrependMb Nothing l = l
   PrependMb (Just x) l = x : l
@@ -33,6 +47,20 @@
     If (Elem ah b)
       (Left ah)
       (MergeUniq at b (ah : s))
+
+type family MergeDedup a b s where
+  MergeDedup '[] b s = Append b s
+  MergeDedup (ah : at) b s =
+    If (Elem ah b)
+      (MergeDedup at b s)
+      (MergeDedup at b (ah : s))
+
+type family FindDuplicates s where
+  FindDuplicates '[] = '[]
+  FindDuplicates (ah : at) =
+    If (Elem ah at)
+      (ah : FindDuplicates at)
+      (FindDuplicates at)
 
 type family IsSubSetCase rer t where
   IsSubSetCase Nothing         _t = False
diff --git a/src/Miso/Css/Miso.hs b/src/Miso/Css/Miso.hs
--- a/src/Miso/Css/Miso.hs
+++ b/src/Miso/Css/Miso.hs
@@ -1,5 +1,6 @@
 module Miso.Css.Miso where
 
+import GHC.TypeLits (natVal, charVal)
 import Miso
     ( ms,
       vtext,
@@ -7,7 +8,7 @@
       MisoString,
       Attribute(Property, ClassList),
       View(VNode) )
-import Miso.JSON ( ToJSON(..) )
+import Miso.JSON ( ToJSON(..), Value(String) )
 import Miso.Html ( nodeHtml )
 import Miso.Html.Property (id_)
 import Miso.Css.Event ( EventFactory(mkActionAttribute) )
@@ -23,9 +24,12 @@
     ( MapMaybeFilterOutFullyMatchedHead )
 import Miso.Css.Prelude
 
-injectClass :: MisoString -> View model action -> View model action
+injectClass :: MisoString
+  -> View ctx props model action
+  -> View ctx props model action
 injectClass cn = \case
-  VNode ns tg atrs children -> VNode ns tg (injClass atrs) children
+  VNode ns tg atrs children dirEvents ->
+    VNode ns tg (injClass atrs) children dirEvents
   o -> o
   where
     injClass = \case
@@ -33,9 +37,12 @@
       ClassList cls : atrs' -> ClassList (cls <> [cn]) : atrs'
       o : atrs' -> o : injClass atrs'
 
-injectElementId :: MisoString -> View model action -> View model action
+injectElementId :: MisoString
+  -> View ctx props model action
+  -> View ctx props model action
 injectElementId ik = \case
-  VNode ns tg atrs children -> VNode ns tg (injId atrs) children
+  VNode ns tg atrs children dirEvents ->
+    VNode ns tg (injId atrs) children dirEvents
   o -> o
   where
     injId = \case
@@ -44,9 +51,14 @@
       Property "id" _v : atrs' -> id_ ik : atrs'
       o : atrs' -> o : injId atrs'
 
-injectElementAtr :: ToJSON v => MisoString -> v -> View model action -> View model action
+injectElementAtr :: ToJSON v
+  => MisoString
+  -> v
+  -> View ctx props model action
+  -> View ctx props model action
 injectElementAtr ik v = \case
-  VNode ns tg atrs children -> VNode ns tg (injId atrs) children
+  VNode ns tg atrs children dirEvents ->
+    VNode ns tg (injId atrs) children dirEvents
   o -> o
   where
     p = prop ik v
@@ -58,11 +70,37 @@
         | otherwise -> Property pn pnv : injId atrs'
       o : atrs' -> o : injId atrs'
 
-injectEventHandler :: EventFactory ef action =>
-  ef -> View model action -> View model action
+
+injAppElemAtr :: ToJSON v
+  => MisoString -> v
+  -> View ctx props model action
+  -> View ctx props model action
+injAppElemAtr ik v = \case
+  VNode ns tg atrs children dirEvents ->
+    VNode ns tg (injId atrs) children dirEvents
+  o -> o
+  where
+    p = prop ik v
+    injId = \case
+      [] -> [p]
+      Property pn (String pnv) : atrs'
+        | pn == ik ->
+          case toJSON v of
+            String vs -> Property pn (String $ pnv <> " " <> vs) : atrs'
+            o -> error $ "expected String but: " <> show o <> "; " <> show ik
+        | otherwise -> Property pn (String pnv) : injId atrs'
+      Property pn pnv : atrs'
+        | pn == ik -> Property pn (toJSON v) : atrs'
+        | otherwise -> Property pn pnv : injId atrs'
+      o : atrs' -> o : injId atrs'
+
+injectEventHandler :: EventFactory ef model action
+  => ef
+  -> View ctx props model action
+  -> View ctx props model action
 injectEventHandler ef = \case
-  VNode ns tg atrs children ->
-    VNode ns tg (mkActionAttribute ef : atrs) children
+  VNode ns tg atrs children dirEvents ->
+    VNode ns tg (mkActionAttribute ef : atrs) children dirEvents
   o -> o
 
 className :: forall p c. KnownSymbol c => OrClass p c -> MisoString
@@ -71,12 +109,15 @@
 
 data Child
 
-appChild :: Tagged Child (View model action) -> View model action -> View model action
+appChild :: Tagged Child (View ctx props model action)
+  -> View ctx props model action
+  -> View ctx props model action
 appChild (Tagged c) = \case
-  VNode ns tg atrs children -> VNode ns tg atrs $ children <> [c]
+  VNode ns tg atrs children dirEvents -> VNode ns tg atrs (children <> [c]) dirEvents
   o -> o
 
-eToView :: E model action en es r ei atrs knownIds cls eacs children -> View model action
+eToView :: E ctx props model action en es r ei atrs knownIds cls eacs children for tabx ak
+  -> View ctx props model action
 eToView = \case
   RawMisoView rmv -> rmv
   CDataE txt -> vtext txt
@@ -84,52 +125,70 @@
   IdE eni e -> injectElementId (ms $ symbolVal eni) (eToView e)
   AppClsE orCls e -> injectClass (className orCls) (eToView e)
   AppendChildE ce pe -> appChild (Tagged @Child (eToView ce)) (eToView pe)
+  TabIndexMinus1E e -> injectElementAtr "tabindex" ("-1" :: MisoString) (eToView e)
+  AccessKeyE nc e -> injectElementAtr "accesskey" (ms [charVal nc]) (eToView e)
+  TabIndexE ti e -> injectElementAtr "tabindex" (show $ natVal ti) (eToView e)
   AddAtrE a e -> injectElementAtr (elAtrKey a) (elAtrVal a) (eToView e)
+  AddForAtrE f e -> injectElementAtr "for" (ms $ symbolVal f) (eToView e)
+  AddAriaIdAtrE aria fi e -> injAppElemAtr (ms $ symbolVal aria) (ms $ symbolVal fi) (eToView e)
   BindEventE ef e -> injectEventHandler ef (eToView e)
   SealDomE e -> eToView e
   VirtualBodyE b -> eToView b
 
-toView :: forall m a en es r ei atrs kids cls ecs children.
+toView :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
   ( RemoveMatchScope (UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs)) ~ '[]
   , DuplicatedIds kids ~ '[]
-  ) =>
-  E m a en es r ei atrs kids cls ecs children -> View m a
+  , for ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ '[]
+  )
+  => E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak
+  -> View ctx prs m a
 toView = eToView
 
 -- | More detailed types that 'toView'
-toView' :: forall m a en es r ei atrs kids cls ecs children.
+toView' :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
   ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
   , DuplicatedIds kids ~ '[]
-  ) =>
-  E m a en es r ei atrs kids cls ecs children -> View m a
+  , for ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ '[]
+  )
+  => E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak
+  -> View ctx prs m a
 toView' = eToView
 
 body_ ::
-  E model action ce   cs        Nothing      ci atrs knownIds ccls ceacs cchildren ->
-  E model action BODY Composite Nothing Nothing atrs knownIds
-    '[] -- classes
+  E ctx props model action
+      ce   cs        Nothing      ci atrs knownIds ccls ceacs cchildren cfor tabx ak ->
+  E ctx props model action
+      BODY Composite Nothing Nothing atrs knownIds '[]
     (AppendChild
           '[]  -- pchildren
           ceacs
           '[ T BODY ]
           '[])
     '[ PrependMb (MbSymToMbI ci) (T ce : SymsToSubSeg ccls) ]
+    cfor tabx ak
 body_ = VirtualBodyE
 
 html_ ::
-  E model action ce   cs        Nothing      ci      catrs ckids ccls ceacs cchildren ->
-  E model action HTML Composite (Just 'Root) Nothing
-    catrs ckids
-    '[]
+  E ctx props model action
+      ce   cs        Nothing      ci      catrs ckids ccls ceacs cchildren cfor tabx ak ->
+  E ctx props model action
+      HTML Composite (Just 'Root) Nothing catrs ckids '[]
     (MapMaybeFilterOutFullyMatchedHead
       '[]
       (ApplyClass '[] (T HTML) (ApplyClass '[] R ceacs)))
     '[ PrependMb (MbSymToMbI ci) (T ce : SymsToSubSeg ccls) ]
+    cfor tabx ak
 html_ = SealDomE
 
 page ::
-  E model action ce   cs         Nothing      ci      catrs ckids ccls ceacs cchildren ->
-  E model action HTML Composite  (Just 'Root) Nothing catrs ckids '[]
+  E ctx props model action
+      ce   cs         Nothing      ci      catrs ckids ccls ceacs cchildren cfor tabx ak ->
+  E ctx props model action
+      HTML Composite  (Just 'Root) Nothing catrs ckids '[]
     (MapMaybeFilterOutFullyMatchedHead
      '[]
      (ApplyClass
@@ -142,4 +201,5 @@
           (ApplyClass '[] (T BODY) ceacs))
          '[]))))
     '[ '[T BODY]]
+    cfor tabx ak
 page x  = html_ (body_ x)
diff --git a/src/Miso/Css/Operator.hs b/src/Miso/Css/Operator.hs
--- a/src/Miso/Css/Operator.hs
+++ b/src/Miso/Css/Operator.hs
@@ -2,8 +2,11 @@
 {-# LANGUAGE UndecidableInstances #-}
 module Miso.Css.Operator where
 
+import Data.Char (Char)
+import GHC.TypeLits (Nat, KnownNat, KnownChar)
 import Miso ( View )
 import Miso.Css.Event ( EventFactory )
+import Miso.Css.List ( FilterOut, Append )
 import Miso.Css.Prelude ( Proxy(..), Maybe(Just, Nothing), KnownSymbol, type (~) )
 import Miso.Css.Segment ( SubSeg(A, T), ApplyClass )
 import Miso.Css.Style
@@ -11,11 +14,11 @@
 
 
 (=.) :: (KnownSymbol en, KnownSymbol c) =>
-  E model action en Composite r ei atrs kids cls eacs children ->
+  E ctx props model action en Composite r ei atrs kids cls eacs children cfor tabx ak ->
   OrClass p c ->
-  E model action en Composite r ei ("class" : atrs) kids (c:cls)
+  E ctx props model action en Composite r ei ("class" : atrs) kids (c:cls)
     (ConstraintsAfterClassApp ei en atrs cls p c eacs)
-    children
+    children cfor tabx ak
 e =. c = AppClsE c e
 
 infixl 3 =.
@@ -23,22 +26,69 @@
 atr :: forall k v. (KnownSymbol k, ToJSON v) => v -> ElAtr k v
 atr = ElAtr
 
-(=<|) :: (KnownSymbol k, ToJSON v) =>
-  E model action en Composite r ei atrs kids cls eacs children ->
+(=<|) :: (KnownSymbol k, ToJSON v, RegularAtr k ~ "") =>
+  E ctx props model action en Composite r ei atrs kids cls eacs children cfor tabx ak ->
   ElAtr k v ->
-  E model action en Composite r ei (k : atrs) kids cls
+  E ctx props model action en Composite r ei (k : atrs) kids cls
     (ApplyClass '[] (A k) eacs) -- eacs
-    children
+    children cfor tabx ak
 e =<| a = AddAtrE a e
 
 infixl 3 =<|
 
-(=#) :: forall model action en r catrs kids cls eacs children ee.
+for :: forall ctx props model action en r ei catrs kids cls eacs children ee cfor tabx ak.
   (KnownSymbol en, KnownSymbol ee) =>
-  E model action en Composite r Nothing catrs kids cls eacs children ->
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx ak ->
+  forall fi -> (fi ~ ElementId ee) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children
+  (AddForId ee cfor kids) tabx ak
+e `for` _ = AddForAtrE (Proxy @ee) e
+infixl 3 `for`
+
+tabIndex :: forall ctx props model action en r ei catrs kids cls eacs children cfor tabx ak.
+  (KnownSymbol en) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx ak ->
+  forall (ti :: Nat) -> KnownNat ti =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor (Just ti : tabx) ak
+e `tabIndex` _ = TabIndexE (Proxy ) e
+infixl 3 `tabIndex`
+
+accessKey :: forall ctx props model action en r ei catrs kids cls eacs children cfor tabx ak.
+  (KnownSymbol en) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx ak ->
+  forall (nc :: Char) -> KnownChar nc =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx (nc : ak)
+e `accessKey` _ = AccessKeyE Proxy e
+infixl 3 `accessKey`
+
+tabIndexMinus1 ::
+  E ctx props model action en Composite r ei atrs kids cls eacs children cfor tabx ak ->
+  E ctx props model action en Composite r ei atrs kids cls eacs children cfor (Nothing : tabx) ak
+tabIndexMinus1 e = TabIndexMinus1E e
+
+ariaLabelledBy :: forall ctx props model action en r ei catrs kids cls eacs children ee cfor tabx ak.
+  (KnownSymbol en, KnownSymbol ee) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx ak ->
+  forall fi -> (fi ~ ElementId ee) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children
+  (AddForId ee cfor kids) tabx ak
+e `ariaLabelledBy` _ = AddAriaIdAtrE (Proxy @"aria-labelledby") (Proxy @ee) e
+infixl 3 `ariaLabelledBy`
+
+ariaDescribedBy :: forall ctx props model action en r ei catrs kids cls eacs children ee cfor tabx ak.
+  (KnownSymbol en, KnownSymbol ee) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children cfor tabx ak ->
+  forall fi -> (fi ~ ElementId ee) =>
+  E ctx props model action en Composite r ei catrs kids cls eacs children
+  (AddForId ee cfor kids) tabx ak
+e `ariaDescribedBy` _ = AddAriaIdAtrE (Proxy @"aria-describedby") (Proxy @ee) e
+infixl 3 `ariaDescribedBy`
+
+(=#) :: forall ctx props model action en r catrs kids cls eacs children ee cfor tabx ak.
+  (KnownSymbol en, KnownSymbol ee) =>
+  E ctx props model action en Composite r Nothing catrs kids cls eacs children cfor tabx ak ->
   forall ei -> (ei ~ ElementId ee) =>
-  E model
-    action
+  E ctx props model action
     en
     Composite
     r
@@ -48,39 +98,41 @@
     cls
     (ConstraintsAfteId ee eacs)
     children
+    (FilterOut ee cfor)
+    tabx ak
 e =# _ = IdE (Proxy @ee) e
 
 infixl 3 =#
 
 (=!) ::
-  EventFactory ef action =>
-  E model action en es r ei atrs kids cls eacs children ->
+  EventFactory ef model action =>
+  E ctx props model action en es r ei atrs kids cls eacs children cfor tabx ak ->
   ef ->
-  E model action en es r ei atrs kids cls eacs children
+  E ctx props model action en es r ei atrs kids cls eacs children cfor tabx ak
 e =! ef = BindEventE ef e
 
 infixl 3 =!
 
 (</) ::
   KnownSymbol cen =>
-  E model action pen Composite r       pi patrs pKids pcls peacs pchildren ->
-  E model action cen cs        Nothing ci catrs cKids ccls ceacs cchildren ->
-  E model action pen Composite r       pi patrs
+  E ctx props model action pen Composite r       pi patrs pKids pcls peacs pchildren pfor ptabx pak ->
+  E ctx props model action cen cs        Nothing ci catrs cKids ccls ceacs cchildren cfor ctabx cak ->
+  E ctx props model action pen Composite r       pi patrs
     (MergeKids cKids pKids)
     pcls
     (ConstraintsAfterAppend pchildren ceacs pi pen patrs pcls peacs)
     (ChildrenConstrAfterAppend ci cen ccls pchildren)
-
+    (MergeFors pKids cKids pfor cfor)
+    (Append ptabx ctabx)
+    (Append pak cak)
 p </ c = AppendChildE c p
 
 infixl 2 </
 
 (<@) ::
-  E model action pen Composite r pi patrs kids pcls peacs pchildren ->
-  E model action CD Atomic Nothing Nothing '[] EmptyKids '[] '[] '[] ->
-  E
-    model
-    action
+  E ctx props model action pen Composite r pi patrs kids pcls peacs pchildren pfor tabx ak ->
+  E ctx props model action CD Atomic Nothing Nothing '[] EmptyKids '[] '[] '[] '[] '[] '[] ->
+  E ctx props model action
     pen
     Composite
     r
@@ -90,16 +142,17 @@
     pcls
     (ConstraintsAfterAppend pchildren '[] pi pen patrs pcls peacs)
     (ChildrenConstrAfterAppend Nothing CD '[] pchildren)
+    (MergeFors kids EmptyKids pfor '[])
+    (Append tabx '[])
+    (Append ak '[])
 (<@) = (</)
 
 infixl 2 <@
 
 (=<) ::
-  E model action pen Composite r pi atrs kids pcls peacs pchildren ->
-  View model action ->
-  E
-    model
-    action
+  E ctx props model action pen Composite r pi atrs kids pcls peacs pchildren pfor tabx ak ->
+  View ctx props model action ->
+  E ctx props model action
     pen
     Composite
     r
@@ -109,6 +162,9 @@
     pcls
     (ConstraintsAfterAppend pchildren '[] pi pen atrs pcls peacs)
     ('[T RMV] : pchildren)
+    (MergeFors kids EmptyKids pfor '[])
+    (Append tabx '[])
+    (Append ak '[])
 p =< rmv = p </ RawMisoView rmv
 
 infixl 2 =<
diff --git a/src/Miso/Css/Style/E.hs b/src/Miso/Css/Style/E.hs
--- a/src/Miso/Css/Style/E.hs
+++ b/src/Miso/Css/Style/E.hs
@@ -4,11 +4,14 @@
 
 module Miso.Css.Style.E where
 
+
 import Data.String ( IsString(..) )
 import Data.Type.Bool ( If )
+import GHC.TypeLits (Natural, KnownNat, AppendSymbol, KnownChar)
 import Miso ( MisoString, ms, View )
 import Miso.Css.Event (EventFactory)
-import Miso.Css.List ( MergeUniq, Elem, PrependMb, Append )
+import Miso.Css.List ( MergeUniq, Elem, PrependMb, Append, Diff, FilterOut
+                     , MergeDedup, FindDuplicates, CatMaybes )
 import Miso.Css.Prelude
 import Miso.Css.Segment
     ( ApplyClass,
@@ -23,6 +26,7 @@
 import Miso.JSON ( ToJSON )
 
 data ElementId (ei :: Symbol)
+data TabIdx (ei :: Natural)
 
 newtype ElAtr k v = ElAtr v deriving newtype (Eq, Ord, Show, ToJSON) deriving (Generic)
 
@@ -61,6 +65,18 @@
       (KnownIds (DuplicatedId x : dids) kids)
       (KnownIds dids (x : kids))
 
+type family AddForId fi for kids where
+  AddForId fi for (KnownIds _dids kids) =
+    If (Elem fi kids)
+       for
+       (If (Elem fi for)
+           for
+           (fi : for))
+
+type family MergeFors pkids ckids pfors cfors where
+  MergeFors (KnownIds _ pkids) (KnownIds _ ckids) pfors cfors =
+    (Diff (Diff (MergeDedup pfors cfors '[]) pkids) ckids)
+
 type family MergeKidsCase r didsA didsB kidsA kidsB where
   MergeKidsCase (Left e) didsA didsB kidsA kidsB =
     KnownIds
@@ -75,6 +91,11 @@
   MergeKids (KnownIds didsA kidsA) (KnownIds didsB kidsB) =
     MergeKidsCase (MergeUniq kidsA kidsB '[]) didsA didsB kidsA kidsB
 
+type family TabIndexesConsistent tis where
+ TabIndexesConsistent tis = FindDuplicates (FilterOut 0 (CatMaybes tis))
+type family AccessKeyConsistent aks where
+  AccessKeyConsistent aks = FindDuplicates aks
+
 type EmptyKids = KnownIds '[] '[]
 
 type CD = "CDATA"
@@ -115,9 +136,24 @@
 type family ConstraintsAfteId ei eacs where
   ConstraintsAfteId ei eacs = ApplyClass '[] (A "id") (ApplyClass '[] (I ei) eacs)
 
+type family AttributeIsReserved a f where
+  AttributeIsReserved a f =
+    "Tag attribue [" `AppendSymbol` a `AppendSymbol` "] is reserved - use ("
+      `AppendSymbol` f `AppendSymbol` ") function for it"
+
+type family RegularAtr a where
+  RegularAtr "id" = AttributeIsReserved "id" "=#"
+  RegularAtr "for" = AttributeIsReserved "for" "`for`"
+  RegularAtr "tabindex" =
+    AttributeIsReserved "tabindex" "`tabIndex`"
+  RegularAtr "aria-labelledby" =
+    AttributeIsReserved "aria-labelledby" "`ariaLabelledBy`"
+  RegularAtr "aria-discribedby" =
+    AttributeIsReserved "aria-discribedby" "`ariaDiscribedBy`"
+  RegularAtr a = ""
+
 data E
-     model
-     action
+     ctx props model action
      (en :: Symbol)
      (es :: ElementStructure)
      (re :: Maybe Root)
@@ -127,54 +163,85 @@
      (cls :: [Symbol])
      (l :: [[BRANCH]])
      (children :: [[SubSeg]])
+     (wantedIds :: [Symbol])
+     (usedTabIndexes :: [Maybe Natural])
+     (usedAccessKey :: [Char])
   where
     RawMisoView ::
-      View model action ->
-      E model action RMV Atomic Nothing Nothing '[] EmptyKids '[] '[] '[]
+      View ctx props model action ->
+      E ctx props model action RMV Atomic Nothing Nothing '[] EmptyKids '[] '[] '[] '[] '[] '[]
     CDataE ::
       MisoString ->
-      E model action CD Atomic Nothing Nothing '[] EmptyKids '[] '[] '[]
+      E ctx props model action CD Atomic Nothing Nothing '[] EmptyKids '[] '[] '[] '[] '[] '[]
     NilE :: KnownSymbol en =>
       Proxy en ->
-      E model action en Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
-    AddAtrE :: (KnownSymbol k, ToJSON v) =>
+      E ctx props model action en Composite Nothing Nothing '[] EmptyKids '[] '[] '[] '[] '[] '[]
+    AddAtrE :: (KnownSymbol k, ToJSON v, RegularAtr k ~ "") =>
       ElAtr k v ->
-      E model action en Composite r ei atrs kids cls eacs children ->
-      E model action en Composite r ei (k : atrs) kids cls
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei (k : atrs) kids cls
         (ApplyClass '[] (A k) eacs)
         children
+        for tabx ak
+    AddAriaIdAtrE :: (KnownSymbol a, KnownSymbol fi) =>
+      Proxy a ->
+      Proxy fi ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children
+      (AddForId fi for kids) tabx ak
+    AddForAtrE :: KnownSymbol fi =>
+      Proxy fi ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children
+      (AddForId fi for kids) tabx ak
+    AccessKeyE :: KnownChar nc =>
+      Proxy nc ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx (nc : ak)
+    TabIndexE :: KnownNat ti =>
+      Proxy ti ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for (Just ti : tabx) ak
+    TabIndexMinus1E ::
+      E ctx props model action en Composite r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei atrs kids cls eacs children for (Nothing : tabx) ak
     IdE :: KnownSymbol ei =>
       Proxy ei ->
-      E model action en Composite r Nothing atrs kids cls eacs children ->
-      E model action en Composite r (Just ei) ("id" : atrs)
+      E ctx props model action en Composite r Nothing atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en Composite r (Just ei) ("id" : atrs)
         (AddTagId ei kids)
         cls
         (ConstraintsAfteId ei eacs)
         children
-    BindEventE :: EventFactory ef action =>
+        (FilterOut ei for)
+        tabx ak
+    BindEventE :: EventFactory ef model action =>
       ef ->
-      E model action en es r ei atrs kids cls eacs children ->
-      E model action en es r ei atrs kids cls eacs children
+      E ctx props model action en es r ei atrs kids cls eacs children for tabx ak ->
+      E ctx props model action en es r ei atrs kids cls eacs children for tabx ak
     AppClsE :: (KnownSymbol en, KnownSymbol c) =>
       OrClass p c ->
-      E model action en Composite r ei atrs kIds cls eacs children ->
-      E model action en Composite r ei ("class" : atrs) kIds (c : cls)
+      E ctx props model action en Composite r ei atrs kIds cls eacs children for tabx ak ->
+      E ctx props model action en Composite r ei ("class" : atrs) kIds (c : cls)
         (ConstraintsAfterClassApp ei en atrs cls p c eacs)
-        children
+        children for tabx ak
     AppendChildE :: KnownSymbol ce =>
-      E model action ce cs Nothing ci cAtrs ckIds ccls ceacs cchildren ->
-      E model action pe Composite r pi pAtrs pkIds pcls peacs pchildren ->
-      E model action pe Composite r pi pAtrs
+      E ctx props model action ce cs Nothing ci cAtrs ckIds ccls ceacs cchildren cfor ctabx cak ->
+      E ctx props model action pe Composite r pi pAtrs pkIds pcls peacs pchildren pfor ptabx pak ->
+      E ctx props model action pe Composite r pi pAtrs
       (MergeKids ckIds pkIds)
       pcls
       (ConstraintsAfterAppend pchildren ceacs pi pe pAtrs pcls peacs)
       (ChildrenConstrAfterAppend ci ce ccls pchildren)
+      (MergeFors pkIds ckIds pfor cfor)
+      (Append ptabx ctabx)
+      (Append pak cak)
     -- Miso can render view up to body to support :root the library provide
     -- VirtualBodyE and SealDomE to emulate top DOM elements (body and html) without
     -- generating them because the already exist
     VirtualBodyE ::
-      E model action ce cs Nothing ci catrs ckids ccls ceacs cchildren ->
-      E model action BODY Composite Nothing Nothing catrs
+      E ctx props model action ce cs Nothing ci catrs ckids ccls ceacs cchildren for tabx ak ->
+      E ctx props model action BODY Composite Nothing Nothing catrs
         ckids
         '[]
         (AppendChild
@@ -183,15 +250,18 @@
           '[ T BODY ]
           '[])
         '[ PrependMb (MbSymToMbI ci) (T ce : SymsToSubSeg ccls) ]
+        for tabx ak
     SealDomE ::
-      E model action ce   cs        Nothing      ci      catrs ckids ccls ceacs cchildren ->
-      E model action HTML Composite (Just 'Root) Nothing catrs
-        ckids
-        '[]
+      E ctx props model action
+          ce   cs        Nothing      ci      catrs ckids ccls ceacs cchildren for tabx ak ->
+      E ctx props model action
+          HTML Composite (Just 'Root) Nothing catrs ckids '[]
         (Post.MapMaybeFilterOutFullyMatchedHead
           '[]
           (ApplyClass '[] (T HTML) (ApplyClass '[] R ceacs)))
         '[ PrependMb (MbSymToMbI ci) (T ce : SymsToSubSeg ccls) ]
+        for tabx ak
 
-instance IsString (E model action CD Atomic Nothing Nothing '[] EmptyKids '[] '[] '[]) where
+instance IsString (E ctx props model action CD Atomic Nothing Nothing '[] EmptyKids
+                   '[] '[] '[] '[] '[] '[]) where
   fromString = CDataE . ms
diff --git a/src/Miso/Css/Tags.hs b/src/Miso/Css/Tags.hs
--- a/src/Miso/Css/Tags.hs
+++ b/src/Miso/Css/Tags.hs
@@ -1,94 +1,99 @@
+{-# LANGUAGE TypeFamilies #-}
 module Miso.Css.Tags where
 
 import Miso.Css.Prelude ( Maybe(Nothing), Proxy(Proxy) )
 import Miso.Css.Style ( E(NilE), ElementStructure(Composite), EmptyKids )
 
-div_ :: E model action "div" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+type family Help ctx props model action tag where
+  Help ctx props model action tag =
+    E ctx props model action tag Composite Nothing Nothing '[] EmptyKids '[] '[] '[] '[] '[] '[]
+
+div_ :: Help ctx props model action "div"
 div_ = NilE (Proxy @"div")
 
-span_ :: E model action "span" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+span_ :: Help ctx props model action "span"
 span_ = NilE (Proxy @"span")
 
-p_ :: E model action "p" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+p_ :: Help ctx props model action "p"
 p_ = NilE (Proxy @"p")
 
-b_ :: E model action "b" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+b_ :: Help ctx props model action "b"
 b_ = NilE (Proxy @"b")
 
-i_ :: E model action "i" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+i_ :: Help ctx props model action "i"
 i_ = NilE (Proxy @"i")
 
-th_ :: E model action "th" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+th_ :: Help ctx props model action "th"
 th_ = NilE (Proxy @"th")
 
-td_ :: E model action "td" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+td_ :: Help ctx props model action "td"
 td_ = NilE (Proxy @"td")
 
-table_ :: E model action "table" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+table_ :: Help ctx props model action "table"
 table_ = NilE (Proxy @"table")
 
-thead_ :: E model action "thead" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+thead_ :: Help ctx props model action "thead"
 thead_ = NilE (Proxy @"thead")
 
-tbody_ :: E model action "tbody" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+tbody_ :: Help ctx props model action "tbody"
 tbody_ = NilE (Proxy @"tbody")
 
-tr_ :: E model action "tr" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+tr_ :: Help ctx props model action "tr"
 tr_ = NilE (Proxy @"tr")
 
-h1_ :: E model action "h1" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h1_ :: Help ctx props model action "h1"
 h1_ = NilE (Proxy @"h1")
 
-img_ :: E model action "img" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+img_ :: Help ctx props model action "img"
 img_ = NilE (Proxy @"img")
 
-br_ :: E model action "br" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+br_ :: Help ctx props model action "br"
 br_ = NilE (Proxy @"br")
 
-hr_ :: E model action "hr" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+hr_ :: Help ctx props model action "hr"
 hr_ = NilE (Proxy @"hr")
 
-ul_ :: E model action "ul" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+ul_ :: Help ctx props model action "ul"
 ul_ = NilE (Proxy @"ul")
 
-ol_ :: E model action "ol" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+ol_ :: Help ctx props model action "ol"
 ol_ = NilE (Proxy @"ol")
 
-li_ :: E model action "li" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+li_ :: Help ctx props model action "li"
 li_ = NilE (Proxy @"li")
 
-a_ :: E model action "a" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+a_ :: Help ctx props model action "a"
 a_ = NilE (Proxy @"a")
 
-article_ :: E model action "article" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+article_ :: Help ctx props model action "article"
 article_ = NilE (Proxy @"article")
 
-section_ :: E model action "section" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+section_ :: Help ctx props model action "section"
 section_ = NilE (Proxy @"section")
 
-h2_ :: E model action "h2" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h2_ :: Help ctx props model action "h2"
 h2_ = NilE (Proxy @"h2")
 
-h3_ :: E model action "h3" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h3_ :: Help ctx props model action "h3"
 h3_ = NilE (Proxy @"h3")
 
-h4_ :: E model action "h4" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h4_ :: Help ctx props model action "h4"
 h4_ = NilE (Proxy @"h4")
 
-h5_ :: E model action "h5" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h5_ :: Help ctx props model action "h5"
 h5_ = NilE (Proxy @"h5")
 
-h6_ :: E model action "h6" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+h6_ :: Help ctx props model action "h6"
 h6_ = NilE (Proxy @"h6")
 
-form_ :: E model action "form" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+form_ :: Help ctx props model action "form"
 form_ = NilE (Proxy @"form")
 
-input_ :: E model action "input" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+input_ :: Help ctx props model action "input"
 input_ = NilE (Proxy @"input")
 
-button_ :: E model action "button" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+button_ :: Help ctx props model action "button"
 button_ = NilE (Proxy @"button")
 
-label_ :: E model action "label" Composite Nothing Nothing '[] EmptyKids '[] '[] '[]
+label_ :: Help ctx props model action "label"
 label_ = NilE (Proxy @"label")
diff --git a/test/Miso/Css/Test/BindEventHandlers.hs b/test/Miso/Css/Test/BindEventHandlers.hs
--- a/test/Miso/Css/Test/BindEventHandlers.hs
+++ b/test/Miso/Css/Test/BindEventHandlers.hs
@@ -4,8 +4,8 @@
 
 
 test_t = testGroup "bind event handlers"
-  [ """<div ></div>""" `go` div_ =! onClick ()
-  , """<button ></button>""" `go` button_ =! onKeyPress (const ())
+  [ """<div ></div>""" `go` div_ =! onClick @() ()
+  , """<button ></button>""" `go` button_ =! onKeyPress @() (const ())
   , """<input  name="comment"/>""" `go`
-    input_ =! onChange (const ()) =<| atr @"name" ("comment" :: MisoString)
+    input_ =! onChange @() (const ()) =<| atr @"name" ("comment" :: MisoString)
   ]
diff --git a/test/Miso/Css/Test/HelloWorld.hs b/test/Miso/Css/Test/HelloWorld.hs
--- a/test/Miso/Css/Test/HelloWorld.hs
+++ b/test/Miso/Css/Test/HelloWorld.hs
@@ -35,8 +35,8 @@
       </div>
     </div>
 -}
-viewModel :: Model -> () -> View Model Action
-viewModel () () = toView . html_ . body_ $
+viewModel :: () -> View () () Model Action
+viewModel () = toView . html_ . body_ $
   div_ =. a
   </ (div_ =. b
        </ (button_ =. c
diff --git a/test/Miso/Css/Test/StyleMock.hs b/test/Miso/Css/Test/StyleMock.hs
--- a/test/Miso/Css/Test/StyleMock.hs
+++ b/test/Miso/Css/Test/StyleMock.hs
@@ -10,38 +10,106 @@
 import Data.ByteString.Char8 qualified as C8
 import Miso.Css.Style.PostAppend as Post
 import Miso.Css.Test.Prelude as X
+import Miso.Html.Render (toHtmlWith)
 
-domLbs :: forall m a en es r ei atrs kids cls ecs children.
+domLbs :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
   ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
   , DuplicatedIds kids ~ '[]
+  , for ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ '[]
+  , ctx ~ ()
+  , prs ~ ()
+  , m ~ ()
   ) =>
-  E m a en es r ei atrs kids cls ecs children ->
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
   L.ByteString
-domLbs = toHtml . toView
+domLbs = toHtmlWith () () () . toView
 
-doNotTcNoBr :: forall m a en es r ei atrs kids cls ecs children.
+doNotTcNoBr :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
   forall exDids -> (DuplicatedIds kids ~ exDids) =>
-  forall exEcs -> (UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ exEcs) =>
-  E m a en es r ei atrs kids cls ecs children ->
+  forall exEcs -> (UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ exEcs
+                  , TabIndexesConsistent tabx ~ '[]
+                  , AccessKeyConsistent ak ~ '[]
+                  , ctx ~ ()
+                  , prs ~ ()
+                  , for ~ '[]) =>
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
   TestTree
 doNotTcNoBr _ _ _ =
   testCase "see type message from the checker" do
     () @?= ()
 
-doNotTc :: forall m a en es r ei atrs kids cls ecs children.
+doNotTc :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
   forall exDids -> (DuplicatedIds kids ~ exDids) =>
-  forall exEcs -> (MapMaybeFilterOutFullyMatchedHead '[] ecs ~ exEcs) =>
-  E m a en es r ei atrs kids cls ecs children ->
+  forall exEcs -> (MapMaybeFilterOutFullyMatchedHead '[] ecs ~ exEcs
+                  , TabIndexesConsistent tabx ~ '[]
+                  , AccessKeyConsistent ak ~ '[]
+                  , ctx ~ ()
+                  , prs ~ ()
+                  , for ~ '[]) =>
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
   TestTree
 doNotTc _ _ _ =
   testCase "see type message from the checker" do
     () @?= ()
 
-go :: forall m a en es r ei atrs kids cls ecs children.
+ariaDoNotTc :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
+  forall exFors ->
   ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
   , DuplicatedIds kids ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ '[]
+  , ctx ~ ()
+  , prs ~ ()
+  , for ~ exFors) =>
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
+  TestTree
+ariaDoNotTc _ _ =
+  testCase "see type message from the checker" do
+    () @?= ()
+
+tabIdxDoNotTc :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
+  forall ex ->
+  ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
+  , DuplicatedIds kids ~ '[]
+  , TabIndexesConsistent tabx ~ ex
+  , AccessKeyConsistent ak ~ '[]
+  , ctx ~ ()
+  , prs ~ ()
+  , for ~ '[]) =>
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
+  TestTree
+tabIdxDoNotTc _ _ =
+  testCase "see type message from the checker" do
+    () @?= ()
+
+accessKeyDoNotTc :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
+  forall ex ->
+  ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
+  , DuplicatedIds kids ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ ex
+  , ctx ~ ()
+  , prs ~ ()
+  , for ~ '[]) =>
+  E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak ->
+  TestTree
+accessKeyDoNotTc _ _ =
+  testCase "see type message from the checker" do
+    () @?= ()
+
+go :: forall ctx prs m a en es r ei atrs kids cls ecs children for tabx ak.
+  ( UnwrapBranches (MapMaybeFilterOutFullyMatchedHead '[] ecs) ~ '[]
+  , DuplicatedIds kids ~ '[]
+  , for ~ '[]
+  , TabIndexesConsistent tabx ~ '[]
+  , AccessKeyConsistent ak ~ '[]
+  , ctx ~ ()
+  , prs ~ ()
+  , m ~ ()
   ) =>
-  L.ByteString -> E m a en es r ei atrs kids cls ecs children -> TestTree
+  L.ByteString -> E ctx prs m a en es r ei atrs kids cls ecs children for tabx ak -> TestTree
 go ex el =
   testCase (C8.unpack $ C8.toStrict ex) do
     domLbs el @?= ex
diff --git a/test/Miso/Css/Test/Th/AccessKey.hs b/test/Miso/Css/Test/Th/AccessKey.hs
new file mode 100644
--- /dev/null
+++ b/test/Miso/Css/Test/Th/AccessKey.hs
@@ -0,0 +1,13 @@
+module Miso.Css.Test.Th.AccessKey where
+
+import Miso.Css.Test.StyleMock
+
+test_t = testGroup "accesskey"
+  [ """<div accesskey="a">x</div>""" `go`
+    div_ `accessKey` 'a' <@ "x"
+  , """<div accesskey="a"><div accesskey="b">x</div></div>""" `go`
+    div_ `accessKey` 'a' </ (div_ `accessKey` 'b' <@ "x")
+  , """<div accesskey="a"><div accesskey="A">x</div></div>""" `go`
+    div_ `accessKey` 'a' </ (div_ `accessKey` 'A' <@ "x")
+  , accessKeyDoNotTc ['a'] $ div_ `accessKey` 'a' </ (div_ `accessKey` 'a' <@ "x")
+  ]
diff --git a/test/Miso/Css/Test/Th/Aria.hs b/test/Miso/Css/Test/Th/Aria.hs
new file mode 100644
--- /dev/null
+++ b/test/Miso/Css/Test/Th/Aria.hs
@@ -0,0 +1,27 @@
+module Miso.Css.Test.Th.Aria where
+
+import Miso.Css.Test.StyleMock
+
+[css|
+#aa {}
+#bb {}
+|]
+
+test_t = testGroup cssAsLiteralText
+  [ """<div><span id="aa">hello</span><input aria-labelledby="aa"/></div>""" `go`
+    div_ </ (span_ =# Aa <@ "hello") </ input_ `ariaLabelledBy` Aa
+  , ariaDoNotTc ["aa"] $
+    div_ </ (span_ <@ "hello") </ input_ `ariaLabelledBy` Aa
+  , """<div><span id="aa">hello</span><input aria-describedby="aa"/></div>""" `go`
+    div_ </ (span_ =# Aa <@ "hello") </ input_ `ariaDescribedBy` Aa
+  , ariaDoNotTc ["aa"] $
+    div_ </ (span_ <@ "hello") </ input_ `ariaDescribedBy` Aa
+  , """<div><span id="aa">hi</span><span id="bb">bye</span><input aria-describedby="aa bb"/></div>"""
+    `go`
+    div_ </ (span_ =# Aa <@ "hi") </ (span_ =# Bb <@ "bye")
+      </ input_ `ariaDescribedBy` Aa `ariaDescribedBy` Bb
+  , ariaDoNotTc ["bb"] $
+    div_ </ (span_ =# Aa <@ "hi") </ input_ `ariaDescribedBy` Aa `ariaDescribedBy` Bb
+  , ariaDoNotTc ["aa"] $
+    div_ </ (span_ =# Bb <@ "bye") </ input_ `ariaDescribedBy` Aa `ariaDescribedBy` Bb
+  ]
diff --git a/test/Miso/Css/Test/Th/For.hs b/test/Miso/Css/Test/Th/For.hs
new file mode 100644
--- /dev/null
+++ b/test/Miso/Css/Test/Th/For.hs
@@ -0,0 +1,21 @@
+module Miso.Css.Test.Th.For where
+
+import Miso.Css.Test.StyleMock
+
+[css|
+#xx {}
+|]
+
+test_t = testGroup cssAsLiteralText
+  [ """<div><label for="a">l</label><input id="a"/></div>""" `go`
+    div_ </ ((label_ `for` Ai) <@ "l") </ input_ =# Ai
+  , """<div><label for="xx">l</label><input id="xx"/></div>""" `go`
+    div_ </ (label_ {-=<| atr @"for" 3-} `for` Xx <@ "l") </ input_ =# Xx
+  , """<label for="xx">l<input id="xx"/></label>""" `go`
+    label_ `for` Xx <@ "l" </ input_ =# Xx
+  , ariaDoNotTc ["xx"] $ label_ `for` Xx <@ "l" </ input_ =# Ai
+  , """<button id="xx"><label for="xx">l</label></button>""" `go`
+    button_ =# Xx </ (label_ `for` Xx <@ "l")
+  , ariaDoNotTc ["xx"] $ button_ =# Ai </ (label_ `for` Xx <@ "l")
+  , ariaDoNotTc ["xx"] $ div_ </ (label_ `for` Xx <@ "l") </ input_
+  ]
diff --git a/test/Miso/Css/Test/Th/TabIndex.hs b/test/Miso/Css/Test/Th/TabIndex.hs
new file mode 100644
--- /dev/null
+++ b/test/Miso/Css/Test/Th/TabIndex.hs
@@ -0,0 +1,19 @@
+module Miso.Css.Test.Th.TabIndex where
+
+import Miso.Css.Test.StyleMock
+
+test_t = testGroup "tabindex"
+  [ """<div tabindex="-1">x</div>""" `go`
+    tabIndexMinus1 (div_ <@ "x")
+  , """<div tabindex="-1"><div tabindex="-1">x</div></div>""" `go`
+    tabIndexMinus1 (div_ </ tabIndexMinus1 (div_ <@ "x"))
+  , """<div tabindex="0">x</div>""" `go`
+    div_ `tabIndex` 0 <@ "x"
+  , """<div tabindex="0"><div tabindex="0">x</div></div>""" `go`
+    div_ `tabIndex` 0 </ (div_ `tabIndex` 0 <@ "x")
+  , """<div tabindex="1">x</div>""" `go`
+    div_ `tabIndex` 1 <@ "x"
+  , """<div tabindex="1"><div tabindex="2">x</div></div>""" `go`
+    div_ `tabIndex` 1 </ (div_ `tabIndex` 2 <@ "x")
+  , tabIdxDoNotTc [1] $ div_ `tabIndex` 1 </ (div_ `tabIndex` 1 <@ "x")
+  ]
