diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,13 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## 0.21.7
+### Changed
+- Improve build configuration.
+
+### Fixed
+- Use minimum used addresses instead of minimum index for xpub cache decision.
+
 ## 0.21.6
 ### Fixed
 - Fix missing xpub unspent outputs when using cache.
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -155,7 +155,7 @@
     configRedisMin <-
         option auto $
         metavar "MINADDRS" <> long "cachemin" <>
-        help "Minimum xpub address count to cache" <>
+        help "Minimum used xpub addresses to cache" <>
         showDefault <>
         value defRedisMin
     pure
diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -4,12 +4,15 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 6c63490ebe39ea225abdcdb632f87f7913ab38a1bba8e637149e5873b85d8803
+-- hash: 89d53a7ce243c07c2c313ca4cdeef18c520b70f50e576c1810596f1e412f4eee
 
 name:           haskoin-store
-version:        0.21.6
+version:        0.21.7
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
-description:    Store blocks, transactions, and balances for Bitcoin or Bitcoin Cash, and make that information via REST API.
+description:    Store and index Bitcoin or Bitcoin Cash blocks, transactions, balances and unspent outputs.
+                All data is available via REST API in JSON or binary format.
+                Uses in-process RocksDB database to store data.
+                Supports Redis cache that can be shared by multiple nodes for faster access to extended public key balances, transactions and unspent outputs.
 category:       Bitcoin, Finance, Network
 homepage:       http://github.com/haskoin/haskoin-store#readme
 bug-reports:    http://github.com/haskoin/haskoin-store/issues
@@ -46,37 +49,35 @@
   hs-source-dirs:
       src
   build-depends:
-      QuickCheck
-    , aeson
+      aeson >=1.4.7.1
     , base >=4.9 && <5
-    , bytestring
-    , cereal
-    , conduit
-    , containers
-    , data-default
-    , deepseq
-    , hashable
-    , haskoin-core >=0.10.1
+    , bytestring >=0.10.10.0
+    , cereal >=0.5.8.1
+    , conduit >=1.3.2
+    , containers >=0.6.2.1
+    , data-default >=0.7.1.1
+    , deepseq >=1.4.4.0
+    , hashable >=1.3.0.0
+    , haskoin-core >=0.12.0
     , haskoin-node >=0.9.21
-    , hedis
-    , http-types
-    , monad-logger
-    , mtl
-    , network
-    , nqe
-    , random
-    , resourcet
-    , rocksdb-haskell
+    , hedis >=0.12.13
+    , http-types >=0.12.3
+    , monad-logger >=0.3.32
+    , mtl >=2.2.2
+    , network >=3.1.1.1
+    , nqe >=0.6.1
+    , random >=1.1
+    , rocksdb-haskell >=1.0.1
     , rocksdb-query >=0.3.1
-    , scotty
-    , string-conversions
-    , text
-    , time
-    , transformers
-    , unliftio
-    , unordered-containers
-    , wai
-    , warp
+    , scotty >=0.11.5
+    , string-conversions >=0.4.0.1
+    , text >=1.2.4.0
+    , time >=1.9.3
+    , transformers >=0.5.6.2
+    , unliftio >=0.2.12.1
+    , unordered-containers >=0.2.10.0
+    , wai >=3.2.2.1
+    , warp >=3.3.10
   default-language: Haskell2010
 
 executable haskoin-store
@@ -87,40 +88,31 @@
       app
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      QuickCheck
-    , aeson
+      aeson >=1.4.7.1
     , base >=4.9 && <5
-    , bytestring
-    , cereal
-    , conduit
-    , containers
-    , data-default
-    , deepseq
+    , bytestring >=0.10.10.0
+    , cereal >=0.5.8.1
+    , conduit >=1.3.2
+    , containers >=0.6.2.1
+    , data-default >=0.7.1.1
+    , deepseq >=1.4.4.0
     , filepath
-    , hashable
-    , haskoin-core >=0.10.1
-    , haskoin-node >=0.9.21
+    , hashable >=1.3.0.0
+    , haskoin-core >=0.12.0
+    , haskoin-node
     , haskoin-store
     , hedis
-    , http-types
-    , monad-logger
-    , mtl
-    , network
-    , nqe
+    , monad-logger >=0.3.32
+    , mtl >=2.2.2
+    , nqe >=0.6.1
     , optparse-applicative
-    , random
-    , resourcet
-    , rocksdb-haskell
-    , rocksdb-query >=0.3.1
-    , scotty
-    , string-conversions
-    , text
-    , time
-    , transformers
-    , unliftio
-    , unordered-containers
-    , wai
-    , warp
+    , random >=1.1
+    , string-conversions >=0.4.0.1
+    , text >=1.2.4.0
+    , time >=1.9.3
+    , transformers >=0.5.6.2
+    , unliftio >=0.2.12.1
+    , unordered-containers >=0.2.10.0
   default-language: Haskell2010
 
 test-suite haskoin-store-test
@@ -147,37 +139,36 @@
       src
   ghc-options: -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      QuickCheck
-    , aeson
+      QuickCheck >=2.13.2
+    , aeson >=1.4.7.1
     , base >=4.9 && <5
