diff --git a/protocols/bgp/server/fsm_test.go b/protocols/bgp/server/fsm_test.go
index 15249537ac5b12e72c32cef04cb30c1b30b8185b..50181d8e3aa66ec34dbc21e7c18827e1b6b3d4c8 100644
--- a/protocols/bgp/server/fsm_test.go
+++ b/protocols/bgp/server/fsm_test.go
@@ -13,8 +13,8 @@ import (
 	bnet "github.com/bio-routing/bio-rd/net"
 )
 
-// TestFSM100Updates emulates receiving 100 BGP updates and withdraws. Checks route counts.
-func TestFSM100Updates(t *testing.T) {
+// TestFSM255UpdatesIPv4 emulates receiving 255 BGP updates and withdraws. Checks route counts.
+func TestFSM100UpdatesIPv4(t *testing.T) {
 	fsmA := newFSM2(&peer{
 		addr:     bnet.IPv4FromOctets(169, 254, 100, 100),
 		routerID: bnet.IPv4FromOctets(1, 1, 1, 1).ToUint32(),
@@ -127,6 +127,121 @@ func TestFSM100Updates(t *testing.T) {
 	wg.Wait()
 }
 
+// TestFSM255UpdatesIPv6 emulates receiving 255 BGP updates and withdraws. Checks route counts.
+func TestFSM255UpdatesIPv6(t *testing.T) {
+	fsmA := newFSM2(&peer{
+		addr:     bnet.IPv6FromBlocks(0x2001, 0x678, 0x1e0, 0xffff, 0, 0, 0, 1),
+		routerID: bnet.IPv4FromOctets(1, 1, 1, 1).ToUint32(),
+		ipv6: &familyParameters{
+			rib:          locRIB.New(),
+			importFilter: filter.NewAcceptAllFilter(),
+			exportFilter: filter.NewAcceptAllFilter(),
+		},
+	})
+	fsmA.options.SupportsMultiProtocol = true
+
+	fsmA.holdTimer = time.NewTimer(time.Second * 90)
+	fsmA.keepaliveTimer = time.NewTimer(time.Second * 30)
+	fsmA.connectRetryTimer = time.NewTimer(time.Second * 120)
+	fsmA.state = newEstablishedState(fsmA)
+
+	var wg sync.WaitGroup
+	wg.Add(1)
+	go func() {
+		fsmA.con = fakeConn{}
+		for {
+			nextState, reason := fsmA.state.run()
+			fsmA.state = nextState
+			stateName := stateName(nextState)
+			switch stateName {
+			case "idle":
+				wg.Done()
+				return
+			case "cease":
+				t.Errorf("Unexpected cease state: %s", reason)
+				wg.Done()
+				return
+			case "established":
+				continue
+			default:
+				t.Errorf("Unexpected new state: %s", reason)
+				wg.Done()
+				return
+			}
+		}
+
+	}()
+
+	for i := uint8(0); i < 255; i++ {
+		update := []byte{
+			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+			0, 76,
+			2,
+			0, 0,
+			0, 53,
+			64, // Attribute flags
+			1,  // Attribute Type code (ORIGIN)
+			1,  // Length
+			2,  // INCOMPLETE
+
+			64,     // Attribute flags
+			2,      // Attribute Type code (AS Path)
+			12,     // Length
+			2,      // Type = AS_SEQUENCE
+			2,      // Path Segement Length
+			59, 65, // AS15169
+			12, 248, // AS3320
+			1,      // Type = AS_SET
+			2,      // Path Segement Length
+			59, 65, // AS15169
+			12, 248, // AS3320
+
+			0x90,     // Attribute flags
+			0x0e,     // MP_REACH_NLRI
+			0x00, 30, // Length
+			0x00, 0x02, // AFI
+			0x01,                                                                                                 // SAFI
+			0x10, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // Nexthop
+			0x00,
+			64, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x0, i,
+		}
+
+		fsmA.msgRecvCh <- update
+	}
+
+	time.Sleep(time.Second)
+	ribRouteCount := fsmA.ipv6Unicast.rib.RouteCount()
+	if ribRouteCount != 255 {
+		t.Errorf("Unexpected route count in LocRIB: %d", ribRouteCount)
+	}
+
+	for i := uint8(0); i < 255; i++ {
+		update := []byte{
+			0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+			0x00, 35, // Length
+			0x02,       // UPDATE
+			0x00, 0x00, // withdrawn routes
+			0x00, 0x0c,
+			0x90, 0x0f,
+			0x00, 12, // Length
+			0x00, 0x02, // AFI
+			0x01, // SAFI
+			64, 0x20, 0x01, 0x06, 0x78, 0x01, 0xe0, 0x0, i,
+		}
+		fsmA.msgRecvCh <- update
+		ribRouteCount = fsmA.ipv6Unicast.rib.RouteCount()
+	}
+	time.Sleep(time.Second * 1)
+
+	ribRouteCount = fsmA.ipv6Unicast.rib.RouteCount()
+	if ribRouteCount != 0 {
+		t.Errorf("Unexpected route count in LocRIB: %d", ribRouteCount)
+	}
+
+	fsmA.eventCh <- ManualStop
+	wg.Wait()
+}
+
 func TestOpenMessage(t *testing.T) {
 	tests := []struct {
 		name     string