Merge "switch to go1.4"
diff --git a/lib/modules/core/core.go b/lib/modules/core/core.go
index a3a889c..0a49e3e 100644
--- a/lib/modules/core/core.go
+++ b/lib/modules/core/core.go
@@ -5,7 +5,8 @@
 //
 // root
 //   runs a root mount table as a subprocess
-//   prints the MT_NAME=<root name>, PID=<pid> variables to stdout
+//   prints the PID=<pid> variable to stdout followed by
+//   an arbitrary number of MT_NAME and MT_ADDR variables.
 //   waits for stdin to be closed before it exits
 //   prints "done" to stdout when stdin is closed.
 // mt <mp>
@@ -40,7 +41,9 @@
 //
 // echoServer <message> <name>
 //    runs on echoServer at <name>, it will echo back <message>: <text>
-//    where <text> is supplied by the client
+//    where <text> is supplied by the client. It prints the PID=<pid>
+//    variable to stdout followd by an arbitrary number of NAME, ADDR
+//    variables.
 // echoClient <name> <text>
 //    invoke <name>.Echo(<text>)
 //
diff --git a/lib/modules/core/core_test.go b/lib/modules/core/core_test.go
index cd9e26b..f00a65a 100644
--- a/lib/modules/core/core_test.go
+++ b/lib/modules/core/core_test.go
@@ -34,6 +34,8 @@
 	testutil.Init()
 }
 
+// TODO(cnicolaou): add test for proxyd
+
 func newShell(t *testing.T) (*modules.Shell, func()) {
 	sh, err := modules.NewShell(nil)
 	if err != nil {
@@ -62,9 +64,9 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	s := expect.NewSession(t, root.Stdout(), time.Second)
+	s.ExpectVar("PID")
 	s.ExpectVar("MT_NAME")
 	s.ExpectVar("MT_ADDR")
-	s.ExpectVar("PID")
 	root.CloseStdin()
 }
 
@@ -76,6 +78,7 @@
 	}
 	sh.Forget(root)
 	rootSession := expect.NewSession(t, root.Stdout(), time.Minute)
+	rootSession.ExpectVar("PID")
 	rootName := rootSession.ExpectVar("MT_NAME")
 	if t.Failed() {
 		return nil, nil, rootSession.Error()
@@ -93,6 +96,7 @@
 		s := expect.NewSession(t, h.Stdout(), time.Minute)
 		// Wait until each mount table has at least called Serve to
 		// mount itself.
+		s.ExpectVar("PID")
 		mountAddrs[mp] = s.ExpectVar("MT_NAME")
 		if s.Failed() {
 			return nil, nil, s.Error()
@@ -179,6 +183,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	srvSession := expect.NewSession(t, srv.Stdout(), time.Minute)
+	srvSession.ExpectVar("PID")
 	name := srvSession.ExpectVar("NAME")
 	if len(name) == 0 {
 		t.Fatalf("failed to get name")
diff --git a/lib/modules/core/echo.go b/lib/modules/core/echo.go
index 5f82c34..c8c432c 100644
--- a/lib/modules/core/echo.go
+++ b/lib/modules/core/echo.go
@@ -68,16 +68,18 @@
 		return err
 	}
 	defer server.Stop()
-	ep, err := server.Listen(initListenSpec(fl))
+	eps, err := server.Listen(initListenSpec(fl))
 	if err != nil {
 		return err
 	}
 	if err := server.ServeDispatcher(mp, disp); err != nil {
 		return err
 	}
-	fmt.Fprintf(stdout, "NAME=%s\n", naming.JoinAddressName(ep.String(), ""))
-	fmt.Fprintf(stdout, "ADDR=%s\n", ep.String())
 	fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+	for _, ep := range eps {
+		fmt.Fprintf(stdout, "NAME=%s\n", naming.JoinAddressName(ep.String(), ""))
+		fmt.Fprintf(stdout, "ADDR=%s\n", ep)
+	}
 	modules.WaitForEOF(stdin)
 	return nil
 }
diff --git a/lib/modules/core/mounttable.go b/lib/modules/core/mounttable.go
index 066cf10..26a65e3 100644
--- a/lib/modules/core/mounttable.go
+++ b/lib/modules/core/mounttable.go
@@ -58,17 +58,19 @@
 	if err != nil {
 		return fmt.Errorf("mounttable.NewMountTable failed: %s", err)
 	}
-	ep, err := server.Listen(lspec)
+	eps, err := server.Listen(lspec)
 	if err != nil {
 		return fmt.Errorf("server.Listen failed: %s", err)
 	}
 	if err := server.ServeDispatcher(mp, mt); err != nil {
 		return fmt.Errorf("root failed: %s", err)
 	}
-	name := naming.JoinAddressName(ep.String(), "")
-	fmt.Fprintf(stdout, "MT_NAME=%s\n", name)
-	fmt.Fprintf(stdout, "MT_ADDR=%s\n", ep.String())
 	fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+	for _, ep := range eps {
+		name := naming.JoinAddressName(ep.String(), "")
+		fmt.Fprintf(stdout, "MT_NAME=%s\n", name)
+		fmt.Fprintf(stdout, "MT_ADDR=%s\n", ep.String())
+	}
 	modules.WaitForEOF(stdin)
 	return nil
 }
diff --git a/lib/modules/core/proxy.go b/lib/modules/core/proxy.go
index 3a46b47..4ec2a2c 100644
--- a/lib/modules/core/proxy.go
+++ b/lib/modules/core/proxy.go
@@ -3,6 +3,7 @@
 import (
 	"fmt"
 	"io"
+	"os"
 	"time"
 
 	"veyron.io/veyron/veyron2/naming"
@@ -40,6 +41,7 @@
 	defer proxy.Shutdown()
 
 	pname := naming.JoinAddressName(proxy.Endpoint().String(), "")
+	fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
 	fmt.Fprintf(stdout, "PROXY_ADDR=%s\n", proxy.Endpoint().String())
 	fmt.Fprintf(stdout, "PROXY_NAME=%s\n", pname)
 	if expected > 0 {
diff --git a/lib/signals/signals_test.go b/lib/signals/signals_test.go
index 693e425..635bac8 100644
--- a/lib/signals/signals_test.go
+++ b/lib/signals/signals_test.go
@@ -323,14 +323,14 @@
 		t.Fatalf("Got error: %v", err)
 	}
 	ch := make(chan string)
-	var ep naming.Endpoint
+	var ep []naming.Endpoint
 	if ep, err = server.Listen(profiles.LocalListenSpec); err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
 	if err := server.Serve("", device.ConfigServer(&configServer{ch}), vflag.NewAuthorizerOrDie()); err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
-	return server, naming.JoinAddressName(ep.String(), ""), ch
+	return server, naming.JoinAddressName(ep[0].String(), ""), ch
 
 }
 
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 05ab2e2..b535576 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -62,6 +62,10 @@
 		return nil, "", err
 	}
 	s := expect.NewSession(nil, handle.Stdout(), time.Second)
+	s.ExpectVar("PID")
+	if err := s.Error(); err != nil {
+		return nil, "", err
+	}
 	name := s.ExpectVar("MT_NAME")
 	if err := s.Error(); err != nil {
 		return nil, "", err
@@ -70,10 +74,7 @@
 	if err := s.Error(); err != nil {
 		return nil, "", err
 	}
-	s.ExpectVar("PID")
-	if err := s.Error(); err != nil {
-		return nil, "", err
-	}
+
 	return handle, name, nil
 }
 
diff --git a/lib/testutil/security/util_test.go b/lib/testutil/security/util_test.go
index 67bf51e..06fc209 100644
--- a/lib/testutil/security/util_test.go
+++ b/lib/testutil/security/util_test.go
@@ -30,15 +30,11 @@
 		fmt.Errorf("got principal from directory: %v, want: %v", pFromCred, wantPrincipal)
 	}
 
-	// TODO(ashankar,ataly): Extract blessings using the principal.BlessingInfo API
-	// instead of blessings.ForContext.
-	ctx := security.NewContext(&security.ContextParams{
-		LocalPrincipal: pFromCred,
-	})
-	if got := pFromCred.BlessingStore().ForPeer("foo").ForContext(ctx); !unsortedEquals(got, wantBlessings) {
+	bs := pFromCred.BlessingStore()
+	if got := pFromCred.BlessingsInfo(bs.ForPeer("foo")); !unsortedEquals(got, wantBlessings) {
 		return fmt.Errorf("got peer blessings: %v, want: %v", got, wantBlessings)
 	}
-	if got := pFromCred.BlessingStore().Default().ForContext(ctx); !unsortedEquals(got, wantBlessings) {
+	if got := pFromCred.BlessingsInfo(bs.Default()); !unsortedEquals(got, wantBlessings) {
 		return fmt.Errorf("got default blessings: %v, want: %v", got, wantBlessings)
 	}
 	return nil
diff --git a/runtimes/google/ipc/benchmarks/server.go b/runtimes/google/ipc/benchmarks/server.go
index 44a5d4e..879ca54 100644
--- a/runtimes/google/ipc/benchmarks/server.go
+++ b/runtimes/google/ipc/benchmarks/server.go
@@ -36,7 +36,7 @@
 	if err != nil {
 		vlog.Fatalf("NewServer failed: %v", err)
 	}
-	ep, err := server.Listen(listenSpec)
+	eps, err := server.Listen(listenSpec)
 	if err != nil {
 		vlog.Fatalf("Listen failed: %v", err)
 	}
@@ -44,7 +44,7 @@
 	if err := server.Serve("", BenchmarkServer(&impl{}), sflag.NewAuthorizerOrDie()); err != nil {
 		vlog.Fatalf("Serve failed: %v", err)
 	}
-	return naming.JoinAddressName(ep.String(), ""), func() {
+	return naming.JoinAddressName(eps[0].String(), ""), func() {
 		if err := server.Stop(); err != nil {
 			vlog.Fatalf("Stop() failed: %v", err)
 		}
diff --git a/runtimes/google/ipc/client_test.go b/runtimes/google/ipc/client_test.go
index e8fb20f..2499915 100644
--- a/runtimes/google/ipc/client_test.go
+++ b/runtimes/google/ipc/client_test.go
@@ -51,6 +51,7 @@
 	sh.Forget(root)
 
 	rootSession := expect.NewSession(t, root.Stdout(), time.Minute)
+	rootSession.ExpectVar("PID")
 	rootName := rootSession.ExpectVar("MT_NAME")
 	if t.Failed() {
 		t.Fatalf("%s", rootSession.Error())
@@ -105,6 +106,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	s := expect.NewSession(t, srv.Stdout(), time.Minute)
+	s.ExpectVar("PID")
 	s.ExpectVar("NAME")
 
 	// Verify that there are 1 entries for echoServer in the mount table.
@@ -182,12 +184,12 @@
 	done := make(chan struct{})
 	deferFn := func() { close(done); server.Stop() }
 
-	ep, err := server.Listen(profiles.LocalListenSpec)
+	eps, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
 	}
 	server.Serve("", &simple{done}, nil)
-	name := naming.JoinAddressName(ep.String(), "")
+	name := naming.JoinAddressName(eps[0].String(), "")
 	return name, deferFn
 }
 
@@ -219,7 +221,7 @@
 	ctx, _ := r.NewContext().WithTimeout(100 * time.Millisecond)
 	call, err := r.Client().StartCall(ctx, name, "Sleep", nil)
 	if err != nil {
-		testForVerror(t, err, verror.Timeout)
+		testForVerror(t, err, verror.Timeout, verror.BadProtocol)
 		return
 	}
 	verr := call.Finish(&err)
@@ -315,6 +317,7 @@
 		time.Sleep(10 * time.Millisecond)
 		srv, _ := sh.Start(core.EchoServerCommand, nil, testArgs("message", name)...)
 		s := expect.NewSession(t, srv.Stdout(), time.Minute)
+		s.ExpectVar("PID")
 		s.ExpectVar("NAME")
 	}
 	go startServer()
diff --git a/runtimes/google/ipc/debug_test.go b/runtimes/google/ipc/debug_test.go
index 8b2cacf..966952f 100644
--- a/runtimes/google/ipc/debug_test.go
+++ b/runtimes/google/ipc/debug_test.go
@@ -43,7 +43,7 @@
 	}
 	defer server.Stop()
 	server.Serve("", &testObject{}, nil)
-	ep, err := server.Listen(listenSpec)
+	eps, err := server.Listen(listenSpec)
 	if err != nil {
 		t.Fatalf("server.Listen failed: %v", err)
 	}
@@ -53,6 +53,7 @@
 	}
 	defer client.Close()
 	ctx := testContext()
