Merge "veyron2/context: Remove the runtime from the context.  It is no longer used."
diff --git a/lib/modules/core/echo.go b/lib/modules/core/echo.go
index de07924..15fb7b3 100644
--- a/lib/modules/core/echo.go
+++ b/lib/modules/core/echo.go
@@ -54,6 +54,7 @@
 		panic(err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	fl, args, err := parseListenFlags(args)
 	if err != nil {
@@ -64,7 +65,7 @@
 	}
 	id, mp := args[0], args[1]
 	disp := &treeDispatcher{id: id}
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return err
 	}
@@ -91,14 +92,14 @@
 		panic(err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	args = args[1:]
 	name := args[0]
 	args = args[1:]
-	client := veyron2.GetClient(runtime.NewContext())
+	client := veyron2.GetClient(ctx)
 	for _, a := range args {
-		ctxt := runtime.NewContext()
-		h, err := client.StartCall(ctxt, name, "Echo", []interface{}{a})
+		h, err := client.StartCall(ctx, name, "Echo", []interface{}{a})
 		if err != nil {
 			return err
 		}
diff --git a/lib/modules/core/mounttable.go b/lib/modules/core/mounttable.go
index fc71b66..121d376 100644
--- a/lib/modules/core/mounttable.go
+++ b/lib/modules/core/mounttable.go
@@ -38,13 +38,14 @@
 		panic(err)
 	}
 	defer r.Cleanup()
+	ctx := r.NewContext()
 
 	fl, args, err := parseListenFlags(args)
 	if err != nil {
 		return fmt.Errorf("failed to parse args: %s", err)
 	}
 	lspec := initListenSpec(fl)
-	server, err := r.NewServer(options.ServesMountTable(true))
+	server, err := veyron2.NewServer(ctx, options.ServesMountTable(true))
 	if err != nil {
 		return fmt.Errorf("root failed: %v", err)
 	}
diff --git a/lib/signals/signals_test.go b/lib/signals/signals_test.go
index 76ec21a..ba11718 100644
--- a/lib/signals/signals_test.go
+++ b/lib/signals/signals_test.go
@@ -323,8 +323,8 @@
 
 }
 
-func createConfigServer(t *testing.T, runtime veyron2.Runtime) (ipc.Server, string, <-chan string) {
-	server, err := runtime.NewServer()
+func createConfigServer(t *testing.T, ctx *context.T) (ipc.Server, string, <-chan string) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
@@ -347,6 +347,7 @@
 		panic(err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	sh, err := modules.NewShell(nil)
 	if err != nil {
@@ -356,10 +357,10 @@
 
 	// Set the child process up with a blessing from the parent so that
 	// the default authorization works for RPCs between the two.
-	principal := veyron2.GetPrincipal(runtime.NewContext())
+	principal := veyron2.GetPrincipal(ctx)
 	childcreds, _ := security.ForkCredentials(principal, "child")
 	defer os.RemoveAll(childcreds)
-	configServer, configServiceName, ch := createConfigServer(t, runtime)
+	configServer, configServiceName, ch := createConfigServer(t, ctx)
 	defer configServer.Stop()
 	sh.SetVar(consts.VeyronCredentials, childcreds)
 	sh.SetConfigKey(mgmt.ParentNameConfigKey, configServiceName)
@@ -373,7 +374,7 @@
 	appCycleName := <-ch
 	s.Expect("ready")
 	appCycle := appcycle.AppCycleClient(appCycleName)
-	stream, err := appCycle.Stop(runtime.NewContext())
+	stream, err := appCycle.Stop(ctx)
 	if err != nil {
 		t.Fatalf("Got error: %v", err)
 	}
diff --git a/runtimes/google/ipc/benchmark/benchmark_test.go b/runtimes/google/ipc/benchmark/benchmark_test.go
index cb459f3..89b1e4f 100644
--- a/runtimes/google/ipc/benchmark/benchmark_test.go
+++ b/runtimes/google/ipc/benchmark/benchmark_test.go
@@ -105,12 +105,13 @@
 	if err != nil {
 		panic(err)
 	}
+	ctx := vrt.NewContext()
 
 	var serverStop func()
-	serverAddr, serverStop = StartServer(vrt, profiles.LocalListenSpec)
+	serverAddr, serverStop = StartServer(ctx, profiles.LocalListenSpec)
 
 	// Create a VC to exclude the VC setup time from the benchmark.
-	CallEcho(&testing.B{}, vrt.NewContext(), serverAddr, 1, 0, benchmark.NewStats(1))
+	CallEcho(&testing.B{}, ctx, serverAddr, 1, 0, benchmark.NewStats(1))
 
 	r := benchmark.RunTestMain(m)
 
diff --git a/runtimes/google/ipc/benchmark/bmserver/main.go b/runtimes/google/ipc/benchmark/bmserver/main.go
index 7af2721..9c3fcd8 100644
--- a/runtimes/google/ipc/benchmark/bmserver/main.go
+++ b/runtimes/google/ipc/benchmark/bmserver/main.go
@@ -19,7 +19,7 @@
 
 	ctx := vrt.NewContext()
 
-	addr, stop := benchmark.StartServer(vrt, roaming.ListenSpec)
+	addr, stop := benchmark.StartServer(ctx, roaming.ListenSpec)
 	vlog.Infof("Listening on %s", addr)
 	defer stop()
 	<-signals.ShutdownOnSignals(ctx)
diff --git a/runtimes/google/ipc/benchmark/glob/glob_test.go b/runtimes/google/ipc/benchmark/glob/glob_test.go
index 8236d23..9c75c43 100644
--- a/runtimes/google/ipc/benchmark/glob/glob_test.go
+++ b/runtimes/google/ipc/benchmark/glob/glob_test.go
@@ -78,8 +78,8 @@
 	return d.obj, nil, nil
 }
 
-func startServer(b *testing.B, rt veyron2.Runtime, obj interface{}) (string, func(), error) {
-	server, err := rt.NewServer()
+func startServer(b *testing.B, ctx *context.T, obj interface{}) (string, func(), error) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start server: %v", err)
 	}
@@ -161,13 +161,15 @@
 		panic(err)
 	}
 	defer runtime.Cleanup()
-	addr, stop, err := startServer(b, runtime, obj)
+	ctx := runtime.NewContext()
+
+	addr, stop, err := startServer(b, ctx, obj)
 	if err != nil {
 		b.Fatalf("startServer failed: %v", err)
 	}
 	defer stop()
 
-	count, err := globClient(b, runtime.NewContext(), addr)
+	count, err := globClient(b, ctx, addr)
 	if err != nil {
 		b.Fatalf("globClient failed: %v", err)
 	}
diff --git a/runtimes/google/ipc/benchmark/server.go b/runtimes/google/ipc/benchmark/server.go
index 3a55f31..6a7963e 100644
--- a/runtimes/google/ipc/benchmark/server.go
+++ b/runtimes/google/ipc/benchmark/server.go
@@ -4,6 +4,7 @@
 	"v.io/core/veyron/security/flag"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/vlog"
@@ -31,8 +32,8 @@
 // StartServer starts a server that implements the Benchmark service. The
 // server listens to the given protocol and address, and returns the veyron
 // address of the server and a callback function to stop the server.
-func StartServer(runtime veyron2.Runtime, listenSpec ipc.ListenSpec) (string, func()) {
-	server, err := runtime.NewServer()
+func StartServer(ctx *context.T, listenSpec ipc.ListenSpec) (string, func()) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		vlog.Fatalf("NewServer failed: %v", err)
 	}
diff --git a/runtimes/google/ipc/glob_test.go b/runtimes/google/ipc/glob_test.go
index f7ea507..20b60af 100644
--- a/runtimes/google/ipc/glob_test.go
+++ b/runtimes/google/ipc/glob_test.go
@@ -7,6 +7,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -17,8 +18,8 @@
 	"v.io/core/veyron/profiles"
 )
 
