diff --git a/profiles/chrome/chrome.go b/profiles/chrome/chrome.go
index e16556d..ef9235e 100644
--- a/profiles/chrome/chrome.go
+++ b/profiles/chrome/chrome.go
@@ -7,7 +7,6 @@
 	"v.io/core/veyron2/config"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/options"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/profiles/internal/platform"
 	_ "v.io/core/veyron/runtimes/google/ipc/protocols/ws"
@@ -19,10 +18,6 @@
 
 type chrome struct{}
 
-func init() {
-	rt.RegisterProfile(New())
-}
-
 // New returns a new instance of a Profile for use within chrome, in particular
 // chrome extensions etc should use.
 func New() veyron2.Profile {
diff --git a/profiles/gce/init.go b/profiles/gce/init.go
index d25d7f6..2882a08 100644
--- a/profiles/gce/init.go
+++ b/profiles/gce/init.go
@@ -11,7 +11,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/config"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/lib/appcycle"
 	"v.io/core/veyron/lib/netstate"
@@ -29,10 +28,6 @@
 	ListenSpec ipc.ListenSpec
 )
 
-func init() {
-	rt.RegisterProfile(&profile{})
-}
-
 type profile struct {
 	ac *appcycle.AppCycle
 }
diff --git a/profiles/generic.go b/profiles/generic.go
index 9b5ff05..20af927 100644
--- a/profiles/generic.go
+++ b/profiles/generic.go
@@ -4,7 +4,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/config"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/lib/appcycle"
 	"v.io/core/veyron/profiles/internal"
@@ -25,10 +24,6 @@
 
 var _ veyron2.Profile = (*generic)(nil)
 
-func init() {
-	rt.RegisterProfile(New())
-}
-
 // New returns a new instance of a very generic Profile. It can be used
 // as a default by Runtime implementations, in unit tests etc.
 func New() veyron2.Profile {
diff --git a/profiles/roaming/roaming.go b/profiles/roaming/roaming.go
index 6f04215..b4acfb5 100644
--- a/profiles/roaming/roaming.go
+++ b/profiles/roaming/roaming.go
@@ -14,7 +14,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/config"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/lib/appcycle"
 	"v.io/core/veyron/lib/netconfig"
@@ -37,10 +36,6 @@
 	ListenSpec ipc.ListenSpec
 )
 