+	ep := eps[0]
 	// Call the Foo method on ""
 	{
 		addr := naming.JoinAddressName(ep.String(), "")
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 729b8c6..746b578 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -202,7 +202,7 @@
 	if err := server.AddName(name); err != nil {
 		t.Errorf("server.AddName for discharger failed: %v", err)
 	}
-	return ep, server
+	return ep[0], server
 }
 
 func loc(d int) string {
@@ -245,7 +245,7 @@
 
 	// Check that we can no longer serve after Stop.
 	err := server.AddName("name doesn't matter")
-	if err == nil || err.Error() != "ipc: server is stopped" {
+	if err == nil || !verror.Is(err, verror.BadState.ID) {
 		t.Errorf("either no error, or a wrong error was returned: %v", err)
 	}
 	vlog.VI(1).Info("server.Stop DONE")
@@ -772,7 +772,7 @@
 		t.Fatal(err)
 	}
 	defer appServer.Stop()
-	ep, err := appServer.Listen(listenSpec)
+	eps, err := appServer.Listen(listenSpec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -791,7 +791,7 @@
 	// can go away, but till then, this workaround allows the test to be
 	// more predictable by ensuring there is only one VIF/VC/Flow to the
 	// server.
-	object := naming.JoinAddressName(ep.String(), "object") // instead of "mountpoint/object"
+	object := naming.JoinAddressName(eps[0].String(), "object") // instead of "mountpoint/object"
 	if err := appServer.Serve("mountpoint/object", &testServer{}, &testServerAuthorizer{}); err != nil {
 		t.Fatal(err)
 	}
@@ -1231,15 +1231,16 @@
 		t.Errorf("InternalNewServer failed: %v", err)
 	}
 	defer server.Stop()
+
 	spec := ipc.ListenSpec{
 		Addrs:          ipc.ListenAddrs{{"tcp", ":0"}},
 		AddressChooser: pa,
 	}
-	ep, err := server.Listen(spec)
+	eps, err := server.Listen(spec)
 	if err != nil {
 		t.Errorf("unexpected error: %s", err)
 	}
-	iep := ep.(*inaming.Endpoint)
+	iep := eps[0].(*inaming.Endpoint)
 	host, _, err := net.SplitHostPort(iep.Address)
 	if err != nil {
 		t.Errorf("unexpected error: %s", err)
@@ -1248,8 +1249,8 @@
 		t.Errorf("got %q, want %q", got, want)
 	}
 	// Won't override the specified address.
-	ep, err = server.Listen(listenSpec)
-	iep = ep.(*inaming.Endpoint)
+	eps, err = server.Listen(listenSpec)
+	iep = eps[0].(*inaming.Endpoint)
 	host, _, err = net.SplitHostPort(iep.Address)
 	if err != nil {
 		t.Errorf("unexpected error: %s", err)
@@ -1275,8 +1276,8 @@
 		Addrs:          ipc.ListenAddrs{{"tcp", ":0"}},
 		AddressChooser: paerr,
 	}
-	ep, err := server.Listen(spec)
-	iep := ep.(*inaming.Endpoint)
+	eps, err := server.Listen(spec)
+	iep := eps[0].(*inaming.Endpoint)
 	host, _, err := net.SplitHostPort(iep.Address)
 	if err != nil {
 		t.Errorf("unexpected error: %s", err)
diff --git a/runtimes/google/ipc/glob_test.go b/runtimes/google/ipc/glob_test.go
index cf2c0e4..3800b49 100644
--- a/runtimes/google/ipc/glob_test.go
+++ b/runtimes/google/ipc/glob_test.go
@@ -22,14 +22,14 @@
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start debug server: %v", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to listen: %v", err)
 	}
 	if err := server.ServeDispatcher("", &disp{tree}); err != nil {
 		return "", nil, err
 	}
-	ep := endpoint.String()
+	ep := endpoints[0].String()
 	return ep, func() { server.Stop() }, nil
 }
 
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 98b161e..692e1f4 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -17,7 +17,8 @@
 	"veyron.io/veyron/veyron2/options"
 	"veyron.io/veyron/veyron2/security"
 	"veyron.io/veyron/veyron2/services/security/access"
-	"veyron.io/veyron/veyron2/verror"
+	old_verror "veyron.io/veyron/veyron2/verror"
+	verror "veyron.io/veyron/veyron2/verror2"
 	"veyron.io/veyron/veyron2/vlog"
 	"veyron.io/veyron/veyron2/vom"
 	"veyron.io/veyron/veyron2/vom2"
@@ -29,11 +30,15 @@
 	"veyron.io/veyron/veyron/runtimes/google/lib/publisher"
 	inaming "veyron.io/veyron/veyron/runtimes/google/naming"
 	ivtrace "veyron.io/veyron/veyron/runtimes/google/vtrace"
+
+	// TODO(cnicolaou): finish verror -> verror2 transition, in particular
+	// for communicating from server to client.
+	// TODO(cnicolaou): remove the vom1 code now that vom2 is in place.
 )
 
 var (
 	// TODO(cnicolaou): this should be BadState in verror2.
-	errServerStopped = verror.Abortedf("ipc: server is stopped")
+	errServerStopped = old_verror.Abortedf("ipc: server is stopped")
 )
 
 type server struct {
@@ -135,7 +140,7 @@
 	s.Lock()
 	defer s.Unlock()
 	if s.stopped {
-		return nil, errServerStopped
+		return nil, s.newBadState("ipc.Server.Stop already called")
 	}
 	return s.publisher.Published(), nil
 }
@@ -300,14 +305,65 @@
 }
 */
 
-func (s *server) Listen(listenSpec ipc.ListenSpec) (naming.Endpoint, error) {
+type listenError struct {
+	err    verror.E
+	errors map[struct{ Protocol, Address string }]error
+}
+
+func newError() *listenError {
+	return &listenError{errors: make(map[struct{ Protocol, Address string }]error)}
+}
+
+func ErrorDetails(le *listenError) map[struct{ Protocol, Address string }]error {
+	return le.errors
+}
+
+// Implements error
+func (le *listenError) Error() string {
+	s := le.err.Error()
+	for k, v := range le.errors {
+		s += fmt.Sprintf("(%s,%s:%s) ", k.Protocol, k.Address, v)
+	}
+	return strings.TrimRight(s, " ")
+}
+
+func (le *listenError) ErrorID() old_verror.ID {
+	return le.err.ErrorID()
+}
+
+func (le *listenError) Action() verror.ActionCode {
+	return le.err.Action()
+}
+
+func (le *listenError) Params() []interface{} {
+	return le.err.Params()
+}
+
+func (le *listenError) HasMessage() bool {
+	return le.err.HasMessage()
+}
+
+func (le *listenError) Stack() verror.PCs {
+	return le.err.Stack()
+}
+
+func (s *server) newBadState(m string) *listenError {
+	return &listenError{err: verror.Make(verror.BadState, s.ctx, m)}
+}
+
+func (s *server) newBadArg(m string) *listenError {
+	return &listenError{err: verror.Make(verror.BadArg, s.ctx, m)}
+}
+
+func (s *server) Listen(listenSpec ipc.ListenSpec) ([]naming.Endpoint, error) {
 	defer vlog.LogCall()()
 	s.Lock()
+
 	// Shortcut if the server is stopped, to avoid needlessly creating a
 	// listener.
 	if s.stopped {
 		s.Unlock()
-		return nil, errServerStopped
+		return nil, s.newBadState("ipc.Server.Stop already called")
 	}
 
 	useProxy := len(listenSpec.Proxy) > 0
@@ -410,11 +466,12 @@
 			s.active.Done()
 		}(li.ln, li.ep)
 	}
-	for _, iep := range ieps {
+	eps := make([]naming.Endpoint, len(ieps))
+	for i, iep := range ieps {
 		s.publisher.AddServer(naming.JoinAddressName(iep.String(), ""), s.servesMountTable)
+		eps[i] = iep
 	}
-
-	return ieps[0], nil
+	return eps, nil
 }
 
 func (s *server) reconnectAndPublishProxy(proxy string) (*inaming.Endpoint, stream.Listener, error) {
@@ -585,7 +642,7 @@
 	if obj == nil {
 		// The ReflectInvoker inside the LeafDispatcher will panic
 		// if called for a nil value.
-		return fmt.Errorf("A nil object is not allowed")
+		return s.newBadArg("nil object")
 	}
 	return s.ServeDispatcher(name, ipc.LeafDispatcher(obj, authorizer))
 }
@@ -596,13 +653,13 @@
 	ivtrace.FromContext(s.ctx).Annotate("Serving under name: " + name)
 
 	if s.stopped {
-		return errServerStopped
+		return s.newBadState("ipc.Server.Stop already called")
 	}
 	if disp == nil {
-		return fmt.Errorf("A nil dispacther is not allowed")
+		return s.newBadArg("nil dispatcher")
 	}
 	if s.disp != nil {
-		return fmt.Errorf("Serve or ServeDispatcher has already been called")
+		return s.newBadState("ipc.Server.Serve/ServeDispatcher already called")
 	}
 	s.disp = disp
 	s.names = make(map[string]struct{})
@@ -618,13 +675,13 @@
 	defer s.Unlock()
 	ivtrace.FromContext(s.ctx).Annotate("Serving under name: " + name)
 	if len(name) == 0 {
-		return fmt.Errorf("empty name")
+		return s.newBadArg("name is empty")
 	}
 	if s.stopped {
-		return errServerStopped
+		return s.newBadState("ipc.Server.Stop already called")
 	}
 	if s.disp == nil {
-		return fmt.Errorf("Adding name before calling Serve or ServeDispatcher is not allowed")
+		return s.newBadState("adding a name before calling Serve or ServeDispatcher is not allowed")
 	}
 	s.publisher.AddName(name)
 	// TODO(cnicolaou): remove this map when the publisher's RemoveName
@@ -638,13 +695,13 @@
 	defer s.Unlock()
 	ivtrace.FromContext(s.ctx).Annotate("Removed name: " + name)
 	if s.stopped {
-		return errServerStopped
+		return s.newBadState("ipc.Server.Stop already called")
 	}
 	if s.disp == nil {
-		return fmt.Errorf("Removing name before calling Serve or ServeDispatcher is not allowed")
+		return s.newBadState("removing name before calling Serve or ServeDispatcher is not allowed")
 	}
 	if _, present := s.names[name]; !present {
-		return fmt.Errorf("%q has not been previously used for this server", name)
+		return s.newBadArg(fmt.Sprintf("%q has not been previously used for this server", name))
 	}
 	s.publisher.RemoveName(name)
 	delete(s.names, name)
