diff --git a/ethereum.go b/ethereum.go
index 3a7202d535872d15368a2d1b4db212cccd53f604..6be989a10ee787b64819b1cd69b398d632b69224 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -165,6 +165,8 @@ func (s *Ethereum) AddPeer(conn net.Conn) {
 			ethutil.Config.Log.Debugf("[SERV] Max connected peers reached. Not adding incoming peer.")
 		}
 	}
+
+	s.reactor.Post("peerList", s.peers)
 }
 
 func (s *Ethereum) ProcessPeerList(addrs []string) {
@@ -303,12 +305,26 @@ func (s *Ethereum) Peers() *list.List {
 }
 
 func (s *Ethereum) reapPeers() {
+	eachPeer(s.peers, func(p *Peer, e *list.Element) {
+		if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
+			s.removePeerElement(e)
+		}
+	})
+}
+
+func (s *Ethereum) removePeerElement(e *list.Element) {
 	s.peerMut.Lock()
 	defer s.peerMut.Unlock()
 
-	eachPeer(s.peers, func(p *Peer, e *list.Element) {
-		if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
-			s.peers.Remove(e)
+	s.peers.Remove(e)
+
+	s.reactor.Post("peerList", s.peers)
+}
+
+func (s *Ethereum) RemovePeer(p *Peer) {
+	eachPeer(s.peers, func(peer *Peer, e *list.Element) {
+		if peer == p {
+			s.removePeerElement(e)
 		}
 	})
 }
diff --git a/peer.go b/peer.go
index 60f2de71144b0fc38093a6f14829800c8c11b744..6853a949d17275a9b5f6a48d1ca3a21a13adef27 100644
--- a/peer.go
+++ b/peer.go
@@ -2,7 +2,6 @@ package eth
 
 import (
 	"bytes"
-	"container/list"
 	"fmt"
 	"github.com/ethereum/eth-go/ethchain"
 	"github.com/ethereum/eth-go/ethutil"
@@ -523,13 +522,7 @@ func (p *Peer) Stop() {
 	}
 
 	// Pre-emptively remove the peer; don't wait for reaping. We already know it's dead if we are here
-	p.ethereum.peerMut.Lock()
-	defer p.ethereum.peerMut.Unlock()
-	eachPeer(p.ethereum.peers, func(peer *Peer, e *list.Element) {
-		if peer == p {
-			p.ethereum.peers.Remove(e)
-		}
-	})
+	p.ethereum.RemovePeer(p)
 }
 
 func (p *Peer) pushHandshake() error {