diff --git a/glazier-react-widget.cabal b/glazier-react-widget.cabal
--- a/glazier-react-widget.cabal
+++ b/glazier-react-widget.cabal
@@ -1,5 +1,5 @@
 name:                glazier-react-widget
-version:             0.5.0.0
+version:             0.6.0.0
 synopsis:            Generic widget library using glazier-react
 description:         Generic widget library using glazier-react
 homepage:            https://github.com/louispan/glazier-react-widget#readme
@@ -25,8 +25,8 @@
                      , dlist >= 0.8 && < 0.9
                      , free >= 4.12 && < 5
                      , glazier >= 0.10 && < 1
-                     , glazier-react >= 0.5 && < 1
-                     , javascript-extras >= 0.2.0.2 && < 1
+                     , glazier-react >= 0.6 && < 1
+                     , javascript-extras >= 0.3.0.0 && < 1
                      , lens >= 4 && < 5
                      , mmorph >= 1 && < 2
                      , mtl >= 2 && < 3
diff --git a/src/Glazier/React/Widgets/Input.hs b/src/Glazier/React/Widgets/Input.hs
--- a/src/Glazier/React/Widgets/Input.hs
+++ b/src/Glazier/React/Widgets/Input.hs
@@ -47,7 +47,7 @@
     = SetPropertyCommand JE.Property J.JSVal
 
 data Action
-    = SendCommandsAction [Command]
+    = SetPropertyAction JE.Property J.JSVal
     | SubmitAction J.JSString
     | InputRefAction J.JSVal
 
@@ -111,37 +111,36 @@
 window :: G.WindowT (R.Scene Model Plan) (R.ReactMlT Identity) ()
 window = do
     s <- ask
-    lift $ R.lf (s ^. component . to JE.toJS)
-        [ ("key",  s ^. key . to JE.toJS)
-        , ("render", s ^. onRender . to JE.toJS)
+    lift $ R.lf (s ^. component . to JE.toJS')
+        [ ("key",  s ^. key . to JE.toJS')
+        , ("render", s ^. onRender . to JE.toJS')
         ]
 
 -- | Internal rendering used by the React render callback
 render :: G.WindowT (R.Scene Model Plan) (R.ReactMlT Identity) ()
 render = do
     s <- ask
-    lift $ R.lf (JE.strJS "input")
-                    [ ("key", s ^. key . to JE.toJS)
-                    , ("className", s ^. className . to JE.toJS)
-                    , ("placeholder", s ^. placeholder . to JE.toJS)
-                    , ("autoFocus", JE.toJS True)
-                    , ("onKeyDown", s ^. onKeyDown . to JE.toJS)
-                    ]
+    lift $ R.lf "input"
+        [ ("key", s ^. key . to JE.toJS')
+        , ("className", s ^. className . to JE.toJS')
+        , ("placeholder", s ^. placeholder . to JE.toJS')
+        , ("autoFocus", JE.toJS' True)
+        , ("onKeyDown", s ^. onKeyDown . to JE.toJS')
+        ]
 
 whenKeyDown :: J.JSVal -> MaybeT IO (Maybe J.JSString, J.JSVal)
 whenKeyDown evt = do
-        evt' <- MaybeT $ JE.fromJS evt
-        evt'' <- MaybeT $ R.parseKeyboardEvent evt'
-        evt''' <- lift $ R.parseEvent $ evt'
-        -- target is the "input" DOM
-        input <- lift $ pure . JE.toJS . R.target $ evt'''
-        let k = R.keyCode evt''
+        sevt <- MaybeT $ pure $ JE.fromJS evt
+        kevt <- MaybeT $ pure $ R.parseKeyboardEvent sevt
+        let evt' = R.parseEvent sevt
+            k = R.keyCode kevt
+        input <- lift $ pure . JE.toJS . R.target $ evt'
         case k of
             -- FIXME: ESCAPE_KEY
             27 -> pure (Nothing, input)
             -- FIXME: ENTER_KEY
             13 -> do
-                v <- MaybeT $ JE.getProperty "value" input >>= JE.fromJS
+                v <- MaybeT $ JE.fromJS' <$> JE.getProperty "value" input
                 pure (Just v, input)
             _ -> empty
 
@@ -150,7 +149,7 @@
   where
     goLazy :: (Maybe J.JSString, J.JSVal) -> MaybeT IO [Action]
     goLazy (ms, j) = pure $
-        SendCommandsAction [SetPropertyCommand ("value", JE.toJS J.empty) j]
+        SetPropertyAction ("value", JE.toJS' J.empty) j
         : maybe [] (pure . SubmitAction) ms
 
 -- | State update logic.
@@ -161,7 +160,7 @@
 gadget = do
     a <- ask
     case a of
-        SendCommandsAction cmds -> pure $ D.fromList cmds
+        SetPropertyAction props j -> pure $ D.singleton $ SetPropertyCommand props j
 
         -- parent widgets should detect this case to do something with submitted action
         SubmitAction _ -> pure empty
diff --git a/src/Glazier/React/Widgets/List.hs b/src/Glazier/React/Widgets/List.hs
--- a/src/Glazier/React/Widgets/List.hs
+++ b/src/Glazier/React/Widgets/List.hs
@@ -146,11 +146,11 @@
 window :: G.WindowT (R.Scene (Model k itemWidget) Plan) (R.ReactMlT Identity) ()
 window = do
     s <- ask
-    lift $ R.lf (s ^. component . to JE.toJS)
-        [ ("key",  s ^. key . to JE.toJS)
-        , ("render", s ^. onRender . to JE.toJS)
-        , ("ref", s ^. onComponentRef . to JE.toJS)
-        , ("componentDidUpdate", s ^. onComponentDidUpdate . to JE.toJS)
+    lift $ R.lf (s ^. component . to JE.toJS')
+        [ ("key",  s ^. key . to JE.toJS')
+        , ("render", s ^. onRender . to JE.toJS')
+        , ("ref", s ^. onComponentRef . to JE.toJS')
+        , ("componentDidUpdate", s ^. onComponentDidUpdate . to JE.toJS')
         ]
 
 -- | Internal rendering used by the React render callback
@@ -161,9 +161,9 @@
 render separator itemWindow = do
     s <- ask
     xs <- fmap (view R.scene) . filter ((s ^. itemsFilter) . R.outline . view R.model) . fmap snd .  M.toList <$> view items
-    lift $ R.bh (JE.strJS "ul") [ ("key", s ^. key . to JE.toJS)
-                                 , ("className", s ^. className . to JE.toJS)
-                                 ] $ do
+    lift $ R.bh "ul" [ ("key", s ^. key . to JE.toJS')
+                     , ("className", s ^. className . to JE.toJS')
+                     ] $ do
         let itemsWindows = (view G._WindowT itemWindow) <$> xs
             separatedWindows = DL.intersperse separator itemsWindows
         sequenceA_ separatedWindows