@@ -712,9 +769,12 @@
 	s.active.Wait()
 
 	s.Lock()
+	defer s.Unlock()
 	s.disp = nil
-	s.Unlock()
-	return firstErr
+	if firstErr != nil {
+		return verror.Make(verror.Internal, s.ctx, firstErr)
+	}
+	return nil
 }
 
 // TODO(toddw): Remove these interfaces after the vom2 transition.
@@ -792,14 +852,14 @@
 	v := vom.ValueOf(res)
 	if !v.IsValid() {
 		// Untyped nils are assumed to be nil-errors.
-		var boxed verror.E
+		var boxed old_verror.E
 		return vom.ValueOf(&boxed).Elem()
 	}
 	if err, iserr := res.(error); iserr {
 		// Convert errors to verror since errors are often not
 		// serializable via vom/gob (errors.New and fmt.Errorf return a
 		// type with no exported fields).
-		return vom.ValueOf(verror.Convert(err))
+		return vom.ValueOf(old_verror.Convert(err))
 	}
 	return v
 }
@@ -843,8 +903,7 @@
 		if err == io.EOF {
 			return err
 		}
-		// We'll close the flow 2x.
-		return verror.BadProtocolf("ipc: response encoding failed: %v", err)
+		return old_verror.BadProtocolf("ipc: response encoding failed: %v", err)
 	}
 	if response.Error != nil {
 		return response.Error
@@ -854,7 +913,7 @@
 			if err == io.EOF {
 				return err
 			}
-			return verror.BadProtocolf("ipc: result #%d [%T=%v] encoding failed: %v", ix, res, res, err)
+			return old_verror.BadProtocolf("ipc: result #%d [%T=%v] encoding failed: %v", ix, res, res, err)
 		}
 	}
 	// TODO(ashankar): Should unread data from the flow be drained?
@@ -873,7 +932,7 @@
 	return nil
 }
 
-func (fs *flowServer) readIPCRequest() (*ipc.Request, verror.E) {
+func (fs *flowServer) readIPCRequest() (*ipc.Request, old_verror.E) {
 	// Set a default timeout before reading from the flow. Without this timeout,
 	// a client that sends no request or a partial request will retain the flow
 	// indefinitely (and lock up server resources).
@@ -884,12 +943,12 @@
 	// Decode the initial request.
 	var req ipc.Request
 	if err := fs.dec.Decode(&req); err != nil {
-		return nil, verror.BadProtocolf("ipc: request decoding failed: %v", err)
+		return nil, old_verror.BadProtocolf("ipc: request decoding failed: %v", err)
 	}
 	return &req, nil
 }
 
-func (fs *flowServer) processRequest() ([]interface{}, verror.E) {
+func (fs *flowServer) processRequest() ([]interface{}, old_verror.E) {
 	fs.starttime = time.Now()
 	req, verr := fs.readIPCRequest()
 	if verr != nil {
@@ -930,14 +989,14 @@
 	argptrs, tags, err := invoker.Prepare(fs.method, numArgs)
 	fs.tags = tags
 	if err != nil {
-		return nil, verror.Makef(verror.ErrorID(err), "%s: name: %q", err, fs.suffix)
+		return nil, old_verror.Makef(old_verror.ErrorID(err), "%s: name: %q", err, fs.suffix)
 	}
 	if len(argptrs) != numArgs {
-		return nil, verror.BadProtocolf(fmt.Sprintf("ipc: wrong number of input arguments for method %q, name %q (called with %d args, expected %d)", fs.method, fs.suffix, numArgs, len(argptrs)))
+		return nil, old_verror.BadProtocolf(fmt.Sprintf("ipc: wrong number of input arguments for method %q, name %q (called with %d args, expected %d)", fs.method, fs.suffix, numArgs, len(argptrs)))
 	}
 	for ix, argptr := range argptrs {
 		if err := fs.dec.Decode(argptr); err != nil {
-			return nil, verror.BadProtocolf("ipc: arg %d decoding failed: %v", ix, err)
+			return nil, old_verror.BadProtocolf("ipc: arg %d decoding failed: %v", ix, err)
 		}
 	}
 	// Check application's authorization policy.
@@ -950,7 +1009,7 @@
 	// Invoke the method.
 	results, err := invoker.Invoke(fs.method, fs, argptrs)
 	fs.server.stats.record(fs.method, time.Since(fs.starttime))
-	return results, verror.Convert(err)
+	return results, old_verror.Convert(err)
 }
 
 func (fs *flowServer) cancelContextOnClose(cancel context.CancelFunc) {
@@ -973,7 +1032,7 @@
 // with ipc.DebugKeyword, we use the internal debug dispatcher to look up the
 // invoker. Otherwise, and we use the server's dispatcher. The suffix and method
 // value may be modified to match the actual suffix and method to use.
-func (fs *flowServer) lookup(suffix string, method *string) (ipc.Invoker, security.Authorizer, verror.E) {
+func (fs *flowServer) lookup(suffix string, method *string) (ipc.Invoker, security.Authorizer, old_verror.E) {
 	if naming.IsReserved(*method) {
 		// All reserved methods are trapped and handled here, by removing the
 		// reserved prefix and invoking them on reservedMethods.  E.g. "__Glob"
@@ -989,12 +1048,12 @@
 		obj, auth, err := disp.Lookup(suffix)
 		switch {
 		case err != nil:
-			return nil, nil, verror.Convert(err)
+			return nil, nil, old_verror.Convert(err)
 		case obj != nil:
 			return objectToInvoker(obj), auth, nil
 		}
 	}
-	return nil, nil, verror.NoExistf("ipc: invoker not found for %q", suffix)
+	return nil, nil, old_verror.NoExistf("ipc: invoker not found for %q", suffix)
 }
 
 func objectToInvoker(obj interface{}) ipc.Invoker {
@@ -1007,11 +1066,11 @@
 	return ipc.ReflectInvoker(obj)
 }
 
-func (fs *flowServer) initSecurity(req *ipc.Request) verror.E {
+func (fs *flowServer) initSecurity(req *ipc.Request) old_verror.E {
 	// If additional credentials are provided, make them available in the context
 	blessings, err := security.NewBlessings(req.GrantedBlessings)
 	if err != nil {
-		return verror.BadProtocolf("ipc: failed to decode granted blessings: %v", err)
+		return old_verror.BadProtocolf("ipc: failed to decode granted blessings: %v", err)
 	}
 	fs.blessings = blessings
 	// Detect unusable blessings now, rather then discovering they are unusable on
@@ -1022,13 +1081,13 @@
 	// this - should servers be able to assume that a blessing is something that
 	// does not have the authorizations that the server's own identity has?
 	if blessings != nil && !reflect.DeepEqual(blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey()) {
-		return verror.NoAccessf("ipc: blessing granted not bound to this server(%v vs %v)", blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey())
+		return old_verror.NoAccessf("ipc: blessing granted not bound to this server(%v vs %v)", blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey())
 	}
 	// Receive third party caveat discharges the client sent
 	for i := uint64(0); i < req.NumDischarges; i++ {
 		var d security.Discharge
 		if err := fs.dec.Decode(&d); err != nil {
-			return verror.BadProtocolf("ipc: decoding discharge %d of %d failed: %v", i, req.NumDischarges, err)
+			return old_verror.BadProtocolf("ipc: decoding discharge %d of %d failed: %v", i, req.NumDischarges, err)
 		}
 		fs.discharges[d.ID()] = d
 	}
@@ -1041,7 +1100,7 @@
 	return nil
 }
 
-func authorize(ctx security.Context, auth security.Authorizer) verror.E {
+func authorize(ctx security.Context, auth security.Authorizer) old_verror.E {
 	if ctx.LocalPrincipal() == nil {
 		// LocalPrincipal is nil means that the server wanted to avoid
 		// authentication, and thus wanted to skip authorization as well.
@@ -1052,7 +1111,7 @@
 	}
 	if err := auth.Authorize(ctx); err != nil {
 		// TODO(ataly, ashankar): For privacy reasons, should we hide the authorizer error?
-		return verror.NoAccessf("ipc: not authorized to call %q.%q (%v)", ctx.Suffix(), ctx.Method(), err)
+		return old_verror.NoAccessf("ipc: not authorized to call %q.%q (%v)", ctx.Suffix(), ctx.Method(), err)
 	}
 	return nil
 }
diff --git a/runtimes/google/ipc/server_test.go b/runtimes/google/ipc/server_test.go
index 9c8c126..4c7cc05 100644
--- a/runtimes/google/ipc/server_test.go
+++ b/runtimes/google/ipc/server_test.go
@@ -40,6 +40,7 @@
 		t.Fatalf("unexpected error: %s", err)
 	}
 	session := expect.NewSession(t, server.Stdout(), time.Minute)
+	session.ReadLine()
 	serverName := session.ExpectVar("NAME")
 	serverEP := session.ExpectVar("ADDR")
 	ep, _ := inaming.NewEndpoint(serverEP)
@@ -71,9 +72,8 @@
 	}
 
 	// Resurrect the server with the same address, verify client
-	// re-establishes the connection. This is probably racy if another
-	// process grabs the port. This seems unlikely since the kernel cycles
-	// through the entire port space.
+	// re-establishes the connection. This is racy if another
+	// process grabs the port.
 	server, err = sh.Start(core.EchoServerCommand, nil, "--", "--veyron.tcp.address="+ep.Address, "mymessage again", "")
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
@@ -108,7 +108,11 @@
 	h.proxy = p
 	s := expect.NewSession(t, p.Stdout(), time.Minute)
 	s.ReadLine()
+	s.ReadLine()
 	h.name = s.ExpectVar("PROXY_NAME")
+	if len(h.name) == 0 {
+		t.Fatalf("failed to get PROXY_NAME from proxyd")
+	}
 	return h.ns.Mount(testContext(), "proxy", h.name, time.Hour)
 }
 
@@ -186,7 +190,7 @@
 	}
 	proxyEP, _ := naming.SplitAddressName(addrs[0])
 
-	ep, err := server.Listen(spec)
+	eps, err := server.Listen(spec)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -212,14 +216,13 @@
 	}
 
 	proxiedEP, err := inaming.NewEndpoint(proxyEP)
-
 	if err != nil {
 		t.Fatalf("unexpected error for %q: %s", proxyEP, err)
 	}
 	proxiedEP.RID = naming.FixedRoutingID(0x555555555)
 	expectedEndpoints := []string{proxiedEP.String()}
 	if hasLocalListener {
-		expectedEndpoints = append(expectedEndpoints, ep.String())
+		expectedEndpoints = append(expectedEndpoints, eps[0].String())
 	}
 
 	// Proxy connetions are created asynchronously, so we wait for the
@@ -247,10 +250,9 @@
 		// mount table, given that we're trying to test the proxy, we remove
 		// the local endpoint from the mount table entry!  We have to remove both
 		// the tcp and the websocket address.
-		sep := ep.String()
+		sep := eps[0].String()
 		//wsep := strings.Replace(sep, "@tcp@", "@ws@", 1)
 		ns.Unmount(testContext(), "mountpoint/server", naming.JoinAddressName(sep, ""))
-		//ns.Unmount(testContext(), "mountpoint/server", naming.JoinAddressName(wsep, ""))
 	}
 
 	addrs = verifyMount(t, ns, name)
diff --git a/runtimes/google/ipc/signature_test.go b/runtimes/google/ipc/signature_test.go
index 0f5c5ac..59a54ad 100644
--- a/runtimes/google/ipc/signature_test.go
+++ b/runtimes/google/ipc/signature_test.go
@@ -24,14 +24,14 @@
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start sig server: %v", err)
 	}
-	ep, err := server.Listen(profiles.LocalListenSpec)
+	eps, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to listen: %v", err)
 	}
 	if err := server.Serve("", sig, nil); err != nil {
 		return "", nil, err
 	}
-	return ep.String(), func() { server.Stop() }, nil
+	return eps[0].String(), func() { server.Stop() }, nil
 }
 
 type sigImpl struct{}
diff --git a/runtimes/google/ipc/stream/vc/init.go b/runtimes/google/ipc/stream/vc/init.go
index ae639c5..2a51592 100644
--- a/runtimes/google/ipc/stream/vc/init.go
+++ b/runtimes/google/ipc/stream/vc/init.go
@@ -54,6 +54,10 @@
 	return s.k
 }
 
+func (s *anonymousBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+	return nil
+}
+
 func (anonymousBlessingStore) DebugString() string {
 	return "anonymous BlessingStore"
 }
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 2dd0a94..9d32f56 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -198,15 +198,15 @@
 	}
 	// Add a mount table server.
 	// Start serving on a loopback address.
-	ep, err := s.Listen(profiles.LocalListenSpec)
+	eps, err := s.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		boom(t, "Failed to Listen: %s", err)
 	}
 	if err := s.ServeDispatcher(mountPoint, disp); err != nil {
 		boom(t, "Failed to serve mount table at %s: %s", mountPoint, err)
 	}
-	name := naming.JoinAddressName(ep.String(), "")
-	return &serverEntry{mountPoint: mountPoint, server: s, endpoint: ep, name: name}
+	name := naming.JoinAddressName(eps[0].String(), "")
+	return &serverEntry{mountPoint: mountPoint, server: s, endpoint: eps[0], name: name}
 }
 
 const (
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 7f7c589..8efcb44 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -90,11 +90,11 @@
 	if err != nil {
 		return nil, "", err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		return nil, "", err
 	}
-	serverObjectName := naming.JoinAddressName(endpoint.String(), "")
+	serverObjectName := naming.JoinAddressName(endpoints[0].String(), "")
 	if err := server.Serve("", s, allowEveryone{}); err != nil {
 		return nil, "", err
 	}
diff --git a/runtimes/google/rt/mgmt.go b/runtimes/google/rt/mgmt.go
index ae4a949..e52b102 100644
--- a/runtimes/google/rt/mgmt.go
+++ b/runtimes/google/rt/mgmt.go
@@ -42,7 +42,7 @@
 	if err != nil {
 		return nil, err
 	}
-	ep, err := server.Listen(*listenSpec)
+	eps, err := server.Listen(*listenSpec)
 	if err != nil {
 		return nil, err
 	}
@@ -50,7 +50,7 @@
 		server.Stop()
 		return nil, err
 	}
-	err = rt.callbackToParent(parentName, naming.JoinAddressName(ep.String(), ""))
+	err = rt.callbackToParent(parentName, naming.JoinAddressName(eps[0].String(), ""))
 	if err != nil {
 		server.Stop()
 		return nil, err
diff --git a/runtimes/google/rt/mgmt_test.go b/runtimes/google/rt/mgmt_test.go
index fd59c0a..6323682 100644
--- a/runtimes/google/rt/mgmt_test.go
+++ b/runtimes/google/rt/mgmt_test.go
@@ -282,14 +282,14 @@
 		t.Fatalf("Got error: %v", err)
 	}
 	ch := make(chan string)
-	var ep naming.Endpoint
-	if ep, err = server.Listen(profiles.LocalListenSpec); err != nil {
+	var eps []naming.Endpoint
+	if eps, err = server.Listen(profiles.LocalListenSpec); err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
 	if err := server.Serve("", device.ConfigServer(&configServer{ch}), vflag.NewAuthorizerOrDie()); err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
-	return server, naming.JoinAddressName(ep.String(), ""), ch
+	return server, naming.JoinAddressName(eps[0].String(), ""), ch
 }
 
 func setupRemoteAppCycleMgr(t *testing.T) (veyron2.Runtime, modules.Handle, appcycle.AppCycleClientMethods, func()) {
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index d0acb43..18b61ea 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -69,6 +69,8 @@
 		{"Sign", V{make([]byte, 10)}, security.Signature{Purpose: []byte{}, R: []byte{1}, S: []byte{1}}, nil},
 		{"MintDischarge", V{thirdPartyCaveat, security.UnconstrainedUse()}, discharge, nil},
 		{"PublicKey", V{}, mockP.PublicKey(), nil},
+		{"BlessingsByName", V{security.BlessingPattern("self")}, []security.Blessings{newBlessing(t, "blessing")}, nil},
+		{"BlessingsInfo", V{newBlessing(t, "blessing")}, []string{"blessing"}, nil},
 		{"AddToRoots", V{newBlessing(t, "blessing")}, nil, verror2.Make(addToRootsErr, nil)},
 	}
 	for _, test := range tests {
@@ -84,6 +86,7 @@
 		{"SetDefault", V{newBlessing(t, "blessing")}, nil, verror2.Make(storeSetDefaultErr, nil)},
 		{"Default", V{}, newBlessing(t, "root/extension"), nil},
 		{"PublicKey", V{}, mockP.PublicKey(), nil},
+		{"PeerBlessings", V{}, map[security.BlessingPattern]security.Blessings{"test": newBlessing(t, "root/extension")}, nil},
 		{"DebugString", V{}, "StoreString", nil},
 	}
 	for _, test := range storeTests {
@@ -176,6 +179,18 @@
 	return d, p.NextError
 }
 
+func (p *mockPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+	defer p.reset()
+	b, _ := p.NextResult.([]security.Blessings)
+	return b
+}
+
+func (p *mockPrincipal) BlessingsInfo(blessings security.Blessings) []string {
+	defer p.reset()
+	s, _ := p.NextResult.([]string)
+	return s
+}
+
 func (p *mockPrincipal) PublicKey() security.PublicKey         { return p.Key }
 func (p *mockPrincipal) Roots() security.BlessingRoots         { return p.MockRoots }
 func (p *mockPrincipal) BlessingStore() security.BlessingStore { return p.MockStore }
@@ -220,6 +235,12 @@
 
 func (s *mockBlessingStore) PublicKey() security.PublicKey { return s.Key }
 
+func (s *mockBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+	defer s.reset()
+	m, _ := s.NextResult.(map[security.BlessingPattern]security.Blessings)
+	return m
+}
+
 func (s *mockBlessingStore) DebugString() string {
 	defer s.reset()
 	return s.NextResult.(string)
diff --git a/security/agent/client.go b/security/agent/client.go
index 6a3925f..cd26573 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -128,6 +128,33 @@
 	return c.key
 }
 
+func (c *client) BlessingsByName(pattern security.BlessingPattern) []security.Blessings {
+	var wbResults []security.WireBlessings
+	err := c.caller.call("BlessingsByName", results(&wbResults), pattern)
+	if err != nil {
+		vlog.Errorf("error calling BlessingsByName: %v", err)
+		return nil
+	}
+	blessings := make([]security.Blessings, len(wbResults))
+	for i, wb := range wbResults {
+		var err error
+		blessings[i], err = security.NewBlessings(wb)
+		if err != nil {
+			vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
+		}
+	}
+	return blessings
+}
+
+func (c *client) BlessingsInfo(blessings security.Blessings) []string {
+	var names []string
+	err := c.caller.call("BlessingsInfo", results(&names), security.MarshalBlessings(blessings))
+	if err != nil {
+		vlog.Errorf("error calling BlessingsInfo: %v", err)
+		return nil
+	}
+	return names
+}
 func (c *client) BlessingStore() security.BlessingStore {
 	return &blessingStore{c.caller, c.key}
 }
@@ -192,6 +219,25 @@
 	return b.key
 }
 
