diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go
index 01a5952813210b610b4cc85213a3e954225469fc..df157adef2d043070b95f851c9e90192e47959d4 100644
--- a/protocols/bgp/server/bmp_router.go
+++ b/protocols/bgp/server/bmp_router.go
@@ -29,6 +29,7 @@ type Router struct {
 	reconnectTimeMin int
 	reconnectTimeMax int
 	reconnectTime    int
+	dialTimeout      time.Duration
 	reconnectTimer   *time.Timer
 	vrfRegistry      *vrf.VRFRegistry
 	neighborManager  *neighborManager
@@ -69,6 +70,7 @@ func newRouter(addr net.IP, port uint16) *Router {
 		reconnectTimeMin: 30,  // Suggested by RFC 7854
 		reconnectTimeMax: 720, // Suggested by RFC 7854
 		reconnectTimer:   time.NewTimer(time.Duration(0)),
+		dialTimeout:      time.Second * 5,
 		vrfRegistry:      vrf.NewVRFRegistry(),
 		neighborManager:  newNeighborManager(),
 		logger:           log.New(),
diff --git a/protocols/bgp/server/bmp_server.go b/protocols/bgp/server/bmp_server.go
index cc387a2c6e18399d62d3087f3cb882f06e312e46..68f33218f22e5d06620c146d169c113f7b77950d 100644
--- a/protocols/bgp/server/bmp_server.go
+++ b/protocols/bgp/server/bmp_server.go
@@ -56,7 +56,7 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) {
 	go func(r *Router) {
 		for {
 			<-r.reconnectTimer.C
-			c, err := net.Dial("tcp", fmt.Sprintf("%s:%d", r.address.String(), r.port))
+			c, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%d", r.address.String(), r.port), r.dialTimeout)
 			if err != nil {
 				log.Infof("Unable to connect to BMP router: %v", err)
 				if r.reconnectTime == 0 {
@@ -68,7 +68,8 @@ func (b *BMPServer) AddRouter(addr net.IP, port uint16) {
 				continue
 			}
 
-			r.reconnectTime = 0
+			r.reconnectTime = r.reconnectTimeMin
+			r.reconnectTimer = time.NewTimer(time.Second * time.Duration(r.reconnectTime))
 			log.Infof("Connected to %s", r.address.String())
 			r.serve(c)
 		}