diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           haskoin-store
-version:        0.40.12
+version:        0.40.13
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
 description:    Please see the README on GitHub at <https://github.com/haskoin/haskoin-store#readme>
 category:       Bitcoin, Finance, Network
diff --git a/src/Haskoin/Store/Cache.hs b/src/Haskoin/Store/Cache.hs
--- a/src/Haskoin/Store/Cache.hs
+++ b/src/Haskoin/Store/Cache.hs
@@ -166,26 +166,16 @@
     => XPubSpec -> Limits -> CacheX m [TxRef]
 getXPubTxs xpub limits = do
     xpubtxt <- xpubText xpub
-    $(logDebugS) "Cache" $ "Getting xpub txs for " <> xpubtxt
     isXPubCached xpub >>= \case
         True -> do
             txs <- cacheGetXPubTxs xpub limits
-            $(logDebugS) "Cache" $
-                "Returning " <> cs (show (length txs)) <>
-                " transactions for cached xpub: " <>
-                xpubtxt
             return txs
         False -> do
-            $(logDebugS) "Cache" $ "Caching new xpub " <> xpubtxt
             newXPubC xpub >>= \(t, bals) ->
                 if t
                     then do
-                        $(logDebugS) "Cache" $
-                            "Successfully cached xpub " <> xpubtxt
                         cacheGetXPubTxs xpub limits
                     else do
-                        $(logDebugS) "Cache" $
-                            "Using DB to return txs for xpub " <> xpubtxt
                         lift $ xPubBalsTxs bals limits
 
 getXPubUnspents ::
@@ -193,7 +183,6 @@
     => XPubSpec -> Limits -> CacheX m [XPubUnspent]
 getXPubUnspents xpub limits = do
     xpubtxt <- xpubText xpub
-    $(logDebugS) "Cache" $ "Getting utxo for xpub " <> xpubtxt
     isXPubCached xpub >>= \case
         True -> do
             bals <- cacheGetXPubBalances xpub
@@ -202,12 +191,8 @@
             newXPubC xpub >>= \(t, bals) ->
                 if t
                     then do
-                        $(logDebugS) "Cache" $
-                            "Successfully cached xpub " <> xpubtxt
                         process bals
                     else do
-                        $(logDebugS) "Cache" $
-                            "Using DB to return utxo for xpub " <> xpubtxt
                         lift $ xPubBalsUnspents bals limits
   where
     process bals = do
@@ -230,10 +215,6 @@
                     (\(a, u) -> (`XPubUnspent` u) <$> Map.lookup a addrmap)
                     addrutxo
         xpubtxt <- xpubText xpub
-        $(logDebugS) "Cache" $
-            "Returning " <> cs (show (length xpubutxo)) <>
-            " utxos for cached xpub: " <>
-            xpubtxt
         return xpubutxo
 
 getXPubBalances ::
@@ -241,16 +222,11 @@
     => XPubSpec -> CacheX m [XPubBal]
 getXPubBalances xpub = do
     xpubtxt <- xpubText xpub
-    $(logDebugS) "Cache" $ "Getting balances for xpub " <> xpubtxt
     isXPubCached xpub >>= \case
         True -> do
             bals <- cacheGetXPubBalances xpub
-            $(logDebugS) "Cache" $
-                "Returning " <> cs (show (length bals)) <> " balances for xpub " <>
-                xpubtxt
             return bals
         False -> do
-            $(logDebugS) "Cache" $ "Caching balances for xpub " <> xpubtxt
             snd <$> newXPubC xpub
 
 isInCache :: MonadLoggerIO m => XPubSpec -> CacheT m Bool
@@ -604,37 +580,28 @@
     let n = lenNotNull bals
     if x <= n
         then inSync >>= \s -> if s then go bals else return (False, bals)
-        else do
-            $(logDebugS) "Cache" $ "Not caching xpub: " <> t
-            return (False, bals)
+        else return (False, bals)
   where
     op XPubUnspent {xPubUnspent = u} = (unspentPoint u, unspentBlock u)
     go bals = do
         xpubtxt <- xpubText xpub
         $(logDebugS) "Cache" $