-func init() {
-	rt.RegisterProfile(New())
-}
-
 type profile struct {
 	gce                  string
 	ac                   *appcycle.AppCycle
diff --git a/profiles/roaming/roaminginit.go b/profiles/roaming/roaminginit.go
index 3d5bfe0..e09d5f0 100644
--- a/profiles/roaming/roaminginit.go
+++ b/profiles/roaming/roaminginit.go
@@ -22,6 +22,7 @@
 	"v.io/core/veyron2/vlog"
 
 	"v.io/core/veyron/lib/appcycle"
+	"v.io/core/veyron/lib/exec"
 	"v.io/core/veyron/lib/flags"
 	"v.io/core/veyron/lib/netconfig"
 	"v.io/core/veyron/lib/netstate"
@@ -53,14 +54,29 @@
 
 func Init(ctx *context.T) (veyron2.RuntimeX, *context.T, veyron2.Shutdown, error) {
 	log := vlog.Log
-	reservedDispatcher := debug.NewDispatcher(log.LogDir(), sflag.NewAuthorizerOrDie())
 
-	commonFlags.Parse(os.Args[1:], nil)
+	handle, err := exec.GetChildHandle()
+	switch err {
+	case exec.ErrNoVersion:
+		// The process has not been started through the veyron exec
+		// library. No further action is needed.
+	case nil:
+		// The process has been started through the veyron exec
+		// library.
+	default:
+		return nil, nil, nil, err
+	}
+	var execConfig map[string]string
+	if handle != nil {
+		execConfig = handle.Config.Dump()
+	}
+	commonFlags.Parse(os.Args[1:], execConfig)
 	lf := commonFlags.ListenFlags()
 	listenSpec := ipc.ListenSpec{
 		Addrs: ipc.ListenAddrs(lf.Addrs),
 		Proxy: lf.ListenProxy,
 	}
+	reservedDispatcher := debug.NewDispatcher(log.LogDir(), sflag.NewAuthorizerOrDie())
 
 	ac := appcycle.New()
 
diff --git a/profiles/static/static.go b/profiles/static/static.go
index 683ebae..4ed8d39 100644
--- a/profiles/static/static.go
+++ b/profiles/static/static.go
@@ -7,7 +7,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/config"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/lib/appcycle"
 	"v.io/core/veyron/lib/netstate"
@@ -29,10 +28,6 @@
 	ListenSpec ipc.ListenSpec
 )
 
-func init() {
-	rt.RegisterProfile(New())
-}
-
 type static struct {
 	gce string
 	ac  *appcycle.AppCycle
diff --git a/profiles/static/staticinit.go b/profiles/static/staticinit.go
index 57b7f2c..7536850 100644
--- a/profiles/static/staticinit.go
+++ b/profiles/static/staticinit.go
@@ -11,6 +11,7 @@
 	"v.io/core/veyron2/vlog"
 
 	"v.io/core/veyron/lib/appcycle"
+	"v.io/core/veyron/lib/exec"
 	"v.io/core/veyron/lib/flags"
 	"v.io/core/veyron/lib/netstate"
 	"v.io/core/veyron/lib/websocket"
@@ -38,14 +39,28 @@
 func Init(ctx *context.T) (veyron2.RuntimeX, *context.T, veyron2.Shutdown, error) {
 	log := vlog.Log
 
-	reservedDispatcher := debug.NewDispatcher(log.LogDir(), sflag.NewAuthorizerOrDie())
-
-	commonFlags.Parse(os.Args[1:], nil)
+	handle, err := exec.GetChildHandle()
+	switch err {
+	case exec.ErrNoVersion:
+		// The process has not been started through the veyron exec
+		// library. No further action is needed.
+	case nil:
+		// The process has been started through the veyron exec
+		// library.
+	default:
+		return nil, nil, nil, err
+	}
+	var execConfig map[string]string
+	if handle != nil {
+		execConfig = handle.Config.Dump()
+	}
+	commonFlags.Parse(os.Args[1:], execConfig)
 	lf := commonFlags.ListenFlags()
 	listenSpec := ipc.ListenSpec{
 		Addrs: ipc.ListenAddrs(lf.Addrs),
 		Proxy: lf.ListenProxy,
 	}
+	reservedDispatcher := debug.NewDispatcher(log.LogDir(), sflag.NewAuthorizerOrDie())
 
 	ac := appcycle.New()
 
diff --git a/runtimes/google/ipc/benchmark/benchmark_test.go b/runtimes/google/ipc/benchmark/benchmark_test.go
index f16eea1..f0a00bc 100644
--- a/runtimes/google/ipc/benchmark/benchmark_test.go
+++ b/runtimes/google/ipc/benchmark/benchmark_test.go
@@ -112,7 +112,8 @@
 		panic(err)
 	}
 
-	serverAddr, serverStop := StartServer(ctx, veyron2.GetListenSpec(ctx))
+	var serverStop func()
+	serverAddr, serverStop = StartServer(ctx, veyron2.GetListenSpec(ctx))
 
 	// Create a VC to exclude the VC setup time from the benchmark.
 	CallEcho(&testing.B{}, ctx, serverAddr, 1, 0, benchmark.NewStats(1))
diff --git a/runtimes/google/rt/rt.go b/runtimes/google/rt/rt.go
index c7bcafa..0e94bcf 100644
--- a/runtimes/google/rt/rt.go
+++ b/runtimes/google/rt/rt.go
@@ -13,7 +13,6 @@
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/ipc/stream"
 	"v.io/core/veyron2/naming"
-	"v.io/core/veyron2/rt"
 
 	"v.io/core/veyron/lib/exec"
 	"v.io/core/veyron/lib/flags"
@@ -54,10 +53,6 @@
 
 var _ veyron2.Runtime = (*vrt)(nil)
 
-func init() {
-	rt.RegisterRuntime(veyron2.GoogleRuntimeName, New)
-}
-
 // Implements veyron2/rt.New
 func New(opts ...veyron2.ROpt) (veyron2.Runtime, error) {
 	handle, err := exec.GetChildHandle()
diff --git a/runtimes/google/rt/runtimex.go b/runtimes/google/rt/runtimex.go
index 618ddf7..6686a6b 100644
--- a/runtimes/google/rt/runtimex.go
+++ b/runtimes/google/rt/runtimex.go
@@ -223,6 +223,10 @@
 	// TODO(suharshs,mattr): Go through the rt.Cleanup function and make sure everything
 	// gets cleaned up.
 
+	if handle != nil {
+		handle.SetReady()
+	}
+
 	return r, ctx, r.cancel, nil
 }
 
diff --git a/services/mgmt/application/impl/acl_test.go b/services/mgmt/application/impl/acl_test.go
index 34c71c7..f8b9ded 100644
--- a/services/mgmt/application/impl/acl_test.go
+++ b/services/mgmt/application/impl/acl_test.go
@@ -87,8 +87,10 @@
 	storedir, cleanup := mgmttest.SetupRootDir(t, "application")
 	defer cleanup()
 
-	otherCtx, otherCancel := mgmttest.NewRuntime(t, ctx)
-	defer otherCancel()
+	otherCtx, err := veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal())
+	if err != nil {
+		panic(err)
+	}
 
 	idp := tsecurity.NewIDProvider("root")
 
@@ -220,8 +222,11 @@
 	storedir, cleanup := mgmttest.SetupRootDir(t, "application")
 	defer cleanup()
 
-	otherCtx, otherCancel := mgmttest.NewRuntime(t, ctx)
-	defer otherCancel()
+	otherCtx, err := veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal())
+	if err != nil {
+		panic(err)
+	}
+
 	idp := tsecurity.NewIDProvider("root")
 
 	// By default, globalRT and otherRT will have blessings generated based on the
