diff --git a/protocols/bgp/packet/nlri_test.go b/protocols/bgp/packet/nlri_test.go
index 1efb81eaf44e758685923c2e553d3890a92c5592..e9e786bc77299bedbc5320fc3801ceb135c4a904 100644
--- a/protocols/bgp/packet/nlri_test.go
+++ b/protocols/bgp/packet/nlri_test.go
@@ -60,6 +60,42 @@ func TestDecodeNLRIs(t *testing.T) {
 	}
 }
 
+func TestDecodeNLRIv6(t *testing.T) {
+	tests := []struct {
+		name     string
+		input    []byte
+		addPath  bool
+		wantFail bool
+		expected *NLRI
+	}{
+		{
+			name: "IPv6 default",
+			input: []byte{
+				0,
+			},
+			wantFail: false,
+			expected: &NLRI{
+				Prefix: bnet.NewPfx(bnet.IPv6FromBlocks(0, 0, 0, 0, 0, 0, 0, 0), 0),
+			},
+		},
+	}
+
+	for _, test := range tests {
+		buf := bytes.NewBuffer(test.input)
+		res, _, err := decodeNLRI(buf, IPv6AFI, test.addPath)
+
+		if test.wantFail && err == nil {
+			t.Errorf("Expected error did not happen for test %q", test.name)
+		}
+
+		if !test.wantFail && err != nil {
+			t.Errorf("Unexpected failure for test %q: %v", test.name, err)
+		}
+
+		assert.Equal(t, test.expected, res)
+	}
+}
+
 func TestDecodeNLRI(t *testing.T) {
 	tests := []struct {
 		name     string
diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go
index 46f0f0a80230acf1e2ae9ceb73fab4febafef723..7f572ed2f20319efbe24e09222f4d794f5931851 100644
--- a/protocols/bgp/server/bmp_router.go
+++ b/protocols/bgp/server/bmp_router.go
@@ -267,12 +267,11 @@ func (r *router) processPeerUpNotification(msg *bmppkt.PeerUpNotification) error
 	}, fsm)
 	fsm.ipv4Unicast.bmpInit()
 
-	/*fsm.ipv6Unicast = newFSMAddressFamily(packet.IPv6AFI, packet.UnicastSAFI, &peerAddressFamily{
+	fsm.ipv6Unicast = newFSMAddressFamily(packet.IPv6AFI, packet.UnicastSAFI, &peerAddressFamily{
 		rib:          r.rib6,
 		importFilter: filter.NewAcceptAllFilter(),
-		//exportFilter: filter.NewDrainFilter(),
 	}, fsm)
-	fsm.ipv6Unicast.bmpInit()*/
+	fsm.ipv6Unicast.bmpInit()
 
 	fsm.state = newOpenSentState(fsm)
 	openSent := fsm.state.(*openSentState)
@@ -318,12 +317,6 @@ func (p *peer) configureBySentOpen(msg *packet.BGPOpen) {
 		case packet.ASN4CapabilityCode:
 			asn4Cap := cap.Value.(packet.ASN4Capability)
 			p.localASN = asn4Cap.ASN4
-			// TODO: Make 4Byte ASN configurable
-		case packet.MultiProtocolCapabilityCode:
-			/*mpCap := cap.Value.(packet.MultiProtocolCapability)
-			p := fsm.peer.addressFamily(mpCap.AFI, mpCap.SAFI)
-			p.multiProtocol = true*/
-			// FIXME!
 		}
 	}
 }
diff --git a/protocols/bgp/server/bmp_router_test.go b/protocols/bgp/server/bmp_router_test.go
index 7ccd96b638d291271079128a37be18f2c326843f..c67ca1846af6ae01ca1007c118264400e0be049f 100644
--- a/protocols/bgp/server/bmp_router_test.go
+++ b/protocols/bgp/server/bmp_router_test.go
@@ -329,6 +329,12 @@ func TestProcessPeerUpNotification(t *testing.T) {
 								adjRIBIn:     adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false),
 								importFilter: filter.NewAcceptAllFilter(),
 							},
+							ipv6Unicast: &fsmAddressFamily{
+								afi:          2,
+								safi:         1,
+								adjRIBIn:     adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false),
+								importFilter: filter.NewAcceptAllFilter(),
+							},
 						},
 					},
 				},
diff --git a/protocols/bgp/server/bmp_server_test.go b/protocols/bgp/server/bmp_server_test.go
index e2853952e6bdf949839af899bebe515bb279ad53..34a1e27b95a4b9be0f267f3271353588f6af0bfe 100644
--- a/protocols/bgp/server/bmp_server_test.go
+++ b/protocols/bgp/server/bmp_server_test.go
@@ -150,6 +150,579 @@ func TestIntegrationPeerUpRouteMonitor(t *testing.T) {
 	conA.Close()
 }
 
