diff --git a/protocols/bgp/server/fsm.go b/protocols/bgp/server/fsm.go
index 00ab220c37603bb89a9713f37f061d24baff6c84..6e37f14ea9ae53866beb699cc7748e158faf0523 100644
--- a/protocols/bgp/server/fsm.go
+++ b/protocols/bgp/server/fsm.go
@@ -83,7 +83,7 @@ type FSM struct {
 	holdTimer          *time.Timer
 
 	keepaliveTime  time.Duration
-	keepaliveTimer *time.Timer
+	keepaliveTimer *time.Ticker
 
 	msgRecvCh     chan msgRecvMsg
 	msgRecvFailCh chan msgRecvErr
@@ -124,7 +124,7 @@ func NewFSM(peer *Peer, c config.Peer, rib routingtable.RouteTableClient) *FSM {
 		holdTimer:          time.NewTimer(0),
 
 		keepaliveTime:  time.Duration(c.KeepAlive),
-		keepaliveTimer: time.NewTimer(0),
+		keepaliveTimer: time.NewTicker(time.Duration(c.KeepAlive)),
 
 		routerID: c.RouterID,
 		remote:   c.PeerAddress,
@@ -457,7 +457,10 @@ func (fsm *FSM) openSent() int {
 				if fsm.holdTime != 0 {
 					fsm.holdTimer.Reset(time.Second * fsm.holdTime)
 					fsm.keepaliveTime = fsm.holdTime / 3
-					fsm.keepaliveTimer.Reset(time.Second * fsm.keepaliveTime)
+					if fsm.keepaliveTimer != nil {
+						fsm.keepaliveTimer.Stop()
+					}
+					fsm.keepaliveTimer = time.NewTicker(fsm.keepaliveTime * time.Second)
 				}
 
 				fsm.processOpenOptions(openMsg.OptParams)
@@ -623,7 +626,6 @@ func (fsm *FSM) openConfirm() int {
 				fsm.connectRetryCounter++
 				return fsm.changeState(Idle, fmt.Sprintf("Failed to send keepalive: %v", err))
 			}
-			fsm.keepaliveTimer.Reset(time.Second * fsm.keepaliveTime)
 			continue
 		case c := <-fsm.conCh:
 			if fsm.con2 != nil {
@@ -750,6 +752,7 @@ func (fsm *FSM) established() int {
 	}()*/
 
 	for {
+		log.Debug("Iterate established loop.")
 		select {
 		case e := <-fsm.eventCh:
 			if e == ManualStop { // Event 2
@@ -774,6 +777,7 @@ func (fsm *FSM) established() int {
 			fsm.connectRetryCounter++
 			return fsm.changeState(Idle, "Holdtimer expired")
 		case <-fsm.keepaliveTimer.C:
+
 			err := fsm.sendKeepalive()
 			if err != nil {
 				stopTimer(fsm.connectRetryTimer)
@@ -781,7 +785,6 @@ func (fsm *FSM) established() int {
 				fsm.connectRetryCounter++
 				return fsm.changeState(Idle, fmt.Sprintf("Failed to send keepalive: %v", err))
 			}
-			fsm.keepaliveTimer.Reset(time.Second * fsm.keepaliveTime)
 			continue
 		case c := <-fsm.conCh:
 			c.Close()
@@ -916,9 +919,10 @@ func (fsm *FSM) resetDelayOpenTimer() {
 }
 
 func (fsm *FSM) sendKeepalive() error {
-	msg := packet.SerializeKeepaliveMsg()
 
+	msg := packet.SerializeKeepaliveMsg()
 	_, err := fsm.con.Write(msg)
+	log.WithError(err).Debug("Send keepalive")
 	if err != nil {
 		return fmt.Errorf("Unable to send KEEPALIVE message: %v", err)
 	}