diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go
index 31c8348ac05a97fbdb16c50241810367503f3579..5f93feb98a45e9a40c9340a825ffde5b0dfe7158 100644
--- a/protocols/bgp/server/bmp_router.go
+++ b/protocols/bgp/server/bmp_router.go
@@ -104,6 +104,8 @@ func (r *Router) Address() net.IP {
 }
 
 func (r *Router) serve(con net.Conn) error {
+	defer r.cleanup()
+
 	r.con = con
 	r.runMu.Lock()
 	defer r.con.Close()
@@ -125,6 +127,11 @@ func (r *Router) serve(con net.Conn) error {
 	}
 }
 
+func (r *Router) cleanup() {
+	r.vrfRegistry.UnregisterAll()
+	r.neighborManager.disposeAll()
+}
+
 func (r *Router) processMsg(msg []byte) {
 	bmpMsg, err := bmppkt.Decode(msg)
 	if err != nil {
diff --git a/protocols/bgp/server/bmp_server.go b/protocols/bgp/server/bmp_server.go
index 99dfe1416c79c59bde760a142169fcf36e585246..5fb1bb9b53be2c7c42056d91f7508efff46ac549 100644
--- a/protocols/bgp/server/bmp_server.go
+++ b/protocols/bgp/server/bmp_server.go
@@ -129,7 +129,7 @@ func (b *BMPServer) deleteRouter(addr net.IP) {
 func (b *BMPServer) RemoveRouter(addr net.IP) {
 	id := addr.String()
 	r := b.routers[id]
-	r.stop <- struct{}{}
+	close(r.stop)
 
 	b.deleteRouter(addr)
 }
diff --git a/routingtable/vrf/vrf_registry.go b/routingtable/vrf/vrf_registry.go
index b85408880cb0b127d5311868a1ebd4560370e3e8..8fe3893cd699d5b0f24862c1a79d2fc482678e10 100644
--- a/routingtable/vrf/vrf_registry.go
+++ b/routingtable/vrf/vrf_registry.go
@@ -59,6 +59,16 @@ func (r *VRFRegistry) UnregisterVRF(v *VRF) {
 	delete(r.vrfs, v.routeDistinguisher)
 }
 
+// UnregisterAll unregisters all VRFs
+func (r *VRFRegistry) UnregisterAll() {
+	r.mu.Lock()
+	defer r.mu.Unlock()
+
+	for id := range r.vrfs {
+		delete(r.vrfs, id)
+	}
+}
+
 func (r *VRFRegistry) List() []*VRF {
 	r.mu.Lock()
 	defer r.mu.Unlock()