wspr: Move WSPR and Browspr toward the new runtime API.

Also, remove Logger from the runtime.

MultiPart: 2/2

Change-Id: I3748946770b0ee521bb79b851c13e8cd040dd741
diff --git a/services/wsprd/account/account.go b/services/wsprd/account/account.go
index acba958..4eba8e1 100644
--- a/services/wsprd/account/account.go
+++ b/services/wsprd/account/account.go
@@ -18,13 +18,13 @@
 }
 
 type bs struct {
-	client ipc.Client
-	name   string
+	name string
 }
 
 func (s *bs) BlessUsingAccessToken(ctx *context.T, token string, opts ...ipc.CallOpt) (blessingObj security.WireBlessings, account string, err error) {
+	client := veyron2.GetClient(ctx)
 	var call ipc.Call
-	if call, err = s.client.StartCall(ctx, s.name, "BlessUsingAccessToken", []interface{}{token}, opts...); err != nil {
+	if call, err = client.StartCall(ctx, s.name, "BlessUsingAccessToken", []interface{}{token}, opts...); err != nil {
 		return
 	}
 	var email string
@@ -40,22 +40,21 @@
 }
 
 type AccountManager struct {
-	rt               veyron2.Runtime
+	ctx              *context.T
 	blesser          BlesserService
 	principalManager *principal.PrincipalManager
 }
 
-func NewAccountManager(rt veyron2.Runtime, identitydEndpoint string, principalManager *principal.PrincipalManager) *AccountManager {
+func NewAccountManager(identitydEndpoint string, principalManager *principal.PrincipalManager) *AccountManager {
 	return &AccountManager{
-		rt:               rt,
-		blesser:          &bs{client: rt.Client(), name: identitydEndpoint},
+		blesser:          &bs{name: identitydEndpoint},
 		principalManager: principalManager,
 	}
 }
 
-func (am *AccountManager) CreateAccount(accessToken string) (string, error) {
+func (am *AccountManager) CreateAccount(ctx *context.T, accessToken string) (string, error) {
 	// Get a blessing for the access token from blessing server.
-	ctx, cancel := context.WithTimeout(am.rt.NewContext(), time.Minute)
+	ctx, cancel := context.WithTimeout(ctx, time.Minute)
 	defer cancel()
 	blessings, account, err := am.blesser.BlessUsingAccessToken(ctx, accessToken)
 	if err != nil {
diff --git a/services/wsprd/app/app.go b/services/wsprd/app/app.go
index 3421ab7..a4fd68a 100644
--- a/services/wsprd/app/app.go
+++ b/services/wsprd/app/app.go
@@ -93,10 +93,11 @@
 	// TODO(bjornick): We need to split this up.
 	sync.Mutex
 
-	logger vlog.Logger
+	// The context of this controller.
+	ctx *context.T
 
-	// The runtime to use to create new clients.
-	rt veyron2.Runtime
+	// The cleanup function for this controller.
+	cancel context.CancelFunc
 
 	// The ipc.ListenSpec to use with server.Listen
 	listenSpec *ipc.ListenSpec
@@ -153,8 +154,8 @@
 	}
 
 	controller := &Controller{
-		rt:             r,
-		logger:         r.Logger(),
+		ctx:            r.NewContext(),
+		cancel:         r.Cleanup,
 		client:         client,
 		writerCreator:  writerCreator,
 		listenSpec:     listenSpec,
@@ -271,12 +272,12 @@
 
 // GetLogger returns a Veyron logger to use.
 func (c *Controller) GetLogger() vlog.Logger {
-	return c.logger
+	return veyron2.GetLogger(c.ctx)
 }
 
 // RT returns the runtime of the app.
-func (c *Controller) RT() veyron2.Runtime {
-	return c.rt
+func (c *Controller) Context() *context.T {
+	return c.ctx
 }
 
 // AddBlessings adds the Blessings to the local blessings store and returns
@@ -289,7 +290,7 @@
 
 // Cleanup cleans up any outstanding rpcs.
 func (c *Controller) Cleanup() {
-	c.logger.VI(0).Info("Cleaning up pipe")
+	c.GetLogger().VI(0).Info("Cleaning up pipe")
 	c.Lock()
 	defer c.Unlock()
 
@@ -306,7 +307,7 @@
 		server.Stop()
 	}
 
-	c.RT().Cleanup()
+	c.cancel()
 }
 
 func (c *Controller) setup() {
@@ -427,7 +428,7 @@
 		request.stream.end()
 		return
 	}
-	c.logger.Errorf("close called on non-existent call: %v", id)
+	c.GetLogger().Errorf("close called on non-existent call: %v", id)
 }
 
 func (c *Controller) maybeCreateServer(serverId uint32) (*server.Server, error) {
@@ -464,7 +465,7 @@
 		w.Error(verror2.Convert(verror2.Internal, nil, err))
 	}
 
-	c.logger.VI(2).Infof("serving under name: %q", serveRequest.Name)
+	c.GetLogger().VI(2).Infof("serving under name: %q", serveRequest.Name)
 
 	if err := server.Serve(serveRequest.Name); err != nil {
 		w.Error(verror2.Convert(verror2.Internal, nil, err))
@@ -496,7 +497,7 @@
 	server := c.flowMap[id]
 	c.Unlock()
 	if server == nil {
-		c.logger.Errorf("unexpected result from JavaScript. No channel "+
+		c.GetLogger().Errorf("unexpected result from JavaScript. No channel "+
 			"for MessageId: %d exists. Ignoring the results.", id)
 		//Ignore unknown responses that don't belong to any channel
 		return
@@ -511,7 +512,7 @@
 	server := c.flowMap[id]
 	c.Unlock()
 	if server == nil {
-		c.logger.Errorf("unexpected result from JavaScript. No channel "+
+		c.GetLogger().Errorf("unexpected result from JavaScript. No channel "+
 			"for MessageId: %d exists. Ignoring the results.", id)
 		//Ignore unknown responses that don't belong to any channel
 		return
@@ -602,7 +603,7 @@
 	server := c.flowMap[id]
 	c.Unlock()
 	if server == nil {
-		c.logger.Errorf("unexpected result from JavaScript. No channel "+
+		c.GetLogger().Errorf("unexpected result from JavaScript. No channel "+
 			"for MessageId: %d exists. Ignoring the results.", id)
 		//Ignore unknown responses that don't belong to any channel
 		return
@@ -616,7 +617,7 @@
 	if err := lib.VomDecode(data, &msg); err != nil {
 		return nil, err
 	}
-	c.logger.VI(2).Infof("VeyronRPC: %s.%s(..., streaming=%v)", msg.Name, msg.Method, msg.IsStreaming)
+	c.GetLogger().VI(2).Infof("VeyronRPC: %s.%s(..., streaming=%v)", msg.Name, msg.Method, msg.IsStreaming)
 	return &msg, nil
 }
 
@@ -638,7 +639,7 @@
 		return
 	}
 
-	c.logger.VI(2).Infof("requesting Signature for %q", request.Name)
+	c.GetLogger().VI(2).Infof("requesting Signature for %q", request.Name)
 	sig, err := c.getSignature(ctx, request.Name)
 	if err != nil {
 		w.Error(err)
@@ -716,7 +717,8 @@
 	// out using the Default blessing in this principal's blessings store. We
 	// should change this so that the JS blessing request can also specify the
 	// blessing to be used for the Bless operation.
-	blessings, err := c.rt.Principal().Bless(blessee.PublicKey(), c.rt.Principal().BlessingStore().Default(), request.Extension, caveats[0], caveats[1:]...)
+	p := veyron2.GetPrincipal(c.ctx)
+	blessings, err := p.Bless(blessee.PublicKey(), p.BlessingStore().Default(), request.Extension, caveats[0], caveats[1:]...)
 	if err != nil {
 		return nil, err
 	}
@@ -771,5 +773,5 @@
 
 // HandleNamespaceRequest uses the namespace client to respond to namespace specific requests such as glob
 func (c *Controller) HandleNamespaceRequest(ctx *context.T, data string, w lib.ClientWriter) {
-	namespace.HandleRequest(ctx, c.rt, data, w)
+	namespace.HandleRequest(ctx, data, w)
 }
diff --git a/services/wsprd/app/app_test.go b/services/wsprd/app/app_test.go
index bdfca88..93849b7 100644
--- a/services/wsprd/app/app_test.go
+++ b/services/wsprd/app/app_test.go
@@ -331,7 +331,7 @@
 	if err != nil {
 		return nil, err
 	}
-	controller.rt.Namespace().SetRoots("/" + endpoint.String())
+	veyron2.GetNamespace(controller.Context()).SetRoots("/" + endpoint.String())
 
 	controller.serve(serveRequest{
 		Name: "adder",
@@ -464,14 +464,15 @@
 		return mock
 	}
 
-	// Create a client using app's runtime so it points to the right mounttable.
-	client, err := rt.controller.rt.NewClient()
+	// Get the client that is relevant to the controller so it talks
+	// to the right mounttable.
+	client := veyron2.GetClient(rt.controller.Context())
 
 	if err != nil {
 		t.Errorf("unable to create client: %v", err)
 	}
 
-	call, err := client.StartCall(rt.controller.rt.NewContext(), "adder/adder", test.method, test.inArgs)
+	call, err := client.StartCall(rt.controller.Context(), "adder/adder", test.method, test.inArgs)
 	if err != nil {
 		t.Errorf("failed to start call: %v", err)
 	}
diff --git a/services/wsprd/app/messaging.go b/services/wsprd/app/messaging.go
index 8b6eecd..59960b9 100644
--- a/services/wsprd/app/messaging.go
+++ b/services/wsprd/app/messaging.go
@@ -9,6 +9,7 @@
 	verror "v.io/core/veyron2/verror2"
 	"v.io/core/veyron2/vlog"
 	"v.io/core/veyron2/vom2"
+	"v.io/core/veyron2/vtrace"
 	"v.io/wspr/veyron/services/wsprd/lib"
 )
 
@@ -90,7 +91,8 @@
 // HandleIncomingMessage handles most incoming messages from JS and calls the appropriate handler.
 func (c *Controller) HandleIncomingMessage(msg Message, w lib.ClientWriter) {
 	// TODO(mattr): Get the proper context information from javascript.
-	ctx := c.RT().NewContext()
+	ctx, _ := vtrace.SetNewTrace(c.Context())
+
 	switch msg.Type {
 	case VeyronRequestMessage:
 		c.HandleVeyronRequest(ctx, msg.Id, msg.Data, w)
diff --git a/services/wsprd/browspr/browspr.go b/services/wsprd/browspr/browspr.go
index 7d9f6b3..3328447 100644
--- a/services/wsprd/browspr/browspr.go
+++ b/services/wsprd/browspr/browspr.go
@@ -6,10 +6,12 @@
 	"sync"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/vdl"
 	"v.io/core/veyron2/vdl/valconv"
 	"v.io/core/veyron2/vlog"
+	"v.io/core/veyron2/vtrace"
 	"v.io/wspr/veyron/services/wsprd/account"
 	"v.io/wspr/veyron/services/wsprd/lib"
 	"v.io/wspr/veyron/services/wsprd/namespace"
@@ -23,14 +25,14 @@
 // Browspr is an intermediary between our javascript code and the veyron
 // network that allows our javascript library to use veyron.
 type Browspr struct {
-	rt               veyron2.Runtime
+	ctx              *context.T
 	profileFactory   func() veyron2.Profile
 	listenSpec       *ipc.ListenSpec
 	namespaceRoots   []string
-	logger           vlog.Logger
 	accountManager   *account.AccountManager
 	postMessage      func(instanceId int32, ty, msg string)
 	principalManager *principal.PrincipalManager
+	logger           vlog.Logger
 
 	// Locks activeInstances
 	mu              sync.Mutex
@@ -38,7 +40,7 @@
 }
 
 // Create a new Browspr instance.
-func NewBrowspr(runtime veyron2.Runtime,
+func NewBrowspr(ctx *context.T,
 	postMessage func(instanceId int32, ty, msg string),
 	profileFactory func() veyron2.Profile,
 	listenSpec *ipc.ListenSpec,
@@ -56,18 +58,19 @@
 		listenSpec:      listenSpec,
 		namespaceRoots:  wsNamespaceRoots,
 		postMessage:     postMessage,
-		rt:              runtime,
-		logger:          runtime.Logger(),
+		ctx:             ctx,
+		logger:          veyron2.GetLogger(ctx),
 		activeInstances: make(map[int32]*pipe),
 	}
 
 	// TODO(nlacasse, bjornick) use a serializer that can actually persist.
 	var err error
-	if browspr.principalManager, err = principal.NewPrincipalManager(runtime.Principal(), &principal.InMemorySerializer{}); err != nil {
+	p := veyron2.GetPrincipal(ctx)
+	if browspr.principalManager, err = principal.NewPrincipalManager(p, &principal.InMemorySerializer{}); err != nil {
 		vlog.Fatalf("principal.NewPrincipalManager failed: %s", err)
 	}
 
-	browspr.accountManager = account.NewAccountManager(runtime, identd, browspr.principalManager)
+	browspr.accountManager = account.NewAccountManager(identd, browspr.principalManager)
 
 	return browspr
 }
@@ -133,7 +136,8 @@
 		return nil, err
 	}
 
-	account, err := b.accountManager.CreateAccount(msg.Token)
+	ctx, _ := vtrace.SetNewTrace(b.ctx)
+	account, err := b.accountManager.CreateAccount(ctx, msg.Token)
 	if err != nil {
 		return nil, err
 	}
diff --git a/services/wsprd/browspr/browspr_account_test.go b/services/wsprd/browspr/browspr_account_test.go
index e98a15d..7bbe5e5 100644
--- a/services/wsprd/browspr/browspr_account_test.go
+++ b/services/wsprd/browspr/browspr_account_test.go
@@ -4,6 +4,7 @@
 	"fmt"
 	"testing"
 
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/rt"
@@ -47,8 +48,9 @@
 		t.Fatal(err)
 	}
 	mockPostMessage := func(_ int32, _, _ string) {}
-	browspr := NewBrowspr(r, mockPostMessage, nil, &spec, "/mock:1234/identd", nil)
-	browspr.accountManager.SetMockBlesser(newMockBlesserService(browspr.rt.Principal()))
+	browspr := NewBrowspr(r.NewContext(), mockPostMessage, nil, &spec, "/mock:1234/identd", nil)
+	principal := veyron2.GetPrincipal(browspr.ctx)
+	browspr.accountManager.SetMockBlesser(newMockBlesserService(principal))
 
 	return browspr, func() {
 		browspr.Shutdown()
@@ -104,7 +106,8 @@
 
 	// First create an account.
 	account := "mock-account"
-	blessing, err := browspr.rt.Principal().BlessSelf(account)
+	principal := veyron2.GetPrincipal(browspr.ctx)
+	blessing, err := principal.BlessSelf(account)
 	if err != nil {
 		t.Fatalf("browspr.rt.Principal.BlessSelf(%v) failed: %v", account, err)
 	}
diff --git a/services/wsprd/browspr/browspr_test.go b/services/wsprd/browspr/browspr_test.go
index f9bcfda..da66a3c 100644
--- a/services/wsprd/browspr/browspr_test.go
+++ b/services/wsprd/browspr/browspr_test.go
@@ -153,12 +153,14 @@
 		vlog.Fatalf("rt.New failed: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
+
 	wsNamespaceRoots, err := lib.EndpointsToWs([]string{tcpNamespaceRoot})
 	if err != nil {
 		vlog.Fatal(err)
 	}
-	runtime.Namespace().SetRoots(wsNamespaceRoots...)
-	browspr := NewBrowspr(runtime, postMessageHandler, nil, &spec, "/mock:1234/identd", wsNamespaceRoots)
+	veyron2.GetNamespace(ctx).SetRoots(wsNamespaceRoots...)
+	browspr := NewBrowspr(ctx, postMessageHandler, nil, &spec, "/mock:1234/identd", wsNamespaceRoots)
 
 	// browspr sets its namespace root to use the "ws" protocol, but we want to force "tcp" here.
 	browspr.namespaceRoots = []string{tcpNamespaceRoot}
@@ -172,7 +174,8 @@
 	// Associate the origin with the root accounts' blessings, otherwise a
 	// dummy account will be used and will be rejected by the authorizer.
 	accountName := "test-account"
-	if err := browspr.principalManager.AddAccount(accountName, browspr.rt.Principal().BlessingStore().Default()); err != nil {
+	bp := veyron2.GetPrincipal(browspr.ctx)
+	if err := browspr.principalManager.AddAccount(accountName, bp.BlessingStore().Default()); err != nil {
 		t.Fatalf("Failed to add account: %v")
 	}
 	if err := browspr.accountManager.AssociateAccount(msgOrigin, accountName, nil); err != nil {
diff --git a/services/wsprd/browspr/main/main_nacl.go b/services/wsprd/browspr/main/main_nacl.go
index 7e6c736..4f046e7 100644
--- a/services/wsprd/browspr/main/main_nacl.go
+++ b/services/wsprd/browspr/main/main_nacl.go
@@ -228,7 +228,7 @@
 	runtime.Namespace().SetRoots(wsNamespaceRoots...)
 
 	fmt.Printf("Starting browspr with config: proxy=%q mounttable=%q identityd=%q identitydBlessingRoot=%q ", msg.Proxy, msg.NamespaceRoot, msg.Identityd, msg.IdentitydBlessingRoot)
-	inst.browspr = browspr.NewBrowspr(runtime,
+	inst.browspr = browspr.NewBrowspr(runtime.NewContext(),
 		inst.BrowsprOutgoingPostMessage,
 		chrome.New,
 		&listenSpec,
diff --git a/services/wsprd/browspr/pipe.go b/services/wsprd/browspr/pipe.go
index 83e8b90..fbcc10f 100644
--- a/services/wsprd/browspr/pipe.go
+++ b/services/wsprd/browspr/pipe.go
@@ -31,16 +31,16 @@
 		// TODO(nlacasse, bjornick): This code should go away once we
 		// start requiring authentication.  At that point, we should
 		// just return an error to the client.
-		b.rt.Logger().Errorf("No principal associated with origin %v, creating a new principal with self-signed blessing from browspr: %v", origin, err)
+		b.logger.Errorf("No principal associated with origin %v, creating a new principal with self-signed blessing from browspr: %v", origin, err)
 
 		dummyAccount, err := b.principalManager.DummyAccount()
 		if err != nil {
-			b.rt.Logger().Errorf("principalManager.DummyAccount() failed: %v", err)
+			b.logger.Errorf("principalManager.DummyAccount() failed: %v", err)
 			return nil
 		}
 
 		if err := b.accountManager.AssociateAccount(origin, dummyAccount, nil); err != nil {
-			b.rt.Logger().Errorf("accountManager.AssociateAccount(%v, %v, %v) failed: %v", origin, dummyAccount, nil, err)
+			b.logger.Errorf("accountManager.AssociateAccount(%v, %v, %v) failed: %v", origin, dummyAccount, nil, err)
 			return nil
 		}
 		p, err = b.accountManager.LookupPrincipal(origin)
@@ -55,7 +55,7 @@
 	}
 	pipe.controller, err = app.NewController(pipe.createWriter, profile, b.listenSpec, b.namespaceRoots, options.RuntimePrincipal{p})
 	if err != nil {
-		b.rt.Logger().Errorf("Could not create controller: %v", err)
+		b.logger.Errorf("Could not create controller: %v", err)
 		return nil
 	}
 
diff --git a/services/wsprd/ipc/server/dispatcher_test.go b/services/wsprd/ipc/server/dispatcher_test.go
index 0d5cacd..72b7293 100644
--- a/services/wsprd/ipc/server/dispatcher_test.go
+++ b/services/wsprd/ipc/server/dispatcher_test.go
@@ -6,6 +6,7 @@
 	"testing"
 
 	_ "v.io/core/veyron/profiles"
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/security"
@@ -80,7 +81,8 @@
 	defer runtime.Cleanup()
 
 	flowFactory := &mockFlowFactory{}
-	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, runtime.Logger())
+	logger := veyron2.GetLogger(runtime.NewContext())
+	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, logger)
 	expectedSig := []signature.Interface{
 		{Name: "AName"},
 	}
@@ -131,7 +133,8 @@
 	defer runtime.Cleanup()
 
 	flowFactory := &mockFlowFactory{}
-	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, runtime.Logger())
+	logger := veyron2.GetLogger(runtime.NewContext())
+	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, logger)
 	expectedSig := []signature.Interface{
 		{Name: "AName"},
 	}
@@ -182,7 +185,8 @@
 	defer runtime.Cleanup()
 
 	flowFactory := &mockFlowFactory{}
-	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, runtime.Logger())
+	logger := veyron2.GetLogger(runtime.NewContext())
+	d := newDispatcher(0, flowFactory, mockInvokerFactory{}, mockAuthorizerFactory{}, logger)
 	go func() {
 		if err := flowFactory.writer.WaitForMessage(1); err != nil {
 			t.Errorf("failed to get dispatch request %v", err)
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index ee36b4e..1fdea44 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -11,6 +11,7 @@
 	"v.io/wspr/veyron/services/wsprd/principal"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/vdl/vdlroot/src/signature"
@@ -53,8 +54,7 @@
 	HandleStore
 
 	GetLogger() vlog.Logger
-
-	RT() veyron2.Runtime
+	Context() *context.T
 }
 
 type authReply struct {
@@ -119,7 +119,7 @@
 		outstandingAuthRequests:   make(map[int32]chan error),
 	}
 	var err error
-	if server.server, err = helper.RT().NewServer(); err != nil {
+	if server.server, err = veyron2.NewServer(helper.Context()); err != nil {
 		return nil, err
 	}
 	return server, nil
diff --git a/services/wsprd/namespace/request_handler.go b/services/wsprd/namespace/request_handler.go
index 6753ddd..863d7c1 100644
--- a/services/wsprd/namespace/request_handler.go
+++ b/services/wsprd/namespace/request_handler.go
@@ -81,7 +81,7 @@
 }
 
 // handleRequest uses the namespace client to respond to namespace specific requests such as glob
-func HandleRequest(ctx *context.T, rt veyron2.Runtime, data string, w lib.ClientWriter) {
+func HandleRequest(ctx *context.T, data string, w lib.ClientWriter) {
 	// Decode the request
 	var req request
 	if err := json.Unmarshal([]byte(data), &req); err != nil {
@@ -90,7 +90,7 @@
 	}
 
 	// Get the runtime's Namespace client
-	var ns = rt.Namespace()
+	var ns = veyron2.GetNamespace(ctx)
 
 	switch req.Method {
 	case methodGlob:
diff --git a/services/wsprd/wspr.go b/services/wsprd/wspr.go
index b984322..f225fde 100644
--- a/services/wsprd/wspr.go
+++ b/services/wsprd/wspr.go
@@ -25,7 +25,7 @@
 
 	ctx := r.NewContext()
 
-	proxy := wspr.NewWSPR(r, *port, roaming.New, &roaming.ListenSpec, *identd, nil)
+	proxy := wspr.NewWSPR(ctx, *port, roaming.New, &roaming.ListenSpec, *identd, nil)
 	defer proxy.Shutdown()
 
 	proxy.Listen()
diff --git a/services/wsprd/wspr/pipe.go b/services/wsprd/wspr/pipe.go
index b70680f..8d15529 100644
--- a/services/wsprd/wspr/pipe.go
+++ b/services/wsprd/wspr/pipe.go
@@ -47,7 +47,7 @@
 }
 
 func newPipe(w http.ResponseWriter, req *http.Request, wspr *WSPR, creator func(id int32) lib.ClientWriter) *pipe {
-	pipe := &pipe{logger: wspr.rt.Logger(), wspr: wspr, req: req}
+	pipe := &pipe{logger: wspr.logger, wspr: wspr, req: req}
 
 	if creator == nil {
 		creator = func(id int32) lib.ClientWriter {
@@ -57,15 +57,15 @@
 	pipe.writerCreator = creator
 	origin := req.Header.Get("Origin")
 	if origin == "" {
-		wspr.rt.Logger().Errorf("Could not read origin from the request")
+		wspr.logger.Errorf("Could not read origin from the request")
 		http.Error(w, "Could not read origin from the request", http.StatusBadRequest)
 		return nil
 	}
 
 	p, err := wspr.principalManager.Principal(origin)
 	if err != nil {
-		p = wspr.rt.Principal()
-		wspr.rt.Logger().Errorf("no principal associated with origin %s: %v", origin, err)
+		p = veyron2.GetPrincipal(wspr.ctx)
+		wspr.logger.Errorf("no principal associated with origin %s: %v", origin, err)
 		// TODO(bjornick): Send an error to the client when all of the principal stuff is set up.
 	}
 
@@ -75,7 +75,7 @@
 	}
 	pipe.controller, err = app.NewController(creator, profile, wspr.listenSpec, wspr.namespaceRoots, options.RuntimePrincipal{p})
 	if err != nil {
-		wspr.rt.Logger().Errorf("Could not create controller: %v", err)
+		wspr.logger.Errorf("Could not create controller: %v", err)
 		http.Error(w, fmt.Sprintf("Failed to create controller: %v", err), http.StatusInternalServerError)
 		return nil
 	}
diff --git a/services/wsprd/wspr/wspr.go b/services/wsprd/wspr/wspr.go
index 821309d..f6b56b3 100644
--- a/services/wsprd/wspr/wspr.go
+++ b/services/wsprd/wspr/wspr.go
@@ -26,6 +26,7 @@
 	"time"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/vlog"
 
@@ -41,11 +42,11 @@
 type WSPR struct {
 	mu      sync.Mutex
 	tlsCert *tls.Certificate
-	rt      veyron2.Runtime
+	logger  vlog.Logger
+	ctx     *context.T
 	// HTTP port for WSPR to serve on. Note, WSPR always serves on localhost.
 	httpPort         int
 	ln               *net.TCPListener // HTTP listener
-	logger           vlog.Logger
 	profileFactory   func() veyron2.Profile
 	listenSpec       *ipc.ListenSpec
 	namespaceRoots   []string
@@ -54,8 +55,6 @@
 	pipes            map[*http.Request]*pipe
 }
 
-var logger vlog.Logger
-
 func readFromRequest(r *http.Request) (*bytes.Buffer, error) {
 	var buf bytes.Buffer
 	if readBytes, err := io.Copy(&buf, r.Body); err != nil {
@@ -123,7 +122,7 @@
 }
 
 // Creates a new WebSocket Proxy object.
-func NewWSPR(runtime veyron2.Runtime, httpPort int, profileFactory func() veyron2.Profile, listenSpec *ipc.ListenSpec, identdEP string, namespaceRoots []string) *WSPR {
+func NewWSPR(ctx *context.T, httpPort int, profileFactory func() veyron2.Profile, listenSpec *ipc.ListenSpec, identdEP string, namespaceRoots []string) *WSPR {
 	if listenSpec.Proxy == "" {
 		vlog.Fatalf("a veyron proxy must be set")
 	}
@@ -133,18 +132,18 @@
 		profileFactory: profileFactory,
 		listenSpec:     listenSpec,
 		namespaceRoots: namespaceRoots,
-		rt:             runtime,
-		logger:         runtime.Logger(),
+		logger:         veyron2.GetLogger(ctx),
 		pipes:          map[*http.Request]*pipe{},
 	}
 
 	// TODO(nlacasse, bjornick) use a serializer that can actually persist.
+	p := veyron2.GetPrincipal(ctx)
 	var err error
-	if wspr.principalManager, err = principal.NewPrincipalManager(runtime.Principal(), &principal.InMemorySerializer{}); err != nil {
+	if wspr.principalManager, err = principal.NewPrincipalManager(p, &principal.InMemorySerializer{}); err != nil {
 		vlog.Fatalf("principal.NewPrincipalManager failed: %s", err)
 	}
 
-	wspr.accountManager = account.NewAccountManager(runtime, identdEP, wspr.principalManager)
+	wspr.accountManager = account.NewAccountManager(identdEP, wspr.principalManager)
 
 	return wspr
 }