-func startServer(rt veyron2.Runtime, tree *node) (string, func(), error) {
-	server, err := rt.NewServer()
+func startServer(ctx *context.T, tree *node) (string, func(), error) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start debug server: %v", err)
 	}
@@ -39,6 +40,7 @@
 		panic(err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	namespace := []string{
 		"a/b/c1/d1",
@@ -53,7 +55,7 @@
 		tree.find(strings.Split(p, "/"), true)
 	}
 
-	ep, stop, err := startServer(runtime, tree)
+	ep, stop, err := startServer(ctx, tree)
 	if err != nil {
 		t.Fatalf("startServer: %v", err)
 	}
@@ -161,7 +163,7 @@
 	}
 	for _, tc := range testcases {
 		name := naming.JoinAddressName(ep, tc.name)
-		results, err := testutil.GlobName(runtime.NewContext(), name, tc.pattern)
+		results, err := testutil.GlobName(ctx, name, tc.pattern)
 		if err != nil {
 			t.Errorf("unexpected Glob error for (%q, %q): %v", tc.name, tc.pattern, err)
 			continue
diff --git a/runtimes/google/ipc/signature_test.go b/runtimes/google/ipc/signature_test.go
index 1dea588..26a5ec5 100644
--- a/runtimes/google/ipc/signature_test.go
+++ b/runtimes/google/ipc/signature_test.go
@@ -6,6 +6,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/ipc/reserved"
 	"v.io/core/veyron2/naming"
@@ -19,8 +20,8 @@
 
 func init() { testutil.Init() }
 
-func startSigServer(runtime veyron2.Runtime, sig sigImpl) (string, func(), error) {
-	server, err := runtime.NewServer()
+func startSigServer(ctx *context.T, sig sigImpl) (string, func(), error) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start sig server: %v", err)
 	}
@@ -63,8 +64,9 @@
 		t.Fatalf("Couldn't initialize runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	ep, stop, err := startSigServer(runtime, sigImpl{})
+	ep, stop, err := startSigServer(ctx, sigImpl{})
 	if err != nil {
 		t.Fatalf("startSigServer: %v", err)
 	}
@@ -97,7 +99,7 @@
 		}},
 	}
 	for _, test := range tests {
-		sig, err := reserved.MethodSignature(runtime.NewContext(), name, test.Method)
+		sig, err := reserved.MethodSignature(ctx, name, test.Method)
 		if err != nil {
 			t.Errorf("call failed: %v", err)
 		}
@@ -113,14 +115,15 @@
 		t.Fatalf("Couldn't initialize runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	ep, stop, err := startSigServer(runtime, sigImpl{})
+	ep, stop, err := startSigServer(ctx, sigImpl{})
 	if err != nil {
 		t.Fatalf("startSigServer: %v", err)
 	}
 	defer stop()
 	name := naming.JoinAddressName(ep, "")
-	sig, err := reserved.Signature(runtime.NewContext(), name)
+	sig, err := reserved.Signature(ctx, name)
 	if err != nil {
 		t.Errorf("call failed: %v", err)
 	}
diff --git a/runtimes/google/rt/runtimex.go b/runtimes/google/rt/runtimex.go
index 08a7cdc..c50f693 100644
--- a/runtimes/google/rt/runtimex.go
+++ b/runtimes/google/rt/runtimex.go
@@ -102,9 +102,9 @@
 		otherOpts = append(otherOpts, options.ReservedNameDispatcher{reserved.dispatcher})
 		otherOpts = append(otherOpts, reserved.opts...)
 	}
-	// TODO(mattr): We used to get rt.preferredprotocols here, should we
-	// attach these to the context directly?
-
+	if protocols, ok := ctx.Value(protocolsKey).([]string); ok {
+		otherOpts = append(otherOpts, iipc.PreferredServerResolveProtocols(protocols))
+	}
 	server, err := iipc.InternalNewServer(ctx, sm, ns, otherOpts...)
 	if done := ctx.Done(); err == nil && done != nil {
 		// Arrange to clean up the server when the parent context is canceled.
@@ -186,25 +186,20 @@
 }
 
 func (*RuntimeX) SetNewClient(ctx *context.T, opts ...ipc.ClientOpt) (*context.T, ipc.Client, error) {
+	otherOpts := append([]ipc.ClientOpt{}, opts...)
+
 	// TODO(mattr, suharshs):  Currently there are a lot of things that can come in as opts.
 	// Some of them will be removed as opts and simply be pulled from the context instead
 	// these are:
-	// stream.Manager, Namespace, LocalPrincipal
+	// stream.Manager, Namespace, LocalPrincipal, preferred protocols.
 	sm, _ := ctx.Value(streamManagerKey).(stream.Manager)
 	ns, _ := ctx.Value(namespaceKey).(naming.Namespace)
 	p, _ := ctx.Value(principalKey).(security.Principal)
-	protocols, _ := ctx.Value(protocolsKey).([]string)
+	otherOpts = append(otherOpts, vc.LocalPrincipal{p}, &imanager.DialTimeout{5 * time.Minute})
 
-	// TODO(mattr, suharshs): Some will need to ba accessible from the
-	// client so that we can replace the client transparantly:
-	// VCSecurityLevel, PreferredProtocols
-	// Currently we are ignoring these and the settings will be lost in some cases.
-	// We should try to retrieve them from the client currently attached to the context
-	// where possible.
-	otherOpts := append([]ipc.ClientOpt{}, opts...)
-
-	// Note we always add DialTimeout, so we don't have to worry about replicating the option.
-	otherOpts = append(otherOpts, vc.LocalPrincipal{p}, &imanager.DialTimeout{5 * time.Minute}, options.PreferredProtocols(protocols))
+	if protocols, ok := ctx.Value(protocolsKey).([]string); ok {
+		otherOpts = append(otherOpts, options.PreferredProtocols(protocols))
+	}
 
 	client, err := iipc.InternalNewClient(sm, ns, otherOpts...)
 	if err == nil {
diff --git a/services/mgmt/application/applicationd/main.go b/services/mgmt/application/applicationd/main.go
index a09993e..7b52df7 100644
--- a/services/mgmt/application/applicationd/main.go
+++ b/services/mgmt/application/applicationd/main.go
@@ -3,6 +3,7 @@
 import (
 	"flag"
 
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/vlog"
@@ -30,7 +31,7 @@
 
 	ctx := runtime.NewContext()
 
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		vlog.Fatalf("NewServer() failed: %v", err)
 	}
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 7b5c4c6..68c81b7 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -6,6 +6,7 @@
 	"net/http"
 	"os"
 
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/vlog"
@@ -80,7 +81,7 @@
 			os.Exit(1)
 		}
 	}()
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		vlog.Errorf("NewServer() failed: %v", err)
 		return
diff --git a/services/mgmt/binary/impl/http_test.go b/services/mgmt/binary/impl/http_test.go
index b9973b1..601ddd3 100644
--- a/services/mgmt/binary/impl/http_test.go
+++ b/services/mgmt/binary/impl/http_test.go
@@ -28,7 +28,7 @@
 			data[i] = testutil.RandomBytes(size)
 		}
 		mediaInfo := repository.MediaInfo{Type: "application/octet-stream"}
