diff --git a/profiles/internal/ipc/cancel_test.go b/profiles/internal/ipc/cancel_test.go
index 6d95855..a8da7e7 100644
--- a/profiles/internal/ipc/cancel_test.go
+++ b/profiles/internal/ipc/cancel_test.go
@@ -6,8 +6,8 @@
 	"v.io/x/ref/profiles/internal/ipc/stream"
 	"v.io/x/ref/profiles/internal/ipc/stream/manager"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
-	tsecurity "v.io/x/ref/test/security"
 
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/ipc"
 	"v.io/v23/naming"
@@ -54,10 +54,9 @@
 	return nil
 }
 
-func makeCanceld(ns ns.Namespace, name, child string) (*canceld, error) {
+func makeCanceld(ctx *context.T, ns ns.Namespace, name, child string) (*canceld, error) {
 	sm := manager.InternalNew(naming.FixedRoutingID(0x111111111))
-	ctx := testContext()
-	s, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
+	s, err := testInternalNewServer(ctx, sm, ns, v23.GetPrincipal(ctx))
 	if err != nil {
 		return nil, err
 	}
@@ -85,6 +84,9 @@
 // TestCancellationPropagation tests that cancellation propogates along an
 // RPC call chain without user intervention.
 func TestCancellationPropagation(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
 	sm := manager.InternalNew(naming.FixedRoutingID(0x555555555))
 	ns := tnaming.NewSimpleNamespace()
 
@@ -93,19 +95,19 @@
 		t.Error(err)
 	}
 
-	c1, err := makeCanceld(ns, "c1", "c2")
+	c1, err := makeCanceld(ctx, ns, "c1", "c2")
 	if err != nil {
 		t.Fatal("Can't start server:", err)
 	}
 	defer c1.stop()
 
-	c2, err := makeCanceld(ns, "c2", "")
+	c2, err := makeCanceld(ctx, ns, "c2", "")
 	if err != nil {
 		t.Fatal("Can't start server:", err)
 	}
 	defer c2.stop()
 
-	ctx, cancel := context.WithCancel(testContext())
+	ctx, cancel := context.WithCancel(ctx)
 	_, err = client.StartCall(ctx, "c1", "Run", []interface{}{})
 	if err != nil {
 		t.Fatal("can't call: ", err)
diff --git a/profiles/internal/ipc/client.go b/profiles/internal/ipc/client.go
index 4138ba2..9f32184 100644
--- a/profiles/internal/ipc/client.go
+++ b/profiles/internal/ipc/client.go
@@ -11,6 +11,7 @@
 	"sync"
 	"time"
 
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/i18n"
 	"v.io/v23/ipc"
@@ -112,8 +113,8 @@
 }
 
 type vcMapKey struct {
-	endpoint  string
-	encrypted bool
+	endpoint        string
+	clientPublicKey string // clientPublicKey = "" means we are running unencrypted (i.e. VCSecurityNone)
 }
 
 func InternalNewClient(streamMgr stream.Manager, ns ns.Namespace, opts ...ipc.ClientOpt) (ipc.Client, error) {
@@ -143,7 +144,14 @@
 	if c.vcMap == nil {
 		return nil, verror.New(errClientCloseAlreadyCalled, ctx)
 	}
-	vcKey := vcMapKey{ep.String(), vcEncrypted(vcOpts)}
+	vcKey := vcMapKey{endpoint: ep.String()}
+	var principal security.Principal
+	if vcEncrypted(vcOpts) {
+		principal = v23.GetPrincipal(ctx)
+	}
+	if principal != nil {
+		vcKey.clientPublicKey = principal.PublicKey().String()
+	}
 	if vcinfo := c.vcMap[vcKey]; vcinfo != nil {
 		if flow, err := vcinfo.vc.Connect(); err == nil {
 			return flow, nil
@@ -158,7 +166,8 @@
 	}
 	sm := c.streamMgr
 	c.vcMapMu.Unlock()
-	vc, err := sm.Dial(ep, vcOpts...)
+
+	vc, err := sm.Dial(ep, principal, vcOpts...)
 	c.vcMapMu.Lock()
 	if err != nil {
 		if strings.Contains(err.Error(), "authentication failed") {
diff --git a/profiles/internal/ipc/debug_test.go b/profiles/internal/ipc/debug_test.go
index 9a41c67..ea0bea4 100644
--- a/profiles/internal/ipc/debug_test.go
+++ b/profiles/internal/ipc/debug_test.go
@@ -6,6 +6,7 @@
 	"sort"
 	"testing"
 
+	"v.io/v23"
 	"v.io/v23/ipc"
 	"v.io/v23/naming"
 	"v.io/v23/options"
@@ -13,13 +14,14 @@
 
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/profiles/internal/ipc/stream/manager"
-	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
 	"v.io/x/ref/services/mgmt/debug"
 	tsecurity "v.io/x/ref/test/security"
 )
 
 func TestDebugServer(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Setup the client and server principals, with the client willing to share its
 	// blessing with the server.
 	var (
@@ -35,7 +37,6 @@
 	sm := manager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, pserver, ReservedNameDispatcher{debugDisp})
 	if err != nil {
 		t.Fatalf("InternalNewServer failed: %v", err)
@@ -48,7 +49,8 @@
 	if err := server.Serve("", &testObject{}, nil); err != nil {
 		t.Fatalf("server.Serve failed: %v", err)
 	}
-	client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pclient})
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
+	client, err := InternalNewClient(sm, ns)
 	if err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
diff --git a/profiles/internal/ipc/default_authorizer_test.go b/profiles/internal/ipc/default_authorizer_test.go
index d722310..9c27210 100644
--- a/profiles/internal/ipc/default_authorizer_test.go
+++ b/profiles/internal/ipc/default_authorizer_test.go
@@ -132,7 +132,8 @@
 			authorized: true,
 		},
 	}
-	ctx := testContextWithoutDeadline()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	for _, test := range tests {
 		test.call.p, test.call.l, test.call.r, test.call.c = pali, test.local, test.remote, ctx
 		ctx, cancel := context.RootContext()
diff --git a/profiles/internal/ipc/full_test.go b/profiles/internal/ipc/full_test.go
index f351b1d..c2a64cf 100644
--- a/profiles/internal/ipc/full_test.go
+++ b/profiles/internal/ipc/full_test.go
@@ -15,6 +15,7 @@
 	"testing"
 	"time"
 
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/ipc"
 	"v.io/v23/naming"
@@ -30,7 +31,6 @@
 	"v.io/x/ref/profiles/internal/ipc/stream"
 
 	"v.io/x/lib/netstate"
-	"v.io/x/ref/lib/flags"
 	"v.io/x/ref/lib/stats"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/tcp"
 	_ "v.io/x/ref/profiles/internal/ipc/protocols/ws"
@@ -41,7 +41,6 @@
 	"v.io/x/ref/profiles/internal/lib/websocket"
 	inaming "v.io/x/ref/profiles/internal/naming"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
-	ivtrace "v.io/x/ref/profiles/internal/vtrace"
 	tsecurity "v.io/x/ref/test/security"
 	"v.io/x/ref/test/testutil"
 )
@@ -74,16 +73,6 @@
 	c.Unlock()
 }
 
-func testContextWithoutDeadline() *context.T {
-	ctx, _ := context.RootContext()
-	ctx, err := ivtrace.Init(ctx, flags.VtraceFlags{})
-	if err != nil {
-		panic(err)
-	}
-	ctx, _ = vtrace.SetNewTrace(ctx)
-	return ctx
-}
-
 func testInternalNewServer(ctx *context.T, streamMgr stream.Manager, ns ns.Namespace, principal security.Principal, opts ...ipc.ServerOpt) (ipc.Server, error) {
 	client, err := InternalNewClient(streamMgr, ns)
 	if err != nil {
@@ -229,8 +218,8 @@
 	return call.LocalPrincipal().MintDischarge(cav, expiry)
 }
 
-func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
-	return startServerWS(t, principal, sm, ns, name, disp, noWebsocket, opts...)
+func startServer(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+	return startServerWS(t, ctx, principal, sm, ns, name, disp, noWebsocket, opts...)
 }
 
 func endpointsToStrings(eps []naming.Endpoint) []string {
@@ -242,9 +231,8 @@
 	return r
 }
 
-func startServerWS(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
+func startServerWS(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, shouldUseWebsocket websocketMode, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
 	vlog.VI(1).Info("InternalNewServer")
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -279,8 +267,8 @@
 	return fmt.Sprintf("%s:%d", filepath.Base(file), line)
 }
 
-func verifyMount(t *testing.T, ns ns.Namespace, name string) []string {
-	me, err := ns.Resolve(testContext(), name)
+func verifyMount(t *testing.T, ctx *context.T, ns ns.Namespace, name string) []string {
+	me, err := ns.Resolve(ctx, name)
 	if err != nil {
 		t.Errorf("%s: %s not found in mounttable", loc(1), name)
 		return nil
@@ -288,30 +276,30 @@
 	return me.Names()
 }
 
-func verifyMountMissing(t *testing.T, ns ns.Namespace, name string) {
-	if me, err := ns.Resolve(testContext(), name); err == nil {
+func verifyMountMissing(t *testing.T, ctx *context.T, ns ns.Namespace, name string) {
+	if me, err := ns.Resolve(ctx, name); err == nil {
 		names := me.Names()
 		t.Errorf("%s: %s not supposed to be found in mounttable; got %d servers instead: %v (%+v)", loc(1), name, len(names), names, me)
 	}
 }
 
-func stopServer(t *testing.T, server ipc.Server, ns ns.Namespace, name string) {
+func stopServer(t *testing.T, ctx *context.T, server ipc.Server, ns ns.Namespace, name string) {
 	vlog.VI(1).Info("server.Stop")
 	new_name := "should_appear_in_mt/server"
-	verifyMount(t, ns, name)
+	verifyMount(t, ctx, ns, name)
 
 	// publish a second name
 	if err := server.AddName(new_name); err != nil {
 		t.Errorf("server.Serve failed: %v", err)
 	}
-	verifyMount(t, ns, new_name)
+	verifyMount(t, ctx, ns, new_name)
 
 	if err := server.Stop(); err != nil {
 		t.Errorf("server.Stop failed: %v", err)
 	}
 
-	verifyMountMissing(t, ns, name)
-	verifyMountMissing(t, ns, new_name)
+	verifyMountMissing(t, ctx, ns, name)
+	verifyMountMissing(t, ctx, ns, new_name)
 
 	// Check that we can no longer serve after Stop.
 	err := server.AddName("name doesn't matter")
@@ -325,9 +313,9 @@
 // the use of websockets. It does so by resolving the original name
 // and choosing the 'ws' endpoint from the set of endpoints returned.
 // It must return a name since it'll be passed to StartCall.
-func fakeWSName(ns ns.Namespace, name string) (string, error) {
+func fakeWSName(ctx *context.T, ns ns.Namespace, name string) (string, error) {
 	// Find the ws endpoint and use that.
-	me, err := ns.Resolve(testContext(), name)
+	me, err := ns.Resolve(ctx, name)
 	if err != nil {
 		return "", err
 	}
@@ -349,31 +337,29 @@
 	name   string
 }
 
-func (b bundle) cleanup(t *testing.T) {
+func (b bundle) cleanup(t *testing.T, ctx *context.T) {
 	if b.server != nil {
-		stopServer(t, b.server, b.ns, b.name)
+		stopServer(t, ctx, b.server, b.ns, b.name)
 	}
 	if b.client != nil {
 		b.client.Close()
 	}
 }
 
-func createBundle(t *testing.T, client, server security.Principal, ts interface{}) (b bundle) {
-	return createBundleWS(t, client, server, ts, noWebsocket)
+func createBundle(t *testing.T, ctx *context.T, server security.Principal, ts interface{}) (b bundle) {
+	return createBundleWS(t, ctx, server, ts, noWebsocket)
 }
 
-func createBundleWS(t *testing.T, client, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
+func createBundleWS(t *testing.T, ctx *context.T, server security.Principal, ts interface{}, shouldUseWebsocket websocketMode) (b bundle) {
 	b.sm = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	b.ns = tnaming.NewSimpleNamespace()
 	b.name = "mountpoint/server"
 	if server != nil {
-		b.ep, b.server = startServerWS(t, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
+		b.ep, b.server = startServerWS(t, ctx, server, b.sm, b.ns, b.name, testServerDisp{ts}, shouldUseWebsocket)
 	}
-	if client != nil {
-		var err error
-		if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{client}); err != nil {
-			t.Fatalf("InternalNewClient failed: %v", err)
-		}
+	var err error
+	if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
+		t.Fatalf("InternalNewClient failed: %v", err)
 	}
 	return
 }
@@ -388,13 +374,13 @@
 	return verror.Is(err, id.ID)
 }
 
-func runServer(t *testing.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
+func runServer(t *testing.T, ctx *context.T, ns ns.Namespace, principal security.Principal, name string, obj interface{}, opts ...ipc.ServerOpt) stream.Manager {
 	rid, err := naming.NewRoutingID()
 	if err != nil {
 		t.Fatal(err)
 	}
 	sm := imanager.InternalNew(rid)
-	server, err := testInternalNewServer(testContext(), sm, ns, principal, opts...)
+	server, err := testInternalNewServer(ctx, sm, ns, principal, opts...)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -410,7 +396,8 @@
 func TestMultipleCallsToServeAndName(t *testing.T) {
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -430,7 +417,7 @@
 	n3 := "should_appear_in_mt/server"
 	n4 := "should_not_appear_in_mt/server"
 
-	verifyMount(t, ns, n1)
+	verifyMount(t, ctx, ns, n1)
 
 	if server.ServeDispatcher(n2, disp) == nil {
 		t.Errorf("server.ServeDispatcher should have failed")
@@ -447,26 +434,26 @@
 	if err := server.AddName(n3); err != nil {
 		t.Errorf("server.AddName failed: %v", err)
 	}
-	verifyMount(t, ns, n2)
-	verifyMount(t, ns, n3)
+	verifyMount(t, ctx, ns, n2)
+	verifyMount(t, ctx, ns, n3)
 
 	server.RemoveName(n1)
-	verifyMountMissing(t, ns, n1)
+	verifyMountMissing(t, ctx, ns, n1)
 
 	server.RemoveName("some randome name")
 
 	if err := server.ServeDispatcher(n4, &testServerDisp{&testServer{}}); err == nil {
 		t.Errorf("server.ServeDispatcher should have failed")
 	}
-	verifyMountMissing(t, ns, n4)
+	verifyMountMissing(t, ctx, ns, n4)
 
 	if err := server.Stop(); err != nil {
 		t.Errorf("server.Stop failed: %v", err)
 	}
 
-	verifyMountMissing(t, ns, n1)
-	verifyMountMissing(t, ns, n2)
-	verifyMountMissing(t, ns, n3)
+	verifyMountMissing(t, ctx, ns, n1)
+	verifyMountMissing(t, ctx, ns, n2)
+	verifyMountMissing(t, ctx, ns, n3)
 }
 
 func TestRPCServerAuthorization(t *testing.T) {
@@ -544,12 +531,15 @@
 		}
 	)
 
-	_, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, "mountpoint/server")
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
+	_, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, "mountpoint/server")
 
 	// Start the discharge server.
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
 
 	// Make the client and server principals trust root certificates from
 	// pprovider
@@ -568,12 +558,13 @@
 			t.Fatalf("Set failed on server's BlessingStore: %v", err)
 		}
 		// Recreate client in each test (so as to not re-use VCs to the server).
-		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(mgr, ns)
 		if err != nil {
 			t.Errorf("%s: failed to create client: %v", name, err)
 			continue
 		}
-		ctx, cancel := context.WithTimeout(testContextWithoutDeadline(), 10*time.Second)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		ctx, cancel := context.WithCancel(ctx)
 		call, err := client.StartCall(ctx, test.name, "Method", nil, test.opt)
 		if !matchesErrorPattern(err, test.errID, test.err) {
 			t.Errorf(`%s: client.StartCall: got error "%v", want to match "%v"`, name, err, test.err)
@@ -598,10 +589,12 @@
 func TestServerManInTheMiddleAttack(t *testing.T) {
 	// Test scenario: A server mounts itself, but then some other service
 	// somehow "takes over" the endpoint, thus trying to steal traffic.
+	ctx, shutdown := initForTest()
+	defer shutdown()
 
 	// Start up the attacker's server.
 	attacker, err := testInternalNewServer(
-		testContext(),
+		ctx,
 		imanager.InternalNew(naming.FixedRoutingID(0xaaaaaaaaaaaaaaaa)),
 		// (To prevent the attacker for legitimately mounting on the
 		// namespace that the client will use, provide it with a
@@ -627,7 +620,7 @@
 	// The legitimate server would have mounted the same endpoint on the
 	// namespace.
 	ns := tnaming.NewSimpleNamespace()
-	if err := ns.Mount(testContext(), "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
+	if err := ns.Mount(ctx, "mountpoint/server", ep.Name(), time.Hour, naming.MountedServerBlessingsOpt{"server"}); err != nil {
 		t.Fatal(err)
 	}
 
@@ -637,17 +630,18 @@
 	client, err := InternalNewClient(
 		imanager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc)),
 		ns,
-		vc.LocalPrincipal{tsecurity.NewPrincipal("client")})
+	)
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer client.Close()
-	if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil); !verror.Is(err, verror.ErrNotTrusted.ID) {
 		t.Errorf("Got error %v (errorid=%v), want errorid=%v", err, verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 	// But the RPC should succeed if the client explicitly
 	// decided to skip server authorization.
-	if _, err := client.StartCall(testContext(), "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
+	if _, err := client.StartCall(ctx, "mountpoint/server", "Closure", nil, options.SkipResolveAuthorization{}); err != nil {
 		t.Errorf("Unexpected error(%v) when skipping server authorization", err)
 	}
 }
@@ -715,9 +709,13 @@
 		pserver = tsecurity.NewPrincipal("server")
 		pclient = tsecurity.NewPrincipal("client")
 
-		b = createBundleWS(t, pclient, pserver, &testServer{}, shouldUseWebsocket)
+		ctx, shutdown = initForTest()
+
+		b = createBundleWS(t, ctx, pserver, &testServer{}, shouldUseWebsocket)
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	// The server needs to recognize the client's root certificate.
 	pserver.AddToRoots(pclient.BlessingStore().Default())
 	for _, test := range tests {
@@ -725,13 +723,13 @@
 		vname := test.name
 		if shouldUseWebsocket {
 			var err error
-			vname, err = fakeWSName(b.ns, vname)
+			vname, err = fakeWSName(ctx, b.ns, vname)
 			if err != nil && err != test.startErr {
 				t.Errorf(`%s ns.Resolve got error "%v", want "%v"`, name(test), err, test.startErr)
 				continue
 			}
 		}
-		call, err := b.client.StartCall(testContext(), vname, test.method, test.args)
+		call, err := b.client.StartCall(ctx, vname, test.method, test.args)
 		if err != test.startErr {
 			t.Errorf(`%s client.StartCall got error "%v", want "%v"`, name(test), err, test.startErr)
 			continue
@@ -778,10 +776,13 @@
 }
 
 func TestMultipleFinish(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	type v []interface{}
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
-	defer b.cleanup(t)
-	call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Echo", v{"foo"})
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+	defer b.cleanup(t, ctx)
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Echo", v{"foo"})
 	if err != nil {
 		t.Fatalf(`client.StartCall got error "%v"`, err)
 	}
@@ -807,11 +808,15 @@
 
 func TestGranter(t *testing.T) {
 	var (
-		pclient = tsecurity.NewPrincipal("client")
-		pserver = tsecurity.NewPrincipal("server")
-		b       = createBundle(t, pclient, pserver, &testServer{})
+		pclient       = tsecurity.NewPrincipal("client")
+		pserver       = tsecurity.NewPrincipal("server")
+		ctx, shutdown = initForTest()
+		b             = createBundle(t, ctx, pserver, &testServer{})
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 
 	tests := []struct {
 		granter                       ipc.Granter
@@ -824,7 +829,7 @@
 		{granter: granter{b: pclient.BlessingStore().Default()}, finishErrID: verror.ErrNoAccess, finisherr: "blessing granted not bound to this server"},
 	}
 	for i, test := range tests {
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
+		call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "EchoGrantedBlessings", []interface{}{"argument"}, test.granter)
 		if !matchesErrorPattern(err, test.startErrID, test.starterr) {
 			t.Errorf("%d: %+v: StartCall returned error %v", i, test, err)
 		}
@@ -872,7 +877,7 @@
 		sm          = imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 		ns          = tnaming.NewSimpleNamespace()
 
-		mkClient = func(req security.ThirdPartyRequirements) vc.LocalPrincipal {
+		mkClient = func(req security.ThirdPartyRequirements) security.Principal {
 			// Setup the client so that it shares a blessing with a third-party caveat with the server.
 			cav, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
 			if err != nil {
@@ -883,9 +888,11 @@
 				t.Fatalf("BlessSelf failed: %v", err)
 			}
 			pclient.BlessingStore().Set(b, "server")
-			return vc.LocalPrincipal{pclient}
+			return pclient
 		}
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Initialize the client principal.
 	// It trusts both the application server and the discharger.
 	pclient.AddToRoots(pserver.BlessingStore().Default())
@@ -902,7 +909,6 @@
 
 	// Setup the discharge server.
 	var tester dischargeTestServer
-	ctx := testContext()
 	dischargeServer, err := testInternalNewServer(ctx, sm, ns, pdischarger)
 	if err != nil {
 		t.Fatal(err)
@@ -964,12 +970,12 @@
 
 	for _, test := range tests {
 		pclient := mkClient(test.Requirements)
-		client, err := InternalNewClient(sm, ns, pclient)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		client, err := InternalNewClient(sm, ns)
 		if err != nil {
 			t.Fatalf("InternalNewClient(%+v) failed: %v", test.Requirements, err)
 		}
 		defer client.Close()
-		ctx := testContext()
 		tid := vtrace.GetSpan(ctx).Trace()
 		// StartCall should fetch the discharge, do not worry about finishing the RPC - do not care about that for this test.
 		if _, err := client.StartCall(ctx, object, "Method", []interface{}{"argument"}); err != nil {
@@ -1093,13 +1099,16 @@
 			{bServerClientTPValid, "mountpoint/server/suffix", "Unauthorized", nil, v{""}, false},
 		}
 	)
+
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Start the main server.
-	_, server := startServer(t, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, serverName)
+	_, server := startServer(t, ctx, pserver, mgr, ns, serverName, testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, serverName)
 
 	// Start the discharge server.
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, dischargeServerName)
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, dischargeServerName, testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, dischargeServerName)
 
 	// The server should recognize the client principal as an authority on "client" and "random" blessings.
 	pserver.AddToRoots(bClient)
@@ -1115,14 +1124,15 @@
 
 	for i, test := range tests {
 		name := fmt.Sprintf("#%d: %q.%s(%v) by %v", i, test.name, test.method, test.args, test.blessings)
-		client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(mgr, ns)
 		if err != nil {
 			t.Fatalf("InternalNewClient failed: %v", err)
 		}
 		defer client.Close()
 
 		pclient.BlessingStore().Set(test.blessings, "server")
-		call, err := client.StartCall(testContext(), test.name, test.method, test.args)
+		ctx, _ := v23.SetPrincipal(ctx, pclient)
+		call, err := client.StartCall(ctx, test.name, test.method, test.args)
 		if err != nil {
 			t.Errorf(`%s client.StartCall got unexpected error: "%v"`, name, err)
 			continue
@@ -1192,9 +1202,13 @@
 		bclient = bless(pprovider, pclient, "client")
 		bvictim = bless(pprovider, tsecurity.NewPrincipal("victim"), "victim")
 
-		b = createBundle(t, pclient, pserver, &testServer{})
+		ctx, shutdown = initForTest()
+		b             = createBundle(t, ctx, pserver, &testServer{})
 	)
-	defer b.cleanup(t)
+	defer shutdown()
+	defer b.cleanup(t, ctx)
+
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 
 	// Make the client and server trust blessings from pprovider.
 	pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1219,7 +1233,7 @@
 
 		pclient.BlessingStore().Set(test.blessings, "root")
 
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "Closure", nil)
+		call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "Closure", nil)
 		if err != nil {
 			t.Errorf("%v: StartCall failed: %v", name, err)
 			continue
@@ -1244,6 +1258,10 @@
 		bserver = bless(pprovider, pserver, "server", tpCav)
 		bclient = bless(pprovider, pclient, "client")
 	)
+
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
 	// Make the client and server principals trust root certificates from
 	// pprovider.
 	pclient.AddToRoots(pprovider.BlessingStore().Default())
@@ -1253,23 +1271,24 @@
 	pserver.BlessingStore().SetDefault(bserver)
 
 	// Start the server and the discharger.
-	_, server := startServer(t, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
-	defer stopServer(t, server, ns, "mountpoint/server")
+	_, server := startServer(t, ctx, pserver, mgr, ns, "mountpoint/server", testServerDisp{&testServer{}})
+	defer stopServer(t, ctx, server, ns, "mountpoint/server")
 
-	_, dischargeServer := startServer(t, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
-	defer stopServer(t, dischargeServer, ns, "mountpoint/dischargeserver")
+	_, dischargeServer := startServer(t, ctx, pdischarger, mgr, ns, "mountpoint/dischargeserver", testutil.LeafDispatcher(&dischargeServer{}, &acceptAllAuthorizer{}))
+	defer stopServer(t, ctx, dischargeServer, ns, "mountpoint/dischargeserver")
 
 	// Make the client present bclient to all servers that are blessed
 	// by pprovider.
 	pclient.BlessingStore().Set(bclient, "root")
 
-	client, err := InternalNewClient(mgr, ns, vc.LocalPrincipal{pclient})
+	client, err := InternalNewClient(mgr, ns)
 	if err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
 	defer client.Close()
 
-	call, err := client.StartCall(testContext(), "mountpoint/server/suffix", "EchoBlessings", nil)
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
+	call, err := client.StartCall(ctx, "mountpoint/server/suffix", "EchoBlessings", nil)
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
 	}
@@ -1297,15 +1316,19 @@
 	pclient.AddToRoots(pserver.BlessingStore().Default())
 	pclient.BlessingStore().Set(bclient, "server")
 
-	b := createBundle(t, nil, pserver, &testServer{})
-	defer b.cleanup(t)
+	ctx, shutdown := initForTest()
+	defer shutdown()
+
+	b := createBundle(t, ctx, pserver, &testServer{})
+	defer b.cleanup(t, ctx)
 
 	var err error
-	if b.client, err = InternalNewClient(b.sm, b.ns, vc.LocalPrincipal{pclient}); err != nil {
+	if b.client, err = InternalNewClient(b.sm, b.ns); err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	call := func() error {
-		call, err := b.client.StartCall(testContext(), "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
+		call, err := b.client.StartCall(ctx, "mountpoint/server/aclAuth", "Echo", []interface{}{"batman"})
 		if err != nil {
 			return err //fmt.Errorf("client.StartCall failed: %v", err)
 		}
@@ -1377,11 +1400,14 @@
 
 // TestCancel tests cancellation while the server is reading from a stream.
 func TestCancel(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ts := newCancelTestServer(t)
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+	defer b.cleanup(t, ctx)
 
-	ctx, cancel := context.WithCancel(testContext())
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	ctx, cancel := context.WithCancel(ctx)
 	_, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
@@ -1392,11 +1418,14 @@
 // TestCancelWithFullBuffers tests that even if the writer has filled the buffers and
 // the server is not reading that the cancel message gets through.
 func TestCancelWithFullBuffers(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ts := newCancelTestServer(t)
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), ts)
+	defer b.cleanup(t, ctx)
 
-	ctx, cancel := context.WithCancel(testContext())
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	ctx, cancel := context.WithCancel(ctx)
 	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
 	if err != nil {
 		t.Fatalf("Start call failed: %v", err)
@@ -1429,11 +1458,14 @@
 }
 
 func TestStreamReadTerminatedByServer(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	s := &streamRecvInGoroutineServer{c: make(chan error, 1)}
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), s)
-	defer b.cleanup(t)
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), s)
+	defer b.cleanup(t, ctx)
 
-	call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "RecvInGoroutine", []interface{}{})
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
 	}
@@ -1462,20 +1494,21 @@
 
 // TestConnectWithIncompatibleServers tests that clients ignore incompatible endpoints.
 func TestConnectWithIncompatibleServers(t *testing.T) {
-	b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), &testServer{})
-	defer b.cleanup(t)
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	b := createBundle(t, ctx, tsecurity.NewPrincipal("server"), &testServer{})
+	defer b.cleanup(t, ctx)
 
 	// Publish some incompatible endpoints.
-	publisher := publisher.New(testContext(), b.ns, publishPeriod)
+	publisher := publisher.New(ctx, b.ns, publishPeriod)
 	defer publisher.WaitForStop()
 	defer publisher.Stop()
 	publisher.AddName("incompatible")
 	publisher.AddServer("/@2@tcp@localhost:10000@@1000000@2000000@@", false)
 	publisher.AddServer("/@2@tcp@localhost:10001@@2000000@3000000@@", false)
 
-	ctx, _ := context.WithTimeout(testContext(), 100*time.Millisecond)
-
-	_, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
+	ctx, _ = v23.SetPrincipal(ctx, tsecurity.NewPrincipal("client"))
+	_, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"}, options.NoRetry{})
 	if !verror.Is(err, verror.ErrNoServers.ID) {
 		t.Errorf("Expected error %s, found: %v", verror.ErrNoServers, err)
 	}
@@ -1484,7 +1517,7 @@
 	publisher.AddServer("/"+b.ep.String(), false)
 	publisher.AddName("incompatible")
 
-	call, err := b.client.StartCall(testContext(), "incompatible/suffix", "Echo", []interface{}{"foo"})
+	call, err := b.client.StartCall(ctx, "incompatible/suffix", "Echo", []interface{}{"foo"})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -1499,6 +1532,8 @@
 }
 
 func TestPreferredAddress(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
@@ -1507,7 +1542,6 @@
 		a.IP = net.ParseIP("1.1.1.1")
 		return []ipc.Address{&netstate.AddrIfc{Addr: a}}, nil
 	}
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -1543,13 +1577,14 @@
 }
 
 func TestPreferredAddressErrors(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
 	paerr := func(_ string, a []ipc.Address) ([]ipc.Address, error) {
 		return nil, fmt.Errorf("oops")
 	}
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Errorf("InternalNewServer failed: %v", err)
@@ -1575,10 +1610,11 @@
 }
 
 func TestSecurityNone(t *testing.T) {
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x66666666))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
 	server, err := testInternalNewServer(ctx, sm, ns, nil, options.VCSecurityNone)
 	if err != nil {
 		t.Fatalf("InternalNewServer failed: %v", err)
@@ -1632,6 +1668,8 @@
 		pclient   = tsecurity.NewPrincipal("client")
 		batman, _ = pserver.BlessSelf("batman")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Client and server recognize the servers blessings
 	for _, p := range []security.Principal{pserver, pclient} {
 		if err := p.AddToRoots(pserver.BlessingStore().Default()); err != nil {
@@ -1645,8 +1683,8 @@
 	// to act as batman (as opposed to using the default blessing).
 	ns := tnaming.NewSimpleNamespace()
 
-	defer runServer(t, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
-	defer runServer(t, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/batman", &testServer{}, options.ServerBlessings{batman}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/default", &testServer{}).Shutdown()
 
 	// And finally, make an RPC and see that the client sees "batman"
 	runClient := func(server string) ([]string, error) {
@@ -1654,13 +1692,13 @@
 		defer smc.Shutdown()
 		client, err := InternalNewClient(
 			smc,
-			ns,
-			vc.LocalPrincipal{pclient})
+			ns)
 		if err != nil {
 			return nil, err
 		}
 		defer client.Close()
-		call, err := client.StartCall(testContext(), server, "Closure", nil)
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		call, err := client.StartCall(ctx, server, "Closure", nil)
 		if err != nil {
 			return nil, err
 		}
@@ -1684,6 +1722,8 @@
 		pserver     = tsecurity.NewPrincipal("server")
 		pclient     = tsecurity.NewPrincipal("client")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Make the client recognize all server blessings
 	if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
 		t.Fatal(err)
@@ -1706,8 +1746,8 @@
 
 	// Setup the disharger and test server.
 	discharger := &dischargeServer{}
-	defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
-	defer runServer(t, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+	defer runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{}).Shutdown()
 
 	runClient := func(noDischarges bool) {
 		rid, err := naming.NewRoutingID()
@@ -1716,7 +1756,7 @@
 		}
 		smc := imanager.InternalNew(rid)
 		defer smc.Shutdown()
-		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(smc, ns)
 		if err != nil {
 			t.Fatalf("failed to create client: %v", err)
 		}
@@ -1725,7 +1765,8 @@
 		if noDischarges {
 			opts = append(opts, NoDischarges{})
 		}
-		if _, err = client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil, opts...); err != nil {
+		ctx, _ = v23.SetPrincipal(ctx, pclient)
+		if _, err = client.StartCall(ctx, "mountpoint/testServer", "Closure", nil, opts...); err != nil {
 			t.Fatalf("failed to StartCall: %v", err)
 		}
 	}
@@ -1748,7 +1789,8 @@
 		pdischarger2     = tsecurity.NewPrincipal("discharger2")
 		pdischargeClient = tsecurity.NewPrincipal("dischargeClient")
 	)
-
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Bless the client with a ThirdPartyCaveat from discharger1.
 	tpcav1 := mkThirdPartyCaveat(pdischarger1.PublicKey(), "mountpoint/discharger1", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
 	blessings, err := pdischarger1.Bless(pdischargeClient.PublicKey(), pdischarger1.BlessingStore().Default(), "tpcav1", tpcav1)
@@ -1764,8 +1806,8 @@
 	// Setup the disharger and test server.
 	discharger1 := &dischargeServer{}
 	discharger2 := &dischargeServer{}
-	defer runServer(t, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
-	defer runServer(t, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger1, "mountpoint/discharger1", discharger1).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger2, "mountpoint/discharger2", discharger2).Shutdown()
 
 	rid, err := naming.NewRoutingID()
 	if err != nil {
@@ -1773,7 +1815,7 @@
 	}
 	sm := imanager.InternalNew(rid)
 
-	c, err := InternalNewClient(sm, ns, vc.LocalPrincipal{pdischargeClient})
+	c, err := InternalNewClient(sm, ns)
 	if err != nil {
 		t.Fatalf("failed to create client: %v", err)
 	}
@@ -1782,7 +1824,8 @@
 	if err != nil {
 		t.Error(err)
 	}
-	dc.PrepareDischarges(testContext(), []security.Caveat{tpcav2}, security.DischargeImpetus{})
+	ctx, _ = v23.SetPrincipal(ctx, pdischargeClient)
+	dc.PrepareDischarges(ctx, []security.Caveat{tpcav2}, security.DischargeImpetus{})
 
 	// Ensure that discharger1 was not called and discharger2 was called.
 	if discharger1.called {
@@ -1800,6 +1843,8 @@
 		pserver = tsecurity.NewPrincipal("server")
 		pclient = tsecurity.NewPrincipal("client")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	// Make the client recognize all server blessings
 	if err := pclient.AddToRoots(pserver.BlessingStore().Default()); err != nil {
 		t.Fatal(err)
@@ -1807,10 +1852,12 @@
 
 	ns := tnaming.NewSimpleNamespace()
 
-	serverSM := runServer(t, ns, pserver, "mountpoint/testServer", &testServer{})
+	serverSM := runServer(t, ctx, ns, pserver, "mountpoint/testServer", &testServer{})
 	defer serverSM.Shutdown()
 	rid := serverSM.RoutingID()
 
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
+
 	newClient := func() ipc.Client {
 		rid, err := naming.NewRoutingID()
 		if err != nil {
@@ -1818,7 +1865,7 @@
 		}
 		smc := imanager.InternalNew(rid)
 		defer smc.Shutdown()
-		client, err := InternalNewClient(smc, ns, vc.LocalPrincipal{pclient})
+		client, err := InternalNewClient(smc, ns)
 		if err != nil {
 			t.Fatalf("failed to create client: %v", err)
 		}
@@ -1826,7 +1873,7 @@
 	}
 
 	runClient := func(client ipc.Client) {
-		if call, err := client.StartCall(testContext(), "mountpoint/testServer", "Closure", nil); err != nil {
+		if call, err := client.StartCall(ctx, "mountpoint/testServer", "Closure", nil); err != nil {
 			t.Fatalf("failed to StartCall: %v", err)
 		} else if err := call.Finish(); err != nil {
 			t.Fatal(err)
@@ -1887,30 +1934,29 @@
 		pother  = tsecurity.NewPrincipal("other")
 		pclient = tsecurity.NewPrincipal("client")
 	)
-
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	ns := tnaming.NewSimpleNamespace()
 	mountName := "mountpoint/default"
 
 	// Start a server with pserver.
-	defer runServer(t, ns, pserver, mountName, &testServer{}).Shutdown()
+	defer runServer(t, ctx, ns, pserver, mountName, &testServer{}).Shutdown()
 
 	smc := imanager.InternalNew(naming.FixedRoutingID(0xc))
-	client, err := InternalNewClient(
-		smc,
-		ns,
-		vc.LocalPrincipal{pclient})
+	client, err := InternalNewClient(smc, ns)
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer smc.Shutdown()
 	defer client.Close()
 
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	// The call should succeed when the server presents the same public as the opt...
-	if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
+	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pserver.PublicKey()}); err != nil {
 		t.Errorf("Expected call to succeed but got %v", err)
 	}
 	// ...but fail if they differ.
-	if _, err = client.StartCall(testContext(), mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
+	if _, err = client.StartCall(ctx, mountName, "Closure", nil, options.ServerPublicKey{pother.PublicKey()}); !verror.Is(err, verror.ErrNotTrusted.ID) {
 		t.Errorf("got %v, want %v", verror.ErrorID(err), verror.ErrNotTrusted.ID)
 	}
 }
@@ -1947,16 +1993,17 @@
 	var (
 		pdischarger = tsecurity.NewPrincipal("discharger")
 	)
+	ctx, shutdown := initForTest()
+	defer shutdown()
 
 	// Bless the client with a ThirdPartyCaveat.
 	tpcav := mkThirdPartyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", mkCaveat(security.ExpiryCaveat(time.Now().Add(time.Hour))))
 
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
 
 	// Setup the disharge server.
 	discharger := &expiryDischarger{}
-	defer runServer(t, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
+	defer runServer(t, ctx, ns, pdischarger, "mountpoint/discharger", discharger).Shutdown()
 
 	// Create a discharge client.
 	rid, err := naming.NewRoutingID()
diff --git a/profiles/internal/ipc/resolve_test.go b/profiles/internal/ipc/resolve_test.go
index ce35790..b415220 100644
--- a/profiles/internal/ipc/resolve_test.go
+++ b/profiles/internal/ipc/resolve_test.go
@@ -3,6 +3,8 @@
 import (
 	"flag"
 	"fmt"
+	"io"
+	"os"
 	"testing"
 	"time"
 
@@ -10,6 +12,7 @@
 	"v.io/v23/context"
 	"v.io/v23/ipc"
 	"v.io/v23/naming"
+	"v.io/v23/options"
 
 	"v.io/x/ref/lib/flags"
 	"v.io/x/ref/profiles/fake"
@@ -18,10 +21,10 @@
 	"v.io/x/ref/profiles/internal/lib/appcycle"
 	inaming "v.io/x/ref/profiles/internal/naming"
 	grt "v.io/x/ref/profiles/internal/rt"
+	mounttable "v.io/x/ref/services/mounttable/lib"
 	"v.io/x/ref/test"
 	"v.io/x/ref/test/expect"
 	"v.io/x/ref/test/modules"
-	"v.io/x/ref/test/modules/core"
 )
 
 var commonFlags *flags.Flags
@@ -31,7 +34,9 @@
 	if err := internal.ParseFlags(commonFlags); err != nil {
 		panic(err)
 	}
+}
 
+func setupRuntime() {
 	ac := appcycle.New()
 
 	listenSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
@@ -56,8 +61,38 @@
 	fake.InjectRuntime(runtime, ctx, shutdown)
 }
 
+func rootMountTable(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
+	setupRuntime()
+	ctx, shutdown := v23.Init()
+	defer shutdown()
+
+	lspec := v23.GetListenSpec(ctx)
+	server, err := v23.NewServer(ctx, options.ServesMountTable(true))
+	if err != nil {
+		return fmt.Errorf("root failed: %v", err)
+	}
+	mp := ""
+	mt, err := mounttable.NewMountTableDispatcher("")
+	if err != nil {
+		return fmt.Errorf("mounttable.NewMountTableDispatcher failed: %s", err)
+	}
+	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)
+	}
+	fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
+	for _, ep := range eps {
+		fmt.Fprintf(stdout, "MT_NAME=%s\n", ep.Name())
+	}
+	modules.WaitForEOF(stdin)
+	return nil
+}
+
 func startMT(t *testing.T, sh *modules.Shell) string {
-	h, err := sh.Start(core.RootMTCommand, nil)
+	h, err := sh.Start("rootMountTable", nil)
 	if err != nil {
 		t.Fatalf("unexpected error for root mt: %s", err)
 	}
@@ -67,6 +102,7 @@
 }
 
 func TestResolveToEndpoint(t *testing.T) {
+	setupRuntime()
 	sh, err := modules.NewShell(nil, nil, testing.Verbose(), t)
 	if err != nil {
 		t.Fatalf("modules.NewShell failed: %s", err)
diff --git a/profiles/internal/ipc/server_authorizer_test.go b/profiles/internal/ipc/server_authorizer_test.go
index 416f70a..e185e4b 100644
--- a/profiles/internal/ipc/server_authorizer_test.go
+++ b/profiles/internal/ipc/server_authorizer_test.go
@@ -5,6 +5,7 @@
 
 	tsecurity "v.io/x/ref/test/security"
 
+	"v.io/v23"
 	"v.io/v23/options"
 	"v.io/v23/security"
 )
@@ -21,7 +22,7 @@
 		otherAli, _ = pother.BlessSelf("ali")
 		zero        = security.Blessings{}
 
-		ctx = testContext()
+		ctx, shutdown = initForTest()
 
 		U = func(blessings ...security.Blessings) security.Blessings {
 			u, err := security.UnionOfBlessings(blessings...)
@@ -31,6 +32,8 @@
 			return u
 		}
 	)
+	defer shutdown()
+	ctx, _ = v23.SetPrincipal(ctx, pclient)
 	// Make client recognize ali, bob and otherAli blessings
 	for _, b := range []security.Blessings{ali, bob, otherAli} {
 		if err := pclient.AddToRoots(b); err != nil {
diff --git a/profiles/internal/ipc/server_test.go b/profiles/internal/ipc/server_test.go
index 37cbc17..808bb8e 100644
--- a/profiles/internal/ipc/server_test.go
+++ b/profiles/internal/ipc/server_test.go
@@ -7,6 +7,7 @@
 	"testing"
 	"time"
 
+	"v.io/v23"
 	"v.io/v23/config"
 	"v.io/v23/context"
 	"v.io/v23/ipc"
@@ -17,7 +18,6 @@
 
 	"v.io/x/lib/netstate"
 	imanager "v.io/x/ref/profiles/internal/ipc/stream/manager"
-	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	inaming "v.io/x/ref/profiles/internal/naming"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
 	tsecurity "v.io/x/ref/test/security"
@@ -38,13 +38,14 @@
 	return noMethodsType{}, nil, nil
 }
 
-// TestBadObject ensures that Serve handles bad reciver objects gracefully (in
+// TestBadObject ensures that Serve handles bad receiver objects gracefully (in
 // particular, it doesn't panic).
 func TestBadObject(t *testing.T) {
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
 	if err != nil {
 		t.Fatal(err)
@@ -70,7 +71,7 @@
 	if err != nil {
 		t.Fatalf("InternalNewClient failed: %v", err)
 	}
-	ctx, _ = context.WithDeadline(testContext(), time.Now().Add(10*time.Second))
+	ctx, _ = context.WithDeadline(ctx, time.Now().Add(10*time.Second))
 	call, err := client.StartCall(ctx, "servername", "SomeMethod", nil)
 	if err != nil {
 		t.Fatalf("StartCall failed: %v", err)
@@ -87,7 +88,9 @@
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -130,7 +133,8 @@
 }
 
 func TestServerStatus(t *testing.T) {
-	ctx := testContext()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
@@ -162,7 +166,8 @@
 
 	progress := make(chan error)
 
-	client, err := InternalNewClient(sm, ns, vc.LocalPrincipal{principal})
+	client, err := InternalNewClient(sm, ns)
+	ctx, _ = v23.SetPrincipal(ctx, principal)
 	makeCall := func(ctx *context.T) {
 		call, err := client.StartCall(ctx, "test", "Hang", nil)
 		progress <- err
@@ -222,7 +227,8 @@
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	ctx := testContext()
+	ctx, shutdown := initForTest()
+	defer shutdown()
 
 	expectBadState := func(err error) {
 		if !verror.Is(err, verror.ErrBadState.ID) {
@@ -289,7 +295,9 @@
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -411,7 +419,9 @@
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
 	defer server.Stop()
 
 	if err != nil {
@@ -560,7 +570,9 @@
 	sm := imanager.InternalNew(naming.FixedRoutingID(0x555555555))
 	defer sm.Shutdown()
 	ns := tnaming.NewSimpleNamespace()
-	server, err := testInternalNewServer(testContext(), sm, ns, tsecurity.NewPrincipal("test"))
+	ctx, shutdown := initForTest()
+	defer shutdown()
+	server, err := testInternalNewServer(ctx, sm, ns, tsecurity.NewPrincipal("test"))
 	defer server.Stop()
 
 	if err != nil {
diff --git a/profiles/internal/ipc/stream/benchmark/dial_vc.go b/profiles/internal/ipc/stream/benchmark/dial_vc.go
index 1b42060..604be19 100644
--- a/profiles/internal/ipc/stream/benchmark/dial_vc.go
+++ b/profiles/internal/ipc/stream/benchmark/dial_vc.go
@@ -19,14 +19,15 @@
 
 	server := manager.InternalNew(naming.FixedRoutingID(0x5))
 	client := manager.InternalNew(naming.FixedRoutingID(0xc))
+	principal := tsecurity.NewPrincipal("client")
 
-	_, ep, err := server.Listen("tcp", "127.0.0.1:0", tsecurity.NewPrincipal("test"), mode)
+	_, ep, err := server.Listen("tcp", "127.0.0.1:0", tsecurity.NewPrincipal("server"), mode)
 	if err != nil {
 		b.Fatal(err)
 	}
 
 	// Warmup to create the underlying VIF.
-	_, err = client.Dial(ep, mode)
+	_, err = client.Dial(ep, principal, mode)
 	if err != nil {
 		b.Fatal(err)
 	}
@@ -37,7 +38,7 @@
 		b.StartTimer()
 		start := time.Now()
 
-		_, err := client.Dial(ep, mode)
+		_, err := client.Dial(ep, principal, mode)
 		if err != nil {
 			b.Fatal(err)
 		}
diff --git a/profiles/internal/ipc/stream/benchmark/dial_vif.go b/profiles/internal/ipc/stream/benchmark/dial_vif.go
index 7224c8e..40078af 100644
--- a/profiles/internal/ipc/stream/benchmark/dial_vif.go
+++ b/profiles/internal/ipc/stream/benchmark/dial_vif.go
@@ -16,7 +16,7 @@
 // benchmarkDialVIF measures VIF creation time over the underlying net connection.
 func benchmarkDialVIF(b *testing.B, mode options.VCSecurityLevel) {
 	stats := benchmark.AddStats(b, 16)
-	principal := tsecurity.NewPrincipal("test")
+	principal := tsecurity.NewPrincipal("server")
 
 	b.ResetTimer() // Exclude setup time from measurement.
 
@@ -32,7 +32,7 @@
 		b.StartTimer()
 		start := time.Now()
 
-		client, err := vif.InternalNewDialedVIF(nc, naming.FixedRoutingID(0xc), nil, mode)
+		client, err := vif.InternalNewDialedVIF(nc, naming.FixedRoutingID(0xc), principal, nil, mode)
 		if err != nil {
 			b.Fatal(err)
 		}
diff --git a/profiles/internal/ipc/stream/benchmark/throughput_flow.go b/profiles/internal/ipc/stream/benchmark/throughput_flow.go
index d102382..0f8be69 100644
--- a/profiles/internal/ipc/stream/benchmark/throughput_flow.go
+++ b/profiles/internal/ipc/stream/benchmark/throughput_flow.go
@@ -40,6 +40,7 @@
 func benchmarkFlow(b *testing.B, mode options.VCSecurityLevel, nVIFs, nVCsPerVIF, nFlowsPerVC int) {
 	client := manager.InternalNew(naming.FixedRoutingID(0xcccccccc))
 	server := manager.InternalNew(naming.FixedRoutingID(0x55555555))
+	principal := tsecurity.NewPrincipal("test")
 
 	lns, err := createListeners(mode, server, nVIFs)
 	if err != nil {
@@ -50,12 +51,14 @@
 	rchan := make(chan io.ReadCloser, nFlows)
 	wchan := make(chan io.WriteCloser, nFlows)
 
+	b.ResetTimer()
+
 	go func() {
 		defer close(wchan)
 		for i := 0; i < nVIFs; i++ {
 			ep := lns[i].ep
 			for j := 0; j < nVCsPerVIF; j++ {
-				vc, err := client.Dial(ep, mode)
+				vc, err := client.Dial(ep, principal, mode)
 				if err != nil {
 					b.Error(err)
 					return
diff --git a/profiles/internal/ipc/stream/manager/listener.go b/profiles/internal/ipc/stream/manager/listener.go
index 07fde42..fc4a916 100644
--- a/profiles/internal/ipc/stream/manager/listener.go
+++ b/profiles/internal/ipc/stream/manager/listener.go
@@ -8,7 +8,6 @@
 	"sync"
 
 	"v.io/x/ref/profiles/internal/ipc/stream/proxy"
-	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	"v.io/x/ref/profiles/internal/ipc/stream/vif"
 	"v.io/x/ref/profiles/internal/lib/upcqueue"
 	inaming "v.io/x/ref/profiles/internal/naming"
@@ -158,8 +157,7 @@
 
 func (ln *proxyListener) connect() (*vif.VIF, *inaming.Endpoint, error) {
 	vlog.VI(1).Infof("Connecting to proxy at %v", ln.proxyEP)
-	// Requires dialing a VC to the proxy, need to extract options (like the principal)
-	// from ln.opts to do so.
+	// Requires dialing a VC to the proxy, need to extract options from ln.opts to do so.
 	var dialOpts []stream.VCOpt
 	for _, opt := range ln.opts {
 		if dopt, ok := opt.(stream.VCOpt); ok {
@@ -167,9 +165,7 @@
 		}
 	}
 	// TODO(cnicolaou, ashankar): probably want to set a timeout here. (is this covered by opts?)
-	// TODO(suharshs): Pass the principal explicitly to FindOrDialVIF and remove vc.LocalPrincipal.
-	dialOpts = append(dialOpts, vc.LocalPrincipal{ln.principal})
-	vf, err := ln.manager.FindOrDialVIF(ln.proxyEP, dialOpts...)
+	vf, err := ln.manager.FindOrDialVIF(ln.proxyEP, ln.principal, dialOpts...)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -177,7 +173,7 @@
 		return nil, nil, fmt.Errorf("already connected to proxy and accepting connections? VIF: %v, StartAccepting error: %v", vf, err)
 	}
 	// Proxy protocol: See veyron/profiles/proxy/protocol.vdl
-	vc, err := vf.Dial(ln.proxyEP, dialOpts...)
+	vc, err := vf.Dial(ln.proxyEP, ln.principal, dialOpts...)
 	if err != nil {
 		vf.StopAccepting()
 		if verror.ErrorID(err) == verror.ErrAborted.ID {
diff --git a/profiles/internal/ipc/stream/manager/manager.go b/profiles/internal/ipc/stream/manager/manager.go
index e7c42e1..192c9b8 100644
--- a/profiles/internal/ipc/stream/manager/manager.go
+++ b/profiles/internal/ipc/stream/manager/manager.go
@@ -77,7 +77,7 @@
 // FindOrDialVIF returns the network connection (VIF) to the provided address
 // from the cache in the manager. If not already present in the cache, a new
 // connection will be created using net.Dial.
-func (m *manager) FindOrDialVIF(remote naming.Endpoint, opts ...stream.VCOpt) (*vif.VIF, error) {
+func (m *manager) FindOrDialVIF(remote naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (*vif.VIF, error) {
 	// Extract options.
 	var timeout time.Duration
 	for _, o := range opts {
@@ -116,7 +116,7 @@
 			vRange = r
 		}
 	}
-	vf, err := vif.InternalNewDialedVIF(conn, m.rid, vRange, opts...)
+	vf, err := vif.InternalNewDialedVIF(conn, m.rid, principal, vRange, opts...)
 	if err != nil {
 		conn.Close()
 		return nil, fmt.Errorf("failed to create VIF: %v", err)
@@ -133,15 +133,15 @@
 	return vf, nil
 }
 
-func (m *manager) Dial(remote naming.Endpoint, opts ...stream.VCOpt) (stream.VC, error) {
+func (m *manager) Dial(remote naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (stream.VC, error) {
 	// If vif.Dial fails because the cached network connection was broken, remove from
 	// the cache and try once more.
 	for retry := true; true; retry = false {
-		vf, err := m.FindOrDialVIF(remote, opts...)
+		vf, err := m.FindOrDialVIF(remote, principal, opts...)
 		if err != nil {
 			return nil, err
 		}
-		vc, err := vf.Dial(remote, append(opts, m.sessionCache)...)
+		vc, err := vf.Dial(remote, principal, append(opts, m.sessionCache)...)
 		if !retry || verror.ErrorID(err) != verror.ErrAborted.ID {
 			return vc, err
 		}
diff --git a/profiles/internal/ipc/stream/manager/manager_test.go b/profiles/internal/ipc/stream/manager/manager_test.go
index bcebc33..7e3a288 100644
--- a/profiles/internal/ipc/stream/manager/manager_test.go
+++ b/profiles/internal/ipc/stream/manager/manager_test.go
@@ -58,8 +58,9 @@
 func testSimpleFlow(t *testing.T, protocol string) {
 	server := InternalNew(naming.FixedRoutingID(0x55555555))
 	client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+	pclient := tsecurity.NewPrincipal("client")
 
-	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -68,7 +69,7 @@
 	var clientVC stream.VC
 	var clientF1 stream.Flow
 	go func() {
-		if clientVC, err = client.Dial(ep); err != nil {
+		if clientVC, err = client.Dial(ep, pclient); err != nil {
 			t.Errorf("Dial(%q) failed: %v", ep, err)
 			return
 		}
@@ -134,7 +135,7 @@
 		t.Errorf("Should not be able to Dial or Write after the Listener is closed")
 	}
 	// Opening a new VC should fail fast.
-	if _, err := client.Dial(ep); err == nil {
+	if _, err := client.Dial(ep, pclient); err == nil {
 		t.Errorf("Should not be able to Dial after listener is closed")
 	}
 }
@@ -154,7 +155,7 @@
 	go func() {
 		// 203.0.113.0 is TEST-NET-3 from RFC5737
 		ep, _ := inaming.NewEndpoint(naming.FormatEndpoint("tcp", "203.0.113.10:80"))
-		_, err := client.Dial(ep, &DialTimeout{time.Second})
+		_, err := client.Dial(ep, tsecurity.NewPrincipal("client"), &DialTimeout{time.Second})
 		ch <- err
 	}()
 
@@ -220,7 +221,7 @@
 	go func() {
 		// VCSecurityLevel is intentionally not provided to Dial - to
 		// test default behavior.
-		vc, err := client.Dial(ep, vc.LocalPrincipal{clientPrincipal})
+		vc, err := client.Dial(ep, clientPrincipal)
 		if err != nil {
 			errs <- err
 			return
@@ -302,20 +303,21 @@
 
 func testCloseListener(t *testing.T, protocol string) {
 	server := InternalNew(naming.FixedRoutingID(0x5e97e9))
+	pclient := tsecurity.NewPrincipal("client")
 
-	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Fatal(err)
 	}
 	// Server will just listen for flows and close them.
 	go acceptLoop(ln)
 	client := InternalNew(naming.FixedRoutingID(0xc1e41))
-	if _, err = client.Dial(ep); err != nil {
+	if _, err = client.Dial(ep, pclient); err != nil {
 		t.Fatal(err)
 	}
 	ln.Close()
 	client = InternalNew(naming.FixedRoutingID(0xc1e42))
-	if _, err := client.Dial(ep); err == nil {
+	if _, err := client.Dial(ep, pclient); err == nil {
 		t.Errorf("client.Dial(%q) should have failed", ep)
 	}
 }
@@ -352,7 +354,7 @@
 	server := InternalNew(naming.FixedRoutingID(0x55555555))
 	client := InternalNew(naming.FixedRoutingID(0xcccccccc))
 
-	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -360,7 +362,7 @@
 	// Server will just listen for flows and close them.
 	go acceptLoop(ln)
 
-	vc, err := client.Dial(ep)
+	vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -401,7 +403,7 @@
 
 	// Have the server read from each flow and write to rchan.
 	rchan := make(chan string)
-	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	ln, ep, err := server.Listen(protocol, "127.0.0.1:0", tsecurity.NewPrincipal("server"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -438,7 +440,7 @@
 	var vcs [nVCs]stream.VC
 	for i := 0; i < nVCs; i++ {
 		var err error
-		vcs[i], err = client.Dial(ep)
+		vcs[i], err = client.Dial(ep, tsecurity.NewPrincipal("client"))
 		if err != nil {
 			t.Fatal(err)
 		}
@@ -507,7 +509,7 @@
 
 	// Dial multiple VCs
 	for i := 0; i < 2; i++ {
-		if _, err = client.Dial(nep); err != nil {
+		if _, err = client.Dial(nep, tsecurity.NewPrincipal("client")); err != nil {
 			t.Fatalf("Dial #%d failed: %v", i, err)
 		}
 	}
@@ -531,6 +533,7 @@
 
 func testServerRestartDuringClientLifetime(t *testing.T, protocol string) {
 	client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+	pclient := tsecurity.NewPrincipal("client")
 	sh, err := modules.NewShell(nil, nil, testing.Verbose(), t)
 	if err != nil {
 		t.Fatalf("unexpected error: %s", err)
@@ -547,13 +550,13 @@
 	if err != nil {
 		t.Fatalf("inaming.NewEndpoint(%q): %v", addr, err)
 	}
-	if _, err := client.Dial(ep); err != nil {
+	if _, err := client.Dial(ep, pclient); err != nil {
 		t.Fatal(err)
 	}
 	h.Shutdown(nil, os.Stderr)
 
 	// A new VC cannot be created since the server is dead
-	if _, err := client.Dial(ep); err == nil {
+	if _, err := client.Dial(ep, pclient); err == nil {
 		t.Fatal("Expected client.Dial to fail since server is dead")
 	}
 
@@ -565,7 +568,7 @@
 	if addr2 := h.ReadLine(); addr2 != addr || err != nil {
 		t.Fatalf("Got (%q, %v) want (%q, nil)", addr2, err, addr)
 	}
-	if _, err := client.Dial(ep); err != nil {
+	if _, err := client.Dial(ep, pclient); err != nil {
 		t.Fatal(err)
 	}
 }
@@ -610,6 +613,7 @@
 func TestRegistration(t *testing.T) {
 	server := InternalNew(naming.FixedRoutingID(0x55555555))
 	client := InternalNew(naming.FixedRoutingID(0xcccccccc))
+	pserver := tsecurity.NewPrincipal("server")
 
 	dialer := func(_, _ string, _ time.Duration) (net.Conn, error) {
 		return nil, fmt.Errorf("tn.Dial")
@@ -619,12 +623,12 @@
 	}
 	ipc.RegisterProtocol("tn", dialer, listener)
 
-	_, _, err := server.Listen("tnx", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	_, _, err := server.Listen("tnx", "127.0.0.1:0", pserver)
 	if err == nil || !strings.Contains(err.Error(), "unknown network tnx") {
 		t.Fatal("expected error is missing (%v)", err)
 	}
 
-	_, _, err = server.Listen("tn", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	_, _, err = server.Listen("tn", "127.0.0.1:0", pserver)
 	if err == nil || !strings.Contains(err.Error(), "tn.Listen") {
 		t.Fatal("expected error is missing (%v)", err)
 	}
@@ -638,12 +642,12 @@
 		t.Errorf("got %t, want %t", got, want)
 	}
 
-	_, ep, err := server.Listen("tn", "127.0.0.1:0", tsecurity.NewPrincipal("test"))
+	_, ep, err := server.Listen("tn", "127.0.0.1:0", pserver)
 	if err != nil {
 		t.Errorf("unexpected error %s", err)
 	}
 
-	_, err = client.Dial(ep)
+	_, err = client.Dial(ep, tsecurity.NewPrincipal("client"))
 	if err == nil || !strings.Contains(err.Error(), "tn.Dial") {
 		t.Fatal("expected error is missing (%v)", err)
 	}
diff --git a/profiles/internal/ipc/stream/model.go b/profiles/internal/ipc/stream/model.go
index 5bee977..aa6095c 100644
--- a/profiles/internal/ipc/stream/model.go
+++ b/profiles/internal/ipc/stream/model.go
@@ -127,7 +127,9 @@
 	Listen(protocol, address string, principal security.Principal, opts ...ListenerOpt) (Listener, naming.Endpoint, error)
 
 	// Dial creates a VC to the provided remote endpoint.
-	Dial(remote naming.Endpoint, opts ...VCOpt) (VC, error)
+	// principal is used during authentication. If principal is nil, then the VC expects
+	// to be used for unauthenticated, unencrypted communication.
+	Dial(remote naming.Endpoint, principal security.Principal, opts ...VCOpt) (VC, error)
 
 	// ShutdownEndpoint closes all VCs (and Flows and Listeners over it)
 	// involving the provided remote endpoint.
diff --git a/profiles/internal/ipc/stream/proxy/proxy_test.go b/profiles/internal/ipc/stream/proxy/proxy_test.go
index 26123d6..ed9a607 100644
--- a/profiles/internal/ipc/stream/proxy/proxy_test.go
+++ b/profiles/internal/ipc/stream/proxy/proxy_test.go
@@ -122,7 +122,7 @@
 	other := manager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc))
 	defer other.Shutdown()
 
-	vc, err := other.Dial(proxyEp)
+	vc, err := other.Dial(proxyEp, tsecurity.NewPrincipal("other"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -170,7 +170,7 @@
 
 	client := manager.InternalNew(naming.FixedRoutingID(0xcccccccccccccccc))
 	defer client.Shutdown()
-	vc, err := client.Dial(ep)
+	vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -222,12 +222,14 @@
 	defer lnS.Close()
 	rchan := make(chan string)
 
+	pclient1 := tsecurity.NewPrincipal("client1")
+
 	// client1 must connect to the proxy to speak to the server.
 	// Keep a VC and Flow open to the server, to ensure that the proxy
 	// maintains routing information (at some point, inactive VIFs
 	// should be garbage collected, so this ensures that the VIF
 	// is "active")
-	if vc, err := client1.Dial(epS); err != nil {
+	if vc, err := client1.Dial(epS, pclient1); err != nil {
 		t.Fatal(err)
 	} else if flow, err := vc.Connect(); err != nil {
 		t.Fatal(err)
@@ -236,7 +238,7 @@
 	}
 
 	// Now client1 becomes a server
-	lnC, epC, err := client1.Listen(proxyEp.Network(), proxyEp.String(), tsecurity.NewPrincipal("test"))
+	lnC, epC, err := client1.Listen(proxyEp.Network(), proxyEp.String(), pclient1)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -253,7 +255,7 @@
 }
 
 func writeFlow(mgr stream.Manager, ep naming.Endpoint, data string) error {
-	vc, err := mgr.Dial(ep)
+	vc, err := mgr.Dial(ep, tsecurity.NewPrincipal("test"))
 	if err != nil {
 		return fmt.Errorf("manager.Dial(%v) failed: %v", ep, err)
 	}
diff --git a/profiles/internal/ipc/stream/vc/init.go b/profiles/internal/ipc/stream/vc/init.go
deleted file mode 100644
index 4fc3889..0000000
--- a/profiles/internal/ipc/stream/vc/init.go
+++ /dev/null
@@ -1,63 +0,0 @@
-package vc
-
-import (
-	"crypto/ecdsa"
-	"crypto/elliptic"
-	"crypto/rand"
-	"fmt"
-
-	"v.io/v23/security"
-	"v.io/x/lib/vlog"
-)
-
-var AnonymousPrincipal security.Principal
-
-func init() {
-	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
-	if err != nil {
-		vlog.Fatalf("could not create private key for anonymous principal: %v", err)
-	}
-	store := &anonymousBlessingStore{k: security.NewECDSAPublicKey(&key.PublicKey)}
-	if AnonymousPrincipal, err = security.CreatePrincipal(security.NewInMemoryECDSASigner(key), store, nil); err != nil {
-		vlog.Fatalf("could not create anonymous principal: %v", err)
-	}
-	if store.b, err = AnonymousPrincipal.BlessSelf("anonymous"); err != nil {
-		vlog.Fatalf("failed to generate the one blessing to be used by the anonymous principal: %v", err)
-	}
-}
-
-// TODO(ashankar,ataly): Figure out what to do with this!
-// (Most likely move the BlessingStore implementation from veyron/profiles/internal/rt to veyron/security
-// and use that?)
-type anonymousBlessingStore struct {
-	k security.PublicKey
-	b security.Blessings
-}
-
-func (s *anonymousBlessingStore) Set(security.Blessings, security.BlessingPattern) (security.Blessings, error) {
-	return security.Blessings{}, fmt.Errorf("cannot store blessings with an anonymous principal")
-}
-
-func (s *anonymousBlessingStore) ForPeer(...string) security.Blessings {
-	return s.b
-}
-
-func (s *anonymousBlessingStore) SetDefault(security.Blessings) error {
-	return fmt.Errorf("cannot change default blessing associated with the anonymous principal")
-}
-
-func (s *anonymousBlessingStore) Default() security.Blessings {
-	return s.b
-}
-
-func (s *anonymousBlessingStore) PublicKey() security.PublicKey {
-	return s.k
-}
-
-func (s *anonymousBlessingStore) PeerBlessings() map[security.BlessingPattern]security.Blessings {
-	return nil
-}
-
-func (anonymousBlessingStore) DebugString() string {
-	return "anonymous BlessingStore"
-}
diff --git a/profiles/internal/ipc/stream/vc/vc.go b/profiles/internal/ipc/stream/vc/vc.go
index f3e3cc7..b32ff82 100644
--- a/profiles/internal/ipc/stream/vc/vc.go
+++ b/profiles/internal/ipc/stream/vc/vc.go
@@ -139,14 +139,6 @@
 	Version      version.IPCVersion
 }
 
-// LocalPrincipal wraps a security.Principal so that it can be provided
-// as an option to various methods in order to provide authentication information
-// when establishing virtual circuits.
-type LocalPrincipal struct{ security.Principal }
-
-func (LocalPrincipal) IPCStreamVCOpt() {}
-func (LocalPrincipal) IPCClientOpt()   {}
-
 // DischargeClient is an interface for obtaining discharges for a set of third-party
 // caveats.
 //
@@ -407,17 +399,14 @@
 // HandshakeDialedVC completes initialization of the VC (setting up encryption,
 // authentication etc.) under the assumption that the VC was initiated by the
 // local process (i.e., the local process "Dial"ed to create the VC).
-func (vc *VC) HandshakeDialedVC(opts ...stream.VCOpt) error {
+func (vc *VC) HandshakeDialedVC(principal security.Principal, opts ...stream.VCOpt) error {
 	var (
-		principal       security.Principal
 		tlsSessionCache crypto.TLSClientSessionCache
 		securityLevel   options.VCSecurityLevel
 		auth            *ServerAuthorizer
 	)
 	for _, o := range opts {
 		switch v := o.(type) {
-		case LocalPrincipal:
-			principal = v.Principal
 		case options.VCSecurityLevel:
 			securityLevel = v
 		case crypto.TLSClientSessionCache:
@@ -429,7 +418,7 @@
 	switch securityLevel {
 	case options.VCSecurityConfidential:
 		if principal == nil {
-			principal = AnonymousPrincipal
+			return fmt.Errorf("principal required for VCSecurityConfidential")
 		}
 	case options.VCSecurityNone:
 		return nil
diff --git a/profiles/internal/ipc/stream/vc/vc_test.go b/profiles/internal/ipc/stream/vc/vc_test.go
index 056716e..302f477 100644
--- a/profiles/internal/ipc/stream/vc/vc_test.go
+++ b/profiles/internal/ipc/stream/vc/vc_test.go
@@ -474,7 +474,7 @@
 	go serverH.pipeLoop(clientH.VC)
 
 	lopts := []stream.ListenerOpt{security}
-	vcopts := []stream.VCOpt{vc.LocalPrincipal{client}, security}
+	vcopts := []stream.VCOpt{security}
 
 	if dischargeClient != nil {
 		lopts = append(lopts, dischargeClient)
@@ -484,7 +484,7 @@
 	}
 
 	c := serverH.VC.HandshakeAcceptedVC(server, lopts...)
-	if err := clientH.VC.HandshakeDialedVC(vcopts...); err != nil {
+	if err := clientH.VC.HandshakeDialedVC(client, vcopts...); err != nil {
 		go func() { <-c }()
 		return nil, nil, err
 	}
diff --git a/profiles/internal/ipc/stream/vif/set_test.go b/profiles/internal/ipc/stream/vif/set_test.go
index ca53318..6621d4b 100644
--- a/profiles/internal/ipc/stream/vif/set_test.go
+++ b/profiles/internal/ipc/stream/vif/set_test.go
@@ -60,14 +60,14 @@
 func newVIF(c, s net.Conn) (*vif.VIF, *vif.VIF, error) {
 	done := make(chan *vif.VIF)
 	go func() {
-		vf, err := vif.InternalNewAcceptedVIF(s, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("test"), nil)
+		vf, err := vif.InternalNewAcceptedVIF(s, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("accepted"), nil)
 		if err != nil {
 			panic(err)
 		}
 		done <- vf
 	}()
 
-	vf, err := vif.InternalNewDialedVIF(c, naming.FixedRoutingID(0xc), nil, nil, nil)
+	vf, err := vif.InternalNewDialedVIF(c, naming.FixedRoutingID(0xc), tsecurity.NewPrincipal("dialed"), nil)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/profiles/internal/ipc/stream/vif/vif.go b/profiles/internal/ipc/stream/vif/vif.go
index 97bbe65..5279034 100644
--- a/profiles/internal/ipc/stream/vif/vif.go
+++ b/profiles/internal/ipc/stream/vif/vif.go
@@ -131,8 +131,8 @@
 // As the name suggests, this method is intended for use only within packages
 // placed inside veyron/profiles/internal. Code outside the
 // veyron2/profiles/internal/* packages should never call this method.
-func InternalNewDialedVIF(conn net.Conn, rid naming.RoutingID, versions *version.Range, opts ...stream.VCOpt) (*VIF, error) {
-	ctx, principal, err := clientAuthOptions(opts)
+func InternalNewDialedVIF(conn net.Conn, rid naming.RoutingID, principal security.Principal, versions *version.Range, opts ...stream.VCOpt) (*VIF, error) {
+	ctx, principal, err := clientAuthOptions(principal, opts)
 	if err != nil {
 		return nil, err
 	}
@@ -229,7 +229,7 @@
 
 // Dial creates a new VC to the provided remote identity, authenticating the VC
 // with the provided local identity.
-func (vif *VIF) Dial(remoteEP naming.Endpoint, opts ...stream.VCOpt) (stream.VC, error) {
+func (vif *VIF) Dial(remoteEP naming.Endpoint, principal security.Principal, opts ...stream.VCOpt) (stream.VC, error) {
 	vc, err := vif.newVC(vif.allocVCI(), vif.localEP, remoteEP, true)
 	if err != nil {
 		return nil, err
@@ -255,7 +255,7 @@
 		vc.Close(err.Error())
 		return nil, err
 	}
-	if err := vc.HandshakeDialedVC(opts...); err != nil {
+	if err := vc.HandshakeDialedVC(principal, opts...); err != nil {
 		vif.vcMap.Delete(vc.VCI())
 		err = fmt.Errorf("VC handshake failed: %v", err)
 		vc.Close(err.Error())
@@ -961,16 +961,16 @@
 	return ep
 }
 
-// clientAuthOptions extracts the client authentication options from the options
-// list.
-func clientAuthOptions(lopts []stream.VCOpt) (ctx *context.T, principal security.Principal, err error) {
-	var securityLevel options.VCSecurityLevel
+// clientAuthOptions returns credentials for VIF authentication, based on the provided principal and options list.
+func clientAuthOptions(principal security.Principal, lopts []stream.VCOpt) (*context.T, security.Principal, error) {
+	var (
+		securityLevel options.VCSecurityLevel
+		ctx           *context.T
+	)
 	for _, o := range lopts {
 		switch v := o.(type) {
 		case vc.DialContext:
 			ctx = v.T
-		case vc.LocalPrincipal:
-			principal = v.Principal
 		case options.VCSecurityLevel:
 			securityLevel = v
 		}
@@ -978,12 +978,12 @@
 	switch securityLevel {
 	case options.VCSecurityConfidential:
 		if principal == nil {
-			principal = vc.AnonymousPrincipal
+			return nil, nil, fmt.Errorf("principal required for VCSecurityConfidential")
 		}
+		return ctx, principal, nil
 	case options.VCSecurityNone:
-		principal = nil
+		return ctx, nil, nil
 	default:
-		err = fmt.Errorf("unrecognized VC security level: %v", securityLevel)
+		return nil, nil, fmt.Errorf("unrecognized VC security level: %v", securityLevel)
 	}
-	return
 }
diff --git a/profiles/internal/ipc/stream/vif/vif_test.go b/profiles/internal/ipc/stream/vif/vif_test.go
index cf99618..4bb1abe 100644
--- a/profiles/internal/ipc/stream/vif/vif_test.go
+++ b/profiles/internal/ipc/stream/vif/vif_test.go
@@ -19,7 +19,6 @@
 	"v.io/v23/ipc/version"
 	"v.io/v23/naming"
 
-	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	"v.io/x/ref/profiles/internal/ipc/stream/vif"
 	iversion "v.io/x/ref/profiles/internal/ipc/version"
 	tsecurity "v.io/x/ref/test/security"
@@ -30,10 +29,6 @@
 
 //go:generate v23 test generate
 
-func newPrincipal(defaultBlessing string) vc.LocalPrincipal {
-	return vc.LocalPrincipal{tsecurity.NewPrincipal("defaultBlessing")}
-}
-
 func TestSingleFlowCreatedAtClient(t *testing.T) {
 	client, server := NewClientServer()
 	defer client.Close()
@@ -383,21 +378,22 @@
 func TestNetworkFailure(t *testing.T) {
 	c1, c2 := pipe()
 	result := make(chan *vif.VIF)
+	pclient := tsecurity.NewPrincipal("client")
 	go func() {
-		client, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), nil)
+		client, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), pclient, nil)
 		if err != nil {
 			t.Fatal(err)
 		}
 		result <- client
 	}()
-	server, err := vif.InternalNewAcceptedVIF(c2, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("test"), nil)
+	server, err := vif.InternalNewAcceptedVIF(c2, naming.FixedRoutingID(0x5), tsecurity.NewPrincipal("server"), nil)
 	if err != nil {
 		t.Fatal(err)
 	}
 	client := <-result
 	// If the network connection dies, Dial and Accept should fail.
 	c1.Close()
-	if _, err := client.Dial(makeEP(0x5)); err == nil {
+	if _, err := client.Dial(makeEP(0x5), pclient); err == nil {
 		t.Errorf("Expected client.Dial to fail")
 	}
 	if _, err := server.Accept(); err == nil {
@@ -493,7 +489,7 @@
 	var cerr error
 	cl := make(chan *vif.VIF)
 	go func() {
-		c, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), clientVersions, newPrincipal("client"))
+		c, err := vif.InternalNewDialedVIF(c1, naming.FixedRoutingID(0xc), tsecurity.NewPrincipal("client"), clientVersions)
 		if err != nil {
 			cerr = err
 			close(cl)
@@ -550,7 +546,7 @@
 	scChan := make(chan stream.Connector)
 	errChan := make(chan error)
 	go func() {
-		vc, err := client.Dial(ep, newPrincipal("client"))
+		vc, err := client.Dial(ep, tsecurity.NewPrincipal("client"))
 		errChan <- err
 		vcChan <- vc
 	}()
diff --git a/profiles/internal/ipc/test/proxy_test.go b/profiles/internal/ipc/test/proxy_test.go
index df7d9f3..6c7c2f8 100644
--- a/profiles/internal/ipc/test/proxy_test.go
+++ b/profiles/internal/ipc/test/proxy_test.go
@@ -25,7 +25,6 @@
 	iipc "v.io/x/ref/profiles/internal/ipc"
 	imanager "v.io/x/ref/profiles/internal/ipc/stream/manager"
 	"v.io/x/ref/profiles/internal/ipc/stream/proxy"
-	"v.io/x/ref/profiles/internal/ipc/stream/vc"
 	"v.io/x/ref/profiles/internal/lib/publisher"
 	inaming "v.io/x/ref/profiles/internal/naming"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
@@ -177,7 +176,7 @@
 	)
 	defer smserver.Shutdown()
 	defer smclient.Shutdown()
-	client, err := iipc.InternalNewClient(smserver, ns, vc.LocalPrincipal{tsecurity.NewPrincipal("client")})
+	client, err := iipc.InternalNewClient(smserver, ns)
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/profiles/internal/ipc/testutil_test.go b/profiles/internal/ipc/testutil_test.go
index a35808f..0648593 100644
--- a/profiles/internal/ipc/testutil_test.go
+++ b/profiles/internal/ipc/testutil_test.go
@@ -5,6 +5,12 @@
 	"testing"
 	"time"
 
+	"v.io/v23/vtrace"
+	"v.io/x/ref/lib/flags"
+	ivtrace "v.io/x/ref/profiles/internal/vtrace"
+	"v.io/x/ref/test"
+
+	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/security"
@@ -68,6 +74,16 @@
 	return b
 }
 
+func initForTest() (*context.T, v23.Shutdown) {
+	ctx, shutdown := test.InitForTest()
+	ctx, err := ivtrace.Init(ctx, flags.VtraceFlags{})
+	if err != nil {
+		panic(err)
+	}
+	ctx, _ = vtrace.SetNewTrace(ctx)
+	return ctx, shutdown
+}
+
 func mkThirdPartyCaveat(discharger security.PublicKey, location string, c security.Caveat) security.Caveat {
 	tpc, err := security.NewPublicKeyCaveat(discharger, location, security.ThirdPartyRequirements{}, c)
 	if err != nil {
@@ -76,15 +92,6 @@
 	return tpc
 }
 
-// We need a special way to create contexts for tests.  We
-// can't create a real runtime in the runtime implementation
-// so we use a fake one that panics if used.  The runtime
-// implementation should not ever use the Runtime from a context.
-func testContext() *context.T {
-	ctx, _ := context.WithTimeout(testContextWithoutDeadline(), 20*time.Second)
-	return ctx
-}
-
 // mockCall implements security.Call
 type mockCall struct {
 	p      security.Principal
diff --git a/profiles/internal/ipc/v23_internal_test.go b/profiles/internal/ipc/v23_test.go
similarity index 85%
rename from profiles/internal/ipc/v23_internal_test.go
rename to profiles/internal/ipc/v23_test.go
index 9597c2e..0efc85a 100644
--- a/profiles/internal/ipc/v23_internal_test.go
+++ b/profiles/internal/ipc/v23_test.go
@@ -4,7 +4,7 @@
 
 // This file was auto-generated via go generate.
 // DO NOT UPDATE MANUALLY
-package ipc
+package ipc_test
 
 import "fmt"
 import "testing"
@@ -13,6 +13,10 @@
 import "v.io/x/ref/test"
 import "v.io/x/ref/test/modules"
 
+func init() {
+	modules.RegisterChild("rootMountTable", ``, rootMountTable)
+}
+
 func TestMain(m *testing.M) {
 	test.Init()
 	if modules.IsModulesChildProcess() {
