diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -65,6 +65,8 @@
 
 ## Examples
 
+### Performance example
+
     import Foreign
     import qualified Data.Vector.Storable as DVS
     import qualified Data.ByteString as BS
@@ -91,6 +93,35 @@
     x <- measure $ jsonBsToInterestBs bs
 
     jsonTokenAt $ J.nextSibling $ J.firstChild $ J.nextSibling $ J.firstChild $ J.firstChild  cursor
+
+### Navigation example
+
+    $  cabal repl --ghc-option='-package mmap'
+    λ> :set -XNoMonomorphismRestriction
+    λ> import qualified Data.ByteString                                            as BS
+    λ> import           Data.String
+    λ> import qualified Data.Vector.Storable                                       as DVS
+    λ> import           Data.Word
+    λ> import           HaskellWorks.Data.Bits.BitShow
+    λ> import           HaskellWorks.Data.Bits.BitShown
+    λ> import           HaskellWorks.Data.FromForeignRegion
+    λ> import           HaskellWorks.Data.Json.Succinct.Cursor                     as C
+    λ> import           HaskellWorks.Data.Json.Token
+    λ> import           HaskellWorks.Data.Succinct.BalancedParens.Internal
+    λ> import           HaskellWorks.Data.Succinct.BalancedParens.Simple
+    λ> import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank0
+    λ> import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Rank1
+    λ> import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1
+    λ> import           HaskellWorks.Data.Succinct.RankSelect.Binary.Poppy512
+    λ> import qualified HaskellWorks.Data.TreeCursor as TC
+    λ> import           System.IO.MMap
+    λ> let fc = TC.firstChild
+    λ> let ns = TC.nextSibling
+    λ> let pn = TC.parent
+    λ> let cd = TC.depth
+    λ> let ss = TC.subtreeSize
+    λ> let cursor = "[null, {\"field\": 1}]" :: JsonCursor BS.ByteString (BitShown (DVS.Vector Word64)) (SimpleBalancedParens (DVS.Vector Word64))
+    λ> cursor
 
 ## References
 * [Succinct Data Structures talk by Edward Kmett](https://www.youtube.com/watch?v=uA0Z7_4J7u8)
diff --git a/hw-succinct.cabal b/hw-succinct.cabal
--- a/hw-succinct.cabal
+++ b/hw-succinct.cabal
@@ -1,5 +1,5 @@
 name:                   hw-succinct
-version:                0.0.0.9
+version:                0.0.0.10
 synopsis:               Conduits for tokenizing streams.
 description:            Please see README.md
 homepage:               http://github.com/haskell-works/hw-succinct#readme
diff --git a/src/HaskellWorks/Data/Json/Succinct/Cursor.hs b/src/HaskellWorks/Data/Json/Succinct/Cursor.hs
--- a/src/HaskellWorks/Data/Json/Succinct/Cursor.hs
+++ b/src/HaskellWorks/Data/Json/Succinct/Cursor.hs
@@ -10,6 +10,7 @@
 
 import qualified Data.Attoparsec.ByteString.Char8                           as ABC
 import           Data.ByteString.Internal                                   as BSI
+import           HaskellWorks.Data.Bits.BitWise
 import           HaskellWorks.Data.Json.Final.Tokenize.Internal
 import           HaskellWorks.Data.Json.Succinct.Cursor.CursorType          as X
 import           HaskellWorks.Data.Json.Succinct.Cursor.Internal            as X
@@ -18,8 +19,10 @@
 import           HaskellWorks.Data.Succinct.RankSelect.Binary.Basic.Select1
 import           HaskellWorks.Data.Vector.VectorLike
 
-jsonTokenAt :: (Rank1 w, Select1 v) => JsonCursor ByteString v w -> JsonToken
-jsonTokenAt k = case ABC.parse parseJsonToken (vDrop (toCount (jsonCursorPos k)) (cursorText k)) of
-  ABC.Fail    {}  -> error "Failed to parse token in cursor"
-  ABC.Partial _   -> error "Failed to parse token in cursor"
-  ABC.Done    _ r -> r
+jsonTokenAt :: (Rank1 w, Select1 v, TestBit w) => JsonCursor ByteString v w -> Maybe JsonToken
+jsonTokenAt k = if balancedParens k .?. lastPositionOf (cursorRank k)
+  then case ABC.parse parseJsonToken (vDrop (toCount (jsonCursorPos k)) (cursorText k)) of
+    ABC.Fail    {}  -> error "Failed to parse token in cursor"
+    ABC.Partial _   -> error "Failed to parse token in cursor"
+    ABC.Done    _ r -> Just r
+  else Nothing
diff --git a/test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs b/test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs
--- a/test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs
+++ b/test/HaskellWorks/Data/Json/Succinct/CursorSpec.hs
@@ -17,6 +17,7 @@
 import           Data.Word
 import           HaskellWorks.Data.Bits.BitShow
 import           HaskellWorks.Data.Bits.BitShown
+import           HaskellWorks.Data.Bits.BitWise
 import           HaskellWorks.Data.FromForeignRegion
 import           HaskellWorks.Data.Json.Succinct.Cursor                     as C
 import           HaskellWorks.Data.Json.Token
@@ -126,7 +127,8 @@
   , Show              u
   , Rank0             u
   , Rank1             u
-  , BalancedParens u
+  , BalancedParens    u
+  , TestBit           u
   , FromForeignRegion (JsonCursor BS.ByteString t u)
   , IsString          (JsonCursor BS.ByteString t u)
   , HasJsonCursorType (JsonCursor BS.ByteString t u))