+func (b *blessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+	var wbMap map[security.BlessingPattern]security.WireBlessings
+	err := b.caller.call("BlessingStorePeerBlessings", results(&wbMap))
+	if err != nil {
+		vlog.Errorf("error calling BlessingStorePeerBlessings: %v", err)
+		return nil
+	}
+	bMap := make(map[security.BlessingPattern]security.Blessings)
+	for pattern, wb := range wbMap {
+		blessings, err := security.NewBlessings(wb)
+		if err != nil {
+			vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
+			return nil
+		}
+		bMap[pattern] = blessings
+	}
+	return bMap
+}
+
 func (b *blessingStore) DebugString() (s string) {
 	err := b.caller.call("BlessingStoreDebugString", results(&s))
 	if err != nil {
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index c6ff7ea..fcf25a3 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -307,6 +307,23 @@
 	return a.principal.PublicKey().MarshalBinary()
 }
 
+func (a agentd) BlessingsByName(_ ipc.ServerContext, name security.BlessingPattern) ([]security.WireBlessings, error) {
+	blessings := a.principal.BlessingsByName(name)
+	ret := make([]security.WireBlessings, len(blessings))
+	for i, b := range blessings {
+		ret[i] = security.MarshalBlessings(b)
+	}
+	return ret, nil
+}
+
+func (a agentd) BlessingsInfo(_ ipc.ServerContext, blessings security.WireBlessings) ([]string, error) {
+	b, err := security.NewBlessings(blessings)
+	if err != nil {
+		return nil, err
+	}
+	return a.principal.BlessingsInfo(b), nil
+}
+
 func (a agentd) AddToRoots(_ ipc.ServerContext, wireBlessings security.WireBlessings) error {
 	blessings, err := security.NewBlessings(wireBlessings)
 	if err != nil {
@@ -339,6 +356,15 @@
 	return a.principal.BlessingStore().SetDefault(blessings)
 }
 
+func (a agentd) BlessingStorePeerBlessings(_ ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error) {
+	bMap := a.principal.BlessingStore().PeerBlessings()
+	wbMap := make(map[security.BlessingPattern]security.WireBlessings, len(bMap))
+	for p, b := range bMap {
+		wbMap[p] = security.MarshalBlessings(b)
+	}
+	return wbMap, nil
+}
+
 func (a agentd) BlessingStoreDebugString(_ ipc.ServerContext) (string, error) {
 	return a.principal.BlessingStore().DebugString(), nil
 }
diff --git a/security/agent/server/wire.vdl b/security/agent/server/wire.vdl
index dc52a7c..ee55e0b 100644
--- a/security/agent/server/wire.vdl
+++ b/security/agent/server/wire.vdl
@@ -35,12 +35,15 @@
 	Sign(message []byte) (security.Signature, error)
 	MintDischarge(tp any, caveat security.Caveat, additionalCaveats []security.Caveat) (any, error)
 	PublicKey() ([]byte, error)
+	BlessingsByName(name security.BlessingPattern) ([]security.WireBlessings, error)
+	BlessingsInfo(blessings security.WireBlessings) ([]string, error)
 	AddToRoots(blessing security.WireBlessings) error
 
 	BlessingStoreSet(blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
 	BlessingStoreForPeer(peerBlessings []string) (security.WireBlessings, error)
 	BlessingStoreSetDefault(blessings security.WireBlessings) error
 	BlessingStoreDefault() (security.WireBlessings, error)
+	BlessingStorePeerBlessings() (map[security.BlessingPattern]security.WireBlessings, error)
 	BlessingStoreDebugString() (string, error)
 
 	BlessingRootsAdd(root []byte, pattern security.BlessingPattern) error
diff --git a/security/agent/server/wire.vdl.go b/security/agent/server/wire.vdl.go
index fa5832b..3fc6f85 100644
--- a/security/agent/server/wire.vdl.go
+++ b/security/agent/server/wire.vdl.go
@@ -27,11 +27,14 @@
 	Sign(ctx __context.T, message []byte, opts ...__ipc.CallOpt) (security.Signature, error)
 	MintDischarge(ctx __context.T, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat, opts ...__ipc.CallOpt) (__vdlutil.Any, error)
 	PublicKey(__context.T, ...__ipc.CallOpt) ([]byte, error)
+	BlessingsByName(ctx __context.T, name security.BlessingPattern, opts ...__ipc.CallOpt) ([]security.WireBlessings, error)
+	BlessingsInfo(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) ([]string, error)
 	AddToRoots(ctx __context.T, blessing security.WireBlessings, opts ...__ipc.CallOpt) error
 	BlessingStoreSet(ctx __context.T, blessings security.WireBlessings, forPeers security.BlessingPattern, opts ...__ipc.CallOpt) (security.WireBlessings, error)
 	BlessingStoreForPeer(ctx __context.T, peerBlessings []string, opts ...__ipc.CallOpt) (security.WireBlessings, error)
 	BlessingStoreSetDefault(ctx __context.T, blessings security.WireBlessings, opts ...__ipc.CallOpt) error
 	BlessingStoreDefault(__context.T, ...__ipc.CallOpt) (security.WireBlessings, error)
+	BlessingStorePeerBlessings(__context.T, ...__ipc.CallOpt) (map[security.BlessingPattern]security.WireBlessings, error)
 	BlessingStoreDebugString(__context.T, ...__ipc.CallOpt) (string, error)
 	BlessingRootsAdd(ctx __context.T, root []byte, pattern security.BlessingPattern, opts ...__ipc.CallOpt) error
 	BlessingRootsRecognized(ctx __context.T, root []byte, blessing string, opts ...__ipc.CallOpt) error
@@ -122,6 +125,28 @@
 	return
 }
 
+func (c implAgentClientStub) BlessingsByName(ctx __context.T, i0 security.BlessingPattern, opts ...__ipc.CallOpt) (o0 []security.WireBlessings, err error) {
+	var call __ipc.Call
+	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsByName", []interface{}{i0}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&o0, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
+func (c implAgentClientStub) BlessingsInfo(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (o0 []string, err error) {
+	var call __ipc.Call
+	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingsInfo", []interface{}{i0}, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&o0, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
 func (c implAgentClientStub) AddToRoots(ctx __context.T, i0 security.WireBlessings, opts ...__ipc.CallOpt) (err error) {
 	var call __ipc.Call
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "AddToRoots", []interface{}{i0}, opts...); err != nil {
@@ -177,6 +202,17 @@
 	return
 }
 
+func (c implAgentClientStub) BlessingStorePeerBlessings(ctx __context.T, opts ...__ipc.CallOpt) (o0 map[security.BlessingPattern]security.WireBlessings, err error) {
+	var call __ipc.Call
+	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStorePeerBlessings", nil, opts...); err != nil {
+		return
+	}
+	if ierr := call.Finish(&o0, &err); ierr != nil {
+		err = ierr
+	}
+	return
+}
+
 func (c implAgentClientStub) BlessingStoreDebugString(ctx __context.T, opts ...__ipc.CallOpt) (o0 string, err error) {
 	var call __ipc.Call
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "BlessingStoreDebugString", nil, opts...); err != nil {
@@ -240,11 +276,14 @@
 	Sign(ctx __ipc.ServerContext, message []byte) (security.Signature, error)
 	MintDischarge(ctx __ipc.ServerContext, tp __vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (__vdlutil.Any, error)
 	PublicKey(__ipc.ServerContext) ([]byte, error)
+	BlessingsByName(ctx __ipc.ServerContext, name security.BlessingPattern) ([]security.WireBlessings, error)
+	BlessingsInfo(ctx __ipc.ServerContext, blessings security.WireBlessings) ([]string, error)
 	AddToRoots(ctx __ipc.ServerContext, blessing security.WireBlessings) error
 	BlessingStoreSet(ctx __ipc.ServerContext, blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
 	BlessingStoreForPeer(ctx __ipc.ServerContext, peerBlessings []string) (security.WireBlessings, error)
 	BlessingStoreSetDefault(ctx __ipc.ServerContext, blessings security.WireBlessings) error
 	BlessingStoreDefault(__ipc.ServerContext) (security.WireBlessings, error)
+	BlessingStorePeerBlessings(__ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error)
 	BlessingStoreDebugString(__ipc.ServerContext) (string, error)
 	BlessingRootsAdd(ctx __ipc.ServerContext, root []byte, pattern security.BlessingPattern) error
 	BlessingRootsRecognized(ctx __ipc.ServerContext, root []byte, blessing string) error
@@ -308,6 +347,14 @@
 	return s.impl.PublicKey(ctx)
 }
 
+func (s implAgentServerStub) BlessingsByName(ctx __ipc.ServerContext, i0 security.BlessingPattern) ([]security.WireBlessings, error) {
+	return s.impl.BlessingsByName(ctx, i0)
+}
+
+func (s implAgentServerStub) BlessingsInfo(ctx __ipc.ServerContext, i0 security.WireBlessings) ([]string, error) {
+	return s.impl.BlessingsInfo(ctx, i0)
+}
+
 func (s implAgentServerStub) AddToRoots(ctx __ipc.ServerContext, i0 security.WireBlessings) error {
 	return s.impl.AddToRoots(ctx, i0)
 }
@@ -328,6 +375,10 @@
 	return s.impl.BlessingStoreDefault(ctx)
 }
 
+func (s implAgentServerStub) BlessingStorePeerBlessings(ctx __ipc.ServerContext) (map[security.BlessingPattern]security.WireBlessings, error) {
+	return s.impl.BlessingStorePeerBlessings(ctx)
+}
+
 func (s implAgentServerStub) BlessingStoreDebugString(ctx __ipc.ServerContext) (string, error) {
 	return s.impl.BlessingStoreDebugString(ctx)
 }
@@ -415,6 +466,26 @@
 			},
 		},
 		{
+			Name: "BlessingsByName",
+			InArgs: []__ipc.ArgDesc{
+				{"name", ``}, // security.BlessingPattern
+			},
+			OutArgs: []__ipc.ArgDesc{
+				{"", ``}, // []security.WireBlessings
+				{"", ``}, // error
+			},
+		},
+		{
+			Name: "BlessingsInfo",
+			InArgs: []__ipc.ArgDesc{
+				{"blessings", ``}, // security.WireBlessings
+			},
+			OutArgs: []__ipc.ArgDesc{
+				{"", ``}, // []string
+				{"", ``}, // error
+			},
+		},
+		{
 			Name: "AddToRoots",
 			InArgs: []__ipc.ArgDesc{
 				{"blessing", ``}, // security.WireBlessings
@@ -461,6 +532,13 @@
 			},
 		},
 		{
+			Name: "BlessingStorePeerBlessings",
+			OutArgs: []__ipc.ArgDesc{
+				{"", ``}, // map[security.BlessingPattern]security.WireBlessings
+				{"", ``}, // error
+			},
+		},
+		{
 			Name: "BlessingStoreDebugString",
 			OutArgs: []__ipc.ArgDesc{
 				{"", ``}, // string
@@ -579,6 +657,13 @@
 			{Name: "", Type: 75},
 		},
 	}
+	result.Methods["BlessingStorePeerBlessings"] = __ipc.MethodSignature{
+		InArgs: []__ipc.MethodArgument{},
+		OutArgs: []__ipc.MethodArgument{
+			{Name: "", Type: 79},
+			{Name: "", Type: 75},
+		},
+	}
 	result.Methods["BlessingStoreSet"] = __ipc.MethodSignature{
 		InArgs: []__ipc.MethodArgument{
 			{Name: "blessings", Type: 74},
@@ -597,6 +682,24 @@
 			{Name: "", Type: 75},
 		},
 	}
+	result.Methods["BlessingsByName"] = __ipc.MethodSignature{
+		InArgs: []__ipc.MethodArgument{
+			{Name: "name", Type: 77},
+		},
+		OutArgs: []__ipc.MethodArgument{
+			{Name: "", Type: 78},
+			{Name: "", Type: 75},
+		},
+	}
+	result.Methods["BlessingsInfo"] = __ipc.MethodSignature{
+		InArgs: []__ipc.MethodArgument{
+			{Name: "blessings", Type: 74},
+		},
+		OutArgs: []__ipc.MethodArgument{
+			{Name: "", Type: 61},
+			{Name: "", Type: 75},
+		},
+	}
 	result.Methods["MintDischarge"] = __ipc.MethodSignature{
 		InArgs: []__ipc.MethodArgument{
 			{Name: "tp", Type: 76},
@@ -652,7 +755,7 @@
 				__wiretype.FieldType{Type: 0x49, Name: "CertificateChains"},
 			},
 			"veyron.io/veyron/veyron2/security.WireBlessings", []string(nil)},
-		__wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}}
+		__wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, __wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}, __wiretype.SliceType{Elem: 0x4a, Name: "", Tags: []string(nil)}, __wiretype.MapType{Key: 0x4d, Elem: 0x4a, Name: "", Tags: []string(nil)}}
 
 	return result, nil
 }
diff --git a/security/audit/principal.go b/security/audit/principal.go
index efd1323..c37a8d7 100644
--- a/security/audit/principal.go
+++ b/security/audit/principal.go
@@ -55,6 +55,14 @@
 	return d, nil
 }
 
+func (p *auditingPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+	return p.principal.BlessingsByName(name)
+}
+
+func (p *auditingPrincipal) BlessingsInfo(b security.Blessings) []string {
+	return p.principal.BlessingsInfo(b)
+}
+
 func (p *auditingPrincipal) PublicKey() security.PublicKey         { return p.principal.PublicKey() }
 func (p *auditingPrincipal) Roots() security.BlessingRoots         { return p.principal.Roots() }
 func (p *auditingPrincipal) BlessingStore() security.BlessingStore { return p.principal.BlessingStore() }
diff --git a/security/audit/principal_test.go b/security/audit/principal_test.go
index 487154f..00b885e 100644
--- a/security/audit/principal_test.go
+++ b/security/audit/principal_test.go
@@ -162,6 +162,14 @@
 	return d, p.NextError
 }
 
+func (p *mockPrincipal) BlessingsByName(name security.BlessingPattern) []security.Blessings {
+	return nil
+}
+
+func (p *mockPrincipal) BlessingsInfo(b security.Blessings) []string {
+	return nil
+}
+
 func (p *mockPrincipal) PublicKey() security.PublicKey         { return p.NextResult.(security.PublicKey) }
 func (p *mockPrincipal) Roots() security.BlessingRoots         { return nil }
 func (p *mockPrincipal) BlessingStore() security.BlessingStore { return nil }
diff --git a/security/blessingstore.go b/security/blessingstore.go
index be3449b..fd004e6 100644
--- a/security/blessingstore.go
+++ b/security/blessingstore.go
@@ -135,6 +135,14 @@
 	return fmt.Sprintf("{state: %v, publicKey: %v}", bs.state, bs.publicKey)
 }
 
+func (bs *blessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
+	m := make(map[security.BlessingPattern]security.Blessings)
+	for pattern, wb := range bs.state.Store {
+		m[pattern] = wb.Blessings()
+	}
+	return m
+}
+
 // DebugString return a human-readable string encoding of the store
 // in the following format
 // Default blessing : <Default blessing of the store>
diff --git a/security/blessingstore_test.go b/security/blessingstore_test.go
index fd535d8..be7824f 100644
--- a/security/blessingstore_test.go
+++ b/security/blessingstore_test.go
@@ -30,11 +30,19 @@
 		{t.forAll, "...foo", "invalid BlessingPattern"},
 		{t.forAll, "foo/.../bar", "invalid BlessingPattern"},
 	}
+	added := make(map[security.BlessingPattern]security.Blessings)
 	for _, d := range testdata {
 		_, err := s.Set(d.blessings, d.pattern)
 		if merr := matchesError(err, d.wantErr); merr != nil {
 			return fmt.Errorf("Set(%v, %q): %v", d.blessings, d.pattern, merr)
 		}
+		if err == nil {
+			added[d.pattern] = d.blessings
+		}
+	}
+	m := s.PeerBlessings()
+	if !reflect.DeepEqual(added, m) {
+		return fmt.Errorf("PeerBlessings(%v) != added(%v)", m, added)
 	}
 	return nil
 }
diff --git a/security/principal_test.go b/security/principal_test.go
index eb72f43..5f2d08c 100644
--- a/security/principal_test.go
+++ b/security/principal_test.go
@@ -7,7 +7,10 @@
 	"io/ioutil"
 	"os"
 	"path"
+	"reflect"
 	"testing"
+
+	"veyron.io/veyron/veyron2/security"
 )
 
 func TestLoadPersistentPrincipal(t *testing.T) {
@@ -116,3 +119,97 @@
 	}
 	return dir
 }
+
+func TestPrincipalBlessingsByName(t *testing.T) {
+	var p1, p2, p3 security.Principal
+	var err error
+
+	if p1, err = NewPrincipal(); err != nil {
+		t.Fatal(err)
+	}
+	if p2, err = NewPrincipal(); err != nil {
+		t.Fatal(err)
+	}
+	alice, err := p1.BlessSelf("alice")
+	if err != nil {
+		t.Fatal(err)
+	}
+	p2.AddToRoots(alice)
+	var aliceworkfriend, alicegymfriend, aliceworkboss security.Blessings
+
+	if aliceworkfriend, err = p1.Bless(p2.PublicKey(), alice, "work/friend", security.UnconstrainedUse()); err != nil {
+		t.Errorf("Bless(work/friend) failed: %v", err)
+	}
+	p2.BlessingStore().Set(aliceworkfriend, "alice/work/friend")
+	if alicegymfriend, err = p1.Bless(p2.PublicKey(), alice, "gym/friend", security.UnconstrainedUse()); err != nil {
+		t.Errorf("Bless(gym/friend) failed: %v", err)
+	}
+	p2.BlessingStore().Set(alicegymfriend, "alice/gym/friend")
+	if aliceworkboss, err = p1.Bless(p2.PublicKey(), alice, "work/boss", security.UnconstrainedUse()); err != nil {
+		t.Errorf("Bless(work/friend) failed: %v", err)
+	}
+	p2.BlessingStore().Set(aliceworkboss, "alice/work/boss")
+
+	// Blessing from an untrusted principal that should never be returned
+	if p3, err = NewPrincipal(); err != nil {
+		t.Fatal(err)
+	}
+	fake, err := p3.BlessSelf("alice")
+	if err != nil {
+		t.Fatal(err)
+	}
+	fakefriend, err := p3.Bless(p2.PublicKey(), fake, "work/friend", security.UnconstrainedUse())
+	if err != nil {
+		t.Errorf("Bless(work/friend) failed: %v", err)
+	}
+	_, err = p2.BlessingStore().Set(fakefriend, "fake/work/friend")
+
+	tests := []struct {
+		matched []security.Blessings
+		pattern security.BlessingPattern
+	}{
+		{
+			matched: []security.Blessings{aliceworkfriend, aliceworkboss},
+			pattern: "alice/work/...",
+		},
+		{
+			matched: []security.Blessings{aliceworkfriend},
+			pattern: "alice/work/friend",
+		},
+		{
+			matched: []security.Blessings{alicegymfriend},
+			pattern: "alice/gym/friend",
+		},
+		{
+			matched: []security.Blessings{aliceworkfriend, alicegymfriend, aliceworkboss},
+			pattern: "alice/...",
+		},
+		{
+			matched: []security.Blessings{aliceworkfriend, alicegymfriend, aliceworkboss},
+			pattern: "...",
+		},
+		{
+			matched: nil,
+			pattern: "alice/school/...",
+		},
+	}
+
+	for _, test := range tests {
+		matched := p2.BlessingsByName(test.pattern)
+		if len(matched) != len(test.matched) {
+			t.Errorf("BlessingsByName(%s) did not return expected number of matches wanted:%d got:%d", test.pattern, len(test.matched), len(matched))
+		}
+		for _, m := range matched {
+			found := false
+			for _, tm := range test.matched {
+				if reflect.DeepEqual(m, tm) {
+					found = true
+					break
+				}
+			}
+			if !found {
+				t.Errorf("Invalid blessing was returned as a match:%v for pattern:%s", m, test.pattern)
+			}
+		}
+	}
+}
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 6c11891..0092a47 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -6,7 +6,6 @@
 	"database/sql"
 	"flag"
 	"fmt"
-	_ "github.com/go-sql-driver/mysql"
 	"html/template"
 	"io/ioutil"
 	"net"
@@ -15,6 +14,8 @@
 	"strings"
 	"time"
 
+	_ "github.com/go-sql-driver/mysql"
+
 	"veyron.io/veyron/veyron2"
 	"veyron.io/veyron/veyron2/ipc"
 	"veyron.io/veyron/veyron2/naming"
@@ -205,10 +206,11 @@
 	if err != nil {
 		return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
 	}
-	ep, err := server.Listen(static.ListenSpec)
+	eps, err := server.Listen(static.ListenSpec)
 	if err != nil {
 		return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
 	}
+	ep := eps[0]
 	googleParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
 
 	dispatcher := newDispatcher(googleParams, macaroonKey)
diff --git a/services/identity/revocation/revocation_test.go b/services/identity/revocation/revocation_test.go
index a23538b..ea6d428 100644
--- a/services/identity/revocation/revocation_test.go
+++ b/services/identity/revocation/revocation_test.go
@@ -52,7 +52,7 @@
 	if err != nil {
 		t.Fatalf("r.NewServer: %s", err)
 	}
-	dischargerEP, err := dischargerServer.Listen(profiles.LocalListenSpec)
+	dischargerEPs, err := dischargerServer.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("dischargerServer.Listen failed: %v", err)
 	}
@@ -61,7 +61,7 @@
 		t.Fatalf("dischargerServer.Serve revoker: %s", err)
 	}
 	return r.Principal().PublicKey(),
-		naming.JoinAddressName(dischargerEP.String(), ""),
+		naming.JoinAddressName(dischargerEPs[0].String(), ""),
 		revokerService,
 		func() {
 			dischargerServer.Stop()
diff --git a/services/mgmt/application/applicationd/main.go b/services/mgmt/application/applicationd/main.go
index 4898ae7..a30fb98 100644
--- a/services/mgmt/application/applicationd/main.go
+++ b/services/mgmt/application/applicationd/main.go
@@ -39,14 +39,14 @@
 		vlog.Fatalf("NewDispatcher() failed: %v", err)
 	}
 
-	endpoint, err := server.Listen(roaming.ListenSpec)
+	endpoints, err := server.Listen(roaming.ListenSpec)
 	if err != nil {
 		vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 	}
 	if err := server.ServeDispatcher(*name, dispatcher); err != nil {
 		vlog.Fatalf("Serve(%v) failed: %v", *name, err)
 	}
-	epName := naming.JoinAddressName(endpoint.String(), "")
+	epName := naming.JoinAddressName(endpoints[0].String(), "")
 	if *name != "" {
 		vlog.Infof("Application repository serving at %q (%q)", *name, epName)
 	} else {
diff --git a/services/mgmt/application/impl/impl_test.go b/services/mgmt/application/impl/impl_test.go
index af03a77..591fe9b 100644
--- a/services/mgmt/application/impl/impl_test.go
+++ b/services/mgmt/application/impl/impl_test.go
@@ -40,13 +40,14 @@
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
 
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
 	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
 	}
+	endpoint := endpoints[0]
 
 	// Create client stubs for talking to the server.
 	stub := repository.ApplicationClient(naming.JoinAddressName(endpoint.String(), "search"))
@@ -183,10 +184,11 @@
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
 
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
+	endpoint := endpoints[0]
 	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
 	}
@@ -227,10 +229,11 @@
 	if err != nil {
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
-	endpoint, err = server.Listen(profiles.LocalListenSpec)
+	endpoints, err = server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
+	endpoint = endpoints[0]
 	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve(%v) failed: %v", dispatcher, err)
 	}
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 3ac83da..11c311b 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -85,7 +85,7 @@
 	}
 	defer server.Stop()
 	auth := vflag.NewAuthorizerOrDie()
-	endpoint, err := server.Listen(roaming.ListenSpec)
+	endpoints, err := server.Listen(roaming.ListenSpec)
 	if err != nil {
 		vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 		return
@@ -94,7 +94,7 @@
 		vlog.Errorf("ServeDispatcher(%v) failed: %v", *name, err)
 		return
 	}
-	epName := naming.JoinAddressName(endpoint.String(), "")
+	epName := naming.JoinAddressName(endpoints[0].String(), "")
 	if *name != "" {
 		vlog.Infof("Binary repository serving at %q (%q)", *name, epName)
 	} else {
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index b336cd1..a34937f 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -132,10 +132,11 @@
 		}
 	}()
 	dispatcher := NewDispatcher(state, nil)
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
+	endpoint := endpoints[0]
 	dontPublishName := ""
 	if err := server.ServeDispatcher(dontPublishName, dispatcher); err != nil {
 		t.Fatalf("Serve(%q) failed: %v", dontPublishName, err)
diff --git a/services/mgmt/build/impl/impl_test.go b/services/mgmt/build/impl/impl_test.go
index 5c659fa..4dfc78a 100644
--- a/services/mgmt/build/impl/impl_test.go
+++ b/services/mgmt/build/impl/impl_test.go
@@ -58,7 +58,7 @@
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
@@ -66,7 +66,7 @@
 	if err := server.Serve(unpublished, build.BuilderServer(NewBuilderService(gobin, goroot)), nil); err != nil {
 		t.Fatalf("Serve(%q) failed: %v", unpublished, err)
 	}
-	name := "/" + endpoint.String()
+	name := "/" + endpoints[0].String()
 	return build.BuilderClient(name), func() {
 		if err := server.Stop(); err != nil {
 			t.Fatalf("Stop() failed: %v", err)
diff --git a/services/mgmt/debug/dispatcher_test.go b/services/mgmt/debug/dispatcher_test.go
index 480de4d..4a65eaf 100644
--- a/services/mgmt/debug/dispatcher_test.go
+++ b/services/mgmt/debug/dispatcher_test.go
@@ -38,14 +38,14 @@
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start debug server: %v", err)
 	}
-	endpoint, err := server.Listen(listenSpec)
+	endpoints, err := server.Listen(listenSpec)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to listen on %s: %v", listenSpec, err)
 	}
 	if err := server.ServeDispatcher("", disp); err != nil {
 		return "", nil, err
 	}
-	ep := endpoint.String()
+	ep := endpoints[0].String()
 	return ep, func() { server.Stop() }, nil
 }
 
diff --git a/services/mgmt/device/deviced/main.go b/services/mgmt/device/deviced/main.go
index 1397a24..e9221ba 100644
--- a/services/mgmt/device/deviced/main.go
+++ b/services/mgmt/device/deviced/main.go
@@ -50,11 +50,11 @@
 		vlog.Fatalf("NewServer() failed: %v", err)
 	}
 	defer server.Stop()
