diff --git a/Network/Haskoin/Node/BlockChain.hs b/Network/Haskoin/Node/BlockChain.hs
--- a/Network/Haskoin/Node/BlockChain.hs
+++ b/Network/Haskoin/Node/BlockChain.hs
@@ -4,7 +4,7 @@
 
 import           Control.Concurrent              (threadDelay)
 import           Control.Concurrent.Async.Lifted (link, mapConcurrently,
-                                                  waitAny, withAsync)
+                                                  waitAnyCancel, withAsync)
 import           Control.Concurrent.STM          (STM, atomically, isEmptyTMVar,
                                                   putTMVar, readTVar, retry,
                                                   takeTMVar, tryReadTMVar,
@@ -57,8 +57,9 @@
         $(logInfo) "Initial header sync complete"
         $(logDebug) "Starting the tickle processing thread"
         withAsync processTickles $ \a2 -> link a2 >> do
-            _ <- liftIO $ waitAny [a1, a2]
+            _ <- liftIO $ waitAnyCancel [a1, a2]
             return ()
+        $(logDebug) "Exiting SPV-node thread"
 
 -- Source of all transaction broadcasts
 txSource :: (MonadLoggerIO m, MonadBaseControl IO m)
@@ -177,7 +178,7 @@
             (waitVal valE >> return (Right valE))
         case resE of
             Left newValE -> waitRescan rescanTMVar newValE
-            Right res -> return res
+            Right res    -> return res
     waitVal valE = case valE of
         Left ts -> waitFastCatchup ts
         Right h -> waitHeight h
@@ -473,7 +474,7 @@
     -- Then we re-evaluate the best peer
     continue <- catchAny (peerHeaderSyncLimit pid peerSessionHost 10) $
         \e -> do
-            $(logError) $ pack $ show e
+            $(logError) $ pack $ unwords ["peerHeaderSyncLimit:", show e]
             disconnectPeer pid peerSessionHost >> return True
 
     -- Reset the header syncing peer
diff --git a/Network/Haskoin/Node/Peer.hs b/Network/Haskoin/Node/Peer.hs
--- a/Network/Haskoin/Node/Peer.hs
+++ b/Network/Haskoin/Node/Peer.hs
@@ -11,6 +11,7 @@
                                                   swapTVar)
 import           Control.Concurrent.STM.TBMChan  (TBMChan, closeTBMChan,
                                                   newTBMChan, writeTBMChan)
+import           Control.Exception               (AsyncException(ThreadKilled))
 import           Control.Exception.Lifted        (finally, fromException, throw,
                                                   throwIO)
 import           Control.Monad                   (forM_, forever, join, unless,
@@ -90,9 +91,10 @@
                 $(logError) $ formatPid pid ph $ unwords
                     [ "Peer thread stopped with exception:", show se ]
                 return $ case fromException se of
-                    Just NodeExceptionBanned    -> False
-                    Just NodeExceptionConnected -> False
-                    _ -> True
+                    Just  NodeExceptionBanned         -> False
+                    Just  NodeExceptionConnected      -> False
+                    Just (NodeExceptionInvalidPeer _) -> False
+                    _ -> fromException se /= Just ThreadKilled
             Right _ -> do
                 $(logDebug) $ formatPid pid ph "Peer thread stopped"
                 return True
@@ -200,6 +202,7 @@
                         withAsync (peerPing pid ph) $ \a3 -> link a3 >> do
                             $(logDebug) $ formatPid pid ph "Ping thread started"
                             _ <- liftIO $ waitAnyCancel [a1, a2, a3]
+                            $(logDebug) $ formatPid pid ph "Exiting peer TCP thread"
                             return ()
 
     cleanupPeer = do
diff --git a/haskoin-node.cabal b/haskoin-node.cabal
--- a/haskoin-node.cabal
+++ b/haskoin-node.cabal
@@ -1,5 +1,5 @@
 name:                  haskoin-node
-version:               0.4.1
+version:               0.4.2
 synopsis:
     Implementation of a Bitoin node.
 description:
