diff --git a/impl/google/rpc/jni.go b/impl/google/rpc/jni.go
index dab6c3b..71b7816 100644
--- a/impl/google/rpc/jni.go
+++ b/impl/google/rpc/jni.go
@@ -18,7 +18,6 @@
 	"v.io/v23/vdl"
 	"v.io/v23/vom"
 
-	jchannel "v.io/x/jni/impl/google/channel"
 	jbt "v.io/x/jni/impl/google/rpc/protocols/bt"
 	jutil "v.io/x/jni/util"
 	jcontext "v.io/x/jni/v23/context"
@@ -66,8 +65,6 @@
 	jMountStatusClass jutil.Class
 	// Global reference for io.v.v23.rpc.NetworkAddress class.
 	jNetworkAddressClass jutil.Class
-	// Global reference for io.v.v23.rpc.NetworkChange class.
-	jNetworkChangeClass jutil.Class
 	// Global reference for io.v.v23.rpc.ProxyStatus class.
 	jProxyStatusClass jutil.Class
 	// Global reference for io.v.v23.rpc.ReflectInvoker class.
@@ -154,10 +151,6 @@
 	if err != nil {
 		return err
 	}
-	jNetworkChangeClass, err = jutil.JFindClass(env, "io/v/v23/rpc/NetworkChange")
-	if err != nil {
-		return err
-	}
 	jProxyStatusClass, err = jutil.JFindClass(env, "io/v/v23/rpc/ProxyStatus")
 	if err != nil {
 		return err
@@ -234,46 +227,6 @@
 	return C.jobject(unsafe.Pointer(jStatus))
 }
 
-//export Java_io_v_impl_google_rpc_ServerImpl_nativeWatchNetwork
-func Java_io_v_impl_google_rpc_ServerImpl_nativeWatchNetwork(jenv *C.JNIEnv, jServer C.jobject, goPtr C.jlong) C.jobject {
-	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
-	networkChan := make(chan rpc.NetworkChange, 100)
-	(*(*rpc.Server)(jutil.NativePtr(goPtr))).WatchNetwork(networkChan)
-	retChan := make(chan jutil.Object, 100)
-	go func() {
-		for change := range networkChan {
-			env, freeFunc := jutil.GetEnv()
-			jChange, err := JavaNetworkChange(env, change)
-			if err != nil {
-				freeFunc()
-				continue
-			}
-			jChange = jutil.NewGlobalRef(env, jChange)
-			freeFunc()
-			retChan <- jChange
-		}
-		close(retChan)
-	}()
-	jIterable, err := jchannel.JavaIterable(env, &retChan, &networkChan)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(unsafe.Pointer(jIterable))
-}
-
-//export Java_io_v_impl_google_rpc_ServerImpl_nativeUnwatchNetwork
-func Java_io_v_impl_google_rpc_ServerImpl_nativeUnwatchNetwork(jenv *C.JNIEnv, jServer C.jobject, goPtr C.jlong, jChannelIterable C.jobject) {
-	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
-	goNetworkChanPtr, err := jutil.CallLongMethod(env, jutil.Object(uintptr(unsafe.Pointer(jChannelIterable))), "getSourceNativePtr", nil)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return
-	}
-	networkChan := *(*chan rpc.NetworkChange)(unsafe.Pointer(uintptr(goNetworkChanPtr)))
-	(*(*rpc.Server)(jutil.NativePtr(goPtr))).UnwatchNetwork(networkChan)
-}
-
 //export Java_io_v_impl_google_rpc_ServerImpl_nativeStop
 func Java_io_v_impl_google_rpc_ServerImpl_nativeStop(jenv *C.JNIEnv, jServer C.jobject, goPtr C.jlong) {
 	env := jutil.Env(uintptr(unsafe.Pointer(jenv)))
diff --git a/impl/google/rpc/util.go b/impl/google/rpc/util.go
index a2f5df3..a7c7ead 100644
--- a/impl/google/rpc/util.go
+++ b/impl/google/rpc/util.go
@@ -265,36 +265,6 @@
 	return addrs, nil
 }
 
-// JavaNetworkChange converts the Go NetworkChange value into a Java NetworkChange object.
-func JavaNetworkChange(env jutil.Env, change rpc.NetworkChange) (jutil.Object, error) {
-	jTime, err := jutil.JTime(env, change.Time)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	jState, err := JavaServerState(env, change.State)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	jAddedAddrs, err := JavaNetworkAddressArray(env, change.AddedAddrs)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	jRemovedAddrs, err := JavaNetworkAddressArray(env, change.RemovedAddrs)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	changedEndpointStrs := make([]string, len(change.Changed))
-	for i, ep := range change.Changed {
-		changedEndpointStrs[i] = fmt.Sprintf("%v", ep)
-	}
-	addrSign := jutil.ClassSign("io.v.v23.rpc.NetworkAddress")
-	jNetworkChange, err := jutil.NewObject(env, jNetworkChangeClass, []jutil.Sign{jutil.DateTimeSign, serverStateSign, jutil.ArraySign(addrSign), jutil.ArraySign(addrSign), jutil.ArraySign(jutil.StringSign), jutil.VExceptionSign}, jTime, jState, jAddedAddrs, jRemovedAddrs, changedEndpointStrs, change.Error)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	return jNetworkChange, nil
-}
-
 // JavaServerCall converts a Go rpc.ServerCall into a Java ServerCall object.
 func JavaServerCall(env jutil.Env, serverCall rpc.ServerCall) (jutil.Object, error) {
 	jServerCall, err := jutil.NewObject(env, jServerCallImplClass, []jutil.Sign{jutil.LongSign}, int64(jutil.PtrValue(&serverCall)))