-	endpoint, err := server.Listen(roaming.ListenSpec)
+	endpoints, err := server.Listen(roaming.ListenSpec)
 	if err != nil {
 		vlog.Fatalf("Listen(%s) failed: %v", roaming.ListenSpec, err)
 	}
-	name := naming.JoinAddressName(endpoint.String(), "")
+	name := naming.JoinAddressName(endpoints[0].String(), "")
 	vlog.VI(0).Infof("Device manager object name: %v", name)
 	configState, err := config.Load()
 	if err != nil {
diff --git a/services/mgmt/device/impl/proxy_invoker_test.go b/services/mgmt/device/impl/proxy_invoker_test.go
index 4ed43a8..8ef35ac 100644
--- a/services/mgmt/device/impl/proxy_invoker_test.go
+++ b/services/mgmt/device/impl/proxy_invoker_test.go
@@ -32,7 +32,7 @@
 	}
 	defer server1.Stop()
 	localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
-	ep1, err := server1.Listen(localSpec)
+	eps1, err := server1.Listen(localSpec)
 	if err != nil {
 		t.Fatalf("Listen: %v", err)
 	}
@@ -46,13 +46,13 @@
 		t.Fatalf("NewServer: %v", err)
 	}
 	defer server2.Stop()
-	ep2, err := server2.Listen(localSpec)
+	eps2, err := server2.Listen(localSpec)
 	if err != nil {
 		t.Fatalf("Listen: %v", err)
 	}
 	disp := &proxyDispatcher{
 		runtime,
-		naming.JoinAddressName(ep1.String(), "__debug/stats"),
+		naming.JoinAddressName(eps1[0].String(), "__debug/stats"),
 		stats.StatsServer(nil),
 	}
 	if err := server2.ServeDispatcher("", disp); err != nil {
@@ -60,14 +60,14 @@
 	}
 
 	// Call Value()
-	name := naming.JoinAddressName(ep2.String(), "system/start-time-rfc1123")
+	name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123")
 	c := stats.StatsClient(name)
 	if _, err := c.Value(runtime.NewContext()); err != nil {
 		t.Fatalf("%q.Value() error: %v", name, err)
 	}
 
 	// Call Glob()
-	results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(ep2.String(), "system"), "start-time-*")
+	results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
 	if err != nil {
 		t.Fatalf("Glob failed: %v", err)
 	}
diff --git a/services/mgmt/device/impl/util_test.go b/services/mgmt/device/impl/util_test.go
index 52642ff..0293a99 100644
--- a/services/mgmt/device/impl/util_test.go
+++ b/services/mgmt/device/impl/util_test.go
@@ -53,6 +53,7 @@
 		t.Fatalf("failed to start root mount table: %s", err)
 	}
 	s := expect.NewSession(t, h.Stdout(), expectTimeout)
+	s.ExpectVar("PID")
 	rootName := s.ExpectVar("MT_NAME")
 	if t.Failed() {
 		t.Fatalf("failed to read mt name: %s", s.Error())
@@ -163,11 +164,11 @@
 		vlog.Fatalf("NewServer() failed: %v", err)
 	}
 	spec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
-	endpoint, err := server.Listen(spec)
+	endpoints, err := server.Listen(spec)
 	if err != nil {
 		vlog.Fatalf("Listen(%s) failed: %v", spec, err)
 	}
-	return server, endpoint.String()
+	return server, endpoints[0].String()
 }
 
 // resolveExpectNotFound verifies that the given name is not in the mounttable.
diff --git a/services/mgmt/lib/binary/impl_test.go b/services/mgmt/lib/binary/impl_test.go
index 216cfd1..7d6e589 100644
--- a/services/mgmt/lib/binary/impl_test.go
+++ b/services/mgmt/lib/binary/impl_test.go
@@ -56,7 +56,7 @@
 		t.Fatalf("NewState(%v, %v) failed: %v", rootDir, depth, err)
 	}
 	dispatcher := impl.NewDispatcher(state, nil)
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
@@ -64,7 +64,7 @@
 	if err := server.ServeDispatcher(suffix, dispatcher); err != nil {
 		t.Fatalf("Serve(%v, %v) failed: %v", suffix, dispatcher, err)
 	}
-	von := naming.JoinAddressName(endpoint.String(), "test")
+	von := naming.JoinAddressName(endpoints[0].String(), "test")
 	return von, func() {
 		if err := os.Remove(path); err != nil {
 			t.Fatalf("Remove(%v) failed: %v", path, err)
diff --git a/services/mgmt/logreader/impl/logfile_test.go b/services/mgmt/logreader/impl/logfile_test.go
index c161d88..fb7833c 100644
--- a/services/mgmt/logreader/impl/logfile_test.go
+++ b/services/mgmt/logreader/impl/logfile_test.go
@@ -25,7 +25,7 @@
 		t.Fatalf("NewServer failed: %v", err)
 		return nil, "", err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen failed: %v", err)
 		return nil, "", err
@@ -34,7 +34,7 @@
 		t.Fatalf("Serve failed: %v", err)
 		return nil, "", err
 	}
-	return server, endpoint.String(), nil
+	return server, endpoints[0].String(), nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/services/mgmt/pprof/client/proxy_test.go b/services/mgmt/pprof/client/proxy_test.go
index 2afeb05..04a79da 100644
--- a/services/mgmt/pprof/client/proxy_test.go
+++ b/services/mgmt/pprof/client/proxy_test.go
@@ -35,14 +35,14 @@
 		t.Fatalf("failed to start server: %v", err)
 	}
 	defer s.Stop()
-	endpoint, err := s.Listen(profiles.LocalListenSpec)
+	endpoints, err := s.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("failed to listen: %v", err)
 	}
 	if err := s.ServeDispatcher("", &dispatcher{impl.NewPProfService()}); err != nil {
 		t.Fatalf("failed to serve: %v", err)
 	}
-	l, err := client.StartProxy(r, naming.JoinAddressName(endpoint.String(), ""))
+	l, err := client.StartProxy(r, naming.JoinAddressName(endpoints[0].String(), ""))
 	if err != nil {
 		t.Fatalf("failed to start proxy: %v", err)
 	}
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index 5517bca..b27486f 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -50,10 +50,11 @@
 	if err != nil {
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
+	endpoint := endpoints[0]
 	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve failed: %v", err)
 	}
@@ -135,10 +136,11 @@
 	if err != nil {
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
+	endpoint := endpoints[0]
 	if err := server.ServeDispatcher("", dispatcher); err != nil {
 		t.Fatalf("Serve failed: %v", err)
 	}
@@ -173,7 +175,7 @@
 	if err != nil {
 		t.Fatalf("NewDispatcher() failed: %v", err)
 	}
-	endpoint, err = server.Listen(profiles.LocalListenSpec)
+	endpoints, err = server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
@@ -182,7 +184,7 @@
 	}
 
 	// Create client stubs for talking to the server.
-	stub = repository.ProfileClient(naming.JoinAddressName(endpoint.String(), "linux/base"))
+	stub = repository.ProfileClient(naming.JoinAddressName(endpoints[0].String(), "linux/base"))
 
 	// Label
 	label, err = stub.Label(ctx)
diff --git a/services/mgmt/stats/impl/stats_test.go b/services/mgmt/stats/impl/stats_test.go
index c2c342a..02178a3 100644
--- a/services/mgmt/stats/impl/stats_test.go
+++ b/services/mgmt/stats/impl/stats_test.go
@@ -35,7 +35,7 @@
 		t.Fatalf("NewServer failed: %v", err)
 		return "", nil
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen failed: %v", err)
 		return "", nil
@@ -44,7 +44,7 @@
 		t.Fatalf("Serve failed: %v", err)
 		return "", nil
 	}
-	return endpoint.String(), func() { server.Stop() }
+	return endpoints[0].String(), func() { server.Stop() }
 }
 
 func TestStatsImpl(t *testing.T) {
diff --git a/services/mgmt/vtrace/impl/vtrace_test.go b/services/mgmt/vtrace/impl/vtrace_test.go
index 3600fd9..9d7bb90 100644
--- a/services/mgmt/vtrace/impl/vtrace_test.go
+++ b/services/mgmt/vtrace/impl/vtrace_test.go
@@ -25,14 +25,14 @@
 	if err != nil {
 		t.Fatalf("Could not create server: %s", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen failed: %s", err)
 	}
 	if err := server.Serve("", impl.NewVtraceService(runtime.VtraceStore()), nil); err != nil {
 		t.Fatalf("Serve failed: %s", err)
 	}
-	return endpoint.String(), server, runtime
+	return endpoints[0].String(), server, runtime
 }
 
 func TestVtraceServer(t *testing.T) {
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index c0b8494..1f7cb29 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -171,14 +171,14 @@
 		boom(t, "NewMountTable: %v", err)
 	}
 	// Start serving on a loopback address.
-	e, err := server.Listen(profiles.LocalListenSpec)
+	eps, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		boom(t, "Failed to Listen mount table: %s", err)
 	}
 	if err := server.ServeDispatcher("", mt); err != nil {
 		boom(t, "Failed to register mock collection: %s", err)
 	}
-	estr := e.String()
+	estr := eps[0].String()
 	t.Logf("endpoint %s", estr)
 	return server, estr
 }
@@ -189,7 +189,7 @@
 		boom(t, "r.NewServer: %s", err)
 	}
 	// Start serving on a loopback address.
-	e, err := server.Listen(profiles.LocalListenSpec)
+	eps, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		boom(t, "Failed to Listen mount table: %s", err)
 	}
@@ -199,7 +199,7 @@
 	if err := server.ServeDispatcher(cPrefix, newCollectionServer()); err != nil {
 		boom(t, "Failed to register mock collection: %s", err)
 	}
-	estr := e.String()
+	estr := eps[0].String()
 	t.Logf("endpoint %s", estr)
 	return server, estr
 }
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index eb507b9..5d37e21 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -34,11 +34,11 @@
 	defer server.Stop()
 
 	// Start serving on a loopback address.
-	e, err := server.Listen(profiles.LocalListenSpec)
+	eps, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		boom(t, "Failed to Listen mount table: %s", err)
 	}
-	estr := e.String()
+	estr := eps[0].String()
 	addresses := []string{
 		naming.JoinAddressName(estr, ""),
 		naming.JoinAddressName(estr, "suffix1"),
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index a9b0a1c..57848e0 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -40,11 +40,12 @@
 		vlog.Errorf("r.NewMountTable failed: %v", err)
 		os.Exit(1)
 	}
-	mtEndpoint, err := mtServer.Listen(roaming.ListenSpec)
+	mtEndpoints, err := mtServer.Listen(roaming.ListenSpec)
 	if err != nil {
 		vlog.Errorf("mtServer.Listen failed: %v", err)
 		os.Exit(1)
 	}
