diff --git a/protocols/bgp/api/bgp.pb.go b/protocols/bgp/api/bgp.pb.go
index 96547a24527a81c9fae7192c75ff6f9a72968e5b..bd20ac55fb102aec7a2ce75e5cc19a545c7e19d6 100644
--- a/protocols/bgp/api/bgp.pb.go
+++ b/protocols/bgp/api/bgp.pb.go
@@ -1,12 +1,17 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
-// source: protocols/bgp/server/api/bgp.proto
+// source: protocols/bgp/api/bgp.proto
 
-package api // import "protocols/bgp/server/api"
+package api // import "protocols/bgp/api"
 
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import math "math"
 
+import (
+	context "golang.org/x/net/context"
+	grpc "google.golang.org/grpc"
+)
+
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
 var _ = fmt.Errorf
@@ -29,7 +34,7 @@ func (m *ListSessionsRequest) Reset()         { *m = ListSessionsRequest{} }
 func (m *ListSessionsRequest) String() string { return proto.CompactTextString(m) }
 func (*ListSessionsRequest) ProtoMessage()    {}
 func (*ListSessionsRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bgp_d327b15a3107b32f, []int{0}
+	return fileDescriptor_bgp_27982cf497b45c6f, []int{0}
 }
 func (m *ListSessionsRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListSessionsRequest.Unmarshal(m, b)
@@ -67,7 +72,7 @@ func (m *ListSessionsResponse) Reset()         { *m = ListSessionsResponse{} }
 func (m *ListSessionsResponse) String() string { return proto.CompactTextString(m) }
 func (*ListSessionsResponse) ProtoMessage()    {}
 func (*ListSessionsResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_bgp_d327b15a3107b32f, []int{1}
+	return fileDescriptor_bgp_27982cf497b45c6f, []int{1}
 }
 func (m *ListSessionsResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ListSessionsResponse.Unmarshal(m, b)
@@ -99,23 +104,93 @@ func init() {
 	proto.RegisterType((*ListSessionsResponse)(nil), "bio.bgp.ListSessionsResponse")
 }
 
-func init() {
-	proto.RegisterFile("protocols/bgp/server/api/bgp.proto", fileDescriptor_bgp_d327b15a3107b32f)
-}
-
-var fileDescriptor_bgp_d327b15a3107b32f = []byte{
-	// 207 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2a, 0x28, 0xca, 0x2f,
-	0xc9, 0x4f, 0xce, 0xcf, 0x29, 0xd6, 0x4f, 0x4a, 0x2f, 0xd0, 0x2f, 0x4e, 0x2d, 0x2a, 0x4b, 0x2d,
-	0xd2, 0x4f, 0x2c, 0xc8, 0x04, 0x71, 0xf5, 0xc0, 0x92, 0x42, 0xec, 0x49, 0x99, 0xf9, 0x7a, 0x49,
-	0xe9, 0x05, 0x52, 0x6a, 0x38, 0x15, 0x17, 0xa7, 0x16, 0x17, 0x67, 0xe6, 0xe7, 0x41, 0x34, 0x28,
-	0x99, 0x71, 0x09, 0xfb, 0x64, 0x16, 0x97, 0x04, 0x43, 0x04, 0x8b, 0x83, 0x52, 0x0b, 0x4b, 0x53,
-	0x8b, 0x4b, 0x84, 0xe4, 0xb9, 0xb8, 0xf3, 0x12, 0x73, 0x53, 0xe3, 0xd3, 0x32, 0x73, 0x4a, 0x52,
-	0x8b, 0x24, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0xb8, 0x40, 0x42, 0x6e, 0x60, 0x11, 0x25, 0x17,
-	0x2e, 0x11, 0x54, 0x7d, 0xc5, 0x05, 0xf9, 0x79, 0xc5, 0xa9, 0x42, 0x3a, 0x5c, 0x1c, 0x50, 0x0b,
-	0x8a, 0x25, 0x18, 0x15, 0x98, 0x35, 0xb8, 0x8d, 0x04, 0xf4, 0xa0, 0x6e, 0xd2, 0x83, 0x2a, 0x0e,
-	0x82, 0xab, 0x30, 0x8a, 0xe6, 0xe2, 0x72, 0x4a, 0x2f, 0x08, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e,
-	0x15, 0xf2, 0xe5, 0xe2, 0x41, 0x36, 0x53, 0x48, 0x06, 0xae, 0x13, 0x8b, 0x13, 0xa5, 0x64, 0x71,
-	0xc8, 0x42, 0x1c, 0xa2, 0xc4, 0xe0, 0x24, 0x15, 0x25, 0x81, 0x2b, 0x10, 0x92, 0xd8, 0xc0, 0x32,
-	0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x66, 0x7d, 0xcb, 0xda, 0x54, 0x01, 0x00, 0x00,
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// BgpServiceClient is the client API for BgpService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type BgpServiceClient interface {
+	ListSessions(ctx context.Context, in *ListSessionsRequest, opts ...grpc.CallOption) (*ListSessionsResponse, error)
+}
+
+type bgpServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewBgpServiceClient(cc *grpc.ClientConn) BgpServiceClient {
+	return &bgpServiceClient{cc}
+}
+
+func (c *bgpServiceClient) ListSessions(ctx context.Context, in *ListSessionsRequest, opts ...grpc.CallOption) (*ListSessionsResponse, error) {
+	out := new(ListSessionsResponse)
+	err := c.cc.Invoke(ctx, "/bio.bgp.BgpService/ListSessions", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// BgpServiceServer is the server API for BgpService service.
+type BgpServiceServer interface {
+	ListSessions(context.Context, *ListSessionsRequest) (*ListSessionsResponse, error)
+}
+
+func RegisterBgpServiceServer(s *grpc.Server, srv BgpServiceServer) {
+	s.RegisterService(&_BgpService_serviceDesc, srv)
+}
+
+func _BgpService_ListSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListSessionsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BgpServiceServer).ListSessions(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/bio.bgp.BgpService/ListSessions",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BgpServiceServer).ListSessions(ctx, req.(*ListSessionsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _BgpService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "bio.bgp.BgpService",
+	HandlerType: (*BgpServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListSessions",
+			Handler:    _BgpService_ListSessions_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "protocols/bgp/api/bgp.proto",
+}
+
+func init() { proto.RegisterFile("protocols/bgp/api/bgp.proto", fileDescriptor_bgp_27982cf497b45c6f) }
+
+var fileDescriptor_bgp_27982cf497b45c6f = []byte{
+	// 199 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2e, 0x28, 0xca, 0x2f,
+	0xc9, 0x4f, 0xce, 0xcf, 0x29, 0xd6, 0x4f, 0x4a, 0x2f, 0xd0, 0x4f, 0x2c, 0xc8, 0x04, 0xd1, 0x7a,
+	0x60, 0x51, 0x21, 0xf6, 0xa4, 0xcc, 0x7c, 0xbd, 0xa4, 0xf4, 0x02, 0x29, 0x79, 0x4c, 0x55, 0xc5,
+	0xa9, 0xc5, 0xc5, 0x99, 0xf9, 0x79, 0x10, 0x95, 0x4a, 0x66, 0x5c, 0xc2, 0x3e, 0x99, 0xc5, 0x25,
+	0xc1, 0x10, 0xc1, 0xe2, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2, 0x12, 0x21, 0x79, 0x2e, 0xee, 0xbc,
+	0xc4, 0xdc, 0xd4, 0xf8, 0xb4, 0xcc, 0x9c, 0x92, 0xd4, 0x22, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce,
+	0x20, 0x2e, 0x90, 0x90, 0x1b, 0x58, 0x44, 0xc9, 0x85, 0x4b, 0x04, 0x55, 0x5f, 0x71, 0x41, 0x7e,
+	0x5e, 0x71, 0xaa, 0x90, 0x0e, 0x17, 0x07, 0xd4, 0x82, 0x62, 0x09, 0x46, 0x05, 0x66, 0x0d, 0x6e,
+	0x23, 0x01, 0x3d, 0xa8, 0x63, 0xf4, 0xa0, 0x8a, 0x83, 0xe0, 0x2a, 0x8c, 0xa2, 0xb9, 0xb8, 0x9c,
+	0xd2, 0x0b, 0x82, 0x53, 0x8b, 0xca, 0x32, 0x93, 0x53, 0x85, 0x7c, 0xb9, 0x78, 0x90, 0xcd, 0x14,
+	0x92, 0x81, 0xeb, 0xc4, 0xe2, 0x44, 0x29, 0x59, 0x1c, 0xb2, 0x10, 0x87, 0x28, 0x31, 0x38, 0x09,
+	0x47, 0x09, 0x62, 0xf8, 0x3e, 0x89, 0x0d, 0x2c, 0x64, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xc1,
+	0xcb, 0x4d, 0xd2, 0x3f, 0x01, 0x00, 0x00,
 }
diff --git a/protocols/bgp/server/bgp_api.go b/protocols/bgp/server/bgp_api.go
new file mode 100644
index 0000000000000000000000000000000000000000..abb4e431abd516750a5a1e5e2b77073c236b8f9e
--- /dev/null
+++ b/protocols/bgp/server/bgp_api.go
@@ -0,0 +1 @@
+package server