diff --git a/les/handler.go b/les/handler.go
index 50c32fb95822b9de76a1600d8e524d26e9658048..7c290b717d89b358c2e4733ea73306dada07ef28 100644
--- a/les/handler.go
+++ b/les/handler.go
@@ -329,6 +329,11 @@ func (pm *ProtocolManager) handle(p *peer) error {
 // handleMsg is invoked whenever an inbound message is received from a remote
 // peer. The remote connection is torn down upon returning any error.
 func (pm *ProtocolManager) handleMsg(p *peer) error {
+	select {
+	case err := <-p.errCh:
+		return err
+	default:
+	}
 	// Read the next message from the remote peer, and ensure it's fully consumed
 	msg, err := p.rw.ReadMsg()
 	if err != nil {
@@ -389,7 +394,10 @@ func (pm *ProtocolManager) handleMsg(p *peer) error {
 		if reply != nil {
 			p.queueSend(func() {
 				if err := reply.send(bv); err != nil {
-					p.errCh <- err
+					select {
+					case p.errCh <- err:
+					default:
+					}
 				}
 			})
 		}
diff --git a/les/peer.go b/les/peer.go
index 8b506de629dfaab5b28eeae4eca4d1fe925af001..0c15add9c6b288f36eca0ce8feb7a467332f395e 100644
--- a/les/peer.go
+++ b/les/peer.go
@@ -98,15 +98,14 @@ type peer struct {
 }
 
 func newPeer(version int, network uint64, isTrusted bool, p *p2p.Peer, rw p2p.MsgReadWriter) *peer {
-	id := p.ID()
-
 	return &peer{
 		Peer:      p,
 		rw:        rw,
 		version:   version,
 		network:   network,
-		id:        fmt.Sprintf("%x", id),
+		id:        fmt.Sprintf("%x", p.ID().Bytes()),
 		isTrusted: isTrusted,
+		errCh:     make(chan error, 1),
 	}
 }