diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## Megaparsec 6.1.1
+
+* Fixed the bug when `tokens` used `cok` continuation even when matching an
+  empty chunk. Now it correctly uses `eok` in this case.
+
 ## Megaparsec 6.1.0
 
 * Improved rendering of offending line in `parseErrorPretty'` in the
diff --git a/Text/Megaparsec.hs b/Text/Megaparsec.hs
--- a/Text/Megaparsec.hs
+++ b/Text/Megaparsec.hs
@@ -999,7 +999,7 @@
   => (Tokens s -> Tokens s -> Bool)
   -> Tokens s
   -> ParsecT e s m (Tokens s)
-pTokens f tts = ParsecT $ \s@(State input (pos:|z) tp w) cok _ _ eerr ->
+pTokens f tts = ParsecT $ \s@(State input (pos:|z) tp w) cok _ eok eerr ->
   let pxy = Proxy :: Proxy s
       unexpect pos' u =
         let us = pure u
@@ -1012,7 +1012,10 @@
     Just (tts', input') ->
       if f tts tts'
         then let !npos = advanceN pxy w pos tts'
-             in cok tts' (State input' (npos:|z) (tp + len) w) mempty
+                 st    = State input' (npos:|z) (tp + len) w
+             in if chunkEmpty pxy tts
+                  then eok tts' st mempty
+                  else cok tts' st mempty
         else let !apos = positionAtN pxy pos tts'
                  ps = (Tokens . NE.fromList . chunkToTokens pxy) tts'
              in eerr (unexpect (apos:|z) ps) (State input (apos:|z) tp w)
diff --git a/megaparsec.cabal b/megaparsec.cabal
--- a/megaparsec.cabal
+++ b/megaparsec.cabal
@@ -1,5 +1,5 @@
 name:                 megaparsec
-version:              6.1.0
+version:              6.1.1
 cabal-version:        >= 1.18
 tested-with:          GHC==7.8.4, GHC==7.10.3, GHC==8.0.2, GHC==8.2.1
 license:              BSD2
diff --git a/tests/Text/MegaparsecSpec.hs b/tests/Text/MegaparsecSpec.hs
--- a/tests/Text/MegaparsecSpec.hs
+++ b/tests/Text/MegaparsecSpec.hs
@@ -1017,6 +1017,13 @@
                 z = take (length str) s
             grs  p s (`shouldFailWith` err posI (utoks z <> etoks str))
             grs' p s (`failsLeaving` s)
+      context "when matching the empty string" $
+        it "eok continuation is used" $
+          property $ \str s -> do
+            let p :: MonadParsec Void String m => m String
+                p = (tokens (==) "" <* empty) <|> pure str
+            grs  p s (`shouldParse` str)
+            grs' p s (`succeedsLeaving` s)
 
     describe "takeWhileP" $ do
       context "when stream is not empty" $
