ref: Move context.T out of rpc.ServerCall.

The purpose of this change is to make our usage of context.T more
consistent; it was a bit lame that we gave guidance to never wrap
context.T in another type, but were doing it ourselves.  The JS
code is also being changed to follow this convention (in separate
CLs), so we'll be consistent between Go and JS as well.

The server implementation used to look like this:
func (*impl) Foo(call rpc.ServerCall, ...)

Now it looks like this:
func (*impl) Foo(ctx *context.T, call rpc.ServerCall, ...)

Also added a ServerCall.Security() function, which returns the
security.Call.  The security.Call is still embedded inside
context.T for now; a subsequent change will remove it from
context.T and add an explicit security.Call argument where
necessary.  That's a separate CL since some of the choices may be
more controversial, and it's a smaller set of changes.

MultiPart: 2/8
Change-Id: If1ea84b4263836f7ddd82b965c35178a73d314cf
diff --git a/cmd/mounttable/impl_test.go b/cmd/mounttable/impl_test.go
index 348319b..40f66cb 100644
--- a/cmd/mounttable/impl_test.go
+++ b/cmd/mounttable/impl_test.go
@@ -39,7 +39,7 @@
 	suffix string
 }
 
-func (s *server) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (s *server) Glob__(_ *context.T, _ rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	vlog.VI(2).Infof("Glob() was called. suffix=%v pattern=%q", s.suffix, pattern)
 	ch := make(chan naming.GlobReply, 2)
 	ch <- naming.GlobReplyEntry{naming.MountEntry{"name1", []naming.MountedServer{{"server1", deadline(1)}}, false, false}}
@@ -48,40 +48,40 @@
 	return ch, nil
 }
 
-func (s *server) Mount(_ rpc.ServerCall, server string, ttl uint32, flags naming.MountFlag) error {
+func (s *server) Mount(_ *context.T, _ rpc.ServerCall, server string, ttl uint32, flags naming.MountFlag) error {
 	vlog.VI(2).Infof("Mount() was called. suffix=%v server=%q ttl=%d", s.suffix, server, ttl)
 	return nil
 }
 
-func (s *server) Unmount(_ rpc.ServerCall, server string) error {
+func (s *server) Unmount(_ *context.T, _ rpc.ServerCall, server string) error {
 	vlog.VI(2).Infof("Unmount() was called. suffix=%v server=%q", s.suffix, server)
 	return nil
 }
 
-func (s *server) ResolveStep(rpc.ServerCall) (entry naming.MountEntry, err error) {
+func (s *server) ResolveStep(*context.T, rpc.ServerCall) (entry naming.MountEntry, err error) {
 	vlog.VI(2).Infof("ResolveStep() was called. suffix=%v", s.suffix)
 	entry.Servers = []naming.MountedServer{{"server1", deadline(1)}}
 	entry.Name = s.suffix
 	return
 }
 
-func (s *server) ResolveStepX(rpc.ServerCall) (entry naming.MountEntry, err error) {
+func (s *server) ResolveStepX(*context.T, rpc.ServerCall) (entry naming.MountEntry, err error) {
 	vlog.VI(2).Infof("ResolveStepX() was called. suffix=%v", s.suffix)
 	entry.Servers = []naming.MountedServer{{"server1", deadline(1)}}
 	entry.Name = s.suffix
 	return
 }
 
-func (s *server) Delete(rpc.ServerCall, bool) error {
+func (s *server) Delete(*context.T, rpc.ServerCall, bool) error {
 	vlog.VI(2).Infof("Delete() was called. suffix=%v", s.suffix)
 	return nil
 }
-func (s *server) SetPermissions(rpc.ServerCall, access.Permissions, string) error {
+func (s *server) SetPermissions(*context.T, rpc.ServerCall, access.Permissions, string) error {
 	vlog.VI(2).Infof("SetPermissions() was called. suffix=%v", s.suffix)
 	return nil
 }
 
-func (s *server) GetPermissions(rpc.ServerCall) (access.Permissions, string, error) {
+func (s *server) GetPermissions(*context.T, rpc.ServerCall) (access.Permissions, string, error) {
 	vlog.VI(2).Infof("GetPermissions() was called. suffix=%v", s.suffix)
 	return nil, "", nil
 }
diff --git a/cmd/principal/main.go b/cmd/principal/main.go
index 5aa4ae8..226e365 100644
--- a/cmd/principal/main.go
+++ b/cmd/principal/main.go
@@ -1147,7 +1147,7 @@
 	token     string
 }
 
-func (r *recvBlessingsService) Grant(call rpc.StreamServerCall, token string) error {
+func (r *recvBlessingsService) Grant(_ *context.T, call rpc.ServerCall, token string) error {
 	b := call.GrantedBlessings()
 	if b.IsZero() {
 		return fmt.Errorf("no blessings granted by sender")
diff --git a/cmd/vdl/arith_test.go b/cmd/vdl/arith_test.go
index 21c4d65..7918765 100644
--- a/cmd/vdl/arith_test.go
+++ b/cmd/vdl/arith_test.go
@@ -39,23 +39,23 @@
 // serverArith implements the arith.Arith interface.
 type serverArith struct{}
 
-func (*serverArith) Add(_ rpc.ServerCall, A, B int32) (int32, error) {
+func (*serverArith) Add(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, error) {
 	return A + B, nil
 }
 
-func (*serverArith) DivMod(_ rpc.ServerCall, A, B int32) (int32, int32, error) {
+func (*serverArith) DivMod(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, int32, error) {
 	return A / B, A % B, nil
 }
 
-func (*serverArith) Sub(_ rpc.ServerCall, args base.Args) (int32, error) {
+func (*serverArith) Sub(_ *context.T, _ rpc.ServerCall, args base.Args) (int32, error) {
 	return args.A - args.B, nil
 }
 
-func (*serverArith) Mul(_ rpc.ServerCall, nestedArgs base.NestedArgs) (int32, error) {
+func (*serverArith) Mul(_ *context.T, _ rpc.ServerCall, nestedArgs base.NestedArgs) (int32, error) {
 	return nestedArgs.Args.A * nestedArgs.Args.B, nil
 }
 
-func (*serverArith) Count(call arith.ArithCountServerCall, start int32) error {
+func (*serverArith) Count(_ *context.T, call arith.ArithCountServerCall, start int32) error {
 	const kNum = 1000
 	for i := int32(0); i < kNum; i++ {
 		if err := call.SendStream().Send(start + i); err != nil {
@@ -65,7 +65,7 @@
 	return nil
 }
 
-func (*serverArith) StreamingAdd(call arith.ArithStreamingAddServerCall) (int32, error) {
+func (*serverArith) StreamingAdd(_ *context.T, call arith.ArithStreamingAddServerCall) (int32, error) {
 	var total int32
 	for call.RecvStream().Advance() {
 		value := call.RecvStream().Value()
@@ -75,11 +75,11 @@
 	return total, call.RecvStream().Err()
 }
 
-func (*serverArith) GenError(_ rpc.ServerCall) error {
+func (*serverArith) GenError(_ *context.T, _ rpc.ServerCall) error {
 	return generatedError
 }
 
-func (*serverArith) QuoteAny(_ rpc.ServerCall, any *vdl.Value) (*vdl.Value, error) {
+func (*serverArith) QuoteAny(_ *context.T, _ rpc.ServerCall, any *vdl.Value) (*vdl.Value, error) {
 	return vdl.StringValue(any.String()), nil
 }
 
@@ -87,23 +87,23 @@
 	serverArith
 }
 
-func (*serverCalculator) Sine(_ rpc.ServerCall, angle float64) (float64, error) {
+func (*serverCalculator) Sine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) {
 	return math.Sin(angle), nil
 }
 
-func (*serverCalculator) Cosine(_ rpc.ServerCall, angle float64) (float64, error) {
+func (*serverCalculator) Cosine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) {
 	return math.Cos(angle), nil
 }
 
-func (*serverCalculator) Exp(_ rpc.ServerCall, x float64) (float64, error) {
+func (*serverCalculator) Exp(_ *context.T, _ rpc.ServerCall, x float64) (float64, error) {
 	return math.Exp(x), nil
 }
 
-func (*serverCalculator) On(_ rpc.ServerCall) error {
+func (*serverCalculator) On(_ *context.T, _ rpc.ServerCall) error {
 	return nil
 }
 
-func (*serverCalculator) Off(_ rpc.ServerCall) error {
+func (*serverCalculator) Off(_ *context.T, _ rpc.ServerCall) error {
 	return nil
 }
 
diff --git a/cmd/vrpc/internal/test_base.vdl.go b/cmd/vrpc/internal/test_base.vdl.go
index 71fc0ba..103fcdc 100644
--- a/cmd/vrpc/internal/test_base.vdl.go
+++ b/cmd/vrpc/internal/test_base.vdl.go
@@ -246,26 +246,26 @@
 // test Signature output, which sorts methods alphabetically.
 type TypeTesterServerMethods interface {
 	// Methods to test support for primitive types.
-	EchoBool(call rpc.ServerCall, I1 bool) (O1 bool, err error)
-	EchoFloat32(call rpc.ServerCall, I1 float32) (O1 float32, err error)
-	EchoFloat64(call rpc.ServerCall, I1 float64) (O1 float64, err error)
-	EchoInt32(call rpc.ServerCall, I1 int32) (O1 int32, err error)
-	EchoInt64(call rpc.ServerCall, I1 int64) (O1 int64, err error)
-	EchoString(call rpc.ServerCall, I1 string) (O1 string, err error)
-	EchoByte(call rpc.ServerCall, I1 byte) (O1 byte, err error)
-	EchoUint32(call rpc.ServerCall, I1 uint32) (O1 uint32, err error)
-	EchoUint64(call rpc.ServerCall, I1 uint64) (O1 uint64, err error)
+	EchoBool(ctx *context.T, call rpc.ServerCall, I1 bool) (O1 bool, err error)
+	EchoFloat32(ctx *context.T, call rpc.ServerCall, I1 float32) (O1 float32, err error)
+	EchoFloat64(ctx *context.T, call rpc.ServerCall, I1 float64) (O1 float64, err error)
+	EchoInt32(ctx *context.T, call rpc.ServerCall, I1 int32) (O1 int32, err error)
+	EchoInt64(ctx *context.T, call rpc.ServerCall, I1 int64) (O1 int64, err error)
+	EchoString(ctx *context.T, call rpc.ServerCall, I1 string) (O1 string, err error)
+	EchoByte(ctx *context.T, call rpc.ServerCall, I1 byte) (O1 byte, err error)
+	EchoUint32(ctx *context.T, call rpc.ServerCall, I1 uint32) (O1 uint32, err error)
+	EchoUint64(ctx *context.T, call rpc.ServerCall, I1 uint64) (O1 uint64, err error)
 	// Methods to test support for composite types.
-	XEchoArray(call rpc.ServerCall, I1 Array2Int) (O1 Array2Int, err error)
-	XEchoMap(call rpc.ServerCall, I1 map[int32]string) (O1 map[int32]string, err error)
-	XEchoSet(call rpc.ServerCall, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
-	XEchoSlice(call rpc.ServerCall, I1 []int32) (O1 []int32, err error)
-	XEchoStruct(call rpc.ServerCall, I1 Struct) (O1 Struct, err error)
+	XEchoArray(ctx *context.T, call rpc.ServerCall, I1 Array2Int) (O1 Array2Int, err error)
+	XEchoMap(ctx *context.T, call rpc.ServerCall, I1 map[int32]string) (O1 map[int32]string, err error)
+	XEchoSet(ctx *context.T, call rpc.ServerCall, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
+	XEchoSlice(ctx *context.T, call rpc.ServerCall, I1 []int32) (O1 []int32, err error)
+	XEchoStruct(ctx *context.T, call rpc.ServerCall, I1 Struct) (O1 Struct, err error)
 	// Methods to test support for different number of arguments.
-	YMultiArg(call rpc.ServerCall, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
-	YNoArgs(rpc.ServerCall) error
+	YMultiArg(ctx *context.T, call rpc.ServerCall, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
+	YNoArgs(*context.T, rpc.ServerCall) error
 	// Methods to test support for streaming.
-	ZStream(call TypeTesterZStreamServerCall, NumStreamItems int32, StreamItem bool) error
+	ZStream(ctx *context.T, call TypeTesterZStreamServerCall, NumStreamItems int32, StreamItem bool) error
 }
 
 // TypeTesterServerStubMethods is the server interface containing
@@ -274,26 +274,26 @@
 // is the streaming methods.
 type TypeTesterServerStubMethods interface {
 	// Methods to test support for primitive types.
-	EchoBool(call rpc.ServerCall, I1 bool) (O1 bool, err error)
-	EchoFloat32(call rpc.ServerCall, I1 float32) (O1 float32, err error)
-	EchoFloat64(call rpc.ServerCall, I1 float64) (O1 float64, err error)
-	EchoInt32(call rpc.ServerCall, I1 int32) (O1 int32, err error)
-	EchoInt64(call rpc.ServerCall, I1 int64) (O1 int64, err error)
-	EchoString(call rpc.ServerCall, I1 string) (O1 string, err error)
-	EchoByte(call rpc.ServerCall, I1 byte) (O1 byte, err error)
-	EchoUint32(call rpc.ServerCall, I1 uint32) (O1 uint32, err error)
-	EchoUint64(call rpc.ServerCall, I1 uint64) (O1 uint64, err error)
+	EchoBool(ctx *context.T, call rpc.ServerCall, I1 bool) (O1 bool, err error)
+	EchoFloat32(ctx *context.T, call rpc.ServerCall, I1 float32) (O1 float32, err error)
+	EchoFloat64(ctx *context.T, call rpc.ServerCall, I1 float64) (O1 float64, err error)
+	EchoInt32(ctx *context.T, call rpc.ServerCall, I1 int32) (O1 int32, err error)
+	EchoInt64(ctx *context.T, call rpc.ServerCall, I1 int64) (O1 int64, err error)
+	EchoString(ctx *context.T, call rpc.ServerCall, I1 string) (O1 string, err error)
+	EchoByte(ctx *context.T, call rpc.ServerCall, I1 byte) (O1 byte, err error)
+	EchoUint32(ctx *context.T, call rpc.ServerCall, I1 uint32) (O1 uint32, err error)
+	EchoUint64(ctx *context.T, call rpc.ServerCall, I1 uint64) (O1 uint64, err error)
 	// Methods to test support for composite types.
-	XEchoArray(call rpc.ServerCall, I1 Array2Int) (O1 Array2Int, err error)
-	XEchoMap(call rpc.ServerCall, I1 map[int32]string) (O1 map[int32]string, err error)
-	XEchoSet(call rpc.ServerCall, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
-	XEchoSlice(call rpc.ServerCall, I1 []int32) (O1 []int32, err error)
-	XEchoStruct(call rpc.ServerCall, I1 Struct) (O1 Struct, err error)
+	XEchoArray(ctx *context.T, call rpc.ServerCall, I1 Array2Int) (O1 Array2Int, err error)
+	XEchoMap(ctx *context.T, call rpc.ServerCall, I1 map[int32]string) (O1 map[int32]string, err error)
+	XEchoSet(ctx *context.T, call rpc.ServerCall, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
+	XEchoSlice(ctx *context.T, call rpc.ServerCall, I1 []int32) (O1 []int32, err error)
+	XEchoStruct(ctx *context.T, call rpc.ServerCall, I1 Struct) (O1 Struct, err error)
 	// Methods to test support for different number of arguments.
-	YMultiArg(call rpc.ServerCall, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
-	YNoArgs(rpc.ServerCall) error
+	YMultiArg(ctx *context.T, call rpc.ServerCall, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
+	YNoArgs(*context.T, rpc.ServerCall) error
 	// Methods to test support for streaming.
-	ZStream(call *TypeTesterZStreamServerCallStub, NumStreamItems int32, StreamItem bool) error
+	ZStream(ctx *context.T, call *TypeTesterZStreamServerCallStub, NumStreamItems int32, StreamItem bool) error
 }
 
 // TypeTesterServerStub adds universal methods to TypeTesterServerStubMethods.
@@ -325,72 +325,72 @@
 	gs   *rpc.GlobState
 }
 
-func (s implTypeTesterServerStub) EchoBool(call rpc.ServerCall, i0 bool) (bool, error) {
-	return s.impl.EchoBool(call, i0)
+func (s implTypeTesterServerStub) EchoBool(ctx *context.T, call rpc.ServerCall, i0 bool) (bool, error) {
+	return s.impl.EchoBool(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoFloat32(call rpc.ServerCall, i0 float32) (float32, error) {
-	return s.impl.EchoFloat32(call, i0)
+func (s implTypeTesterServerStub) EchoFloat32(ctx *context.T, call rpc.ServerCall, i0 float32) (float32, error) {
+	return s.impl.EchoFloat32(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoFloat64(call rpc.ServerCall, i0 float64) (float64, error) {
-	return s.impl.EchoFloat64(call, i0)
+func (s implTypeTesterServerStub) EchoFloat64(ctx *context.T, call rpc.ServerCall, i0 float64) (float64, error) {
+	return s.impl.EchoFloat64(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoInt32(call rpc.ServerCall, i0 int32) (int32, error) {
-	return s.impl.EchoInt32(call, i0)
+func (s implTypeTesterServerStub) EchoInt32(ctx *context.T, call rpc.ServerCall, i0 int32) (int32, error) {
+	return s.impl.EchoInt32(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoInt64(call rpc.ServerCall, i0 int64) (int64, error) {
-	return s.impl.EchoInt64(call, i0)
+func (s implTypeTesterServerStub) EchoInt64(ctx *context.T, call rpc.ServerCall, i0 int64) (int64, error) {
+	return s.impl.EchoInt64(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoString(call rpc.ServerCall, i0 string) (string, error) {
-	return s.impl.EchoString(call, i0)
+func (s implTypeTesterServerStub) EchoString(ctx *context.T, call rpc.ServerCall, i0 string) (string, error) {
+	return s.impl.EchoString(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoByte(call rpc.ServerCall, i0 byte) (byte, error) {
-	return s.impl.EchoByte(call, i0)
+func (s implTypeTesterServerStub) EchoByte(ctx *context.T, call rpc.ServerCall, i0 byte) (byte, error) {
+	return s.impl.EchoByte(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoUint32(call rpc.ServerCall, i0 uint32) (uint32, error) {
-	return s.impl.EchoUint32(call, i0)
+func (s implTypeTesterServerStub) EchoUint32(ctx *context.T, call rpc.ServerCall, i0 uint32) (uint32, error) {
+	return s.impl.EchoUint32(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) EchoUint64(call rpc.ServerCall, i0 uint64) (uint64, error) {
-	return s.impl.EchoUint64(call, i0)
+func (s implTypeTesterServerStub) EchoUint64(ctx *context.T, call rpc.ServerCall, i0 uint64) (uint64, error) {
+	return s.impl.EchoUint64(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoArray(call rpc.ServerCall, i0 Array2Int) (Array2Int, error) {
-	return s.impl.XEchoArray(call, i0)
+func (s implTypeTesterServerStub) XEchoArray(ctx *context.T, call rpc.ServerCall, i0 Array2Int) (Array2Int, error) {
+	return s.impl.XEchoArray(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoMap(call rpc.ServerCall, i0 map[int32]string) (map[int32]string, error) {
-	return s.impl.XEchoMap(call, i0)
+func (s implTypeTesterServerStub) XEchoMap(ctx *context.T, call rpc.ServerCall, i0 map[int32]string) (map[int32]string, error) {
+	return s.impl.XEchoMap(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoSet(call rpc.ServerCall, i0 map[int32]struct{}) (map[int32]struct{}, error) {
-	return s.impl.XEchoSet(call, i0)
+func (s implTypeTesterServerStub) XEchoSet(ctx *context.T, call rpc.ServerCall, i0 map[int32]struct{}) (map[int32]struct{}, error) {
+	return s.impl.XEchoSet(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoSlice(call rpc.ServerCall, i0 []int32) ([]int32, error) {
-	return s.impl.XEchoSlice(call, i0)
+func (s implTypeTesterServerStub) XEchoSlice(ctx *context.T, call rpc.ServerCall, i0 []int32) ([]int32, error) {
+	return s.impl.XEchoSlice(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) XEchoStruct(call rpc.ServerCall, i0 Struct) (Struct, error) {
-	return s.impl.XEchoStruct(call, i0)
+func (s implTypeTesterServerStub) XEchoStruct(ctx *context.T, call rpc.ServerCall, i0 Struct) (Struct, error) {
+	return s.impl.XEchoStruct(ctx, call, i0)
 }
 
-func (s implTypeTesterServerStub) YMultiArg(call rpc.ServerCall, i0 int32, i1 int32) (int32, int32, error) {
-	return s.impl.YMultiArg(call, i0, i1)
+func (s implTypeTesterServerStub) YMultiArg(ctx *context.T, call rpc.ServerCall, i0 int32, i1 int32) (int32, int32, error) {
+	return s.impl.YMultiArg(ctx, call, i0, i1)
 }
 
-func (s implTypeTesterServerStub) YNoArgs(call rpc.ServerCall) error {
-	return s.impl.YNoArgs(call)
+func (s implTypeTesterServerStub) YNoArgs(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.YNoArgs(ctx, call)
 }
 
-func (s implTypeTesterServerStub) ZStream(call *TypeTesterZStreamServerCallStub, i0 int32, i1 bool) error {
-	return s.impl.ZStream(call, i0, i1)
+func (s implTypeTesterServerStub) ZStream(ctx *context.T, call *TypeTesterZStreamServerCallStub, i0 int32, i1 bool) error {
+	return s.impl.ZStream(ctx, call, i0, i1)
 }
 
 func (s implTypeTesterServerStub) Globber() *rpc.GlobState {
diff --git a/cmd/vrpc/vrpc_test.go b/cmd/vrpc/vrpc_test.go
index 190efc4..d6aebaa 100644
--- a/cmd/vrpc/vrpc_test.go
+++ b/cmd/vrpc/vrpc_test.go
@@ -10,6 +10,7 @@
 	"testing"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/x/lib/vlog"
 
@@ -24,87 +25,87 @@
 
 // TypeTester interface implementation
 
-func (*server) EchoBool(call rpc.ServerCall, i1 bool) (bool, error) {
+func (*server) EchoBool(_ *context.T, _ rpc.ServerCall, i1 bool) (bool, error) {
 	vlog.VI(2).Info("EchoBool(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoFloat32(call rpc.ServerCall, i1 float32) (float32, error) {
+func (*server) EchoFloat32(_ *context.T, _ rpc.ServerCall, i1 float32) (float32, error) {
 	vlog.VI(2).Info("EchoFloat32(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoFloat64(call rpc.ServerCall, i1 float64) (float64, error) {
+func (*server) EchoFloat64(_ *context.T, _ rpc.ServerCall, i1 float64) (float64, error) {
 	vlog.VI(2).Info("EchoFloat64(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoInt32(call rpc.ServerCall, i1 int32) (int32, error) {
+func (*server) EchoInt32(_ *context.T, _ rpc.ServerCall, i1 int32) (int32, error) {
 	vlog.VI(2).Info("EchoInt32(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoInt64(call rpc.ServerCall, i1 int64) (int64, error) {
+func (*server) EchoInt64(_ *context.T, _ rpc.ServerCall, i1 int64) (int64, error) {
 	vlog.VI(2).Info("EchoInt64(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoString(call rpc.ServerCall, i1 string) (string, error) {
+func (*server) EchoString(_ *context.T, _ rpc.ServerCall, i1 string) (string, error) {
 	vlog.VI(2).Info("EchoString(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoByte(call rpc.ServerCall, i1 byte) (byte, error) {
+func (*server) EchoByte(_ *context.T, _ rpc.ServerCall, i1 byte) (byte, error) {
 	vlog.VI(2).Info("EchoByte(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoUint32(call rpc.ServerCall, i1 uint32) (uint32, error) {
+func (*server) EchoUint32(_ *context.T, _ rpc.ServerCall, i1 uint32) (uint32, error) {
 	vlog.VI(2).Info("EchoUint32(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) EchoUint64(call rpc.ServerCall, i1 uint64) (uint64, error) {
+func (*server) EchoUint64(_ *context.T, _ rpc.ServerCall, i1 uint64) (uint64, error) {
 	vlog.VI(2).Info("EchoUint64(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) XEchoArray(call rpc.ServerCall, i1 internal.Array2Int) (internal.Array2Int, error) {
+func (*server) XEchoArray(_ *context.T, _ rpc.ServerCall, i1 internal.Array2Int) (internal.Array2Int, error) {
 	vlog.VI(2).Info("XEchoArray(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) XEchoMap(call rpc.ServerCall, i1 map[int32]string) (map[int32]string, error) {
+func (*server) XEchoMap(_ *context.T, _ rpc.ServerCall, i1 map[int32]string) (map[int32]string, error) {
 	vlog.VI(2).Info("XEchoMap(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) XEchoSet(call rpc.ServerCall, i1 map[int32]struct{}) (map[int32]struct{}, error) {
+func (*server) XEchoSet(_ *context.T, _ rpc.ServerCall, i1 map[int32]struct{}) (map[int32]struct{}, error) {
 	vlog.VI(2).Info("XEchoSet(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) XEchoSlice(call rpc.ServerCall, i1 []int32) ([]int32, error) {
+func (*server) XEchoSlice(_ *context.T, _ rpc.ServerCall, i1 []int32) ([]int32, error) {
 	vlog.VI(2).Info("XEchoSlice(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) XEchoStruct(call rpc.ServerCall, i1 internal.Struct) (internal.Struct, error) {
+func (*server) XEchoStruct(_ *context.T, _ rpc.ServerCall, i1 internal.Struct) (internal.Struct, error) {
 	vlog.VI(2).Info("XEchoStruct(%v) was called.", i1)
 	return i1, nil
 }
 
-func (*server) YMultiArg(call rpc.ServerCall, i1, i2 int32) (int32, int32, error) {
+func (*server) YMultiArg(_ *context.T, _ rpc.ServerCall, i1, i2 int32) (int32, int32, error) {
 	vlog.VI(2).Info("YMultiArg(%v,%v) was called.", i1, i2)
 	return i1, i2, nil
 }
 
-func (*server) YNoArgs(call rpc.ServerCall) error {
+func (*server) YNoArgs(_ *context.T, _ rpc.ServerCall) error {
 	vlog.VI(2).Info("YNoArgs() was called.")
 	return nil
 }
 
-func (*server) ZStream(call internal.TypeTesterZStreamServerCall, nStream int32, item bool) error {
+func (*server) ZStream(_ *context.T, call internal.TypeTesterZStreamServerCall, nStream int32, item bool) error {
 	vlog.VI(2).Info("ZStream(%v,%v) was called.", nStream, item)
 	sender := call.SendStream()
 	for i := int32(0); i < nStream; i++ {
diff --git a/examples/rps/rpsbot/impl.go b/examples/rps/rpsbot/impl.go
index e0e35ee..02b09cf 100644
--- a/examples/rps/rpsbot/impl.go
+++ b/examples/rps/rpsbot/impl.go
@@ -39,36 +39,36 @@
 	return r.scoreKeeper
 }
 
-func (r *RPS) CreateGame(call rpc.ServerCall, opts rps.GameOptions) (rps.GameId, error) {
+func (r *RPS) CreateGame(ctx *context.T, _ rpc.ServerCall, opts rps.GameOptions) (rps.GameId, error) {
 	if vlog.V(1) {
-		b, _ := security.RemoteBlessingNames(call.Context())
+		b, _ := security.RemoteBlessingNames(ctx)
 		vlog.Infof("CreateGame %+v from %v", opts, b)
 	}
-	names := security.LocalBlessingNames(call.Context())
+	names := security.LocalBlessingNames(ctx)
 	if len(names) == 0 {
 		return rps.GameId{}, errors.New("no names provided for context")
 	}
 	return r.judge.createGame(names[0], opts)
 }
 
-func (r *RPS) Play(call rps.JudgePlayServerCall, id rps.GameId) (rps.PlayResult, error) {
-	names, _ := security.RemoteBlessingNames(call.Context())
+func (r *RPS) Play(ctx *context.T, call rps.JudgePlayServerCall, id rps.GameId) (rps.PlayResult, error) {
+	names, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Play %+v from %v", id, names)
 	if len(names) == 0 {
 		return rps.PlayResult{}, errors.New("no names provided for context")
 	}
-	return r.judge.play(call, names[0], id)
+	return r.judge.play(ctx, call, names[0], id)
 }
 
-func (r *RPS) Challenge(call rpc.ServerCall, address string, id rps.GameId, opts rps.GameOptions) error {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (r *RPS) Challenge(ctx *context.T, _ rpc.ServerCall, address string, id rps.GameId, opts rps.GameOptions) error {
+	b, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Challenge (%q, %+v, %+v) from %v", address, id, opts, b)
 	newctx, _ := vtrace.SetNewTrace(r.ctx)
 	return r.player.challenge(newctx, address, id, opts)
 }
 
-func (r *RPS) Record(call rpc.ServerCall, score rps.ScoreCard) error {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (r *RPS) Record(ctx *context.T, call rpc.ServerCall, score rps.ScoreCard) error {
+	b, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Record (%+v) from %v", score, b)
-	return r.scoreKeeper.Record(call, score)
+	return r.scoreKeeper.Record(ctx, call, score)
 }
diff --git a/examples/rps/rpsbot/judge.go b/examples/rps/rpsbot/judge.go
index aa68af5..cd3bdd5 100644
--- a/examples/rps/rpsbot/judge.go
+++ b/examples/rps/rpsbot/judge.go
@@ -113,7 +113,7 @@
 }
 
 // play interacts with a player for the duration of a game.
-func (j *Judge) play(call rps.JudgePlayServerCall, name string, id rps.GameId) (rps.PlayResult, error) {
+func (j *Judge) play(ctx *context.T, call rps.JudgePlayServerCall, name string, id rps.GameId) (rps.PlayResult, error) {
 	vlog.VI(1).Infof("play from %q for %v", name, id)
 	nilResult := rps.PlayResult{}
 
@@ -164,7 +164,7 @@
 
 	// When the second player connects, we start the game.
 	if playerNum == 2 {
-		go j.manageGame(call.Context(), id)
+		go j.manageGame(ctx, id)
 	}
 	// Wait for the ScoreCard.
 	scoreData := <-s
diff --git a/examples/rps/rpsbot/scorekeeper.go b/examples/rps/rpsbot/scorekeeper.go
index 197ebd7..c3e0125 100644
--- a/examples/rps/rpsbot/scorekeeper.go
+++ b/examples/rps/rpsbot/scorekeeper.go
@@ -5,6 +5,7 @@
 package main
 
 import (
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/x/lib/vlog"
@@ -28,8 +29,8 @@
 	return k.numRecords.Value()
 }
 
-func (k *ScoreKeeper) Record(call rpc.ServerCall, score rps.ScoreCard) error {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (k *ScoreKeeper) Record(ctx *context.T, _ rpc.ServerCall, score rps.ScoreCard) error {
+	b, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Received ScoreCard from %v:", b)
 	vlog.VI(1).Info(internal.FormatScoreCard(score))
 	k.numRecords.Incr(1)
diff --git a/examples/rps/rpsplayer/main.go b/examples/rps/rpsplayer/main.go
index 5b50c17..f147836 100644
--- a/examples/rps/rpsplayer/main.go
+++ b/examples/rps/rpsplayer/main.go
@@ -75,8 +75,8 @@
 	return prev
 }
 
-func (i *impl) Challenge(call rpc.ServerCall, address string, id rps.GameId, opts rps.GameOptions) error {
-	remote, _ := security.RemoteBlessingNames(call.Context())
+func (i *impl) Challenge(ctx *context.T, _ rpc.ServerCall, address string, id rps.GameId, opts rps.GameOptions) error {
+	remote, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Challenge (%q, %+v) from %v", address, id, remote)
 	// When setDecline(true) returns, future challenges will be declined.
 	// Whether the current challenge should be considered depends on the
diff --git a/examples/rps/rpsscorekeeper/main.go b/examples/rps/rpsscorekeeper/main.go
index 973609d..11c2578 100644
--- a/examples/rps/rpsscorekeeper/main.go
+++ b/examples/rps/rpsscorekeeper/main.go
@@ -13,6 +13,7 @@
 	"os"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/x/lib/vlog"
@@ -30,8 +31,8 @@
 	ch chan rps.ScoreCard
 }
 
-func (i *impl) Record(call rpc.ServerCall, score rps.ScoreCard) error {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (i *impl) Record(ctx *context.T, _ rpc.ServerCall, score rps.ScoreCard) error {
+	b, _ := security.RemoteBlessingNames(ctx)
 	vlog.VI(1).Infof("Record (%+v) from %v", score, b)
 	i.ch <- score
 	return nil
diff --git a/examples/rps/service.vdl.go b/examples/rps/service.vdl.go
index a6ff059..163b87d 100644
--- a/examples/rps/service.vdl.go
+++ b/examples/rps/service.vdl.go
@@ -396,9 +396,9 @@
 type JudgeServerMethods interface {
 	// CreateGame creates a new game with the given game options and returns a game
 	// identifier that can be used by the players to join the game.
-	CreateGame(call rpc.ServerCall, Opts GameOptions) (GameId, error)
+	CreateGame(ctx *context.T, call rpc.ServerCall, Opts GameOptions) (GameId, error)
 	// Play lets a player join an existing game and play.
-	Play(call JudgePlayServerCall, Id GameId) (PlayResult, error)
+	Play(ctx *context.T, call JudgePlayServerCall, Id GameId) (PlayResult, error)
 }
 
 // JudgeServerStubMethods is the server interface containing
@@ -408,9 +408,9 @@
 type JudgeServerStubMethods interface {
 	// CreateGame creates a new game with the given game options and returns a game
 	// identifier that can be used by the players to join the game.
-	CreateGame(call rpc.ServerCall, Opts GameOptions) (GameId, error)
+	CreateGame(ctx *context.T, call rpc.ServerCall, Opts GameOptions) (GameId, error)
 	// Play lets a player join an existing game and play.
-	Play(call *JudgePlayServerCallStub, Id GameId) (PlayResult, error)
+	Play(ctx *context.T, call *JudgePlayServerCallStub, Id GameId) (PlayResult, error)
 }
 
 // JudgeServerStub adds universal methods to JudgeServerStubMethods.
@@ -442,12 +442,12 @@
 	gs   *rpc.GlobState
 }
 
-func (s implJudgeServerStub) CreateGame(call rpc.ServerCall, i0 GameOptions) (GameId, error) {
-	return s.impl.CreateGame(call, i0)
+func (s implJudgeServerStub) CreateGame(ctx *context.T, call rpc.ServerCall, i0 GameOptions) (GameId, error) {
+	return s.impl.CreateGame(ctx, call, i0)
 }
 
-func (s implJudgeServerStub) Play(call *JudgePlayServerCallStub, i0 GameId) (PlayResult, error) {
-	return s.impl.Play(call, i0)
+func (s implJudgeServerStub) Play(ctx *context.T, call *JudgePlayServerCallStub, i0 GameId) (PlayResult, error) {
+	return s.impl.Play(ctx, call, i0)
 }
 
 func (s implJudgeServerStub) Globber() *rpc.GlobState {
@@ -612,7 +612,7 @@
 type PlayerServerMethods interface {
 	// Challenge is used by other players to challenge this player to a game. If
 	// the challenge is accepted, the method returns nil.
-	Challenge(call rpc.ServerCall, Address string, Id GameId, Opts GameOptions) error
+	Challenge(ctx *context.T, call rpc.ServerCall, Address string, Id GameId, Opts GameOptions) error
 }
 
 // PlayerServerStubMethods is the server interface containing
@@ -650,8 +650,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implPlayerServerStub) Challenge(call rpc.ServerCall, i0 string, i1 GameId, i2 GameOptions) error {
-	return s.impl.Challenge(call, i0, i1, i2)
+func (s implPlayerServerStub) Challenge(ctx *context.T, call rpc.ServerCall, i0 string, i1 GameId, i2 GameOptions) error {
+	return s.impl.Challenge(ctx, call, i0, i1, i2)
 }
 
 func (s implPlayerServerStub) Globber() *rpc.GlobState {
@@ -717,7 +717,7 @@
 //
 // ScoreKeeper receives the outcome of games from Judges.
 type ScoreKeeperServerMethods interface {
-	Record(call rpc.ServerCall, Score ScoreCard) error
+	Record(ctx *context.T, call rpc.ServerCall, Score ScoreCard) error
 }
 
 // ScoreKeeperServerStubMethods is the server interface containing
@@ -755,8 +755,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implScoreKeeperServerStub) Record(call rpc.ServerCall, i0 ScoreCard) error {
-	return s.impl.Record(call, i0)
+func (s implScoreKeeperServerStub) Record(ctx *context.T, call rpc.ServerCall, i0 ScoreCard) error {
+	return s.impl.Record(ctx, call, i0)
 }
 
 func (s implScoreKeeperServerStub) Globber() *rpc.GlobState {
diff --git a/examples/tunnel/tunnel.vdl.go b/examples/tunnel/tunnel.vdl.go
index 7f8cca3..07eb5a2 100644
--- a/examples/tunnel/tunnel.vdl.go
+++ b/examples/tunnel/tunnel.vdl.go
@@ -411,13 +411,13 @@
 	// the byte stream is forwarded to the requested network address and all the
 	// data received from that network connection is sent back in the reply
 	// stream.
-	Forward(call TunnelForwardServerCall, network string, address string) error
+	Forward(ctx *context.T, call TunnelForwardServerCall, network string, address string) error
 	// The Shell method is used to either run shell commands remotely, or to open
 	// an interactive shell. The data received over the byte stream is sent to the
 	// shell's stdin, and the data received from the shell's stdout and stderr is
 	// sent back in the reply stream. It returns the exit status of the shell
 	// command.
-	Shell(call TunnelShellServerCall, command string, shellOpts ShellOpts) (int32, error)
+	Shell(ctx *context.T, call TunnelShellServerCall, command string, shellOpts ShellOpts) (int32, error)
 }
 
 // TunnelServerStubMethods is the server interface containing
@@ -429,13 +429,13 @@
 	// the byte stream is forwarded to the requested network address and all the
 	// data received from that network connection is sent back in the reply
 	// stream.
-	Forward(call *TunnelForwardServerCallStub, network string, address string) error
+	Forward(ctx *context.T, call *TunnelForwardServerCallStub, network string, address string) error
 	// The Shell method is used to either run shell commands remotely, or to open
 	// an interactive shell. The data received over the byte stream is sent to the
 	// shell's stdin, and the data received from the shell's stdout and stderr is
 	// sent back in the reply stream. It returns the exit status of the shell
 	// command.
-	Shell(call *TunnelShellServerCallStub, command string, shellOpts ShellOpts) (int32, error)
+	Shell(ctx *context.T, call *TunnelShellServerCallStub, command string, shellOpts ShellOpts) (int32, error)
 }
 
 // TunnelServerStub adds universal methods to TunnelServerStubMethods.
@@ -467,12 +467,12 @@
 	gs   *rpc.GlobState
 }
 
-func (s implTunnelServerStub) Forward(call *TunnelForwardServerCallStub, i0 string, i1 string) error {
-	return s.impl.Forward(call, i0, i1)
+func (s implTunnelServerStub) Forward(ctx *context.T, call *TunnelForwardServerCallStub, i0 string, i1 string) error {
+	return s.impl.Forward(ctx, call, i0, i1)
 }
 
-func (s implTunnelServerStub) Shell(call *TunnelShellServerCallStub, i0 string, i1 ShellOpts) (int32, error) {
-	return s.impl.Shell(call, i0, i1)
+func (s implTunnelServerStub) Shell(ctx *context.T, call *TunnelShellServerCallStub, i0 string, i1 ShellOpts) (int32, error) {
+	return s.impl.Shell(ctx, call, i0, i1)
 }
 
 func (s implTunnelServerStub) Globber() *rpc.GlobState {
diff --git a/examples/tunnel/tunneld/impl.go b/examples/tunnel/tunneld/impl.go
index 08442c3..e0da6fa 100644
--- a/examples/tunnel/tunneld/impl.go
+++ b/examples/tunnel/tunneld/impl.go
@@ -16,6 +16,7 @@
 	"os/exec"
 	"syscall"
 
+	"v.io/v23/context"
 	"v.io/v23/security"
 	"v.io/x/lib/vlog"
 	"v.io/x/ref/examples/tunnel"
@@ -28,12 +29,12 @@
 
 const nonShellErrorCode = 255
 
-func (t *T) Forward(call tunnel.TunnelForwardServerCall, network, address string) error {
+func (t *T) Forward(ctx *context.T, call tunnel.TunnelForwardServerCall, network, address string) error {
 	conn, err := net.Dial(network, address)
 	if err != nil {
 		return err
 	}
-	b, _ := security.RemoteBlessingNames(call.Context())
+	b, _ := security.RemoteBlessingNames(ctx)
 	name := fmt.Sprintf("RemoteBlessings:%v LocalAddr:%v RemoteAddr:%v", b, conn.LocalAddr(), conn.RemoteAddr())
 	vlog.Infof("TUNNEL START: %v", name)
 	err = internal.Forward(conn, call.SendStream(), call.RecvStream())
@@ -41,8 +42,8 @@
 	return err
 }
 
-func (t *T) Shell(call tunnel.TunnelShellServerCall, command string, shellOpts tunnel.ShellOpts) (int32, error) {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (t *T) Shell(ctx *context.T, call tunnel.TunnelShellServerCall, command string, shellOpts tunnel.ShellOpts) (int32, error) {
+	b, _ := security.RemoteBlessingNames(ctx)
 	vlog.Infof("SHELL START for %v: %q", b, command)
 	shell, err := findShell()
 	if err != nil {
@@ -113,10 +114,10 @@
 
 	select {
 	case runErr := <-runIOManager(stdin, stdout, stderr, ptyFd, call):
-		b, _ := security.RemoteBlessingNames(call.Context())
+		b, _ := security.RemoteBlessingNames(ctx)
 		vlog.Infof("SHELL END for %v: %q (%v)", b, command, runErr)
 		return harvestExitcode(c.Process, runErr)
-	case <-call.Context().Done():
+	case <-ctx.Done():
 		return nonShellErrorCode, fmt.Errorf("remote end exited")
 	}
 }
diff --git a/lib/signals/signals_test.go b/lib/signals/signals_test.go
index 6af0d33..3a8ef2c 100644
--- a/lib/signals/signals_test.go
+++ b/lib/signals/signals_test.go
@@ -325,7 +325,7 @@
 	ch chan<- string
 }
 
-func (c *configServer) Set(_ rpc.ServerCall, key, value string) error {
+func (c *configServer) Set(_ *context.T, _ rpc.ServerCall, key, value string) error {
 	if key != mgmt.AppCycleManagerConfigKey {
 		return fmt.Errorf("Unexpected key: %v", key)
 	}
diff --git a/lib/vdl/codegen/golang/gen.go b/lib/vdl/codegen/golang/gen.go
index 5341fce..1d92ac0 100644
--- a/lib/vdl/codegen/golang/gen.go
+++ b/lib/vdl/codegen/golang/gen.go
@@ -162,8 +162,8 @@
 		"argParens":               argParens,
 		"uniqueName":              uniqueName,
 		"uniqueNameImpl":          uniqueNameImpl,
-		"serverCallType":          serverCallType,
-		"serverCallStubType":      serverCallStubType,
+		"serverCallVar":           serverCallVar,
+		"serverCallStubVar":       serverCallStubVar,
 		"outArgsClient":           outArgsClient,
 		"clientStubImpl":          clientStubImpl,
 		"clientFinishImpl":        clientFinishImpl,
@@ -223,11 +223,14 @@
 // argNames returns a comma-separated list of each name from args.  If argPrefix
 // is empty, the name specified in args is used; otherwise the name is prefixD,
 // where D is the position of the argument.
-func argNames(boxPrefix, argPrefix, first, last string, args []*compile.Field) string {
+func argNames(boxPrefix, argPrefix, first, second, last string, args []*compile.Field) string {
 	var result []string
 	if first != "" {
 		result = append(result, first)
 	}
+	if second != "" {
+		result = append(result, second)
+	}
 	for ix, arg := range args {
 		name := arg.Name
 		if argPrefix != "" {
@@ -250,12 +253,15 @@
 // argPrefix is empty, the name specified in args is used; otherwise the name is
 // prefixD, where D is the position of the argument.  If argPrefix is empty and
 // no names are specified in args, no names will be output.
-func argNameTypes(argPrefix, first, last string, data goData, args []*compile.Field) string {
+func argNameTypes(argPrefix, first, second, last string, data goData, args []*compile.Field) string {
 	noNames := argPrefix == "" && !hasArgNames(args)
 	var result []string
 	if first != "" {
 		result = append(result, maybeStripArgName(first, noNames))
 	}
+	if second != "" {
+		result = append(result, maybeStripArgName(second, noNames))
+	}
 	for ax, arg := range args {
 		var name string
 		switch {
@@ -309,20 +315,20 @@
 
 // The first arg of every server method is a context; the type is either a typed
 // context for streams, or rpc.ServerCall for non-streams.
-func serverCallType(prefix string, data goData, iface *compile.Interface, method *compile.Method) string {
+func serverCallVar(data goData, iface *compile.Interface, method *compile.Method) string {
 	if isStreamingMethod(method) {
-		return prefix + uniqueName(iface, method, "ServerCall")
+		return "call " + uniqueName(iface, method, "ServerCall")
 	}
-	return prefix + data.Pkg("v.io/v23/rpc") + "ServerCall"
+	return "call " + data.Pkg("v.io/v23/rpc") + "ServerCall"
 }
 
 // The first arg of every server stub method is a context; the type is either a
 // typed context stub for streams, or rpc.ServerCall for non-streams.
-func serverCallStubType(prefix string, data goData, iface *compile.Interface, method *compile.Method) string {
+func serverCallStubVar(data goData, iface *compile.Interface, method *compile.Method) string {
 	if isStreamingMethod(method) {
-		return prefix + "*" + uniqueName(iface, method, "ServerCallStub")
+		return "call *" + uniqueName(iface, method, "ServerCallStub")
 	}
-	return prefix + data.Pkg("v.io/v23/rpc") + "ServerCall"
+	return "call " + data.Pkg("v.io/v23/rpc") + "ServerCall"
 }
 
 // outArgsClient returns the out args of an interface method on the client,
@@ -333,7 +339,7 @@
 	if isStreamingMethod(method) {
 		first, args = "ocall "+uniqueName(iface, method, "ClientCall"), nil
 	}
-	return argParens(argNameTypes(argPrefix, first, "err error", data, args))
+	return argParens(argNameTypes(argPrefix, first, "", "err error", data, args))
 }
 
 // clientStubImpl returns the interface method client stub implementation.
@@ -341,7 +347,7 @@
 	var buf bytes.Buffer
 	inargs := "nil"
 	if len(method.InArgs) > 0 {
-		inargs = "[]interface{}{" + argNames("&", "i", "", "", method.InArgs) + "}"
+		inargs = "[]interface{}{" + argNames("&", "i", "", "", "", method.InArgs) + "}"
 	}
 	switch {
 	case isStreamingMethod(method):
@@ -351,7 +357,7 @@
 	default:
 		outargs := "nil"
 		if len(method.OutArgs) > 0 {
-			outargs = "[]interface{}{" + argNames("", "&o", "", "", method.OutArgs) + "}"
+			outargs = "[]interface{}{" + argNames("", "&o", "", "", "", method.OutArgs) + "}"
 		}
 		fmt.Fprintf(&buf, "\terr = "+data.Pkg("v.io/v23")+"GetClient(ctx).Call(ctx, c.name, %q, %s, %s, opts...)\n", method.Name, inargs, outargs)
 	}
@@ -361,14 +367,14 @@
 
 // clientFinishImpl returns the client finish implementation for method.
 func clientFinishImpl(varname string, method *compile.Method) string {
-	outargs := argNames("", "&o", "", "", method.OutArgs)
+	outargs := argNames("", "&o", "", "", "", method.OutArgs)
 	return fmt.Sprintf("\terr = %s.Finish(%s)", varname, outargs)
 }
 
 // serverStubImpl returns the interface method server stub implementation.
 func serverStubImpl(data goData, iface *compile.Interface, method *compile.Method) string {
 	var buf bytes.Buffer
-	inargs := argNames("", "i", "call", "", method.InArgs)
+	inargs := argNames("", "i", "ctx", "call", "", method.InArgs)
 	fmt.Fprintf(&buf, "\treturn s.impl.%s(%s)", method.Name, inargs)
 	return buf.String() // the caller writes the trailing newline
 }
@@ -457,21 +463,21 @@
 {{$errName := errorName $edef $file}}
 {{$newErr := print (firstRuneToExport "New" $edef.Exported) (firstRuneToUpper $errName)}}
 // {{$newErr}} returns an error with the {{$errName}} ID.
-func {{$newErr}}(ctx {{argNameTypes "" (print "*" ($data.Pkg "v.io/v23/context") "T") "" $data $edef.Params}}) error {
-	return {{$data.Pkg "v.io/v23/verror"}}New({{$errName}}, {{argNames "" "" "ctx" "" $edef.Params}})
+func {{$newErr}}(ctx {{argNameTypes "" (print "*" ($data.Pkg "v.io/v23/context") "T") "" "" $data $edef.Params}}) error {
+	return {{$data.Pkg "v.io/v23/verror"}}New({{$errName}}, {{argNames "" "" "ctx" "" "" $edef.Params}})
 }
 {{end}}{{end}}
 
 {{range $iface := $file.Interfaces}}
 {{$ifaceStreaming := hasStreamingMethods $iface.AllMethods}}
 {{$rpc_ := $data.Pkg "v.io/v23/rpc"}}
-{{$ctxArg := print "ctx *" ($data.Pkg "v.io/v23/context") "T"}}
-{{$optsArg := print "opts ..." $rpc_ "CallOpt"}}
+{{$optsVar := print "opts ..." $rpc_ "CallOpt"}}
+{{$ctxVar := print "ctx *" ($data.Pkg "v.io/v23/context") "T"}}
 // {{$iface.Name}}ClientMethods is the client interface
 // containing {{$iface.Name}} methods.
 {{docBreak $iface.Doc}}type {{$iface.Name}}ClientMethods interface { {{range $embed := $iface.Embeds}}
 	{{$embed.Doc}}{{embedGo $data $embed}}ClientMethods{{$embed.DocSuffix}}{{end}}{{range $method := $iface.Methods}}
-	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" $ctxArg $optsArg $data $method.InArgs}}) {{outArgsClient "" $data $iface $method}}{{$method.DocSuffix}}{{end}}
+	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" $ctxVar "" $optsVar $data $method.InArgs}}) {{outArgsClient "" $data $iface $method}}{{$method.DocSuffix}}{{end}}
 }
 
 // {{$iface.Name}}ClientStub adds universal methods to {{$iface.Name}}ClientMethods.
@@ -492,7 +498,7 @@
 }
 
 {{range $method := $iface.Methods}}
-func (c impl{{$iface.Name}}ClientStub) {{$method.Name}}({{argNameTypes "i" $ctxArg $optsArg $data $method.InArgs}}) {{outArgsClient "o" $data $iface $method}} {
+func (c impl{{$iface.Name}}ClientStub) {{$method.Name}}({{argNameTypes "i" $ctxVar "" $optsVar $data $method.InArgs}}) {{outArgsClient "o" $data $iface $method}} {
 {{clientStubImpl $data $iface $method}}
 }
 {{end}}
@@ -552,7 +558,7 @@
 	// Calling Finish is mandatory for releasing stream resources, unless the call
 	// has been canceled or any of the other methods return an error.  Finish should
 	// be called at most once.
-	Finish() {{argParens (argNameTypes "" "" "err error" $data $method.OutArgs)}}
+	Finish() {{argParens (argNameTypes "" "" "" "err error" $data $method.OutArgs)}}
 }
 
 type {{$clientCallImpl}} struct {
@@ -603,7 +609,7 @@
 func (c {{$clientSendImpl}}) Close() error {
 	return c.c.CloseSend()
 }
-{{end}}func (c *{{$clientCallImpl}}) Finish() {{argParens (argNameTypes "o" "" "err error" $data $method.OutArgs)}} {
+{{end}}func (c *{{$clientCallImpl}}) Finish() {{argParens (argNameTypes "o" "" "" "err error" $data $method.OutArgs)}} {
 {{clientFinishImpl "c.ClientCall" $method}}
 	return
 }
@@ -613,7 +619,7 @@
 // implements for {{$iface.Name}}.
 {{docBreak $iface.Doc}}type {{$iface.Name}}ServerMethods interface { {{range $embed := $iface.Embeds}}
 	{{$embed.Doc}}{{embedGo $data $embed}}ServerMethods{{$embed.DocSuffix}}{{end}}{{range $method := $iface.Methods}}
-	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" (serverCallType "call " $data $iface $method) "" $data $method.InArgs}}) {{argParens (argNameTypes "" "" "err error" $data $method.OutArgs)}}{{$method.DocSuffix}}{{end}}
+	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" $ctxVar (serverCallVar $data $iface $method) "" $data $method.InArgs}}) {{argParens (argNameTypes "" "" "" "err error" $data $method.OutArgs)}}{{$method.DocSuffix}}{{end}}
 }
 
 // {{$iface.Name}}ServerStubMethods is the server interface containing
@@ -624,7 +630,7 @@
 // since there are no streaming methods.{{end}}
 type {{$iface.Name}}ServerStubMethods {{if $ifaceStreaming}}interface { {{range $embed := $iface.Embeds}}
 	{{$embed.Doc}}{{embedGo $data $embed}}ServerStubMethods{{$embed.DocSuffix}}{{end}}{{range $method := $iface.Methods}}
-	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" (serverCallStubType "call " $data $iface $method) "" $data $method.InArgs}}) {{argParens (argNameTypes "" "" "err error" $data $method.OutArgs)}}{{$method.DocSuffix}}{{end}}
+	{{$method.Doc}}{{$method.Name}}({{argNameTypes "" $ctxVar (serverCallStubVar $data $iface $method) "" $data $method.InArgs}}) {{argParens (argNameTypes "" "" "" "err error" $data $method.OutArgs)}}{{$method.DocSuffix}}{{end}}
 }
 {{else}}{{$iface.Name}}ServerMethods
 {{end}}
@@ -661,7 +667,7 @@
 }
 
 {{range $method := $iface.Methods}}
-func (s impl{{$iface.Name}}ServerStub) {{$method.Name}}({{argNameTypes "i" (serverCallStubType "call " $data $iface $method) "" $data $method.InArgs}}) {{argParens (argTypes "" "error" $data $method.OutArgs)}} {
+func (s impl{{$iface.Name}}ServerStub) {{$method.Name}}({{argNameTypes "i" $ctxVar (serverCallStubVar $data $iface $method) "" $data $method.InArgs}}) {{argParens (argTypes "" "error" $data $method.OutArgs)}} {
 {{serverStubImpl $data $iface $method}}
 }
 {{end}}
diff --git a/lib/vdl/testdata/arith/advanced.vdl.go b/lib/vdl/testdata/arith/advanced.vdl.go
index 0d893bc..f2a0d72 100644
--- a/lib/vdl/testdata/arith/advanced.vdl.go
+++ b/lib/vdl/testdata/arith/advanced.vdl.go
@@ -56,8 +56,8 @@
 //
 // Trigonometry is an interface that specifies a couple trigonometric functions.
 type TrigonometryServerMethods interface {
-	Sine(call rpc.ServerCall, angle float64) (float64, error)
-	Cosine(call rpc.ServerCall, angle float64) (float64, error)
+	Sine(ctx *context.T, call rpc.ServerCall, angle float64) (float64, error)
+	Cosine(ctx *context.T, call rpc.ServerCall, angle float64) (float64, error)
 }
 
 // TrigonometryServerStubMethods is the server interface containing
@@ -95,12 +95,12 @@
 	gs   *rpc.GlobState
 }
 
-func (s implTrigonometryServerStub) Sine(call rpc.ServerCall, i0 float64) (float64, error) {
-	return s.impl.Sine(call, i0)
+func (s implTrigonometryServerStub) Sine(ctx *context.T, call rpc.ServerCall, i0 float64) (float64, error) {
+	return s.impl.Sine(ctx, call, i0)
 }
 
-func (s implTrigonometryServerStub) Cosine(call rpc.ServerCall, i0 float64) (float64, error) {
-	return s.impl.Cosine(call, i0)
+func (s implTrigonometryServerStub) Cosine(ctx *context.T, call rpc.ServerCall, i0 float64) (float64, error) {
+	return s.impl.Cosine(ctx, call, i0)
 }
 
 func (s implTrigonometryServerStub) Globber() *rpc.GlobState {
diff --git a/lib/vdl/testdata/arith/arith.vdl.go b/lib/vdl/testdata/arith/arith.vdl.go
index 0615782..3a1502e 100644
--- a/lib/vdl/testdata/arith/arith.vdl.go
+++ b/lib/vdl/testdata/arith/arith.vdl.go
@@ -334,25 +334,25 @@
 //   * There must be at least 1 out-arg, and the last out-arg must be error.
 type ArithServerMethods interface {
 	// Add is a typical method with multiple input and output arguments.
-	Add(call rpc.ServerCall, a int32, b int32) (int32, error)
+	Add(ctx *context.T, call rpc.ServerCall, a int32, b int32) (int32, error)
 	// DivMod shows that runs of args with the same type can use the short form,
 	// just like Go.
-	DivMod(call rpc.ServerCall, a int32, b int32) (quot int32, rem int32, err error)
+	DivMod(ctx *context.T, call rpc.ServerCall, a int32, b int32) (quot int32, rem int32, err error)
 	// Sub shows that you can use data types defined in other packages.
-	Sub(call rpc.ServerCall, args base.Args) (int32, error)
+	Sub(ctx *context.T, call rpc.ServerCall, args base.Args) (int32, error)
 	// Mul tries another data type defined in another package.
-	Mul(call rpc.ServerCall, nested base.NestedArgs) (int32, error)
+	Mul(ctx *context.T, call rpc.ServerCall, nested base.NestedArgs) (int32, error)
 	// GenError shows that it's fine to have no in args, and no out args other
 	// than "error".  In addition GenError shows the usage of tags.  Tags are a
 	// sequence of constants.  There's no requirement on uniqueness of types or
 	// values, and regular const expressions may also be used.
-	GenError(rpc.ServerCall) error
+	GenError(*context.T, rpc.ServerCall) error
 	// Count shows using only an int32 out-stream type, with no in-stream type.
-	Count(call ArithCountServerCall, start int32) error
+	Count(ctx *context.T, call ArithCountServerCall, start int32) error
 	// StreamingAdd shows a bidirectional stream.
-	StreamingAdd(ArithStreamingAddServerCall) (total int32, err error)
+	StreamingAdd(*context.T, ArithStreamingAddServerCall) (total int32, err error)
 	// QuoteAny shows the any built-in type, representing a value of any type.
-	QuoteAny(call rpc.ServerCall, a *vdl.Value) (*vdl.Value, error)
+	QuoteAny(ctx *context.T, call rpc.ServerCall, a *vdl.Value) (*vdl.Value, error)
 }
 
 // ArithServerStubMethods is the server interface containing
@@ -361,25 +361,25 @@
 // is the streaming methods.
 type ArithServerStubMethods interface {
 	// Add is a typical method with multiple input and output arguments.
-	Add(call rpc.ServerCall, a int32, b int32) (int32, error)
+	Add(ctx *context.T, call rpc.ServerCall, a int32, b int32) (int32, error)
 	// DivMod shows that runs of args with the same type can use the short form,
 	// just like Go.
-	DivMod(call rpc.ServerCall, a int32, b int32) (quot int32, rem int32, err error)
+	DivMod(ctx *context.T, call rpc.ServerCall, a int32, b int32) (quot int32, rem int32, err error)
 	// Sub shows that you can use data types defined in other packages.
-	Sub(call rpc.ServerCall, args base.Args) (int32, error)
+	Sub(ctx *context.T, call rpc.ServerCall, args base.Args) (int32, error)
 	// Mul tries another data type defined in another package.
-	Mul(call rpc.ServerCall, nested base.NestedArgs) (int32, error)
+	Mul(ctx *context.T, call rpc.ServerCall, nested base.NestedArgs) (int32, error)
 	// GenError shows that it's fine to have no in args, and no out args other
 	// than "error".  In addition GenError shows the usage of tags.  Tags are a
 	// sequence of constants.  There's no requirement on uniqueness of types or
 	// values, and regular const expressions may also be used.
-	GenError(rpc.ServerCall) error
+	GenError(*context.T, rpc.ServerCall) error
 	// Count shows using only an int32 out-stream type, with no in-stream type.
-	Count(call *ArithCountServerCallStub, start int32) error
+	Count(ctx *context.T, call *ArithCountServerCallStub, start int32) error
 	// StreamingAdd shows a bidirectional stream.
-	StreamingAdd(*ArithStreamingAddServerCallStub) (total int32, err error)
+	StreamingAdd(*context.T, *ArithStreamingAddServerCallStub) (total int32, err error)
 	// QuoteAny shows the any built-in type, representing a value of any type.
-	QuoteAny(call rpc.ServerCall, a *vdl.Value) (*vdl.Value, error)
+	QuoteAny(ctx *context.T, call rpc.ServerCall, a *vdl.Value) (*vdl.Value, error)
 }
 
 // ArithServerStub adds universal methods to ArithServerStubMethods.
@@ -411,36 +411,36 @@
 	gs   *rpc.GlobState
 }
 
-func (s implArithServerStub) Add(call rpc.ServerCall, i0 int32, i1 int32) (int32, error) {
-	return s.impl.Add(call, i0, i1)
+func (s implArithServerStub) Add(ctx *context.T, call rpc.ServerCall, i0 int32, i1 int32) (int32, error) {
+	return s.impl.Add(ctx, call, i0, i1)
 }
 
-func (s implArithServerStub) DivMod(call rpc.ServerCall, i0 int32, i1 int32) (int32, int32, error) {
-	return s.impl.DivMod(call, i0, i1)
+func (s implArithServerStub) DivMod(ctx *context.T, call rpc.ServerCall, i0 int32, i1 int32) (int32, int32, error) {
+	return s.impl.DivMod(ctx, call, i0, i1)
 }
 
-func (s implArithServerStub) Sub(call rpc.ServerCall, i0 base.Args) (int32, error) {
-	return s.impl.Sub(call, i0)
+func (s implArithServerStub) Sub(ctx *context.T, call rpc.ServerCall, i0 base.Args) (int32, error) {
+	return s.impl.Sub(ctx, call, i0)
 }
 
-func (s implArithServerStub) Mul(call rpc.ServerCall, i0 base.NestedArgs) (int32, error) {
-	return s.impl.Mul(call, i0)
+func (s implArithServerStub) Mul(ctx *context.T, call rpc.ServerCall, i0 base.NestedArgs) (int32, error) {
+	return s.impl.Mul(ctx, call, i0)
 }
 
-func (s implArithServerStub) GenError(call rpc.ServerCall) error {
-	return s.impl.GenError(call)
+func (s implArithServerStub) GenError(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.GenError(ctx, call)
 }
 
-func (s implArithServerStub) Count(call *ArithCountServerCallStub, i0 int32) error {
-	return s.impl.Count(call, i0)
+func (s implArithServerStub) Count(ctx *context.T, call *ArithCountServerCallStub, i0 int32) error {
+	return s.impl.Count(ctx, call, i0)
 }
 
-func (s implArithServerStub) StreamingAdd(call *ArithStreamingAddServerCallStub) (int32, error) {
-	return s.impl.StreamingAdd(call)
+func (s implArithServerStub) StreamingAdd(ctx *context.T, call *ArithStreamingAddServerCallStub) (int32, error) {
+	return s.impl.StreamingAdd(ctx, call)
 }
 
-func (s implArithServerStub) QuoteAny(call rpc.ServerCall, i0 *vdl.Value) (*vdl.Value, error) {
-	return s.impl.QuoteAny(call, i0)
+func (s implArithServerStub) QuoteAny(ctx *context.T, call rpc.ServerCall, i0 *vdl.Value) (*vdl.Value, error) {
+	return s.impl.QuoteAny(ctx, call, i0)
 }
 
 func (s implArithServerStub) Globber() *rpc.GlobState {
@@ -718,8 +718,8 @@
 	// turn it is embedded by arith.Calculator (which is in the same package but
 	// different file) to verify that embedding works in all these scenarios.
 	AdvancedMathServerMethods
-	On(rpc.ServerCall) error  // On turns the calculator on.
-	Off(rpc.ServerCall) error // Off turns the calculator off.
+	On(*context.T, rpc.ServerCall) error  // On turns the calculator on.
+	Off(*context.T, rpc.ServerCall) error // Off turns the calculator off.
 }
 
 // CalculatorServerStubMethods is the server interface containing
@@ -736,8 +736,8 @@
 	// turn it is embedded by arith.Calculator (which is in the same package but
 	// different file) to verify that embedding works in all these scenarios.
 	AdvancedMathServerStubMethods
-	On(rpc.ServerCall) error  // On turns the calculator on.
-	Off(rpc.ServerCall) error // Off turns the calculator off.
+	On(*context.T, rpc.ServerCall) error  // On turns the calculator on.
+	Off(*context.T, rpc.ServerCall) error // Off turns the calculator off.
 }
 
 // CalculatorServerStub adds universal methods to CalculatorServerStubMethods.
@@ -773,12 +773,12 @@
 	gs *rpc.GlobState
 }
 
-func (s implCalculatorServerStub) On(call rpc.ServerCall) error {
-	return s.impl.On(call)
+func (s implCalculatorServerStub) On(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.On(ctx, call)
 }
 
-func (s implCalculatorServerStub) Off(call rpc.ServerCall) error {
-	return s.impl.Off(call)
+func (s implCalculatorServerStub) Off(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.Off(ctx, call)
 }
 
 func (s implCalculatorServerStub) Globber() *rpc.GlobState {
diff --git a/lib/vdl/testdata/arith/exp/exp.vdl.go b/lib/vdl/testdata/arith/exp/exp.vdl.go
index 5b99197..2229371 100644
--- a/lib/vdl/testdata/arith/exp/exp.vdl.go
+++ b/lib/vdl/testdata/arith/exp/exp.vdl.go
@@ -45,7 +45,7 @@
 // ExpServerMethods is the interface a server writer
 // implements for Exp.
 type ExpServerMethods interface {
-	Exp(call rpc.ServerCall, x float64) (float64, error)
+	Exp(ctx *context.T, call rpc.ServerCall, x float64) (float64, error)
 }
 
 // ExpServerStubMethods is the server interface containing
@@ -83,8 +83,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implExpServerStub) Exp(call rpc.ServerCall, i0 float64) (float64, error) {
-	return s.impl.Exp(call, i0)
+func (s implExpServerStub) Exp(ctx *context.T, call rpc.ServerCall, i0 float64) (float64, error) {
+	return s.impl.Exp(ctx, call, i0)
 }
 
 func (s implExpServerStub) Globber() *rpc.GlobState {
diff --git a/lib/vdl/testdata/base/base.vdl.go b/lib/vdl/testdata/base/base.vdl.go
index 1694917..c1c5a00 100644
--- a/lib/vdl/testdata/base/base.vdl.go
+++ b/lib/vdl/testdata/base/base.vdl.go
@@ -829,10 +829,10 @@
 // ServiceAServerMethods is the interface a server writer
 // implements for ServiceA.
 type ServiceAServerMethods interface {
-	MethodA1(rpc.ServerCall) error
-	MethodA2(call rpc.ServerCall, a int32, b string) (s string, err error)
-	MethodA3(call ServiceAMethodA3ServerCall, a int32) (s string, err error)
-	MethodA4(call ServiceAMethodA4ServerCall, a int32) error
+	MethodA1(*context.T, rpc.ServerCall) error
+	MethodA2(ctx *context.T, call rpc.ServerCall, a int32, b string) (s string, err error)
+	MethodA3(ctx *context.T, call ServiceAMethodA3ServerCall, a int32) (s string, err error)
+	MethodA4(ctx *context.T, call ServiceAMethodA4ServerCall, a int32) error
 }
 
 // ServiceAServerStubMethods is the server interface containing
@@ -840,10 +840,10 @@
 // The only difference between this interface and ServiceAServerMethods
 // is the streaming methods.
 type ServiceAServerStubMethods interface {
-	MethodA1(rpc.ServerCall) error
-	MethodA2(call rpc.ServerCall, a int32, b string) (s string, err error)
-	MethodA3(call *ServiceAMethodA3ServerCallStub, a int32) (s string, err error)
-	MethodA4(call *ServiceAMethodA4ServerCallStub, a int32) error
+	MethodA1(*context.T, rpc.ServerCall) error
+	MethodA2(ctx *context.T, call rpc.ServerCall, a int32, b string) (s string, err error)
+	MethodA3(ctx *context.T, call *ServiceAMethodA3ServerCallStub, a int32) (s string, err error)
+	MethodA4(ctx *context.T, call *ServiceAMethodA4ServerCallStub, a int32) error
 }
 
 // ServiceAServerStub adds universal methods to ServiceAServerStubMethods.
@@ -875,20 +875,20 @@
 	gs   *rpc.GlobState
 }
 
-func (s implServiceAServerStub) MethodA1(call rpc.ServerCall) error {
-	return s.impl.MethodA1(call)
+func (s implServiceAServerStub) MethodA1(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.MethodA1(ctx, call)
 }
 
-func (s implServiceAServerStub) MethodA2(call rpc.ServerCall, i0 int32, i1 string) (string, error) {
-	return s.impl.MethodA2(call, i0, i1)
+func (s implServiceAServerStub) MethodA2(ctx *context.T, call rpc.ServerCall, i0 int32, i1 string) (string, error) {
+	return s.impl.MethodA2(ctx, call, i0, i1)
 }
 
-func (s implServiceAServerStub) MethodA3(call *ServiceAMethodA3ServerCallStub, i0 int32) (string, error) {
-	return s.impl.MethodA3(call, i0)
+func (s implServiceAServerStub) MethodA3(ctx *context.T, call *ServiceAMethodA3ServerCallStub, i0 int32) (string, error) {
+	return s.impl.MethodA3(ctx, call, i0)
 }
 
-func (s implServiceAServerStub) MethodA4(call *ServiceAMethodA4ServerCallStub, i0 int32) error {
-	return s.impl.MethodA4(call, i0)
+func (s implServiceAServerStub) MethodA4(ctx *context.T, call *ServiceAMethodA4ServerCallStub, i0 int32) error {
+	return s.impl.MethodA4(ctx, call, i0)
 }
 
 func (s implServiceAServerStub) Globber() *rpc.GlobState {
@@ -1099,7 +1099,7 @@
 // implements for ServiceB.
 type ServiceBServerMethods interface {
 	ServiceAServerMethods
-	MethodB1(call rpc.ServerCall, a Scalars, b Composites) (c CompComp, err error)
+	MethodB1(ctx *context.T, call rpc.ServerCall, a Scalars, b Composites) (c CompComp, err error)
 }
 
 // ServiceBServerStubMethods is the server interface containing
@@ -1108,7 +1108,7 @@
 // is the streaming methods.
 type ServiceBServerStubMethods interface {
 	ServiceAServerStubMethods
-	MethodB1(call rpc.ServerCall, a Scalars, b Composites) (c CompComp, err error)
+	MethodB1(ctx *context.T, call rpc.ServerCall, a Scalars, b Composites) (c CompComp, err error)
 }
 
 // ServiceBServerStub adds universal methods to ServiceBServerStubMethods.
@@ -1142,8 +1142,8 @@
 	gs *rpc.GlobState
 }
 
-func (s implServiceBServerStub) MethodB1(call rpc.ServerCall, i0 Scalars, i1 Composites) (CompComp, error) {
-	return s.impl.MethodB1(call, i0, i1)
+func (s implServiceBServerStub) MethodB1(ctx *context.T, call rpc.ServerCall, i0 Scalars, i1 Composites) (CompComp, error) {
+	return s.impl.MethodB1(ctx, call, i0, i1)
 }
 
 func (s implServiceBServerStub) Globber() *rpc.GlobState {
diff --git a/profiles/internal/lib/appcycle/appcycle.go b/profiles/internal/lib/appcycle/appcycle.go
index cb67dec..6012b0c 100644
--- a/profiles/internal/lib/appcycle/appcycle.go
+++ b/profiles/internal/lib/appcycle/appcycle.go
@@ -10,6 +10,7 @@
 	"sync"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/x/lib/vlog"
@@ -125,8 +126,8 @@
 	return public.AppCycleServer(m.disp)
 }
 
-func (d *invoker) Stop(call public.AppCycleStopServerCall) error {
-	blessings, _ := security.RemoteBlessingNames(call.Context())
+func (d *invoker) Stop(ctx *context.T, call public.AppCycleStopServerCall) error {
+	blessings, _ := security.RemoteBlessingNames(ctx)
 	vlog.Infof("AppCycle Stop request from %v", blessings)
 	// The size of the channel should be reasonably sized to expect not to
 	// miss updates while we're waiting for the stream to unblock.
@@ -148,7 +149,7 @@
 	return nil
 }
 
-func (d *invoker) ForceStop(rpc.ServerCall) error {
+func (d *invoker) ForceStop(*context.T, rpc.ServerCall) error {
 	d.ac.ForceStop()
 	return fmt.Errorf("ForceStop should not reply as the process should be dead")
 }
diff --git a/profiles/internal/naming/namespace/acl_test.go b/profiles/internal/naming/namespace/acl_test.go
index 92bec02..340ab73 100644
--- a/profiles/internal/naming/namespace/acl_test.go
+++ b/profiles/internal/naming/namespace/acl_test.go
@@ -66,7 +66,7 @@
 
 type nopServer struct{ x int }
 
-func (s *nopServer) NOP(call rpc.ServerCall) error {
+func (s *nopServer) NOP(*context.T, rpc.ServerCall) error {
 	return nil
 }
 
diff --git a/profiles/internal/naming/namespace/all_test.go b/profiles/internal/naming/namespace/all_test.go
index 0fa67bb..721ea34 100644
--- a/profiles/internal/naming/namespace/all_test.go
+++ b/profiles/internal/naming/namespace/all_test.go
@@ -103,13 +103,13 @@
 	suffix string
 }
 
-func (testServer) KnockKnock(call rpc.ServerCall) (string, error) {
+func (testServer) KnockKnock(*context.T, rpc.ServerCall) (string, error) {
 	return "Who's there?", nil
 }
 
 // testServer has the following namespace:
 // "" -> {level1} -> {level2}
-func (t *testServer) GlobChildren__(rpc.ServerCall) (<-chan string, error) {
+func (t *testServer) GlobChildren__(*context.T, rpc.ServerCall) (<-chan string, error) {
 	ch := make(chan string, 1)
 	switch t.suffix {
 	case "":
@@ -468,7 +468,7 @@
 	mu        sync.Mutex
 }
 
-func (g *GlobbableServer) Glob__(rpc.ServerCall, string) (<-chan naming.GlobReply, error) {
+func (g *GlobbableServer) Glob__(*context.T, rpc.ServerCall, string) (<-chan naming.GlobReply, error) {
 	g.mu.Lock()
 	defer g.mu.Unlock()
 	g.callCount++
@@ -732,7 +732,7 @@
 
 type leafObject struct{}
 
-func (leafObject) Foo(rpc.ServerCall) error {
+func (leafObject) Foo(*context.T, rpc.ServerCall) error {
 	return nil
 }
 
diff --git a/profiles/internal/rpc/benchmark/benchmark.vdl.go b/profiles/internal/rpc/benchmark/benchmark.vdl.go
index 9f9d9de..c67fec4 100644
--- a/profiles/internal/rpc/benchmark/benchmark.vdl.go
+++ b/profiles/internal/rpc/benchmark/benchmark.vdl.go
@@ -165,9 +165,9 @@
 // implements for Benchmark.
 type BenchmarkServerMethods interface {
 	// Echo returns the payload that it receives.
-	Echo(call rpc.ServerCall, Payload []byte) ([]byte, error)
+	Echo(ctx *context.T, call rpc.ServerCall, Payload []byte) ([]byte, error)
 	// EchoStream returns the payload that it receives via the stream.
-	EchoStream(BenchmarkEchoStreamServerCall) error
+	EchoStream(*context.T, BenchmarkEchoStreamServerCall) error
 }
 
 // BenchmarkServerStubMethods is the server interface containing
@@ -176,9 +176,9 @@
 // is the streaming methods.
 type BenchmarkServerStubMethods interface {
 	// Echo returns the payload that it receives.
-	Echo(call rpc.ServerCall, Payload []byte) ([]byte, error)
+	Echo(ctx *context.T, call rpc.ServerCall, Payload []byte) ([]byte, error)
 	// EchoStream returns the payload that it receives via the stream.
-	EchoStream(*BenchmarkEchoStreamServerCallStub) error
+	EchoStream(*context.T, *BenchmarkEchoStreamServerCallStub) error
 }
 
 // BenchmarkServerStub adds universal methods to BenchmarkServerStubMethods.
@@ -210,12 +210,12 @@
 	gs   *rpc.GlobState
 }
 
-func (s implBenchmarkServerStub) Echo(call rpc.ServerCall, i0 []byte) ([]byte, error) {
-	return s.impl.Echo(call, i0)
+func (s implBenchmarkServerStub) Echo(ctx *context.T, call rpc.ServerCall, i0 []byte) ([]byte, error) {
+	return s.impl.Echo(ctx, call, i0)
 }
 
-func (s implBenchmarkServerStub) EchoStream(call *BenchmarkEchoStreamServerCallStub) error {
-	return s.impl.EchoStream(call)
+func (s implBenchmarkServerStub) EchoStream(ctx *context.T, call *BenchmarkEchoStreamServerCallStub) error {
+	return s.impl.EchoStream(ctx, call)
 }
 
 func (s implBenchmarkServerStub) Globber() *rpc.GlobState {
diff --git a/profiles/internal/rpc/benchmark/glob/glob_test.go b/profiles/internal/rpc/benchmark/glob/glob_test.go
index 85cddf1..c37e867 100644
--- a/profiles/internal/rpc/benchmark/glob/glob_test.go
+++ b/profiles/internal/rpc/benchmark/glob/glob_test.go
@@ -102,7 +102,7 @@
 	bufferSize int
 }
 
-func (o *globObject) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (o *globObject) Glob__(_ *context.T, _ rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	if pattern != "*" {
 		panic("this benchmark only works with pattern='*'")
 	}
@@ -122,7 +122,7 @@
 	bufferSize int
 }
 
-func (o *globChildrenObject) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
+func (o *globChildrenObject) GlobChildren__(_ *context.T, call rpc.ServerCall) (<-chan string, error) {
 	if call.Suffix() != "" {
 		return nil, nil
 	}
diff --git a/profiles/internal/rpc/benchmark/internal/server.go b/profiles/internal/rpc/benchmark/internal/server.go
index 0c94e23..6cce472 100644
--- a/profiles/internal/rpc/benchmark/internal/server.go
+++ b/profiles/internal/rpc/benchmark/internal/server.go
@@ -16,11 +16,11 @@
 type impl struct {
 }
 
-func (i *impl) Echo(call rpc.ServerCall, payload []byte) ([]byte, error) {
+func (i *impl) Echo(_ *context.T, _ rpc.ServerCall, payload []byte) ([]byte, error) {
 	return payload, nil
 }
 
-func (i *impl) EchoStream(call benchmark.BenchmarkEchoStreamServerCall) error {
+func (i *impl) EchoStream(_ *context.T, call benchmark.BenchmarkEchoStreamServerCall) error {
 	rStream := call.RecvStream()
 	sStream := call.SendStream()
 	for rStream.Advance() {
diff --git a/profiles/internal/rpc/cancel_test.go b/profiles/internal/rpc/cancel_test.go
index 97813d7..ee4fc99 100644
--- a/profiles/internal/rpc/cancel_test.go
+++ b/profiles/internal/rpc/cancel_test.go
@@ -7,16 +7,15 @@
 import (
 	"testing"
 
-	"v.io/x/ref/profiles/internal/rpc/stream"
-	"v.io/x/ref/profiles/internal/rpc/stream/manager"
-	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
-
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/namespace"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/x/lib/vlog"
+	"v.io/x/ref/profiles/internal/rpc/stream"
+	"v.io/x/ref/profiles/internal/rpc/stream/manager"
+	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
 )
 
 type fakeAuthorizer int
@@ -35,7 +34,7 @@
 	stop     func() error
 }
 
-func (c *canceld) Run(call rpc.StreamServerCall) error {
+func (c *canceld) Run(ctx *context.T, _ rpc.StreamServerCall) error {
 	close(c.started)
 
 	client, err := InternalNewClient(c.sm, c.ns)
@@ -45,14 +44,14 @@
 	}
 
 	if c.child != "" {
-		if _, err = client.StartCall(call.Context(), c.child, "Run", []interface{}{}); err != nil {
+		if _, err = client.StartCall(ctx, c.child, "Run", []interface{}{}); err != nil {
 			vlog.Error(err)
 			return err
 		}
 	}
 
 	vlog.Info(c.name, " waiting for cancellation")
-	<-call.Context().Done()
+	<-ctx.Done()
 	vlog.Info(c.name, " canceled")
 	close(c.canceled)
 	return nil
diff --git a/profiles/internal/rpc/debug_test.go b/profiles/internal/rpc/debug_test.go
index 035aef8..b4081fe 100644
--- a/profiles/internal/rpc/debug_test.go
+++ b/profiles/internal/rpc/debug_test.go
@@ -11,11 +11,11 @@
 	"testing"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/options"
 	"v.io/v23/rpc"
 	"v.io/x/lib/vlog"
-
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/profiles/internal/rpc/stream/manager"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
@@ -127,6 +127,6 @@
 type testObject struct {
 }
 
-func (o testObject) Foo(rpc.ServerCall) (string, error) {
+func (o testObject) Foo(*context.T, rpc.ServerCall) (string, error) {
 	return "BAR", nil
 }
diff --git a/profiles/internal/rpc/discharges_test.go b/profiles/internal/rpc/discharges_test.go
index 79a5966..7072a69 100644
--- a/profiles/internal/rpc/discharges_test.go
+++ b/profiles/internal/rpc/discharges_test.go
@@ -10,7 +10,6 @@
 
 	"v.io/v23/security"
 	"v.io/v23/vdl"
-
 	"v.io/x/ref/test/testutil"
 )
 
diff --git a/profiles/internal/rpc/full_test.go b/profiles/internal/rpc/full_test.go
index 8d1ee86..f74e4a8 100644
--- a/profiles/internal/rpc/full_test.go
+++ b/profiles/internal/rpc/full_test.go
@@ -31,10 +31,8 @@
 	"v.io/v23/vdl"
 	"v.io/v23/verror"
 	"v.io/v23/vtrace"
-	"v.io/x/lib/vlog"
-	"v.io/x/ref/profiles/internal/rpc/stream"
-
 	"v.io/x/lib/netstate"
+	"v.io/x/lib/vlog"
 	"v.io/x/ref/lib/stats"
 	"v.io/x/ref/profiles/internal/lib/publisher"
 	"v.io/x/ref/profiles/internal/lib/websocket"
@@ -42,6 +40,7 @@
 	_ "v.io/x/ref/profiles/internal/rpc/protocols/tcp"
 	_ "v.io/x/ref/profiles/internal/rpc/protocols/ws"
 	_ "v.io/x/ref/profiles/internal/rpc/protocols/wsh"
+	"v.io/x/ref/profiles/internal/rpc/stream"
 	imanager "v.io/x/ref/profiles/internal/rpc/stream/manager"
 	"v.io/x/ref/profiles/internal/rpc/stream/vc"
 	tnaming "v.io/x/ref/profiles/internal/testing/mocks/naming"
@@ -88,33 +87,33 @@
 
 type testServer struct{}
 
-func (*testServer) Closure(call rpc.ServerCall) error {
+func (*testServer) Closure(*context.T, rpc.ServerCall) error {
 	return nil
 }
 
-func (*testServer) Error(call rpc.ServerCall) error {
+func (*testServer) Error(*context.T, rpc.ServerCall) error {
 	return errMethod
 }
 
-func (*testServer) Echo(call rpc.ServerCall, arg string) (string, error) {
+func (*testServer) Echo(_ *context.T, call rpc.ServerCall, arg string) (string, error) {
 	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", "Echo", call.Suffix(), arg), nil
 }
 
-func (*testServer) EchoUser(call rpc.ServerCall, arg string, u userType) (string, userType, error) {
+func (*testServer) EchoUser(_ *context.T, call rpc.ServerCall, arg string, u userType) (string, userType, error) {
 	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", "EchoUser", call.Suffix(), arg), u, nil
 }
 
-func (*testServer) EchoBlessings(call rpc.ServerCall) (server, client string, _ error) {
-	local := security.LocalBlessingNames(call.Context())
-	remote, _ := security.RemoteBlessingNames(call.Context())
+func (*testServer) EchoBlessings(ctx *context.T, _ rpc.ServerCall) (server, client string, _ error) {
+	local := security.LocalBlessingNames(ctx)
+	remote, _ := security.RemoteBlessingNames(ctx)
 	return fmt.Sprintf("%v", local), fmt.Sprintf("%v", remote), nil
 }
 
-func (*testServer) EchoGrantedBlessings(call rpc.ServerCall, arg string) (result, blessing string, _ error) {
+func (*testServer) EchoGrantedBlessings(_ *context.T, call rpc.ServerCall, arg string) (result, blessing string, _ error) {
 	return arg, fmt.Sprintf("%v", call.GrantedBlessings()), nil
 }
 
-func (*testServer) EchoAndError(call rpc.ServerCall, arg string) (string, error) {
+func (*testServer) EchoAndError(_ *context.T, call rpc.ServerCall, arg string) (string, error) {
 	result := fmt.Sprintf("method:%q,suffix:%q,arg:%q", "EchoAndError", call.Suffix(), arg)
 	if arg == "error" {
 		return result, errMethod
@@ -122,7 +121,7 @@
 	return result, nil
 }
 
-func (*testServer) Stream(call rpc.StreamServerCall, arg string) (string, error) {
+func (*testServer) Stream(_ *context.T, call rpc.StreamServerCall, arg string) (string, error) {
 	result := fmt.Sprintf("method:%q,suffix:%q,arg:%q", "Stream", call.Suffix(), arg)
 	var u userType
 	var err error
@@ -138,7 +137,7 @@
 	return result, err
 }
 
-func (*testServer) Unauthorized(rpc.StreamServerCall) (string, error) {
+func (*testServer) Unauthorized(*context.T, rpc.StreamServerCall) (string, error) {
 	return "UnauthorizedResult", nil
 }
 
@@ -202,7 +201,7 @@
 	called bool
 }
 
-func (ds *dischargeServer) Discharge(call rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
+func (ds *dischargeServer) Discharge(ctx *context.T, _ rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	ds.mu.Lock()
 	ds.called = true
 	ds.mu.Unlock()
@@ -210,7 +209,7 @@
 	if tp == nil {
 		return security.Discharge{}, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
 	}
-	if err := tp.Dischargeable(call.Context()); err != nil {
+	if err := tp.Dischargeable(ctx); err != nil {
 		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
 	}
 	// Add a fakeTimeCaveat to be able to control discharge expiration via 'clock'.
@@ -218,7 +217,7 @@
 	if err != nil {
 		return security.Discharge{}, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
 	}
-	return security.GetCall(call.Context()).LocalPrincipal().MintDischarge(cav, expiry)
+	return security.GetCall(ctx).LocalPrincipal().MintDischarge(cav, expiry)
 }
 
 func startServer(t *testing.T, ctx *context.T, principal security.Principal, sm stream.Manager, ns namespace.T, name string, disp rpc.Dispatcher, opts ...rpc.ServerOpt) (naming.Endpoint, rpc.Server) {
@@ -870,9 +869,9 @@
 	traceid []uniqueid.Id
 }
 
-func (s *dischargeTestServer) Discharge(call rpc.ServerCall, cav security.Caveat, impetus security.DischargeImpetus) (security.Discharge, error) {
+func (s *dischargeTestServer) Discharge(ctx *context.T, _ rpc.ServerCall, cav security.Caveat, impetus security.DischargeImpetus) (security.Discharge, error) {
 	s.impetus = append(s.impetus, impetus)
-	s.traceid = append(s.traceid, vtrace.GetSpan(call.Context()).Trace())
+	s.traceid = append(s.traceid, vtrace.GetSpan(ctx).Trace())
 	return security.Discharge{}, fmt.Errorf("discharges not issued")
 }
 
@@ -1345,13 +1344,13 @@
 	}
 }
 
-func (s *cancelTestServer) CancelStreamReader(call rpc.StreamServerCall) error {
+func (s *cancelTestServer) CancelStreamReader(ctx *context.T, call rpc.StreamServerCall) error {
 	close(s.started)
 	var b []byte
 	if err := call.Recv(&b); err != io.EOF {
 		s.t.Errorf("Got error %v, want io.EOF", err)
 	}
-	<-call.Context().Done()
+	<-ctx.Done()
 	close(s.cancelled)
 	return nil
 }
@@ -1359,9 +1358,9 @@
 // CancelStreamIgnorer doesn't read from it's input stream so all it's
 // buffers fill.  The intention is to show that call.Done() is closed
 // even when the stream is stalled.
-func (s *cancelTestServer) CancelStreamIgnorer(call rpc.StreamServerCall) error {
+func (s *cancelTestServer) CancelStreamIgnorer(ctx *context.T, _ rpc.StreamServerCall) error {
 	close(s.started)
-	<-call.Context().Done()
+	<-ctx.Done()
 	close(s.cancelled)
 	return nil
 }
@@ -1420,7 +1419,7 @@
 
 type streamRecvInGoroutineServer struct{ c chan error }
 
-func (s *streamRecvInGoroutineServer) RecvInGoroutine(call rpc.StreamServerCall) error {
+func (s *streamRecvInGoroutineServer) RecvInGoroutine(_ *context.T, call rpc.StreamServerCall) error {
 	// Spawn a goroutine to read streaming data from the client.
 	go func() {
 		var i interface{}
@@ -1981,12 +1980,12 @@
 	called bool
 }
 
-func (ed *expiryDischarger) Discharge(call rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
+func (ed *expiryDischarger) Discharge(ctx *context.T, _ rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	tp := cav.ThirdPartyDetails()
 	if tp == nil {
 		return security.Discharge{}, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
 	}
-	if err := tp.Dischargeable(call.Context()); err != nil {
+	if err := tp.Dischargeable(ctx); err != nil {
 		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
 	}
 	expDur := 10 * time.Millisecond
@@ -1997,7 +1996,7 @@
 	if err != nil {
 		return security.Discharge{}, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
 	}
-	d, err := security.GetCall(call.Context()).LocalPrincipal().MintDischarge(cav, expiry)
+	d, err := security.GetCall(ctx).LocalPrincipal().MintDischarge(cav, expiry)
 	if err != nil {
 		return security.Discharge{}, err
 	}
diff --git a/profiles/internal/rpc/reserved.go b/profiles/internal/rpc/reserved.go
index c095378..1b1f1ff 100644
--- a/profiles/internal/rpc/reserved.go
+++ b/profiles/internal/rpc/reserved.go
@@ -76,8 +76,8 @@
 	}}
 }
 
-func (r *reservedMethods) Signature(call rpc.ServerCall) ([]signature.Interface, error) {
-	ctx, suffix := call.Context(), call.Suffix()
+func (r *reservedMethods) Signature(ctx *context.T, call rpc.ServerCall) ([]signature.Interface, error) {
+	suffix := call.Suffix()
 	disp := r.dispNormal
 	if naming.IsReserved(suffix) {
 		disp = r.dispReserved
@@ -96,13 +96,13 @@
 	if err != nil {
 		return nil, err
 	}
-	sig, err := invoker.Signature(call)
+	sig, err := invoker.Signature(ctx, call)
 	if err != nil {
 		return nil, err
 	}
 	// Append the reserved methods.  We wait until now to add the "__" prefix to
 	// each method, so that we can use the regular ReflectInvoker.Signature logic.
-	rsig, err := r.selfInvoker.Signature(call)
+	rsig, err := r.selfInvoker.Signature(ctx, call)
 	if err != nil {
 		return nil, err
 	}
@@ -114,13 +114,13 @@
 	return signature.CleanInterfaces(append(sig, rsig...)), nil
 }
 
-func (r *reservedMethods) MethodSignature(call rpc.ServerCall, method string) (signature.Method, error) {
+func (r *reservedMethods) MethodSignature(ctx *context.T, call rpc.ServerCall, method string) (signature.Method, error) {
 	// Reserved methods use our self invoker, to describe our own methods,
 	if naming.IsReserved(method) {
-		return r.selfInvoker.MethodSignature(call, naming.StripReserved(method))
+		return r.selfInvoker.MethodSignature(ctx, call, naming.StripReserved(method))
 	}
 
-	ctx, suffix := call.Context(), call.Suffix()
+	suffix := call.Suffix()
 	disp := r.dispNormal
 	if naming.IsReserved(suffix) {
 		disp = r.dispReserved
@@ -141,13 +141,13 @@
 	}
 	// TODO(toddw): Decide if we should hide the method signature if the
 	// caller doesn't have access to call it.
-	return invoker.MethodSignature(call, method)
+	return invoker.MethodSignature(ctx, call, method)
 }
 
-func (r *reservedMethods) Glob(call rpc.StreamServerCall, pattern string) error {
+func (r *reservedMethods) Glob(ctx *context.T, call rpc.StreamServerCall, pattern string) error {
 	// Copy the original call to shield ourselves from changes the flowServer makes.
 	glob := globInternal{r.dispNormal, r.dispReserved, call.Suffix()}
-	return glob.Glob(call, pattern)
+	return glob.Glob(ctx, call, pattern)
 }
 
 // globInternal handles ALL the Glob requests received by a server and
@@ -188,7 +188,7 @@
 // levels.
 const maxRecursiveGlobDepth = 10
 
-func (i *globInternal) Glob(call rpc.StreamServerCall, pattern string) error {
+func (i *globInternal) Glob(ctx *context.T, call rpc.StreamServerCall, pattern string) error {
 	vlog.VI(3).Infof("rpc Glob: Incoming request: %q.Glob(%q)", i.receiver, pattern)
 	g, err := glob.Parse(pattern)
 	if err != nil {
@@ -201,9 +201,9 @@
 		tags = []*vdl.Value{vdl.ValueOf(access.Debug)}
 	}
 	if disp == nil {
-		return reserved.NewErrGlobNotImplemented(call.Context())
+		return reserved.NewErrGlobNotImplemented(ctx)
 	}
-	call = callWithMethodTags(call, tags)
+	ctx, call = callWithMethodTags(ctx, call, tags)
 
 	type gState struct {
 		name  string
@@ -215,7 +215,7 @@
 	someMatchesOmitted := false
 	for len(queue) != 0 {
 		select {
-		case <-call.Context().Done():
+		case <-ctx.Done():
 			// RPC timed out or was canceled.
 			return nil
 		default:
@@ -223,8 +223,8 @@
 		state := queue[0]
 		queue = queue[1:]
 
-		subcall := callWithSuffix(call, naming.Join(i.receiver, state.name))
-		ctx, suffix := subcall.Context(), subcall.Suffix()
+		ctx, subcall := callWithSuffix(ctx, call, naming.Join(i.receiver, state.name))
+		suffix := subcall.Suffix()
 		if state.depth > maxRecursiveGlobDepth {
 			vlog.Errorf("rpc Glob: exceeded recursion limit (%d): %q", maxRecursiveGlobDepth, suffix)
 			call.Send(naming.GlobReplyError{
@@ -278,7 +278,7 @@
 		}
 		if gs.AllGlobber != nil {
 			vlog.VI(3).Infof("rpc Glob: %q implements AllGlobber", suffix)
-			ch, err := gs.AllGlobber.Glob__(subcall, state.glob.String())
+			ch, err := gs.AllGlobber.Glob__(ctx, subcall, state.glob.String())
 			if err != nil {
 				vlog.VI(3).Infof("rpc Glob: %q.Glob(%q) failed: %v", suffix, state.glob, err)
 				subcall.Send(naming.GlobReplyError{naming.GlobError{Name: state.name, Error: verror.Convert(verror.ErrInternal, ctx, err)}})
@@ -300,7 +300,7 @@
 			continue
 		}
 		vlog.VI(3).Infof("rpc Glob: %q implements ChildrenGlobber", suffix)
-		children, err := gs.ChildrenGlobber.GlobChildren__(subcall)
+		children, err := gs.ChildrenGlobber.GlobChildren__(ctx, subcall)
 		// The requested object doesn't exist.
 		if err != nil {
 			subcall.Send(naming.GlobReplyError{naming.GlobError{Name: state.name, Error: verror.Convert(verror.ErrInternal, ctx, err)}})
@@ -331,7 +331,7 @@
 		}
 	}
 	if someMatchesOmitted {
-		call.Send(naming.GlobReplyError{naming.GlobError{Error: reserved.NewErrGlobMatchesOmitted(call.Context())}})
+		call.Send(naming.GlobReplyError{naming.GlobError{Error: reserved.NewErrGlobMatchesOmitted(ctx)}})
 	}
 	return nil
 }
@@ -340,20 +340,22 @@
 // useful for our various special-cased reserved methods.
 type derivedServerCall struct {
 	rpc.StreamServerCall
-	ctx    *context.T
-	suffix string
+	suffix   string
+	security security.Call
 }
 
-func callWithSuffix(src rpc.StreamServerCall, suffix string) rpc.StreamServerCall {
-	return &derivedServerCall{src, securityCallWithSuffix(src.Context(), suffix), suffix}
+func callWithSuffix(ctx *context.T, src rpc.StreamServerCall, suffix string) (*context.T, rpc.StreamServerCall) {
+	sec := securityCallWithSuffix(src.Security(), suffix)
+	return security.SetCall(ctx, sec), &derivedServerCall{src, suffix, sec}
 }
 
-func callWithMethodTags(src rpc.StreamServerCall, tags []*vdl.Value) rpc.StreamServerCall {
-	return &derivedServerCall{src, securityCallWithMethodTags(src.Context(), tags), src.Suffix()}
+func callWithMethodTags(ctx *context.T, src rpc.StreamServerCall, tags []*vdl.Value) (*context.T, rpc.StreamServerCall) {
+	sec := securityCallWithMethodTags(src.Security(), tags)
+	return security.SetCall(ctx, sec), &derivedServerCall{src, src.Suffix(), sec}
 }
 
-func (c *derivedServerCall) Context() *context.T { return c.ctx }
-func (c *derivedServerCall) Suffix() string      { return c.suffix }
+func (c *derivedServerCall) Suffix() string          { return c.suffix }
+func (c *derivedServerCall) Security() security.Call { return c.security }
 
 type derivedSecurityCall struct {
 	security.Call
@@ -361,22 +363,12 @@
 	methodTags []*vdl.Value
 }
 
-func securityCallWithSuffix(ctx *context.T, suffix string) *context.T {
-	secCall := security.GetCall(ctx)
-	return security.SetCall(ctx, &derivedSecurityCall{
-		Call:       secCall,
-		suffix:     suffix,
-		methodTags: secCall.MethodTags(),
-	})
+func securityCallWithSuffix(src security.Call, suffix string) security.Call {
+	return &derivedSecurityCall{src, suffix, src.MethodTags()}
 }
 
-func securityCallWithMethodTags(ctx *context.T, tags []*vdl.Value) *context.T {
-	secCall := security.GetCall(ctx)
-	return security.SetCall(ctx, &derivedSecurityCall{
-		Call:       secCall,
-		suffix:     secCall.Suffix(),
-		methodTags: tags,
-	})
+func securityCallWithMethodTags(src security.Call, tags []*vdl.Value) security.Call {
+	return &derivedSecurityCall{src, src.Suffix(), tags}
 }
 
 func (c *derivedSecurityCall) Suffix() string           { return c.suffix }
diff --git a/profiles/internal/rpc/server.go b/profiles/internal/rpc/server.go
index 76260fa..ad19468 100644
--- a/profiles/internal/rpc/server.go
+++ b/profiles/internal/rpc/server.go
@@ -951,7 +951,7 @@
 // flowServer implements the RPC server-side protocol for a single RPC, over a
 // flow that's already connected to the client.
 type flowServer struct {
-	*context.T
+	ctx    *context.T     // context associated with the RPC
 	server *server        // rpc.Server that this flow server belongs to
 	disp   rpc.Dispatcher // rpc.Dispatcher that will serve RPCs on this flow
 	dec    *vom.Decoder   // to decode requests and args from the client
@@ -969,7 +969,10 @@
 	endStreamArgs    bool // are the stream args at EOF?
 }
 
-var _ rpc.Stream = (*flowServer)(nil)
+var (
+	_ rpc.StreamServerCall = (*flowServer)(nil)
+	_ security.Call        = (*flowServer)(nil)
+)
 
 func newFlowServer(flow stream.Flow, server *server) (*flowServer, error) {
 	server.Lock()
@@ -977,15 +980,14 @@
 	server.Unlock()
 
 	fs := &flowServer{
-		T:          server.ctx,
+		ctx:        server.ctx,
 		server:     server,
 		disp:       disp,
 		flow:       flow,
 		discharges: make(map[string]security.Discharge),
 	}
-	// Attach the flow server to fs.T (the embedded *context.T) to act
-	// as a security.Call.
-	fs.T = security.SetCall(fs.T, fs)
+	// Attach the flow server to fs.ctx to act as a security.Call.
+	fs.ctx = security.SetCall(fs.ctx, fs)
 	var err error
 	typedec := flow.VCDataCache().Get(vc.TypeDecoderKey{})
 	if typedec == nil {
@@ -1017,11 +1019,11 @@
 func (fs *flowServer) authorizeVtrace() error {
 	// Set up a context as though we were calling __debug/vtrace.
 	params := &security.CallParams{}
-	params.Copy(security.GetCall(fs.T))
+	params.Copy(security.GetCall(fs.ctx))
 	params.Method = "Trace"
 	params.MethodTags = []*vdl.Value{vdl.ValueOf(access.Debug)}
 	params.Suffix = "__debug/vtrace"
-	ctx := security.SetCall(fs.T, security.NewCall(params))
+	ctx := security.SetCall(fs.ctx, security.NewCall(params))
 
 	var auth security.Authorizer
 	if fs.server.dispReserved != nil {
@@ -1035,12 +1037,12 @@
 
 	results, err := fs.processRequest()
 
-	vtrace.GetSpan(fs.T).Finish()
+	vtrace.GetSpan(fs.ctx).Finish()
 
 	var traceResponse vtrace.Response
 	// Check if the caller is permitted to view vtrace data.
 	if fs.authorizeVtrace() == nil {
-		traceResponse = vtrace.GetResponse(fs.T)
+		traceResponse = vtrace.GetResponse(fs.ctx)
 	}
 
 	// Respond to the client with the response header and positional results.
@@ -1055,7 +1057,7 @@
 		if err == io.EOF {
 			return err
 		}
-		return verror.New(errResponseEncoding, fs.Context(), fs.LocalEndpoint().String(), fs.RemoteEndpoint().String(), err)
+		return verror.New(errResponseEncoding, fs.ctx, fs.LocalEndpoint().String(), fs.RemoteEndpoint().String(), err)
 	}
 	if response.Error != nil {
 		return response.Error
@@ -1065,7 +1067,7 @@
 			if err == io.EOF {
 				return err
 			}
-			return verror.New(errResultEncoding, fs.Context(), ix, fmt.Sprintf("%T=%v", res, res), err)
+			return verror.New(errResultEncoding, fs.ctx, ix, fmt.Sprintf("%T=%v", res, res), err)
 		}
 	}
 	// TODO(ashankar): Should unread data from the flow be drained?
@@ -1095,7 +1097,7 @@
 	// Decode the initial request.
 	var req rpc.Request
 	if err := fs.dec.Decode(&req); err != nil {
-		return nil, verror.New(verror.ErrBadProtocol, fs.T, newErrBadRequest(fs.T, err))
+		return nil, verror.New(verror.ErrBadProtocol, fs.ctx, newErrBadRequest(fs.ctx, err))
 	}
 	return &req, nil
 }
@@ -1106,7 +1108,7 @@
 	if err != nil {
 		// We don't know what the rpc call was supposed to be, but we'll create
 		// a placeholder span so we can capture annotations.
-		fs.T, _ = vtrace.SetNewSpan(fs.T, fmt.Sprintf("\"%s\".UNKNOWN", fs.Name()))
+		fs.ctx, _ = vtrace.SetNewSpan(fs.ctx, fmt.Sprintf("\"%s\".UNKNOWN", fs.suffix))
 		return nil, err
 	}
 	fs.method = req.Method
@@ -1115,16 +1117,16 @@
 	// TODO(mattr): Currently this allows users to trigger trace collection
 	// on the server even if they will not be allowed to collect the
 	// results later.  This might be considered a DOS vector.
-	spanName := fmt.Sprintf("\"%s\".%s", fs.Name(), fs.Method())
-	fs.T, _ = vtrace.SetContinuedTrace(fs.T, spanName, req.TraceRequest)
+	spanName := fmt.Sprintf("\"%s\".%s", fs.suffix, fs.method)
+	fs.ctx, _ = vtrace.SetContinuedTrace(fs.ctx, spanName, req.TraceRequest)
 
 	var cancel context.CancelFunc
 	if !req.Deadline.IsZero() {
-		fs.T, cancel = context.WithDeadline(fs.T, req.Deadline.Time)
+		fs.ctx, cancel = context.WithDeadline(fs.ctx, req.Deadline.Time)
 	} else {
-		fs.T, cancel = context.WithCancel(fs.T)
+		fs.ctx, cancel = context.WithCancel(fs.ctx)
 	}
-	fs.flow.SetDeadline(fs.Done())
+	fs.flow.SetDeadline(fs.ctx.Done())
 	go fs.cancelContextOnClose(cancel)
 
 	// Initialize security: blessings, discharges, etc.
@@ -1150,21 +1152,21 @@
 		return nil, err
 	}
 	if called, want := req.NumPosArgs, uint64(len(argptrs)); called != want {
-		return nil, newErrBadNumInputArgs(fs.T, fs.suffix, fs.method, called, want)
+		return nil, newErrBadNumInputArgs(fs.ctx, fs.suffix, fs.method, called, want)
 	}
 	for ix, argptr := range argptrs {
 		if err := fs.dec.Decode(argptr); err != nil {
-			return nil, newErrBadInputArg(fs.T, fs.suffix, fs.method, uint64(ix), err)
+			return nil, newErrBadInputArg(fs.ctx, fs.suffix, fs.method, uint64(ix), err)
 		}
 	}
 
 	// Check application's authorization policy.
-	if err := authorize(fs.T, auth); err != nil {
+	if err := authorize(fs.ctx, auth); err != nil {
 		return nil, err
 	}
 
 	// Invoke the method.
-	results, err := invoker.Invoke(strippedMethod, fs, argptrs)
+	results, err := invoker.Invoke(fs.ctx, fs, strippedMethod, argptrs)
 	fs.server.stats.record(fs.method, time.Since(fs.starttime))
 	return results, err
 }
@@ -1180,7 +1182,7 @@
 		// matter that the context is also cancelled.
 		fs.flow.SetDeadline(nil)
 		cancel()
-	case <-fs.Done():
+	case <-fs.ctx.Done():
 	}
 }
 
@@ -1205,12 +1207,12 @@
 		case obj != nil:
 			invoker, err := objectToInvoker(obj)
 			if err != nil {
-				return nil, nil, verror.New(verror.ErrInternal, fs.T, "invalid received object", err)
+				return nil, nil, verror.New(verror.ErrInternal, fs.ctx, "invalid received object", err)
 			}
 			return invoker, auth, nil
 		}
 	}
-	return nil, nil, verror.New(verror.ErrUnknownSuffix, fs.T, suffix)
+	return nil, nil, verror.New(verror.ErrUnknownSuffix, fs.ctx, suffix)
 }
 
 func objectToInvoker(obj interface{}) (rpc.Invoker, error) {
@@ -1226,7 +1228,7 @@
 func (fs *flowServer) initSecurity(req *rpc.Request) error {
 	// LocalPrincipal is nil which means we are operating under
 	// SecurityNone.
-	if fs.flow.LocalPrincipal() == nil {
+	if fs.LocalPrincipal() == nil {
 		return nil
 	}
 
@@ -1238,8 +1240,8 @@
 	// the server's identity as the blessing. Figure out what we want to do about
 	// 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 got, want := req.GrantedBlessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey(); got != nil && !reflect.DeepEqual(got, want) {
-		return verror.New(verror.ErrNoAccess, fs.T, fmt.Sprintf("blessing granted not bound to this server(%v vs %v)", got, want))
+	if got, want := req.GrantedBlessings.PublicKey(), fs.LocalPrincipal().PublicKey(); got != nil && !reflect.DeepEqual(got, want) {
+		return verror.New(verror.ErrNoAccess, fs.ctx, fmt.Sprintf("blessing granted not bound to this server(%v vs %v)", got, want))
 	}
 	fs.grantedBlessings = req.GrantedBlessings
 
@@ -1250,12 +1252,12 @@
 		// TODO(suharshs,toddw): Figure out a way to only shutdown the current VC, instead
 		// of all VCs connected to the RemoteEndpoint.
 		fs.server.streamMgr.ShutdownEndpoint(fs.RemoteEndpoint())
-		return verror.New(verror.ErrBadProtocol, fs.T, newErrBadBlessingsCache(fs.T, err))
+		return verror.New(verror.ErrBadProtocol, fs.ctx, newErrBadBlessingsCache(fs.ctx, err))
 	}
 	// Verify that the blessings sent by the client in the request have the same public
 	// key as those sent by the client during VC establishment.
 	if got, want := fs.clientBlessings.PublicKey(), fs.flow.RemoteBlessings().PublicKey(); got != nil && !reflect.DeepEqual(got, want) {
-		return verror.New(verror.ErrNoAccess, fs.T, fmt.Sprintf("blessings sent with the request are bound to a different public key (%v) from the blessing used during VC establishment (%v)", got, want))
+		return verror.New(verror.ErrNoAccess, fs.ctx, fmt.Sprintf("blessings sent with the request are bound to a different public key (%v) from the blessing used during VC establishment (%v)", got, want))
 	}
 	fs.ackBlessings = true
 
@@ -1312,8 +1314,12 @@
 	return fs.dec.Decode(itemptr)
 }
 
-// Implementations of rpc.ServerCall methods.
+// Implementations of rpc.ServerCall and security.Call methods.
 
+func (fs *flowServer) Security() security.Call {
+	//nologcall
+	return fs
+}
 func (fs *flowServer) LocalDischarges() map[string]security.Discharge {
 	//nologcall
 	return fs.flow.LocalDischarges()
@@ -1338,20 +1344,6 @@
 	//nologcall
 	return fs.tags
 }
-func (fs *flowServer) Context() *context.T {
-	return fs.T
-}
-
-func (fs *flowServer) VanadiumContext() *context.T {
-	return fs.T
-}
-
-// TODO(cnicolaou): remove Name from rpc.ServerCall and all of
-// its implementations
-func (fs *flowServer) Name() string {
-	//nologcall
-	return fs.suffix
-}
 func (fs *flowServer) Suffix() string {
 	//nologcall
 	return fs.suffix
diff --git a/profiles/internal/rpc/server_test.go b/profiles/internal/rpc/server_test.go
index d2c72d7..095e902 100644
--- a/profiles/internal/rpc/server_test.go
+++ b/profiles/internal/rpc/server_test.go
@@ -34,7 +34,7 @@
 }
 type noExportedFieldsType struct{}
 
-func (noExportedFieldsType) F(_ rpc.ServerCall, f fieldType) error { return nil }
+func (noExportedFieldsType) F(_ *context.T, _ rpc.ServerCall, f fieldType) error { return nil }
 
 type badObjectDispatcher struct{}
 
@@ -129,7 +129,7 @@
 
 type statusServer struct{ ch chan struct{} }
 
-func (s *statusServer) Hang(call rpc.ServerCall) error {
+func (s *statusServer) Hang(*context.T, rpc.ServerCall) error {
 	<-s.ch
 	return nil
 }
diff --git a/profiles/internal/rpc/stress/internal/server.go b/profiles/internal/rpc/stress/internal/server.go
index 217995c..d6520e3 100644
--- a/profiles/internal/rpc/stress/internal/server.go
+++ b/profiles/internal/rpc/stress/internal/server.go
@@ -24,12 +24,12 @@
 	stop chan struct{}
 }
 
-func (s *impl) Sum(call rpc.ServerCall, arg stress.Arg) ([]byte, error) {
+func (s *impl) Sum(_ *context.T, _ rpc.ServerCall, arg stress.Arg) ([]byte, error) {
 	defer s.incSumCount()
 	return doSum(arg)
 }
 
-func (s *impl) SumStream(call stress.StressSumStreamServerCall) error {
+func (s *impl) SumStream(_ *context.T, call stress.StressSumStreamServerCall) error {
 	defer s.incSumStreamCount()
 	rStream := call.RecvStream()
 	sStream := call.SendStream()
@@ -46,13 +46,13 @@
 	return nil
 }
 
-func (s *impl) GetStats(call rpc.ServerCall) (stress.Stats, error) {
+func (s *impl) GetStats(*context.T, rpc.ServerCall) (stress.Stats, error) {
 	s.statsMu.Lock()
 	defer s.statsMu.Unlock()
 	return stress.Stats{s.sumCount, s.sumStreamCount}, nil
 }
 
-func (s *impl) Stop(call rpc.ServerCall) error {
+func (s *impl) Stop(*context.T, rpc.ServerCall) error {
 	s.stop <- struct{}{}
 	return nil
 }
diff --git a/profiles/internal/rpc/stress/stress.vdl.go b/profiles/internal/rpc/stress/stress.vdl.go
index 327a576..505c788 100644
--- a/profiles/internal/rpc/stress/stress.vdl.go
+++ b/profiles/internal/rpc/stress/stress.vdl.go
@@ -203,13 +203,13 @@
 // implements for Stress.
 type StressServerMethods interface {
 	// Do returns the checksum of the payload that it receives.
-	Sum(call rpc.ServerCall, arg Arg) ([]byte, error)
+	Sum(ctx *context.T, call rpc.ServerCall, arg Arg) ([]byte, error)
 	// DoStream returns the checksum of the payload that it receives via the stream.
-	SumStream(StressSumStreamServerCall) error
+	SumStream(*context.T, StressSumStreamServerCall) error
 	// GetStats returns the stats on the calls that the server received.
-	GetStats(rpc.ServerCall) (Stats, error)
+	GetStats(*context.T, rpc.ServerCall) (Stats, error)
 	// Stop stops the server.
-	Stop(rpc.ServerCall) error
+	Stop(*context.T, rpc.ServerCall) error
 }
 
 // StressServerStubMethods is the server interface containing
@@ -218,13 +218,13 @@
 // is the streaming methods.
 type StressServerStubMethods interface {
 	// Do returns the checksum of the payload that it receives.
-	Sum(call rpc.ServerCall, arg Arg) ([]byte, error)
+	Sum(ctx *context.T, call rpc.ServerCall, arg Arg) ([]byte, error)
 	// DoStream returns the checksum of the payload that it receives via the stream.
-	SumStream(*StressSumStreamServerCallStub) error
+	SumStream(*context.T, *StressSumStreamServerCallStub) error
 	// GetStats returns the stats on the calls that the server received.
-	GetStats(rpc.ServerCall) (Stats, error)
+	GetStats(*context.T, rpc.ServerCall) (Stats, error)
 	// Stop stops the server.
-	Stop(rpc.ServerCall) error
+	Stop(*context.T, rpc.ServerCall) error
 }
 
 // StressServerStub adds universal methods to StressServerStubMethods.
@@ -256,20 +256,20 @@
 	gs   *rpc.GlobState
 }
 
-func (s implStressServerStub) Sum(call rpc.ServerCall, i0 Arg) ([]byte, error) {
-	return s.impl.Sum(call, i0)
+func (s implStressServerStub) Sum(ctx *context.T, call rpc.ServerCall, i0 Arg) ([]byte, error) {
+	return s.impl.Sum(ctx, call, i0)
 }
 
-func (s implStressServerStub) SumStream(call *StressSumStreamServerCallStub) error {
-	return s.impl.SumStream(call)
+func (s implStressServerStub) SumStream(ctx *context.T, call *StressSumStreamServerCallStub) error {
+	return s.impl.SumStream(ctx, call)
 }
 
-func (s implStressServerStub) GetStats(call rpc.ServerCall) (Stats, error) {
-	return s.impl.GetStats(call)
+func (s implStressServerStub) GetStats(ctx *context.T, call rpc.ServerCall) (Stats, error) {
+	return s.impl.GetStats(ctx, call)
 }
 
-func (s implStressServerStub) Stop(call rpc.ServerCall) error {
-	return s.impl.Stop(call)
+func (s implStressServerStub) Stop(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.Stop(ctx, call)
 }
 
 func (s implStressServerStub) Globber() *rpc.GlobState {
diff --git a/profiles/internal/rpc/test/client_test.go b/profiles/internal/rpc/test/client_test.go
index 31de6ea..62a094b 100644
--- a/profiles/internal/rpc/test/client_test.go
+++ b/profiles/internal/rpc/test/client_test.go
@@ -23,7 +23,6 @@
 	"v.io/v23/security"
 	"v.io/v23/vdlroot/signature"
 	"v.io/v23/verror"
-
 	"v.io/x/ref/envvar"
 	_ "v.io/x/ref/profiles"
 	inaming "v.io/x/ref/profiles/internal/naming"
@@ -85,14 +84,14 @@
 	id, suffix string
 }
 
-func (es *echoServerObject) Echo(call rpc.ServerCall, m string) (string, error) {
+func (es *echoServerObject) Echo(_ *context.T, _ rpc.ServerCall, m string) (string, error) {
 	if len(es.suffix) > 0 {
 		return fmt.Sprintf("%s.%s: %s\n", es.id, es.suffix, m), nil
 	}
 	return fmt.Sprintf("%s: %s\n", es.id, m), nil
 }
 
-func (es *echoServerObject) Sleep(call rpc.ServerCall, d string) error {
+func (es *echoServerObject) Sleep(_ *context.T, _ rpc.ServerCall, d string) error {
 	duration, err := time.ParseDuration(d)
 	if err != nil {
 		return err
diff --git a/profiles/internal/rpc/test/glob_test.go b/profiles/internal/rpc/test/glob_test.go
index 579e0a3..792b0c2 100644
--- a/profiles/internal/rpc/test/glob_test.go
+++ b/profiles/internal/rpc/test/glob_test.go
@@ -19,7 +19,6 @@
 	"v.io/v23/rpc/reserved"
 	"v.io/v23/security"
 	"v.io/v23/verror"
-
 	"v.io/x/ref/lib/glob"
 	_ "v.io/x/ref/profiles"
 	"v.io/x/ref/test"
@@ -300,14 +299,14 @@
 	suffix []string
 }
 
-func (o *globObject) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (o *globObject) Glob__(ctx *context.T, _ rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	g, err := glob.Parse(pattern)
 	if err != nil {
 		return nil, err
 	}
 	n := o.n.find(o.suffix, false)
 	if n == nil {
-		return nil, verror.New(verror.ErrNoExist, call.Context(), o.suffix)
+		return nil, verror.New(verror.ErrNoExist, ctx, o.suffix)
 	}
 	ch := make(chan naming.GlobReply)
 	go func() {
@@ -336,10 +335,10 @@
 	suffix []string
 }
 
-func (o *vChildrenObject) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
+func (o *vChildrenObject) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
 	n := o.n.find(o.suffix, false)
 	if n == nil {
-		return nil, verror.New(verror.ErrNoExist, call.Context(), o.suffix)
+		return nil, verror.New(verror.ErrNoExist, ctx, o.suffix)
 	}
 	ch := make(chan string, len(n.children))
 	for child, _ := range n.children {
@@ -383,6 +382,6 @@
 
 type leafObject struct{}
 
-func (l leafObject) Func(call rpc.ServerCall) error {
+func (l leafObject) Func(*context.T, rpc.ServerCall) error {
 	return nil
 }
diff --git a/profiles/internal/rpc/test/proxy_test.go b/profiles/internal/rpc/test/proxy_test.go
index ed47050..a162ce4 100644
--- a/profiles/internal/rpc/test/proxy_test.go
+++ b/profiles/internal/rpc/test/proxy_test.go
@@ -23,7 +23,6 @@
 	"v.io/v23/security"
 	"v.io/v23/verror"
 	"v.io/v23/vtrace"
-
 	"v.io/x/ref/lib/flags"
 	_ "v.io/x/ref/profiles"
 	"v.io/x/ref/profiles/internal/lib/publisher"
@@ -92,7 +91,7 @@
 
 type testServer struct{}
 
-func (*testServer) Echo(call rpc.ServerCall, arg string) (string, error) {
+func (*testServer) Echo(_ *context.T, call rpc.ServerCall, arg string) (string, error) {
 	return fmt.Sprintf("method:%q,suffix:%q,arg:%q", "Echo", call.Suffix(), arg), nil
 }
 
diff --git a/profiles/internal/rpc/test/retry_test.go b/profiles/internal/rpc/test/retry_test.go
index ad20630..d8d3ad4 100644
--- a/profiles/internal/rpc/test/retry_test.go
+++ b/profiles/internal/rpc/test/retry_test.go
@@ -20,7 +20,7 @@
 	called int // number of times TryAgain has been called
 }
 
-func (s *retryServer) TryAgain(call rpc.ServerCall) error {
+func (s *retryServer) TryAgain(ctx *context.T, _ rpc.ServerCall) error {
 	// If this is the second time this method is being called, return success.
 	if s.called > 0 {
 		s.called++
@@ -28,7 +28,7 @@
 	}
 	s.called++
 	// otherwise, return a verror with action code RetryBackoff.
-	return verror.New(errRetryThis, call.Context())
+	return verror.New(errRetryThis, ctx)
 }
 
 type allowEveryoneAuth struct{}
diff --git a/profiles/internal/rpc/test/signature_test.go b/profiles/internal/rpc/test/signature_test.go
index d653e01..2894418 100644
--- a/profiles/internal/rpc/test/signature_test.go
+++ b/profiles/internal/rpc/test/signature_test.go
@@ -16,7 +16,6 @@
 	"v.io/v23/rpc/reserved"
 	"v.io/v23/vdl"
 	"v.io/v23/vdlroot/signature"
-
 	_ "v.io/x/ref/profiles"
 	"v.io/x/ref/test"
 )
@@ -38,10 +37,10 @@
 
 type sigImpl struct{}
 
-func (sigImpl) NonStreaming0(rpc.ServerCall) error                       { panic("X") }
-func (sigImpl) NonStreaming1(_ rpc.ServerCall, _ string) (int64, error)  { panic("X") }
-func (sigImpl) Streaming0(_ *streamStringBool) error                     { panic("X") }
-func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error) { panic("X") }
+func (sigImpl) NonStreaming0(*context.T, rpc.ServerCall) error                   { panic("X") }
+func (sigImpl) NonStreaming1(*context.T, rpc.ServerCall, string) (int64, error)  { panic("X") }
+func (sigImpl) Streaming0(*context.T, *streamStringBool) error                   { panic("X") }
+func (sigImpl) Streaming1(*context.T, *streamStringBool, int64) (float64, error) { panic("X") }
 
 type streamStringBool struct{ rpc.StreamServerCall }
 
diff --git a/profiles/internal/rpc/test/simple_test.go b/profiles/internal/rpc/test/simple_test.go
index c83ec25..22c3da4 100644
--- a/profiles/internal/rpc/test/simple_test.go
+++ b/profiles/internal/rpc/test/simple_test.go
@@ -10,6 +10,7 @@
 	"time"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 )
 
@@ -17,7 +18,7 @@
 	done <-chan struct{}
 }
 
-func (s *simple) Sleep(call rpc.ServerCall) error {
+func (s *simple) Sleep(*context.T, rpc.ServerCall) error {
 	select {
 	case <-s.done:
 	case <-time.After(time.Hour):
@@ -25,15 +26,15 @@
 	return nil
 }
 
-func (s *simple) Ping(call rpc.ServerCall) (string, error) {
+func (s *simple) Ping(_ *context.T, _ rpc.ServerCall) (string, error) {
 	return "pong", nil
 }
 
-func (s *simple) Echo(call rpc.ServerCall, arg string) (string, error) {
+func (s *simple) Echo(_ *context.T, _ rpc.ServerCall, arg string) (string, error) {
 	return arg, nil
 }
 
-func (s *simple) Source(call rpc.StreamServerCall, start int) error {
+func (s *simple) Source(_ *context.T, call rpc.StreamServerCall, start int) error {
 	i := start
 	backoff := 25 * time.Millisecond
 	for {
@@ -48,7 +49,7 @@
 	}
 }
 
-func (s *simple) Sink(call rpc.StreamServerCall) (int, error) {
+func (s *simple) Sink(_ *context.T, call rpc.StreamServerCall) (int, error) {
 	i := 0
 	for {
 		if err := call.Recv(&i); err != nil {
@@ -60,7 +61,7 @@
 	}
 }
 
-func (s *simple) Inc(call rpc.StreamServerCall, inc int) (int, error) {
+func (s *simple) Inc(_ *context.T, call rpc.StreamServerCall, inc int) (int, error) {
 	i := 0
 	for {
 		if err := call.Recv(&i); err != nil {
diff --git a/profiles/internal/rpc/testutil_test.go b/profiles/internal/rpc/testutil_test.go
index b48f6c6..1e51fa4 100644
--- a/profiles/internal/rpc/testutil_test.go
+++ b/profiles/internal/rpc/testutil_test.go
@@ -103,9 +103,10 @@
 	m        string
 	ld, rd   security.Discharge
 	lep, rep naming.Endpoint
-	c        *context.T
 }
 
+var _ security.Call = (*mockCall)(nil)
+
 func (c *mockCall) Timestamp() (t time.Time) { return }
 func (c *mockCall) Method() string           { return c.m }
 func (c *mockCall) MethodTags() []*vdl.Value { return nil }
@@ -121,4 +122,3 @@
 func (c *mockCall) LocalPrincipal() security.Principal  { return c.p }
 func (c *mockCall) LocalBlessings() security.Blessings  { return c.l }
 func (c *mockCall) RemoteBlessings() security.Blessings { return c.r }
-func (c *mockCall) Context() *context.T                 { return c.c }
diff --git a/profiles/internal/rt/ipc_test.go b/profiles/internal/rt/ipc_test.go
index 759d81d..ab4e537 100644
--- a/profiles/internal/rt/ipc_test.go
+++ b/profiles/internal/rt/ipc_test.go
@@ -18,7 +18,6 @@
 	"v.io/v23/options"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
-
 	"v.io/v23/verror"
 	_ "v.io/x/ref/profiles"
 	"v.io/x/ref/profiles/internal/rpc/stream/vc"
@@ -30,12 +29,12 @@
 
 type testService struct{}
 
-func (testService) EchoBlessings(call rpc.ServerCall) ([]string, error) {
-	b, _ := security.RemoteBlessingNames(call.Context())
+func (testService) EchoBlessings(ctx *context.T, _ rpc.ServerCall) ([]string, error) {
+	b, _ := security.RemoteBlessingNames(ctx)
 	return b, nil
 }
 
-func (testService) Foo(rpc.ServerCall) error {
+func (testService) Foo(*context.T, rpc.ServerCall) error {
 	return nil
 }
 
@@ -251,12 +250,12 @@
 	mu     sync.Mutex
 }
 
-func (ds *dischargeService) Discharge(call rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
+func (ds *dischargeService) Discharge(ctx *context.T, _ rpc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	tp := cav.ThirdPartyDetails()
 	if tp == nil {
 		return security.Discharge{}, fmt.Errorf("discharger: not a third party caveat (%v)", cav)
 	}
-	if err := tp.Dischargeable(call.Context()); err != nil {
+	if err := tp.Dischargeable(ctx); err != nil {
 		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
 	}
 	// If its the first time being called, add an expiry caveat and a MethodCaveat for "EchoBlessings".
@@ -269,7 +268,7 @@
 		caveat = mkCaveat(security.ExpiryCaveat(time.Now().Add(-1 * time.Second)))
 	}
 
-	return security.GetCall(call.Context()).LocalPrincipal().MintDischarge(cav, caveat)
+	return security.GetCall(ctx).LocalPrincipal().MintDischarge(cav, caveat)
 }
 
 func TestServerDischarges(t *testing.T) {
diff --git a/profiles/internal/rt/mgmt_test.go b/profiles/internal/rt/mgmt_test.go
index de8bd0c..2462e75 100644
--- a/profiles/internal/rt/mgmt_test.go
+++ b/profiles/internal/rt/mgmt_test.go
@@ -270,7 +270,7 @@
 	ch chan<- string
 }
 
-func (c *configServer) Set(_ rpc.ServerCall, key, value string) error {
+func (c *configServer) Set(_ *context.T, _ rpc.ServerCall, key, value string) error {
 	if key != mgmt.AppCycleManagerConfigKey {
 		return fmt.Errorf("Unexpected key: %v", key)
 	}
diff --git a/profiles/internal/rt/runtime_test.go b/profiles/internal/rt/runtime_test.go
index dc4e23e..f7826ad 100644
--- a/profiles/internal/rt/runtime_test.go
+++ b/profiles/internal/rt/runtime_test.go
@@ -11,7 +11,6 @@
 	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/x/lib/vlog"
-
 	"v.io/x/ref/lib/flags"
 	"v.io/x/ref/profiles/internal/rt"
 	"v.io/x/ref/services/debug/debuglib"
diff --git a/profiles/internal/rt/shutdown_servers_test.go b/profiles/internal/rt/shutdown_servers_test.go
index c5df1ba..659cefc 100644
--- a/profiles/internal/rt/shutdown_servers_test.go
+++ b/profiles/internal/rt/shutdown_servers_test.go
@@ -13,12 +13,10 @@
 	"sync"
 	"syscall"
 
-	"v.io/x/lib/vlog"
-
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/rpc"
-
+	"v.io/x/lib/vlog"
 	"v.io/x/ref/lib/signals"
 	_ "v.io/x/ref/profiles"
 	"v.io/x/ref/test"
@@ -32,7 +30,7 @@
 
 type dummy struct{}
 
-func (*dummy) Echo(rpc.ServerCall) error { return nil }
+func (*dummy) Echo(*context.T, rpc.ServerCall) error { return nil }
 
 // makeServer sets up a simple dummy server.
 func makeServer(ctx *context.T) rpc.Server {
diff --git a/profiles/internal/rt/shutdown_test.go b/profiles/internal/rt/shutdown_test.go
index 34a77f2..85798b3 100644
--- a/profiles/internal/rt/shutdown_test.go
+++ b/profiles/internal/rt/shutdown_test.go
@@ -12,7 +12,6 @@
 	"testing"
 
 	"v.io/v23"
-
 	"v.io/x/ref/lib/signals"
 	"v.io/x/ref/test/modules"
 )
diff --git a/profiles/internal/vtrace/vtrace_test.go b/profiles/internal/vtrace/vtrace_test.go
index fc9873b..5bf17e5 100644
--- a/profiles/internal/vtrace/vtrace_test.go
+++ b/profiles/internal/vtrace/vtrace_test.go
@@ -87,8 +87,7 @@
 	forceCollect bool
 }
 
-func (c *testServer) Run(call rpc.ServerCall) error {
-	ctx := call.Context()
+func (c *testServer) Run(ctx *context.T, call rpc.ServerCall) error {
 	if c.forceCollect {
 		vtrace.ForceCollect(ctx)
 	}
diff --git a/services/agent/internal/pingpong/main.go b/services/agent/internal/pingpong/main.go
index e5c8744..6aa9933 100644
--- a/services/agent/internal/pingpong/main.go
+++ b/services/agent/internal/pingpong/main.go
@@ -20,9 +20,9 @@
 
 type pongd struct{}
 
-func (f *pongd) Ping(call rpc.ServerCall, message string) (result string, err error) {
-	client, _ := security.RemoteBlessingNames(call.Context())
-	server := security.LocalBlessingNames(call.Context())
+func (f *pongd) Ping(ctx *context.T, _ rpc.ServerCall, message string) (result string, err error) {
+	client, _ := security.RemoteBlessingNames(ctx)
+	server := security.LocalBlessingNames(ctx)
 	return fmt.Sprintf("pong (client:%v server:%v)", client, server), nil
 }
 
diff --git a/services/agent/internal/pingpong/wire.vdl.go b/services/agent/internal/pingpong/wire.vdl.go
index 9ae0341..f90156b 100644
--- a/services/agent/internal/pingpong/wire.vdl.go
+++ b/services/agent/internal/pingpong/wire.vdl.go
@@ -47,7 +47,7 @@
 //
 // Simple service used in the agent tests.
 type PingPongServerMethods interface {
-	Ping(call rpc.ServerCall, message string) (string, error)
+	Ping(ctx *context.T, call rpc.ServerCall, message string) (string, error)
 }
 
 // PingPongServerStubMethods is the server interface containing
@@ -85,8 +85,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implPingPongServerStub) Ping(call rpc.ServerCall, i0 string) (string, error) {
-	return s.impl.Ping(call, i0)
+func (s implPingPongServerStub) Ping(ctx *context.T, call rpc.ServerCall, i0 string) (string, error) {
+	return s.impl.Ping(ctx, call, i0)
 }
 
 func (s implPingPongServerStub) Globber() *rpc.GlobState {
diff --git a/services/agent/internal/server/server.go b/services/agent/internal/server/server.go
index 46b5e0b..d6b4b7a 100644
--- a/services/agent/internal/server/server.go
+++ b/services/agent/internal/server/server.go
@@ -275,7 +275,7 @@
 	return nil
 }
 
-func (a agentd) Bless(_ rpc.ServerCall, key []byte, with security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error) {
+func (a agentd) Bless(_ *context.T, _ rpc.ServerCall, key []byte, with security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error) {
 	pkey, err := security.UnmarshalPublicKey(key)
 	if err != nil {
 		return security.Blessings{}, err
@@ -283,15 +283,15 @@
 	return a.principal.Bless(pkey, with, extension, caveat, additionalCaveats...)
 }
 
-func (a agentd) BlessSelf(_ rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error) {
+func (a agentd) BlessSelf(_ *context.T, _ rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error) {
 	return a.principal.BlessSelf(name, caveats...)
 }
 
-func (a agentd) Sign(_ rpc.ServerCall, message []byte) (security.Signature, error) {
+func (a agentd) Sign(_ *context.T, _ rpc.ServerCall, message []byte) (security.Signature, error) {
 	return a.principal.Sign(message)
 }
 
-func (a agentd) MintDischarge(_ rpc.ServerCall, forCaveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error) {
+func (a agentd) MintDischarge(_ *context.T, _ rpc.ServerCall, forCaveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error) {
 	return a.principal.MintDischarge(forCaveat, caveatOnDischarge, additionalCaveatsOnDischarge...)
 }
 
@@ -346,65 +346,65 @@
 	return sha512.Sum512(slice), nil
 }
 
-func (a agentd) PublicKey(_ rpc.ServerCall) ([]byte, error) {
+func (a agentd) PublicKey(_ *context.T, _ rpc.ServerCall) ([]byte, error) {
 	return a.principal.PublicKey().MarshalBinary()
 }
 
-func (a agentd) BlessingsByName(_ rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error) {
+func (a agentd) BlessingsByName(_ *context.T, _ rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingsByName(name), nil
 }
 
-func (a agentd) BlessingsInfo(_ rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error) {
+func (a agentd) BlessingsInfo(_ *context.T, _ rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingsInfo(blessings), nil
 }
 
-func (a agentd) AddToRoots(_ rpc.ServerCall, blessings security.Blessings) error {
+func (a agentd) AddToRoots(_ *context.T, _ rpc.ServerCall, blessings security.Blessings) error {
 	a.w.lock()
 	defer a.w.unlock(a.id)
 	return a.principal.AddToRoots(blessings)
 }
 
-func (a agentd) BlessingStoreSet(_ rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error) {
+func (a agentd) BlessingStoreSet(_ *context.T, _ rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error) {
 	a.w.lock()
 	defer a.w.unlock(a.id)
 	return a.principal.BlessingStore().Set(blessings, forPeers)
 }
 
-func (a agentd) BlessingStoreForPeer(_ rpc.ServerCall, peerBlessings []string) (security.Blessings, error) {
+func (a agentd) BlessingStoreForPeer(_ *context.T, _ rpc.ServerCall, peerBlessings []string) (security.Blessings, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingStore().ForPeer(peerBlessings...), nil
 }
 
-func (a agentd) BlessingStoreSetDefault(_ rpc.ServerCall, blessings security.Blessings) error {
+func (a agentd) BlessingStoreSetDefault(_ *context.T, _ rpc.ServerCall, blessings security.Blessings) error {
 	a.w.lock()
 	defer a.w.unlock(a.id)
 	return a.principal.BlessingStore().SetDefault(blessings)
 }
 
-func (a agentd) BlessingStorePeerBlessings(_ rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error) {
+func (a agentd) BlessingStorePeerBlessings(_ *context.T, _ rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingStore().PeerBlessings(), nil
 }
 
-func (a agentd) BlessingStoreDebugString(_ rpc.ServerCall) (string, error) {
+func (a agentd) BlessingStoreDebugString(_ *context.T, _ rpc.ServerCall) (string, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingStore().DebugString(), nil
 }
 
-func (a agentd) BlessingStoreDefault(_ rpc.ServerCall) (security.Blessings, error) {
+func (a agentd) BlessingStoreDefault(_ *context.T, _ rpc.ServerCall) (security.Blessings, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.BlessingStore().Default(), nil
 }
 
-func (a agentd) BlessingRootsAdd(_ rpc.ServerCall, root []byte, pattern security.BlessingPattern) error {
+func (a agentd) BlessingRootsAdd(_ *context.T, _ rpc.ServerCall, root []byte, pattern security.BlessingPattern) error {
 	pkey, err := security.UnmarshalPublicKey(root)
 	if err != nil {
 		return err
@@ -414,7 +414,7 @@
 	return a.principal.Roots().Add(pkey, pattern)
 }
 
-func (a agentd) BlessingRootsRecognized(_ rpc.ServerCall, root []byte, blessing string) error {
+func (a agentd) BlessingRootsRecognized(_ *context.T, _ rpc.ServerCall, root []byte, blessing string) error {
 	pkey, err := security.UnmarshalPublicKey(root)
 	if err != nil {
 		return err
@@ -424,20 +424,20 @@
 	return a.principal.Roots().Recognized(pkey, blessing)
 }
 
-func (a agentd) BlessingRootsDebugString(_ rpc.ServerCall) (string, error) {
+func (a agentd) BlessingRootsDebugString(_ *context.T, _ rpc.ServerCall) (string, error) {
 	a.w.rlock()
 	defer a.w.runlock()
 	return a.principal.Roots().DebugString(), nil
 }
 
-func (a agentd) NotifyWhenChanged(call agent.AgentNotifyWhenChangedServerCall) error {
+func (a agentd) NotifyWhenChanged(ctx *context.T, call agent.AgentNotifyWhenChangedServerCall) error {
 	ch := a.w.register(a.id)
 	defer a.w.unregister(a.id, ch)
 	for {
 		select {
 		case <-a.ctx.Done():
 			return nil
-		case <-call.Context().Done():
+		case <-ctx.Done():
 			return nil
 		case _, ok := <-ch:
 			if !ok {
diff --git a/services/agent/wire.vdl.go b/services/agent/wire.vdl.go
index f01c204..6b29ef1 100644
--- a/services/agent/wire.vdl.go
+++ b/services/agent/wire.vdl.go
@@ -253,28 +253,28 @@
 // AgentServerMethods is the interface a server writer
 // implements for Agent.
 type AgentServerMethods interface {
-	Bless(call rpc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
-	BlessSelf(call rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
-	Sign(call rpc.ServerCall, message []byte) (security.Signature, error)
-	MintDischarge(call rpc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
-	PublicKey(rpc.ServerCall) ([]byte, error)
-	BlessingsByName(call rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
-	BlessingsInfo(call rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
-	AddToRoots(call rpc.ServerCall, blessing security.Blessings) error
-	BlessingStoreSet(call rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error)
-	BlessingStoreForPeer(call rpc.ServerCall, peerBlessings []string) (security.Blessings, error)
-	BlessingStoreSetDefault(call rpc.ServerCall, blessings security.Blessings) error
-	BlessingStoreDefault(rpc.ServerCall) (security.Blessings, error)
-	BlessingStorePeerBlessings(rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error)
-	BlessingStoreDebugString(rpc.ServerCall) (string, error)
-	BlessingRootsAdd(call rpc.ServerCall, root []byte, pattern security.BlessingPattern) error
-	BlessingRootsRecognized(call rpc.ServerCall, root []byte, blessing string) error
-	BlessingRootsDebugString(rpc.ServerCall) (string, error)
+	Bless(ctx *context.T, call rpc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
+	BlessSelf(ctx *context.T, call rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
+	Sign(ctx *context.T, call rpc.ServerCall, message []byte) (security.Signature, error)
+	MintDischarge(ctx *context.T, call rpc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
+	PublicKey(*context.T, rpc.ServerCall) ([]byte, error)
+	BlessingsByName(ctx *context.T, call rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
+	BlessingsInfo(ctx *context.T, call rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
+	AddToRoots(ctx *context.T, call rpc.ServerCall, blessing security.Blessings) error
+	BlessingStoreSet(ctx *context.T, call rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error)
+	BlessingStoreForPeer(ctx *context.T, call rpc.ServerCall, peerBlessings []string) (security.Blessings, error)
+	BlessingStoreSetDefault(ctx *context.T, call rpc.ServerCall, blessings security.Blessings) error
+	BlessingStoreDefault(*context.T, rpc.ServerCall) (security.Blessings, error)
+	BlessingStorePeerBlessings(*context.T, rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error)
+	BlessingStoreDebugString(*context.T, rpc.ServerCall) (string, error)
+	BlessingRootsAdd(ctx *context.T, call rpc.ServerCall, root []byte, pattern security.BlessingPattern) error
+	BlessingRootsRecognized(ctx *context.T, call rpc.ServerCall, root []byte, blessing string) error
+	BlessingRootsDebugString(*context.T, rpc.ServerCall) (string, error)
 	// Clients using caching should call NotifyWhenChanged upon connecting to
 	// the server. The server will stream back values whenever the client should
 	// flush the cache. The streamed value is arbitrary, simply flush whenever
 	// recieving a new item.
-	NotifyWhenChanged(AgentNotifyWhenChangedServerCall) error
+	NotifyWhenChanged(*context.T, AgentNotifyWhenChangedServerCall) error
 }
 
 // AgentServerStubMethods is the server interface containing
@@ -282,28 +282,28 @@
 // The only difference between this interface and AgentServerMethods
 // is the streaming methods.
 type AgentServerStubMethods interface {
-	Bless(call rpc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
-	BlessSelf(call rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
-	Sign(call rpc.ServerCall, message []byte) (security.Signature, error)
-	MintDischarge(call rpc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
-	PublicKey(rpc.ServerCall) ([]byte, error)
-	BlessingsByName(call rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
-	BlessingsInfo(call rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
-	AddToRoots(call rpc.ServerCall, blessing security.Blessings) error
-	BlessingStoreSet(call rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error)
-	BlessingStoreForPeer(call rpc.ServerCall, peerBlessings []string) (security.Blessings, error)
-	BlessingStoreSetDefault(call rpc.ServerCall, blessings security.Blessings) error
-	BlessingStoreDefault(rpc.ServerCall) (security.Blessings, error)
-	BlessingStorePeerBlessings(rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error)
-	BlessingStoreDebugString(rpc.ServerCall) (string, error)
-	BlessingRootsAdd(call rpc.ServerCall, root []byte, pattern security.BlessingPattern) error
-	BlessingRootsRecognized(call rpc.ServerCall, root []byte, blessing string) error
-	BlessingRootsDebugString(rpc.ServerCall) (string, error)
+	Bless(ctx *context.T, call rpc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
+	BlessSelf(ctx *context.T, call rpc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
+	Sign(ctx *context.T, call rpc.ServerCall, message []byte) (security.Signature, error)
+	MintDischarge(ctx *context.T, call rpc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
+	PublicKey(*context.T, rpc.ServerCall) ([]byte, error)
+	BlessingsByName(ctx *context.T, call rpc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
+	BlessingsInfo(ctx *context.T, call rpc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
+	AddToRoots(ctx *context.T, call rpc.ServerCall, blessing security.Blessings) error
+	BlessingStoreSet(ctx *context.T, call rpc.ServerCall, blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error)
+	BlessingStoreForPeer(ctx *context.T, call rpc.ServerCall, peerBlessings []string) (security.Blessings, error)
+	BlessingStoreSetDefault(ctx *context.T, call rpc.ServerCall, blessings security.Blessings) error
+	BlessingStoreDefault(*context.T, rpc.ServerCall) (security.Blessings, error)
+	BlessingStorePeerBlessings(*context.T, rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error)
+	BlessingStoreDebugString(*context.T, rpc.ServerCall) (string, error)
+	BlessingRootsAdd(ctx *context.T, call rpc.ServerCall, root []byte, pattern security.BlessingPattern) error
+	BlessingRootsRecognized(ctx *context.T, call rpc.ServerCall, root []byte, blessing string) error
+	BlessingRootsDebugString(*context.T, rpc.ServerCall) (string, error)
 	// Clients using caching should call NotifyWhenChanged upon connecting to
 	// the server. The server will stream back values whenever the client should
 	// flush the cache. The streamed value is arbitrary, simply flush whenever
 	// recieving a new item.
-	NotifyWhenChanged(*AgentNotifyWhenChangedServerCallStub) error
+	NotifyWhenChanged(*context.T, *AgentNotifyWhenChangedServerCallStub) error
 }
 
 // AgentServerStub adds universal methods to AgentServerStubMethods.
@@ -335,76 +335,76 @@
 	gs   *rpc.GlobState
 }
 
-func (s implAgentServerStub) Bless(call rpc.ServerCall, i0 []byte, i1 security.Blessings, i2 string, i3 security.Caveat, i4 []security.Caveat) (security.Blessings, error) {
-	return s.impl.Bless(call, i0, i1, i2, i3, i4)
+func (s implAgentServerStub) Bless(ctx *context.T, call rpc.ServerCall, i0 []byte, i1 security.Blessings, i2 string, i3 security.Caveat, i4 []security.Caveat) (security.Blessings, error) {
+	return s.impl.Bless(ctx, call, i0, i1, i2, i3, i4)
 }
 
-func (s implAgentServerStub) BlessSelf(call rpc.ServerCall, i0 string, i1 []security.Caveat) (security.Blessings, error) {
-	return s.impl.BlessSelf(call, i0, i1)
+func (s implAgentServerStub) BlessSelf(ctx *context.T, call rpc.ServerCall, i0 string, i1 []security.Caveat) (security.Blessings, error) {
+	return s.impl.BlessSelf(ctx, call, i0, i1)
 }
 
-func (s implAgentServerStub) Sign(call rpc.ServerCall, i0 []byte) (security.Signature, error) {
-	return s.impl.Sign(call, i0)
+func (s implAgentServerStub) Sign(ctx *context.T, call rpc.ServerCall, i0 []byte) (security.Signature, error) {
+	return s.impl.Sign(ctx, call, i0)
 }
 
-func (s implAgentServerStub) MintDischarge(call rpc.ServerCall, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat) (security.Discharge, error) {
-	return s.impl.MintDischarge(call, i0, i1, i2)
+func (s implAgentServerStub) MintDischarge(ctx *context.T, call rpc.ServerCall, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat) (security.Discharge, error) {
+	return s.impl.MintDischarge(ctx, call, i0, i1, i2)
 }
 
-func (s implAgentServerStub) PublicKey(call rpc.ServerCall) ([]byte, error) {
-	return s.impl.PublicKey(call)
+func (s implAgentServerStub) PublicKey(ctx *context.T, call rpc.ServerCall) ([]byte, error) {
+	return s.impl.PublicKey(ctx, call)
 }
 
-func (s implAgentServerStub) BlessingsByName(call rpc.ServerCall, i0 security.BlessingPattern) ([]security.Blessings, error) {
-	return s.impl.BlessingsByName(call, i0)
+func (s implAgentServerStub) BlessingsByName(ctx *context.T, call rpc.ServerCall, i0 security.BlessingPattern) ([]security.Blessings, error) {
+	return s.impl.BlessingsByName(ctx, call, i0)
 }
 
-func (s implAgentServerStub) BlessingsInfo(call rpc.ServerCall, i0 security.Blessings) (map[string][]security.Caveat, error) {
-	return s.impl.BlessingsInfo(call, i0)
+func (s implAgentServerStub) BlessingsInfo(ctx *context.T, call rpc.ServerCall, i0 security.Blessings) (map[string][]security.Caveat, error) {
+	return s.impl.BlessingsInfo(ctx, call, i0)
 }
 
-func (s implAgentServerStub) AddToRoots(call rpc.ServerCall, i0 security.Blessings) error {
-	return s.impl.AddToRoots(call, i0)
+func (s implAgentServerStub) AddToRoots(ctx *context.T, call rpc.ServerCall, i0 security.Blessings) error {
+	return s.impl.AddToRoots(ctx, call, i0)
 }
 
-func (s implAgentServerStub) BlessingStoreSet(call rpc.ServerCall, i0 security.Blessings, i1 security.BlessingPattern) (security.Blessings, error) {
-	return s.impl.BlessingStoreSet(call, i0, i1)
+func (s implAgentServerStub) BlessingStoreSet(ctx *context.T, call rpc.ServerCall, i0 security.Blessings, i1 security.BlessingPattern) (security.Blessings, error) {
+	return s.impl.BlessingStoreSet(ctx, call, i0, i1)
 }
 
-func (s implAgentServerStub) BlessingStoreForPeer(call rpc.ServerCall, i0 []string) (security.Blessings, error) {
-	return s.impl.BlessingStoreForPeer(call, i0)
+func (s implAgentServerStub) BlessingStoreForPeer(ctx *context.T, call rpc.ServerCall, i0 []string) (security.Blessings, error) {
+	return s.impl.BlessingStoreForPeer(ctx, call, i0)
 }
 
-func (s implAgentServerStub) BlessingStoreSetDefault(call rpc.ServerCall, i0 security.Blessings) error {
-	return s.impl.BlessingStoreSetDefault(call, i0)
+func (s implAgentServerStub) BlessingStoreSetDefault(ctx *context.T, call rpc.ServerCall, i0 security.Blessings) error {
+	return s.impl.BlessingStoreSetDefault(ctx, call, i0)
 }
 
-func (s implAgentServerStub) BlessingStoreDefault(call rpc.ServerCall) (security.Blessings, error) {
-	return s.impl.BlessingStoreDefault(call)
+func (s implAgentServerStub) BlessingStoreDefault(ctx *context.T, call rpc.ServerCall) (security.Blessings, error) {
+	return s.impl.BlessingStoreDefault(ctx, call)
 }
 
-func (s implAgentServerStub) BlessingStorePeerBlessings(call rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error) {
-	return s.impl.BlessingStorePeerBlessings(call)
+func (s implAgentServerStub) BlessingStorePeerBlessings(ctx *context.T, call rpc.ServerCall) (map[security.BlessingPattern]security.Blessings, error) {
+	return s.impl.BlessingStorePeerBlessings(ctx, call)
 }
 
-func (s implAgentServerStub) BlessingStoreDebugString(call rpc.ServerCall) (string, error) {
-	return s.impl.BlessingStoreDebugString(call)
+func (s implAgentServerStub) BlessingStoreDebugString(ctx *context.T, call rpc.ServerCall) (string, error) {
+	return s.impl.BlessingStoreDebugString(ctx, call)
 }
 
-func (s implAgentServerStub) BlessingRootsAdd(call rpc.ServerCall, i0 []byte, i1 security.BlessingPattern) error {
-	return s.impl.BlessingRootsAdd(call, i0, i1)
+func (s implAgentServerStub) BlessingRootsAdd(ctx *context.T, call rpc.ServerCall, i0 []byte, i1 security.BlessingPattern) error {
+	return s.impl.BlessingRootsAdd(ctx, call, i0, i1)
 }
 
-func (s implAgentServerStub) BlessingRootsRecognized(call rpc.ServerCall, i0 []byte, i1 string) error {
-	return s.impl.BlessingRootsRecognized(call, i0, i1)
+func (s implAgentServerStub) BlessingRootsRecognized(ctx *context.T, call rpc.ServerCall, i0 []byte, i1 string) error {
+	return s.impl.BlessingRootsRecognized(ctx, call, i0, i1)
 }
 
-func (s implAgentServerStub) BlessingRootsDebugString(call rpc.ServerCall) (string, error) {
-	return s.impl.BlessingRootsDebugString(call)
+func (s implAgentServerStub) BlessingRootsDebugString(ctx *context.T, call rpc.ServerCall) (string, error) {
+	return s.impl.BlessingRootsDebugString(ctx, call)
 }
 
-func (s implAgentServerStub) NotifyWhenChanged(call *AgentNotifyWhenChangedServerCallStub) error {
-	return s.impl.NotifyWhenChanged(call)
+func (s implAgentServerStub) NotifyWhenChanged(ctx *context.T, call *AgentNotifyWhenChangedServerCallStub) error {
+	return s.impl.NotifyWhenChanged(ctx, call)
 }
 
 func (s implAgentServerStub) Globber() *rpc.GlobState {
diff --git a/services/application/application/impl_test.go b/services/application/application/impl_test.go
index 5a3749b..6eeb077 100644
--- a/services/application/application/impl_test.go
+++ b/services/application/application/impl_test.go
@@ -79,27 +79,27 @@
 	suffix string
 }
 
-func (s *server) Match(_ rpc.ServerCall, profiles []string) (application.Envelope, error) {
+func (s *server) Match(_ *context.T, _ rpc.ServerCall, profiles []string) (application.Envelope, error) {
 	vlog.VI(2).Infof("%v.Match(%v) was called", s.suffix, profiles)
 	return envelope, nil
 }
 
-func (s *server) Put(_ rpc.ServerCall, profiles []string, env application.Envelope) error {
+func (s *server) Put(_ *context.T, _ rpc.ServerCall, profiles []string, env application.Envelope) error {
 	vlog.VI(2).Infof("%v.Put(%v, %v) was called", s.suffix, profiles, env)
 	return nil
 }
 
-func (s *server) Remove(_ rpc.ServerCall, profile string) error {
+func (s *server) Remove(_ *context.T, _ rpc.ServerCall, profile string) error {
 	vlog.VI(2).Infof("%v.Remove(%v) was called", s.suffix, profile)
 	return nil
 }
 
-func (s *server) SetPermissions(_ rpc.ServerCall, acl access.Permissions, version string) error {
+func (s *server) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	vlog.VI(2).Infof("%v.SetPermissions(%v, %v) was called", acl, version)
 	return nil
 }
 
-func (s *server) GetPermissions(rpc.ServerCall) (access.Permissions, string, error) {
+func (s *server) GetPermissions(*context.T, rpc.ServerCall) (access.Permissions, string, error) {
 	vlog.VI(2).Infof("%v.GetPermissions() was called")
 	return nil, "", nil
 }
diff --git a/services/application/applicationd/service.go b/services/application/applicationd/service.go
index 3a0938b..177754c 100644
--- a/services/application/applicationd/service.go
+++ b/services/application/applicationd/service.go
@@ -59,15 +59,15 @@
 	}
 }
 
-func (i *appRepoService) Match(call rpc.ServerCall, profiles []string) (application.Envelope, error) {
+func (i *appRepoService) Match(ctx *context.T, call rpc.ServerCall, profiles []string) (application.Envelope, error) {
 	vlog.VI(0).Infof("%v.Match(%v)", i.suffix, profiles)
 	empty := application.Envelope{}
-	name, version, err := parse(call.Context(), i.suffix)
+	name, version, err := parse(ctx, i.suffix)
 	if err != nil {
 		return empty, err
 	}
 	if version == "" {
-		return empty, verror.New(ErrInvalidSuffix, call.Context())
+		return empty, verror.New(ErrInvalidSuffix, ctx)
 	}
 
 	i.store.Lock()
@@ -85,17 +85,17 @@
 		}
 		return envelope, nil
 	}
-	return empty, verror.New(verror.ErrNoExist, call.Context())
+	return empty, verror.New(verror.ErrNoExist, ctx)
 }
 
-func (i *appRepoService) Put(call rpc.ServerCall, profiles []string, envelope application.Envelope) error {
+func (i *appRepoService) Put(ctx *context.T, call rpc.ServerCall, profiles []string, envelope application.Envelope) error {
 	vlog.VI(0).Infof("%v.Put(%v, %v)", i.suffix, profiles, envelope)
-	name, version, err := parse(call.Context(), i.suffix)
+	name, version, err := parse(ctx, i.suffix)
 	if err != nil {
 		return err
 	}
 	if version == "" {
-		return verror.New(ErrInvalidSuffix, call.Context())
+		return verror.New(ErrInvalidSuffix, ctx)
 	}
 	i.store.Lock()
 	defer i.store.Unlock()
@@ -110,10 +110,10 @@
 	apath := naming.Join("/acls", name, "data")
 	aobj := i.store.BindObject(apath)
 	if _, err := aobj.Get(call); verror.ErrorID(err) == fs.ErrNotInMemStore.ID {
-		rb, _ := security.RemoteBlessingNames(call.Context())
+		rb, _ := security.RemoteBlessingNames(ctx)
 		if len(rb) == 0 {
 			// None of the client's blessings are valid.
-			return verror.New(ErrNotAuthorized, call.Context())
+			return verror.New(ErrNotAuthorized, ctx)
 		}
 		newacls := acls.PermissionsForBlessings(rb)
 		if _, err := aobj.Put(nil, newacls); err != nil {
@@ -127,18 +127,18 @@
 		object := i.store.BindObject(path)
 		_, err := object.Put(call, envelope)
 		if err != nil {
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 	}
 	if err := i.store.BindTransaction(tname).Commit(call); err != nil {
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	return nil
 }
 
-func (i *appRepoService) Remove(call rpc.ServerCall, profile string) error {
+func (i *appRepoService) Remove(ctx *context.T, call rpc.ServerCall, profile string) error {
 	vlog.VI(0).Infof("%v.Remove(%v)", i.suffix, profile)
-	name, version, err := parse(call.Context(), i.suffix)
+	name, version, err := parse(ctx, i.suffix)
 	if err != nil {
 		return err
 	}
@@ -156,16 +156,16 @@
 	object := i.store.BindObject(path)
 	found, err := object.Exists(call)
 	if err != nil {
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	if !found {
-		return verror.New(verror.ErrNoExist, call.Context())
+		return verror.New(verror.ErrNoExist, ctx)
 	}
 	if err := object.Remove(call); err != nil {
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	if err := i.store.BindTransaction(tname).Commit(call); err != nil {
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	return nil
 }
@@ -202,7 +202,7 @@
 	return versions, nil
 }
 
-func (i *appRepoService) GlobChildren__(rpc.ServerCall) (<-chan string, error) {
+func (i *appRepoService) GlobChildren__(*context.T, rpc.ServerCall) (<-chan string, error) {
 	vlog.VI(0).Infof("%v.GlobChildren__()", i.suffix)
 	i.store.Lock()
 	defer i.store.Unlock()
@@ -248,8 +248,8 @@
 	return ch, nil
 }
 
-func (i *appRepoService) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
-	name, _, err := parse(call.Context(), i.suffix)
+func (i *appRepoService) GetPermissions(ctx *context.T, call rpc.ServerCall) (acl access.Permissions, version string, err error) {
+	name, _, err := parse(ctx, i.suffix)
 	if err != nil {
 		return nil, "", err
 	}
@@ -259,14 +259,14 @@
 
 	acl, version, err = getAccessList(i.store, path)
 	if verror.ErrorID(err) == verror.ErrNoExist.ID {
-		return acls.NilAuthPermissions(call), "", nil
+		return acls.NilAuthPermissions(ctx), "", nil
 	}
 
 	return acl, version, err
 }
 
-func (i *appRepoService) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
-	name, _, err := parse(call.Context(), i.suffix)
+func (i *appRepoService) SetPermissions(ctx *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
+	name, _, err := parse(ctx, i.suffix)
 	if err != nil {
 		return err
 	}
diff --git a/services/binary/binary/impl_test.go b/services/binary/binary/impl_test.go
index f833c02..a97dcb7 100644
--- a/services/binary/binary/impl_test.go
+++ b/services/binary/binary/impl_test.go
@@ -35,12 +35,12 @@
 	suffix string
 }
 
-func (s *server) Create(rpc.ServerCall, int32, repository.MediaInfo) error {
+func (s *server) Create(*context.T, rpc.ServerCall, int32, repository.MediaInfo) error {
 	vlog.Infof("Create() was called. suffix=%v", s.suffix)
 	return nil
 }
 
-func (s *server) Delete(rpc.ServerCall) error {
+func (s *server) Delete(*context.T, rpc.ServerCall) error {
 	vlog.Infof("Delete() was called. suffix=%v", s.suffix)
 	if s.suffix != "exists" {
 		return fmt.Errorf("binary doesn't exist: %v", s.suffix)
@@ -48,7 +48,7 @@
 	return nil
 }
 
-func (s *server) Download(call repository.BinaryDownloadServerCall, _ int32) error {
+func (s *server) Download(_ *context.T, call repository.BinaryDownloadServerCall, _ int32) error {
 	vlog.Infof("Download() was called. suffix=%v", s.suffix)
 	sender := call.SendStream()
 	sender.Send([]byte("Hello"))
@@ -56,7 +56,7 @@
 	return nil
 }
 
-func (s *server) DownloadUrl(rpc.ServerCall) (string, int64, error) {
+func (s *server) DownloadUrl(*context.T, rpc.ServerCall) (string, int64, error) {
 	vlog.Infof("DownloadUrl() was called. suffix=%v", s.suffix)
 	if s.suffix != "" {
 		return "", 0, fmt.Errorf("non-empty suffix: %v", s.suffix)
@@ -64,7 +64,7 @@
 	return "test-download-url", 0, nil
 }
 
-func (s *server) Stat(rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
+func (s *server) Stat(*context.T, rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
 	vlog.Infof("Stat() was called. suffix=%v", s.suffix)
 	h := md5.New()
 	text := "HelloWorld"
@@ -73,7 +73,7 @@
 	return []binary.PartInfo{part}, repository.MediaInfo{Type: "text/plain"}, nil
 }
 
-func (s *server) Upload(call repository.BinaryUploadServerCall, _ int32) error {
+func (s *server) Upload(_ *context.T, call repository.BinaryUploadServerCall, _ int32) error {
 	vlog.Infof("Upload() was called. suffix=%v", s.suffix)
 	rStream := call.RecvStream()
 	for rStream.Advance() {
@@ -81,11 +81,11 @@
 	return nil
 }
 
-func (s *server) GetPermissions(rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (s *server) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", nil
 }
 
-func (s *server) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
+func (s *server) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return nil
 }
 
diff --git a/services/build/build/impl_test.go b/services/build/build/impl_test.go
index 520c116..a4a71ca 100644
--- a/services/build/build/impl_test.go
+++ b/services/build/build/impl_test.go
@@ -26,19 +26,19 @@
 
 type mock struct{}
 
-func (mock) Build(call build.BuilderBuildServerCall, arch build.Architecture, opsys build.OperatingSystem) ([]byte, error) {
+func (mock) Build(ctx *context.T, call build.BuilderBuildServerCall, arch build.Architecture, opsys build.OperatingSystem) ([]byte, error) {
 	vlog.VI(2).Infof("Build(%v, %v) was called", arch, opsys)
 	iterator := call.RecvStream()
 	for iterator.Advance() {
 	}
 	if err := iterator.Err(); err != nil {
 		vlog.Errorf("Advance() failed: %v", err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	return nil, nil
 }
 
-func (mock) Describe(_ rpc.ServerCall, name string) (binary.Description, error) {
+func (mock) Describe(_ *context.T, _ rpc.ServerCall, name string) (binary.Description, error) {
 	vlog.VI(2).Infof("Describe(%v) was called", name)
 	return binary.Description{}, nil
 }
diff --git a/services/build/buildd/service.go b/services/build/buildd/service.go
index b28dbc8..5e59a13 100644
--- a/services/build/buildd/service.go
+++ b/services/build/buildd/service.go
@@ -14,6 +14,7 @@
 	"runtime"
 	"strings"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/services/binary"
 	"v.io/v23/services/build"
@@ -48,20 +49,20 @@
 //
 // TODO(jsimsa): Analyze the binary files for shared library
 // dependencies and ship these back.
-func (i *builderService) Build(call build.BuilderBuildServerCall, arch build.Architecture, opsys build.OperatingSystem) ([]byte, error) {
+func (i *builderService) Build(ctx *context.T, call build.BuilderBuildServerCall, arch build.Architecture, opsys build.OperatingSystem) ([]byte, error) {
 	vlog.VI(1).Infof("Build(%v, %v) called.", arch, opsys)
 	dir, prefix := "", ""
 	dirPerm, filePerm := os.FileMode(0700), os.FileMode(0600)
 	root, err := ioutil.TempDir(dir, prefix)
 	if err != nil {
 		vlog.Errorf("TempDir(%v, %v) failed: %v", dir, prefix, err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	defer os.RemoveAll(root)
 	srcDir := filepath.Join(root, "go", "src")
 	if err := os.MkdirAll(srcDir, dirPerm); err != nil {
 		vlog.Errorf("MkdirAll(%v, %v) failed: %v", srcDir, dirPerm, err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	iterator := call.RecvStream()
 	for iterator.Advance() {
@@ -70,16 +71,16 @@
 		dir := filepath.Dir(filePath)
 		if err := os.MkdirAll(dir, dirPerm); err != nil {
 			vlog.Errorf("MkdirAll(%v, %v) failed: %v", dir, dirPerm, err)
-			return nil, verror.New(verror.ErrInternal, call.Context())
+			return nil, verror.New(verror.ErrInternal, ctx)
 		}
 		if err := ioutil.WriteFile(filePath, srcFile.Contents, filePerm); err != nil {
 			vlog.Errorf("WriteFile(%v, %v) failed: %v", filePath, filePerm, err)
-			return nil, verror.New(verror.ErrInternal, call.Context())
+			return nil, verror.New(verror.ErrInternal, ctx)
 		}
 	}
 	if err := iterator.Err(); err != nil {
 		vlog.Errorf("Advance() failed: %v", err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	// NOTE: we actually want run "go install -v {srcDir}/..." here, but
 	// the go tool seems to have a bug where it doesn't interpret rooted
@@ -101,13 +102,13 @@
 		if output.Len() != 0 {
 			vlog.Errorf("%v", output.String())
 		}
-		return output.Bytes(), verror.New(errBuildFailed, call.Context())
+		return output.Bytes(), verror.New(errBuildFailed, ctx)
 	}
 	binDir := filepath.Join(root, "go", "bin")
 	machineArch, err := host.Arch()
 	if err != nil {
 		vlog.Errorf("Arch() failed: %v", err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	if machineArch != arch.ToGoArch() || runtime.GOOS != opsys.ToGoOS() {
 		binDir = filepath.Join(binDir, fmt.Sprintf("%v_%v", opsys.ToGoOS(), arch.ToGoArch()))
@@ -115,14 +116,14 @@
 	files, err := ioutil.ReadDir(binDir)
 	if err != nil && !os.IsNotExist(err) {
 		vlog.Errorf("ReadDir(%v) failed: %v", binDir, err)
-		return nil, verror.New(verror.ErrInternal, call.Context())
+		return nil, verror.New(verror.ErrInternal, ctx)
 	}
 	for _, file := range files {
 		binPath := filepath.Join(binDir, file.Name())
 		bytes, err := ioutil.ReadFile(binPath)
 		if err != nil {
 			vlog.Errorf("ReadFile(%v) failed: %v", binPath, err)
-			return nil, verror.New(verror.ErrInternal, call.Context())
+			return nil, verror.New(verror.ErrInternal, ctx)
 		}
 		result := build.File{
 			Name:     "bin/" + file.Name(),
@@ -130,13 +131,13 @@
 		}
 		if err := call.SendStream().Send(result); err != nil {
 			vlog.Errorf("Send() failed: %v", err)
-			return nil, verror.New(verror.ErrInternal, call.Context())
+			return nil, verror.New(verror.ErrInternal, ctx)
 		}
 	}
 	return output.Bytes(), nil
 }
 
-func (i *builderService) Describe(_ rpc.ServerCall, name string) (binary.Description, error) {
+func (i *builderService) Describe(_ *context.T, _ rpc.ServerCall, name string) (binary.Description, error) {
 	// TODO(jsimsa): Implement.
 	return binary.Description{}, nil
 }
diff --git a/services/device/config.vdl.go b/services/device/config.vdl.go
index 9cc5ca3..63e522b 100644
--- a/services/device/config.vdl.go
+++ b/services/device/config.vdl.go
@@ -49,7 +49,7 @@
 // Config is an RPC API to the config service.
 type ConfigServerMethods interface {
 	// Set sets the value for key.
-	Set(call rpc.ServerCall, key string, value string) error
+	Set(ctx *context.T, call rpc.ServerCall, key string, value string) error
 }
 
 // ConfigServerStubMethods is the server interface containing
@@ -87,8 +87,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implConfigServerStub) Set(call rpc.ServerCall, i0 string, i1 string) error {
-	return s.impl.Set(call, i0, i1)
+func (s implConfigServerStub) Set(ctx *context.T, call rpc.ServerCall, i0 string, i1 string) error {
+	return s.impl.Set(ctx, call, i0, i1)
 }
 
 func (s implConfigServerStub) Globber() *rpc.GlobState {
diff --git a/services/device/device/devicemanager_mock_test.go b/services/device/device/devicemanager_mock_test.go
index 9065755..129d139 100644
--- a/services/device/device/devicemanager_mock_test.go
+++ b/services/device/device/devicemanager_mock_test.go
@@ -40,7 +40,7 @@
 	err error
 }
 
-func (mni *mockDeviceInvoker) ListAssociations(rpc.ServerCall) (associations []device.Association, err error) {
+func (mni *mockDeviceInvoker) ListAssociations(*context.T, rpc.ServerCall) (associations []device.Association, err error) {
 	vlog.VI(2).Infof("ListAssociations() was called")
 
 	ir := mni.tape.Record("ListAssociations")
@@ -69,23 +69,23 @@
 	return nil
 }
 
-func (mni *mockDeviceInvoker) AssociateAccount(call rpc.ServerCall, identityNames []string, accountName string) error {
+func (mni *mockDeviceInvoker) AssociateAccount(_ *context.T, _ rpc.ServerCall, identityNames []string, accountName string) error {
 	return mni.simpleCore(AddAssociationStimulus{"AssociateAccount", identityNames, accountName}, "AssociateAccount")
 }
 
-func (mni *mockDeviceInvoker) Claim(call rpc.ServerCall, pairingToken string) error {
+func (mni *mockDeviceInvoker) Claim(_ *context.T, _ rpc.ServerCall, pairingToken string) error {
 	return mni.simpleCore("Claim", "Claim")
 }
 
-func (*mockDeviceInvoker) Describe(rpc.ServerCall) (device.Description, error) {
+func (*mockDeviceInvoker) Describe(*context.T, rpc.ServerCall) (device.Description, error) {
 	return device.Description{}, nil
 }
 
-func (*mockDeviceInvoker) IsRunnable(_ rpc.ServerCall, description binary.Description) (bool, error) {
+func (*mockDeviceInvoker) IsRunnable(_ *context.T, _ rpc.ServerCall, description binary.Description) (bool, error) {
 	return false, nil
 }
 
-func (*mockDeviceInvoker) Reset(call rpc.ServerCall, deadline uint64) error { return nil }
+func (*mockDeviceInvoker) Reset(_ *context.T, _ rpc.ServerCall, deadline uint64) error { return nil }
 
 // Mock Install
 type InstallStimulus struct {
@@ -155,11 +155,11 @@
 	return packageSize(dst), nil
 }
 
-func (mni *mockDeviceInvoker) Install(call rpc.ServerCall, appName string, config device.Config, packages application.Packages) (string, error) {
+func (mni *mockDeviceInvoker) Install(ctx *context.T, _ rpc.ServerCall, appName string, config device.Config, packages application.Packages) (string, error) {
 	is := InstallStimulus{"Install", appName, config, packages, application.Envelope{}, nil}
 	if appName != appNameNoFetch {
 		// Fetch the envelope and record it in the stimulus.
-		envelope, err := repository.ApplicationClient(appName).Match(call.Context(), []string{"test"})
+		envelope, err := repository.ApplicationClient(appName).Match(ctx, []string{"test"})
 		if err != nil {
 			return "", err
 		}
@@ -168,7 +168,7 @@
 		is.appName = appNameAfterFetch
 		is.files = make(map[string]int64)
 		// Fetch the binary and record its size in the stimulus.
-		data, mediaInfo, err := binarylib.Download(call.Context(), binaryName)
+		data, mediaInfo, err := binarylib.Download(ctx, binaryName)
 		if err != nil {
 			return "", err
 		}
@@ -180,7 +180,7 @@
 		// the file(s) that make up each package, and record that in the
 		// stimulus.
 		for pkgLocalName, pkgVON := range envelope.Packages {
-			size, err := fetchPackageSize(call.Context(), pkgVON.File)
+			size, err := fetchPackageSize(ctx, pkgVON.File)
 			if err != nil {
 				return "", err
 			}
@@ -188,7 +188,7 @@
 		}
 		envelope.Packages = nil
 		for pkgLocalName, pkg := range packages {
-			size, err := fetchPackageSize(call.Context(), pkg.File)
+			size, err := fetchPackageSize(ctx, pkg.File)
 			if err != nil {
 				return "", err
 			}
@@ -201,22 +201,22 @@
 	return r.appId, r.err
 }
 
-func (*mockDeviceInvoker) Refresh(rpc.ServerCall) error { return nil }
+func (*mockDeviceInvoker) Refresh(*context.T, rpc.ServerCall) error { return nil }
 
-func (*mockDeviceInvoker) Restart(rpc.ServerCall) error { return nil }
+func (*mockDeviceInvoker) Restart(*context.T, rpc.ServerCall) error { return nil }
 
-func (mni *mockDeviceInvoker) Resume(_ rpc.ServerCall) error {
+func (mni *mockDeviceInvoker) Resume(*context.T, rpc.ServerCall) error {
 	return mni.simpleCore("Resume", "Resume")
 }
 
-func (i *mockDeviceInvoker) Revert(call rpc.ServerCall) error { return nil }
+func (i *mockDeviceInvoker) Revert(*context.T, rpc.ServerCall) error { return nil }
 
 type StartResponse struct {
 	err  error
 	msgs []device.StartServerMessage
 }
 
-func (mni *mockDeviceInvoker) Start(call rpc.StreamServerCall) error {
+func (mni *mockDeviceInvoker) Start(_ *context.T, call rpc.StreamServerCall) error {
 	ir := mni.tape.Record("Start")
 	r := ir.(StartResponse)
 	for _, m := range r.msgs {
@@ -230,19 +230,19 @@
 	delta time.Duration
 }
 
-func (mni *mockDeviceInvoker) Stop(_ rpc.ServerCall, delta time.Duration) error {
+func (mni *mockDeviceInvoker) Stop(_ *context.T, _ rpc.ServerCall, delta time.Duration) error {
 	return mni.simpleCore(StopStimulus{"Stop", delta}, "Stop")
 }
 
-func (mni *mockDeviceInvoker) Suspend(_ rpc.ServerCall) error {
+func (mni *mockDeviceInvoker) Suspend(*context.T, rpc.ServerCall) error {
 	return mni.simpleCore("Suspend", "Suspend")
 }
 
-func (*mockDeviceInvoker) Uninstall(rpc.ServerCall) error { return nil }
+func (*mockDeviceInvoker) Uninstall(*context.T, rpc.ServerCall) error { return nil }
 
-func (i *mockDeviceInvoker) Update(rpc.ServerCall) error { return nil }
+func (i *mockDeviceInvoker) Update(*context.T, rpc.ServerCall) error { return nil }
 
-func (*mockDeviceInvoker) UpdateTo(rpc.ServerCall, string) error { return nil }
+func (*mockDeviceInvoker) UpdateTo(*context.T, rpc.ServerCall, string) error { return nil }
 
 // Mock AccessList getting and setting
 type GetPermissionsResponse struct {
@@ -257,23 +257,23 @@
 	version string
 }
 
-func (mni *mockDeviceInvoker) SetPermissions(_ rpc.ServerCall, acl access.Permissions, version string) error {
+func (mni *mockDeviceInvoker) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return mni.simpleCore(SetPermissionsStimulus{"SetPermissions", acl, version}, "SetPermissions")
 }
 
-func (mni *mockDeviceInvoker) GetPermissions(rpc.ServerCall) (access.Permissions, string, error) {
+func (mni *mockDeviceInvoker) GetPermissions(*context.T, rpc.ServerCall) (access.Permissions, string, error) {
 	ir := mni.tape.Record("GetPermissions")
 	r := ir.(GetPermissionsResponse)
 	return r.acl, r.version, r.err
 }
 
-func (mni *mockDeviceInvoker) Debug(rpc.ServerCall) (string, error) {
+func (mni *mockDeviceInvoker) Debug(*context.T, rpc.ServerCall) (string, error) {
 	ir := mni.tape.Record("Debug")
 	r := ir.(string)
 	return r, nil
 }
 
-func (mni *mockDeviceInvoker) Status(rpc.ServerCall) (device.Status, error) {
+func (mni *mockDeviceInvoker) Status(*context.T, rpc.ServerCall) (device.Status, error) {
 	ir := mni.tape.Record("Status")
 	r := ir.(device.Status)
 	return r, nil
diff --git a/services/device/device/local_install.go b/services/device/device/local_install.go
index 6c1ba9c..354e59b 100644
--- a/services/device/device/local_install.go
+++ b/services/device/device/local_install.go
@@ -135,15 +135,15 @@
 
 type binaryInvoker string
 
-func (binaryInvoker) Create(rpc.ServerCall, int32, repository.MediaInfo) error {
+func (binaryInvoker) Create(*context.T, rpc.ServerCall, int32, repository.MediaInfo) error {
 	return errNotImplemented
 }
 
-func (binaryInvoker) Delete(rpc.ServerCall) error {
+func (binaryInvoker) Delete(*context.T, rpc.ServerCall) error {
 	return errNotImplemented
 }
 
-func (i binaryInvoker) Download(call repository.BinaryDownloadServerCall, _ int32) error {
+func (i binaryInvoker) Download(_ *context.T, call repository.BinaryDownloadServerCall, _ int32) error {
 	fileName := string(i)
 	fStat, err := os.Stat(fileName)
 	if err != nil {
@@ -180,11 +180,11 @@
 	}
 }
 
-func (binaryInvoker) DownloadUrl(rpc.ServerCall) (string, int64, error) {
+func (binaryInvoker) DownloadUrl(*context.T, rpc.ServerCall) (string, int64, error) {
 	return "", 0, errNotImplemented
 }
 
-func (i binaryInvoker) Stat(call rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
+func (i binaryInvoker) Stat(*context.T, rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
 	fileName := string(i)
 	h := md5.New()
 	bytes, err := ioutil.ReadFile(fileName)
@@ -196,28 +196,28 @@
 	return []binary.PartInfo{part}, packages.MediaInfoForFileName(fileName), nil
 }
 
-func (binaryInvoker) Upload(repository.BinaryUploadServerCall, int32) error {
+func (binaryInvoker) Upload(*context.T, repository.BinaryUploadServerCall, int32) error {
 	return errNotImplemented
 }
 
-func (binaryInvoker) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (binaryInvoker) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", errNotImplemented
 }
 
-func (binaryInvoker) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
+func (binaryInvoker) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return errNotImplemented
 }
 
 type envelopeInvoker application.Envelope
 
-func (i envelopeInvoker) Match(rpc.ServerCall, []string) (application.Envelope, error) {
+func (i envelopeInvoker) Match(*context.T, rpc.ServerCall, []string) (application.Envelope, error) {
 	return application.Envelope(i), nil
 }
-func (envelopeInvoker) GetPermissions(rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (envelopeInvoker) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", errNotImplemented
 }
 
-func (envelopeInvoker) SetPermissions(rpc.ServerCall, access.Permissions, string) error {
+func (envelopeInvoker) SetPermissions(*context.T, rpc.ServerCall, access.Permissions, string) error {
 	return errNotImplemented
 }
 
diff --git a/services/device/internal/impl/app_service.go b/services/device/internal/impl/app_service.go
index d5c9a5a..9aa4316 100644
--- a/services/device/internal/impl/app_service.go
+++ b/services/device/internal/impl/app_service.go
@@ -407,11 +407,11 @@
 	return versionDir, updateLink(versionDir, filepath.Join(installationDir, "current"))
 }
 
-func (i *appService) Install(call rpc.ServerCall, applicationVON string, config device.Config, packages application.Packages) (string, error) {
+func (i *appService) Install(ctx *context.T, _ rpc.ServerCall, applicationVON string, config device.Config, packages application.Packages) (string, error) {
 	if len(i.suffix) > 0 {
-		return "", verror.New(ErrInvalidSuffix, call.Context())
+		return "", verror.New(ErrInvalidSuffix, ctx)
 	}
-	ctx, cancel := context.WithTimeout(call.Context(), rpcContextLongTimeout)
+	ctx, cancel := context.WithTimeout(ctx, rpcContextLongTimeout)
 	defer cancel()
 	envelope, err := fetchAppEnvelope(ctx, applicationVON)
 	if err != nil {
@@ -434,32 +434,32 @@
 		delete(config, mgmt.AppOriginConfigKey)
 		applicationVON = newOrigin
 	}
-	if err := saveOrigin(call.Context(), installationDir, applicationVON); err != nil {
+	if err := saveOrigin(ctx, installationDir, applicationVON); err != nil {
 		return "", err
 	}
-	if err := saveConfig(call.Context(), installationDir, config); err != nil {
+	if err := saveConfig(ctx, installationDir, config); err != nil {
 		return "", err
 	}
-	if err := savePackages(call.Context(), installationDir, packages); err != nil {
+	if err := savePackages(ctx, installationDir, packages); err != nil {
 		return "", err
 	}
 	pkgDir := filepath.Join(installationDir, "pkg")
 	if err := mkdir(pkgDir); err != nil {
-		return "", verror.New(ErrOperationFailed, call.Context(), err)
+		return "", verror.New(ErrOperationFailed, ctx, err)
 	}
 	// We use a zero value publisher, meaning that any signatures present in the
 	// package files are not verified.
 	// TODO(caprita): Issue warnings when signatures are present and ignored.
-	if err := downloadPackages(call.Context(), security.Blessings{}, packages, pkgDir); err != nil {
+	if err := downloadPackages(ctx, security.Blessings{}, packages, pkgDir); err != nil {
 		return "", err
 	}
-	if _, err := newVersion(call.Context(), installationDir, envelope, ""); err != nil {
+	if _, err := newVersion(ctx, installationDir, envelope, ""); err != nil {
 		return "", err
 	}
 	// TODO(caprita,rjkroege): Should the installation AccessLists really be
 	// seeded with the device AccessList? Instead, might want to hide the deviceAccessList
 	// from the app?
-	blessings, _ := security.RemoteBlessingNames(call.Context())
+	blessings, _ := security.RemoteBlessingNames(ctx)
 	if err := i.initializeSubAccessLists(installationDir, blessings, i.deviceAccessList.Copy()); err != nil {
 		return "", err
 	}
@@ -474,12 +474,12 @@
 	return naming.Join(envelope.Title, installationID), nil
 }
 
-func (*appService) Refresh(rpc.ServerCall) error {
+func (*appService) Refresh(*context.T, rpc.ServerCall) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (*appService) Restart(rpc.ServerCall) error {
+func (*appService) Restart(*context.T, rpc.ServerCall) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
@@ -596,7 +596,7 @@
 	// TODO(caprita): Figure out if there is any feature value in providing
 	// the app with a device manager-derived blessing (e.g., may the app
 	// need to prove it's running on the device?).
-	dmPrincipal := v23.GetPrincipal(call.Context())
+	dmPrincipal := v23.GetPrincipal(ctx)
 	dmBlessings, err := dmPrincipal.Bless(p.PublicKey(), dmPrincipal.BlessingStore().Default(), "callback", security.UnconstrainedUse())
 	// Put the names of the device manager's default blessings as patterns
 	// for the child, so that the child uses the right blessing when talking
@@ -677,49 +677,49 @@
 	return i.aclstore.Set(aclDir, acl, "")
 }
 
-func (i *appService) newInstance(call device.ApplicationStartServerCall) (string, string, error) {
+func (i *appService) newInstance(ctx *context.T, call device.ApplicationStartServerCall) (string, string, error) {
 	installationDir, err := i.installationDir()
 	if err != nil {
 		return "", "", err
 	}
 	if !installationStateIs(installationDir, device.InstallationStateActive) {
-		return "", "", verror.New(ErrInvalidOperation, call.Context())
+		return "", "", verror.New(ErrInvalidOperation, ctx)
 	}
 	instanceID := generateID()
 	instanceDir := filepath.Join(installationDir, "instances", instanceDirName(instanceID))
 	// Set permissions for app to have access.
 	if mkdirPerm(instanceDir, 0711) != nil {
-		return "", "", verror.New(ErrOperationFailed, call.Context())
+		return "", "", verror.New(ErrOperationFailed, ctx)
 	}
 	rootDir := filepath.Join(instanceDir, "root")
 	if err := mkdir(rootDir); err != nil {
-		return instanceDir, instanceID, verror.New(ErrOperationFailed, call.Context(), err)
+		return instanceDir, instanceID, verror.New(ErrOperationFailed, ctx, err)
 	}
 	installationLink := filepath.Join(instanceDir, "installation")
 	if err := os.Symlink(installationDir, installationLink); err != nil {
-		return instanceDir, instanceID, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("Symlink(%v, %v) failed: %v", installationDir, installationLink, err))
+		return instanceDir, instanceID, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Symlink(%v, %v) failed: %v", installationDir, installationLink, err))
 	}
 	currLink := filepath.Join(installationDir, "current")
 	versionDir, err := filepath.EvalSymlinks(currLink)
 	if err != nil {
-		return instanceDir, instanceID, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("EvalSymlinks(%v) failed: %v", currLink, err))
+		return instanceDir, instanceID, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("EvalSymlinks(%v) failed: %v", currLink, err))
 	}
 	versionLink := filepath.Join(instanceDir, "version")
 	if err := os.Symlink(versionDir, versionLink); err != nil {
-		return instanceDir, instanceID, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("Symlink(%v, %v) failed: %v", versionDir, versionLink, err))
+		return instanceDir, instanceID, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Symlink(%v, %v) failed: %v", versionDir, versionLink, err))
 	}
 	packagesDir, packagesLink := filepath.Join(versionLink, "packages"), filepath.Join(rootDir, "packages")
 	if err := os.Symlink(packagesDir, packagesLink); err != nil {
-		return instanceDir, instanceID, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("Symlink(%v, %v) failed: %v", packagesDir, packagesLink, err))
+		return instanceDir, instanceID, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Symlink(%v, %v) failed: %v", packagesDir, packagesLink, err))
 	}
 	instanceInfo := new(instanceInfo)
-	if err := setupPrincipal(call.Context(), instanceDir, call, i.securityAgent, instanceInfo); err != nil {
+	if err := setupPrincipal(ctx, instanceDir, call, i.securityAgent, instanceInfo); err != nil {
 		return instanceDir, instanceID, err
 	}
-	if err := saveInstanceInfo(call.Context(), instanceDir, instanceInfo); err != nil {
+	if err := saveInstanceInfo(ctx, instanceDir, instanceInfo); err != nil {
 		return instanceDir, instanceID, err
 	}
-	blessings, _ := security.RemoteBlessingNames(call.Context())
+	blessings, _ := security.RemoteBlessingNames(ctx)
 	aclCopy := i.deviceAccessList.Copy()
 	if err := i.initializeSubAccessLists(instanceDir, blessings, aclCopy); err != nil {
 		return instanceDir, instanceID, err
@@ -729,7 +729,7 @@
 	}
 	// TODO(rjkroege): Divide the permission lists into those used by the device manager
 	// and those used by the application itself.
-	dmBlessings := security.LocalBlessingNames(call.Context())
+	dmBlessings := security.LocalBlessingNames(ctx)
 	if err := setACLsForDebugging(dmBlessings, aclCopy, instanceDir, i.aclstore); err != nil {
 		return instanceDir, instanceID, err
 	}
@@ -931,23 +931,23 @@
 	return nil
 }
 
-func (i *appService) Start(call device.ApplicationStartServerCall) error {
+func (i *appService) Start(ctx *context.T, call device.ApplicationStartServerCall) error {
 	helper := i.config.Helper
-	instanceDir, instanceID, err := i.newInstance(call)
+	instanceDir, instanceID, err := i.newInstance(ctx, call)
 	if err != nil {
 		cleanupDir(instanceDir, helper)
 		return err
 	}
 
-	systemName := suidHelper.usernameForPrincipal(call, i.uat)
+	systemName := suidHelper.usernameForPrincipal(ctx, i.uat)
 	if err := saveSystemNameForInstance(instanceDir, systemName); err != nil {
 		cleanupDir(instanceDir, helper)
 		return err
 	}
 	if err := call.SendStream().Send(device.StartServerMessageInstanceName{instanceID}); err != nil {
-		return verror.New(ErrOperationFailed, call.Context(), err)
+		return verror.New(ErrOperationFailed, ctx, err)
 	}
-	if err = i.run(call.Context(), instanceDir, systemName); err != nil {
+	if err = i.run(ctx, instanceDir, systemName); err != nil {
 		// TODO(caprita): We should call cleanupDir here, but we don't
 		// in order to not lose the logs for the instance (so we can
 		// debug why run failed).  Clean this up.
@@ -977,22 +977,22 @@
 	return instanceDir(i.config.Root, i.suffix)
 }
 
-func (i *appService) Resume(call rpc.ServerCall) error {
+func (i *appService) Resume(ctx *context.T, _ rpc.ServerCall) error {
 	instanceDir, err := i.instanceDir()
 	if err != nil {
 		return err
 	}
 
-	systemName := suidHelper.usernameForPrincipal(call, i.uat)
+	systemName := suidHelper.usernameForPrincipal(ctx, i.uat)
 	startSystemName, err := readSystemNameForInstance(instanceDir)
 	if err != nil {
 		return err
 	}
 
 	if startSystemName != systemName {
-		return verror.New(verror.ErrNoAccess, call.Context(), "Not allowed to resume an application under a different system name.")
+		return verror.New(verror.ErrNoAccess, ctx, "Not allowed to resume an application under a different system name.")
 	}
-	return i.run(call.Context(), instanceDir, systemName)
+	return i.run(ctx, instanceDir, systemName)
 }
 
 func stopAppRemotely(ctx *context.T, appVON string) error {
@@ -1030,7 +1030,7 @@
 
 // TODO(caprita): implement deadline for Stop.
 
-func (i *appService) Stop(call rpc.ServerCall, deadline time.Duration) error {
+func (i *appService) Stop(ctx *context.T, _ rpc.ServerCall, deadline time.Duration) error {
 	instanceDir, err := i.instanceDir()
 	if err != nil {
 		return err
@@ -1041,14 +1041,14 @@
 	if err := transitionInstance(instanceDir, device.InstanceStateStarted, device.InstanceStateStopping); err != nil {
 		return err
 	}
-	if err := stop(call.Context(), instanceDir, i.reap); err != nil {
+	if err := stop(ctx, instanceDir, i.reap); err != nil {
 		transitionInstance(instanceDir, device.InstanceStateStopping, device.InstanceStateStarted)
 		return err
 	}
 	return transitionInstance(instanceDir, device.InstanceStateStopping, device.InstanceStateStopped)
 }
 
-func (i *appService) Suspend(call rpc.ServerCall) error {
+func (i *appService) Suspend(ctx *context.T, _ rpc.ServerCall) error {
 	instanceDir, err := i.instanceDir()
 	if err != nil {
 		return err
@@ -1056,14 +1056,14 @@
 	if err := transitionInstance(instanceDir, device.InstanceStateStarted, device.InstanceStateSuspending); err != nil {
 		return err
 	}
-	if err := stop(call.Context(), instanceDir, i.reap); err != nil {
+	if err := stop(ctx, instanceDir, i.reap); err != nil {
 		transitionInstance(instanceDir, device.InstanceStateSuspending, device.InstanceStateStarted)
 		return err
 	}
 	return transitionInstance(instanceDir, device.InstanceStateSuspending, device.InstanceStateSuspended)
 }
 
-func (i *appService) Uninstall(rpc.ServerCall) error {
+func (i *appService) Uninstall(*context.T, rpc.ServerCall) error {
 	installationDir, err := i.installationDir()
 	if err != nil {
 		return err
@@ -1150,28 +1150,28 @@
 	return nil
 }
 
-func (i *appService) Update(call rpc.ServerCall) error {
+func (i *appService) Update(ctx *context.T, _ rpc.ServerCall) error {
 	if installationDir, err := i.installationDir(); err == nil {
-		return updateInstallation(call.Context(), installationDir)
+		return updateInstallation(ctx, installationDir)
 	}
 	if instanceDir, err := i.instanceDir(); err == nil {
-		return updateInstance(instanceDir, call.Context())
+		return updateInstance(instanceDir, ctx)
 	}
 	return verror.New(ErrInvalidSuffix, nil)
 }
 
-func (*appService) UpdateTo(_ rpc.ServerCall, von string) error {
+func (*appService) UpdateTo(_ *context.T, _ rpc.ServerCall, von string) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (i *appService) Revert(call rpc.ServerCall) error {
+func (i *appService) Revert(ctx *context.T, _ rpc.ServerCall) error {
 	installationDir, err := i.installationDir()
 	if err != nil {
 		return err
 	}
 	if !installationStateIs(installationDir, device.InstallationStateActive) {
-		return verror.New(ErrInvalidOperation, call.Context())
+		return verror.New(ErrInvalidOperation, ctx)
 	}
 	// NOTE(caprita): A race can occur between an update and a revert, where
 	// both use the same current version as their starting point.  This will
@@ -1181,19 +1181,19 @@
 	currLink := filepath.Join(installationDir, "current")
 	currVersionDir, err := filepath.EvalSymlinks(currLink)
 	if err != nil {
-		return verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("EvalSymlinks(%v) failed: %v", currLink, err))
+		return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("EvalSymlinks(%v) failed: %v", currLink, err))
 	}
 	previousLink := filepath.Join(currVersionDir, "previous")
 	if _, err := os.Lstat(previousLink); err != nil {
 		if os.IsNotExist(err) {
 			// No 'previous' link -- must be the first version.
-			return verror.New(ErrUpdateNoOp, call.Context())
+			return verror.New(ErrUpdateNoOp, ctx)
 		}
-		return verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("Lstat(%v) failed: %v", previousLink, err))
+		return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Lstat(%v) failed: %v", previousLink, err))
 	}
 	prevVersionDir, err := filepath.EvalSymlinks(previousLink)
 	if err != nil {
-		return verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("EvalSymlinks(%v) failed: %v", previousLink, err))
+		return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("EvalSymlinks(%v) failed: %v", previousLink, err))
 	}
 	return updateLink(prevVersionDir, currLink)
 }
@@ -1297,22 +1297,22 @@
 	}
 }
 
-func (i *appService) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
+func (i *appService) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
 	tree := newTreeNode()
 	switch len(i.suffix) {
 	case 0:
-		i.scanEnvelopes(call.Context(), tree, "app-*")
+		i.scanEnvelopes(ctx, tree, "app-*")
 	case 1:
 		appDir := applicationDirName(i.suffix[0])
-		i.scanEnvelopes(call.Context(), tree, appDir)
+		i.scanEnvelopes(ctx, tree, appDir)
 	case 2:
-		i.scanInstances(call.Context(), tree)
+		i.scanInstances(ctx, tree)
 	case 3:
 		dir, err := i.instanceDir()
 		if err != nil {
 			break
 		}
-		i.scanInstance(call.Context(), tree, i.suffix[0], dir)
+		i.scanInstance(ctx, tree, i.suffix[0], dir)
 	default:
 		return nil, verror.New(verror.ErrNoExist, nil, i.suffix)
 	}
@@ -1351,13 +1351,13 @@
 }
 
 // TODO(rjkroege): Consider maintaining an in-memory Permissions cache.
-func (i *appService) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
+func (i *appService) SetPermissions(ctx *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	dir, isInstance, err := dirFromSuffix(i.suffix, i.config.Root)
 	if err != nil {
 		return err
 	}
 	if isInstance {
-		dmBlessings := security.LocalBlessingNames(call.Context())
+		dmBlessings := security.LocalBlessingNames(ctx)
 		if err := setACLsForDebugging(dmBlessings, acl, dir, i.aclstore); err != nil {
 			return err
 		}
@@ -1365,7 +1365,7 @@
 	return i.aclstore.Set(path.Join(dir, "acls"), acl, version)
 }
 
-func (i *appService) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (i *appService) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	dir, _, err := dirFromSuffix(i.suffix, i.config.Root)
 	if err != nil {
 		return nil, "", err
@@ -1373,18 +1373,18 @@
 	return i.aclstore.Get(path.Join(dir, "acls"))
 }
 
-func (i *appService) Debug(call rpc.ServerCall) (string, error) {
+func (i *appService) Debug(ctx *context.T, call rpc.ServerCall) (string, error) {
 	switch len(i.suffix) {
 	case 2:
-		return i.installationDebug(call)
+		return i.installationDebug(ctx)
 	case 3:
-		return i.instanceDebug(call)
+		return i.instanceDebug(ctx)
 	default:
 		return "", verror.New(ErrInvalidSuffix, nil)
 	}
 }
 
-func (i *appService) installationDebug(call rpc.ServerCall) (string, error) {
+func (i *appService) installationDebug(ctx *context.T) (string, error) {
 	const installationDebug = `Installation dir: {{.InstallationDir}}
 
 Origin: {{.Origin}}
@@ -1409,20 +1409,20 @@
 	}{}
 	debugInfo.InstallationDir = installationDir
 
-	if origin, err := loadOrigin(call.Context(), installationDir); err != nil {
+	if origin, err := loadOrigin(ctx, installationDir); err != nil {
 		return "", err
 	} else {
 		debugInfo.Origin = origin
 	}
 
 	currLink := filepath.Join(installationDir, "current")
-	if envelope, err := loadEnvelope(call.Context(), currLink); err != nil {
+	if envelope, err := loadEnvelope(ctx, currLink); err != nil {
 		return "", err
 	} else {
 		debugInfo.Envelope = envelope
 	}
 
-	if config, err := loadConfig(call.Context(), installationDir); err != nil {
+	if config, err := loadConfig(ctx, installationDir); err != nil {
 		return "", err
 	} else {
 		debugInfo.Config = config
@@ -1436,7 +1436,7 @@
 
 }
 
-func (i *appService) instanceDebug(call rpc.ServerCall) (string, error) {
+func (i *appService) instanceDebug(ctx *context.T) (string, error) {
 	const instanceDebug = `Instance dir: {{.InstanceDir}}
 
 System name / start system name: {{.SystemName}} / {{.StartSystemName}}
@@ -1468,18 +1468,18 @@
 	}{}
 	debugInfo.InstanceDir = instanceDir
 
-	debugInfo.SystemName = suidHelper.usernameForPrincipal(call, i.uat)
+	debugInfo.SystemName = suidHelper.usernameForPrincipal(ctx, i.uat)
 	if startSystemName, err := readSystemNameForInstance(instanceDir); err != nil {
 		return "", err
 	} else {
 		debugInfo.StartSystemName = startSystemName
 	}
-	if cmd, err := genCmd(call.Context(), instanceDir, i.config.Helper, debugInfo.SystemName, i.mtAddress); err != nil {
+	if cmd, err := genCmd(ctx, instanceDir, i.config.Helper, debugInfo.SystemName, i.mtAddress); err != nil {
 		return "", err
 	} else {
 		debugInfo.Cmd = cmd
 	}
-	if info, err := loadInstanceInfo(call.Context(), instanceDir); err != nil {
+	if info, err := loadInstanceInfo(ctx, instanceDir); err != nil {
 		return "", err
 	} else {
 		debugInfo.Info = info
@@ -1492,7 +1492,7 @@
 			return "", err
 		}
 		var cancel func()
-		if debugInfo.Principal, cancel, err = agentPrincipal(call.Context(), file); err != nil {
+		if debugInfo.Principal, cancel, err = agentPrincipal(ctx, file); err != nil {
 			return "", err
 		}
 		defer cancel()
@@ -1512,20 +1512,20 @@
 	return buf.String(), nil
 }
 
-func (i *appService) Status(call rpc.ServerCall) (device.Status, error) {
+func (i *appService) Status(ctx *context.T, _ rpc.ServerCall) (device.Status, error) {
 	switch len(i.suffix) {
 	case 2:
-		status, err := i.installationStatus(call)
+		status, err := i.installationStatus(ctx)
 		return device.StatusInstallation{status}, err
 	case 3:
-		status, err := i.instanceStatus(call)
+		status, err := i.instanceStatus(ctx)
 		return device.StatusInstance{status}, err
 	default:
-		return nil, verror.New(ErrInvalidSuffix, nil)
+		return nil, verror.New(ErrInvalidSuffix, ctx)
 	}
 }
 
-func (i *appService) installationStatus(call rpc.ServerCall) (device.InstallationStatus, error) {
+func (i *appService) installationStatus(ctx *context.T) (device.InstallationStatus, error) {
 	installationDir, err := i.installationDir()
 	if err != nil {
 		return device.InstallationStatus{}, err
@@ -1537,7 +1537,7 @@
 	versionLink := filepath.Join(installationDir, "current")
 	versionDir, err := filepath.EvalSymlinks(versionLink)
 	if err != nil {
-		return device.InstallationStatus{}, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("EvalSymlinks(%v) failed: %v", versionLink, err))
+		return device.InstallationStatus{}, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("EvalSymlinks(%v) failed: %v", versionLink, err))
 	}
 	return device.InstallationStatus{
 		State:   state,
@@ -1545,7 +1545,7 @@
 	}, nil
 }
 
-func (i *appService) instanceStatus(call rpc.ServerCall) (device.InstanceStatus, error) {
+func (i *appService) instanceStatus(ctx *context.T) (device.InstanceStatus, error) {
 	instanceDir, err := i.instanceDir()
 	if err != nil {
 		return device.InstanceStatus{}, err
@@ -1557,7 +1557,7 @@
 	versionLink := filepath.Join(instanceDir, "version")
 	versionDir, err := filepath.EvalSymlinks(versionLink)
 	if err != nil {
-		return device.InstanceStatus{}, verror.New(ErrOperationFailed, call.Context(), fmt.Sprintf("EvalSymlinks(%v) failed: %v", versionLink, err))
+		return device.InstanceStatus{}, verror.New(ErrOperationFailed, ctx, fmt.Sprintf("EvalSymlinks(%v) failed: %v", versionLink, err))
 	}
 	return device.InstanceStatus{
 		State:   state,
diff --git a/services/device/internal/impl/claim.go b/services/device/internal/impl/claim.go
index 921b1f2..9d69efe 100644
--- a/services/device/internal/impl/claim.go
+++ b/services/device/internal/impl/claim.go
@@ -34,43 +34,43 @@
 	mu sync.Mutex
 }
 
-func (c *claimable) Claim(call rpc.ServerCall, pairingToken string) error {
+func (c *claimable) Claim(ctx *context.T, call rpc.ServerCall, pairingToken string) error {
 	// Verify that the claimer pairing tokens match that of the device manager.
 	if subtle.ConstantTimeCompare([]byte(pairingToken), []byte(c.token)) != 1 {
-		return verror.New(ErrInvalidPairingToken, call.Context())
+		return verror.New(ErrInvalidPairingToken, ctx)
 	}
 	var (
 		granted   = call.GrantedBlessings() // blessings granted by the claimant
-		principal = v23.GetPrincipal(call.Context())
+		principal = v23.GetPrincipal(ctx)
 		store     = principal.BlessingStore()
 	)
 	if granted.IsZero() {
-		return verror.New(ErrInvalidBlessing, call.Context())
+		return verror.New(ErrInvalidBlessing, ctx)
 	}
 	c.mu.Lock()
 	defer c.mu.Unlock()
 	if c.notify == nil {
 		// Device has already been claimed (by a concurrent
 		// RPC perhaps), it cannot be reclaimed
-		return verror.New(ErrDeviceAlreadyClaimed, call.Context())
+		return verror.New(ErrDeviceAlreadyClaimed, ctx)
 	}
 	// TODO(ashankar): If the claim fails, would make sense
 	// to remove from roots as well.
 	if err := principal.AddToRoots(granted); err != nil {
-		return verror.New(ErrInvalidBlessing, call.Context())
+		return verror.New(ErrInvalidBlessing, ctx)
 	}
 	if _, err := store.Set(granted, security.AllPrincipals); err != nil {
-		return verror.New(ErrInvalidBlessing, call.Context(), err)
+		return verror.New(ErrInvalidBlessing, ctx, err)
 	}
 	if err := store.SetDefault(granted); err != nil {
-		return verror.New(ErrInvalidBlessing, call.Context(), err)
+		return verror.New(ErrInvalidBlessing, ctx, err)
 	}
 
 	// Create an AccessList with all the granted blessings (which are now the default blessings)
 	// (irrespective of caveats).
 	patterns := security.DefaultBlessingPatterns(principal)
 	if len(patterns) == 0 {
-		return verror.New(ErrInvalidBlessing, call.Context())
+		return verror.New(ErrInvalidBlessing, ctx)
 	}
 
 	// Create AccessLists that allow principals with the caller's blessings to
@@ -87,7 +87,7 @@
 		}
 	}
 	if err := c.aclstore.Set(c.aclDir, acl, ""); err != nil {
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	vlog.Infof("Device claimed and AccessLists set to: %v", acl)
 	close(c.notify)
diff --git a/services/device/internal/impl/config_service.go b/services/device/internal/impl/config_service.go
index ca5c5c2..42e4986 100644
--- a/services/device/internal/impl/config_service.go
+++ b/services/device/internal/impl/config_service.go
@@ -15,6 +15,7 @@
 	"sync"
 	"time"
 
+	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/v23/verror"
@@ -137,7 +138,7 @@
 	suffix string
 }
 
-func (i *configService) Set(_ rpc.ServerCall, key, value string) error {
+func (i *configService) Set(_ *context.T, _ rpc.ServerCall, key, value string) error {
 	id := i.suffix
 	i.callback.Lock()
 	if _, ok := i.callback.channels[id]; !ok {
diff --git a/services/device/internal/impl/device_service.go b/services/device/internal/impl/device_service.go
index efb5b2e..ce8a509 100644
--- a/services/device/internal/impl/device_service.go
+++ b/services/device/internal/impl/device_service.go
@@ -235,11 +235,11 @@
 	return args, nil
 }
 
-func (*deviceService) Describe(rpc.ServerCall) (device.Description, error) {
+func (*deviceService) Describe(*context.T, rpc.ServerCall) (device.Description, error) {
 	return Describe()
 }
 
-func (*deviceService) IsRunnable(_ rpc.ServerCall, description binary.Description) (bool, error) {
+func (*deviceService) IsRunnable(_ *context.T, _ rpc.ServerCall, description binary.Description) (bool, error) {
 	deviceProfile, err := ComputeDeviceProfile()
 	if err != nil {
 		return false, err
@@ -256,7 +256,7 @@
 	return len(result.Profiles) > 0, nil
 }
 
-func (*deviceService) Reset(call rpc.ServerCall, deadline time.Duration) error {
+func (*deviceService) Reset(_ *context.T, _ rpc.ServerCall, deadline time.Duration) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
@@ -550,69 +550,69 @@
 	return nil
 }
 
-func (*deviceService) Install(call rpc.ServerCall, _ string, _ device.Config, _ application.Packages) (string, error) {
-	return "", verror.New(ErrInvalidSuffix, call.Context())
+func (*deviceService) Install(ctx *context.T, _ rpc.ServerCall, _ string, _ device.Config, _ application.Packages) (string, error) {
+	return "", verror.New(ErrInvalidSuffix, ctx)
 }
 
-func (*deviceService) Refresh(rpc.ServerCall) error {
+func (*deviceService) Refresh(*context.T, rpc.ServerCall) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (*deviceService) Restart(rpc.ServerCall) error {
+func (*deviceService) Restart(*context.T, rpc.ServerCall) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (*deviceService) Resume(call rpc.ServerCall) error {
-	return verror.New(ErrInvalidSuffix, call.Context())
+func (*deviceService) Resume(ctx *context.T, _ rpc.ServerCall) error {
+	return verror.New(ErrInvalidSuffix, ctx)
 }
 
-func (s *deviceService) Revert(call rpc.ServerCall) error {
+func (s *deviceService) Revert(ctx *context.T, _ rpc.ServerCall) error {
 	if s.config.Previous == "" {
-		return verror.New(ErrUpdateNoOp, call.Context(), fmt.Sprintf("Revert failed: no previous version"))
+		return verror.New(ErrUpdateNoOp, ctx, fmt.Sprintf("Revert failed: no previous version"))
 	}
 	updatingState := s.updating
 	if updatingState.testAndSetUpdating() {
-		return verror.New(ErrOperationInProgress, call.Context(), fmt.Sprintf("Revert failed: already in progress"))
+		return verror.New(ErrOperationInProgress, ctx, fmt.Sprintf("Revert failed: already in progress"))
 	}
-	err := s.revertDeviceManager(call.Context())
+	err := s.revertDeviceManager(ctx)
 	if err != nil {
 		updatingState.unsetUpdating()
 	}
 	return err
 }
 
-func (*deviceService) Start(call device.ApplicationStartServerCall) error {
-	return verror.New(ErrInvalidSuffix, call.Context())
+func (*deviceService) Start(ctx *context.T, _ device.ApplicationStartServerCall) error {
+	return verror.New(ErrInvalidSuffix, ctx)
 }
 
-func (*deviceService) Stop(call rpc.ServerCall, _ time.Duration) error {
-	v23.GetAppCycle(call.Context()).Stop()
+func (*deviceService) Stop(ctx *context.T, _ rpc.ServerCall, _ time.Duration) error {
+	v23.GetAppCycle(ctx).Stop()
 	return nil
 }
 
-func (s *deviceService) Suspend(call rpc.ServerCall) error {
+func (s *deviceService) Suspend(ctx *context.T, _ rpc.ServerCall) error {
 	// TODO(caprita): move this to Restart and disable Suspend for device
 	// manager?
 	if s.restartHandler != nil {
 		s.restartHandler()
 	}
-	v23.GetAppCycle(call.Context()).Stop()
+	v23.GetAppCycle(ctx).Stop()
 	return nil
 }
 
-func (*deviceService) Uninstall(call rpc.ServerCall) error {
-	return verror.New(ErrInvalidSuffix, call.Context())
+func (*deviceService) Uninstall(ctx *context.T, _ rpc.ServerCall) error {
+	return verror.New(ErrInvalidSuffix, ctx)
 }
 
-func (s *deviceService) Update(call rpc.ServerCall) error {
-	ctx, cancel := context.WithTimeout(call.Context(), rpcContextLongTimeout)
+func (s *deviceService) Update(ctx *context.T, _ rpc.ServerCall) error {
+	ctx, cancel := context.WithTimeout(ctx, rpcContextLongTimeout)
 	defer cancel()
 
 	updatingState := s.updating
 	if updatingState.testAndSetUpdating() {
-		return verror.New(ErrOperationInProgress, call.Context())
+		return verror.New(ErrOperationInProgress, ctx)
 	}
 
 	err := s.updateDeviceManager(ctx)
@@ -622,24 +622,24 @@
 	return err
 }
 
-func (*deviceService) UpdateTo(rpc.ServerCall, string) error {
+func (*deviceService) UpdateTo(*context.T, rpc.ServerCall, string) error {
 	// TODO(jsimsa): Implement.
 	return nil
 }
 
-func (s *deviceService) SetPermissions(_ rpc.ServerCall, acl access.Permissions, version string) error {
+func (s *deviceService) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	d := AclDir(s.disp.config)
 	return s.disp.aclstore.Set(d, acl, version)
 }
 
-func (s *deviceService) GetPermissions(rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (s *deviceService) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	d := AclDir(s.disp.config)
 	return s.disp.aclstore.Get(d)
 }
 
 // TODO(rjkroege): Make it possible for users on the same system to also
 // associate their accounts with their identities.
-func (s *deviceService) AssociateAccount(call rpc.ServerCall, identityNames []string, accountName string) error {
+func (s *deviceService) AssociateAccount(_ *context.T, _ rpc.ServerCall, identityNames []string, accountName string) error {
 	if accountName == "" {
 		return s.uat.DisassociateSystemAccountForBlessings(identityNames)
 	}
@@ -647,10 +647,10 @@
 	return s.uat.AssociateSystemAccountForBlessings(identityNames, accountName)
 }
 
-func (s *deviceService) ListAssociations(call rpc.ServerCall) (associations []device.Association, err error) {
+func (s *deviceService) ListAssociations(ctx *context.T, _ rpc.ServerCall) (associations []device.Association, err error) {
 	// Temporary code. Dump this.
 	if vlog.V(2) {
-		b, r := security.RemoteBlessingNames(call.Context())
+		b, r := security.RemoteBlessingNames(ctx)
 		vlog.Infof("ListAssociations given blessings: %v\n", b)
 		if len(r) > 0 {
 			vlog.Infof("ListAssociations rejected blessings: %v\n", r)
@@ -659,10 +659,10 @@
 	return s.uat.AllBlessingSystemAssociations()
 }
 
-func (*deviceService) Debug(rpc.ServerCall) (string, error) {
+func (*deviceService) Debug(*context.T, rpc.ServerCall) (string, error) {
 	return "Not implemented", nil
 }
 
-func (*deviceService) Status(rpc.ServerCall) (device.Status, error) {
+func (*deviceService) Status(*context.T, rpc.ServerCall) (device.Status, error) {
 	return nil, nil
 }
diff --git a/services/device/internal/impl/dispatcher.go b/services/device/internal/impl/dispatcher.go
index 88679c1..d4e3243 100644
--- a/services/device/internal/impl/dispatcher.go
+++ b/services/device/internal/impl/dispatcher.go
@@ -189,24 +189,24 @@
 	return
 }
 
-func (l *loggingInvoker) Invoke(method string, inCall rpc.StreamServerCall, argptrs []interface{}) (results []interface{}, err error) {
-	results, err = l.invoker.Invoke(method, inCall, argptrs)
+func (l *loggingInvoker) Invoke(ctx *context.T, call rpc.StreamServerCall, method string, argptrs []interface{}) (results []interface{}, err error) {
+	results, err = l.invoker.Invoke(ctx, call, method, argptrs)
 	if err != nil {
 		vlog.Errorf("Invoke(method:%s argptrs:%v) returned error: %v", method, argptrs, err)
 	}
 	return
 }
 
-func (l *loggingInvoker) Signature(call rpc.ServerCall) ([]signature.Interface, error) {
-	sig, err := l.invoker.Signature(call)
+func (l *loggingInvoker) Signature(ctx *context.T, call rpc.ServerCall) ([]signature.Interface, error) {
+	sig, err := l.invoker.Signature(ctx, call)
 	if err != nil {
 		vlog.Errorf("Signature returned error: %v", err)
 	}
 	return sig, err
 }
 
-func (l *loggingInvoker) MethodSignature(call rpc.ServerCall, method string) (signature.Method, error) {
-	methodSig, err := l.invoker.MethodSignature(call, method)
+func (l *loggingInvoker) MethodSignature(ctx *context.T, call rpc.ServerCall, method string) (signature.Method, error) {
+	methodSig, err := l.invoker.MethodSignature(ctx, call, method)
 	if err != nil {
 		vlog.Errorf("MethodSignature(%s) returned error: %v", method, err)
 	}
diff --git a/services/device/internal/impl/helper_manager.go b/services/device/internal/impl/helper_manager.go
index ec58c90..960c911 100644
--- a/services/device/internal/impl/helper_manager.go
+++ b/services/device/internal/impl/helper_manager.go
@@ -9,7 +9,7 @@
 	"os"
 	"os/user"
 
-	"v.io/v23/rpc"
+	"v.io/v23/context"
 	"v.io/v23/security"
 	"v.io/v23/verror"
 	"v.io/x/lib/vlog"
@@ -62,8 +62,8 @@
 // devicemanager will use to invoke apps.
 // TODO(rjkroege): This code assumes a desktop target and will need
 // to be reconsidered for embedded contexts.
-func (i suidHelperState) usernameForPrincipal(call rpc.ServerCall, uat BlessingSystemAssociationStore) string {
-	identityNames, _ := security.RemoteBlessingNames(call.Context())
+func (i suidHelperState) usernameForPrincipal(ctx *context.T, uat BlessingSystemAssociationStore) string {
+	identityNames, _ := security.RemoteBlessingNames(ctx)
 	systemName, present := uat.SystemAccountForBlessings(identityNames)
 
 	if present {
diff --git a/services/device/internal/impl/impl_test.go b/services/device/internal/impl/impl_test.go
index 326ab3e..0659978 100644
--- a/services/device/internal/impl/impl_test.go
+++ b/services/device/internal/impl/impl_test.go
@@ -219,11 +219,11 @@
 // interact with an active service.
 type appService struct{}
 
-func (appService) Echo(_ rpc.ServerCall, message string) (string, error) {
+func (appService) Echo(_ *context.T, _ rpc.ServerCall, message string) (string, error) {
 	return message, nil
 }
 
-func (appService) Cat(_ rpc.ServerCall, file string) (string, error) {
+func (appService) Cat(_ *context.T, _ rpc.ServerCall, file string) (string, error) {
 	if file == "" || file[0] == filepath.Separator || file[0] == '.' {
 		return "", fmt.Errorf("illegal file name: %q", file)
 	}
@@ -542,7 +542,7 @@
 // TODO(caprita): Set the timeout in a more principled manner.
 const pingTimeout = 60 * time.Second
 
-func (p pingServer) Ping(_ rpc.ServerCall, arg pingArgs) error {
+func (p pingServer) Ping(_ *context.T, _ rpc.ServerCall, arg pingArgs) error {
 	p <- arg
 	return nil
 }
diff --git a/services/device/internal/impl/mock_repo_test.go b/services/device/internal/impl/mock_repo_test.go
index 6f2bece..3da6718 100644
--- a/services/device/internal/impl/mock_repo_test.go
+++ b/services/device/internal/impl/mock_repo_test.go
@@ -68,7 +68,7 @@
 }
 
 // APPLICATION REPOSITORY INTERFACE IMPLEMENTATION
-func (i *arInvoker) Match(_ rpc.ServerCall, profiles []string) (application.Envelope, error) {
+func (i *arInvoker) Match(_ *context.T, _ rpc.ServerCall, profiles []string) (application.Envelope, error) {
 	vlog.VI(1).Infof("Match()")
 	if want := []string{"test-profile"}; !reflect.DeepEqual(profiles, want) {
 		return application.Envelope{}, fmt.Errorf("Expected profiles %v, got %v", want, profiles)
@@ -76,11 +76,11 @@
 	return i.envelope, nil
 }
 
-func (i *arInvoker) GetPermissions(rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (i *arInvoker) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", nil
 }
 
-func (i *arInvoker) SetPermissions(_ rpc.ServerCall, acl access.Permissions, version string) error {
+func (i *arInvoker) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return nil
 }
 
@@ -110,22 +110,22 @@
 
 var ErrOperationFailed = verror.Register(pkgPath+".OperationFailed", verror.NoRetry, "")
 
-func (*brInvoker) Create(rpc.ServerCall, int32, repository.MediaInfo) error {
+func (*brInvoker) Create(*context.T, rpc.ServerCall, int32, repository.MediaInfo) error {
 	vlog.VI(1).Infof("Create()")
 	return nil
 }
 
-func (i *brInvoker) Delete(rpc.ServerCall) error {
+func (i *brInvoker) Delete(*context.T, rpc.ServerCall) error {
 	vlog.VI(1).Infof("Delete()")
 	return nil
 }
 
-func (i *brInvoker) Download(call repository.BinaryDownloadServerCall, _ int32) error {
+func (i *brInvoker) Download(ctx *context.T, call repository.BinaryDownloadServerCall, _ int32) error {
 	vlog.VI(1).Infof("Download()")
 	file, err := os.Open(os.Args[0])
 	if err != nil {
 		vlog.Errorf("Open() failed: %v", err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	defer file.Close()
 	bufferLength := 4096
@@ -139,41 +139,41 @@
 		case nil:
 			if err := sender.Send(buffer[:n]); err != nil {
 				vlog.Errorf("Send() failed: %v", err)
-				return verror.New(ErrOperationFailed, call.Context())
+				return verror.New(ErrOperationFailed, ctx)
 			}
 		default:
 			vlog.Errorf("Read() failed: %v", err)
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 	}
 }
 
-func (*brInvoker) DownloadUrl(rpc.ServerCall) (string, int64, error) {
+func (*brInvoker) DownloadUrl(*context.T, rpc.ServerCall) (string, int64, error) {
 	vlog.VI(1).Infof("DownloadUrl()")
 	return "", 0, nil
 }
 
-func (*brInvoker) Stat(call rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
+func (*brInvoker) Stat(ctx *context.T, call rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
 	vlog.VI(1).Infof("Stat()")
 	h := md5.New()
 	bytes, err := ioutil.ReadFile(os.Args[0])
 	if err != nil {
-		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, call.Context())
+		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, ctx)
 	}
 	h.Write(bytes)
 	part := binary.PartInfo{Checksum: hex.EncodeToString(h.Sum(nil)), Size: int64(len(bytes))}
 	return []binary.PartInfo{part}, repository.MediaInfo{Type: "application/octet-stream"}, nil
 }
 
-func (i *brInvoker) Upload(repository.BinaryUploadServerCall, int32) error {
+func (i *brInvoker) Upload(*context.T, repository.BinaryUploadServerCall, int32) error {
 	vlog.VI(1).Infof("Upload()")
 	return nil
 }
 
-func (i *brInvoker) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (i *brInvoker) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", nil
 }
 
-func (i *brInvoker) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
+func (i *brInvoker) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return nil
 }
diff --git a/services/device/internal/impl/proxy_invoker.go b/services/device/internal/impl/proxy_invoker.go
index a78cf55..f654c26 100644
--- a/services/device/internal/impl/proxy_invoker.go
+++ b/services/device/internal/impl/proxy_invoker.go
@@ -64,14 +64,13 @@
 	return
 }
 
-func (p *proxyInvoker) Invoke(method string, inCall rpc.StreamServerCall, argptrs []interface{}) (results []interface{}, err error) {
+func (p *proxyInvoker) Invoke(ctx *context.T, inCall rpc.StreamServerCall, method string, argptrs []interface{}) (results []interface{}, err error) {
 	// We accept any values as argument and pass them through to the remote
 	// server.
 	args := make([]interface{}, len(argptrs))
 	for i, ap := range argptrs {
 		args[i] = ap
 	}
-	ctx := inCall.Context()
 	client := v23.GetClient(ctx)
 
 	outCall, err := client.StartCall(ctx, p.remote, method, args)
@@ -154,22 +153,22 @@
 
 // TODO(toddw): Expose a helper function that performs all error checking based
 // on reflection, to simplify the repeated logic processing results.
-func (p *proxyInvoker) Signature(call rpc.ServerCall) ([]signature.Interface, error) {
+func (p *proxyInvoker) Signature(ctx *context.T, call rpc.ServerCall) ([]signature.Interface, error) {
 	streamCall, ok := call.(rpc.StreamServerCall)
 	if !ok {
-		return nil, verror.New(errCantUpgradeServerCall, call.Context())
+		return nil, verror.New(errCantUpgradeServerCall, ctx)
 	}
-	results, err := p.Invoke(rpc.ReservedSignature, streamCall, nil)
+	results, err := p.Invoke(ctx, streamCall, rpc.ReservedSignature, nil)
 	if err != nil {
 		return nil, err
 	}
 	if len(results) != 2 {
-		return nil, verror.New(errBadNumberOfResults, call.Context(), len(results))
+		return nil, verror.New(errBadNumberOfResults, ctx, len(results))
 	}
 	if results[1] != nil {
 		err, ok := results[1].(error)
 		if !ok {
-			return nil, verror.New(errBadErrorType, call.Context(), fmt.Sprintf("%T", err))
+			return nil, verror.New(errBadErrorType, ctx, fmt.Sprintf("%T", err))
 		}
 		return nil, err
 	}
@@ -177,29 +176,29 @@
 	if results[0] != nil {
 		sig, ok := results[0].([]signature.Interface)
 		if !ok {
-			return nil, verror.New(errWantSigInterfaceSlice, call.Context(), fmt.Sprintf("%T", sig))
+			return nil, verror.New(errWantSigInterfaceSlice, ctx, fmt.Sprintf("%T", sig))
 		}
 	}
 	return res, nil
 }
 
-func (p *proxyInvoker) MethodSignature(call rpc.ServerCall, method string) (signature.Method, error) {
+func (p *proxyInvoker) MethodSignature(ctx *context.T, call rpc.ServerCall, method string) (signature.Method, error) {
 	empty := signature.Method{}
 	streamCall, ok := call.(rpc.StreamServerCall)
 	if !ok {
-		return empty, verror.New(errCantUpgradeServerCall, call.Context())
+		return empty, verror.New(errCantUpgradeServerCall, ctx)
 	}
-	results, err := p.Invoke(rpc.ReservedMethodSignature, streamCall, []interface{}{&method})
+	results, err := p.Invoke(ctx, streamCall, rpc.ReservedMethodSignature, []interface{}{&method})
 	if err != nil {
 		return empty, err
 	}
 	if len(results) != 2 {
-		return empty, verror.New(errBadNumberOfResults, call.Context(), len(results))
+		return empty, verror.New(errBadNumberOfResults, ctx, len(results))
 	}
 	if results[1] != nil {
 		err, ok := results[1].(error)
 		if !ok {
-			return empty, verror.New(errBadErrorType, call.Context(), fmt.Sprintf("%T", err))
+			return empty, verror.New(errBadErrorType, ctx, fmt.Sprintf("%T", err))
 		}
 		return empty, err
 	}
@@ -207,7 +206,7 @@
 	if results[0] != nil {
 		sig, ok := results[0].(signature.Method)
 		if !ok {
-			return empty, verror.New(errWantSigMethod, call.Context(), fmt.Sprintf("%T", sig))
+			return empty, verror.New(errWantSigMethod, ctx, fmt.Sprintf("%T", sig))
 		}
 	}
 	return res, nil
@@ -231,10 +230,10 @@
 	return nil
 }
 
-func (p *proxyInvoker) Glob__(serverCall rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (p *proxyInvoker) Glob__(ctx *context.T, serverCall rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	ch := make(chan naming.GlobReply)
 	go func() {
-		p.Invoke(rpc.GlobMethod, &call{serverCall, ch}, []interface{}{&pattern})
+		p.Invoke(ctx, &call{serverCall, ch}, rpc.GlobMethod, []interface{}{&pattern})
 		close(ch)
 	}()
 	return ch, nil
diff --git a/services/device/internal/impl/proxy_invoker_test.go b/services/device/internal/impl/proxy_invoker_test.go
index 5f8f002..8cb7bf7 100644
--- a/services/device/internal/impl/proxy_invoker_test.go
+++ b/services/device/internal/impl/proxy_invoker_test.go
@@ -9,14 +9,13 @@
 	"testing"
 
 	"v.io/v23"
+	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/v23/security/access"
 	"v.io/v23/services/stats"
-
 	"v.io/x/lib/vlog"
-
 	"v.io/x/ref/test"
 	"v.io/x/ref/test/testutil"
 )
@@ -84,7 +83,7 @@
 
 type dummy struct{}
 
-func (*dummy) Method(_ rpc.ServerCall) error { return nil }
+func (*dummy) Method(*context.T, rpc.ServerCall) error { return nil }
 
 type proxyDispatcher struct {
 	remote string
diff --git a/services/discharger/discharger.vdl.go b/services/discharger/discharger.vdl.go
index 2882e65..ce2745f 100644
--- a/services/discharger/discharger.vdl.go
+++ b/services/discharger/discharger.vdl.go
@@ -74,7 +74,7 @@
 	// Discharge is called by a principal that holds a blessing with a third
 	// party caveat and seeks to get a discharge that proves the fulfillment of
 	// this caveat.
-	Discharge(call rpc.ServerCall, Caveat security.Caveat, Impetus security.DischargeImpetus) (Discharge security.Discharge, err error)
+	Discharge(ctx *context.T, call rpc.ServerCall, Caveat security.Caveat, Impetus security.DischargeImpetus) (Discharge security.Discharge, err error)
 }
 
 // DischargerServerStubMethods is the server interface containing
@@ -112,8 +112,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implDischargerServerStub) Discharge(call rpc.ServerCall, i0 security.Caveat, i1 security.DischargeImpetus) (security.Discharge, error) {
-	return s.impl.Discharge(call, i0, i1)
+func (s implDischargerServerStub) Discharge(ctx *context.T, call rpc.ServerCall, i0 security.Caveat, i1 security.DischargeImpetus) (security.Discharge, error) {
+	return s.impl.Discharge(ctx, call, i0, i1)
 }
 
 func (s implDischargerServerStub) Globber() *rpc.GlobState {
diff --git a/services/groups/internal/server/group.go b/services/groups/internal/server/group.go
index 2d04399..1e718f2 100644
--- a/services/groups/internal/server/group.go
+++ b/services/groups/internal/server/group.go
@@ -5,6 +5,7 @@
 package server
 
 import (
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/v23/security/access"
@@ -26,23 +27,23 @@
 // It seems we need either (a) identity providers to manage group servers and
 // reserve buckets for users they've blessed, or (b) some way to determine the
 // user name from a blessing and enforce that group names start with user names.
-func (g *group) Create(call rpc.ServerCall, acl access.Permissions, entries []groups.BlessingPatternChunk) error {
+func (g *group) Create(ctx *context.T, _ rpc.ServerCall, acl access.Permissions, entries []groups.BlessingPatternChunk) error {
 	// Perform AccessList check.
 	// TODO(sadovsky): Enable this AccessList check and acquire a lock on the group
 	// server AccessList.
 	if false {
-		if err := g.authorize(call, g.m.acl); err != nil {
+		if err := g.authorize(ctx, g.m.acl); err != nil {
 			return err
 		}
 	}
 	if acl == nil {
 		acl = access.Permissions{}
-		blessings, _ := security.RemoteBlessingNames(call.Context())
+		blessings, _ := security.RemoteBlessingNames(ctx)
 		if len(blessings) == 0 {
 			// The blessings presented by the caller do not give it a name for this
 			// operation. We could create a world-accessible group, but it seems safer
 			// to return an error.
-			return groups.NewErrNoBlessings(call.Context())
+			return groups.NewErrNoBlessings(ctx)
 		}
 		for _, tag := range access.AllTypicalTags() {
 			for _, b := range blessings {
@@ -61,34 +62,34 @@
 		// opaque error. (That's not a great solution either. Having per-user
 		// buckets seems like a better solution.)
 		if _, ok := err.(*ErrKeyAlreadyExists); ok {
-			return verror.New(verror.ErrExist, call.Context(), g.name)
+			return verror.New(verror.ErrExist, ctx, g.name)
 		}
-		return verror.New(verror.ErrInternal, call.Context(), err)
+		return verror.New(verror.ErrInternal, ctx, err)
 	}
 	return nil
 }
 
-func (g *group) Delete(call rpc.ServerCall, version string) error {
-	return g.readModifyWrite(call, version, func(gd *groupData, versionSt string) error {
+func (g *group) Delete(ctx *context.T, _ rpc.ServerCall, version string) error {
+	return g.readModifyWrite(ctx, version, func(gd *groupData, versionSt string) error {
 		return g.m.st.Delete(g.name, versionSt)
 	})
 }
 
-func (g *group) Add(call rpc.ServerCall, entry groups.BlessingPatternChunk, version string) error {
-	return g.update(call, version, func(gd *groupData) {
+func (g *group) Add(ctx *context.T, _ rpc.ServerCall, entry groups.BlessingPatternChunk, version string) error {
+	return g.update(ctx, version, func(gd *groupData) {
 		gd.Entries[entry] = struct{}{}
 	})
 }
 
-func (g *group) Remove(call rpc.ServerCall, entry groups.BlessingPatternChunk, version string) error {
-	return g.update(call, version, func(gd *groupData) {
+func (g *group) Remove(ctx *context.T, _ rpc.ServerCall, entry groups.BlessingPatternChunk, version string) error {
+	return g.update(ctx, version, func(gd *groupData) {
 		delete(gd.Entries, entry)
 	})
 }
 
 // TODO(sadovsky): Replace fake implementation with real implementation.
-func (g *group) Get(call rpc.ServerCall, req groups.GetRequest, reqVersion string) (res groups.GetResponse, version string, err error) {
-	gd, version, err := g.getInternal(call)
+func (g *group) Get(ctx *context.T, _ rpc.ServerCall, req groups.GetRequest, reqVersion string) (res groups.GetResponse, version string, err error) {
+	gd, version, err := g.getInternal(ctx)
 	if err != nil {
 		return groups.GetResponse{}, "", err
 	}
@@ -96,22 +97,22 @@
 }
 
 // TODO(sadovsky): Replace fake implementation with real implementation.
-func (g *group) Rest(call rpc.ServerCall, req groups.RestRequest, reqVersion string) (res groups.RestResponse, version string, err error) {
-	_, version, err = g.getInternal(call)
+func (g *group) Rest(ctx *context.T, _ rpc.ServerCall, req groups.RestRequest, reqVersion string) (res groups.RestResponse, version string, err error) {
+	_, version, err = g.getInternal(ctx)
 	if err != nil {
 		return groups.RestResponse{}, "", err
 	}
 	return groups.RestResponse{}, version, nil
 }
 
-func (g *group) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
-	return g.update(call, version, func(gd *groupData) {
+func (g *group) SetPermissions(ctx *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
+	return g.update(ctx, version, func(gd *groupData) {
 		gd.AccessList = acl
 	})
 }
 
-func (g *group) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
-	gd, version, err := g.getInternal(call)
+func (g *group) GetPermissions(ctx *context.T, _ rpc.ServerCall) (acl access.Permissions, version string, err error) {
+	gd, version, err := g.getInternal(ctx)
 	if err != nil {
 		return nil, "", err
 	}
@@ -122,42 +123,42 @@
 // Internal helpers
 
 // Returns a VDL-compatible error.
-func (g *group) authorize(call rpc.ServerCall, acl access.Permissions) error {
+func (g *group) authorize(ctx *context.T, acl access.Permissions) error {
 	// TODO(sadovsky): We ignore the returned error since TypicalTagType is
 	// guaranteed to return a valid tagType. It would be nice to have an
 	// alternative function that assumes TypicalTagType, since presumably that's
 	// the overwhelmingly common case.
 	auth, _ := access.PermissionsAuthorizer(acl, access.TypicalTagType())
-	if err := auth.Authorize(call.Context()); err != nil {
+	if err := auth.Authorize(ctx); err != nil {
 		// TODO(sadovsky): Return NoAccess if appropriate.
-		return verror.New(verror.ErrNoExistOrNoAccess, call.Context(), err)
+		return verror.New(verror.ErrNoExistOrNoAccess, ctx, err)
 	}
 	return nil
 }
 
 // Returns a VDL-compatible error. Performs access check.
-func (g *group) getInternal(call rpc.ServerCall) (gd groupData, version string, err error) {
+func (g *group) getInternal(ctx *context.T) (gd groupData, version string, err error) {
 	v, version, err := g.m.st.Get(g.name)
 	if err != nil {
 		if _, ok := err.(*ErrUnknownKey); ok {
 			// TODO(sadovsky): Return NoExist if appropriate.
-			return groupData{}, "", verror.New(verror.ErrNoExistOrNoAccess, call.Context(), g.name)
+			return groupData{}, "", verror.New(verror.ErrNoExistOrNoAccess, ctx, g.name)
 		}
-		return groupData{}, "", verror.New(verror.ErrInternal, call.Context(), err)
+		return groupData{}, "", verror.New(verror.ErrInternal, ctx, err)
 	}
 	gd, ok := v.(groupData)
 	if !ok {
-		return groupData{}, "", verror.New(verror.ErrInternal, call.Context(), "bad value for key: "+g.name)
+		return groupData{}, "", verror.New(verror.ErrInternal, ctx, "bad value for key: "+g.name)
 	}
-	if err := g.authorize(call, gd.AccessList); err != nil {
+	if err := g.authorize(ctx, gd.AccessList); err != nil {
 		return groupData{}, "", err
 	}
 	return gd, version, nil
 }
 
 // Returns a VDL-compatible error. Performs access check.
-func (g *group) update(call rpc.ServerCall, version string, fn func(gd *groupData)) error {
-	return g.readModifyWrite(call, version, func(gd *groupData, versionSt string) error {
+func (g *group) update(ctx *context.T, version string, fn func(gd *groupData)) error {
+	return g.readModifyWrite(ctx, version, func(gd *groupData, versionSt string) error {
 		fn(gd)
 		return g.m.st.Update(g.name, *gd, versionSt)
 	})
@@ -166,30 +167,30 @@
 // Returns a VDL-compatible error. Performs access check.
 // fn should perform the "modify, write" part of "read, modify, write", and
 // should return a Store error.
-func (g *group) readModifyWrite(call rpc.ServerCall, version string, fn func(gd *groupData, versionSt string) error) error {
+func (g *group) readModifyWrite(ctx *context.T, version string, fn func(gd *groupData, versionSt string) error) error {
 	// Transaction retry loop.
 	for i := 0; i < 3; i++ {
-		gd, versionSt, err := g.getInternal(call)
+		gd, versionSt, err := g.getInternal(ctx)
 		if err != nil {
 			return err
 		}
 		// Fail early if possible.
 		if version != "" && version != versionSt {
-			return verror.NewErrBadVersion(call.Context())
+			return verror.NewErrBadVersion(ctx)
 		}
 		if err := fn(&gd, versionSt); err != nil {
 			if err, ok := err.(*ErrBadVersion); ok {
 				// Retry on version error if the original version was empty.
 				if version != "" {
-					return verror.NewErrBadVersion(call.Context())
+					return verror.NewErrBadVersion(ctx)
 				}
 			} else {
 				// Abort on non-version error.
-				return verror.New(verror.ErrInternal, call.Context(), err)
+				return verror.New(verror.ErrInternal, ctx, err)
 			}
 		} else {
 			return nil
 		}
 	}
-	return groups.NewErrExcessiveContention(call.Context())
+	return groups.NewErrExcessiveContention(ctx)
 }
diff --git a/services/identity/identity.vdl.go b/services/identity/identity.vdl.go
index ed3ada8..41b991c 100644
--- a/services/identity/identity.vdl.go
+++ b/services/identity/identity.vdl.go
@@ -98,7 +98,7 @@
 type OAuthBlesserServerMethods interface {
 	// BlessUsingAccessToken uses the provided access token to obtain the email
 	// address and returns a blessing along with the email address.
-	BlessUsingAccessToken(call rpc.ServerCall, token string) (blessing security.Blessings, email string, err error)
+	BlessUsingAccessToken(ctx *context.T, call rpc.ServerCall, token string) (blessing security.Blessings, email string, err error)
 }
 
 // OAuthBlesserServerStubMethods is the server interface containing
@@ -136,8 +136,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implOAuthBlesserServerStub) BlessUsingAccessToken(call rpc.ServerCall, i0 string) (security.Blessings, string, error) {
-	return s.impl.BlessUsingAccessToken(call, i0)
+func (s implOAuthBlesserServerStub) BlessUsingAccessToken(ctx *context.T, call rpc.ServerCall, i0 string) (security.Blessings, string, error) {
+	return s.impl.BlessUsingAccessToken(ctx, call, i0)
 }
 
 func (s implOAuthBlesserServerStub) Globber() *rpc.GlobState {
@@ -208,7 +208,7 @@
 type MacaroonBlesserServerMethods interface {
 	// Bless uses the provided macaroon (which contains email and caveats)
 	// to return a blessing for the client.
-	Bless(call rpc.ServerCall, macaroon string) (blessing security.Blessings, err error)
+	Bless(ctx *context.T, call rpc.ServerCall, macaroon string) (blessing security.Blessings, err error)
 }
 
 // MacaroonBlesserServerStubMethods is the server interface containing
@@ -246,8 +246,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implMacaroonBlesserServerStub) Bless(call rpc.ServerCall, i0 string) (security.Blessings, error) {
-	return s.impl.Bless(call, i0)
+func (s implMacaroonBlesserServerStub) Bless(ctx *context.T, call rpc.ServerCall, i0 string) (security.Blessings, error) {
+	return s.impl.Bless(ctx, call, i0)
 }
 
 func (s implMacaroonBlesserServerStub) Globber() *rpc.GlobState {
diff --git a/services/identity/internal/blesser/macaroon.go b/services/identity/internal/blesser/macaroon.go
index 60ca742..55ef0d4 100644
--- a/services/identity/internal/blesser/macaroon.go
+++ b/services/identity/internal/blesser/macaroon.go
@@ -12,6 +12,7 @@
 	"v.io/x/ref/services/identity/internal/oauth"
 	"v.io/x/ref/services/identity/internal/util"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/v23/vom"
@@ -27,8 +28,8 @@
 	return identity.MacaroonBlesserServer(&macaroonBlesser{key})
 }
 
-func (b *macaroonBlesser) Bless(call rpc.ServerCall, macaroon string) (security.Blessings, error) {
-	secCall := security.GetCall(call.Context())
+func (b *macaroonBlesser) Bless(ctx *context.T, _ rpc.ServerCall, macaroon string) (security.Blessings, error) {
+	secCall := security.GetCall(ctx)
 	var empty security.Blessings
 	inputs, err := util.Macaroon(macaroon).Decode(b.key)
 	if err != nil {
diff --git a/services/identity/internal/blesser/macaroon_test.go b/services/identity/internal/blesser/macaroon_test.go
index 91be9d1..51fe4ea 100644
--- a/services/identity/internal/blesser/macaroon_test.go
+++ b/services/identity/internal/blesser/macaroon_test.go
@@ -23,7 +23,7 @@
 		key            = make([]byte, 16)
 		provider, user = testutil.NewPrincipal(), testutil.NewPrincipal()
 		cOnlyMethodFoo = newCaveat(security.MethodCaveat("Foo"))
-		call           = fakeCall(provider, user)
+		ctx            = fakeContext(provider, user)
 	)
 	if _, err := rand.Read(key); err != nil {
 		t.Fatal(err)
@@ -32,11 +32,11 @@
 
 	m := oauth.BlessingMacaroon{Creation: time.Now().Add(-1 * time.Hour), Name: "foo"}
 	wantErr := "macaroon has expired"
-	if _, err := blesser.Bless(call, newMacaroon(t, key, m)); err == nil || err.Error() != wantErr {
+	if _, err := blesser.Bless(ctx, nil, newMacaroon(t, key, m)); err == nil || err.Error() != wantErr {
 		t.Errorf("Bless(...) failed with error: %v, want: %v", err, wantErr)
 	}
 	m = oauth.BlessingMacaroon{Creation: time.Now(), Name: "user", Caveats: []security.Caveat{cOnlyMethodFoo}}
-	b, err := blesser.Bless(call, newMacaroon(t, key, m))
+	b, err := blesser.Bless(ctx, nil, newMacaroon(t, key, m))
 	if err != nil {
 		t.Errorf("Bless failed: %v", err)
 	}
diff --git a/services/identity/internal/blesser/oauth.go b/services/identity/internal/blesser/oauth.go
index 7dbd413..a51246f 100644
--- a/services/identity/internal/blesser/oauth.go
+++ b/services/identity/internal/blesser/oauth.go
@@ -14,6 +14,7 @@
 	"v.io/x/ref/services/identity/internal/revocation"
 	"v.io/x/ref/services/identity/internal/util"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 )
@@ -62,13 +63,13 @@
 	})
 }
 
-func (b *oauthBlesser) BlessUsingAccessToken(call rpc.ServerCall, accessToken string) (security.Blessings, string, error) {
+func (b *oauthBlesser) BlessUsingAccessToken(ctx *context.T, _ rpc.ServerCall, accessToken string) (security.Blessings, string, error) {
 	var noblessings security.Blessings
 	email, clientName, err := b.oauthProvider.GetEmailAndClientName(accessToken, b.accessTokenClients)
 	if err != nil {
 		return noblessings, "", err
 	}
-	return b.bless(security.GetCall(call.Context()), email, clientName)
+	return b.bless(security.GetCall(ctx), email, clientName)
 }
 
 func (b *oauthBlesser) bless(call security.Call, email, clientName string) (security.Blessings, string, error) {
diff --git a/services/identity/internal/blesser/oauth_test.go b/services/identity/internal/blesser/oauth_test.go
index ff593db..78c2064 100644
--- a/services/identity/internal/blesser/oauth_test.go
+++ b/services/identity/internal/blesser/oauth_test.go
@@ -18,14 +18,14 @@
 func TestOAuthBlesser(t *testing.T) {
 	var (
 		provider, user = testutil.NewPrincipal(), testutil.NewPrincipal()
-		call           = fakeCall(provider, user)
+		ctx            = fakeContext(provider, user)
 	)
 	blesser := NewOAuthBlesserServer(OAuthBlesserParams{
 		OAuthProvider:    oauth.NewMockOAuth(),
 		BlessingDuration: time.Hour,
 	})
 
-	b, extension, err := blesser.BlessUsingAccessToken(call, "test-access-token")
+	b, extension, err := blesser.BlessUsingAccessToken(ctx, nil, "test-access-token")
 	if err != nil {
 		t.Errorf("BlessUsingAccessToken failed: %v", err)
 	}
diff --git a/services/identity/internal/blesser/util_test.go b/services/identity/internal/blesser/util_test.go
index 1b6bd9d..f5b18de 100644
--- a/services/identity/internal/blesser/util_test.go
+++ b/services/identity/internal/blesser/util_test.go
@@ -6,28 +6,19 @@
 
 import (
 	"v.io/v23/context"
-	"v.io/v23/rpc"
 	"v.io/v23/security"
 )
 
-type serverCall struct {
-	rpc.StreamServerCall
-	context *context.T
-}
-
-func fakeCall(provider, user security.Principal) rpc.StreamServerCall {
+func fakeContext(provider, user security.Principal) *context.T {
 	secCall := security.NewCall(&security.CallParams{
 		LocalPrincipal:  provider,
 		LocalBlessings:  blessSelf(provider, "provider"),
 		RemoteBlessings: blessSelf(user, "self-signed-user"),
 	})
 	ctx, _ := context.RootContext()
-	ctx = security.SetCall(ctx, secCall)
-	return &serverCall{context: ctx}
+	return security.SetCall(ctx, secCall)
 }
 
-func (c *serverCall) Context() *context.T { return c.context }
-
 func blessSelf(p security.Principal, name string) security.Blessings {
 	b, err := p.BlessSelf(name)
 	if err != nil {
diff --git a/services/identity/internal/dischargerlib/discharger.go b/services/identity/internal/dischargerlib/discharger.go
index 1c3e405..12a33cb 100644
--- a/services/identity/internal/dischargerlib/discharger.go
+++ b/services/identity/internal/dischargerlib/discharger.go
@@ -8,6 +8,7 @@
 	"fmt"
 	"time"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/x/ref/services/discharger"
@@ -17,12 +18,11 @@
 // namespace with no additional caveats iff the caveat is valid.
 type dischargerd struct{}
 
-func (dischargerd) Discharge(call rpc.ServerCall, caveat security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
-	ctx := call.Context()
+func (dischargerd) Discharge(ctx *context.T, _ rpc.ServerCall, caveat security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	secCall := security.GetCall(ctx)
 	tp := caveat.ThirdPartyDetails()
 	if tp == nil {
-		return security.Discharge{}, discharger.NewErrNotAThirdPartyCaveat(call.Context(), caveat)
+		return security.Discharge{}, discharger.NewErrNotAThirdPartyCaveat(ctx, caveat)
 	}
 	if err := tp.Dischargeable(ctx); err != nil {
 		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
diff --git a/services/internal/acls/aclaccess.go b/services/internal/acls/aclaccess.go
index 9be795e..389fb34 100644
--- a/services/internal/acls/aclaccess.go
+++ b/services/internal/acls/aclaccess.go
@@ -14,7 +14,7 @@
 	"path/filepath"
 	"sync"
 
-	"v.io/v23/rpc"
+	"v.io/v23/context"
 	"v.io/v23/security"
 	"v.io/v23/security/access"
 	"v.io/v23/verror"
@@ -202,9 +202,9 @@
 // authorization policy (i.e., the AccessList is matched by all blessings
 // that are either extensions of one of the local blessings or can be
 // extended to form one of the local blessings.)
-func NilAuthPermissions(call rpc.ServerCall) access.Permissions {
+func NilAuthPermissions(ctx *context.T) access.Permissions {
 	tam := make(access.Permissions)
-	lb := security.LocalBlessingNames(call.Context())
+	lb := security.LocalBlessingNames(ctx)
 	for _, p := range PrefixPatterns(lb) {
 		for _, tag := range access.AllTypicalTags() {
 			tam.Add(p, string(tag))
diff --git a/services/internal/binarylib/service.go b/services/internal/binarylib/service.go
index 6fe0418..d5d015e 100644
--- a/services/internal/binarylib/service.go
+++ b/services/internal/binarylib/service.go
@@ -40,6 +40,7 @@
 	"strings"
 	"syscall"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/security"
 	"v.io/v23/security/access"
@@ -92,47 +93,47 @@
 
 const BufferLength = 4096
 
-func (i *binaryService) Create(call rpc.ServerCall, nparts int32, mediaInfo repository.MediaInfo) error {
+func (i *binaryService) Create(ctx *context.T, _ rpc.ServerCall, nparts int32, mediaInfo repository.MediaInfo) error {
 	vlog.Infof("%v.Create(%v, %v)", i.suffix, nparts, mediaInfo)
 	if nparts < 1 {
-		return verror.New(ErrInvalidParts, call.Context())
+		return verror.New(ErrInvalidParts, ctx)
 	}
 	parent, perm := filepath.Dir(i.path), os.FileMode(0700)
 	if err := os.MkdirAll(parent, perm); err != nil {
 		vlog.Errorf("MkdirAll(%v, %v) failed: %v", parent, perm, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	prefix := "creating-"
 	tmpDir, err := ioutil.TempDir(parent, prefix)
 	if err != nil {
 		vlog.Errorf("TempDir(%v, %v) failed: %v", parent, prefix, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	nameFile := filepath.Join(tmpDir, nameFileName)
 	if err := ioutil.WriteFile(nameFile, []byte(i.suffix), os.FileMode(0600)); err != nil {
 		vlog.Errorf("WriteFile(%q) failed: %v", nameFile)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 
-	rb, _ := security.RemoteBlessingNames(call.Context())
+	rb, _ := security.RemoteBlessingNames(ctx)
 	if len(rb) == 0 {
 		// None of the client's blessings are valid.
-		return verror.New(ErrNotAuthorized, call.Context())
+		return verror.New(ErrNotAuthorized, ctx)
 	}
 	if err := i.aclstore.Set(aclPath(i.state.rootDir, i.suffix), acls.PermissionsForBlessings(rb), ""); err != nil {
 		vlog.Errorf("insertAccessLists(%v) failed: %v", rb, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 
 	infoFile := filepath.Join(tmpDir, mediaInfoFileName)
 	jInfo, err := json.Marshal(mediaInfo)
 	if err != nil {
 		vlog.Errorf("json.Marshal(%v) failed: %v", mediaInfo, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	if err := ioutil.WriteFile(infoFile, jInfo, os.FileMode(0600)); err != nil {
 		vlog.Errorf("WriteFile(%q) failed: %v", infoFile, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	for j := 0; j < int(nparts); j++ {
 		partPath, partPerm := generatePartPath(tmpDir, j), os.FileMode(0700)
@@ -141,7 +142,7 @@
 			if err := os.RemoveAll(tmpDir); err != nil {
 				vlog.Errorf("RemoveAll(%v) failed: %v", tmpDir, err)
 			}
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 	}
 	// Use os.Rename() to atomically create the binary directory
@@ -153,33 +154,33 @@
 			}
 		}()
 		if linkErr, ok := err.(*os.LinkError); ok && linkErr.Err == syscall.ENOTEMPTY {
-			return verror.New(verror.ErrExist, call.Context(), i.path)
+			return verror.New(verror.ErrExist, ctx, i.path)
 		}
 		vlog.Errorf("Rename(%v, %v) failed: %v", tmpDir, i.path, err)
-		return verror.New(ErrOperationFailed, call.Context(), i.path)
+		return verror.New(ErrOperationFailed, ctx, i.path)
 	}
 	return nil
 }
 
-func (i *binaryService) Delete(call rpc.ServerCall) error {
+func (i *binaryService) Delete(ctx *context.T, _ rpc.ServerCall) error {
 	vlog.Infof("%v.Delete()", i.suffix)
 	if _, err := os.Stat(i.path); err != nil {
 		if os.IsNotExist(err) {
-			return verror.New(verror.ErrNoExist, call.Context(), i.path)
+			return verror.New(verror.ErrNoExist, ctx, i.path)
 		}
 		vlog.Errorf("Stat(%v) failed: %v", i.path, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	// Use os.Rename() to atomically remove the binary directory
 	// structure.
 	path := filepath.Join(filepath.Dir(i.path), "removing-"+filepath.Base(i.path))
 	if err := os.Rename(i.path, path); err != nil {
 		vlog.Errorf("Rename(%v, %v) failed: %v", i.path, path, err)
-		return verror.New(ErrOperationFailed, call.Context(), i.path)
+		return verror.New(ErrOperationFailed, ctx, i.path)
 	}
 	if err := os.RemoveAll(path); err != nil {
 		vlog.Errorf("Remove(%v) failed: %v", path, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	for {
 		// Remove the binary and all directories on the path back to the
@@ -193,13 +194,13 @@
 				break
 			}
 			vlog.Errorf("Remove(%v) failed: %v", path, err)
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 	}
 	return nil
 }
 
-func (i *binaryService) Download(call repository.BinaryDownloadServerCall, part int32) error {
+func (i *binaryService) Download(ctx *context.T, call repository.BinaryDownloadServerCall, part int32) error {
 	vlog.Infof("%v.Download(%v)", i.suffix, part)
 	path := i.generatePartPath(int(part))
 	if err := checksumExists(path); err != nil {
@@ -209,7 +210,7 @@
 	file, err := os.Open(dataPath)
 	if err != nil {
 		vlog.Errorf("Open(%v) failed: %v", dataPath, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	defer file.Close()
 	buffer := make([]byte, BufferLength)
@@ -218,14 +219,14 @@
 		n, err := file.Read(buffer)
 		if err != nil && err != io.EOF {
 			vlog.Errorf("Read() failed: %v", err)
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 		if n == 0 {
 			break
 		}
 		if err := sender.Send(buffer[:n]); err != nil {
 			vlog.Errorf("Send() failed: %v", err)
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 	}
 	return nil
@@ -233,12 +234,12 @@
 
 // TODO(jsimsa): Design and implement an access control mechanism for
 // the URL-based downloads.
-func (i *binaryService) DownloadUrl(rpc.ServerCall) (string, int64, error) {
+func (i *binaryService) DownloadUrl(*context.T, rpc.ServerCall) (string, int64, error) {
 	vlog.Infof("%v.DownloadUrl()", i.suffix)
 	return i.state.rootURL + "/" + i.suffix, 0, nil
 }
 
-func (i *binaryService) Stat(call rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
+func (i *binaryService) Stat(ctx *context.T, _ rpc.ServerCall) ([]binary.PartInfo, repository.MediaInfo, error) {
 	vlog.Infof("%v.Stat()", i.suffix)
 	result := make([]binary.PartInfo, 0)
 	parts, err := getParts(i.path)
@@ -254,7 +255,7 @@
 				continue
 			}
 			vlog.Errorf("ReadFile(%v) failed: %v", checksumFile, err)
-			return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, call.Context())
+			return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, ctx)
 		}
 		dataFile := filepath.Join(part, dataFileName)
 		fi, err := os.Stat(dataFile)
@@ -264,7 +265,7 @@
 				continue
 			}
 			vlog.Errorf("Stat(%v) failed: %v", dataFile, err)
-			return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, call.Context())
+			return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, ctx)
 		}
 		result = append(result, binary.PartInfo{Checksum: string(bytes), Size: fi.Size()})
 	}
@@ -272,22 +273,22 @@
 	jInfo, err := ioutil.ReadFile(infoFile)
 	if err != nil {
 		vlog.Errorf("ReadFile(%q) failed: %v", infoFile)
-		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, call.Context())
+		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, ctx)
 	}
 	var mediaInfo repository.MediaInfo
 	if err := json.Unmarshal(jInfo, &mediaInfo); err != nil {
 		vlog.Errorf("json.Unmarshal(%v) failed: %v", jInfo, err)
-		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, call.Context())
+		return []binary.PartInfo{}, repository.MediaInfo{}, verror.New(ErrOperationFailed, ctx)
 	}
 	return result, mediaInfo, nil
 }
 
-func (i *binaryService) Upload(call repository.BinaryUploadServerCall, part int32) error {
+func (i *binaryService) Upload(ctx *context.T, call repository.BinaryUploadServerCall, part int32) error {
 	vlog.Infof("%v.Upload(%v)", i.suffix, part)
 	path, suffix := i.generatePartPath(int(part)), ""
 	err := checksumExists(path)
 	if err == nil {
-		return verror.New(verror.ErrExist, call.Context(), path)
+		return verror.New(verror.ErrExist, ctx, path)
 	} else if verror.ErrorID(err) != verror.ErrNoExist.ID {
 		return err
 	}
@@ -296,17 +297,17 @@
 	lockFile, err := os.OpenFile(lockPath, flags, perm)
 	if err != nil {
 		if os.IsExist(err) {
-			return verror.New(ErrInProgress, call.Context(), path)
+			return verror.New(ErrInProgress, ctx, path)
 		}
 		vlog.Errorf("OpenFile(%v, %v, %v) failed: %v", lockPath, flags, suffix, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	defer os.Remove(lockFile.Name())
 	defer lockFile.Close()
 	file, err := ioutil.TempFile(path, suffix)
 	if err != nil {
 		vlog.Errorf("TempFile(%v, %v) failed: %v", path, suffix, err)
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	defer file.Close()
 	h := md5.New()
@@ -318,7 +319,7 @@
 			if err := os.Remove(file.Name()); err != nil {
 				vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 			}
-			return verror.New(ErrOperationFailed, call.Context())
+			return verror.New(ErrOperationFailed, ctx)
 		}
 		h.Write(bytes)
 	}
@@ -328,7 +329,7 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 
 	hash := hex.EncodeToString(h.Sum(nil))
@@ -338,7 +339,7 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	dataFile := filepath.Join(path, dataFileName)
 	if err := os.Rename(file.Name(), dataFile); err != nil {
@@ -346,19 +347,19 @@
 		if err := os.Remove(file.Name()); err != nil {
 			vlog.Errorf("Remove(%v) failed: %v", file.Name(), err)
 		}
-		return verror.New(ErrOperationFailed, call.Context())
+		return verror.New(ErrOperationFailed, ctx)
 	}
 	return nil
 }
 
-func (i *binaryService) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
+func (i *binaryService) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
 	elems := strings.Split(i.suffix, "/")
 	if len(elems) == 1 && elems[0] == "" {
 		elems = nil
 	}
 	n := i.createObjectNameTree().find(elems, false)
 	if n == nil {
-		return nil, verror.New(ErrOperationFailed, call.Context())
+		return nil, verror.New(ErrOperationFailed, ctx)
 	}
 	ch := make(chan string)
 	go func() {
@@ -370,17 +371,15 @@
 	return ch, nil
 }
 
-func (i *binaryService) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
-
+func (i *binaryService) GetPermissions(ctx *context.T, call rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	acl, version, err = i.aclstore.Get(aclPath(i.state.rootDir, i.suffix))
-
 	if os.IsNotExist(err) {
 		// No AccessList file found which implies a nil authorizer. This results in default authorization.
-		return acls.NilAuthPermissions(call), "", nil
+		return acls.NilAuthPermissions(ctx), "", nil
 	}
 	return acl, version, err
 }
 
-func (i *binaryService) SetPermissions(_ rpc.ServerCall, acl access.Permissions, version string) error {
+func (i *binaryService) SetPermissions(_ *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
 	return i.aclstore.Set(aclPath(i.state.rootDir, i.suffix), acl, version)
 }
diff --git a/services/internal/logreaderlib/logfile.go b/services/internal/logreaderlib/logfile.go
index 77d22e3..dafd11d 100644
--- a/services/internal/logreaderlib/logfile.go
+++ b/services/internal/logreaderlib/logfile.go
@@ -15,6 +15,7 @@
 	"path/filepath"
 	"strings"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	"v.io/v23/services/logreader"
 	"v.io/v23/verror"
@@ -56,7 +57,7 @@
 }
 
 // Size returns the size of the log file, in bytes.
-func (i *logfileService) Size(call rpc.ServerCall) (int64, error) {
+func (i *logfileService) Size(ctx *context.T, _ rpc.ServerCall) (int64, error) {
 	vlog.VI(1).Infof("%v.Size()", i.suffix)
 	fname, err := translateNameToFilename(i.root, i.suffix)
 	if err != nil {
@@ -65,19 +66,19 @@
 	fi, err := os.Stat(fname)
 	if err != nil {
 		if os.IsNotExist(err) {
-			return 0, verror.New(verror.ErrNoExist, call.Context(), fname)
+			return 0, verror.New(verror.ErrNoExist, ctx, fname)
 		}
 		vlog.Errorf("Stat(%v) failed: %v", fname, err)
-		return 0, verror.New(errOperationFailed, call.Context(), fname)
+		return 0, verror.New(errOperationFailed, ctx, fname)
 	}
 	if fi.IsDir() {
-		return 0, verror.New(errOperationFailed, call.Context(), fname)
+		return 0, verror.New(errOperationFailed, ctx, fname)
 	}
 	return fi.Size(), nil
 }
 
 // ReadLog returns log entries from the log file.
-func (i *logfileService) ReadLog(call logreader.LogFileReadLogServerCall, startpos int64, numEntries int32, follow bool) (int64, error) {
+func (i *logfileService) ReadLog(ctx *context.T, call logreader.LogFileReadLogServerCall, startpos int64, numEntries int32, follow bool) (int64, error) {
 	vlog.VI(1).Infof("%v.ReadLog(%v, %v, %v)", i.suffix, startpos, numEntries, follow)
 	fname, err := translateNameToFilename(i.root, i.suffix)
 	if err != nil {
@@ -86,11 +87,11 @@
 	f, err := os.Open(fname)
 	if err != nil {
 		if os.IsNotExist(err) {
-			return 0, verror.New(verror.ErrNoExist, call.Context(), fname)
+			return 0, verror.New(verror.ErrNoExist, ctx, fname)
 		}
-		return 0, verror.New(errOperationFailed, call.Context(), fname)
+		return 0, verror.New(errOperationFailed, ctx, fname)
 	}
-	reader := newFollowReader(call, f, startpos, follow)
+	reader := newFollowReader(ctx, f, startpos, follow)
 	if numEntries == logreader.AllEntries {
 		numEntries = int32(math.MaxInt32)
 	}
@@ -100,10 +101,10 @@
 			return reader.tell(), nil
 		}
 		if err == io.EOF {
-			return reader.tell(), verror.NewErrEndOfFile(call.Context())
+			return reader.tell(), verror.NewErrEndOfFile(ctx)
 		}
 		if err != nil {
-			return reader.tell(), verror.New(errOperationFailed, call.Context(), fname)
+			return reader.tell(), verror.New(errOperationFailed, ctx, fname)
 		}
 		if err := call.SendStream().Send(logreader.LogEntry{Position: offset, Line: line}); err != nil {
 			return reader.tell(), err
@@ -114,7 +115,7 @@
 
 // GlobChildren__ returns the list of files in a directory streamed on a
 // channel. The list is empty if the object is a file.
-func (i *logfileService) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
+func (i *logfileService) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
 	vlog.VI(1).Infof("%v.GlobChildren__()", i.suffix)
 	dirName, err := translateNameToFilename(i.root, i.suffix)
 	if err != nil {
@@ -123,9 +124,9 @@
 	stat, err := os.Stat(dirName)
 	if err != nil {
 		if os.IsNotExist(err) {
-			return nil, verror.New(verror.ErrNoExist, call.Context(), dirName)
+			return nil, verror.New(verror.ErrNoExist, ctx, dirName)
 		}
-		return nil, verror.New(errOperationFailed, call.Context(), dirName)
+		return nil, verror.New(errOperationFailed, ctx, dirName)
 	}
 	if !stat.IsDir() {
 		return nil, nil
diff --git a/services/internal/logreaderlib/reader.go b/services/internal/logreaderlib/reader.go
index 9cc23f4..724409b 100644
--- a/services/internal/logreaderlib/reader.go
+++ b/services/internal/logreaderlib/reader.go
@@ -10,7 +10,7 @@
 	"strings"
 	"time"
 
-	"v.io/v23/rpc"
+	"v.io/v23/context"
 	"v.io/v23/verror"
 )
 
@@ -19,7 +19,7 @@
 // - it aborts when the parent RPC is canceled.
 type followReader struct {
 	reader io.ReadSeeker
-	call   rpc.ServerCall
+	ctx    *context.T
 	offset int64
 	follow bool
 	err    error
@@ -27,11 +27,11 @@
 }
 
 // newFollowReader is the factory for followReader.
-func newFollowReader(call rpc.ServerCall, reader io.ReadSeeker, startpos int64, follow bool) *followReader {
+func newFollowReader(ctx *context.T, reader io.ReadSeeker, startpos int64, follow bool) *followReader {
 	_, err := reader.Seek(startpos, 0)
 	return &followReader{
 		reader: reader,
-		call:   call,
+		ctx:    ctx,
 		offset: startpos,
 		follow: follow,
 		err:    err,
@@ -48,10 +48,10 @@
 		return 0, f.err
 	}
 	for {
-		if f.call != nil {
+		if f.ctx != nil {
 			select {
-			case <-f.call.Context().Done():
-				return 0, verror.New(verror.ErrCanceled, nil)
+			case <-f.ctx.Done():
+				return 0, verror.New(verror.ErrCanceled, f.ctx)
 			default:
 			}
 		}
diff --git a/services/internal/pproflib/server.go b/services/internal/pproflib/server.go
index f8e6642..1866e6e 100644
--- a/services/internal/pproflib/server.go
+++ b/services/internal/pproflib/server.go
@@ -10,6 +10,7 @@
 	"runtime/pprof"
 	"time"
 
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	s_pprof "v.io/v23/services/pprof"
 	"v.io/v23/verror"
@@ -32,12 +33,12 @@
 }
 
 // CmdLine returns the command-line argument of the server.
-func (pprofService) CmdLine(rpc.ServerCall) ([]string, error) {
+func (pprofService) CmdLine(*context.T, rpc.ServerCall) ([]string, error) {
 	return os.Args, nil
 }
 
 // Profiles returns the list of available profiles.
-func (pprofService) Profiles(rpc.ServerCall) ([]string, error) {
+func (pprofService) Profiles(*context.T, rpc.ServerCall) ([]string, error) {
 	profiles := pprof.Profiles()
 	results := make([]string, len(profiles))
 	for i, v := range profiles {
@@ -51,25 +52,25 @@
 // addresses that pprof needs. Passing debug=1 adds comments translating
 // addresses to function names and line numbers, so that a programmer
 // can read the profile without tools.
-func (pprofService) Profile(call s_pprof.PProfProfileServerCall, name string, debug int32) error {
+func (pprofService) Profile(ctx *context.T, call s_pprof.PProfProfileServerCall, name string, debug int32) error {
 	profile := pprof.Lookup(name)
 	if profile == nil {
-		return verror.New(errNoProfile, call.Context(), name)
+		return verror.New(errNoProfile, ctx, name)
 	}
 	if err := profile.WriteTo(&streamWriter{call.SendStream()}, int(debug)); err != nil {
-		return verror.Convert(verror.ErrUnknown, call.Context(), err)
+		return verror.Convert(verror.ErrUnknown, ctx, err)
 	}
 	return nil
 }
 
 // CPUProfile enables CPU profiling for the requested duration and
 // streams the profile data.
-func (pprofService) CpuProfile(call s_pprof.PProfCpuProfileServerCall, seconds int32) error {
+func (pprofService) CpuProfile(ctx *context.T, call s_pprof.PProfCpuProfileServerCall, seconds int32) error {
 	if seconds <= 0 || seconds > 3600 {
-		return verror.New(errInvalidSeconds, call.Context(), seconds)
+		return verror.New(errInvalidSeconds, ctx, seconds)
 	}
 	if err := pprof.StartCPUProfile(&streamWriter{call.SendStream()}); err != nil {
-		return verror.Convert(verror.ErrUnknown, call.Context(), err)
+		return verror.Convert(verror.ErrUnknown, ctx, err)
 	}
 	time.Sleep(time.Duration(seconds) * time.Second)
 	pprof.StopCPUProfile()
@@ -78,7 +79,7 @@
 
 // Symbol looks up the program counters and returns their respective
 // function names.
-func (pprofService) Symbol(_ rpc.ServerCall, programCounters []uint64) ([]string, error) {
+func (pprofService) Symbol(_ *context.T, _ rpc.ServerCall, programCounters []uint64) ([]string, error) {
 	results := make([]string, len(programCounters))
 	for i, v := range programCounters {
 		f := runtime.FuncForPC(uintptr(v))
diff --git a/services/internal/statslib/stats.go b/services/internal/statslib/stats.go
index 0433763..e2d375e 100644
--- a/services/internal/statslib/stats.go
+++ b/services/internal/statslib/stats.go
@@ -10,8 +10,7 @@
 	"reflect"
 	"time"
 
-	libstats "v.io/x/ref/lib/stats"
-
+	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/v23/services/stats"
@@ -19,6 +18,7 @@
 	"v.io/v23/vdl"
 	"v.io/v23/verror"
 	"v.io/x/lib/vlog"
+	libstats "v.io/x/ref/lib/stats"
 )
 
 type statsService struct {
@@ -39,7 +39,7 @@
 }
 
 // Glob__ returns the name of all objects that match pattern.
-func (i *statsService) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (i *statsService) Glob__(ctx *context.T, call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	vlog.VI(1).Infof("%v.Glob__(%q)", i.suffix, pattern)
 
 	ch := make(chan naming.GlobReply)
@@ -58,7 +58,7 @@
 
 // WatchGlob returns the name and value of the objects that match the request,
 // followed by periodic updates when values change.
-func (i *statsService) WatchGlob(call watch.GlobWatcherWatchGlobServerCall, req watch.GlobRequest) error {
+func (i *statsService) WatchGlob(ctx *context.T, call watch.GlobWatcherWatchGlobServerCall, req watch.GlobRequest) error {
 	vlog.VI(1).Infof("%v.WatchGlob(%+v)", i.suffix, req)
 
 	var t time.Time
@@ -79,9 +79,9 @@
 		}
 		if err := it.Err(); err != nil {
 			if verror.ErrorID(err) == verror.ErrNoExist.ID {
-				return verror.New(verror.ErrNoExist, call.Context(), i.suffix)
+				return verror.New(verror.ErrNoExist, ctx, i.suffix)
 			}
-			return verror.New(errOperationFailed, call.Context(), i.suffix)
+			return verror.New(errOperationFailed, ctx, i.suffix)
 		}
 		for _, change := range changes {
 			if err := call.SendStream().Send(change); err != nil {
@@ -89,7 +89,7 @@
 			}
 		}
 		select {
-		case <-call.Context().Done():
+		case <-ctx.Done():
 			break Loop
 		case <-time.After(i.watchFreq):
 		}
@@ -98,21 +98,21 @@
 }
 
 // Value returns the value of the receiver object.
-func (i *statsService) Value(call rpc.ServerCall) (*vdl.Value, error) {
+func (i *statsService) Value(ctx *context.T, _ rpc.ServerCall) (*vdl.Value, error) {
 	vlog.VI(1).Infof("%v.Value()", i.suffix)
 
 	rv, err := libstats.Value(i.suffix)
 	switch {
 	case verror.ErrorID(err) == verror.ErrNoExist.ID:
-		return nil, verror.New(verror.ErrNoExist, call.Context(), i.suffix)
+		return nil, verror.New(verror.ErrNoExist, ctx, i.suffix)
 	case verror.ErrorID(err) == stats.ErrNoValue.ID:
-		return nil, stats.NewErrNoValue(call.Context(), i.suffix)
+		return nil, stats.NewErrNoValue(ctx, i.suffix)
 	case err != nil:
-		return nil, verror.New(errOperationFailed, call.Context(), i.suffix)
+		return nil, verror.New(errOperationFailed, ctx, i.suffix)
 	}
 	vv, err := vdl.ValueFromReflect(reflect.ValueOf(rv))
 	if err != nil {
-		return nil, verror.New(verror.ErrInternal, call.Context(), i.suffix, err)
+		return nil, verror.New(verror.ErrInternal, ctx, i.suffix, err)
 	}
 	return vv, nil
 }
diff --git a/services/internal/vtracelib/vtrace.go b/services/internal/vtracelib/vtrace.go
index 9291406..e1427a8 100644
--- a/services/internal/vtracelib/vtrace.go
+++ b/services/internal/vtracelib/vtrace.go
@@ -5,6 +5,7 @@
 package vtracelib
 
 import (
+	"v.io/v23/context"
 	"v.io/v23/rpc"
 	s_vtrace "v.io/v23/services/vtrace"
 	"v.io/v23/uniqueid"
@@ -14,19 +15,19 @@
 
 type vtraceService struct{}
 
-func (v *vtraceService) Trace(call rpc.ServerCall, id uniqueid.Id) (vtrace.TraceRecord, error) {
-	store := vtrace.GetStore(call.Context())
+func (v *vtraceService) Trace(ctx *context.T, _ rpc.ServerCall, id uniqueid.Id) (vtrace.TraceRecord, error) {
+	store := vtrace.GetStore(ctx)
 	tr := store.TraceRecord(id)
 	if tr == nil {
-		return vtrace.TraceRecord{}, verror.New(verror.ErrNoExist, call.Context(), "No trace with id %x", id)
+		return vtrace.TraceRecord{}, verror.New(verror.ErrNoExist, ctx, "No trace with id %x", id)
 	}
 	return *tr, nil
 }
 
-func (v *vtraceService) AllTraces(call s_vtrace.StoreAllTracesServerCall) error {
+func (v *vtraceService) AllTraces(ctx *context.T, call s_vtrace.StoreAllTracesServerCall) error {
 	// TODO(mattr): Consider changing the store to allow us to iterate through traces
 	// when there are many.
-	store := vtrace.GetStore(call.Context())
+	store := vtrace.GetStore(ctx)
 	traces := store.TraceRecords()
 	for i := range traces {
 		if err := call.SendStream().Send(traces[i]); err != nil {
diff --git a/services/mounttable/mounttablelib/collection_test_interface.vdl.go b/services/mounttable/mounttablelib/collection_test_interface.vdl.go
index 473035b..bf634db 100644
--- a/services/mounttable/mounttablelib/collection_test_interface.vdl.go
+++ b/services/mounttable/mounttablelib/collection_test_interface.vdl.go
@@ -59,10 +59,10 @@
 	// an entry exists, if Overwrite is true, then the binding is replaced,
 	// otherwise the call fails with an error.  The Val must be no larger than
 	// MaxSize bytes.
-	Export(call rpc.ServerCall, Val string, Overwrite bool) error
+	Export(ctx *context.T, call rpc.ServerCall, Val string, Overwrite bool) error
 	// Lookup retrieves the value associated with a name.  Returns an error if
 	// there is no such binding.
-	Lookup(rpc.ServerCall) ([]byte, error)
+	Lookup(*context.T, rpc.ServerCall) ([]byte, error)
 }
 
 // CollectionServerStubMethods is the server interface containing
@@ -100,12 +100,12 @@
 	gs   *rpc.GlobState
 }
 
-func (s implCollectionServerStub) Export(call rpc.ServerCall, i0 string, i1 bool) error {
-	return s.impl.Export(call, i0, i1)
+func (s implCollectionServerStub) Export(ctx *context.T, call rpc.ServerCall, i0 string, i1 bool) error {
+	return s.impl.Export(ctx, call, i0, i1)
 }
 
-func (s implCollectionServerStub) Lookup(call rpc.ServerCall) ([]byte, error) {
-	return s.impl.Lookup(call)
+func (s implCollectionServerStub) Lookup(ctx *context.T, call rpc.ServerCall) ([]byte, error) {
+	return s.impl.Lookup(ctx, call)
 }
 
 func (s implCollectionServerStub) Globber() *rpc.GlobState {
diff --git a/services/mounttable/mounttablelib/collectionserver_test.go b/services/mounttable/mounttablelib/collectionserver_test.go
index c3cada7..d19a1fc 100644
--- a/services/mounttable/mounttablelib/collectionserver_test.go
+++ b/services/mounttable/mounttablelib/collectionserver_test.go
@@ -45,22 +45,22 @@
 }
 
 // Export implements CollectionServerMethods.Export.
-func (c *rpcContext) Export(call rpc.ServerCall, val []byte, overwrite bool) error {
+func (c *rpcContext) Export(ctx *context.T, _ rpc.ServerCall, val []byte, overwrite bool) error {
 	c.Lock()
 	defer c.Unlock()
 	if b := c.contents[c.name]; overwrite || b == nil {
 		c.contents[c.name] = val
 		return nil
 	}
-	return verror.New(naming.ErrNameExists, call.Context(), c.name)
+	return verror.New(naming.ErrNameExists, ctx, c.name)
 }
 
 // Lookup implements CollectionServerMethods.Lookup.
-func (c *rpcContext) Lookup(call rpc.ServerCall) ([]byte, error) {
+func (c *rpcContext) Lookup(ctx *context.T, _ rpc.ServerCall) ([]byte, error) {
 	c.Lock()
 	defer c.Unlock()
 	if val := c.contents[c.name]; val != nil {
 		return val, nil
 	}
-	return nil, verror.New(naming.ErrNoSuchName, call.Context(), c.name)
+	return nil, verror.New(naming.ErrNoSuchName, ctx, c.name)
 }
diff --git a/services/mounttable/mounttablelib/mounttable.go b/services/mounttable/mounttablelib/mounttable.go
index 7fbcf7e..a052d33 100644
--- a/services/mounttable/mounttablelib/mounttable.go
+++ b/services/mounttable/mounttablelib/mounttable.go
@@ -178,7 +178,7 @@
 			}
 		}
 
-		n, err := mt.findNode(nil, elems, true, nil)
+		n, err := mt.findNode(nil, nil, elems, true, nil)
 		if n != nil || err == nil {
 			vlog.VI(2).Infof("added tam %v to %s", tam, name)
 			if isPattern {
@@ -216,18 +216,18 @@
 }
 
 // satisfies returns no error if the ctx + n.acls satisfies the associated one of the required Tags.
-func (n *node) satisfies(mt *mountTable, call rpc.ServerCall, tags []mounttable.Tag) error {
+func (n *node) satisfies(mt *mountTable, ctx *context.T, call rpc.ServerCall, tags []mounttable.Tag) error {
 	// No AccessLists means everything (for now).
-	if call == nil || tags == nil || n.acls == nil {
+	if ctx == nil || call == nil || tags == nil || n.acls == nil {
 		return nil
 	}
 	// "Self-RPCs" are always authorized.
-	secCall := security.GetCall(call.Context())
+	secCall := security.GetCall(ctx)
 	if l, r := secCall.LocalBlessings().PublicKey(), secCall.RemoteBlessings().PublicKey(); l != nil && reflect.DeepEqual(l, r) {
 		return nil
 	}
 	// Match client's blessings against the AccessLists.
-	blessings, invalidB := security.RemoteBlessingNames(call.Context())
+	blessings, invalidB := security.RemoteBlessingNames(ctx)
 	for _, tag := range tags {
 		if acl, exists := n.acls.GetPermissionsForTag(string(tag)); exists && acl.Includes(blessings...) {
 			return nil
@@ -237,9 +237,9 @@
 		return nil
 	}
 	if len(invalidB) > 0 {
-		return verror.New(verror.ErrNoAccess, call.Context(), blessings, invalidB)
+		return verror.New(verror.ErrNoAccess, ctx, blessings, invalidB)
 	}
-	return verror.New(verror.ErrNoAccess, call.Context(), blessings)
+	return verror.New(verror.ErrNoAccess, ctx, blessings)
 }
 
 func expand(acl *access.AccessList, name string) *access.AccessList {
@@ -255,31 +255,31 @@
 
 // satisfiesTemplate returns no error if the ctx + n.amTemplate satisfies the associated one of
 // the required Tags.
-func (n *node) satisfiesTemplate(call rpc.ServerCall, tags []mounttable.Tag, name string) error {
+func (n *node) satisfiesTemplate(ctx *context.T, call rpc.ServerCall, tags []mounttable.Tag, name string) error {
 	if n.amTemplate == nil {
 		return nil
 	}
 	// Match client's blessings against the AccessLists.
-	blessings, invalidB := security.RemoteBlessingNames(call.Context())
+	blessings, invalidB := security.RemoteBlessingNames(ctx)
 	for _, tag := range tags {
 		if acl, exists := n.amTemplate[string(tag)]; exists && expand(&acl, name).Includes(blessings...) {
 			return nil
 		}
 	}
-	return verror.New(verror.ErrNoAccess, call.Context(), blessings, invalidB)
+	return verror.New(verror.ErrNoAccess, ctx, blessings, invalidB)
 }
 
 // copyAccessLists copies one nodes AccessLists to another and adds the clients blessings as
 // patterns to the Admin tag.
-func copyAccessLists(call rpc.ServerCall, cur *node) *TAMG {
-	if call == nil {
+func copyAccessLists(ctx *context.T, cur *node) *TAMG {
+	if ctx == nil {
 		return nil
 	}
 	if cur.acls == nil {
 		return nil
 	}
 	acls := cur.acls.Copy()
-	blessings, _ := security.RemoteBlessingNames(call.Context())
+	blessings, _ := security.RemoteBlessingNames(ctx)
 	for _, b := range blessings {
 		acls.Add(security.BlessingPattern(b), string(mounttable.Admin))
 	}
@@ -300,7 +300,7 @@
 // while following the path, return that node and any remaining elems.
 //
 // If it returns a node, both the node and its parent are locked.
-func (mt *mountTable) traverse(call rpc.ServerCall, elems []string, create bool) (*node, []string, error) {
+func (mt *mountTable) traverse(ctx *context.T, call rpc.ServerCall, elems []string, create bool) (*node, []string, error) {
 	// Invariant is that the current node and its parent are both locked.
 	cur := mt.root
 	cur.parent.Lock()
@@ -308,7 +308,7 @@
 	for i, e := range elems {
 		vlog.VI(2).Infof("satisfying %v %v", elems[0:i], *cur)
 		if call != nil {
-			if err := cur.satisfies(mt, call, traverseTags); err != nil {
+			if err := cur.satisfies(mt, ctx, call, traverseTags); err != nil {
 				cur.parent.Unlock()
 				cur.Unlock()
 				return nil, nil, err
@@ -333,12 +333,12 @@
 		}
 		// Create a new node and keep recursing.
 		cur.parent.Unlock()
-		if err := cur.satisfies(mt, call, createTags); err != nil {
+		if err := cur.satisfies(mt, ctx, call, createTags); err != nil {
 			cur.Unlock()
 			return nil, nil, err
 		}
 		if call != nil {
-			if err := cur.satisfiesTemplate(call, createTags, e); err != nil {
+			if err := cur.satisfiesTemplate(ctx, call, createTags, e); err != nil {
 				cur.Unlock()
 				return nil, nil, err
 			}
@@ -349,7 +349,7 @@
 		if cur.amTemplate != nil {
 			next.acls = createTAMGFromTemplate(cur.amTemplate, e)
 		} else {
-			next.acls = copyAccessLists(call, cur)
+			next.acls = copyAccessLists(ctx, cur)
 		}
 		if cur.children == nil {
 			cur.children = make(map[string]*node)
@@ -366,8 +366,8 @@
 // findNode finds a node in the table and optionally creates a path to it.
 //
 // If a node is found, on return it and its parent are locked.
-func (mt *mountTable) findNode(call rpc.ServerCall, elems []string, create bool, tags []mounttable.Tag) (*node, error) {
-	n, nelems, err := mt.traverse(call, elems, create)
+func (mt *mountTable) findNode(ctx *context.T, call rpc.ServerCall, elems []string, create bool, tags []mounttable.Tag) (*node, error) {
+	n, nelems, err := mt.traverse(ctx, call, elems, create)
 	if err != nil {
 		return nil, err
 	}
@@ -379,7 +379,7 @@
 		n.Unlock()
 		return nil, nil
 	}
-	if err := n.satisfies(mt, call, tags); err != nil {
+	if err := n.satisfies(mt, ctx, call, tags); err != nil {
 		n.parent.Unlock()
 		n.Unlock()
 		return nil, err
@@ -391,8 +391,8 @@
 // any elements remaining of the path.
 //
 // If a mountpoint is found, on return it and its parent are locked.
-func (mt *mountTable) findMountPoint(call rpc.ServerCall, elems []string) (*node, []string, error) {
-	n, nelems, err := mt.traverse(call, elems, false)
+func (mt *mountTable) findMountPoint(ctx *context.T, call rpc.ServerCall, elems []string) (*node, []string, error) {
+	n, nelems, err := mt.traverse(ctx, call, elems, false)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -400,7 +400,7 @@
 		return nil, nil, nil
 	}
 	// If we can't resolve it, we can't use it.
-	if err := n.satisfies(mt, call, resolveTags); err != nil {
+	if err := n.satisfies(mt, ctx, call, resolveTags); err != nil {
 		n.parent.Unlock()
 		n.Unlock()
 		return nil, nil, err
@@ -427,17 +427,17 @@
 
 // ResolveStep returns the next server in a resolution, the name remaining below that server,
 // and whether or not that server is another mount table.
-func (ms *mountContext) ResolveStepX(call rpc.ServerCall) (entry naming.MountEntry, err error) {
-	return ms.ResolveStep(call)
+func (ms *mountContext) ResolveStepX(ctx *context.T, call rpc.ServerCall) (entry naming.MountEntry, err error) {
+	return ms.ResolveStep(ctx, call)
 }
 
 // ResolveStep returns the next server in a resolution in the form of a MountEntry.  The name
 // in the mount entry is the name relative to the server's root.
-func (ms *mountContext) ResolveStep(call rpc.ServerCall) (entry naming.MountEntry, err error) {
+func (ms *mountContext) ResolveStep(ctx *context.T, call rpc.ServerCall) (entry naming.MountEntry, err error) {
 	vlog.VI(2).Infof("ResolveStep %q", ms.name)
 	mt := ms.mt
 	// Find the next mount point for the name.
-	n, elems, werr := mt.findMountPoint(call, ms.elems)
+	n, elems, werr := mt.findMountPoint(ctx, call, ms.elems)
 	if werr != nil {
 		err = werr
 		return
@@ -445,9 +445,9 @@
 	if n == nil {
 		entry.Name = ms.name
 		if len(ms.elems) == 0 {
-			err = verror.New(naming.ErrNoSuchNameRoot, call.Context(), ms.name)
+			err = verror.New(naming.ErrNoSuchNameRoot, ctx, ms.name)
 		} else {
-			err = verror.New(naming.ErrNoSuchName, call.Context(), ms.name)
+			err = verror.New(naming.ErrNoSuchName, ctx, ms.name)
 		}
 		return
 	}
@@ -473,7 +473,7 @@
 }
 
 // Mount a server onto the name in the receiver.
-func (ms *mountContext) Mount(call rpc.ServerCall, server string, ttlsecs uint32, flags naming.MountFlag) error {
+func (ms *mountContext) Mount(ctx *context.T, call rpc.ServerCall, server string, ttlsecs uint32, flags naming.MountFlag) error {
 	mt := ms.mt
 	if ttlsecs == 0 {
 		ttlsecs = 10 * 365 * 24 * 60 * 60 // a really long time
@@ -487,16 +487,16 @@
 	}
 	_, err := v23.NewEndpoint(epString)
 	if err != nil {
-		return verror.New(errMalformedAddress, call.Context(), epString, server)
+		return verror.New(errMalformedAddress, ctx, epString, server)
 	}
 
 	// Find/create node in namespace and add the mount.
-	n, werr := mt.findNode(call, ms.elems, true, mountTags)
+	n, werr := mt.findNode(ctx, call, ms.elems, true, mountTags)
 	if werr != nil {
 		return werr
 	}
 	if n == nil {
-		return verror.New(naming.ErrNoSuchNameRoot, call.Context(), ms.name)
+		return verror.New(naming.ErrNoSuchNameRoot, ctx, ms.name)
 	}
 	// We don't need the parent lock
 	n.parent.Unlock()
@@ -510,10 +510,10 @@
 		n.mount = &mount{servers: newServerList(), mt: wantMT, leaf: wantLeaf}
 	} else {
 		if wantMT != n.mount.mt {
-			return verror.New(errMTDoesntMatch, call.Context())
+			return verror.New(errMTDoesntMatch, ctx)
 		}
 		if wantLeaf != n.mount.leaf {
-			return verror.New(errLeafDoesntMatch, call.Context())
+			return verror.New(errLeafDoesntMatch, ctx)
 		}
 	}
 	n.mount.servers.add(server, time.Duration(ttlsecs)*time.Second)
@@ -552,7 +552,7 @@
 // removeUselessRecursive removes any useless nodes on the tail of the path.
 func (mt *mountTable) removeUselessRecursive(elems []string) {
 	for i := len(elems); i > 0; i-- {
-		n, nelems, _ := mt.traverse(nil, elems[:i-1], false)
+		n, nelems, _ := mt.traverse(nil, nil, elems[:i-1], false)
 		if n == nil {
 			break
 		}
@@ -572,10 +572,10 @@
 
 // Unmount removes servers from the name in the receiver. If server is specified, only that
 // server is removed.
-func (ms *mountContext) Unmount(call rpc.ServerCall, server string) error {
+func (ms *mountContext) Unmount(ctx *context.T, call rpc.ServerCall, server string) error {
 	vlog.VI(2).Infof("*********************Unmount %q, %s", ms.name, server)
 	mt := ms.mt
-	n, err := mt.findNode(call, ms.elems, false, mountTags)
+	n, err := mt.findNode(ctx, call, ms.elems, false, mountTags)
 	if err != nil {
 		return err
 	}
@@ -599,15 +599,15 @@
 }
 
 // Delete removes the receiver.  If all is true, any subtree is also removed.
-func (ms *mountContext) Delete(call rpc.ServerCall, deleteSubTree bool) error {
+func (ms *mountContext) Delete(ctx *context.T, call rpc.ServerCall, deleteSubTree bool) error {
 	vlog.VI(2).Infof("*********************Delete %q, %v", ms.name, deleteSubTree)
 	if len(ms.elems) == 0 {
 		// We can't delete the root.
-		return verror.New(errCantDeleteRoot, call.Context())
+		return verror.New(errCantDeleteRoot, ctx)
 	}
 	mt := ms.mt
 	// Find and lock the parent node.
-	n, err := mt.findNode(call, ms.elems, false, removeTags)
+	n, err := mt.findNode(ctx, call, ms.elems, false, removeTags)
 	if err != nil {
 		return err
 	}
@@ -617,7 +617,7 @@
 	defer n.parent.Unlock()
 	defer n.Unlock()
 	if !deleteSubTree && len(n.children) > 0 {
-		return verror.New(errNotEmpty, call.Context(), ms.name)
+		return verror.New(errNotEmpty, ctx, ms.name)
 	}
 	mt.deleteNode(n.parent, ms.elems[len(ms.elems)-1])
 	return nil
@@ -630,7 +630,7 @@
 }
 
 // globStep is called with n and n.parent locked.  Returns with both unlocked.
-func (mt *mountTable) globStep(n *node, name string, pattern *glob.Glob, call rpc.ServerCall, ch chan<- naming.GlobReply) {
+func (mt *mountTable) globStep(ctx *context.T, call rpc.ServerCall, n *node, name string, pattern *glob.Glob, ch chan<- naming.GlobReply) {
 	vlog.VI(2).Infof("globStep(%s, %s)", name, pattern)
 
 	// If this is a mount point, we're done.
@@ -647,7 +647,7 @@
 			Name: name,
 		}
 		// Only fill in the mount info if we can resolve this name.
-		if err := n.satisfies(mt, call, resolveTags); err == nil {
+		if err := n.satisfies(mt, ctx, call, resolveTags); err == nil {
 			me.Servers = m.servers.copyToSlice()
 			me.ServesMountTable = n.mount.mt
 			me.IsLeaf = n.mount.leaf
@@ -665,8 +665,8 @@
 		// - we have Read or Admin access to the directory or
 		// - we have Resolve or Create access to the directory and the
 		//    next element in the pattern is a fixed string.
-		if err := n.satisfies(mt, call, globTags); err != nil {
-			if err := n.satisfies(mt, call, traverseTags); err != nil {
+		if err := n.satisfies(mt, ctx, call, globTags); err != nil {
+			if err := n.satisfies(mt, ctx, call, traverseTags); err != nil {
 				goto out
 			}
 			fixed, _ := pattern.SplitFixedPrefix()
@@ -689,11 +689,11 @@
 			if ok, _, suffix := pattern.MatchInitialSegment(k); ok {
 				c.Lock()
 				// If child allows any access show it.  Otherwise, skip.
-				if err := c.satisfies(mt, call, allTags); err != nil {
+				if err := c.satisfies(mt, ctx, call, allTags); err != nil {
 					c.Unlock()
 					continue
 				}
-				mt.globStep(c, naming.Join(name, k), suffix, call, ch)
+				mt.globStep(ctx, call, c, naming.Join(name, k), suffix, ch)
 				n.Lock()
 			}
 		}
@@ -714,7 +714,7 @@
 
 	// To see anything, one has to have some access to the node.  Don't need the parent lock anymore.
 	n.parent.Unlock()
-	if err := n.satisfies(mt, call, allTags); err != nil {
+	if err := n.satisfies(mt, ctx, call, allTags); err != nil {
 		n.Unlock()
 		return
 	}
@@ -735,7 +735,7 @@
 // a state that never existed in the mounttable.  For example, if someone removes c/d and later
 // adds a/b while a Glob is in progress, the Glob may return a set of nodes that includes both
 // c/d and a/b.
-func (ms *mountContext) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (ms *mountContext) Glob__(ctx *context.T, call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	vlog.VI(2).Infof("mt.Glob %v", ms.elems)
 
 	g, err := glob.Parse(pattern)
@@ -748,7 +748,7 @@
 	go func() {
 		defer close(ch)
 		// If there was an access error, just ignore the entry, i.e., make it invisible.
-		n, err := mt.findNode(call, ms.elems, false, nil)
+		n, err := mt.findNode(ctx, call, ms.elems, false, nil)
 		if err != nil {
 			return
 		}
@@ -756,16 +756,16 @@
 		// don't need to evaluate the glob expression. Send a partially resolved
 		// name back to the client.
 		if n == nil {
-			ms.linkToLeaf(call, ch)
+			ms.linkToLeaf(ctx, call, ch)
 			return
 		}
-		mt.globStep(n, "", g, call, ch)
+		mt.globStep(ctx, call, n, "", g, ch)
 	}()
 	return ch, nil
 }
 
-func (ms *mountContext) linkToLeaf(call rpc.ServerCall, ch chan<- naming.GlobReply) {
-	n, elems, err := ms.mt.findMountPoint(call, ms.elems)
+func (ms *mountContext) linkToLeaf(ctx *context.T, call rpc.ServerCall, ch chan<- naming.GlobReply) {
+	n, elems, err := ms.mt.findMountPoint(ctx, call, ms.elems)
 	if err != nil || n == nil {
 		return
 	}
@@ -778,25 +778,25 @@
 	ch <- naming.GlobReplyEntry{naming.MountEntry{Name: "", Servers: servers}}
 }
 
-func (ms *mountContext) SetPermissions(call rpc.ServerCall, perms access.Permissions, version string) error {
+func (ms *mountContext) SetPermissions(ctx *context.T, call rpc.ServerCall, perms access.Permissions, version string) error {
 	vlog.VI(2).Infof("SetPermissions %q", ms.name)
 	mt := ms.mt
 
 	// Find/create node in namespace and add the mount.
-	n, err := mt.findNode(call, ms.elems, true, setTags)
+	n, err := mt.findNode(ctx, call, ms.elems, true, setTags)
 	if err != nil {
 		return err
 	}
 	if n == nil {
 		// TODO(p): can this even happen?
-		return verror.New(naming.ErrNoSuchName, call.Context(), ms.name)
+		return verror.New(naming.ErrNoSuchName, ctx, ms.name)
 	}
 	n.parent.Unlock()
 	defer n.Unlock()
 
 	// If the caller is trying to add a Permission that they are no longer Admin in,
 	// retain the caller's blessings that were in Admin to prevent them from locking themselves out.
-	bnames, _ := security.RemoteBlessingNames(call.Context())
+	bnames, _ := security.RemoteBlessingNames(ctx)
 	if acl, ok := perms[string(mounttable.Admin)]; !ok || !acl.Includes(bnames...) {
 		_, oldPerms := n.acls.Get()
 		oldAcl := oldPerms[string(mounttable.Admin)]
@@ -815,17 +815,17 @@
 	return err
 }
 
-func (ms *mountContext) GetPermissions(call rpc.ServerCall) (access.Permissions, string, error) {
+func (ms *mountContext) GetPermissions(ctx *context.T, call rpc.ServerCall) (access.Permissions, string, error) {
 	vlog.VI(2).Infof("GetPermissions %q", ms.name)
 	mt := ms.mt
 
 	// Find node in namespace and add the mount.
-	n, err := mt.findNode(call, ms.elems, false, getTags)
+	n, err := mt.findNode(ctx, call, ms.elems, false, getTags)
 	if err != nil {
 		return nil, "", err
 	}
 	if n == nil {
-		return nil, "", verror.New(naming.ErrNoSuchName, call.Context(), ms.name)
+		return nil, "", verror.New(naming.ErrNoSuchName, ctx, ms.name)
 	}
 	n.parent.Unlock()
 	defer n.Unlock()
diff --git a/services/mounttable/mounttablelib/neighborhood.go b/services/mounttable/mounttablelib/neighborhood.go
index 3be9878..169606b 100644
--- a/services/mounttable/mounttablelib/neighborhood.go
+++ b/services/mounttable/mounttablelib/neighborhood.go
@@ -211,24 +211,24 @@
 }
 
 // ResolveStepX implements ResolveStepX
-func (ns *neighborhoodService) ResolveStepX(call rpc.ServerCall) (entry naming.MountEntry, err error) {
-	return ns.ResolveStep(call)
+func (ns *neighborhoodService) ResolveStepX(ctx *context.T, call rpc.ServerCall) (entry naming.MountEntry, err error) {
+	return ns.ResolveStep(ctx, call)
 }
 
 // ResolveStep implements ResolveStep
-func (ns *neighborhoodService) ResolveStep(call rpc.ServerCall) (entry naming.MountEntry, err error) {
+func (ns *neighborhoodService) ResolveStep(ctx *context.T, _ rpc.ServerCall) (entry naming.MountEntry, err error) {
 	nh := ns.nh
 	vlog.VI(2).Infof("ResolveStep %v\n", ns.elems)
 	if len(ns.elems) == 0 {
 		//nothing can be mounted at the root
-		err = verror.New(naming.ErrNoSuchNameRoot, call.Context(), ns.elems)
+		err = verror.New(naming.ErrNoSuchNameRoot, ctx, ns.elems)
 		return
 	}
 
 	// We can only resolve the first element and it always refers to a mount table (for now).
 	neighbor := nh.neighbor(ns.elems[0])
 	if neighbor == nil {
-		err = verror.New(naming.ErrNoSuchName, call.Context(), ns.elems)
+		err = verror.New(naming.ErrNoSuchName, ctx, ns.elems)
 		entry.Name = ns.name
 		return
 	}
@@ -239,22 +239,22 @@
 }
 
 // Mount not implemented.
-func (ns *neighborhoodService) Mount(call rpc.ServerCall, _ string, _ uint32, _ naming.MountFlag) error {
-	return verror.New(errDoesntImplementMount, call.Context())
+func (ns *neighborhoodService) Mount(ctx *context.T, _ rpc.ServerCall, _ string, _ uint32, _ naming.MountFlag) error {
+	return verror.New(errDoesntImplementMount, ctx)
 }
 
 // Unmount not implemented.
-func (*neighborhoodService) Unmount(call rpc.ServerCall, _ string) error {
-	return verror.New(errDoesntImplementUnmount, call.Context())
+func (*neighborhoodService) Unmount(ctx *context.T, _ rpc.ServerCall, _ string) error {
+	return verror.New(errDoesntImplementUnmount, ctx)
 }
 
 // Delete not implemented.
-func (*neighborhoodService) Delete(call rpc.ServerCall, _ bool) error {
-	return verror.New(errDoesntImplementDelete, call.Context())
+func (*neighborhoodService) Delete(ctx *context.T, _ rpc.ServerCall, _ bool) error {
+	return verror.New(errDoesntImplementDelete, ctx)
 }
 
 // Glob__ implements rpc.AllGlobber
-func (ns *neighborhoodService) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+func (ns *neighborhoodService) Glob__(ctx *context.T, _ rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 	g, err := glob.Parse(pattern)
 	if err != nil {
 		return nil, err
@@ -279,21 +279,21 @@
 	case 1:
 		neighbor := nh.neighbor(ns.elems[0])
 		if neighbor == nil {
-			return nil, verror.New(naming.ErrNoSuchName, call.Context(), ns.elems[0])
+			return nil, verror.New(naming.ErrNoSuchName, ctx, ns.elems[0])
 		}
 		ch := make(chan naming.GlobReply, 1)
 		ch <- naming.GlobReplyEntry{naming.MountEntry{Name: "", Servers: neighbor, ServesMountTable: true}}
 		close(ch)
 		return ch, nil
 	default:
-		return nil, verror.New(naming.ErrNoSuchName, call.Context(), ns.elems)
+		return nil, verror.New(naming.ErrNoSuchName, ctx, ns.elems)
 	}
 }
 
-func (*neighborhoodService) SetPermissions(call rpc.ServerCall, acl access.Permissions, version string) error {
-	return verror.New(errDoesntImplementSetPermissions, call.Context())
+func (*neighborhoodService) SetPermissions(ctx *context.T, _ rpc.ServerCall, acl access.Permissions, version string) error {
+	return verror.New(errDoesntImplementSetPermissions, ctx)
 }
 
-func (*neighborhoodService) GetPermissions(call rpc.ServerCall) (acl access.Permissions, version string, err error) {
+func (*neighborhoodService) GetPermissions(*context.T, rpc.ServerCall) (acl access.Permissions, version string, err error) {
 	return nil, "", nil
 }
diff --git a/services/profile/profile/impl_test.go b/services/profile/profile/impl_test.go
index 82f358a..d40090f 100644
--- a/services/profile/profile/impl_test.go
+++ b/services/profile/profile/impl_test.go
@@ -42,7 +42,7 @@
 	suffix string
 }
 
-func (s *server) Label(rpc.ServerCall) (string, error) {
+func (s *server) Label(*context.T, rpc.ServerCall) (string, error) {
 	vlog.VI(2).Infof("%v.Label() was called", s.suffix)
 	if s.suffix != "exists" {
 		return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -50,7 +50,7 @@
 	return spec.Label, nil
 }
 
-func (s *server) Description(rpc.ServerCall) (string, error) {
+func (s *server) Description(*context.T, rpc.ServerCall) (string, error) {
 	vlog.VI(2).Infof("%v.Description() was called", s.suffix)
 	if s.suffix != "exists" {
 		return "", fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -58,7 +58,7 @@
 	return spec.Description, nil
 }
 
-func (s *server) Specification(rpc.ServerCall) (profile.Specification, error) {
+func (s *server) Specification(*context.T, rpc.ServerCall) (profile.Specification, error) {
 	vlog.VI(2).Infof("%v.Specification() was called", s.suffix)
 	if s.suffix != "exists" {
 		return profile.Specification{}, fmt.Errorf("profile doesn't exist: %v", s.suffix)
@@ -66,12 +66,12 @@
 	return spec, nil
 }
 
-func (s *server) Put(_ rpc.ServerCall, _ profile.Specification) error {
+func (s *server) Put(_ *context.T, _ rpc.ServerCall, _ profile.Specification) error {
 	vlog.VI(2).Infof("%v.Put() was called", s.suffix)
 	return nil
 }
 
-func (s *server) Remove(rpc.ServerCall) error {
+func (s *server) Remove(*context.T, rpc.ServerCall) error {
 	vlog.VI(2).Infof("%v.Remove() was called", s.suffix)
 	if s.suffix != "exists" {
 		return fmt.Errorf("profile doesn't exist: %v", s.suffix)
diff --git a/services/profile/profiled/service.go b/services/profile/profiled/service.go
index 23e11b2..d30613f 100644
--- a/services/profile/profiled/service.go
+++ b/services/profile/profiled/service.go
@@ -11,6 +11,7 @@
 	"v.io/x/ref/services/profile"
 	"v.io/x/ref/services/repository"
 
+	"v.io/v23/context"
 	"v.io/v23/naming"
 	"v.io/v23/rpc"
 	"v.io/x/lib/vlog"
@@ -38,7 +39,7 @@
 
 // STORE MANAGEMENT INTERFACE IMPLEMENTATION
 
-func (i *profileService) Put(call rpc.ServerCall, profile profile.Specification) error {
+func (i *profileService) Put(ctx *context.T, call rpc.ServerCall, profile profile.Specification) error {
 	vlog.VI(0).Infof("%v.Put(%v)", i.suffix, profile)
 	// Transaction is rooted at "", so tname == tid.
 	i.store.Lock()
@@ -58,7 +59,7 @@
 	return nil
 }
 
-func (i *profileService) Remove(call rpc.ServerCall) error {
+func (i *profileService) Remove(ctx *context.T, call rpc.ServerCall) error {
 	vlog.VI(0).Infof("%v.Remove()", i.suffix)
 	i.store.Lock()
 	defer i.store.Unlock()
@@ -105,7 +106,7 @@
 	return s, nil
 }
 
-func (i *profileService) Label(call rpc.ServerCall) (string, error) {
+func (i *profileService) Label(ctx *context.T, call rpc.ServerCall) (string, error) {
 	vlog.VI(0).Infof("%v.Label()", i.suffix)
 	s, err := i.lookup(call)
 	if err != nil {
@@ -114,7 +115,7 @@
 	return s.Label, nil
 }
 
-func (i *profileService) Description(call rpc.ServerCall) (string, error) {
+func (i *profileService) Description(ctx *context.T, call rpc.ServerCall) (string, error) {
 	vlog.VI(0).Infof("%v.Description()", i.suffix)
 	s, err := i.lookup(call)
 	if err != nil {
@@ -123,7 +124,7 @@
 	return s.Description, nil
 }
 
-func (i *profileService) Specification(call rpc.ServerCall) (profile.Specification, error) {
+func (i *profileService) Specification(ctx *context.T, call rpc.ServerCall) (profile.Specification, error) {
 	vlog.VI(0).Infof("%v.Specification()", i.suffix)
 	return i.lookup(call)
 }
diff --git a/services/proxy/proxyd/proxyd_v23_test.go b/services/proxy/proxyd/proxyd_v23_test.go
index 795ade3..e035bca 100644
--- a/services/proxy/proxyd/proxyd_v23_test.go
+++ b/services/proxy/proxyd/proxyd_v23_test.go
@@ -101,9 +101,9 @@
 
 type service struct{}
 
-func (service) Echo(call rpc.ServerCall) (string, error) {
-	client, _ := security.RemoteBlessingNames(call.Context())
-	server := security.LocalBlessingNames(call.Context())
+func (service) Echo(ctx *context.T, _ rpc.ServerCall) (string, error) {
+	client, _ := security.RemoteBlessingNames(ctx)
+	server := security.LocalBlessingNames(ctx)
 	return fmt.Sprintf("server %v saw client %v", server, client), nil
 }
 
diff --git a/services/repository/repository.vdl.go b/services/repository/repository.vdl.go
index ffc32cd..e90e22b 100644
--- a/services/repository/repository.vdl.go
+++ b/services/repository/repository.vdl.go
@@ -104,7 +104,7 @@
 	// Put adds the given tuple of application version (specified
 	// through the object name suffix) and application envelope to all
 	// of the given application profiles.
-	Put(call rpc.ServerCall, Profiles []string, Envelope application.Envelope) error
+	Put(ctx *context.T, call rpc.ServerCall, Profiles []string, Envelope application.Envelope) error
 	// Remove removes the application envelope for the given profile
 	// name and application version (specified through the object name
 	// suffix). If no version is specified as part of the suffix, the
@@ -112,7 +112,7 @@
 	//
 	// TODO(jsimsa): Add support for using "*" to specify all profiles
 	// when Matt implements Globing (or Ken implements querying).
-	Remove(call rpc.ServerCall, Profile string) error
+	Remove(ctx *context.T, call rpc.ServerCall, Profile string) error
 }
 
 // ApplicationServerStubMethods is the server interface containing
@@ -152,12 +152,12 @@
 	gs *rpc.GlobState
 }
 
-func (s implApplicationServerStub) Put(call rpc.ServerCall, i0 []string, i1 application.Envelope) error {
-	return s.impl.Put(call, i0, i1)
+func (s implApplicationServerStub) Put(ctx *context.T, call rpc.ServerCall, i0 []string, i1 application.Envelope) error {
+	return s.impl.Put(ctx, call, i0, i1)
 }
 
-func (s implApplicationServerStub) Remove(call rpc.ServerCall, i0 string) error {
-	return s.impl.Remove(call, i0)
+func (s implApplicationServerStub) Remove(ctx *context.T, call rpc.ServerCall, i0 string) error {
+	return s.impl.Remove(ctx, call, i0)
 }
 
 func (s implApplicationServerStub) Globber() *rpc.GlobState {
@@ -267,13 +267,13 @@
 	repository.ProfileServerMethods
 	// Specification returns the profile specification for the profile
 	// identified through the object name suffix.
-	Specification(rpc.ServerCall) (profile.Specification, error)
+	Specification(*context.T, rpc.ServerCall) (profile.Specification, error)
 	// Put sets the profile specification for the profile identified
 	// through the object name suffix.
-	Put(call rpc.ServerCall, Specification profile.Specification) error
+	Put(ctx *context.T, call rpc.ServerCall, Specification profile.Specification) error
 	// Remove removes the profile specification for the profile
 	// identified through the object name suffix.
-	Remove(rpc.ServerCall) error
+	Remove(*context.T, rpc.ServerCall) error
 }
 
 // ProfileServerStubMethods is the server interface containing
@@ -313,16 +313,16 @@
 	gs *rpc.GlobState
 }
 
-func (s implProfileServerStub) Specification(call rpc.ServerCall) (profile.Specification, error) {
-	return s.impl.Specification(call)
+func (s implProfileServerStub) Specification(ctx *context.T, call rpc.ServerCall) (profile.Specification, error) {
+	return s.impl.Specification(ctx, call)
 }
 
-func (s implProfileServerStub) Put(call rpc.ServerCall, i0 profile.Specification) error {
-	return s.impl.Put(call, i0)
+func (s implProfileServerStub) Put(ctx *context.T, call rpc.ServerCall, i0 profile.Specification) error {
+	return s.impl.Put(ctx, call, i0)
 }
 
-func (s implProfileServerStub) Remove(call rpc.ServerCall) error {
-	return s.impl.Remove(call)
+func (s implProfileServerStub) Remove(ctx *context.T, call rpc.ServerCall) error {
+	return s.impl.Remove(ctx, call)
 }
 
 func (s implProfileServerStub) Globber() *rpc.GlobState {
diff --git a/services/role/role.vdl.go b/services/role/role.vdl.go
index c1d5946..1628fb9 100644
--- a/services/role/role.vdl.go
+++ b/services/role/role.vdl.go
@@ -72,7 +72,7 @@
 // the role server requires that each authorized blessing presented by the
 // client have the string "_role" as suffix.
 type RoleServerMethods interface {
-	SeekBlessings(rpc.ServerCall) (security.Blessings, error)
+	SeekBlessings(*context.T, rpc.ServerCall) (security.Blessings, error)
 }
 
 // RoleServerStubMethods is the server interface containing
@@ -110,8 +110,8 @@
 	gs   *rpc.GlobState
 }
 
-func (s implRoleServerStub) SeekBlessings(call rpc.ServerCall) (security.Blessings, error) {
-	return s.impl.SeekBlessings(call)
+func (s implRoleServerStub) SeekBlessings(ctx *context.T, call rpc.ServerCall) (security.Blessings, error) {
+	return s.impl.SeekBlessings(ctx, call)
 }
 
 func (s implRoleServerStub) Globber() *rpc.GlobState {
diff --git a/services/role/roled/internal/discharger.go b/services/role/roled/internal/discharger.go
index 0ac7fd9..9e79ac6 100644
--- a/services/role/roled/internal/discharger.go
+++ b/services/role/roled/internal/discharger.go
@@ -30,12 +30,12 @@
 	serverConfig *serverConfig
 }
 
-func (dischargerImpl) Discharge(call rpc.ServerCall, caveat security.Caveat, impetus security.DischargeImpetus) (security.Discharge, error) {
+func (dischargerImpl) Discharge(ctx *context.T, _ rpc.ServerCall, caveat security.Caveat, impetus security.DischargeImpetus) (security.Discharge, error) {
 	details := caveat.ThirdPartyDetails()
 	if details == nil {
-		return security.Discharge{}, discharger.NewErrNotAThirdPartyCaveat(call.Context(), caveat)
+		return security.Discharge{}, discharger.NewErrNotAThirdPartyCaveat(ctx, caveat)
 	}
-	if err := details.Dischargeable(call.Context()); err != nil {
+	if err := details.Dischargeable(ctx); err != nil {
 		return security.Discharge{}, err
 	}
 	// TODO(rthellend,ashankar): Do proper logging when the API allows it.
@@ -43,24 +43,24 @@
 
 	expiry, err := security.ExpiryCaveat(time.Now().Add(5 * time.Minute))
 	if err != nil {
-		return security.Discharge{}, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return security.Discharge{}, verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	// Bind the discharge to precisely the purpose the requestor claims it will be used.
 	method, err := security.MethodCaveat(impetus.Method)
 	if err != nil {
-		return security.Discharge{}, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return security.Discharge{}, verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	peer, err := security.NewCaveat(security.PeerBlessingsCaveat, impetus.Server)
 	if err != nil {
-		return security.Discharge{}, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return security.Discharge{}, verror.Convert(verror.ErrInternal, ctx, err)
 	}
-	discharge, err := v23.GetPrincipal(call.Context()).MintDischarge(caveat, expiry, method, peer)
+	discharge, err := v23.GetPrincipal(ctx).MintDischarge(caveat, expiry, method, peer)
 	if err != nil {
-		return security.Discharge{}, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return security.Discharge{}, verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	return discharge, nil
 }
 
-func (d *dischargerImpl) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
-	return globChildren(call.Context(), d.serverConfig)
+func (d *dischargerImpl) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
+	return globChildren(ctx, d.serverConfig)
 }
diff --git a/services/role/roled/internal/role.go b/services/role/roled/internal/role.go
index ad1ea41..6bfbf16 100644
--- a/services/role/roled/internal/role.go
+++ b/services/role/roled/internal/role.go
@@ -29,8 +29,7 @@
 	roleConfig   *Config
 }
 
-func (i *roleService) SeekBlessings(call rpc.ServerCall) (security.Blessings, error) {
-	ctx := call.Context()
+func (i *roleService) SeekBlessings(ctx *context.T, _ rpc.ServerCall) (security.Blessings, error) {
 	remoteBlessingNames, _ := security.RemoteBlessingNames(ctx)
 	vlog.Infof("%q.SeekBlessings() called by %q", i.role, remoteBlessingNames)
 
@@ -49,8 +48,8 @@
 	return createBlessings(ctx, i.roleConfig, v23.GetPrincipal(ctx), extensions, caveats, i.serverConfig.dischargerLocation)
 }
 
-func (i *roleService) GlobChildren__(call rpc.ServerCall) (<-chan string, error) {
-	return globChildren(call.Context(), i.serverConfig)
+func (i *roleService) GlobChildren__(ctx *context.T, _ rpc.ServerCall) (<-chan string, error) {
+	return globChildren(ctx, i.serverConfig)
 }
 
 // filterNonMembers returns only the blessing names that are authorized members
diff --git a/services/role/roled/internal/role_test.go b/services/role/roled/internal/role_test.go
index 022549e..c181e53 100644
--- a/services/role/roled/internal/role_test.go
+++ b/services/role/roled/internal/role_test.go
@@ -316,7 +316,7 @@
 	return nil
 }
 
-func (d *testDispatcher) Test(call rpc.ServerCall) ([]string, []security.RejectedBlessing, error) {
-	blessings, rejected := security.RemoteBlessingNames(call.Context())
+func (d *testDispatcher) Test(ctx *context.T, _ rpc.ServerCall) ([]string, []security.RejectedBlessing, error) {
+	blessings, rejected := security.RemoteBlessingNames(ctx)
 	return blessings, rejected, nil
 }
diff --git a/services/wspr/internal/app/app.go b/services/wspr/internal/app/app.go
index 2eb6db3..ab6dd87 100644
--- a/services/wspr/internal/app/app.go
+++ b/services/wspr/internal/app/app.go
@@ -405,6 +405,11 @@
 	w    lib.ClientWriter
 }
 
+var (
+	_ rpc.StreamServerCall = (*localCall)(nil)
+	_ security.Call        = (*localCall)(nil)
+)
+
 func (l *localCall) Send(item interface{}) error {
 	vomItem, err := lib.VomEncode(item)
 	if err != nil {
@@ -422,12 +427,10 @@
 func (l *localCall) Recv(interface{}) error                          { return nil }
 func (l *localCall) GrantedBlessings() security.Blessings            { return security.Blessings{} }
 func (l *localCall) Server() rpc.Server                              { return nil }
-func (l *localCall) Context() *context.T                             { return l.ctx }
 func (l *localCall) Timestamp() (t time.Time)                        { return }
 func (l *localCall) Method() string                                  { return l.vrpc.Method }
 func (l *localCall) MethodTags() []*vdl.Value                        { return l.tags }
-func (l *localCall) Name() string                                    { return l.vrpc.Name }
-func (l *localCall) Suffix() string                                  { return "" }
+func (l *localCall) Suffix() string                                  { return l.vrpc.Name }
 func (l *localCall) LocalDischarges() map[string]security.Discharge  { return nil }
 func (l *localCall) RemoteDischarges() map[string]security.Discharge { return nil }
 func (l *localCall) LocalPrincipal() security.Principal              { return nil }
@@ -435,7 +438,7 @@
 func (l *localCall) RemoteBlessings() security.Blessings             { return security.Blessings{} }
 func (l *localCall) LocalEndpoint() naming.Endpoint                  { return nil }
 func (l *localCall) RemoteEndpoint() naming.Endpoint                 { return nil }
-func (l *localCall) VanadiumContext() *context.T                     { return l.ctx }
+func (l *localCall) Security() security.Call                         { return l }
 
 func (c *Controller) handleInternalCall(ctx *context.T, invoker rpc.Invoker, msg *RpcRequest, decoder *vom.Decoder, w lib.ClientWriter, span vtrace.Span) {
 	argptrs, tags, err := invoker.Prepare(msg.Method, int(msg.NumInArgs))
@@ -449,7 +452,7 @@
 			return
 		}
 	}
-	results, err := invoker.Invoke(msg.Method, &localCall{ctx, msg, tags, w}, argptrs)
+	results, err := invoker.Invoke(ctx, &localCall{ctx, msg, tags, w}, msg.Method, argptrs)
 	if err != nil {
 		w.Error(verror.Convert(verror.ErrInternal, ctx, err))
 		return
@@ -620,7 +623,7 @@
 
 // Serve instructs WSPR to start listening for calls on behalf
 // of a javascript server.
-func (c *Controller) Serve(_ rpc.ServerCall, name string, serverId uint32) error {
+func (c *Controller) Serve(_ *context.T, _ rpc.ServerCall, name string, serverId uint32) error {
 	server, err := c.maybeCreateServer(serverId)
 	if err != nil {
 		return verror.Convert(verror.ErrInternal, nil, err)
@@ -634,7 +637,7 @@
 
 // Stop instructs WSPR to stop listening for calls for the
 // given javascript server.
-func (c *Controller) Stop(_ rpc.ServerCall, serverId uint32) error {
+func (c *Controller) Stop(_ *context.T, _ rpc.ServerCall, serverId uint32) error {
 	c.Lock()
 	server, ok := c.servers[serverId]
 	if !ok {
@@ -649,7 +652,7 @@
 }
 
 // AddName adds a published name to an existing server.
-func (c *Controller) AddName(_ rpc.ServerCall, serverId uint32, name string) error {
+func (c *Controller) AddName(_ *context.T, _ rpc.ServerCall, serverId uint32, name string) error {
 	// Create a server for the pipe, if it does not exist already
 	server, err := c.maybeCreateServer(serverId)
 	if err != nil {
@@ -663,7 +666,7 @@
 }
 
 // RemoveName removes a published name from an existing server.
-func (c *Controller) RemoveName(_ rpc.ServerCall, serverId uint32, name string) error {
+func (c *Controller) RemoveName(_ *context.T, _ rpc.ServerCall, serverId uint32, name string) error {
 	// Create a server for the pipe, if it does not exist already
 	server, err := c.maybeCreateServer(serverId)
 	if err != nil {
@@ -707,22 +710,18 @@
 }
 
 // Signature uses the signature manager to get and cache the signature of a remote server.
-func (c *Controller) Signature(call rpc.ServerCall, name string) ([]signature.Interface, error) {
-	return c.getSignature(call.Context(), name)
+func (c *Controller) Signature(ctx *context.T, _ rpc.ServerCall, name string) ([]signature.Interface, error) {
+	return c.getSignature(ctx, name)
 }
 
 // UnlinkBlessings removes the given blessings from the blessings store.
-func (c *Controller) UnlinkBlessings(_ rpc.ServerCall, handle principal.BlessingsHandle) error {
+func (c *Controller) UnlinkBlessings(_ *context.T, _ rpc.ServerCall, handle principal.BlessingsHandle) error {
 	return c.blessingsCache.RemoveReference(handle)
 }
 
 // Bless binds extensions of blessings held by this principal to
 // another principal (represented by its public key).
-func (c *Controller) Bless(_ rpc.ServerCall,
-	publicKey string,
-	blessingHandle principal.BlessingsHandle,
-	extension string,
-	caveats []security.Caveat) (string, principal.BlessingsHandle, error) {
+func (c *Controller) Bless(_ *context.T, _ rpc.ServerCall, publicKey string, blessingHandle principal.BlessingsHandle, extension string, caveats []security.Caveat) (string, principal.BlessingsHandle, error) {
 	var inputBlessing security.Blessings
 	if inputBlessing = c.GetBlessings(blessingHandle); inputBlessing.IsZero() {
 		return "", principal.ZeroHandle, verror.New(invalidBlessingsHandle, nil, blessingHandle)
@@ -747,8 +746,7 @@
 }
 
 // BlessSelf creates a blessing with the provided name for this principal.
-func (c *Controller) BlessSelf(_ rpc.ServerCall,
-	extension string, caveats []security.Caveat) (string, principal.BlessingsHandle, error) {
+func (c *Controller) BlessSelf(_ *context.T, _ rpc.ServerCall, extension string, caveats []security.Caveat) (string, principal.BlessingsHandle, error) {
 	p := v23.GetPrincipal(c.ctx)
 	blessings, err := p.BlessSelf(extension)
 	if err != nil {
@@ -763,7 +761,7 @@
 
 // PutToBlessingStore puts a blessing with the provided name to the blessing store
 // with the specified blessing pattern.
-func (c *Controller) PutToBlessingStore(_ rpc.ServerCall, handle principal.BlessingsHandle, pattern security.BlessingPattern) (*principal.JsBlessings, error) {
+func (c *Controller) PutToBlessingStore(_ *context.T, _ rpc.ServerCall, handle principal.BlessingsHandle, pattern security.BlessingPattern) (*principal.JsBlessings, error) {
 	var inputBlessing security.Blessings
 	if inputBlessing = c.GetBlessings(handle); inputBlessing.IsZero() {
 		return nil, verror.New(invalidBlessingsHandle, nil, handle)
@@ -783,7 +781,7 @@
 	return jsBlessing, nil
 }
 
-func (c *Controller) GetDefaultBlessings(rpc.ServerCall) (*principal.JsBlessings, error) {
+func (c *Controller) GetDefaultBlessings(*context.T, rpc.ServerCall) (*principal.JsBlessings, error) {
 	p := v23.GetPrincipal(c.ctx)
 	outBlessings := p.BlessingStore().Default()
 
@@ -809,10 +807,10 @@
 	granterStr.Send(data)
 }
 
-func (c *Controller) RemoteBlessings(call rpc.ServerCall, name, method string) ([]string, error) {
+func (c *Controller) RemoteBlessings(ctx *context.T, _ rpc.ServerCall, name, method string) ([]string, error) {
 	vlog.VI(2).Infof("requesting remote blessings for %q", name)
 
-	cctx, cancel := context.WithTimeout(call.Context(), 5*time.Second)
+	cctx, cancel := context.WithTimeout(ctx, 5*time.Second)
 	defer cancel()
 
 	clientCall, err := v23.GetClient(cctx).StartCall(cctx, name, method, nil)
diff --git a/services/wspr/internal/app/app_test.go b/services/wspr/internal/app/app_test.go
index d59f5ee..11facfe 100644
--- a/services/wspr/internal/app/app_test.go
+++ b/services/wspr/internal/app/app_test.go
@@ -56,18 +56,18 @@
 
 type simpleAdder struct{}
 
-func (s simpleAdder) Add(_ rpc.ServerCall, a, b int32) (int32, error) {
+func (s simpleAdder) Add(_ *context.T, _ rpc.ServerCall, a, b int32) (int32, error) {
 	return a + b, nil
 }
 
-func (s simpleAdder) Divide(_ rpc.ServerCall, a, b int32) (int32, error) {
+func (s simpleAdder) Divide(_ *context.T, _ rpc.ServerCall, a, b int32) (int32, error) {
 	if b == 0 {
 		return 0, verror.New(verror.ErrBadArg, nil, "div 0")
 	}
 	return a / b, nil
 }
 
-func (s simpleAdder) StreamingAdd(call rpc.StreamServerCall) (int32, error) {
+func (s simpleAdder) StreamingAdd(_ *context.T, call rpc.StreamServerCall) (int32, error) {
 	total := int32(0)
 	var value int32
 	for err := call.Recv(&value); err == nil; err = call.Recv(&value) {
@@ -469,7 +469,7 @@
 		return
 	}
 	for serverId := range rt.controller.servers {
-		rt.controller.Stop(nil, serverId)
+		rt.controller.Stop(nil, nil, serverId)
 	}
 
 	// ensure there is no more servers now
diff --git a/services/wspr/internal/app/controller.vdl.go b/services/wspr/internal/app/controller.vdl.go
index 212ec74..2e059d8 100644
--- a/services/wspr/internal/app/controller.vdl.go
+++ b/services/wspr/internal/app/controller.vdl.go
@@ -124,29 +124,29 @@
 type ControllerServerMethods interface {
 	// Serve instructs WSPR to start listening for calls on behalf
 	// of a javascript server.
-	Serve(call rpc.ServerCall, name string, serverId uint32) error
+	Serve(ctx *context.T, call rpc.ServerCall, name string, serverId uint32) error
 	// Stop instructs WSPR to stop listening for calls for the
 	// given javascript server.
-	Stop(call rpc.ServerCall, serverId uint32) error
+	Stop(ctx *context.T, call rpc.ServerCall, serverId uint32) error
 	// AddName adds a published name to an existing server.
-	AddName(call rpc.ServerCall, serverId uint32, name string) error
+	AddName(ctx *context.T, call rpc.ServerCall, serverId uint32, name string) error
 	// RemoveName removes a published name from an existing server.
-	RemoveName(call rpc.ServerCall, serverId uint32, name string) error
+	RemoveName(ctx *context.T, call rpc.ServerCall, serverId uint32, name string) error
 	// UnlinkBlessings removes the given blessings from the blessings store.
-	UnlinkBlessings(call rpc.ServerCall, handle principal.BlessingsHandle) error
+	UnlinkBlessings(ctx *context.T, call rpc.ServerCall, handle principal.BlessingsHandle) error
 	// Bless binds extensions of blessings held by this principal to
 	// another principal (represented by its public key).
-	Bless(call rpc.ServerCall, publicKey string, blessingHandle principal.BlessingsHandle, extension string, caveat []security.Caveat) (string, principal.BlessingsHandle, error)
+	Bless(ctx *context.T, call rpc.ServerCall, publicKey string, blessingHandle principal.BlessingsHandle, extension string, caveat []security.Caveat) (string, principal.BlessingsHandle, error)
 	// BlessSelf creates a blessing with the provided name for this principal.
-	BlessSelf(call rpc.ServerCall, name string, caveats []security.Caveat) (string, principal.BlessingsHandle, error)
+	BlessSelf(ctx *context.T, call rpc.ServerCall, name string, caveats []security.Caveat) (string, principal.BlessingsHandle, error)
 	// PutToBlessingStore puts the specified blessing to the blessing store under the provided pattern.
-	PutToBlessingStore(call rpc.ServerCall, blessingHandle principal.BlessingsHandle, pattern security.BlessingPattern) (*principal.JsBlessings, error)
+	PutToBlessingStore(ctx *context.T, call rpc.ServerCall, blessingHandle principal.BlessingsHandle, pattern security.BlessingPattern) (*principal.JsBlessings, error)
 	// RemoteBlessings fetches the remote blessings for a given name and method.
-	RemoteBlessings(call rpc.ServerCall, name string, method string) ([]string, error)
+	RemoteBlessings(ctx *context.T, call rpc.ServerCall, name string, method string) ([]string, error)
 	// Signature fetches the signature for a given name.
-	Signature(call rpc.ServerCall, name string) ([]signature.Interface, error)
+	Signature(ctx *context.T, call rpc.ServerCall, name string) ([]signature.Interface, error)
 	// GetDefaultBlessings fetches the default blessings for the principal of the controller.
-	GetDefaultBlessings(rpc.ServerCall) (*principal.JsBlessings, error)
+	GetDefaultBlessings(*context.T, rpc.ServerCall) (*principal.JsBlessings, error)
 }
 
 // ControllerServerStubMethods is the server interface containing
@@ -184,48 +184,48 @@
 	gs   *rpc.GlobState
 }
 
-func (s implControllerServerStub) Serve(call rpc.ServerCall, i0 string, i1 uint32) error {
-	return s.impl.Serve(call, i0, i1)
+func (s implControllerServerStub) Serve(ctx *context.T, call rpc.ServerCall, i0 string, i1 uint32) error {
+	return s.impl.Serve(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) Stop(call rpc.ServerCall, i0 uint32) error {
-	return s.impl.Stop(call, i0)
+func (s implControllerServerStub) Stop(ctx *context.T, call rpc.ServerCall, i0 uint32) error {
+	return s.impl.Stop(ctx, call, i0)
 }
 
-func (s implControllerServerStub) AddName(call rpc.ServerCall, i0 uint32, i1 string) error {
-	return s.impl.AddName(call, i0, i1)
+func (s implControllerServerStub) AddName(ctx *context.T, call rpc.ServerCall, i0 uint32, i1 string) error {
+	return s.impl.AddName(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) RemoveName(call rpc.ServerCall, i0 uint32, i1 string) error {
-	return s.impl.RemoveName(call, i0, i1)
+func (s implControllerServerStub) RemoveName(ctx *context.T, call rpc.ServerCall, i0 uint32, i1 string) error {
+	return s.impl.RemoveName(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) UnlinkBlessings(call rpc.ServerCall, i0 principal.BlessingsHandle) error {
-	return s.impl.UnlinkBlessings(call, i0)
+func (s implControllerServerStub) UnlinkBlessings(ctx *context.T, call rpc.ServerCall, i0 principal.BlessingsHandle) error {
+	return s.impl.UnlinkBlessings(ctx, call, i0)
 }
 
-func (s implControllerServerStub) Bless(call rpc.ServerCall, i0 string, i1 principal.BlessingsHandle, i2 string, i3 []security.Caveat) (string, principal.BlessingsHandle, error) {
-	return s.impl.Bless(call, i0, i1, i2, i3)
+func (s implControllerServerStub) Bless(ctx *context.T, call rpc.ServerCall, i0 string, i1 principal.BlessingsHandle, i2 string, i3 []security.Caveat) (string, principal.BlessingsHandle, error) {
+	return s.impl.Bless(ctx, call, i0, i1, i2, i3)
 }
 
-func (s implControllerServerStub) BlessSelf(call rpc.ServerCall, i0 string, i1 []security.Caveat) (string, principal.BlessingsHandle, error) {
-	return s.impl.BlessSelf(call, i0, i1)
+func (s implControllerServerStub) BlessSelf(ctx *context.T, call rpc.ServerCall, i0 string, i1 []security.Caveat) (string, principal.BlessingsHandle, error) {
+	return s.impl.BlessSelf(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) PutToBlessingStore(call rpc.ServerCall, i0 principal.BlessingsHandle, i1 security.BlessingPattern) (*principal.JsBlessings, error) {
-	return s.impl.PutToBlessingStore(call, i0, i1)
+func (s implControllerServerStub) PutToBlessingStore(ctx *context.T, call rpc.ServerCall, i0 principal.BlessingsHandle, i1 security.BlessingPattern) (*principal.JsBlessings, error) {
+	return s.impl.PutToBlessingStore(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) RemoteBlessings(call rpc.ServerCall, i0 string, i1 string) ([]string, error) {
-	return s.impl.RemoteBlessings(call, i0, i1)
+func (s implControllerServerStub) RemoteBlessings(ctx *context.T, call rpc.ServerCall, i0 string, i1 string) ([]string, error) {
+	return s.impl.RemoteBlessings(ctx, call, i0, i1)
 }
 
-func (s implControllerServerStub) Signature(call rpc.ServerCall, i0 string) ([]signature.Interface, error) {
-	return s.impl.Signature(call, i0)
+func (s implControllerServerStub) Signature(ctx *context.T, call rpc.ServerCall, i0 string) ([]signature.Interface, error) {
+	return s.impl.Signature(ctx, call, i0)
 }
 
-func (s implControllerServerStub) GetDefaultBlessings(call rpc.ServerCall) (*principal.JsBlessings, error) {
-	return s.impl.GetDefaultBlessings(call)
+func (s implControllerServerStub) GetDefaultBlessings(ctx *context.T, call rpc.ServerCall) (*principal.JsBlessings, error) {
+	return s.impl.GetDefaultBlessings(ctx, call)
 }
 
 func (s implControllerServerStub) Globber() *rpc.GlobState {
diff --git a/services/wspr/internal/browspr/browspr_test.go b/services/wspr/internal/browspr/browspr_test.go
index e6502a8..4501cec 100644
--- a/services/wspr/internal/browspr/browspr_test.go
+++ b/services/wspr/internal/browspr/browspr_test.go
@@ -55,7 +55,7 @@
 
 type mockServer struct{}
 
-func (s mockServer) BasicCall(_ rpc.StreamServerCall, txt string) (string, error) {
+func (s mockServer) BasicCall(_ *context.T, _ rpc.StreamServerCall, txt string) (string, error) {
 	return "[" + txt + "]", nil
 }
 
diff --git a/services/wspr/internal/namespace/namespace.vdl.go b/services/wspr/internal/namespace/namespace.vdl.go
index e8bc4dc..e6550ef 100644
--- a/services/wspr/internal/namespace/namespace.vdl.go
+++ b/services/wspr/internal/namespace/namespace.vdl.go
@@ -206,30 +206,30 @@
 // implements for Namespace.
 type NamespaceServerMethods interface {
 	// Run a glob query and stream the results.
-	Glob(call NamespaceGlobServerCall, pattern string) error
+	Glob(ctx *context.T, call NamespaceGlobServerCall, pattern string) error
 	// Mount mounts a server under the given name.
-	Mount(call rpc.ServerCall, name string, server string, ttl time.Duration, replace bool) error
+	Mount(ctx *context.T, call rpc.ServerCall, name string, server string, ttl time.Duration, replace bool) error
 	// Unmount removes an existing mount point.
-	Unmount(call rpc.ServerCall, name string, server string) error
+	Unmount(ctx *context.T, call rpc.ServerCall, name string, server string) error
 	// Resolve resolves a name to an address.
-	Resolve(call rpc.ServerCall, name string) ([]string, error)
+	Resolve(ctx *context.T, call rpc.ServerCall, name string) ([]string, error)
 	// ResolveToMountTable resolves a name to the address of the mounttable
 	// directly hosting it.
-	ResolveToMountTable(call rpc.ServerCall, name string) ([]string, error)
+	ResolveToMountTable(ctx *context.T, call rpc.ServerCall, name string) ([]string, error)
 	// FlushCacheEntry removes the namespace cache entry for a given name.
-	FlushCacheEntry(call rpc.ServerCall, name string) (bool, error)
+	FlushCacheEntry(ctx *context.T, call rpc.ServerCall, name string) (bool, error)
 	// DisableCache disables the naming cache.
-	DisableCache(call rpc.ServerCall, disable bool) error
+	DisableCache(ctx *context.T, call rpc.ServerCall, disable bool) error
 	// Roots returns the addresses of the current mounttable roots.
-	Roots(rpc.ServerCall) ([]string, error)
+	Roots(*context.T, rpc.ServerCall) ([]string, error)
 	// SetRoots sets the current mounttable roots.
-	SetRoots(call rpc.ServerCall, roots []string) error
+	SetRoots(ctx *context.T, call rpc.ServerCall, roots []string) error
 	// SetPermissions sets the AccessList in a node in a mount table.
-	SetPermissions(call rpc.ServerCall, name string, acl access.Permissions, version string) error
+	SetPermissions(ctx *context.T, call rpc.ServerCall, name string, acl access.Permissions, version string) error
 	// GetPermissions returns the AccessList in a node in a mount table.
-	GetPermissions(call rpc.ServerCall, name string) (acl access.Permissions, version string, err error)
+	GetPermissions(ctx *context.T, call rpc.ServerCall, name string) (acl access.Permissions, version string, err error)
 	// Delete deletes the name from the mounttable and, if requested, any subtree.
-	Delete(call rpc.ServerCall, name string, deleteSubtree bool) error
+	Delete(ctx *context.T, call rpc.ServerCall, name string, deleteSubtree bool) error
 }
 
 // NamespaceServerStubMethods is the server interface containing
@@ -238,30 +238,30 @@
 // is the streaming methods.
 type NamespaceServerStubMethods interface {
 	// Run a glob query and stream the results.
-	Glob(call *NamespaceGlobServerCallStub, pattern string) error
+	Glob(ctx *context.T, call *NamespaceGlobServerCallStub, pattern string) error
 	// Mount mounts a server under the given name.
-	Mount(call rpc.ServerCall, name string, server string, ttl time.Duration, replace bool) error
+	Mount(ctx *context.T, call rpc.ServerCall, name string, server string, ttl time.Duration, replace bool) error
 	// Unmount removes an existing mount point.
-	Unmount(call rpc.ServerCall, name string, server string) error
+	Unmount(ctx *context.T, call rpc.ServerCall, name string, server string) error
 	// Resolve resolves a name to an address.
-	Resolve(call rpc.ServerCall, name string) ([]string, error)
+	Resolve(ctx *context.T, call rpc.ServerCall, name string) ([]string, error)
 	// ResolveToMountTable resolves a name to the address of the mounttable
 	// directly hosting it.
-	ResolveToMountTable(call rpc.ServerCall, name string) ([]string, error)
+	ResolveToMountTable(ctx *context.T, call rpc.ServerCall, name string) ([]string, error)
 	// FlushCacheEntry removes the namespace cache entry for a given name.
-	FlushCacheEntry(call rpc.ServerCall, name string) (bool, error)
+	FlushCacheEntry(ctx *context.T, call rpc.ServerCall, name string) (bool, error)
 	// DisableCache disables the naming cache.
-	DisableCache(call rpc.ServerCall, disable bool) error
+	DisableCache(ctx *context.T, call rpc.ServerCall, disable bool) error
 	// Roots returns the addresses of the current mounttable roots.
-	Roots(rpc.ServerCall) ([]string, error)
+	Roots(*context.T, rpc.ServerCall) ([]string, error)
 	// SetRoots sets the current mounttable roots.
-	SetRoots(call rpc.ServerCall, roots []string) error
+	SetRoots(ctx *context.T, call rpc.ServerCall, roots []string) error
 	// SetPermissions sets the AccessList in a node in a mount table.
-	SetPermissions(call rpc.ServerCall, name string, acl access.Permissions, version string) error
+	SetPermissions(ctx *context.T, call rpc.ServerCall, name string, acl access.Permissions, version string) error
 	// GetPermissions returns the AccessList in a node in a mount table.
-	GetPermissions(call rpc.ServerCall, name string) (acl access.Permissions, version string, err error)
+	GetPermissions(ctx *context.T, call rpc.ServerCall, name string) (acl access.Permissions, version string, err error)
 	// Delete deletes the name from the mounttable and, if requested, any subtree.
-	Delete(call rpc.ServerCall, name string, deleteSubtree bool) error
+	Delete(ctx *context.T, call rpc.ServerCall, name string, deleteSubtree bool) error
 }
 
 // NamespaceServerStub adds universal methods to NamespaceServerStubMethods.
@@ -293,52 +293,52 @@
 	gs   *rpc.GlobState
 }
 
-func (s implNamespaceServerStub) Glob(call *NamespaceGlobServerCallStub, i0 string) error {
-	return s.impl.Glob(call, i0)
+func (s implNamespaceServerStub) Glob(ctx *context.T, call *NamespaceGlobServerCallStub, i0 string) error {
+	return s.impl.Glob(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) Mount(call rpc.ServerCall, i0 string, i1 string, i2 time.Duration, i3 bool) error {
-	return s.impl.Mount(call, i0, i1, i2, i3)
+func (s implNamespaceServerStub) Mount(ctx *context.T, call rpc.ServerCall, i0 string, i1 string, i2 time.Duration, i3 bool) error {
+	return s.impl.Mount(ctx, call, i0, i1, i2, i3)
 }
 
-func (s implNamespaceServerStub) Unmount(call rpc.ServerCall, i0 string, i1 string) error {
-	return s.impl.Unmount(call, i0, i1)
+func (s implNamespaceServerStub) Unmount(ctx *context.T, call rpc.ServerCall, i0 string, i1 string) error {
+	return s.impl.Unmount(ctx, call, i0, i1)
 }
 
-func (s implNamespaceServerStub) Resolve(call rpc.ServerCall, i0 string) ([]string, error) {
-	return s.impl.Resolve(call, i0)
+func (s implNamespaceServerStub) Resolve(ctx *context.T, call rpc.ServerCall, i0 string) ([]string, error) {
+	return s.impl.Resolve(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) ResolveToMountTable(call rpc.ServerCall, i0 string) ([]string, error) {
-	return s.impl.ResolveToMountTable(call, i0)
+func (s implNamespaceServerStub) ResolveToMountTable(ctx *context.T, call rpc.ServerCall, i0 string) ([]string, error) {
+	return s.impl.ResolveToMountTable(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) FlushCacheEntry(call rpc.ServerCall, i0 string) (bool, error) {
-	return s.impl.FlushCacheEntry(call, i0)
+func (s implNamespaceServerStub) FlushCacheEntry(ctx *context.T, call rpc.ServerCall, i0 string) (bool, error) {
+	return s.impl.FlushCacheEntry(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) DisableCache(call rpc.ServerCall, i0 bool) error {
-	return s.impl.DisableCache(call, i0)
+func (s implNamespaceServerStub) DisableCache(ctx *context.T, call rpc.ServerCall, i0 bool) error {
+	return s.impl.DisableCache(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) Roots(call rpc.ServerCall) ([]string, error) {
-	return s.impl.Roots(call)
+func (s implNamespaceServerStub) Roots(ctx *context.T, call rpc.ServerCall) ([]string, error) {
+	return s.impl.Roots(ctx, call)
 }
 
-func (s implNamespaceServerStub) SetRoots(call rpc.ServerCall, i0 []string) error {
-	return s.impl.SetRoots(call, i0)
+func (s implNamespaceServerStub) SetRoots(ctx *context.T, call rpc.ServerCall, i0 []string) error {
+	return s.impl.SetRoots(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) SetPermissions(call rpc.ServerCall, i0 string, i1 access.Permissions, i2 string) error {
-	return s.impl.SetPermissions(call, i0, i1, i2)
+func (s implNamespaceServerStub) SetPermissions(ctx *context.T, call rpc.ServerCall, i0 string, i1 access.Permissions, i2 string) error {
+	return s.impl.SetPermissions(ctx, call, i0, i1, i2)
 }
 
-func (s implNamespaceServerStub) GetPermissions(call rpc.ServerCall, i0 string) (access.Permissions, string, error) {
-	return s.impl.GetPermissions(call, i0)
+func (s implNamespaceServerStub) GetPermissions(ctx *context.T, call rpc.ServerCall, i0 string) (access.Permissions, string, error) {
+	return s.impl.GetPermissions(ctx, call, i0)
 }
 
-func (s implNamespaceServerStub) Delete(call rpc.ServerCall, i0 string, i1 bool) error {
-	return s.impl.Delete(call, i0, i1)
+func (s implNamespaceServerStub) Delete(ctx *context.T, call rpc.ServerCall, i0 string, i1 bool) error {
+	return s.impl.Delete(ctx, call, i0, i1)
 }
 
 func (s implNamespaceServerStub) Globber() *rpc.GlobState {
diff --git a/services/wspr/internal/namespace/request_handler.go b/services/wspr/internal/namespace/request_handler.go
index 862663c..8756061 100644
--- a/services/wspr/internal/namespace/request_handler.go
+++ b/services/wspr/internal/namespace/request_handler.go
@@ -24,9 +24,9 @@
 	return &Server{v23.GetNamespace(ctx)}
 }
 
-func (s *Server) Glob(call *NamespaceGlobServerCallStub, pattern string) error {
+func (s *Server) Glob(ctx *context.T, call *NamespaceGlobServerCallStub, pattern string) error {
 	// Call Glob on the namespace client instance
-	ch, err := s.ns.Glob(call.Context(), pattern)
+	ch, err := s.ns.Glob(ctx, pattern)
 	if err != nil {
 		return err
 	}
@@ -41,64 +41,64 @@
 	return nil
 }
 
-func (s *Server) Mount(call rpc.ServerCall, name, server string, ttl time.Duration, replace bool) error {
+func (s *Server) Mount(ctx *context.T, _ rpc.ServerCall, name, server string, ttl time.Duration, replace bool) error {
 	rmOpt := naming.ReplaceMount(replace)
-	err := s.ns.Mount(call.Context(), name, server, ttl, rmOpt)
+	err := s.ns.Mount(ctx, name, server, ttl, rmOpt)
 	if err != nil {
-		err = verror.Convert(verror.ErrInternal, call.Context(), err)
+		err = verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	return err
 }
 
-func (s *Server) Unmount(call rpc.ServerCall, name, server string) error {
-	return s.ns.Unmount(call.Context(), name, server)
+func (s *Server) Unmount(ctx *context.T, _ rpc.ServerCall, name, server string) error {
+	return s.ns.Unmount(ctx, name, server)
 }
 
-func (s *Server) Resolve(call rpc.ServerCall, name string) ([]string, error) {
-	me, err := s.ns.Resolve(call.Context(), name)
+func (s *Server) Resolve(ctx *context.T, _ rpc.ServerCall, name string) ([]string, error) {
+	me, err := s.ns.Resolve(ctx, name)
 	if err != nil {
-		return nil, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return nil, verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	return me.Names(), nil
 }
 
-func (s *Server) ResolveToMountTable(call rpc.ServerCall, name string) ([]string, error) {
-	me, err := s.ns.ResolveToMountTable(call.Context(), name)
+func (s *Server) ResolveToMountTable(ctx *context.T, _ rpc.ServerCall, name string) ([]string, error) {
+	me, err := s.ns.ResolveToMountTable(ctx, name)
 	if err != nil {
-		return nil, verror.Convert(verror.ErrInternal, call.Context(), err)
+		return nil, verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	return me.Names(), nil
 }
 
-func (s *Server) FlushCacheEntry(call rpc.ServerCall, name string) (bool, error) {
+func (s *Server) FlushCacheEntry(_ *context.T, _ rpc.ServerCall, name string) (bool, error) {
 	return s.ns.FlushCacheEntry(name), nil
 }
 
-func (s *Server) DisableCache(call rpc.ServerCall, disable bool) error {
+func (s *Server) DisableCache(_ *context.T, _ rpc.ServerCall, disable bool) error {
 	disableCacheCtl := naming.DisableCache(disable)
 	_ = s.ns.CacheCtl(disableCacheCtl)
 	return nil
 }
 
-func (s *Server) Roots(call rpc.ServerCall) ([]string, error) {
+func (s *Server) Roots(*context.T, rpc.ServerCall) ([]string, error) {
 	return s.ns.Roots(), nil
 }
 
-func (s *Server) SetRoots(call rpc.ServerCall, roots []string) error {
+func (s *Server) SetRoots(ctx *context.T, _ rpc.ServerCall, roots []string) error {
 	if err := s.ns.SetRoots(roots...); err != nil {
-		return verror.Convert(verror.ErrInternal, call.Context(), err)
+		return verror.Convert(verror.ErrInternal, ctx, err)
 	}
 	return nil
 }
 
-func (s *Server) SetPermissions(call rpc.ServerCall, name string, acl access.Permissions, version string) error {
-	return s.ns.SetPermissions(call.Context(), name, acl, version)
+func (s *Server) SetPermissions(ctx *context.T, _ rpc.ServerCall, name string, acl access.Permissions, version string) error {
+	return s.ns.SetPermissions(ctx, name, acl, version)
 }
 
-func (s *Server) GetPermissions(call rpc.ServerCall, name string) (access.Permissions, string, error) {
-	return s.ns.GetPermissions(call.Context(), name)
+func (s *Server) GetPermissions(ctx *context.T, _ rpc.ServerCall, name string) (access.Permissions, string, error) {
+	return s.ns.GetPermissions(ctx, name)
 }
 
-func (s *Server) Delete(call rpc.ServerCall, name string, deleteSubtree bool) error {
-	return s.ns.Delete(call.Context(), name, deleteSubtree)
+func (s *Server) Delete(ctx *context.T, _ rpc.ServerCall, name string, deleteSubtree bool) error {
+	return s.ns.Delete(ctx, name, deleteSubtree)
 }
diff --git a/services/wspr/internal/rpc/server/dispatcher_test.go b/services/wspr/internal/rpc/server/dispatcher_test.go
index b659aab..8053277 100644
--- a/services/wspr/internal/rpc/server/dispatcher_test.go
+++ b/services/wspr/internal/rpc/server/dispatcher_test.go
@@ -38,7 +38,7 @@
 	return nil, nil, nil
 }
 
-func (mockInvoker) Invoke(string, rpc.StreamServerCall, []interface{}) ([]interface{}, error) {
+func (mockInvoker) Invoke(*context.T, rpc.StreamServerCall, string, []interface{}) ([]interface{}, error) {
 	return nil, nil
 }
 
@@ -46,11 +46,11 @@
 	return nil
 }
 
-func (m mockInvoker) Signature(call rpc.ServerCall) ([]signature.Interface, error) {
+func (m mockInvoker) Signature(ctx *context.T, call rpc.ServerCall) ([]signature.Interface, error) {
 	return m.sig, nil
 }
 
-func (m mockInvoker) MethodSignature(call rpc.ServerCall, methodName string) (signature.Method, error) {
+func (m mockInvoker) MethodSignature(ctx *context.T, call rpc.ServerCall, methodName string) (signature.Method, error) {
 	method, found := m.sig[0].FindMethod(methodName)
 	if !found {
 		return signature.Method{}, fmt.Errorf("Method %q not found", methodName)
diff --git a/services/wspr/internal/rpc/server/invoker.go b/services/wspr/internal/rpc/server/invoker.go
index 90e86e9..c52a630 100644
--- a/services/wspr/internal/rpc/server/invoker.go
+++ b/services/wspr/internal/rpc/server/invoker.go
@@ -45,7 +45,7 @@
 
 // Prepare implements the Invoker interface.
 func (i *invoker) Prepare(methodName string, numArgs int) ([]interface{}, []*vdl.Value, error) {
-	method, err := i.MethodSignature(nil, methodName)
+	method, err := i.MethodSignature(nil, nil, methodName)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -60,8 +60,8 @@
 }
 
 // Invoke implements the Invoker interface.
-func (i *invoker) Invoke(methodName string, call rpc.StreamServerCall, argptrs []interface{}) ([]interface{}, error) {
-	replychan := i.invokeFunc(methodName, argptrs, call)
+func (i *invoker) Invoke(ctx *context.T, call rpc.StreamServerCall, methodName string, argptrs []interface{}) ([]interface{}, error) {
+	replychan := i.invokeFunc(ctx, call, methodName, argptrs)
 
 	// Wait for the result
 	reply := <-replychan
@@ -70,7 +70,7 @@
 		return nil, reply.Err
 	}
 
-	vtrace.GetStore(call.Context()).Merge(reply.TraceResponse)
+	vtrace.GetStore(ctx).Merge(reply.TraceResponse)
 
 	// Convert the reply.Results from []*vdl.Value to []interface{}
 	results := make([]interface{}, len(reply.Results))
@@ -88,23 +88,17 @@
 	return &rpc.GlobState{AllGlobber: i}
 }
 
-func (i *invoker) Glob__(call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
-	return i.globFunc(pattern, call)
+func (i *invoker) Glob__(ctx *context.T, call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
+	return i.globFunc(ctx, call, pattern)
 }
 
-func (i *invoker) Signature(call rpc.ServerCall) ([]signature.Interface, error) {
+func (i *invoker) Signature(ctx *context.T, call rpc.ServerCall) ([]signature.Interface, error) {
 	return i.signature, nil
 }
 
-func (i *invoker) MethodSignature(call rpc.ServerCall, method string) (signature.Method, error) {
+func (i *invoker) MethodSignature(ctx *context.T, call rpc.ServerCall, method string) (signature.Method, error) {
 	if methodSig, ok := signature.FirstMethod(i.signature, method); ok {
 		return methodSig, nil
 	}
-
-	var innerContext *context.T
-	if call != nil {
-		innerContext = call.Context()
-	}
-
-	return signature.Method{}, verror.New(ErrMethodNotFoundInSignature, innerContext, method)
+	return signature.Method{}, verror.New(ErrMethodNotFoundInSignature, ctx, method)
 }
diff --git a/services/wspr/internal/rpc/server/server.go b/services/wspr/internal/rpc/server/server.go
index 19299b6..90985ba 100644
--- a/services/wspr/internal/rpc/server/server.go
+++ b/services/wspr/internal/rpc/server/server.go
@@ -118,11 +118,11 @@
 
 // remoteInvokeFunc is a type of function that can invoke a remote method and
 // communicate the result back via a channel to the caller
-type remoteInvokeFunc func(methodName string, args []interface{}, call rpc.StreamServerCall) <-chan *lib.ServerRpcReply
+type remoteInvokeFunc func(ctx *context.T, call rpc.StreamServerCall, methodName string, args []interface{}) <-chan *lib.ServerRpcReply
 
 func (s *Server) createRemoteInvokerFunc(handle int32) remoteInvokeFunc {
-	return func(methodName string, args []interface{}, call rpc.StreamServerCall) <-chan *lib.ServerRpcReply {
-		securityCall := ConvertSecurityCall(s.helper, call.Context(), true)
+	return func(ctx *context.T, call rpc.StreamServerCall, methodName string, args []interface{}) <-chan *lib.ServerRpcReply {
+		securityCall := ConvertSecurityCall(s.helper, ctx, true)
 
 		flow := s.helper.CreateNewFlow(s, call)
 		replyChan := make(chan *lib.ServerRpcReply, 1)
@@ -131,13 +131,13 @@
 		s.outstandingRequestLock.Unlock()
 
 		var timeout vdltime.Deadline
-		if deadline, ok := call.Context().Deadline(); ok {
+		if deadline, ok := ctx.Deadline(); ok {
 			timeout.Time = deadline
 		}
 
 		errHandler := func(err error) <-chan *lib.ServerRpcReply {
 			if ch := s.popServerRequest(flow.ID); ch != nil {
-				stdErr := verror.Convert(verror.ErrInternal, call.Context(), err).(verror.E)
+				stdErr := verror.Convert(verror.ErrInternal, ctx, err).(verror.E)
 				ch <- &lib.ServerRpcReply{nil, &stdErr, vtrace.Response{}}
 				s.helper.CleanupFlow(flow.ID)
 			}
@@ -152,7 +152,7 @@
 		rpcCall := ServerRpcRequestCall{
 			SecurityCall:     securityCall,
 			Deadline:         timeout,
-			TraceRequest:     vtrace.GetRequest(call.Context()),
+			TraceRequest:     vtrace.GetRequest(ctx),
 			GrantedBlessings: grantedBlessings,
 		}
 
@@ -184,7 +184,7 @@
 
 		// Watch for cancellation.
 		go func() {
-			<-call.Context().Done()
+			<-ctx.Done()
 			ch := s.popServerRequest(flow.ID)
 			if ch == nil {
 				return
@@ -194,7 +194,7 @@
 			flow.Writer.Send(lib.ResponseCancel, nil)
 			s.helper.CleanupFlow(flow.ID)
 
-			err := verror.Convert(verror.ErrAborted, call.Context(), call.Context().Err()).(verror.E)
+			err := verror.Convert(verror.ErrAborted, ctx, ctx.Err()).(verror.E)
 			ch <- &lib.ServerRpcReply{nil, &err, vtrace.Response{}}
 		}()
 
@@ -228,19 +228,19 @@
 
 // remoteGlobFunc is a type of function that can invoke a remote glob and
 // communicate the result back via the channel returned
-type remoteGlobFunc func(pattern string, call rpc.ServerCall) (<-chan naming.GlobReply, error)
+type remoteGlobFunc func(ctx *context.T, call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error)
 
 func (s *Server) createRemoteGlobFunc(handle int32) remoteGlobFunc {
-	return func(pattern string, call rpc.ServerCall) (<-chan naming.GlobReply, error) {
+	return func(ctx *context.T, call rpc.ServerCall, pattern string) (<-chan naming.GlobReply, error) {
 		// Until the tests get fixed, we need to create a security context before creating the flow
 		// because creating the security context creates a flow and flow ids will be off.
 		// See https://github.com/veyron/release-issues/issues/1181
-		securityCall := ConvertSecurityCall(s.helper, call.Context(), true)
+		securityCall := ConvertSecurityCall(s.helper, ctx, true)
 
 		globChan := make(chan naming.GlobReply, 1)
 		flow := s.helper.CreateNewFlow(s, &globStream{
 			ch:  globChan,
-			ctx: call.Context(),
+			ctx: ctx,
 		})
 		replyChan := make(chan *lib.ServerRpcReply, 1)
 		s.outstandingRequestLock.Lock()
@@ -248,7 +248,7 @@
 		s.outstandingRequestLock.Unlock()
 
 		var timeout vdltime.Deadline
-		if deadline, ok := call.Context().Deadline(); ok {
+		if deadline, ok := ctx.Deadline(); ok {
 			timeout.Time = deadline
 		}
 
@@ -256,7 +256,7 @@
 			if ch := s.popServerRequest(flow.ID); ch != nil {
 				s.helper.CleanupFlow(flow.ID)
 			}
-			return nil, verror.Convert(verror.ErrInternal, call.Context(), err).(verror.E)
+			return nil, verror.Convert(verror.ErrInternal, ctx, err).(verror.E)
 		}
 
 		var grantedBlessings *principal.JsBlessings
@@ -290,7 +290,7 @@
 
 		// Watch for cancellation.
 		go func() {
-			<-call.Context().Done()
+			<-ctx.Done()
 			ch := s.popServerRequest(flow.ID)
 			if ch == nil {
 				return
@@ -300,7 +300,7 @@
 			flow.Writer.Send(lib.ResponseCancel, nil)
 			s.helper.CleanupFlow(flow.ID)
 
-			err := verror.Convert(verror.ErrAborted, call.Context(), call.Context().Err()).(verror.E)
+			err := verror.Convert(verror.ErrAborted, ctx, ctx.Err()).(verror.E)
 			ch <- &lib.ServerRpcReply{nil, &err, vtrace.Response{}}
 		}()