-            "Caching xpub with " <> cs (show (length bals)) <>
-            " addresses (used: " <>
-            cs (show (lenNotNull bals)) <>
-            "): " <>
-            xpubtxt
+            "Caching " <> xpubtxt <> ": " <> cs (show (length bals)) <>
+            " addresses / " <> cs (show (lenNotNull bals)) <> " used"
         utxo <- lift $ xPubUnspents xpub def
         $(logDebugS) "Cache" $
-            "Caching xpub with " <> cs (show (length utxo)) <> " utxos: " <>
-            xpubtxt
+            "Caching " <> xpubtxt <> ": " <> cs (show (length utxo)) <> " utxos"
         xtxs <- lift $ xPubTxs xpub def
         $(logDebugS) "Cache" $
-            "Caching xpub with " <> cs (show (length xtxs)) <> " txs: " <>
-            xpubtxt
+            "Caching " <> xpubtxt <> ": " <> cs (show (length xtxs)) <> " txs"
         now <- systemSeconds <$> liftIO getSystemTime
-        $(logDebugS) "Cache" $
-            "Running Redis pipeline to cache xpub: " <> xpubtxt <> ""
         runRedis $ do
             b <- redisTouchKeys now [xpub]
             c <- redisAddXPubBalances xpub bals
             d <- redisAddXPubUnspents xpub (map op utxo)
             e <- redisAddXPubTxs xpub xtxs
             return $ b >> c >> d >> e >> return ()
-        $(logDebugS) "Cache" $ "Done caching xpub: " <> xpubtxt
+        $(logDebugS) "Cache" $ "Cached " <> xpubtxt
         return (True, bals)
 
 inSync :: (MonadUnliftIO m, MonadLoggerIO m, StoreReadExtra m)
@@ -702,27 +669,38 @@
              => BlockHash -> CacheX m ()
 importBlockC bh =
     withLockForever $
-    lift (getBlock bh) >>= \case
-    Just bd -> do
-        let ths = blockDataTxs bd
-        tds <- sortTxData . catMaybes <$> mapM (lift . getTxData) ths
-        $(logDebugS) "Cache" $
-            "Importing " <> cs (show (length tds)) <>
-            " transactions from block " <>
-            blockHashToHex bh
-        importMultiTxC tds
-        $(logDebugS) "Cache" $
-            "Done importing " <> cs (show (length tds)) <>
-            " transactions from block " <>
-            blockHashToHex bh
-        cacheSetHead bh
-    Nothing -> do
-        $(logErrorS) "Cache" $
-            "Could not get block: "
-            <> blockHashToHex bh
-        throwIO . LogicError . cs $
-            "Could not get block: "
-            <> blockHashToHex bh
+    cacheGetHead >>= \case
+    Nothing -> return ()
+    Just cb ->
+        asks cacheChain >>= \ch ->
+        chainGetBlock bh ch >>= \case
+        Nothing -> return ()
+        Just bn ->
+            if prevBlock (nodeHeader bn) == cb
+            then go
+            else return ()
+  where
+    go = lift (getBlock bh) >>= \case
+        Just bd -> do
+            let ths = blockDataTxs bd
+            tds <- sortTxData . catMaybes <$> mapM (lift . getTxData) ths
+            $(logDebugS) "Cache" $
+                "Importing " <> cs (show (length tds)) <>
+                " transactions from block " <>
+                blockHashToHex bh
+            importMultiTxC tds
+            $(logDebugS) "Cache" $
+                "Done importing " <> cs (show (length tds)) <>
+                " transactions from block " <>
+                blockHashToHex bh
+            cacheSetHead bh
+        Nothing -> do
+            $(logErrorS) "Cache" $
+                "Could not get block: "
+                <> blockHashToHex bh
+            throwIO . LogicError . cs $
+                "Could not get block: "
+                <> blockHashToHex bh
 
 removeHeadC :: (StoreReadExtra m, MonadUnliftIO m, MonadLoggerIO m)
             => BlockHash -> CacheX m ()