-		if err := binary.Create(runtime.NewContext(), int32(length), mediaInfo); err != nil {
+		if err := binary.Create(gctx, int32(length), mediaInfo); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
@@ -36,7 +36,7 @@
 				t.FailNow()
 			}
 		}
-		parts, _, err := binary.Stat(runtime.NewContext())
+		parts, _, err := binary.Stat(gctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
@@ -69,7 +69,7 @@
 				t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 			}
 		}
-		if err := binary.Delete(runtime.NewContext()); err != nil {
+		if err := binary.Delete(gctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
diff --git a/services/mgmt/binary/impl/impl_test.go b/services/mgmt/binary/impl/impl_test.go
index 8b4c1bb..5b52ad3 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -14,6 +14,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/services/mgmt/repository"
@@ -28,21 +29,22 @@
 	veyronPrefix = "veyron_binary_repository"
 )
 
-var runtime veyron2.Runtime
+var gctx *context.T
 
 func init() {
 	testutil.Init()
 
-	var err error
-	if runtime, err = rt.New(); err != nil {
+	runtime, err := rt.New()
+	if err != nil {
 		panic(err)
 	}
+	gctx = runtime.NewContext()
 }
 
 // invokeUpload invokes the Upload RPC using the given client binary
 // <binary> and streams the given binary <binary> to it.
 func invokeUpload(t *testing.T, binary repository.BinaryClientMethods, data []byte, part int32) (error, error) {
-	stream, err := binary.Upload(runtime.NewContext(), part)
+	stream, err := binary.Upload(gctx, part)
 	if err != nil {
 		t.Errorf("Upload() failed: %v", err)
 		return nil, err
@@ -74,7 +76,7 @@
 // invokeDownload invokes the Download RPC using the given client binary
 // <binary> and streams binary from to it.
 func invokeDownload(t *testing.T, binary repository.BinaryClientMethods, part int32) ([]byte, error, error) {
-	stream, err := binary.Download(runtime.NewContext(), part)
+	stream, err := binary.Download(gctx, part)
 	if err != nil {
 		t.Errorf("Download() failed: %v", err)
 		return nil, nil, err
@@ -114,7 +116,7 @@
 		vlog.Fatalf("WriteFile(%v, %v, %v) failed: %v", path, Version, perm, err)
 	}
 	// Setup and start the binary repository server.
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(gctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -168,13 +170,13 @@
 		size := testutil.Rand.Intn(1000 * bufferLength)
 		data := testutil.RandomBytes(size)
 		// Test the binary repository interface.
-		if err := binary.Create(runtime.NewContext(), 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		if streamErr, err := invokeUpload(t, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
-		parts, _, err := binary.Stat(runtime.NewContext())
+		parts, _, err := binary.Stat(gctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
@@ -194,14 +196,14 @@
 		if bytes.Compare(output, data) != 0 {
 			t.Fatalf("Unexpected output: expected %v, got %v", data, output)
 		}
-		results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(ep, ""), "...")
+		results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...")
 		if err != nil {
 			t.Fatalf("GlobName failed: %v", err)
 		}
 		if expected := []string{"", "test"}; !reflect.DeepEqual(results, expected) {
 			t.Errorf("Unexpected results: expected %q, got %q", expected, results)
 		}
-		if err := binary.Delete(runtime.NewContext()); err != nil {
+		if err := binary.Delete(gctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -221,7 +223,7 @@
 			data[i] = testutil.RandomBytes(size)
 		}
 		// Test the binary repository interface.
-		if err := binary.Create(runtime.NewContext(), int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
@@ -229,7 +231,7 @@
 				t.FailNow()
 			}
 		}
-		parts, _, err := binary.Stat(runtime.NewContext())
+		parts, _, err := binary.Stat(gctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
@@ -251,7 +253,7 @@
 				t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 			}
 		}
-		if err := binary.Delete(runtime.NewContext()); err != nil {
+		if err := binary.Delete(gctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -270,13 +272,13 @@
 			size := testutil.Rand.Intn(1000 * bufferLength)
 			data[i] = testutil.RandomBytes(size)
 		}
-		if err := binary.Create(runtime.NewContext(), int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		// Simulate a flaky upload client that keeps uploading parts until
 		// finished.
 		for {
-			parts, _, err := binary.Stat(runtime.NewContext())
+			parts, _, err := binary.Stat(gctx)
 			if err != nil {
 				t.Fatalf("Stat() failed: %v", err)
 			}
@@ -296,7 +298,7 @@
 				}
 			}
 		}
-		if err := binary.Delete(runtime.NewContext()); err != nil {
+		if err := binary.Delete(gctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -315,10 +317,10 @@
 			data[i][j] = byte(testutil.Rand.Int())
 		}
 	}
-	if err := binary.Create(runtime.NewContext(), int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+	if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 		t.Fatalf("Create() failed: %v", err)
 	}
-	if err := binary.Create(runtime.NewContext(), int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err == nil {
+	if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err == nil {
 		t.Fatalf("Create() did not fail when it should have")
 	} else if want := verror.Exist.ID; !verror.Is(err, want) {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
@@ -356,10 +358,10 @@
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
 	}
-	if err := binary.Delete(runtime.NewContext()); err != nil {
+	if err := binary.Delete(gctx); err != nil {
 		t.Fatalf("Delete() failed: %v", err)
 	}
-	if err := binary.Delete(runtime.NewContext()); err == nil {
+	if err := binary.Delete(gctx); err == nil {
 		t.Fatalf("Delete() did not fail when it should have")
 	} else if want := verror.NoExist.ID; !verror.Is(err, want) {
 		t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
@@ -378,14 +380,14 @@
 		name := naming.JoinAddressName(ep, obj)
 		binary := repository.BinaryClient(name)
 
-		if err := binary.Create(runtime.NewContext(), 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		if streamErr, err := invokeUpload(t, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
 	}
-	results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(ep, ""), "...")
+	results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...")
 	if err != nil {
 		t.Fatalf("GlobName failed: %v", err)
 	}
diff --git a/services/mgmt/build/buildd/main.go b/services/mgmt/build/buildd/main.go
index da50f8b..a752edd 100644
--- a/services/mgmt/build/buildd/main.go
+++ b/services/mgmt/build/buildd/main.go
@@ -4,6 +4,7 @@
 	"flag"
 	"os"
 
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/services/mgmt/build"
 	"v.io/core/veyron2/vlog"
@@ -30,7 +31,7 @@
 
 	ctx := runtime.NewContext()
 
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		vlog.Errorf("NewServer() failed: %v", err)
 		return
diff --git a/services/mgmt/build/impl/impl_test.go b/services/mgmt/build/impl/impl_test.go
index 5f27b50..55eddf2 100644
--- a/services/mgmt/build/impl/impl_test.go
+++ b/services/mgmt/build/impl/impl_test.go
@@ -17,14 +17,15 @@
 	"v.io/core/veyron/profiles"
 )
 
-var globalRT veyron2.Runtime
+var globalCtx *context.T
 
 func init() {
 	testutil.Init()
-	var err error
-	if globalRT, err = rt.New(); err != nil {
+	globalRT, err := rt.New()
+	if err != nil {
 		panic(err)
 	}
+	globalCtx = globalRT.NewContext()
 }
 
 // findGoBinary returns the path to the given Go binary and
@@ -55,7 +56,7 @@
 // startServer starts the build server.
 func startServer(t *testing.T) (build.BuilderClientMethods, func()) {
 	gobin, goroot := findGoBinary(t, "go")
-	server, err := globalRT.NewServer()
+	server, err := veyron2.NewServer(globalCtx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -77,7 +78,7 @@
 
 func invokeBuild(t *testing.T, client build.BuilderClientMethods, files []build.File) ([]byte, []build.File, error) {
 	arch, opsys := getArch(), getOS()
-	ctx, cancel := context.WithCancel(globalRT.NewContext())
+	ctx, cancel := context.WithCancel(globalCtx)
 	defer cancel()
 	stream, err := client.Build(ctx, arch, opsys)
 	if err != nil {
diff --git a/services/mgmt/debug/dispatcher_test.go b/services/mgmt/debug/dispatcher_test.go
index 2036d94..4aa7b3c 100644
--- a/services/mgmt/debug/dispatcher_test.go
+++ b/services/mgmt/debug/dispatcher_test.go
@@ -29,12 +29,12 @@
 )
 
 // startDebugServer starts a debug server.
-func startDebugServer(rt veyron2.Runtime, listenSpec ipc.ListenSpec, logsDir string) (string, func(), error) {
+func startDebugServer(ctx *context.T, listenSpec ipc.ListenSpec, logsDir string) (string, func(), error) {
 	if len(logsDir) == 0 {
 		return "", nil, fmt.Errorf("logs directory missing")
 	}
 	disp := NewDispatcher(logsDir, nil)
-	server, err := rt.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		return "", nil, fmt.Errorf("failed to start debug server: %v", err)
 	}
@@ -55,9 +55,10 @@
 		t.Fatalf("Could not initialize runtime: %v", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	tracedContext := func() *context.T {
-		ctx := runtime.NewContext()
+	tracedContext := func(ctx *context.T) *context.T {
+		ctx, _ = vtrace.SetNewTrace(ctx)
 		vtrace.ForceCollect(ctx)
 		return ctx
 	}
@@ -72,7 +73,7 @@
 		t.Fatalf("ioutil.WriteFile failed: %v", err)
 	}
 
-	endpoint, stop, err := startDebugServer(runtime, profiles.LocalListenSpec, workdir)
+	endpoint, stop, err := startDebugServer(ctx, profiles.LocalListenSpec, workdir)
 	if err != nil {
 		t.Fatalf("StartDebugServer failed: %v", err)
 	}
@@ -103,7 +104,7 @@
 	// Access a log file that exists.
 	{
 		lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, "debug/logs/test.INFO"))
-		size, err := lf.Size(tracedContext())
+		size, err := lf.Size(tracedContext(ctx))
 		if err != nil {
 			t.Errorf("Size failed: %v", err)
 		}
@@ -115,7 +116,7 @@
 	// Access a log file that doesn't exist.
 	{
 		lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, "debug/logs/nosuchfile.INFO"))
-		_, err = lf.Size(tracedContext())
+		_, err = lf.Size(tracedContext(ctx))
 		if expected := verror.NoExist.ID; !verror.Is(err, expected) {
 			t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 		}
@@ -127,7 +128,7 @@
 		foo.Set(123)
 
 		st := stats.StatsClient(naming.JoinAddressName(endpoint, "debug/stats/testing/foo"))
-		v, err := st.Value(tracedContext())
+		v, err := st.Value(tracedContext(ctx))
 		if err != nil {
 			t.Errorf("Value failed: %v", err)
 		}
@@ -139,7 +140,7 @@
 	// Access a stats object that doesn't exists.
 	{
 		st := stats.StatsClient(naming.JoinAddressName(endpoint, "debug/stats/testing/nobodyhome"))
-		_, err = st.Value(tracedContext())
+		_, err = st.Value(tracedContext(ctx))
 		if expected := verror.NoExist.ID; !verror.Is(err, expected) {
 			t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 		}
diff --git a/services/mgmt/device/deviced/server.go b/services/mgmt/device/deviced/server.go
index 8c79307..3a89db5 100644
--- a/services/mgmt/device/deviced/server.go
+++ b/services/mgmt/device/deviced/server.go
@@ -29,10 +29,9 @@
 		return err
 	}
 	defer runtime.Cleanup()
-
 	ctx := runtime.NewContext()
 
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		vlog.Errorf("NewServer() failed: %v", err)
 		return err
diff --git a/services/mgmt/device/impl/proxy_invoker_test.go b/services/mgmt/device/impl/proxy_invoker_test.go
index 5e58f1f..2da3bdc 100644
--- a/services/mgmt/device/impl/proxy_invoker_test.go
+++ b/services/mgmt/device/impl/proxy_invoker_test.go
@@ -24,13 +24,13 @@
 		t.Fatalf("Could not initialize runtime: %v", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	// server1 is a normal server
-	server1, err := runtime.NewServer()
+	server1, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer: %v", err)
 	}
-	defer server1.Stop()
 	localSpec := ipc.ListenSpec{Addrs: ipc.ListenAddrs{{"tcp", "127.0.0.1:0"}}}
 	eps1, err := server1.Listen(localSpec)
 	if err != nil {
@@ -41,7 +41,7 @@
 	}
 
 	// server2 proxies requests to <suffix> to server1/__debug/stats/<suffix>
-	server2, err := runtime.NewServer()
+	server2, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer: %v", err)
 	}
@@ -62,12 +62,12 @@
 	// Call Value()
 	name := naming.JoinAddressName(eps2[0].String(), "system/start-time-rfc1123")
 	c := stats.StatsClient(name)
-	if _, err := c.Value(runtime.NewContext()); err != nil {
+	if _, err := c.Value(ctx); err != nil {
 		t.Fatalf("%q.Value() error: %v", name, err)
 	}
 
 	// Call Glob()
-	results, err := testutil.GlobName(runtime.NewContext(), naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
+	results, err := testutil.GlobName(ctx, naming.JoinAddressName(eps2[0].String(), "system"), "start-time-*")
 	if err != nil {
 		t.Fatalf("Glob failed: %v", err)
 	}
diff --git a/services/mgmt/lib/binary/impl_test.go b/services/mgmt/lib/binary/impl_test.go
index 932a40d..1b77501 100644
--- a/services/mgmt/lib/binary/impl_test.go
+++ b/services/mgmt/lib/binary/impl_test.go
@@ -9,6 +9,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/services/mgmt/repository"
@@ -23,16 +24,16 @@
 	veyronPrefix = "veyron_binary_repository"
 )
 
-var runtime veyron2.Runtime
+var gctx *context.T
 
 func init() {
 	testutil.Init()
 
-	var err error
-	runtime, err = rt.New()
+	runtime, err := rt.New()
 	if err != nil {
 		panic(err)
 	}
+	gctx = runtime.NewContext()
 }
 
 func setupRepository(t *testing.T) (string, func()) {
@@ -46,7 +47,7 @@
 		vlog.Fatalf("WriteFile(%v, %v, %v) failed: %v", path, impl.Version, perm, err)
 	}
 	// Setup and start the binary repository server.
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(gctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -88,20 +89,20 @@
 	defer cleanup()
 	data := testutil.RandomBytes(testutil.Rand.Intn(10 << 20))
 	mediaInfo := repository.MediaInfo{Type: "application/octet-stream"}
-	if err := Upload(runtime.NewContext(), von, data, mediaInfo); err != nil {
+	if err := Upload(gctx, von, data, mediaInfo); err != nil {
 		t.Fatalf("Upload(%v) failed: %v", von, err)
 	}
-	output, outInfo, err := Download(runtime.NewContext(), von)
+	output, outInfo, err := Download(gctx, von)
 	if err != nil {
 		t.Fatalf("Download(%v) failed: %v", von, err)
 	}
 	if bytes.Compare(data, output) != 0 {
 		t.Errorf("Data mismatch:\nexpected %v %v\ngot %v %v", len(data), data[:100], len(output), output[:100])
 	}
-	if err := Delete(runtime.NewContext(), von); err != nil {
+	if err := Delete(gctx, von); err != nil {
 		t.Errorf("Delete(%v) failed: %v", von, err)
 	}
-	if _, _, err := Download(runtime.NewContext(), von); err == nil {
+	if _, _, err := Download(gctx, von); err == nil {
 		t.Errorf("Download(%v) did not fail", von)
 	}
 	if !reflect.DeepEqual(mediaInfo, outInfo) {
@@ -136,10 +137,10 @@
 	if _, err := src.Write(data); err != nil {
 		t.Fatalf("Write() failed: %v", err)
 	}
-	if err := UploadFromFile(runtime.NewContext(), von, src.Name()); err != nil {
+	if err := UploadFromFile(gctx, von, src.Name()); err != nil {
 		t.Fatalf("UploadFromFile(%v, %v) failed: %v", von, src.Name(), err)
 	}
-	if err := DownloadToFile(runtime.NewContext(), von, dst.Name()); err != nil {
+	if err := DownloadToFile(gctx, von, dst.Name()); err != nil {
 		t.Fatalf("DownloadToFile(%v, %v) failed: %v", von, dst.Name(), err)
 	}
 	output, err := ioutil.ReadFile(dst.Name())
@@ -156,7 +157,7 @@
 	if expected := `{"Type":"application/octet-stream","Encoding":""}`; string(jMediaInfo) != expected {
 		t.Errorf("unexpected media info: expected %q, got %q", expected, string(jMediaInfo))
 	}
-	if err := Delete(runtime.NewContext(), von); err != nil {
+	if err := Delete(gctx, von); err != nil {
 		t.Errorf("Delete(%v) failed: %v", von, err)
 	}
 }
@@ -166,7 +167,7 @@
 func TestDownloadURL(t *testing.T) {
 	von, cleanup := setupRepository(t)
 	defer cleanup()
-	url, _, err := DownloadURL(runtime.NewContext(), von)
+	url, _, err := DownloadURL(gctx, von)
 	if err != nil {
 		t.Fatalf("DownloadURL(%v) failed: %v", von, err)
 	}
diff --git a/services/mgmt/logreader/impl/logfile_test.go b/services/mgmt/logreader/impl/logfile_test.go
index 3b13c19..7f493b0 100644
--- a/services/mgmt/logreader/impl/logfile_test.go
+++ b/services/mgmt/logreader/impl/logfile_test.go
@@ -10,6 +10,7 @@
 	"v.io/core/veyron/services/mgmt/logreader/impl"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -19,8 +20,8 @@
 	verror "v.io/core/veyron2/verror2"
 )
 
-func startServer(t *testing.T, runtime veyron2.Runtime, disp ipc.Dispatcher) (ipc.Server, string, error) {
-	server, err := runtime.NewServer()
+func startServer(t *testing.T, ctx *context.T, disp ipc.Dispatcher) (ipc.Server, string, error) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer failed: %v", err)
 		return nil, "", err
@@ -66,13 +67,14 @@
 		t.Fatalf("Could not initialize runtime: %v", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	workdir, err := ioutil.TempDir("", "logreadertest")
 	if err != nil {
 		t.Fatalf("ioutil.TempDir: %v", err)
 	}
 	defer os.RemoveAll(workdir)
-	server, endpoint, err := startServer(t, runtime, &logFileDispatcher{workdir})
+	server, endpoint, err := startServer(t, ctx, &logFileDispatcher{workdir})
 	if err != nil {
 		t.Fatalf("startServer failed: %v", err)
 	}
@@ -98,20 +100,20 @@
 
 	// Try to access a file that doesn't exist.
 	lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, "doesntexist"))
-	_, err = lf.Size(runtime.NewContext())
+	_, err = lf.Size(ctx)
 	if expected := verror.NoExist.ID; !verror.Is(err, expected) {
 		t.Errorf("unexpected error value, got %v, want: %v", err, expected)
 	}
 
 	// Try to access a file that does exist.
 	lf = logreader.LogFileClient(naming.JoinAddressName(endpoint, testFile))
-	_, err = lf.Size(runtime.NewContext())
+	_, err = lf.Size(ctx)
 	if err != nil {
 		t.Errorf("Size failed: %v", err)
 	}
 
 	// Read without follow.
-	stream, err := lf.ReadLog(runtime.NewContext(), 0, types.AllEntries, false)
+	stream, err := lf.ReadLog(ctx, 0, types.AllEntries, false)
 	if err != nil {
 		t.Errorf("ReadLog failed: %v", err)
 	}
@@ -140,7 +142,7 @@
 	}
 
 	// Read with follow from EOF (where the previous read ended).
-	stream, err = lf.ReadLog(runtime.NewContext(), offset, types.AllEntries, false)
+	stream, err = lf.ReadLog(ctx, offset, types.AllEntries, false)
 	if err != nil {
 		t.Errorf("ReadLog failed: %v", err)
 	}
@@ -156,13 +158,14 @@
 		t.Fatalf("Could not initialize runtime: %v", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	workdir, err := ioutil.TempDir("", "logreadertest")
 	if err != nil {
 		t.Fatalf("ioutil.TempDir: %v", err)
 	}
 	defer os.RemoveAll(workdir)
-	server, endpoint, err := startServer(t, runtime, &logFileDispatcher{workdir})
+	server, endpoint, err := startServer(t, ctx, &logFileDispatcher{workdir})
 	if err != nil {
 		t.Fatalf("startServer failed: %v", err)
 	}
@@ -184,13 +187,13 @@
 	}
 
 	lf := logreader.LogFileClient(naming.JoinAddressName(endpoint, testFile))
-	_, err = lf.Size(runtime.NewContext())
+	_, err = lf.Size(ctx)
 	if err != nil {
 		t.Errorf("Size failed: %v", err)
 	}
 
 	// Read with follow.
-	stream, err := lf.ReadLog(runtime.NewContext(), 0, int32(len(tests)), true)
+	stream, err := lf.ReadLog(ctx, 0, int32(len(tests)), true)
 	if err != nil {
 		t.Errorf("ReadLog failed: %v", err)
 	}
diff --git a/services/mgmt/pprof/client/proxy_test.go b/services/mgmt/pprof/client/proxy_test.go
index fc4bc32..8b55bf9 100644
--- a/services/mgmt/pprof/client/proxy_test.go
+++ b/services/mgmt/pprof/client/proxy_test.go
@@ -6,6 +6,7 @@
 	"net/http"
 	"testing"
 
+	"v.io/core/veyron2"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/security"
@@ -29,8 +30,9 @@
 		t.Fatalf("Could not initialize runtime: %v", err)
 	}
 	defer r.Cleanup()
+	ctx := r.NewContext()
 
-	s, err := r.NewServer()
+	s, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("failed to start server: %v", err)
 	}
diff --git a/services/mgmt/profile/impl/impl_test.go b/services/mgmt/profile/impl/impl_test.go
index db5079c..5ed1325 100644
--- a/services/mgmt/profile/impl/impl_test.go
+++ b/services/mgmt/profile/impl/impl_test.go
@@ -7,6 +7,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/services/mgmt/build"
@@ -31,10 +32,8 @@
 // TestInterface tests that the implementation correctly implements
 // the Profile interface.
 func TestInterface(t *testing.T) {
-	ctx := runtime.NewContext()
-
 	// Setup and start the profile repository server.
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(gctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -64,12 +63,12 @@
 	stub := repository.ProfileClient(naming.JoinAddressName(endpoint.String(), "linux/base"))
 
 	// Put
-	if err := stub.Put(ctx, spec); err != nil {
+	if err := stub.Put(gctx, spec); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
 
 	// Label
-	label, err := stub.Label(ctx)
+	label, err := stub.Label(gctx)
 	if err != nil {
 		t.Fatalf("Label() failed: %v", err)
 	}
@@ -78,7 +77,7 @@
 	}
 
 	// Description
-	description, err := stub.Description(ctx)
+	description, err := stub.Description(gctx)
 	if err != nil {
 		t.Fatalf("Description() failed: %v", err)
 	}
@@ -87,7 +86,7 @@
 	}
 
 	// Specification
-	specification, err := stub.Specification(ctx)
+	specification, err := stub.Specification(gctx)
 	if err != nil {
 		t.Fatalf("Specification() failed: %v", err)
 	}
@@ -96,7 +95,7 @@
 	}
 
 	// Remove
-	if err := stub.Remove(ctx); err != nil {
+	if err := stub.Remove(gctx); err != nil {
 		t.Fatalf("Remove() failed: %v", err)
 	}
 
@@ -106,20 +105,19 @@
 	}
 }
 
-var runtime veyron2.Runtime
+var gctx *context.T
 
 func init() {
-	var err error
-	if runtime, err = rt.New(); err != nil {
+	runtime, err := rt.New()
+	if err != nil {
 		panic(err)
 	}
+	gctx = runtime.NewContext()
 }
 
 func TestPreserveAcrossRestarts(t *testing.T) {
-	ctx := runtime.NewContext()
-
 	// Setup and start the profile repository server.
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(gctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -149,11 +147,11 @@
 	// Create client stubs for talking to the server.
 	stub := repository.ProfileClient(naming.JoinAddressName(endpoint.String(), "linux/base"))
 
-	if err := stub.Put(ctx, spec); err != nil {
+	if err := stub.Put(gctx, spec); err != nil {
 		t.Fatalf("Put() failed: %v", err)
 	}
 
-	label, err := stub.Label(ctx)
+	label, err := stub.Label(gctx)
 	if err != nil {
 		t.Fatalf("Label() failed: %v", err)
 	}
@@ -165,7 +163,7 @@
 	server.Stop()
 
 	// Setup and start a second server.
-	server, err = runtime.NewServer()
+	server, err = veyron2.NewServer(gctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -187,7 +185,7 @@
 	stub = repository.ProfileClient(naming.JoinAddressName(endpoints[0].String(), "linux/base"))
 
 	// Label
-	label, err = stub.Label(ctx)
+	label, err = stub.Label(gctx)
 	if err != nil {
 		t.Fatalf("Label() failed: %v", err)
 	}
diff --git a/services/mgmt/stats/impl/stats_test.go b/services/mgmt/stats/impl/stats_test.go
index 489604c..091586f 100644
--- a/services/mgmt/stats/impl/stats_test.go
+++ b/services/mgmt/stats/impl/stats_test.go
@@ -29,9 +29,9 @@
 	return impl.NewStatsService(suffix, 100*time.Millisecond), nil, nil
 }
 
-func startServer(t *testing.T, runtime veyron2.Runtime) (string, func()) {
+func startServer(t *testing.T, ctx *context.T) (string, func()) {
 	disp := &statsDispatcher{}
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer failed: %v", err)
 		return "", nil
@@ -51,8 +51,9 @@
 func TestStatsImpl(t *testing.T) {
 	runtime, _ := rt.New()
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	endpoint, stop := startServer(t, runtime)
+	endpoint, stop := startServer(t, ctx)
 	defer stop()
 
 	counter := libstats.NewCounter("testing/foo/bar")
@@ -73,7 +74,7 @@
 
 	// Test Glob()
 	{
-		results, err := testutil.GlobName(runtime.NewContext(), name, "testing/foo/...")
+		results, err := testutil.GlobName(ctx, name, "testing/foo/...")
 		if err != nil {
 			t.Fatalf("testutil.GlobName failed: %v", err)
 		}
@@ -98,7 +99,7 @@
 	{
 		noRM := types.ResumeMarker{}
 		_ = noRM
-		ctx, cancel := context.WithCancel(runtime.NewContext())
+		ctx, cancel := context.WithCancel(ctx)
 		stream, err := c.WatchGlob(ctx, types.GlobRequest{Pattern: "testing/foo/bar"})
 		if err != nil {
 			t.Fatalf("c.WatchGlob failed: %v", err)
@@ -144,7 +145,7 @@
 	// Test Value()
 	{
 		c := stats.StatsClient(naming.JoinAddressName(endpoint, "testing/foo/bar"))
-		value, err := c.Value(runtime.NewContext())
+		value, err := c.Value(ctx)
 		if err != nil {
 			t.Errorf("unexpected error: %v", err)
 		}
@@ -156,7 +157,7 @@
 	// Test Value() with Histogram
 	{
 		c := stats.StatsClient(naming.JoinAddressName(endpoint, "testing/hist/foo"))
-		value, err := c.Value(runtime.NewContext())
+		value, err := c.Value(ctx)
 		if err != nil {
 			t.Errorf("unexpected error: %v", err)
 		}
diff --git a/services/mgmt/vtrace/impl/vtrace_test.go b/services/mgmt/vtrace/impl/vtrace_test.go
index bf77a95..1be99a4 100644
--- a/services/mgmt/vtrace/impl/vtrace_test.go
+++ b/services/mgmt/vtrace/impl/vtrace_test.go
@@ -5,6 +5,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -15,13 +16,14 @@
 	"v.io/core/veyron/services/mgmt/vtrace/impl"
 )
 
-func setup(t *testing.T) (string, ipc.Server, veyron2.Runtime) {
+func setup(t *testing.T) (string, ipc.Server, *context.T) {
 	runtime, err := rt.New()
 	if err != nil {
 		t.Fatalf("Could not create runtime: %s", err)
 	}
+	ctx := runtime.NewContext()
 
-	server, err := runtime.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("Could not create server: %s", err)
 	}
@@ -32,14 +34,13 @@
 	if err := server.Serve("", impl.NewVtraceService(), nil); err != nil {
 		t.Fatalf("Serve failed: %s", err)
 	}
-	return endpoints[0].String(), server, runtime
+	return endpoints[0].String(), server, ctx
 }
 
 func TestVtraceServer(t *testing.T) {
-	endpoint, server, runtime := setup(t)
+	endpoint, server, sctx := setup(t)
 	defer server.Stop()
 
-	sctx := runtime.NewContext()
 	sctx, span := vtrace.SetNewSpan(sctx, "The Span")
 	vtrace.ForceCollect(sctx)
 	span.Finish()
@@ -47,7 +48,8 @@
 
 	client := service.StoreClient(naming.JoinAddressName(endpoint, ""))
 
-	trace, err := client.Trace(runtime.NewContext(), id)
+	sctx, _ = vtrace.SetNewTrace(sctx)
+	trace, err := client.Trace(sctx, id)
 	if err != nil {
 		t.Fatalf("Unexpected error getting trace: %s", err)
 	}
@@ -58,7 +60,8 @@
 		t.Errorf("Returned span has wrong name: %#v", trace)
 	}
 
-	call, err := client.AllTraces(runtime.NewContext())
+	sctx, _ = vtrace.SetNewTrace(sctx)
+	call, err := client.AllTraces(sctx)
 	if err != nil {
 		t.Fatalf("Unexpected error getting traces: %s", err)
 	}
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index 8fc0b50..0c99254 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -66,7 +66,7 @@
 		if port != "" {
 			neighborhoodListenSpec.Addrs[0].Address = net.JoinHostPort(host, "0")
 		}
-		nhServer, err := r.NewServer(options.ServesMountTable(true))
+		nhServer, err := veyron2.NewServer(ctx, options.ServesMountTable(true))
 		if err != nil {
 			vlog.Errorf("r.NewServer failed: %v", err)
 			os.Exit(1)
diff --git a/tools/application/impl_test.go b/tools/application/impl_test.go
index 456e957..32481ca 100644
--- a/tools/application/impl_test.go
+++ b/tools/application/impl_test.go
@@ -8,6 +8,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -89,9 +90,9 @@
 	return repository.ApplicationServer(&server{suffix: suffix}), nil, nil
 }
 
-func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
+func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
 	dispatcher := NewDispatcher()
-	server, err := r.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
@@ -121,8 +122,9 @@
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	server, endpoint, err := startServer(t, runtime)
+	server, endpoint, err := startServer(t, ctx)
 	if err != nil {
 		return
 	}
diff --git a/tools/binary/impl.go b/tools/binary/impl.go
index a70168f..b51f7fd 100644
--- a/tools/binary/impl.go
+++ b/tools/binary/impl.go
@@ -21,7 +21,7 @@
 		return cmd.UsageErrorf("delete: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
 	von := args[0]
-	if err := binary.Delete(runtime.NewContext(), von); err != nil {
+	if err := binary.Delete(gctx, von); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Binary deleted successfully\n")
@@ -48,7 +48,7 @@
 		return cmd.UsageErrorf("download: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
 	von, filename := args[0], args[1]
-	if err := binary.DownloadToFile(runtime.NewContext(), von, filename); err != nil {
+	if err := binary.DownloadToFile(gctx, von, filename); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Binary downloaded to file %s\n", filename)
@@ -76,7 +76,7 @@
 		return cmd.UsageErrorf("upload: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
 	von, filename := args[0], args[1]
-	if err := binary.UploadFromFile(runtime.NewContext(), von, filename); err != nil {
+	if err := binary.UploadFromFile(gctx, von, filename); err != nil {
 		return err
 	}
 	fmt.Fprintf(cmd.Stdout(), "Binary uploaded from file %s\n", filename)
@@ -97,7 +97,7 @@
 		return cmd.UsageErrorf("rooturl: incorrect number of arguments, expected %d, got %d", expected, got)
 	}
 	von := args[0]
-	url, _, err := binary.DownloadURL(runtime.NewContext(), von)
+	url, _, err := binary.DownloadURL(gctx, von)
 	if err != nil {
 		return err
 	}
diff --git a/tools/binary/impl_test.go b/tools/binary/impl_test.go
index 25cd9ef..d8708f7 100644
--- a/tools/binary/impl_test.go
+++ b/tools/binary/impl_test.go
@@ -12,6 +12,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -84,9 +85,9 @@
 	return repository.BinaryServer(&server{suffix: suffix}), nil, nil
 }
 
-func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
+func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
 	dispatcher := NewDispatcher()
-	server, err := r.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
@@ -110,14 +111,14 @@
 }
 
 func TestBinaryClient(t *testing.T) {
-	var err error
-	runtime, err = rt.New()
+	runtime, err := rt.New()
 	if err != nil {
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	gctx = runtime.NewContext()
 
-	server, endpoint, err := startServer(t, runtime)
+	server, endpoint, err := startServer(t, gctx)
 	if err != nil {
 		return
 	}
diff --git a/tools/binary/main.go b/tools/binary/main.go
index 7368a9c..4a57a43 100644
--- a/tools/binary/main.go
+++ b/tools/binary/main.go
@@ -4,20 +4,20 @@
 package main
 
 import (
-	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/rt"
 
 	_ "v.io/core/veyron/profiles"
 )
 
-var runtime veyron2.Runtime
+var gctx *context.T
 
 func main() {
-	var err error
-	runtime, err = rt.New()
+	runtime, err := rt.New()
 	if err != nil {
 		panic(err)
 	}
 	defer runtime.Cleanup()
+	gctx = runtime.NewContext()
 	root().Main()
 }
diff --git a/tools/build/impl_test.go b/tools/build/impl_test.go
index 7a57666..8dd4045 100644
--- a/tools/build/impl_test.go
+++ b/tools/build/impl_test.go
@@ -6,6 +6,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -38,8 +39,8 @@
 
 type dispatcher struct{}
 
-func startServer(runtime veyron2.Runtime, t *testing.T) (ipc.Server, naming.Endpoint) {
-	server, err := runtime.NewServer()
+func startServer(ctx *context.T, t *testing.T) (ipc.Server, naming.Endpoint) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer failed: %v", err)
 	}
@@ -66,7 +67,8 @@
 	if err != nil {
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
-	server, endpoint := startServer(runtime, t)
+	ctx := runtime.NewContext()
+	server, endpoint := startServer(ctx, t)
 	defer stopServer(t, server)
 
 	cmd := root()
diff --git a/tools/mounttable/impl_test.go b/tools/mounttable/impl_test.go
index 6a091fe..f4c6d75 100644
--- a/tools/mounttable/impl_test.go
+++ b/tools/mounttable/impl_test.go
@@ -6,6 +6,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -75,9 +76,9 @@
 	return mounttable.MountTableServer(&server{suffix: suffix}), nil, nil
 }
 
-func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
+func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
 	dispatcher := new(dispatcher)
-	server, err := r.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
@@ -107,8 +108,9 @@
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	server, endpoint, err := startServer(t, runtime)
+	server, endpoint, err := startServer(t, ctx)
 	if err != nil {
 		return
 	}
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
index 6204301..30891d3 100644
--- a/tools/profile/impl_test.go
+++ b/tools/profile/impl_test.go
@@ -7,6 +7,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -83,8 +84,8 @@
 	return repository.ProfileServer(&server{suffix: suffix}), nil, nil
 }
 
-func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
-	server, err := r.NewServer()
+func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
@@ -114,8 +115,9 @@
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
-	server, endpoint, err := startServer(t, runtime)
+	server, endpoint, err := startServer(t, ctx)
 	if err != nil {
 		return
 	}
diff --git a/tools/vrpc/impl_test.go b/tools/vrpc/impl_test.go
index 8de58ab..08da0c1 100644
--- a/tools/vrpc/impl_test.go
+++ b/tools/vrpc/impl_test.go
@@ -7,6 +7,7 @@
 	"testing"
 
 	"v.io/core/veyron2"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/rt"
@@ -125,9 +126,9 @@
 	return nil
 }
 
-func startServer(t *testing.T, r veyron2.Runtime) (ipc.Server, naming.Endpoint, error) {
+func startServer(t *testing.T, ctx *context.T) (ipc.Server, naming.Endpoint, error) {
 	obj := test_base.TypeTesterServer(&server{})
-	server, err := r.NewServer()
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Errorf("NewServer failed: %v", err)
 		return nil, nil, err
@@ -176,10 +177,11 @@
 		t.Fatalf("Unexpected error initializing runtime: %s", err)
 	}
 	defer runtime.Cleanup()
+	ctx := runtime.NewContext()
 
 	// Skip defer runtime.Cleanup() to avoid messing up other tests in the
 	// same process.
-	server, endpoint, err := startServer(t, runtime)
+	server, endpoint, err := startServer(t, ctx)
 	if err != nil {
 		return
 	}