diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,13 @@
 # Revision history for reflex-dom-core
 
+## 0.8.1.0
+
+* Add functions for managing history (popHistoryState and manageHistoryExposingExternalUpdates)
+
+## 0.8.0.0-r1
+
+* Loosen lens version bounds
+
 ## 0.8.0.0
 
 * Support reflex 0.9
diff --git a/reflex-dom-core.cabal b/reflex-dom-core.cabal
--- a/reflex-dom-core.cabal
+++ b/reflex-dom-core.cabal
@@ -1,6 +1,6 @@
 cabal-version: 1.24
 Name: reflex-dom-core
-Version: 0.8.0.0
+Version: 0.8.1.0
 Synopsis: Functional Reactive Web Apps with Reflex
 Description:
   Web applications without callbacks or side-effects.
@@ -88,7 +88,7 @@
     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.1,
+    lens >= 4.7 && < 5.3,
     monad-control >= 1.0.1 && < 1.1,
     mtl >= 2.1 && < 2.3,
     primitive >= 0.5 && < 0.8,
diff --git a/src/Reflex/Dom/Builder/Class/Events.hs b/src/Reflex/Dom/Builder/Class/Events.hs
--- a/src/Reflex/Dom/Builder/Class/Events.hs
+++ b/src/Reflex/Dom/Builder/Class/Events.hs
@@ -11,8 +11,9 @@
 #ifdef USE_TEMPLATE_HASKELL
 import Data.GADT.Compare.TH
 #else
+import Data.Type.Equality ((:~:)(..))
 import Data.GADT.Compare
-       (GOrdering(..), (:~:)(..), GEq(..), GCompare(..))
+       (GOrdering(..), GEq(..), GCompare(..))
 #endif
 import Data.Text (Text)
 
diff --git a/src/Reflex/Dom/Location.hs b/src/Reflex/Dom/Location.hs
--- a/src/Reflex/Dom/Location.hs
+++ b/src/Reflex/Dom/Location.hs
@@ -13,10 +13,12 @@
   , getLocationUrl
   , manageHistory
   , manageHistory'
+  , manageHistoryExposingExternalUpdates
   , HistoryCommand (..)
   , HistoryStateUpdate (..)
   , HistoryItem (..)
   , getLocationUri
+  , popHistoryState
   ) where
 
 import Reflex
@@ -170,7 +172,15 @@
   -- ^ Don't do anything until this event has fired
   -> Event t HistoryCommand
   -> m (Dynamic t HistoryItem)
-manageHistory' switchover runCmd = do
+manageHistory' switchover runCmd = fst <$> manageHistoryExposingExternalUpdates switchover runCmd
+
+manageHistoryExposingExternalUpdates
+  :: (MonadFix m, MonadJSM m, TriggerEvent t m, MonadHold t m, PerformEvent t m, MonadJSM (Performable m))
+  => Event t ()
+  -- ^ Don't do anything until this event has fired
+  -> Event t HistoryCommand
+  -> m (Dynamic t HistoryItem, Event t HistoryItem)
+manageHistoryExposingExternalUpdates switchover runCmd = do
   window <- DOM.currentWindowUnchecked
   location <- Window.getLocation window
   history <- Window.getHistory window
@@ -196,5 +206,16 @@
   itemSetInternal <- performEvent $ ffor itemSetInternal' $ \cmd -> liftJSM $ do
     runHistoryCommand history cmd
     getCurrentHistoryItem
-  holdDyn item0 $ leftmost [itemSetInternal, itemSetExternal]
+  currentHistoryItem <- holdDyn item0 $ leftmost [itemSetInternal, itemSetExternal]
+  pure (currentHistoryItem, itemSetExternal)
 --TODO: Handle title setting better
+
+popHistoryState
+  :: (PerformEvent t m, MonadJSM (Performable m))
+  => Event t ()
+  -> m ()
+popHistoryState evt =
+  performEvent_ $ ffor evt $ \_ -> do
+    window <- DOM.currentWindowUnchecked
+    history <- Window.getHistory window
+    History.back history
