diff --git a/impl/google/rpc/util.go b/impl/google/rpc/util.go
index a7c7ead..b87812a 100644
--- a/impl/google/rpc/util.go
+++ b/impl/google/rpc/util.go
@@ -122,23 +122,39 @@
 		eps[i] = ep.String()
 	}
 
-	// Create Java array of proxies.
-	proxarr := make([]jutil.Object, len(status.Proxies))
-	for i, proxy := range status.Proxies {
-		var err error
-		if proxarr[i], err = JavaProxyStatus(env, proxy); err != nil {
+	lnErrors := make(map[jutil.Object]jutil.Object)
+	for addr, lerr := range status.ListenErrors {
+		jAddr, err := JavaListenAddr(env, addr.Protocol, addr.Address)
+		if err != nil {
 			return jutil.NullObject, err
 		}
+		jVExp, err := jutil.JVException(env, lerr)
+		if err != nil {
+			return jutil.NullObject, err
+		}
+		lnErrors[jAddr] = jVExp
 	}
-	jProxies, err := jutil.JObjectArray(env, proxarr, jProxyStatusClass)
+	jLnErrors, err := jutil.JObjectMap(env, lnErrors)
+	if err != nil {
+		return jutil.NullObject, err
+	}
+
+	proxyErrors := make(map[jutil.Object]jutil.Object)
+	for s, perr := range status.ProxyErrors {
+		jVExp, err := jutil.JVException(env, perr)
+		if err != nil {
+			return jutil.NullObject, err
+		}
+		proxyErrors[jutil.JString(env, s)] = jVExp
+	}
+	jProxyErrors, err := jutil.JObjectMap(env, proxyErrors)
 	if err != nil {
 		return jutil.NullObject, err
 	}
 
 	// Create final server status.
 	mountStatusSign := jutil.ClassSign("io.v.v23.rpc.MountStatus")
-	proxyStatusSign := jutil.ClassSign("io.v.v23.rpc.ProxyStatus")
-	jServerStatus, err := jutil.NewObject(env, jServerStatusClass, []jutil.Sign{serverStateSign, jutil.BoolSign, jutil.ArraySign(mountStatusSign), jutil.ArraySign(jutil.StringSign), jutil.ArraySign(proxyStatusSign)}, jState, status.ServesMountTable, jMounts, eps, jProxies)
+	jServerStatus, err := jutil.NewObject(env, jServerStatusClass, []jutil.Sign{serverStateSign, jutil.BoolSign, jutil.ArraySign(mountStatusSign), jutil.ArraySign(jutil.StringSign), jutil.MapSign, jutil.MapSign}, jState, status.ServesMountTable, jMounts, eps, jLnErrors, jProxyErrors)
 	if err != nil {
 		return jutil.NullObject, err
 	}
@@ -176,16 +192,6 @@
 	return jStatus, nil
 }
 
-// JavaProxyStatus converts the provided rpc.ProxyStatus value into a Java
-// ProxyStatus object.
-func JavaProxyStatus(env jutil.Env, status rpc.ProxyStatus) (jutil.Object, error) {
-	jStatus, err := jutil.NewObject(env, jProxyStatusClass, []jutil.Sign{jutil.StringSign, jutil.StringSign, jutil.VExceptionSign}, status.Proxy, status.Endpoint.String(), status.Error)
-	if err != nil {
-		return jutil.NullObject, err
-	}
-	return jStatus, nil
-}
-
 // GoListenSpec converts the provided Java ListenSpec into a Go ListenSpec.
 func GoListenSpec(env jutil.Env, jSpec jutil.Object) (rpc.ListenSpec, error) {
 	jAddrs, err := jutil.CallObjectMethod(env, jSpec, "getAddresses", nil, jutil.ArraySign(listenAddrSign))
@@ -230,13 +236,17 @@
 	return jSpec, nil
 }
 
+func JavaListenAddr(env jutil.Env, protocol, address string) (jutil.Object, error) {
+	return jutil.NewObject(env, jListenSpecAddressClass, []jutil.Sign{jutil.StringSign, jutil.StringSign}, protocol, address)
+}
+
 // JavaListenAddrArray converts Go rpc.ListenAddrs into a Java
 // ListenSpec$Address array.
 func JavaListenAddrArray(env jutil.Env, addrs rpc.ListenAddrs) (jutil.Object, error) {
 	addrarr := make([]jutil.Object, len(addrs))
 	for i, addr := range addrs {
 		var err error
-		if addrarr[i], err = jutil.NewObject(env, jListenSpecAddressClass, []jutil.Sign{jutil.StringSign, jutil.StringSign}, addr.Protocol, addr.Address); err != nil {
+		if addrarr[i], err = JavaListenAddr(env, addr.Protocol, addr.Address); err != nil {
 			return jutil.NullObject, err
 		}
 	}