+func TestIntegrationPeerUpRouteMonitorIPv6IPv4(t *testing.T) {
+	addr := net.IP{10, 20, 30, 40}
+	port := uint16(12346)
+
+	rib4 := locRIB.New()
+	rib6 := locRIB.New()
+
+	r := newRouter(addr, port, rib4, rib6)
+	conA, conB := net.Pipe()
+
+	go r.serve(conB)
+
+	// Peer Up Notification
+	_, err := conA.Write([]byte{
+		// Common Header
+		3,            // Version
+		0, 0, 0, 142, // Message Length
+		3, // Msg Type = Peer Up Notification
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// Peer Up Notification
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 41, // 10.20.30.41 local address
+		0, 123, // Local Port
+		0, 234, // Remote Port
+
+		// Sent OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 200, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 1, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// Received OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 100, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 255, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// SECOND MESSAGE:
+
+		// Common Header
+		3,            // Version
+		0, 0, 0, 138, // Message Length
+		0, // Msg Type = Route Monitoring Message
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// BGP Update
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 90, // Length
+		2, // Update
+
+		0, 0, // Withdrawn Routes Length
+		0, 67, // Total Path Attribute Length
+
+		255,
+		14,    // MP REACH NLRI
+		0, 22, // Length
+		0, 2, // IPv6
+		1,  // Unicast
+		16, // IPv6 Next Hop
+		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+		0, // Reserved
+		0, // Pfxlen /0
+
+		255,  // Attribute flags
+		1,    // Attribute Type code (ORIGIN)
+		0, 1, // Length
+		2, // INCOMPLETE
+
+		0,      // Attribute flags
+		2,      // Attribute Type code (AS Path)
+		12,     // Length
+		2,      // Type = AS_SEQUENCE
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+		1,      // Type = AS_SET
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+
+		0,              // Attribute flags
+		3,              // Attribute Type code (Next Hop)
+		4,              // Length
+		10, 11, 12, 13, // Next Hop
+
+		0,          // Attribute flags
+		4,          // Attribute Type code (MED)
+		4,          // Length
+		0, 0, 1, 0, // MED 256
+
+		0,          // Attribute flags
+		5,          // Attribute Type code (Local Pref)
+		4,          // Length
+		0, 0, 1, 0, // Local Pref 256
+
+		// THIRD MESSAGE
+		// Common Header
+		3,            // Version
+		0, 0, 0, 113, // Message Length
+		0, // Msg Type = Route Monitoring Message
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// BGP Update
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 65, // Length
+		2, // Update
+
+		0, 0, // Withdrawn Routes Length
+		0, 41, // Total Path Attribute Length
+
+		255,  // Attribute flags
+		1,    // Attribute Type code (ORIGIN)
+		0, 1, // Length
+		2, // INCOMPLETE
+
+		0,      // Attribute flags
+		2,      // Attribute Type code (AS Path)
+		12,     // Length
+		2,      // Type = AS_SEQUENCE
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+		1,      // Type = AS_SET
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+
+		0,              // Attribute flags
+		3,              // Attribute Type code (Next Hop)
+		4,              // Length
+		10, 11, 12, 13, // Next Hop
+
+		0,          // Attribute flags
+		4,          // Attribute Type code (MED)
+		4,          // Length
+		0, 0, 1, 0, // MED 256
+
+		0,          // Attribute flags
+		5,          // Attribute Type code (Local Pref)
+		4,          // Length
+		0, 0, 1, 0, // Local Pref 256
+
+		0, // /0
+	})
+
+	if err != nil {
+		panic("write failed")
+	}
+
+	time.Sleep(time.Millisecond * 50)
+	assert.NotEmpty(t, r.neighbors)
+
+	time.Sleep(time.Millisecond * 50)
+
+	count := rib6.RouteCount()
+	if count != 1 {
+		t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count)
+	}
+
+	count = rib4.RouteCount()
+	if count != 1 {
+		t.Errorf("Unexpected IPv4 route count. Expected: 1 Got: %d", count)
+	}
+
+	conA.Close()
+}
+
+func TestIntegrationPeerUpRouteMonitorIPv4IPv6(t *testing.T) {
+	addr := net.IP{10, 20, 30, 40}
+	port := uint16(12346)
+
+	rib4 := locRIB.New()
+	rib6 := locRIB.New()
+
+	r := newRouter(addr, port, rib4, rib6)
+	conA, conB := net.Pipe()
+
+	go r.serve(conB)
+
+	// Peer Up Notification
+	_, err := conA.Write([]byte{
+		// Common Header
+		3,            // Version
+		0, 0, 0, 142, // Message Length
+		3, // Msg Type = Peer Up Notification
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// Peer Up Notification
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 41, // 10.20.30.41 local address
+		0, 123, // Local Port
+		0, 234, // Remote Port
+
+		// Sent OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 200, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 1, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// Received OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 100, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 255, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// SECOND MESSAGE:
+
+		// Common Header
+		3,            // Version
+		0, 0, 0, 113, // Message Length
+		0, // Msg Type = Route Monitoring Message
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// BGP Update
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 65, // Length
+		2, // Update
+
+		0, 0, // Withdrawn Routes Length
+		0, 41, // Total Path Attribute Length
+
+		255,  // Attribute flags
+		1,    // Attribute Type code (ORIGIN)
+		0, 1, // Length
+		2, // INCOMPLETE
+
+		0,      // Attribute flags
+		2,      // Attribute Type code (AS Path)
+		12,     // Length
+		2,      // Type = AS_SEQUENCE
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+		1,      // Type = AS_SET
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+
+		0,              // Attribute flags
+		3,              // Attribute Type code (Next Hop)
+		4,              // Length
+		10, 11, 12, 13, // Next Hop
+
+		0,          // Attribute flags
+		4,          // Attribute Type code (MED)
+		4,          // Length
+		0, 0, 1, 0, // MED 256
+
+		0,          // Attribute flags
+		5,          // Attribute Type code (Local Pref)
+		4,          // Length
+		0, 0, 1, 0, // Local Pref 256
+
+		0, // /0
+
+		// THIRD MESSAGE
+
+		// Common Header
+		3,            // Version
+		0, 0, 0, 138, // Message Length
+		0, // Msg Type = Route Monitoring Message
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// BGP Update
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 90, // Length
+		2, // Update
+
+		0, 0, // Withdrawn Routes Length
+		0, 67, // Total Path Attribute Length
+
+		255,
+		14,    // MP REACH NLRI
+		0, 22, // Length
+		0, 2, // IPv6
+		1,  // Unicast
+		16, // IPv6 Next Hop
+		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+		0, // Reserved
+		0, // Pfxlen /0
+
+		255,  // Attribute flags
+		1,    // Attribute Type code (ORIGIN)
+		0, 1, // Length
+		2, // INCOMPLETE
+
+		0,      // Attribute flags
+		2,      // Attribute Type code (AS Path)
+		12,     // Length
+		2,      // Type = AS_SEQUENCE
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+		1,      // Type = AS_SET
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+
+		0,              // Attribute flags
+		3,              // Attribute Type code (Next Hop)
+		4,              // Length
+		10, 11, 12, 13, // Next Hop
+
+		0,          // Attribute flags
+		4,          // Attribute Type code (MED)
+		4,          // Length
+		0, 0, 1, 0, // MED 256
+
+		0,          // Attribute flags
+		5,          // Attribute Type code (Local Pref)
+		4,          // Length
+		0, 0, 1, 0, // Local Pref 256
+	})
+
+	if err != nil {
+		panic("write failed")
+	}
+
+	time.Sleep(time.Millisecond * 50)
+	assert.NotEmpty(t, r.neighbors)
+
+	time.Sleep(time.Millisecond * 50)
+
+	count := rib6.RouteCount()
+	if count != 1 {
+		t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count)
+	}
+
+	count = rib4.RouteCount()
+	if count != 1 {
+		t.Errorf("Unexpected IPv4 route count. Expected: 1 Got: %d", count)
+	}
+
+	conA.Close()
+}
+
+func TestIntegrationPeerUpRouteMonitorIPv6(t *testing.T) {
+	addr := net.IP{10, 20, 30, 40}
+	port := uint16(12346)
+
+	rib4 := locRIB.New()
+	rib6 := locRIB.New()
+
+	r := newRouter(addr, port, rib4, rib6)
+	conA, conB := net.Pipe()
+
+	go r.serve(conB)
+
+	// Peer Up Notification
+	_, err := conA.Write([]byte{
+		// Common Header
+		3,            // Version
+		0, 0, 0, 142, // Message Length
+		3, // Msg Type = Peer Up Notification
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// Peer Up Notification
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 41, // 10.20.30.41 local address
+		0, 123, // Local Port
+		0, 234, // Remote Port
+
+		// Sent OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 200, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 1, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// Received OPEN message
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 37, // Length
+		1,      // Open message type
+		4,      // BGP Version
+		0, 100, // AS
+		0, 180, // Hold Time
+		1, 0, 0, 255, // BGP Identifier
+		8, // Opt param length
+		2, 6,
+		1, 4, // MP BGP
+		0, 2, // IPv6
+		0, 1, // Unicast
+
+		// SECOND MESSAGE:
+
+		// Common Header
+		3,            // Version
+		0, 0, 0, 138, // Message Length
+		0, // Msg Type = Route Monitoring Message
+
+		// Per Peer Header
+		0,                      // Peer Type
+		0,                      // Peer Flags
+		0, 0, 0, 0, 0, 0, 0, 0, // Peer Distinguisher
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 20, 30, 40, // 10.20.30.40 peer address
+		0, 0, 0, 100, // Peer AS
+		0, 0, 0, 255, // Peer BGP ID
+		0, 0, 0, 0, // Timestamp s
+		0, 0, 0, 0, // Timestamp µs
+
+		// BGP Update
+		255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
+		0, 90, // Length
+		2, // Update
+
+		0, 0, // Withdrawn Routes Length
+		0, 67, // Total Path Attribute Length
+
+		255,
+		14,    // MP REACH NLRI
+		0, 22, // Length
+		0, 2, // IPv6
+		1,  // Unicast
+		16, // IPv6 Next Hop
+		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+		0, // Reserved
+		0, // Pfxlen /0
+
+		255,  // Attribute flags
+		1,    // Attribute Type code (ORIGIN)
+		0, 1, // Length
+		2, // INCOMPLETE
+
+		0,      // Attribute flags
+		2,      // Attribute Type code (AS Path)
+		12,     // Length
+		2,      // Type = AS_SEQUENCE
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+		1,      // Type = AS_SET
+		2,      // Path Segment Length
+		59, 65, // AS15169
+		12, 248, // AS3320
+
+		0,              // Attribute flags
+		3,              // Attribute Type code (Next Hop)
+		4,              // Length
+		10, 11, 12, 13, // Next Hop
+
+		0,          // Attribute flags
+		4,          // Attribute Type code (MED)
+		4,          // Length
+		0, 0, 1, 0, // MED 256
+
+		0,          // Attribute flags
+		5,          // Attribute Type code (Local Pref)
+		4,          // Length
+		0, 0, 1, 0, // Local Pref 256
+	})
+
+	if err != nil {
+		panic("write failed")
+	}
+
+	time.Sleep(time.Millisecond * 50)
+	assert.NotEmpty(t, r.neighbors)
+
+	time.Sleep(time.Millisecond * 50)
+
+	count := rib6.RouteCount()
+	if count != 1 {
+		t.Errorf("Unexpected IPv6 route count. Expected: 1 Got: %d", count)
+	}
+
+	count = rib4.RouteCount()
+	if count != 0 {
+		t.Errorf("Unexpected IPv4 route count. Expected: 0 Got: %d", count)
+	}
+
+	conA.Close()
+}
+
 func TestIntegrationIncompleteBMPMsg(t *testing.T) {
 	addr := net.IP{10, 20, 30, 40}
 	port := uint16(12346)
diff --git a/protocols/bgp/server/fsm_address_family.go b/protocols/bgp/server/fsm_address_family.go
index ac1ace92cb7894b4fdf179497e6375a74598b0a7..6bd56ad05d8df357f808885a810f558da1d8c54d 100644
--- a/protocols/bgp/server/fsm_address_family.go
+++ b/protocols/bgp/server/fsm_address_family.go
@@ -103,13 +103,11 @@ func (f *fsmAddressFamily) processUpdate(u *packet.BGPUpdate) {
 		return
 	}
 
-	if f.multiProtocol {
-		f.multiProtocolUpdates(u)
-		return
+	f.multiProtocolUpdates(u)
+	if f.afi == packet.IPv4AFI {
+		f.withdraws(u)
+		f.updates(u)
 	}
-
-	f.withdraws(u)
-	f.updates(u)
 }
 
 func (f *fsmAddressFamily) withdraws(u *packet.BGPUpdate) {
@@ -200,6 +198,8 @@ func (f *fsmAddressFamily) processAttributes(attrs *packet.PathAttribute, path *
 			path.BGPPath.OriginatorID = pa.Value.(uint32)
 		case packet.ClusterListAttr:
 			path.BGPPath.ClusterList = pa.Value.([]uint32)
+		case packet.MultiProtocolReachNLRICode:
+		case packet.MultiProtocolUnreachNLRICode:
 		default:
 			unknownAttr := f.processUnknownAttribute(pa)
 			if unknownAttr != nil {
diff --git a/routingtable/locRIB/loc_rib.go b/routingtable/locRIB/loc_rib.go
index d9ad2b46f29ee95d8a0d6b42ff513bd7172e067f..aa60b9243aab1846bdb6dd010f9ced6155071268 100644
--- a/routingtable/locRIB/loc_rib.go
+++ b/routingtable/locRIB/loc_rib.go
@@ -64,7 +64,6 @@ func (a *LocRIB) RouteCount() int64 {
 func (a *LocRIB) AddPath(pfx net.Prefix, p *route.Path) error {
 	a.mu.Lock()
 	defer a.mu.Unlock()
-
 	logrus.WithFields(map[string]interface{}{
 		"Prefix": pfx,
 		"Route":  p,