-    , bytestring
-    , cereal
-    , conduit
-    , containers
-    , data-default
-    , deepseq
-    , hashable
-    , haskoin-core >=0.10.1
+    , bytestring >=0.10.10.0
+    , cereal >=0.5.8.1
+    , conduit >=1.3.2
+    , containers >=0.6.2.1
+    , data-default >=0.7.1.1
+    , deepseq >=1.4.4.0
+    , hashable >=1.3.0.0
+    , haskoin-core >=0.12.0
     , haskoin-node >=0.9.21
-    , hedis
-    , hspec
-    , http-types
-    , monad-logger
-    , mtl
-    , network
-    , nqe
-    , random
-    , resourcet
-    , rocksdb-haskell
+    , hedis >=0.12.13
+    , hspec >=2.7.1
+    , http-types >=0.12.3
+    , monad-logger >=0.3.32
+    , mtl >=2.2.2
+    , network >=3.1.1.1
+    , nqe >=0.6.1
+    , random >=1.1
+    , rocksdb-haskell >=1.0.1
     , rocksdb-query >=0.3.1
-    , scotty
-    , string-conversions
-    , text
-    , time
-    , transformers
-    , unliftio
-    , unordered-containers
-    , wai
-    , warp
+    , scotty >=0.11.5
+    , string-conversions >=0.4.0.1
+    , text >=1.2.4.0
+    , time >=1.9.3
+    , transformers >=0.5.6.2
+    , unliftio >=0.2.12.1
+    , unordered-containers >=0.2.10.0
+    , wai >=3.2.2.1
+    , warp >=3.3.10
   default-language: Haskell2010
   build-tool-depends: hspec-discover:hspec-discover
diff --git a/src/Haskoin/Store.hs b/src/Haskoin/Store.hs
--- a/src/Haskoin/Store.hs
+++ b/src/Haskoin/Store.hs
@@ -1,9 +1,18 @@
 module Haskoin.Store
-    ( StoreConfig (..)
+    ( StoreConfig(..)
     , store
     , withStore
-    , module X )
-    where
+    , module Network.Haskoin.Store.Common
+    , module Network.Haskoin.Store.BlockStore
+    , module Network.Haskoin.Store.Logic
+    , module Network.Haskoin.Store.Web
+    , module Network.Haskoin.Store.CacheWriter
+    , module Network.Haskoin.Store.Data.Types
+    , module Network.Haskoin.Store.Data.CacheReader
+    , module Network.Haskoin.Store.Data.DatabaseReader
+    , module Network.Haskoin.Store.Data.DatabaseWriter
+    , module Network.Haskoin.Store.Data.MemoryDatabase
+    ) where
 
 import           Control.Monad                             (forever, unless,
                                                             when)
@@ -33,16 +42,16 @@
                                                             NodeEvent (..),
                                                             PeerEvent (..),
                                                             node)
-import           Network.Haskoin.Store.BlockStore          as X
-import           Network.Haskoin.Store.CacheWriter         as X
-import           Network.Haskoin.Store.Common              as X
-import           Network.Haskoin.Store.Data.CacheReader    as X
-import           Network.Haskoin.Store.Data.DatabaseReader as X
-import           Network.Haskoin.Store.Data.DatabaseWriter as X
-import           Network.Haskoin.Store.Data.MemoryDatabase as X
-import           Network.Haskoin.Store.Data.Types          as X
-import           Network.Haskoin.Store.Logic               as X
-import           Network.Haskoin.Store.Web                 as X
+import           Network.Haskoin.Store.BlockStore
+import           Network.Haskoin.Store.CacheWriter
+import           Network.Haskoin.Store.Common
+import           Network.Haskoin.Store.Data.CacheReader
+import           Network.Haskoin.Store.Data.DatabaseReader
+import           Network.Haskoin.Store.Data.DatabaseWriter
+import           Network.Haskoin.Store.Data.MemoryDatabase
+import           Network.Haskoin.Store.Data.Types
+import           Network.Haskoin.Store.Logic
+import           Network.Haskoin.Store.Web
 import           Network.Socket                            (SockAddr (..))
 import           NQE                                       (Inbox, Listen,
                                                             Process (..),
diff --git a/src/Network/Haskoin/Store/CacheWriter.hs b/src/Network/Haskoin/Store/CacheWriter.hs
--- a/src/Network/Haskoin/Store/CacheWriter.hs
+++ b/src/Network/Haskoin/Store/CacheWriter.hs
@@ -53,7 +53,7 @@
                                                          XPubBal (..),
                                                          XPubSpec (..),
                                                          XPubUnspent (..),
-                                                         sortTxs,
+                                                         nullBalance, sortTxs,
                                                          xPubAddrFunction,
                                                          xPubBals, xPubTxs,
                                                          xPubUnspents)
@@ -147,7 +147,8 @@
     x <- asks cacheWriterMin
     when empty $ do
         bals <- lift $ xPubBals xpub
-        when (x <= length bals) (go bals)
+        let l = length $ filter (not . nullBalance . xPubBal) bals
+        when (x <= l) (go bals)
   where
     go bals = do
         utxo <- lift $ xPubUnspents xpub Nothing 0 Nothing
