diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,25 @@
 # Revision history for reflex-dom-core
 
-## Unreleased
+## 0.5.3
+
+* Deprecate a number of old inflexible widget helpers in `Reflex.Dom.Widget.Basic`:
+
+   * `Link`
+   * `button`
+   * `dtdd`
+   * `linkClass`
+   * `link`
+   * `tabDisplay`
+   * `tableDynAttr`
+
+  And in `Reflex.Dom.Widget.Input`:
+
+   * `TextInput`
+   * `TextAreaConfig`
+   * `CheckboxConfig`
+   * `FileInput`
+
+ * Add `< 0.7` upper bound for reflex
 
 ## 0.5.2
 
diff --git a/reflex-dom-core.cabal b/reflex-dom-core.cabal
--- a/reflex-dom-core.cabal
+++ b/reflex-dom-core.cabal
@@ -1,5 +1,5 @@
 Name: reflex-dom-core
-Version: 0.5.2.0
+Version: 0.5.3
 Synopsis: Functional Reactive Web Apps with Reflex
 Description: Reflex-DOM is a Functional Reactive web framework based on the Reflex FRP engine
 License: BSD3
@@ -63,7 +63,7 @@
     directory >= 1.2 && < 1.4,
     exception-transformers == 0.4.*,
     ghcjs-dom >= 0.9.1.0 && < 0.10,
-    jsaddle >=0.9.0.0 && <0.10,
+    jsaddle >= 0.9.0.0 && < 0.10,
     -- keycode-0.2 has a bug on firefox
     keycode >= 0.2.1 && < 0.3,
     lens >= 4.7 && < 5,
@@ -72,7 +72,7 @@
     primitive >= 0.5 && < 0.7,
     random,
     ref-tf == 0.4.*,
-    reflex >= 0.6.2,
+    reflex >= 0.6.2 && < 0.7,
     semigroups >= 0.16 && < 0.19,
     stm >= 2.4 && < 2.6,
     text == 1.2.*,
diff --git a/src/Reflex/Dom/Widget/Basic.hs b/src/Reflex/Dom/Widget/Basic.hs
--- a/src/Reflex/Dom/Widget/Basic.hs
+++ b/src/Reflex/Dom/Widget/Basic.hs
@@ -138,6 +138,7 @@
 display :: (PostBuild t m, DomBuilder t m, Show a) => Dynamic t a -> m ()
 display = dynText . fmap (T.pack . show)
 