+	mtEndpoint := mtEndpoints[0]
 	name := *mountName
 	if err := mtServer.ServeDispatcher(name, mt); err != nil {
 		vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
diff --git a/tools/application/impl_test.go b/tools/application/impl_test.go
index d7a6421..696dea1 100644
--- a/tools/application/impl_test.go
+++ b/tools/application/impl_test.go
@@ -85,7 +85,7 @@
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		return nil, nil, err
@@ -94,7 +94,7 @@
 		t.Errorf("Serve failed: %v", err)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/binary/impl_test.go b/tools/binary/impl_test.go
index 004a235..0a2554b 100644
--- a/tools/binary/impl_test.go
+++ b/tools/binary/impl_test.go
@@ -91,7 +91,7 @@
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		return nil, nil, err
@@ -100,7 +100,7 @@
 		t.Errorf("ServeDispatcher failed: %v", err)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/build/impl_test.go b/tools/build/impl_test.go
index 59f832d..094a0c3 100644
--- a/tools/build/impl_test.go
+++ b/tools/build/impl_test.go
@@ -43,7 +43,7 @@
 	if err != nil {
 		t.Fatalf("NewServer failed: %v", err)
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Fatalf("Listen(%s) failed: %v", profiles.LocalListenSpec, err)
 	}
@@ -51,7 +51,7 @@
 	if err := server.Serve(unpublished, build.BuilderServer(&mock{}), nil); err != nil {
 		t.Fatalf("Serve(%v) failed: %v", unpublished, err)
 	}
-	return server, endpoint
+	return server, endpoints[0]
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/mgmt/device/devicemanager_mock_test.go b/tools/mgmt/device/devicemanager_mock_test.go
index 1ba7298..6bf5c37 100644
--- a/tools/mgmt/device/devicemanager_mock_test.go
+++ b/tools/mgmt/device/devicemanager_mock_test.go
@@ -167,7 +167,7 @@
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		stopServer(t, server)
@@ -178,7 +178,7 @@
 		stopServer(t, server)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/mounttable/impl_test.go b/tools/mounttable/impl_test.go
index ae9fa48..6680592 100644
--- a/tools/mounttable/impl_test.go
+++ b/tools/mounttable/impl_test.go
@@ -67,7 +67,7 @@
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		return nil, nil, err
@@ -76,7 +76,7 @@
 		t.Errorf("ServeDispatcher failed: %v", err)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/naming/simulator/ambiguity.scr b/tools/naming/simulator/ambiguity.scr
index 5db56ad..afa2c0a 100644
--- a/tools/naming/simulator/ambiguity.scr
+++ b/tools/naming/simulator/ambiguity.scr
@@ -22,15 +22,21 @@
 set localaddr="--veyron.tcp.address=127.0.0.1:0"
 
 root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
 set s1=$MT_NAME
 
 root  -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
 set s2=$MT_NAME
 
 root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
 set s3=$MT_NAME
 
 mount $s1/a $s2/b 1h
diff --git a/tools/naming/simulator/echo.scr b/tools/naming/simulator/echo.scr
index 09831c6..ca4228e 100644
--- a/tools/naming/simulator/echo.scr
+++ b/tools/naming/simulator/echo.scr
@@ -9,9 +9,9 @@
 # A 'stand-alone' server
 echoServer -- $localaddr $ws $localaddr "text" ""
 set es=$_
-eval $es
-eval $es
 read $es
+eval $es
+eval $es
 set esName=$NAME
 set esAddr=$ADDR
 
@@ -25,15 +25,18 @@
 
 # now use a nameserver.
 root -- $localaddr
-eval $_
+set r=$_
+read $r
+eval $r
 set root=$MT_NAME
 
 set NAMESPACE_ROOT=$root
 echoServer -- $localaddr $ws $localaddr "text2" "a/b"
 set es=$_
+read $es
+eval $es
 eval $es
 set es_name=$NAME
-read $es
 set es_addr=$ADDR
 
 echoClient "a/b" "test 2"
diff --git a/tools/naming/simulator/json_example.scr b/tools/naming/simulator/json_example.scr
index d04886a..e8f740c 100644
--- a/tools/naming/simulator/json_example.scr
+++ b/tools/naming/simulator/json_example.scr
@@ -6,16 +6,17 @@
 root -- $localaddr
 set root=$_
 eval $root
+set ROOT_PID=$PID
+eval $root
 set ROOT_NAME=$MT_NAME
 read $root
-eval $root
-set ROOT_PID=$PID
 json_set ROOT_NAME ROOT_PID
 
 set PROXY_MOUNTPOINT=$ROOT_NAME/proxy/mp
 proxyd -- $localaddr $PROXY_MOUNTPOINT
 set proxyd=$_
 read $proxyd
+read $proxyd
 eval $proxyd
 set PROXYD_NAME=$PROXY_NAME
 splitEP $PROXY_NAME
diff --git a/tools/naming/simulator/mt_complex.scr b/tools/naming/simulator/mt_complex.scr
index daabc3b..54aaeeb 100644
--- a/tools/naming/simulator/mt_complex.scr
+++ b/tools/naming/simulator/mt_complex.scr
@@ -9,6 +9,7 @@
 
 root -- $localaddr
 set root_h=$_
+read $root_h
 eval $root_h
 set root=$MT_NAME
 
@@ -16,6 +17,7 @@
 mt -- $localaddr tl/a
 set m=$_
 set mt_a_h=$m
+read $m
 eval $m
 eval $m
 set mt_a_name=$MT_NAME
@@ -26,6 +28,7 @@
 set mt_b_h=$m
 eval $m
 eval $m
+eval $m
 set mt_b_name=$MT_NAME
 set mt_b_addr=$MT_ADDR
 
@@ -77,6 +80,7 @@
 echoServer  -- $localaddr "E1" tl
 set es_E1=$_
 read $es_E1
+read $es_E1
 eval $es_E1
 set es_E1_addr=$ADDR
 
@@ -130,8 +134,8 @@
 echoServer  -- $localaddr "E2" tl/a
 set es_E2=$_
 read $es_E2
-eval $es_E2
 read $es_E2
+eval $es_E2
 set es_E2_addr=$ADDR
 
 # we can invoke the echo server 'E2' just fine, probably because
@@ -210,6 +214,7 @@
 set long_name=tl/b/some/deep/name/that/is/a/mount/table
 mt -- $localaddr $long_name
 set m=$_
+read $m
 eval $m
 eval $m
 set mt_l_name=$MT_NAME
@@ -220,6 +225,7 @@
 set second_long_name=tl/a/some/deep/name/that/is/a/mount/table
 mt -- $localaddr $second_long_name
 set m=$_
+read $m
 eval $m
 eval $m
 set mt_l2_name=$MT_NAME
diff --git a/tools/naming/simulator/mt_simple.scr b/tools/naming/simulator/mt_simple.scr
index ab548a1..ef648ec 100644
--- a/tools/naming/simulator/mt_simple.scr
+++ b/tools/naming/simulator/mt_simple.scr
@@ -4,15 +4,21 @@
 set ws=--veyron.tcp.protocol=ws
 
 root -- $localaddr
-eval $_
+set m=$_
+read $m
+eval $m
 set root=$MT_NAME
 
 set NAMESPACE_ROOT=$root
 mt -- $localaddr $ws $localaddr usa
-eval $_
+set m=$_
+read $m
+eval $m
 set usa_mt=$MT_NAME
 mt -- $localaddr $ws $localaddr uk
-eval $_
+set m=$_
+read $m
+eval $m
 set uk_mt=$MT_NAME
 
 ls $root/...
@@ -23,12 +29,16 @@
 
 set NAMESPACE_ROOT=$usa_mt
 mt -- $localaddr $ws $localaddr "palo alto"
-eval $_
+set m=$_
+read $m
+eval $m
 set pa_mt=$MT_NAME
 
 set NAMESPACE_ROOT=$uk_mt
 mt -- $localaddr $ws $localaddr "cambridge"
-eval $_
+set m=$_
+read $m
+eval $m
 set cam_mt=$MT_NAME
 
 ls $root/...
diff --git a/tools/naming/simulator/proxy.scr b/tools/naming/simulator/proxy.scr
index 0ef2d7b..5438e4f 100644
--- a/tools/naming/simulator/proxy.scr
+++ b/tools/naming/simulator/proxy.scr
@@ -4,8 +4,10 @@
 set localaddr=--veyron.tcp.address=127.0.0.1:0
 set ws=--veyron.tcp.protocol=ws
 
-root -- $localaddr $ws $localaddr
-eval $_
+root -- $localaddr
+set m=$_
+read $m
+eval $m
 set root=$MT_NAME
 set NAMESPACE_ROOT=$root
 setRoots $NAMESPACE_ROOT
@@ -14,6 +16,7 @@
 # run a non-proxied echo server
 echoServer -- $localaddr $ws $localaddr noproxy echo/noproxy
 set esnp=$_
+read $esnp
 eval $esnp
 set NP_ECHOS_NAME=$NAME
 eval $esnp
@@ -28,6 +31,7 @@
 # run a proxy server
 proxyd -- $localaddr $ws $localaddr p1
 set proxy=$_
+read $proxy
 # PROXY_ADDR=<address of proxy>
 eval $proxy
 # PROXY_NAME=<name of proxy>
@@ -49,6 +53,7 @@
 
 echoServer -- $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
 set eswp=$_
+read $eswp
 eval $eswp
 set ECHOS_NAME=$NAME
 eval $eswp
diff --git a/tools/naming/simulator/public_echo.scr b/tools/naming/simulator/public_echo.scr
index 6349aa3..6942baa 100644
--- a/tools/naming/simulator/public_echo.scr
+++ b/tools/naming/simulator/public_echo.scr
@@ -11,6 +11,7 @@
 set global_name=global/echo
 echoServer -- $localaddr "text2" $global_name
 set es=$_
+read $es
 eval $es
 set es_name=$NAME
 eval $es
diff --git a/tools/principal/main.go b/tools/principal/main.go
index d70d12c..dfbfd1a 100644
--- a/tools/principal/main.go
+++ b/tools/principal/main.go
@@ -623,7 +623,7 @@
 				return fmt.Errorf("failed to create server to listen for blessings: %v", err)
 			}
 			defer server.Stop()
-			ep, err := server.Listen(profile.ListenSpec)
+			eps, err := server.Listen(profile.ListenSpec)
 			if err != nil {
 				return fmt.Errorf("failed to setup listening: %v", err)
 			}
@@ -645,7 +645,7 @@
 			fmt.Println("You may want to adjust flags affecting the caveats on this blessing, for example using")
 			fmt.Println("the --for flag, or change the extension to something more meaningful")
 			fmt.Println()
-			fmt.Printf("principal bless --remote_key=%v --remote_token=%v %v %v\n", runtime.Principal().PublicKey(), service.token, naming.JoinAddressName(ep.String(), ""), extension)
+			fmt.Printf("principal bless --remote_key=%v --remote_token=%v %v %v\n", runtime.Principal().PublicKey(), service.token, naming.JoinAddressName(eps[0].String(), ""), extension)
 			fmt.Println()
 			fmt.Println("...waiting for sender..")
 			return <-service.notify
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
index 9569760..e8925e9 100644
--- a/tools/profile/impl_test.go
+++ b/tools/profile/impl_test.go
@@ -89,7 +89,7 @@
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
 	}
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		return nil, nil, err
@@ -98,7 +98,7 @@
 		t.Errorf("ServeDispatcher failed: %v", err)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {
diff --git a/tools/vrpc/impl_test.go b/tools/vrpc/impl_test.go
index 4204b33..1bf91de 100644
--- a/tools/vrpc/impl_test.go
+++ b/tools/vrpc/impl_test.go
@@ -133,7 +133,7 @@
 		return nil, nil, err
 	}
 
-	endpoint, err := server.Listen(profiles.LocalListenSpec)
+	endpoints, err := server.Listen(profiles.LocalListenSpec)
 	if err != nil {
 		t.Errorf("Listen failed: %v", err)
 		return nil, nil, err
@@ -142,7 +142,7 @@
 		t.Errorf("Serve failed: %v", err)
 		return nil, nil, err
 	}
-	return server, endpoint, nil
+	return server, endpoints[0], nil
 }
 
 func stopServer(t *testing.T, server ipc.Server) {