diff --git a/go.mod b/go.mod
index af9d8336d060b0717f754271dc8b69092f7a266a..4c3b95b881db3ccc35a4b2467735ed1006e070ad 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
 	github.com/vishvananda/netlink v1.0.0
 	github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc // indirect
 	golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9 // indirect
-	golang.org/x/net v0.0.0-20181220203305-927f97764cc3 // indirect
+	golang.org/x/net v0.0.0-20181220203305-927f97764cc3
 	golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect
 	golang.org/x/sys v0.0.0-20181228120256-c6cbdbf9e68a // indirect
 	google.golang.org/genproto v0.0.0-20181221175505-bd9b4fb69e2f // indirect
diff --git a/protocols/bgp/server/bgp_api.go b/protocols/bgp/server/bgp_api.go
index 145fa5c0358b086e35392dbc5b7690d0ba094dec..5546abf94dc98ab546e736457ee50d6b67305c99 100644
--- a/protocols/bgp/server/bgp_api.go
+++ b/protocols/bgp/server/bgp_api.go
@@ -23,13 +23,17 @@ func NewBGPAPIServer(s BGPServer) *BGPAPIServer {
 }
 
 func (s *BGPAPIServer) ListSessions(ctx context.Context, in *api.ListSessionsRequest) (*api.ListSessionsResponse, error) {
-	return nil, fmt.Errorf("Not implemented yet.")
+	return nil, fmt.Errorf("Not implemented yet")
 }
 
 // DumpRIBIn dumps the RIB in of a peer for a given AFI/SAFI
-//func (s *BGPAPIServer) DumpRIBIn(ctx context.Context, in *api.DumpRIBRequest) (api.BgpService_DumpRIBInClient, error) {
 func (s *BGPAPIServer) DumpRIBIn(in *api.DumpRIBRequest, stream api.BgpService_DumpRIBInServer) error {
-	for _, r := range s.srv.DumpRIBIn(bnet.IPFromProtoIP(*in.Peer), uint16(in.Afi), uint8(in.Safi)) {
+	r := s.srv.GetRIBIn(bnet.IPFromProtoIP(*in.Peer), uint16(in.Afi), uint8(in.Safi))
+	if r == nil {
+		return fmt.Errorf("Unable to get AdjRIBIn")
+	}
+
+	for _, r := range r.Dump() {
 		x := r.ToProto()
 		err := stream.Send(x)
 		if err != nil {
@@ -42,8 +46,14 @@ func (s *BGPAPIServer) DumpRIBIn(in *api.DumpRIBRequest, stream api.BgpService_D
 
 // DumpRIBOut dumps the RIB out of a peer for a given AFI/SAFI
 func (s *BGPAPIServer) DumpRIBOut(in *api.DumpRIBRequest, stream api.BgpService_DumpRIBOutServer) error {
-	for _, r := range s.srv.DumpRIBOut(bnet.IPFromProtoIP(*in.Peer), uint16(in.Afi), uint8(in.Safi)) {
-		err := stream.Send(r.ToProto())
+	r := s.srv.GetRIBOut(bnet.IPFromProtoIP(*in.Peer), uint16(in.Afi), uint8(in.Safi))
+	if r == nil {
+		return fmt.Errorf("Unable to get AdjRIBOut")
+	}
+
+	for _, r := range r.Dump() {
+		x := r.ToProto()
+		err := stream.Send(x)
 		if err != nil {
 			return err
 		}
diff --git a/protocols/bgp/server/server.go b/protocols/bgp/server/server.go
index 402eb74e11b719c25733aff39c4f415b83d53f2e..d3d0a67447f82598c9a9be4a14e63e9fef4e0a7a 100644
--- a/protocols/bgp/server/server.go
+++ b/protocols/bgp/server/server.go
@@ -3,9 +3,12 @@ package server
 import (
 	"net"
 
+	"github.com/bio-routing/bio-rd/routingtable/adjRIBOut"
+
+	"github.com/bio-routing/bio-rd/routingtable/adjRIBIn"
+
 	"github.com/bio-routing/bio-rd/config"
 	bnet "github.com/bio-routing/bio-rd/net"
-	"github.com/bio-routing/bio-rd/route"
 	bnetutils "github.com/bio-routing/bio-rd/util/net"
 	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
@@ -27,8 +30,8 @@ type BGPServer interface {
 	RouterID() uint32
 	Start(*config.Global) error
 	AddPeer(config.Peer) error
-	DumpRIBIn(peer bnet.IP, afi uint16, safi uint8) []*route.Route
-	DumpRIBOut(peer bnet.IP, afi uint16, safi uint8) []*route.Route
+	GetRIBIn(peerIP bnet.IP, afi uint16, safi uint8) *adjRIBIn.AdjRIBIn
+	GetRIBOut(peerIP bnet.IP, afi uint16, safi uint8) *adjRIBOut.AdjRIBOut
 	ConnectMockPeer(peer config.Peer, con net.Conn)
 }
 
@@ -68,22 +71,42 @@ func (b *bgpServer) Start(c *config.Global) error {
 	return nil
 }
 
-func (b *bgpServer) DumpRIBIn(peerIP bnet.IP, afi uint16, safi uint8) []*route.Route {
+func (b *bgpServer) GetRIBIn(peerIP bnet.IP, afi uint16, safi uint8) *adjRIBIn.AdjRIBIn {
 	p := b.peers.get(peerIP)
 	if p == nil {
 		return nil
 	}
 
-	return p.dumpRIBIn(afi, safi)
+	if len(p.fsms) != 1 {
+		return nil
+	}
+
+	fsm := p.fsms[0]
+	f := fsm.addressFamily(afi, safi)
+	if f == nil {
+		return nil
+	}
+
+	return f.adjRIBIn.(*adjRIBIn.AdjRIBIn)
 }
 
-func (b *bgpServer) DumpRIBOut(peerIP bnet.IP, afi uint16, safi uint8) []*route.Route {
+func (b *bgpServer) GetRIBOut(peerIP bnet.IP, afi uint16, safi uint8) *adjRIBOut.AdjRIBOut {
 	p := b.peers.get(peerIP)
 	if p == nil {
 		return nil
 	}
 
-	return p.dumpRIBOut(afi, safi)
+	if len(p.fsms) != 1 {
+		return nil
+	}
+
+	fsm := p.fsms[0]
+	f := fsm.addressFamily(afi, safi)
+	if f == nil {
+		return nil
+	}
+
+	return f.adjRIBOut.(*adjRIBOut.AdjRIBOut)
 }
 
 func (b *bgpServer) incomingConnectionWorker() {