diff --git a/services/mgmt/binary/binaryd/main.go b/services/mgmt/binary/binaryd/main.go
index 4a22834..a5ff9eb 100644
--- a/services/mgmt/binary/binaryd/main.go
+++ b/services/mgmt/binary/binaryd/main.go
@@ -7,12 +7,12 @@
 	"os"
 
 	"v.io/core/veyron2"
-	"v.io/core/veyron2/rt"
+	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/vlog"
 
 	"v.io/core/veyron/lib/netstate"
 	"v.io/core/veyron/lib/signals"
-	"v.io/core/veyron/profiles/roaming"
+	_ "v.io/core/veyron/profiles/roaming"
 	"v.io/core/veyron/services/mgmt/binary/impl"
 )
 
@@ -26,7 +26,7 @@
 
 // toIPPort tries to swap in the 'best' accessible IP for the host part of the
 // address, if the provided address has an unspecified IP.
-func toIPPort(addr string) string {
+func toIPPort(ctx *context.T, addr string) string {
 	host, port, err := net.SplitHostPort(addr)
 	if err != nil {
 		vlog.Errorf("SplitHostPort(%v) failed: %v", addr, err)
@@ -37,7 +37,8 @@
 		host = "127.0.0.1"
 		ips, err := netstate.GetAccessibleIPs()
 		if err == nil {
-			if a, err := roaming.ListenSpec.AddressChooser("tcp", ips); err == nil && len(a) > 0 {
+			ls := veyron2.GetListenSpec(ctx)
+			if a, err := ls.AddressChooser("tcp", ips); err == nil && len(a) > 0 {
 				host = a[0].Address().String()
 			}
 		}
@@ -46,13 +47,8 @@
 }
 
 func main() {
-	runtime, err := rt.New()
-	if err != nil {
-		vlog.Fatalf("Could not initialize runtime: %v", err)
-	}
-	defer runtime.Cleanup()
-
-	ctx := runtime.NewContext()
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
 
 	rootDir, err := impl.SetupRootDir(*rootDirFlag)
 	if err != nil {
@@ -66,7 +62,7 @@
 		vlog.Errorf("Listen(%s) failed: %v", *httpAddr, err)
 		os.Exit(1)
 	}
-	rootURL := toIPPort(listener.Addr().String())
+	rootURL := toIPPort(ctx, listener.Addr().String())
 	state, err := impl.NewState(rootDir, rootURL, defaultDepth)
 	if err != nil {
 		vlog.Errorf("NewState(%v, %v, %v) failed: %v", rootDir, rootURL, defaultDepth, err)
@@ -85,9 +81,10 @@
 		return
 	}
 	defer server.Stop()
-	endpoints, err := server.Listen(roaming.ListenSpec)
+	ls := veyron2.GetListenSpec(ctx)
+	endpoints, err := server.Listen(ls)
 	if err != nil {
-		vlog.Errorf("Listen(%s) failed: %v", roaming.ListenSpec, err)
+		vlog.Errorf("Listen(%s) failed: %v", ls, err)
 		return
 	}
 
diff --git a/services/mgmt/binary/impl/acl_test.go b/services/mgmt/binary/impl/acl_test.go
index 14006c7..8962d52 100644
--- a/services/mgmt/binary/impl/acl_test.go
+++ b/services/mgmt/binary/impl/acl_test.go
@@ -10,7 +10,6 @@
 
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/naming"
-	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/services/mgmt/repository"
 	"v.io/core/veyron2/services/security/access"
@@ -33,14 +32,6 @@
 func init() {
 	modules.RegisterChild(binaryCmd, "", binaryd)
 	testutil.Init()
-
-	globalRT, err := rt.New()
-	if err != nil {
-		panic(err)
-	}
-	gctx = globalRT.NewContext()
-	globalCancel = globalRT.Cleanup
-	veyron2.GetNamespace(gctx).CacheCtl(naming.DisableCache(true))
 }
 
 // TestHelperProcess is the entrypoint for the modules commands in
@@ -57,12 +48,13 @@
 	publishName := args[0]
 	storedir := args[1]
 
+	ctx, shutdown := veyron2.Init()
+
 	defer fmt.Fprintf(stdout, "%v terminating\n", publishName)
 	defer vlog.VI(1).Infof("%v terminating", publishName)
-	defer globalCancel()
-	server, endpoint := mgmttest.NewServer(gctx)
-	defer server.Stop()
+	defer shutdown()
 
+	server, endpoint := mgmttest.NewServer(ctx)
 	name := naming.JoinAddressName(endpoint, "")
 	vlog.VI(1).Infof("binaryd name: %v", name)
 
@@ -71,7 +63,7 @@
 	if err != nil {
 		vlog.Fatalf("NewState(%v, %v, %v) failed: %v", storedir, "", depth, err)
 	}
-	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(gctx), state)
+	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(ctx), state)
 	if err != nil {
 		vlog.Fatalf("Failed to create binaryd dispatcher: %v", err)
 	}
@@ -80,14 +72,18 @@
 	}
 
 	fmt.Fprintf(stdout, "ready:%d\n", os.Getpid())
-	<-signals.ShutdownOnSignals(gctx)
+	<-signals.ShutdownOnSignals(ctx)
 
 	return nil
 }
 
 func TestBinaryRootACL(t *testing.T) {
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
 	selfPrincipal := tsecurity.NewPrincipal("self")
-	selfCtx, err := veyron2.SetPrincipal(gctx, selfPrincipal)
+	selfCtx, err := veyron2.SetPrincipal(ctx, selfPrincipal)
 	if err != nil {
 		t.Fatalf("SetPrincipal failed: %v", err)
 	}
diff --git a/services/mgmt/binary/impl/http_test.go b/services/mgmt/binary/impl/http_test.go
index db4b0a5..6eb0142 100644
--- a/services/mgmt/binary/impl/http_test.go
+++ b/services/mgmt/binary/impl/http_test.go
@@ -8,6 +8,8 @@
 	"net/http"
 	"testing"
 
+	"v.io/core/veyron2"
+	"v.io/core/veyron2/naming"
 	"v.io/core/veyron2/services/mgmt/repository"
 
 	"v.io/core/veyron/lib/testutil"
@@ -16,10 +18,14 @@
 
 // TestHTTP checks that HTTP download works.
 func TestHTTP(t *testing.T) {
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
 	// TODO(caprita): This is based on TestMultiPart (impl_test.go).  Share
 	// the code where possible.
 	for length := 2; length < 5; length++ {
-		binary, _, url, cleanup := startServer(t, 2)
+		binary, _, url, cleanup := startServer(t, ctx, 2)
 		defer cleanup()
 		// Create <length> chunks of up to 4MB of random bytes.
 		data := make([][]byte, length)
@@ -29,15 +35,15 @@
 			data[i] = testutil.RandomBytes(size)
 		}
 		mediaInfo := repository.MediaInfo{Type: "application/octet-stream"}
-		if err := binary.Create(gctx, int32(length), mediaInfo); err != nil {
+		if err := binary.Create(ctx, int32(length), mediaInfo); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
-			if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
+			if streamErr, err := invokeUpload(t, ctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 				t.FailNow()
 			}
 		}
-		parts, _, err := binary.Stat(gctx)
+		parts, _, err := binary.Stat(ctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
@@ -70,7 +76,7 @@
 				t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 			}
 		}
-		if err := binary.Delete(gctx); err != nil {
+		if err := binary.Delete(ctx); 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 97ac906..3fcad12 100644
--- a/services/mgmt/binary/impl/impl_test.go
+++ b/services/mgmt/binary/impl/impl_test.go
@@ -27,17 +27,14 @@
 	veyronPrefix = "veyron_binary_repository"
 )
 
-var gctx *context.T
-var globalCancel context.CancelFunc
-
 // startServer starts the binary repository server.
-func startServer(t *testing.T, depth int) (repository.BinaryClientMethods, string, string, func()) {
+func startServer(t *testing.T, ctx *context.T, depth int) (repository.BinaryClientMethods, string, string, func()) {
 	// Setup the root of the binary repository.
 	rootDir, cleanup := mgmttest.SetupRootDir(t, "bindir")
 	prepDirectory(t, rootDir)
 
 	// Setup and start the binary repository server.
-	server, endpoint := mgmttest.NewServer(gctx)
+	server, endpoint := mgmttest.NewServer(ctx)
 
 	listener, err := net.Listen("tcp", "127.0.0.1:0")
 	if err != nil {
@@ -52,7 +49,7 @@
 			vlog.Fatalf("Serve() failed: %v", err)
 		}
 	}()
-	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(gctx), state)
+	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(ctx), state)
 	if err != nil {
 		t.Fatalf("NewDispatcher failed: %v", err)
 	}