@@ -234,16 +236,16 @@
     it "can get token at cursor" $ do
       (fptr, offset, size) <- mmapFileForeignPtr "test/data/sample.json" ReadOnly Nothing
       let cursor = fromForeignRegion (fptr, offset, size) :: JsonCursor BS.ByteString t u
-      jsonTokenAt                                                              cursor  `shouldBe` JsonTokenBraceL
-      jsonTokenAt ((                                                       fc) cursor) `shouldBe` JsonTokenString "widget"
-      jsonTokenAt ((                                                  ns . fc) cursor) `shouldBe` JsonTokenBraceL
-      jsonTokenAt ((                                             fc . ns . fc) cursor) `shouldBe` JsonTokenString "debug"
-      jsonTokenAt ((                                        ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "on"
-      jsonTokenAt ((                                   ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "window"
-      jsonTokenAt ((                              ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenBraceL
-      jsonTokenAt ((                         fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "title"
-      jsonTokenAt ((                    ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "Sample Konfabulator Widget"
-      jsonTokenAt ((               ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "name"
-      jsonTokenAt ((          ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "main_window"
-      jsonTokenAt ((     ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenString "width"
-      jsonTokenAt ((ns . ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` JsonTokenNumber 500.0
+      jsonTokenAt                                                              cursor  `shouldBe` Just (JsonTokenBraceL                             )
+      jsonTokenAt ((                                                       fc) cursor) `shouldBe` Just (JsonTokenString "widget"                    )
+      jsonTokenAt ((                                                  ns . fc) cursor) `shouldBe` Just (JsonTokenBraceL                             )
+      jsonTokenAt ((                                             fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "debug"                     )
+      jsonTokenAt ((                                        ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "on"                        )
+      jsonTokenAt ((                                   ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "window"                    )
+      jsonTokenAt ((                              ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenBraceL                             )
+      jsonTokenAt ((                         fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "title"                     )
+      jsonTokenAt ((                    ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "Sample Konfabulator Widget")
+      jsonTokenAt ((               ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "name"                      )
+      jsonTokenAt ((          ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "main_window"               )
+      jsonTokenAt ((     ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenString "width"                     )
+      jsonTokenAt ((ns . ns . ns . ns . ns . fc . ns . ns . ns . fc . ns . fc) cursor) `shouldBe` Just (JsonTokenNumber 500.0                       )
