diff --git a/blockpool/blockpool.go b/blockpool/blockpool.go
index 1ca97e0ca8e4546a0baaf147eb1bf0248836e897..46eac3549e2d994d0da4c6c513498d6bfe59dcd8 100644
--- a/blockpool/blockpool.go
+++ b/blockpool/blockpool.go
@@ -238,12 +238,13 @@ func (self *BlockPool) Start() {
 			case event := <-self.tdSub.Chan():
 				if ev, ok := event.(core.ChainHeadEvent); ok {
 					td := ev.Block.Td
-					plog.DebugDetailf("td: %v", td)
+					plog.DebugDetailf("ChainHeadEvent: height: %v, td: %v, hash: %s", ev.Block.Number(), td, hex(ev.Block.Hash()))
 					self.setTD(td)
 					self.peers.lock.Lock()
 
 					if best := self.peers.best; best != nil {
-						if td.Cmp(best.td) >= 0 {
+						// only switch if we strictly go above otherwise we may stall if only
+						if td.Cmp(best.td) > 0 {
 							self.peers.best = nil
 							self.switchPeer(best, nil)
 						}
@@ -706,7 +707,7 @@ func (self *BlockPool) AddBlock(block *types.Block, peerId string) {
   It activates the section process on incomplete sections with peer.
   It relinks orphaned sections with their parent if root block (and its parent hash) is known.
 */
-func (self *BlockPool) activateChain(sec *section, p *peer, connected map[string]*section) {
+func (self *BlockPool) activateChain(sec *section, p *peer, connected map[common.Hash]*section) {
 
 	p.lock.RLock()
 	switchC := p.switchC
@@ -720,7 +721,7 @@ LOOP:
 		plog.DebugDetailf("activateChain: section [%s] activated by peer <%s>", sectionhex(sec), p.id)
 		sec.activate(p)
 		if i > 0 && connected != nil {
-			connected[sec.top.hash.Str()] = sec
+			connected[sec.top.hash] = sec
 		}
 		/*
 		  Need to relink both complete and incomplete sections
diff --git a/blockpool/peers.go b/blockpool/peers.go
index 1e56f315d1c9a36202efb1958eb926360bd21982..615058e267b4397ac12978aaa0a5e70947cb1df6 100644
--- a/blockpool/peers.go
+++ b/blockpool/peers.go
@@ -356,16 +356,16 @@ func (self *BlockPool) switchPeer(oldp, newp *peer) {
 
 		}
 
-		var connected = make(map[string]*section)
+		var connected = make(map[common.Hash]*section)
 		var sections []common.Hash
 		for _, hash := range newp.sections {
 			plog.DebugDetailf("activate chain starting from section [%s]", hex(hash))
 			// if section not connected (ie, top of a contiguous sequence of sections)
-			if connected[hash.Str()] == nil {
+			if connected[hash] == nil {
 				// if not deleted, then reread from pool (it can be orphaned top half of a split section)
 				if entry := self.get(hash); entry != nil {
 					self.activateChain(entry.section, newp, connected)
-					connected[hash.Str()] = entry.section
+					connected[hash] = entry.section
 					sections = append(sections, hash)
 				}
 			}
@@ -531,6 +531,7 @@ func (self *peer) run() {
 
 	self.blocksRequestTimer = time.After(0)
 	self.headInfoTimer = time.After(self.bp.Config.BlockHashesTimeout)
+	self.bestIdleTimer = nil
 
 	var ping = time.NewTicker(5 * time.Second)
 
@@ -581,7 +582,7 @@ LOOP:
 		case <-self.bp.quit:
 			break LOOP
 
-		// quit
+		// best
 		case <-self.bestIdleTimer:
 			self.peerError(self.bp.peers.errors.New(ErrIdleTooLong, "timed out without providing new blocks (td: %v, head: %s)...quitting", self.td, hex(self.currentBlockHash)))