diff --git a/app/App/Commands.hs b/app/App/Commands.hs
--- a/app/App/Commands.hs
+++ b/app/App/Commands.hs
@@ -1,5 +1,6 @@
 module App.Commands where
 
+import App.Commands.Count
 import App.Commands.CreateIndex
 import App.Commands.Demo
 import Data.Semigroup           ((<>))
@@ -12,4 +13,5 @@
 commandsGeneral = subparser $ mempty
   <>  commandGroup "Commands:"
   <>  cmdCreateIndex
+  <>  cmdCount
   <>  cmdDemo
diff --git a/app/App/Commands/Count.hs b/app/App/Commands/Count.hs
new file mode 100644
--- /dev/null
+++ b/app/App/Commands/Count.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE OverloadedStrings   #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications    #-}
+
+module App.Commands.Count
+  ( cmdCount
+  ) where
+
+import Control.Lens
+import Control.Monad
+import Data.Generics.Product.Any
+import Data.Semigroup                                         ((<>))
+import Data.Word
+import HaskellWorks.Data.FromForeignRegion
+import HaskellWorks.Data.Json.Backend.Standard.Cursor.Generic
+import HaskellWorks.Data.Json.LightJson
+import HaskellWorks.Data.Json.Query
+import HaskellWorks.Data.MQuery
+import HaskellWorks.Data.MQuery.Micro
+import HaskellWorks.Data.RankSelect.CsPoppy
+import HaskellWorks.Data.TreeCursor
+import Options.Applicative                                    hiding (columns)
+
+import qualified App.Commands.Types                        as Z
+import qualified Data.ByteString                           as BS
+import qualified Data.ByteString.Internal                  as BSI
+import qualified Data.DList                                as DL
+import qualified Data.Vector.Storable                      as DVS
+import qualified HaskellWorks.Data.BalancedParens.RangeMin as RM
+import qualified System.IO.MMap                            as IO
+
+siblings :: GenericCursor BSI.ByteString CsPoppy (RM.RangeMin CsPoppy) -> [GenericCursor BSI.ByteString CsPoppy (RM.RangeMin CsPoppy)]
+siblings c = c:cs
+  where cs = case nextSibling c of
+          Just d  -> siblings d
+          Nothing -> []
+
+runCount :: Z.CountOptions -> IO ()
+runCount opts = do
+  let inputFile   = opts ^. the @"inputFile"
+  let ibIndex     = opts ^. the @"ibIndex"
+  let bpIndex     = opts ^. the @"bpIndex"
+  let expression  = opts ^. the @"expression"
+  jsonFr    <- IO.mmapFileForeignPtr inputFile IO.ReadOnly Nothing
+  jsonIbFr  <- IO.mmapFileForeignPtr ibIndex   IO.ReadOnly Nothing
+  jsonBpFr  <- IO.mmapFileForeignPtr bpIndex   IO.ReadOnly Nothing
+  let jsonBs  = fromForeignRegion jsonFr    :: BS.ByteString
+  let jsonIb  = fromForeignRegion jsonIbFr  :: DVS.Vector Word64
+  let jsonBp  = fromForeignRegion jsonBpFr  :: DVS.Vector Word64
+
+  let cursor = GenericCursor jsonBs (makeCsPoppy jsonIb) (RM.mkRangeMin (makeCsPoppy jsonBp)) 1
+
+  let q = MQuery (DL.fromList $ fmap lightJsonAt (siblings cursor))
+
+  putPretty $ q >>= (entry >=> named expression) & count
+
+  return ()
+
+optsCount :: Parser Z.CountOptions
+optsCount = Z.CountOptions
+  <$> strOption
+        (   long "input"
+        <>  short 'i'
+        <>  help "Input JSON file"
+        <>  metavar "FILE"
+        )
+  <*> strOption
+        (   long "ib-index"
+        <>  help "IB index"
+        <>  metavar "FILE"
+        )
+  <*> strOption
+        (   long "bp-index"
+        <>  help "BP index"
+        <>  metavar "FILE"
+        )
+  <*> option auto
+        (   long "expression"
+        <>  help "JSON expression"
+        <>  metavar "EXPRESSION"
+        )
+
+cmdCount :: Mod CommandFields (IO ())
+cmdCount = command "count"  $ flip info idm $ runCount <$> optsCount
diff --git a/app/App/Commands/Types.hs b/app/App/Commands/Types.hs
--- a/app/App/Commands/Types.hs
+++ b/app/App/Commands/Types.hs
@@ -2,10 +2,12 @@
 {-# LANGUAGE DuplicateRecordFields #-}
 
 module App.Commands.Types
-  ( CreateIndexOptions(..)
+  ( CountOptions(..)
+  , CreateIndexOptions(..)
   , DemoOptions(..)
   ) where
 
+import Data.Text    (Text)
 import GHC.Generics
 
 data CreateIndexOptions = CreateIndexOptions
@@ -19,4 +21,11 @@
 data DemoOptions = DemoOptions
   { filePath :: FilePath
   , method   :: FilePath
+  } deriving (Eq, Show, Generic)
+
+data CountOptions = CountOptions
+  { inputFile  :: FilePath
+  , ibIndex    :: FilePath
+  , bpIndex    :: FilePath
+  , expression :: Text
   } deriving (Eq, Show, Generic)
diff --git a/hw-json.cabal b/hw-json.cabal
--- a/hw-json.cabal
+++ b/hw-json.cabal
@@ -1,7 +1,7 @@
 cabal-version:  2.2
 
 name:           hw-json
-version:        1.1.0.0
+version:        1.1.0.1
 synopsis:       Memory efficient JSON parser
 description:    Memory efficient JSON parser. Please see README.md
 category:       Data
@@ -166,6 +166,7 @@
           , mmap
           , optparse-applicative
           , semigroups
+          , text
           , vector
   main-is:            Main.hs
   hs-source-dirs:     app
@@ -174,6 +175,7 @@
   other-modules:
       App.Commands
       App.Commands.CreateIndex
+      App.Commands.Count
       App.Commands.Demo
       App.Commands.Types
 
diff --git a/src/HaskellWorks/Data/Json/Backend/Standard/Fast.hs b/src/HaskellWorks/Data/Json/Backend/Standard/Fast.hs
--- a/src/HaskellWorks/Data/Json/Backend/Standard/Fast.hs
+++ b/src/HaskellWorks/Data/Json/Backend/Standard/Fast.hs
@@ -15,7 +15,6 @@
 import qualified Data.ByteString                                       as BS
 import qualified Data.ByteString.Char8                                 as BSC
 import qualified Data.ByteString.Internal                              as BSI
-import qualified HaskellWorks.Data.BalancedParens                      as BP
 import qualified HaskellWorks.Data.BalancedParens.RangeMin             as RM
 import qualified HaskellWorks.Data.FromForeignRegion                   as F
 import qualified HaskellWorks.Data.Json.Internal.Backend.Standard.IbBp as J