@@ -75,19 +72,23 @@
 // all possible valid values of the depth used for the directory
 // hierarchy that stores binary objects in the local file system.
 func TestHierarchy(t *testing.T) {
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
 	for i := 0; i < md5.Size; i++ {
-		binary, ep, _, cleanup := startServer(t, i)
+		binary, ep, _, cleanup := startServer(t, ctx, i)
 		defer cleanup()
 		data := testData()
 
 		// Test the binary repository interface.
-		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(ctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
-		if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil {
+		if streamErr, err := invokeUpload(t, ctx, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
-		parts, _, err := binary.Stat(gctx)
+		parts, _, err := binary.Stat(ctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
@@ -100,21 +101,21 @@
 		if expected, got := len(data), int(parts[0].Size); expected != got {
 			t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 		}
-		output, streamErr, err := invokeDownload(t, gctx, binary, 0)
+		output, streamErr, err := invokeDownload(t, ctx, binary, 0)
 		if streamErr != nil || err != nil {
 			t.FailNow()
 		}
 		if bytes.Compare(output, data) != 0 {
 			t.Fatalf("Unexpected output: expected %v, got %v", data, output)
 		}
-		results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...")
+		results, err := testutil.GlobName(ctx, 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(gctx); err != nil {
+		if err := binary.Delete(ctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -124,8 +125,12 @@
 // uploads and downloads ranging the number of parts the test binary
 // consists of.
 func TestMultiPart(t *testing.T) {
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
 	for length := 2; length < 5; length++ {
-		binary, _, _, cleanup := startServer(t, 2)
+		binary, _, _, cleanup := startServer(t, ctx, 2)
 		defer cleanup()
 		// Create <length> chunks of up to 4MB of random bytes.
 		data := make([][]byte, length)
@@ -133,21 +138,21 @@
 			data[i] = testData()
 		}
 		// Test the binary repository interface.
-		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(ctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
-			if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
+			if streamErr, err := invokeUpload(t, ctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 				t.FailNow()
 			}
 		}
-		parts, _, err := binary.Stat(gctx)
+		parts, _, err := binary.Stat(ctx)
 		if err != nil {
 			t.Fatalf("Stat() failed: %v", err)
 		}
 		for i := 0; i < length; i++ {
 			hpart := md5.New()
-			output, streamErr, err := invokeDownload(t, gctx, binary, int32(i))
+			output, streamErr, err := invokeDownload(t, ctx, binary, int32(i))
 			if streamErr != nil || err != nil {
 				t.FailNow()
 			}
@@ -163,7 +168,7 @@
 				t.Fatalf("Unexpected size: expected %v, got %v", expected, got)
 			}
 		}
-		if err := binary.Delete(gctx); err != nil {
+		if err := binary.Delete(ctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -173,21 +178,25 @@
 // resumption ranging the number of parts the uploaded binary consists
 // of.
 func TestResumption(t *testing.T) {
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
 	for length := 2; length < 5; length++ {
-		binary, _, _, cleanup := startServer(t, 2)
+		binary, _, _, cleanup := startServer(t, ctx, 2)
 		defer cleanup()
 		// Create <length> chunks of up to 4MB of random bytes.
 		data := make([][]byte, length)
 		for i := 0; i < length; i++ {
 			data[i] = testData()
 		}
-		if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(ctx, 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(gctx)
+			parts, _, err := binary.Stat(ctx)
 			if err != nil {
 				t.Fatalf("Stat() failed: %v", err)
 			}
@@ -201,13 +210,13 @@
 			for i := 0; i < length; i++ {
 				fail := testutil.Rand.Intn(2)
 				if parts[i] == impl.MissingPart && fail != 0 {
-					if streamErr, err := invokeUpload(t, gctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
+					if streamErr, err := invokeUpload(t, ctx, binary, data[i], int32(i)); streamErr != nil || err != nil {
 						t.FailNow()
 					}
 				}
 			}
 		}
-		if err := binary.Delete(gctx); err != nil {
+		if err := binary.Delete(ctx); err != nil {
 			t.Fatalf("Delete() failed: %v", err)
 		}
 	}
@@ -215,7 +224,11 @@
 
 // TestErrors checks that the binary interface correctly reports errors.
 func TestErrors(t *testing.T) {
-	binary, _, _, cleanup := startServer(t, 2)
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
+	binary, _, _, cleanup := startServer(t, ctx, 2)
 	defer cleanup()
 	const length = 2
 	data := make([][]byte, length)
@@ -225,51 +238,51 @@
 			data[i][j] = byte(testutil.Rand.Int())
 		}
 	}
-	if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+	if err := binary.Create(ctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 		t.Fatalf("Create() failed: %v", err)
 	}
-	if err := binary.Create(gctx, int32(length), repository.MediaInfo{Type: "application/octet-stream"}); err == nil {
+	if err := binary.Create(ctx, 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)
 	}
-	if streamErr, err := invokeUpload(t, gctx, binary, data[0], 0); streamErr != nil || err != nil {
+	if streamErr, err := invokeUpload(t, ctx, binary, data[0], 0); streamErr != nil || err != nil {
 		t.Fatalf("Upload() failed: %v", err)
 	}
-	if _, err := invokeUpload(t, gctx, binary, data[0], 0); err == nil {
+	if _, err := invokeUpload(t, ctx, binary, data[0], 0); err == nil {
 		t.Fatalf("Upload() 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)
 	}
-	if _, _, err := invokeDownload(t, gctx, binary, 1); err == nil {
+	if _, _, err := invokeDownload(t, ctx, binary, 1); err == nil {
 		t.Fatalf("Download() 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)
 	}
-	if streamErr, err := invokeUpload(t, gctx, binary, data[1], 1); streamErr != nil || err != nil {
+	if streamErr, err := invokeUpload(t, ctx, binary, data[1], 1); streamErr != nil || err != nil {
 		t.Fatalf("Upload() failed: %v", err)
 	}
-	if _, streamErr, err := invokeDownload(t, gctx, binary, 0); streamErr != nil || err != nil {
+	if _, streamErr, err := invokeDownload(t, ctx, binary, 0); streamErr != nil || err != nil {
 		t.Fatalf("Download() failed: %v", err)
 	}
 	// Upload/Download on a part number that's outside the range set forth in
 	// Create should fail.
 	for _, part := range []int32{-1, length} {
-		if _, err := invokeUpload(t, gctx, binary, []byte("dummy"), part); err == nil {
+		if _, err := invokeUpload(t, ctx, binary, []byte("dummy"), part); err == nil {
 			t.Fatalf("Upload() did not fail when it should have")
 		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
-		if _, _, err := invokeDownload(t, gctx, binary, part); err == nil {
+		if _, _, err := invokeDownload(t, ctx, binary, part); err == nil {
 			t.Fatalf("Download() did not fail when it should have")
 		} else if want := impl.ErrInvalidPart.ID; !verror.Is(err, want) {
 			t.Fatalf("Unexpected error: %v, expected error id %v", err, want)
 		}
 	}
-	if err := binary.Delete(gctx); err != nil {
+	if err := binary.Delete(ctx); err != nil {
 		t.Fatalf("Delete() failed: %v", err)
 	}
-	if err := binary.Delete(gctx); err == nil {
+	if err := binary.Delete(ctx); 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)
@@ -277,7 +290,11 @@
 }
 
 func TestGlob(t *testing.T) {
-	_, ep, _, cleanup := startServer(t, 2)
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
+	_, ep, _, cleanup := startServer(t, ctx, 2)
 	defer cleanup()
 	data := testData()
 
@@ -286,14 +303,14 @@
 		name := naming.JoinAddressName(ep, obj)
 		binary := repository.BinaryClient(name)
 
-		if err := binary.Create(gctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
+		if err := binary.Create(ctx, 1, repository.MediaInfo{Type: "application/octet-stream"}); err != nil {
 			t.Fatalf("Create() failed: %v", err)
 		}
-		if streamErr, err := invokeUpload(t, gctx, binary, data, 0); streamErr != nil || err != nil {
+		if streamErr, err := invokeUpload(t, ctx, binary, data, 0); streamErr != nil || err != nil {
 			t.FailNow()
 		}
 	}
-	results, err := testutil.GlobName(gctx, naming.JoinAddressName(ep, ""), "...")
+	results, err := testutil.GlobName(ctx, naming.JoinAddressName(ep, ""), "...")
 	if err != nil {
 		t.Fatalf("GlobName failed: %v", err)
 	}
diff --git a/services/mgmt/device/impl/proxy_invoker_test.go b/services/mgmt/device/impl/proxy_invoker_test.go
index 2009a8c..2668160 100644
--- a/services/mgmt/device/impl/proxy_invoker_test.go
+++ b/services/mgmt/device/impl/proxy_invoker_test.go
@@ -7,7 +7,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/ipc"
 	"v.io/core/veyron2/naming"
-	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/services/mgmt/stats"
 	"v.io/core/veyron2/services/security/access"
@@ -19,12 +18,9 @@
 // TODO(toddw): Add tests of Signature and MethodSignature.
 
 func TestProxyInvoker(t *testing.T) {
-	runtime, err := rt.New()
-	if err != nil {
-		t.Fatalf("Could not initialize runtime: %v", err)
-	}
-	defer runtime.Cleanup()
-	ctx := runtime.NewContext()
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
 
 	// server1 is a normal server
 	server1, err := veyron2.NewServer(ctx)
@@ -51,7 +47,6 @@
 		t.Fatalf("Listen: %v", err)
 	}
 	disp := &proxyDispatcher{
-		runtime,
 		naming.JoinAddressName(eps1[0].String(), "__debug/stats"),
 		stats.StatsServer(nil).Describe__(),
 	}
@@ -85,9 +80,8 @@
 func (*dummy) Method(_ ipc.ServerContext) error { return nil }
 
 type proxyDispatcher struct {
-	runtime veyron2.Runtime
-	remote  string
-	desc    []ipc.InterfaceDesc
+	remote string
+	desc   []ipc.InterfaceDesc
 }
 
 func (d *proxyDispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
diff --git a/services/mgmt/lib/binary/impl_test.go b/services/mgmt/lib/binary/impl_test.go
index 4a4deb4..42db6a4 100644
--- a/services/mgmt/lib/binary/impl_test.go
+++ b/services/mgmt/lib/binary/impl_test.go
@@ -11,7 +11,6 @@
 	"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"
 	"v.io/core/veyron2/vlog"
 
@@ -24,19 +23,11 @@
 	veyronPrefix = "veyron_binary_repository"
 )
 
-var gctx *context.T
-
 func init() {
 	testutil.Init()
-
-	runtime, err := rt.New()
-	if err != nil {
-		panic(err)
-	}
-	gctx = runtime.NewContext()
 }
 
-func setupRepository(t *testing.T) (string, func()) {
+func setupRepository(t *testing.T, ctx *context.T) (string, func()) {
 	// Setup the root of the binary repository.
 	rootDir, err := ioutil.TempDir("", veyronPrefix)
 	if err != nil {
@@ -47,7 +38,7 @@
 		vlog.Fatalf("WriteFile(%v, %v, %v) failed: %v", path, impl.Version, perm, err)
 	}
 	// Setup and start the binary repository server.
-	server, err := veyron2.NewServer(gctx)
+	server, err := veyron2.NewServer(ctx)
 	if err != nil {
 		t.Fatalf("NewServer() failed: %v", err)
 	}
@@ -57,7 +48,7 @@
 		t.Fatalf("NewState(%v, %v) failed: %v", rootDir, depth, err)
 	}
 
-	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(gctx), state)
+	dispatcher, err := impl.NewDispatcher(veyron2.GetPrincipal(ctx), state)
 	if err != nil {
 		t.Fatalf("NewDispatcher() failed: %v\n", err)
 	}
@@ -89,24 +80,28 @@
 // TestBufferAPI tests the binary repository client-side library
 // interface using buffers.
 func TestBufferAPI(t *testing.T) {
-	von, cleanup := setupRepository(t)
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
+	von, cleanup := setupRepository(t, ctx)
 	defer cleanup()
 	data := testutil.RandomBytes(testutil.Rand.Intn(10 << 20))
 	mediaInfo := repository.MediaInfo{Type: "application/octet-stream"}
-	if err := Upload(gctx, von, data, mediaInfo); err != nil {
+	if err := Upload(ctx, von, data, mediaInfo); err != nil {
 		t.Fatalf("Upload(%v) failed: %v", von, err)
 	}
-	output, outInfo, err := Download(gctx, von)
+	output, outInfo, err := Download(ctx, 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(gctx, von); err != nil {
+	if err := Delete(ctx, von); err != nil {
 		t.Errorf("Delete(%v) failed: %v", von, err)
 	}
-	if _, _, err := Download(gctx, von); err == nil {
+	if _, _, err := Download(ctx, von); err == nil {
 		t.Errorf("Download(%v) did not fail", von)
 	}
 	if !reflect.DeepEqual(mediaInfo, outInfo) {
@@ -117,7 +112,11 @@
 // TestFileAPI tests the binary repository client-side library
 // interface using files.
 func TestFileAPI(t *testing.T) {
-	von, cleanup := setupRepository(t)
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
+	von, cleanup := setupRepository(t, ctx)
 	defer cleanup()
 	// Create up to 10MB of random bytes.
 	data := testutil.RandomBytes(testutil.Rand.Intn(10 << 20))
@@ -141,10 +140,10 @@
 	if _, err := src.Write(data); err != nil {
 		t.Fatalf("Write() failed: %v", err)
 	}
-	if err := UploadFromFile(gctx, von, src.Name()); err != nil {
+	if err := UploadFromFile(ctx, von, src.Name()); err != nil {
 		t.Fatalf("UploadFromFile(%v, %v) failed: %v", von, src.Name(), err)
 	}
-	if err := DownloadToFile(gctx, von, dst.Name()); err != nil {
+	if err := DownloadToFile(ctx, von, dst.Name()); err != nil {
 		t.Fatalf("DownloadToFile(%v, %v) failed: %v", von, dst.Name(), err)
 	}
 	output, err := ioutil.ReadFile(dst.Name())
@@ -161,7 +160,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(gctx, von); err != nil {
+	if err := Delete(ctx, von); err != nil {
 		t.Errorf("Delete(%v) failed: %v", von, err)
 	}
 }
@@ -169,9 +168,13 @@
 // TestDownloadURL tests the binary repository client-side library
 // DownloadURL method.
 func TestDownloadURL(t *testing.T) {
-	von, cleanup := setupRepository(t)
+	ctx, shutdown := veyron2.Init()
+	defer shutdown()
+	veyron2.GetNamespace(ctx).CacheCtl(naming.DisableCache(true))
+
+	von, cleanup := setupRepository(t, ctx)
 	defer cleanup()
-	url, _, err := DownloadURL(gctx, von)
+	url, _, err := DownloadURL(ctx, von)
 	if err != nil {
 		t.Fatalf("DownloadURL(%v) failed: %v", von, err)
 	}
diff --git a/services/mgmt/lib/testutil/modules.go b/services/mgmt/lib/testutil/modules.go
index b98460d..23aa53e 100644
--- a/services/mgmt/lib/testutil/modules.go
+++ b/services/mgmt/lib/testutil/modules.go
@@ -10,7 +10,6 @@
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/context"
 	"v.io/core/veyron2/ipc"
-	"v.io/core/veyron2/rt"
 	"v.io/core/veyron2/security"
 	"v.io/core/veyron2/vlog"
 
@@ -127,17 +126,6 @@
 	return server, endpoints[0].String()
 }
 
-// NewRuntime makes an instance of the runtime.
-func NewRuntime(t *testing.T, octx *context.T, opts ...veyron2.ROpt) (*context.T, context.CancelFunc) {
-	runtime, err := rt.New(opts...)
-	if err != nil {
-		t.Fatalf("rt.New() failed: %v", err)
-	}
-	ctx := runtime.NewContext()
-	veyron2.GetNamespace(ctx).SetRoots(veyron2.GetNamespace(octx).Roots()[0])
-	return ctx, runtime.Cleanup
-}
-
 // ReadPID waits for the "ready:<PID>" line from the child and parses out the
 // PID of the child.
 func ReadPID(t *testing.T, s *expect.Session) int {