+{-# DEPRECATED button "Use 'elAttr'' in combination with 'domEvent' instead" #-}
 button :: DomBuilder t m => Text -> m (Event t ())
 button t = do
   (e, _) <- element "button" def $ text t
@@ -145,7 +146,9 @@
 
 --TODO: Should this be renamed to 'widgetView' for consistency with 'widgetHold'?
 -- | Given a Dynamic of widget-creating actions, create a widget that is recreated whenever the Dynamic updates.
---   The returned Event of widget results occurs when the Dynamic does.
+--   The returned Event occurs whenever the child widget is updated, which is
+--   at post-build in addition to the times at which the input Dynamic is
+--   updated, and its value is the result of running the widget.
 --   Note:  Often, the type @a@ is an 'Event', in which case the return value is an Event-of-Events that would typically be flattened (via 'switchHold').
 dyn :: (Adjustable t m, NotReady t m, PostBuild t m) => Dynamic t (m a) -> m (Event t a)
 dyn = networkView
@@ -269,45 +272,25 @@
         return $ if Map.null p then Nothing else Just p
   return modificationsNeeded
 
---------------------------------------------------------------------------------
--- Copied and pasted from Reflex.Widget.Class
---------------------------------------------------------------------------------
-
-{-
-schedulePostBuild x = performEvent_ . (x <$) =<< getPostBuild
-
-elDynHtml' :: DomBuilder t m => Text -> Dynamic t Text -> m (El t)
-elDynHtml' elementTag html = do
-  e <- buildEmptyElement elementTag (Map.empty :: Map Text Text)
-  schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
-  performEvent_ $ fmap (setInnerHTML e . Just) $ updated html
-  wrapElement defaultDomEventHandler e
-
-elDynHtmlAttr' :: DomBuilder t m => Text -> Map Text Text -> Dynamic t Text -> m (El t)
-elDynHtmlAttr' elementTag attrs html = do
-  e <- buildEmptyElement elementTag attrs
-  schedulePostBuild $ setInnerHTML e . Just =<< sample (current html)
-  performEvent_ $ fmap (setInnerHTML e . Just) $ updated html
-  wrapElement defaultDomEventHandler e
--}
-
+{-# DEPRECATED Link "Will be removed when 'linkClass' and 'link' are removed. Follow those functions' deprecation instructions." #-}
 newtype Link t
   = Link { _link_clicked :: Event t ()
          }
 
--- | >>> linkClass "Click here" "link-class"
--- > <a class="link-class">Click here</a>
+{-# DEPRECATED linkClass "Use 'elAttr'' in combination with 'domEvent' for just clicks. Use 'routeLink' for Obelisk navigation" #-}
 linkClass :: DomBuilder t m => Text -> Text -> m (Link t)
 linkClass s c = do
   (l,_) <- elAttr' "a" ("class" =: c) $ text s
   return $ Link $ domEvent Click l
 
+{-# DEPRECATED link "Use 'elAttr'' in combination with 'domEvent' for just clicks. Use 'routeLink' for Obelisk navigation" #-}
 link :: DomBuilder t m => Text -> m (Link t)
 link s = linkClass s ""
 
 divClass :: forall t m a. DomBuilder t m => Text -> m a -> m a
 divClass = elClass "div"
 
+{-# DEPRECATED dtdd "Use an application specific widget generating function" #-}
 dtdd :: forall t m a. DomBuilder t m => Text -> m a -> m a
 dtdd h w = do
   el "dt" $ text h
@@ -316,7 +299,9 @@
 blank :: forall m. Monad m => m ()
 blank = return ()
 
+-- TODO: Move to an example project.
 -- | A widget to display a table with static columns and dynamic rows.
+{-# DEPRECATED tableDynAttr "Use an application specific widget generating function" #-}
 tableDynAttr :: forall t m r k v. (Ord k, DomBuilder t m, MonadHold t m, PostBuild t m, MonadFix m)
   => Text                                   -- ^ Class applied to <table> element
   -> [(Text, k -> Dynamic t r -> m v)]      -- ^ Columns of (header, row key -> row value -> child widget)
@@ -332,9 +317,11 @@
           dAttrs <- rowAttrs k
           elDynAttr' "tr" dAttrs $ mapM (\x -> el "td" $ snd x k r) cols)
 
+-- TODO: Move to an example project.
 -- | A widget to construct a tabbed view that shows only one of its child widgets at a time.
 --   Creates a header bar containing a <ul> with one <li> per child; clicking a <li> displays
 --   the corresponding child and hides all others.
+{-# DEPRECATED tabDisplay "Use an application specific widget generating function" #-}
 tabDisplay :: forall t m k. (MonadFix m, DomBuilder t m, MonadHold t m, PostBuild t m, Ord k)
   => Text               -- ^ Class applied to <ul> element
   -> Text               -- ^ Class applied to currently active <li> element
diff --git a/src/Reflex/Dom/Widget/Input.hs b/src/Reflex/Dom/Widget/Input.hs
--- a/src/Reflex/Dom/Widget/Input.hs
+++ b/src/Reflex/Dom/Widget/Input.hs
@@ -54,6 +54,7 @@
 import qualified GHCJS.DOM.Event as Event
 import qualified GHCJS.DOM.HTMLInputElement as Input
 
+{-# DEPRECATED TextInput, _textInput_element, TextInputConfig, textInput "Use 'inputElement' directly" #-}
 data TextInput t
    = TextInput { _textInput_value :: Dynamic t Text
                , _textInput_input :: Event t Text
@@ -161,6 +162,7 @@
     , _rangeInput_element = _inputElement_raw i
     }
 
+{-# DEPRECATED TextAreaConfig, TextArea, textArea "Use 'textAreaElement' directly" #-}
 data TextAreaConfig t
    = TextAreaConfig { _textAreaConfig_initialValue :: Text
                     , _textAreaConfig_setValue :: Event t Text
@@ -198,6 +200,7 @@
     , _textArea_element = _textAreaElement_raw i
     }
 
+{-# DEPRECATED CheckboxConfig, Checkbox, checkbox, checkboxView, CheckboxViewEventResultType, regularToCheckboxViewEventType, CheckboxViewEventResult "Use 'inputElement' directly" #-}
 data CheckboxConfig t
     = CheckboxConfig { _checkboxConfig_setValue :: Event t Bool
                      , _checkboxConfig_attributes :: Dynamic t (Map Text Text)
@@ -287,7 +290,7 @@
 
 newtype CheckboxViewEventResult en = CheckboxViewEventResult { unCheckboxViewEventResult :: CheckboxViewEventResultType en }
 
---TODO
+-- | Create a view only checkbox
 {-# INLINABLE checkboxView #-}
 checkboxView :: forall t m. (DomBuilder t m, DomBuilderSpace m ~ GhcjsDomSpace, PostBuild t m, MonadHold t m) => Dynamic t (Map Text Text) -> Dynamic t Bool -> m (Event t Bool)
 checkboxView dAttrs dValue = do
@@ -321,6 +324,7 @@
   i <- inputElement inputElementConfig
   return $ unCheckboxViewEventResult <$> select (_element_events $ _inputElement_element i) (WrapArg Click)
 
+{-# DEPRECATED FileInput, FileInputConfig, fileInput "Use 'inputElement' directly" #-}
 data FileInput d t
    = FileInput { _fileInput_value :: Dynamic t [File]
                , _fileInput_element :: RawInputElement d
@@ -681,41 +685,3 @@
 instance HasValue (Checkbox t) where
   type Value (Checkbox t) = Dynamic t Bool
   value = _checkbox_value
-
-{-
-type family Controller sm t a where
-  Controller Edit t a = (a, Event t a) -- Initial value and setter
-  Controller View t a = Dynamic t a -- Value (always)
-
-type family Output sm t a where
-  Output Edit t a = Dynamic t a -- Value (always)
-  Output View t a = Event t a -- Requested changes
-
-data CheckboxConfig sm t
-   = CheckboxConfig { _checkbox_input :: Controller sm t Bool
-                    , _checkbox_attributes :: Attributes
-                    }
-
-instance Reflex t => Default (CheckboxConfig Edit t) where
-  def = CheckboxConfig (False, never) mempty
-
-data Checkbox sm t
-  = Checkbox { _checkbox_output :: Output sm t Bool
-             }
-
-data StateMode = Edit | View
-
---TODO: There must be a more generic way to get this witness and allow us to case on the type-level StateMode
-data StateModeWitness (sm :: StateMode) where
-  EditWitness :: StateModeWitness Edit
-  ViewWitness :: StateModeWitness View
-
-class HasStateModeWitness (sm :: StateMode) where
-  stateModeWitness :: StateModeWitness sm
-
-instance HasStateModeWitness Edit where
-  stateModeWitness = EditWitness
-
-instance HasStateModeWitness View where
-  stateModeWitness = ViewWitness
--}
