diff --git a/impl/google/rpc/protocols/bt/bt_android.go b/impl/google/rpc/protocols/bt/bt_android.go
index eb4a360..b91090e 100644
--- a/impl/google/rpc/protocols/bt/bt_android.go
+++ b/impl/google/rpc/protocols/bt/bt_android.go
@@ -7,13 +7,12 @@
 package bt
 
 import (
-	"fmt"
 	"net"
 	"runtime"
 	"time"
 
 	"v.io/v23/context"
-	"v.io/v23/rpc"
+	"v.io/v23/flow"
 
 	jutil "v.io/x/jni/util"
 )
@@ -37,11 +36,13 @@
 	if err != nil {
 		return err
 	}
-	rpc.RegisterProtocol("bt", dialFunc, resolveFunc, listenFunc)
+	flow.RegisterProtocol("bt", btProtocol{})
 	return nil
 }
 
-func dialFunc(ctx *context.T, protocol, address string, timeout time.Duration) (net.Conn, error) {
+type btProtocol struct{}
+
+func (btProtocol) Dial(ctx *context.T, protocol, address string, timeout time.Duration) (flow.Conn, error) {
 	env, freeFunc := jutil.GetEnv()
 	defer freeFunc()
 	jConnection, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "dial", []jutil.Sign{jutil.StringSign, jutil.DurationSign}, connectionSign, address, timeout)
@@ -51,11 +52,11 @@
 	return newConnection(env, jConnection), nil
 }
 
-func resolveFunc(ctx *context.T, protocol, address string) (string, string, error) {
+func (btProtocol) Resolve(ctx *context.T, protocol, address string) (string, string, error) {
 	return protocol, address, nil
 }
 
-func listenFunc(ctx *context.T, protocol, address string) (net.Listener, error) {
+func (btProtocol) Listen(ctx *context.T, protocol, address string) (flow.Listener, error) {
 	env, freeFunc := jutil.GetEnv()
 	defer freeFunc()
 	jListener, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "listen", []jutil.Sign{jutil.StringSign}, listenerSign, address)
@@ -65,8 +66,8 @@
 	return newListener(env, jListener), nil
 }
 
-func newListener(env jutil.Env, jListener jutil.Object) net.Listener {
-	// Reference Java Listener; it will be de-referenced when the Go net.Listener
+func newListener(env jutil.Env, jListener jutil.Object) flow.Listener {
+	// Reference Java Listener; it will be de-referenced when the Go Listener
 	// created below is garbage-collected (through the finalizer callback we
 	// setup just below).
 	jListener = jutil.NewGlobalRef(env, jListener)
@@ -83,7 +84,7 @@
 	jListener jutil.Object
 }
 
-func (l *btListener) Accept() (net.Conn, error) {
+func (l *btListener) Accept(ctx *context.T) (flow.Conn, error) {
 	env, freeFunc := jutil.GetEnv()
 	defer freeFunc()
 	jConn, err := jutil.CallObjectMethod(env, l.jListener, "accept", nil, connectionSign)
@@ -109,8 +110,8 @@
 	return jutil.CallVoidMethod(env, l.jListener, "close", nil)
 }
 
-func newConnection(env jutil.Env, jConnection jutil.Object) net.Conn {
-	// Reference Java Connection; it will be de-referenced when the Go net.Conn
+func newConnection(env jutil.Env, jConnection jutil.Object) flow.Conn {
+	// Reference Java Connection; it will be de-referenced when the Go Conn
 	// created below is garbage-collected (through the finalizer callback we
 	// setup just below).
 	jConnection = jutil.NewGlobalRef(env, jConnection)
@@ -127,23 +128,23 @@
 	jConnection jutil.Object
 }
 
-func (c *btConn) Read(b []byte) (n int, err error) {
+func (c *btConn) ReadMsg() ([]byte, error) {
 	env, freeFunc := jutil.GetEnv()
 	defer freeFunc()
-	data, err := jutil.CallByteArrayMethod(env, c.jConnection, "read", []jutil.Sign{jutil.IntSign}, len(b))
-	if err != nil {
-		return 0, err
-	}
-	return copy(b, data), nil
+	return jutil.CallByteArrayMethod(env, c.jConnection, "read", nil)
 }
 
-func (c *btConn) Write(b []byte) (n int, err error) {
+func (c *btConn) WriteMsg(bs ...[]byte) (n int, err error) {
 	env, freeFunc := jutil.GetEnv()
 	defer freeFunc()
-	if err := jutil.CallVoidMethod(env, c.jConnection, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
-		return 0, err
+	total := 0
+	for _, b := range bs {
+		if err := jutil.CallVoidMethod(env, c.jConnection, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
+			return 0, err
+		}
+		total += len(b)
 	}
-	return len(b), nil
+	return total, nil
 }
 
 func (c *btConn) Close() error {
@@ -162,28 +163,6 @@
 	return &btAddr{addr}
 }
 
-func (c *btConn) RemoteAddr() net.Addr {
-	env, freeFunc := jutil.GetEnv()
-	defer freeFunc()
-	addr, err := jutil.CallStringMethod(env, c.jConnection, "localAddress", nil)
-	if err != nil {
-		return &btAddr{""}
-	}
-	return &btAddr{addr}
-}
-
-func (*btConn) SetDeadline(t time.Time) error {
-	return fmt.Errorf("SetDeadline() not implemented for bluetooth connections.")
-}
-
-func (*btConn) SetReadDeadline(t time.Time) error {
-	return fmt.Errorf("SetReadDeadline() not implemented for bluetooth connections.")
-}
-
-func (*btConn) SetWriteDeadline(t time.Time) error {
-	return fmt.Errorf("SetWriteDeadline() not implemented for bluetooth connections.")
-}
-
 type btAddr struct {
 	addr string
 }
