diff --git a/Makefile b/Makefile
index 1f4f585..c8afcc4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,11 @@
-NODE_DIR := $(shell jiri profile list --info Target.InstallationDir v23:nodejs)
-PATH := node_modules/.bin:$(NODE_DIR)/bin:$(PATH)
+NODE_BIN := $(shell jiri profile env --profiles=v23:base,v23:nodejs NODE_BIN=)
+PATH := node_modules/.bin:$(NODE_BIN):$(PATH)
 
-NODE_BIN := $(JIRI_ROOT)/release/javascript/core/node_modules/.bin
-GOPATH := $(JIRI_ROOT)/release/javascript/core/go
-GOBIN := $(JIRI_ROOT)/release/javascript/core/go/bin
+NODE_MODULES_BIN := $(JIRI_ROOT)/release/javascript/core/node_modules/.bin
 VDLPATH := $(JIRI_ROOT)/release/go/src:$(GOPATH)/src
 VDLROOT := $(JIRI_ROOT)/release/go/src/v.io/v23/vdlroot
 VGO := GOPATH="$(GOPATH)" VDLPATH="$(VDLPATH)" jiri go
-GO_FILES := $(shell find go/src $(JIRI_ROOT)/release/go/src/v.io -name "*.go")
+GO_FILES := $(shell find $(JIRI_ROOT)/release/go/src/v.io -name "*.go")
 
 NODE_MODULE_JS_FILES := $(shell find node_modules -name *.js | sed 's/ /\\ /')
 
@@ -17,56 +15,11 @@
 
 # NOTE: we run npm using 'node npm' to avoid relying on the shebang line in the
 # npm script, which can exceed the Linux shebang length limit on Jenkins.
-NPM := $(NODE_DIR)/bin/npm
+NPM := $(NODE_BIN)/npm
 
 .DEFAULT_GOAL := all
 
-# Default browserify options: create a standalone bundle, and use sourcemaps.
-BROWSERIFY_OPTS := --standalone vanadium --debug
-# Names that should not be mangled by minification.
-RESERVED_NAMES := 'context,ctx,callback,cb,$$stream,serverCall'
-# Don't mangle RESERVED_NAMES, and screw ie8.
-MANGLE_OPTS := --mangle [--except $(RESERVED_NAMES) --screw_ie8 ]
-# Don't remove unused variables from function arguments, which could mess up signatures.
-# Also don't evaulate constant expressions, since we rely on them to conditionally require modules only in node.
-COMPRESS_OPTS := --compress [ --no-unused --no-evaluate ]
-
-# Browserify and extract sourcemap, but do not minify.
-define BROWSERIFY
-	mkdir -p $(dir $2)
-	browserify $1 $(BROWSERIFY_OPTS) | exorcist $2.map > $2
-endef
-
-# Browserify, minify, and extract sourcemap.
-define BROWSERIFY-MIN
-	mkdir -p $(dir $2)
-	browserify $1 $(BROWSERIFY_OPTS) --g [ uglifyify $(MANGLE_OPTS) $(COMPRESS_OPTS) ] | exorcist $2.map > $2
-endef
-
-# When running browser tests on non-Darwin machines, set the --headless flag.
-# This uses Xvfb underneath the hood (inside prova => browser-launcher =>
-# headless), which is not supported on OS X.
-# See: https://github.com/kesla/node-headless/
-ifndef NOHEADLESS
-	ifneq ($(UNAME),Darwin)
-		HEADLESS := --headless
-	endif
-endif
-
-ifdef STOPONFAIL
-	STOPONFAIL := --stopOnFirstFailure
-endif
-
-ifndef NOTAP
-	TAP := --tap
-endif
-
-ifndef NOQUIT
-	QUIT := --quit
-endif
-
 ifdef XUNIT
-	TAP := --tap # TAP must be set for xunit to work
 	OUTPUT_TRANSFORM := tap-xunit
 endif
 
@@ -78,50 +31,19 @@
 	NODE_OUTPUT_LOCAL := | tee $(NODE_OUTPUT_LOCAL)
 endif
 
-ifdef BROWSER_OUTPUT
-	BROWSER_OUTPUT_LOCAL = $(BROWSER_OUTPUT)
-	ifdef OUTPUT_TRANSFORM
-		BROWSER_OUTPUT_LOCAL := >($(OUTPUT_TRANSFORM) --package=javascript.browser > $(BROWSER_OUTPUT_LOCAL))
-	endif
-	BROWSER_OUTPUT_LOCAL := | tee $(BROWSER_OUTPUT_LOCAL)
-endif
-
-PROVA_OPTS := --includeFilenameAsPackage $(TAP) $(QUIT) $(STOPONFAIL)
-
-BROWSER_OPTS := --browser --transform envify --launch chrome $(HEADLESS)
-
 JS_SRC_FILES = $(shell find src -name "*.js" | sed 's/ /\\ /')
 
-# Common services needed for all integration tests. Must be a comma-seperated
-# string with no spaces.
-COMMON_SERVICES := "test_serviced"
-
-LOADTEST_SERVICE := "stressd"
-
 all: gen-vdl lint build docs
 
-build: dist docs extension/vanadium.zip
-
-dist/vanadium.js: src/vanadium.js $(JS_SRC_FILES) $(NODE_MODULES_JS_FILES) | node_modules
-	$(call BROWSERIFY,$<,$@)
-
-dist/vanadium.min.js: src/vanadium.js $(JS_SRC_FILES) $(NODE_MODULES_JS_FILES) | node_modules
-	$(call BROWSERIFY-MIN,$<,$@)
-
-dist: dist/vanadium.js dist/vanadium.min.js
-
-extension/vanadium.zip: node_modules
-	$(MAKE) -C extension vanadium.zip
+build: docs
 
 test-precheck: gen-vdl-test node_modules lint dependency-check
 
-test: test-unit test-integration test-vdl test-vom
+test: test-unit test-vdl test-vom
 
-test-vdl: test-vdl-node test-vdl-browser
+test-vdl: test-vdl-node
 
 # This generates the VDL files and asks git if there are any changed files.
-# We don't have to check the extension since it does not check in VDL files.
-#
 # The alternative is to use the vdl audit command, but that requires checking
 # after both vdl commands in gen-vdl-impl as opposed to a single git status.
 test-vdl-audit: gen-vdl
@@ -132,7 +54,7 @@
 	  exit 1; \
 	fi
 
-test-vom: test-vom-node test-vom-browser
+test-vom: test-vom-node
 
 # This generates the output of the vdl files in src/gen-vdl/v.io/<package-path>
 # The command will generate all the dependent files as well.
@@ -143,8 +65,8 @@
 # This generates the output of the vdl files in test/vdl-out/gen-vdl/v.io/<package-path>
 # The command will generate all the dependent files as well.
 gen-vdl-test: JS_VDL_DIR := "$(JIRI_ROOT)/release/javascript/core/test/vdl-out"
-gen-vdl-test: EXTRA_VDL_PATHS := "javascript-test/..." "v.io/x/js.core/..."
-gen-vdl-test: VDLPATH := "$(JIRI_ROOT)/release/go/src:$(JIRI_ROOT)/release/javascript/core/test/vdl-in/src:$(JIRI_ROOT)/release/javascript/core/go/src"
+gen-vdl-test: EXTRA_VDL_PATHS := "javascript-test/..."
+gen-vdl-test: VDLPATH := "$(JIRI_ROOT)/release/go/src:$(JIRI_ROOT)/release/javascript/core/test/vdl-in/src"
 gen-vdl-test: JS_VDL_PATH_TO_CORE := "../../src"
 gen-vdl-test: gen-vdl-impl
 
@@ -187,86 +109,32 @@
 endif
 
 test-vdl-node: test-precheck
-	prova test/vdl/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
-
-test-vdl-browser: test-precheck
-	prova test/vdl/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
+	tape test/vdl/test-*.js $(NODE_OUTPUT_LOCAL)
 
 test-vom-node: test-precheck
-	prova test/vom/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
+	tape test/vom/test-*.js $(NODE_OUTPUT_LOCAL)
 
-test-vom-browser: test-precheck
-	prova test/vom/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
-
-test-unit: test-unit-node test-unit-browser
+test-unit: test-unit-node
 
 test-unit-node: test-precheck
-	prova test/unit/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
-
-test-unit-browser: test-precheck
-	prova test/unit/test-*.js $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL)
-
-test-integration: lint test-integration-node test-integration-browser
-
-test-integration-node: test-precheck go/bin
-	node test/integration/runner.js --services=$(COMMON_SERVICES) -- \
-	prova test/integration/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
-
-test-integration-browser: test-precheck go/bin
-	node test/integration/runner.js --services=$(COMMON_SERVICES) -- \
-	make test-integration-browser-runner
-
-test-integration-browser-runner: BROWSER_OPTS := --options="--load-extension=$(PWD)/extension/build-test/,--ignore-certificate-errors,--enable-logging=stderr" $(BROWSER_OPTS)
-test-integration-browser-runner:
-	@$(RM) -fr extension/build-test
-	$(MAKE) -C extension build-test
-	prova test/integration/test-*.js --log=./tmp/chrome.log $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL) $(SAVE_CHROME_LOGS)
-
-test-load-node: test-precheck go/bin
-	node test/integration/runner.js --services=$(LOADTEST_SERVICE)  -- \
-	prova test/load/test-*.js $(PROVA_OPTS) $(NODE_OUTPUT_LOCAL)
-
-
-test-load-browser: test-precheck go/bin
-	node test/integration/runner.js --services=$(LOADTEST_SERVICE)  -- \
-	make test-load-browser-runner
-
-test-load-browser-runner: BROWSER_OPTS := --options="--load-extension=$(PWD)/extension/build-test/,--ignore-certificate-errors,--enable-logging=stderr" $(BROWSER_OPTS)
-test-load-browser-runner:
-	@$(RM) -fr extension/build-test
-	$(MAKE) -C extension build-test
-	prova test/load/test-*.js --log=./tmp/chrome.log $(PROVA_OPTS) $(BROWSER_OPTS) $(BROWSER_OUTPUT_LOCAL) $(SAVE_CHROME_LOGS)
-
-
-
-
-go/bin: $(GO_FILES)
-	@$(VGO) build -o $(GOBIN)/servicerunner -a -tags wspr v.io/x/ref/cmd/servicerunner
-	@$(VGO) build -o $(GOBIN)/principal v.io/x/ref/cmd/principal
-	@$(VGO) build -o $(GOBIN)/test_serviced v.io/x/js.core/test_service/test_serviced
-	@$(VGO) build -o $(GOBIN)/stressd v.io/x/js.core/stress/stressd
+	tape test/unit/test-*.js $(NODE_OUTPUT_LOCAL)
 
 lint: node_modules
 ifdef NOLINT
 	@echo "Skipping lint - disabled by NOLINT environment variable"
 else
 	jshint .
-	$(MAKE) -C extension lint
 endif
 
 dependency-check: node_modules
 	dependency-check package.json --entry src/vanadium.js
 
 clean:
-	@$(RM) -fr dist
 	@$(RM) -fr docs
-	@$(RM) -fr go/bin
-	@$(RM) -fr go/pkg
 	@$(RM) -fr node_modules
 	@$(RM) -fr npm-debug.log
 	@$(RM) -fr tmp
 	@$(RM) -fr xunit.xml
-	$(MAKE) -C extension clean
 
 DOCSTRAP_LOC:= node_modules/ink-docstrap
 docs: $(JS_SRC_FILES) jsdocs/docstrap-template/compiled/site.vanadium.css | node_modules
@@ -291,7 +159,7 @@
 	# Copy our raw LESS style assets to docstrap
 	cp -f jsdocs/docstrap-template/styles/*.* ${DOCSTRAP_LOC}/styles
 	# Rebuilt the styles
-	cd ${DOCSTRAP_LOC}; ${NODE_BIN}/grunt less
+	cd ${DOCSTRAP_LOC}; ${NODE_MODULES_BIN}/grunt less
 	# Copy back the compiled style file from docstrap
 	cp -f ${DOCSTRAP_LOC}/template/static/styles/site.cosmo.css jsdocs/docstrap-template/compiled/site.vanadium.css
 	# Rebuild docs
@@ -301,7 +169,7 @@
 	cd ${DOCSTRAP_LOC}; node $(NPM) install
 
 node_modules/ink-docstrap/bower_components:
-	cd ${DOCSTRAP_LOC}; ${NODE_BIN}/bower install
+	cd ${DOCSTRAP_LOC}; ${NODE_MODULES_BIN}/bower install
 
 # serve-docs
 #
@@ -330,14 +198,12 @@
 	@which npm > /dev/null || { echo "npm is not in the path. Did you remember to run 'jiri profile install v23:nodejs'?"; exit 1; }
 
 .PHONY: all build clean dependency-check lint test
-.PHONY: test-integration test-integration-node test-integration-browser
-.PHONY: test-unit test-unit-node test-unit-browser
+.PHONY: test-unit test-unit-node
 .PHONY: check-that-npm-is-in-path
 .PHONY: gen-vdl gen-vdl-test gen-vdl-test-expected gen-vdl-impl gen-vdl-test-expected-impl
 
 # Prevent the tests from running in parallel, which causes problems because it
 # starts multiple instances of the services at once, and also because it
 # interleaves the test output.
-.NOTPARALLEL: test-integration test-integration-browser test-integration-node
-.NOTPARALLEL: test-unit test-unit-node test-unit-browser
-.NOTPARALLEL: test-vdl test-vdl-node test-vdl-browser
+.NOTPARALLEL: test-unit test-unit-node
+.NOTPARALLEL: test-vdl test-vdl-node
diff --git a/extension/.jshintrc b/extension/.jshintrc
deleted file mode 100644
index d332d55..0000000
--- a/extension/.jshintrc
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  "camelcase": true,
-  "curly": true,
-  "eqeqeq": true,
-  "expr": true,
-  "forin": true,
-  "freeze": true,
-  "immed": true,
-  "indent": 2,
-  "latedef": "nofunc",
-  "maxlen": 80,
-  "newcap": true,
-  "noarg": true,
-  "nonbsp": true,
-  "nonew": true,
-  "quotmark": "single",
-  "sub": true,
-  "trailing": true,
-  "undef": true,
-  "unused": "vars",
-  "esnext": true,
-  "devel": true,
-  "node": true,
-  "browser": true,
-
-  "globals": {
-    "chrome": false
-  }
-}
diff --git a/extension/Makefile b/extension/Makefile
deleted file mode 100644
index d0b5b26..0000000
--- a/extension/Makefile
+++ /dev/null
@@ -1,166 +0,0 @@
-NODE_DIR := $(shell jiri profile list --info Target.InstallationDir v23:nodejs)
-PATH := node_modules/.bin:${NODE_DIR}/bin:$(PATH)
-VDLPATH := $(JIRI_ROOT)/release/go/src
-VDLROOT := $(JIRI_ROOT)/release/go/src/v.io/v23/vdlroot
-WSPR_ROOT := $(JIRI_ROOT)/release/go/src/v.io/x/ref/services/wspr
-SHELL := /bin/bash -e -o pipefail
-.DEFAULT_GOAL := all
-
-# NOTE: we run npm using 'node npm' to avoid relying on the shebang line in the
-# npm script, which can exceed the Linux shebang length limit on Jenkins.
-NPM := $(NODE_DIR)/bin/npm
-
-JS_FILES = $(shell find src -name "*.js" -o -name "*.css")
-
-define BROWSERIFY
-	mkdir -p $(dir $2)
-	browserify $1 --transform brfs --debug --outfile $2
-endef
-
-define BROWSERIFY-TEST
-	mkdir -p $(dir $2)
-	browserify $1 --transform brfs --transform envify --debug --outfile $2
-endef
-
-define COMPILE-NACL-PLUGIN
-	mkdir -p $(dir $2)
-	unset GOARCH GOOS; jiri -v go -v --profiles=v23:nacl --target=amd64p32-nacl build -v -o $2 $1
-endef
-
-all: vanadium.zip
-
-build/html: html/*
-	mkdir -p build
-	cp -r html build
-
-build/images: images/*
-	mkdir -p build
-	cp -r images build
-
-build/manifest.json: manifest.json
-	mkdir -p build
-	cp manifest.json build
-
-build/js/background.js: src/background/index.js $(JS_FILES) gen-vdl node_modules
-	$(call BROWSERIFY,$<,$@)
-
-build/js/content.js: src/content/index.js $(JS_FILES) node_modules
-	$(call BROWSERIFY,$<,$@)
-
-build/js/options.js: src/background/options.js $(JS_FILES) node_modules
-	$(call BROWSERIFY,$<,$@)
-
-build/js/addcaveats.js: src/background/addcaveats.js $(JS_FILES) node_modules
-	$(call BROWSERIFY,$<,$@)
-
-build/js: build/js/background.js build/js/content.js build/js/options.js build/js/addcaveats.js
-
-build/nacl/main.nmf: nacl
-	mkdir -p $(dir $@)
-	cp -r nacl/main.nmf $@
-
-build/nacl/main-64.nexe: $(JIRI_ROOT)/release/go/src/v.io/x/ref/services/wspr/browsprd/main_nacl.go
-	@$(call COMPILE-NACL-PLUGIN,$<,$@)
-
-build/nacl: build/nacl/main.nmf build/nacl/main-64.nexe
-
-build: build/html build/images build/manifest.json build/js build/nacl
-
-build-dev: build
-	patch build/manifest.json < manifest-test.json.patch # Adds "key" as first line.
-
-vanadium.zip: build
-	zip -r $@ ./build/*
-
-build-test/html: html/*
-	mkdir -p build-test
-	cp -r html build-test
-
-build-test/images: images/*
-	mkdir -p build-test
-	cp -r images build-test
-
-build-test/manifest.json: manifest.json
-	mkdir -p build-test
-	cp manifest.json build-test
-	patch build-test/manifest.json < manifest-test.json.patch # Adds "key" as first line.
-
-build-test/js/background.js: src/background/index.js $(JS_FILES) gen-vdl node_modules
-	$(call BROWSERIFY-TEST,$<,$@)
-
-build-test/js/content.js: src/content/index.js $(JS_FILES) node_modules
-	$(call BROWSERIFY-TEST,$<,$@)
-
-build-test/js/options.js: src/background/options.js $(JS_FILES) node_modules
-	$(call BROWSERIFY-TEST,$<,$@)
-
-build-test/js/addcaveats.js: src/background/addcaveats.js $(JS_FILES) node_modules
-	$(call BROWSERIFY-TEST,$<,$@)
-
-# The EXTENSION_SETTINGS env variable is used by the extension to set the default settings variables.
-build-test/js: export EXTENSION_SETTINGS := {"namespaceRoot": "$(V23_NAMESPACE)",\
-                                             "proxy": "test/proxy",\
-                                             "identityd": "$(IDENTITYD)",\
-                                             "identitydBlessingUrl": "$(IDENTITYD_BLESSING_URL)",\
-                                             "logLevel": "1",\
-                                             "logModule": "wspr.go=3"}
-# The TEST_ACCESS_TOKEN and TEST_CAVEATS env variables allow the tests to run without user input.
-build-test/js: export TEST_ACCESS_TOKEN := test-access-token
-build-test/js: export TEST_CAVEATS := 24h
-# The ALLOW_INTENTIONAL_CRASH env variable is used to test that the extension can restart after a crash.
-build-test/js: export ALLOW_INTENTIONAL_CRASH := true
-build-test/js: build-test/js/background.js build-test/js/content.js build-test/js/options.js build-test/js/addcaveats.js
-
-build-test/nacl/main.nmf: nacl
-	mkdir -p $(dir $@)
-	cp -r nacl/main.nmf $@
-
-build-test/nacl/main-64.nexe: $(WSPR_ROOT)/browsprd/main_nacl.go
-	$(call COMPILE-NACL-PLUGIN,$<,$@)
-
-build-test/nacl: build-test/nacl/main.nmf build-test/nacl/main-64.nexe
-
-build-test: build-test/html build-test/images build-test/manifest.json build-test/js build-test/nacl
-
-gen-vdl: $(WSPR_ROOT)/internal/channel/channel.vdl $(WSPR_ROOT)/internal/browspr/browspr.vdl $(WSPR_ROOT)/internal/account/account.vdl
-	VDLPATH=$(VDLPATH) VDLROOT=$(VDLROOT) vdl generate -lang=javascript \
-		-js-out-dir="$(JIRI_ROOT)/release/javascript/core/extension/vdl" \
-		-js-relative-path-to-core=../../src $(dir $^)
-	# TODO(bjornick): We build the vdlroot stuff with a different set of command line options because the package
-	# path does not equal the directory path of the source file.  This is not ideal, but bjornick and toddw will
-	# discuss how to fix this later.
-	VDLPATH=$(VDLPATH) VDLROOT=$(VDLROOT) vdl generate -lang=javascript \
-		-js-relative-path-to-core=../../../../../src \
-		-js-out-dir="$(JIRI_ROOT)/release/javascript/core/extension/vdl" \
-		$(VDLROOT)/...
-
-example-server: example/index.bundle.js
-	static "example" -H '{"Cache-Control": "no-cache, must-revalidate"}'
-
-example/index.bundle.js: example/index.js node_modules
-	browserify $< --transform brfs --global-transform envify --debug --outfile $@
-
-lint: node_modules
-	jshint src/ example/index.js
-
-dependency-check: node_modules
-	dependency-check package.json --entry src/background/index.js --entry src/content/index.js
-
-clean:
-	@$(RM) -fr node_modules npm-debug.log
-	@$(RM) -fr vanadium.zip build build-test
-
-node_modules: package.json | check-that-npm-is-in-path
-	@node $(NPM) prune
-	@node $(NPM) install --quiet
-
-check-that-npm-is-in-path:
-	@which npm > /dev/null || { echo "npm is not in the path. Did you remember to run 'jiri profile install v23:nodejs'?"; exit 1; }
-
-.PHONY: all build build-dev clean dependency-check gen-vdl lint
-
-# Always rebuild the plugin.
-.PHONY: nacl/main-64.nexe
-
-# Always rebuild the example server.
-.PHONY: example/index.bundle.js
diff --git a/extension/README.md b/extension/README.md
deleted file mode 100644
index b420b84..0000000
--- a/extension/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# The Veyron Extension
-
-## Developing with an unpacked extension:
-    $ make clean && make
-
-This will build an unpacked extension in the ./extension directory.
-
-To load the unpacked extension in Chrome:
-1. Click Hamburger menu -> Tools -> Extensions
-2. Click "Load unpacked extension..."
-3. Navigate to ./extension and click "OK".
-
-## Publishing a new version of the extension:
-
-Note: You must be a member of the vanadium-extension-managers group to publish.
-
-1. Bump the version number in manifest.json.
-2. Build a zip file with "make veyron.zip"
-3. Upload and publish the extension on https://chrome.google.com/webstore/developer/dashboard
-
-## Running the example server
-    $ make example-server
-
-This will run an example web app at http://localhost:8080.  The web app has a
-log-in button that communicates with the extension to start the blessing flow.
diff --git a/extension/example/index.html b/extension/example/index.html
deleted file mode 100644
index 2fcf88d..0000000
--- a/extension/example/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<html>
-<head>
-  <title>Example App</title>
-  <script type="text/javascript" src="./index.bundle.js"></script>
-</head>
-
-<body>
-  Example App
-  <br>
-  <a href="#" id="login-link">Login</a>
-</body>
-</html>
diff --git a/extension/example/index.js b/extension/example/index.js
deleted file mode 100644
index dd8d33b..0000000
--- a/extension/example/index.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var vanadium = window.vanadium = require('../../src/vanadium.js');
-
-var vanadiumConfig = {
-  authenticate: true
-};
-
-document.addEventListener('DOMContentLoaded', function(){
-  var loginLink = document.getElementById('login-link');
-  loginLink.addEventListener('click', handleLogin);
-
-  console.log('example app loaded');
-});
-
-function handleLogin(e){
-  e.preventDefault();
-  console.log('login clicked');
-
-  vanadium.init(vanadiumConfig, function(err, rt){
-    if (err) {
-      return console.error(err);
-    }
-
-    var accountName = rt.accountName;
-    console.log('got runtime with accountName: ' + accountName);
-    alert('Hello ' + accountName + '!');
-  });
-}
diff --git a/extension/html/addcaveats.html b/extension/html/addcaveats.html
deleted file mode 100644
index c6425be..0000000
--- a/extension/html/addcaveats.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!doctype html>
-<html>
-<head>
-  <meta
-     name="viewport"
-     content="width=device-width,
-              initial-scale=1,
-              maximum-scale=1,
-              user-scalable=no,
-              minimal-ui">
-  <meta
-     name="apple-mobile-web-app-capable"
-     content="yes">
-
-  <meta
-     name="apple-mobile-web-app-status-bar-style"
-     content="black">
-
-
-  <!--TODO(suharshs,nlacasse): Consider bundling all external assets inside the extension.-->
-  <link href='http://fonts.googleapis.com/css?family=Source+Code+Pro:400,500|Roboto:500,400italic,300,500italic,300italic,400'
-    rel='stylesheet'
-    type='text/css'>
-  <link rel="stylesheet" href="https://v.io/identity.css">
-
-  <link rel="apple-touch-icon" sizes="57x57" href="https://v.io/favicons/apple-touch-icon-57x57.png">
-  <link rel="apple-touch-icon" sizes="114x114" href="https://v.io/favicons/apple-touch-icon-114x114.png">
-  <link rel="apple-touch-icon" sizes="72x72" href="https://v.io/favicons/apple-touch-icon-72x72.png">
-  <link rel="apple-touch-icon" sizes="144x144" href="https://v.io/favicons/apple-touch-icon-144x144.png">
-  <link rel="apple-touch-icon" sizes="60x60" href="https://v.io/favicons/apple-touch-icon-60x60.png">
-  <link rel="apple-touch-icon" sizes="120x120" href="https://v.io/favicons/apple-touch-icon-120x120.png">
-  <link rel="apple-touch-icon" sizes="76x76" href="https://v.io/favicons/apple-touch-icon-76x76.png">
-  <link rel="apple-touch-icon" sizes="152x152" href="https://v.io/favicons/apple-touch-icon-152x152.png">
-  <link rel="apple-touch-icon" sizes="180x180" href="https://v.io/favicons/apple-touch-icon-180x180.png">
-  <link rel="icon" type="image/png" href="https://v.io/favicons/favicon-192x192.png" sizes="192x192">
-  <link rel="icon" type="image/png" href="https://v.io/favicons/favicon-160x160.png" sizes="160x160">
-  <link rel="icon" type="image/png" href="https://v.io/favicons/favicon-96x96.png" sizes="96x96">
-  <link rel="icon" type="image/png" href="https://v.io/favicons/favicon-16x16.png" sizes="16x16">
-  <link rel="icon" type="image/png" href="https://v.io/favicons/favicon-32x32.png" sizes="32x32">
-  <meta name="msapplication-TileColor" content="#da532c">
-  <meta name="msapplication-TileImage" content="https://v.io/favicons/mstile-144x144.png">
-
-  <script src="/js/addcaveats.js"></script>
-  <title>Request for Blessings</title>
-</head>
-
-<body class="default-layout">
-
-<header>
-  <nav class="left">
-    <a href="#" class="logo">Vanadium</a>
-  </nav>
-
-  <nav class="main">
-    <a href="#">Grants for Blessings</a>
-  </nav>
-
-  <nav class="right">
-    <a class="origin" href="#"></a>
-  </nav>
-</header>
-
-<main style="max-width: 80%; margin-left: 10px;">
-  <h2>Allow access to <span class="origin"></span> for 10 days?</h2>
-  <h4 id="warning" class="hidden">WARNING: <span class="origin"></span> is not secure (not https).  Vanadium's security model may be compromised.</h4>
-  <p>This web page will be able to see your email address and public keys.  Only allow access to web pages you trust.</p>
-  <!--TODO(suharshs,nlacasse,aghasemi): We can remove this hidden css class to allow the user to select specific caveats.-->
-  <div class="hidden">
-      <input type="text" id="ExpiryCaveat" placeholder="i.e. 2h45m. Valid time units are ns, us (or µs), ms, s, m, h. Defaults to 240h.">
-  </div>
-  <p id="tos">By clicking "Allow", you consent to be bound by Google's general <a href="https://www.google.com/intl/en/policies/terms/">Terms of Service</a>,
-  the <a href="https://developers.google.com/terms/">Google APIs Terms of Service</a>,
-  and Google's general <a href="https://www.google.com/intl/en/policies/privacy/">Privacy Policy</a>.</p>
-  <div class="grid">
-    <button id="submit-caveats" class="cell button-passive" type="submit">Allow</button>
-    <button id="cancel" class="cell button-passive">Deny</button>
-    <div class="cell"></div>
-    <div class="cell"></div>
-  </div>
-</main>
-
-</body>
-</html>
diff --git a/extension/html/background.html b/extension/html/background.html
deleted file mode 100644
index dd77ef5..0000000
--- a/extension/html/background.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<head>
-  <title>Veyron Background Page</title>
-  <script type="text/javascript" src="/js/background.js"></script>
-</head>
-<body></body>
-</html>
diff --git a/extension/html/options.html b/extension/html/options.html
deleted file mode 100644
index 56ca049..0000000
--- a/extension/html/options.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <script src="/js/options.js"></script>
-  </head>
-</html>
diff --git a/extension/images/1x1.png b/extension/images/1x1.png
deleted file mode 100644
index 17f1d2e..0000000
--- a/extension/images/1x1.png
+++ /dev/null
Binary files differ
diff --git a/extension/images/icon_128.png b/extension/images/icon_128.png
deleted file mode 100644
index 54bdbaa..0000000
--- a/extension/images/icon_128.png
+++ /dev/null
Binary files differ
diff --git a/extension/manifest-test.json.patch b/extension/manifest-test.json.patch
deleted file mode 100644
index 457e77a..0000000
--- a/extension/manifest-test.json.patch
+++ /dev/null
@@ -1,5 +0,0 @@
---- manifest.json	2015-01-08 13:00:37.812010013 -0800
-+++ manifest-test.json	2015-01-08 13:01:50.273312593 -0800
-@@ -1,1 +1,2 @@
- {
-+  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuhTUCoxtpDZJKSd4JPMGSPitzCOIMCgpa+nL3JrPc3XpW6rGu9qIB3TiUfFKdbFnCVRUgCZI8fxAg0QYYjVcIbU0tclA5fOJwiRTm2B2JByYMblDCqTlTMcpESLEJjk6N2O0Nx0CLMewkOCts+hBFHZtfTBdc54+sVHvY5XSll8DpLglDX4lsX5eGV6amzRGy8hANwe3Soy1eaPOxx8EsEfRFRCHUj40wlqa8EdO0uX/OQl+/HNZnhmYumujC9jYw9ZF3jTVBGb347Vo8mPaQ9BDVOm4GW2j5r7QDdJG7zIcKz+c2I8bQ/kRfce1cW5nV2Jcqq8uAzU+9DBuVu5udQIDAQAB",
diff --git a/extension/manifest.json b/extension/manifest.json
deleted file mode 100644
index 0588885..0000000
--- a/extension/manifest.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "Vanadium Extension",
-  "version": "0.1.34",
-  "description": "Access and create Vanadium services from JavaScript.",
-  "manifest_version": 2,
-  "icons": {
-    "128": "images/icon_128.png"
-  },
-  "options_page": "html/options.html",
-  "background": {
-    "page": "html/background.html",
-    "persistent": true
-  },
-  "content_scripts": [{
-    "matches": ["<all_urls>"],
-    "all_frames": true,
-    "js": ["js/content.js"]
-  }],
-  "permissions": [
-    "<all_urls>",
-    "identity",
-    "unlimitedStorage"
-  ],
-  "web_accessible_resources": [
-    "images/1x1.png",
-    "js/background.js.map",
-    "js/content.js.map",
-    "js/options.js.map"
-  ],
-  "oauth2": {
-    "client_id": "632758215260-46rubj75aqsiejncfva2j2rabosj4r8k.apps.googleusercontent.com",
-    "scopes": [
-      "email"
-    ]
-  }
-}
diff --git a/extension/nacl/main.nmf b/extension/nacl/main.nmf
deleted file mode 100644
index 0c058b2..0000000
--- a/extension/nacl/main.nmf
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "program": {
-    "x86-64": {
-      "url": "main-64.nexe"
-    }
-  }
-}
-
diff --git a/extension/package.json b/extension/package.json
deleted file mode 100644
index 6ddc351..0000000
--- a/extension/package.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "Vanadium-Extension",
-  "version": "0.0.1",
-  "description": "## Goals: ### Short-term: Extension provides UI to manage identities WSPR holds on to all private keys and never exposes them.  The extension works with WSPR to manage identities.  A webapp should not be able to see all identities known to WSPR.",
-  "scripts": {
-    "start": "make example-server",
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "author": "vanadium",
-  "license": "MIT",
-  "dependencies": {
-    "debug": "^2.1.1",
-    "domready": "~1.0.7",
-    "insert-css": "^0.2.0",
-    "lodash": "^3.0.0",
-    "mercury": "^12.0.0",
-    "xtend": "^4.0.0",
-    "eventemitter2": "~0.4.14",
-    "es6-shim": "^0.20.2",
-    "superagent": "~0.21.0",
-    "inherits": "~2.0.1"
-  },
-  "devDependencies": {
-    "brfs": "^1.2.0",
-    "browserify": "^8.1.1",
-    "dependency-check": "^1.1.5",
-    "jshint": "^2.6.0",
-    "node-static": "^0.7.4",
-    "envify": "~3.2.0",
-    "esprima": "~1.2.2"
-  },
-  "directories": {
-    "example": "example"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://vandium.googlesource.com/vanadium-extension"
-  }
-}
diff --git a/extension/src/background/addcaveats.js b/extension/src/background/addcaveats.js
deleted file mode 100644
index 7059519..0000000
--- a/extension/src/background/addcaveats.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var domready = require('domready');
-var url = require('url');
-
-var params = url.parse(document.URL, true).query;
-
-domready(function() {
-  document.getElementById('submit-caveats').addEventListener('click',
-    function() {
-      sendCaveats(false);
-    });
-  var originElems = document.getElementsByClassName('origin');
-  for (var i = 0; i < originElems.length; i++) {
-    originElems[i].innerText = params.origin;
-  }
-  // If the origin is not https, display a warning to the user.
-  if (params.origin.indexOf('https') !== 0) {
-    document.getElementById('warning').classList.remove('hidden');
-  }
-
-  // Setup the cancel button.
-  document.getElementById('cancel').addEventListener('click', function() {
-    sendCaveats(true);
-  });
-
-  if (process.env.TEST_CAVEATS) {
-    // Set the value of the expiry caveat and submit the form.
-    document.getElementById('ExpiryCaveat').value = process.env.TEST_CAVEATS;
-    sendCaveats();
-  }
-});
-
-// We only currently support Expiry because other caveats don't make sense to
-// the end user and Revocation is not yet supported in WSPR.
-var caveatNames = ['ExpiryCaveat'];
-
-function sendCaveats(cancel) {
-  var caveats = [];
-  for (var i = 0; i < caveatNames.length; i++) {
-    var caveatArgs = document.getElementById(caveatNames[i]).value;
-    if (caveatNames[i] === 'ExpiryCaveat' && !caveatArgs) {
-      caveats.push({
-        type: 'ExpiryCaveat',
-        args: '240h'
-      });
-    } else if (caveatArgs) {
-      caveats.push({
-        type: caveatNames[i],
-        args: caveatArgs
-      });
-    }
-  }
-  var backgroundPort = chrome.runtime.connect();
-  backgroundPort.postMessage({
-    type: 'assocAccount:finish',
-    origin: params.origin,
-    caveats: caveats,
-    cancel: cancel
-  });
-  backgroundPort.disconnect();
-}
diff --git a/extension/src/background/auth-handler.js b/extension/src/background/auth-handler.js
deleted file mode 100644
index 90b3815..0000000
--- a/extension/src/background/auth-handler.js
+++ /dev/null
@@ -1,326 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/**
- * @fileoverview Handles auth requests to Nacl.
- */
-
-var getOrigin = require('./util').getOrigin;
-
-module.exports = AuthHandler;
-
-function AuthHandler(channel) {
-  if (!(this instanceof AuthHandler)) {
-    return new AuthHandler(channel);
-  }
-
-  this._channel = channel;
-
-  // Map from origins to the Vanadium app ports of tabs with active requests.
-  // This keeps track of existing auth tabs for an origin so new ones are not
-  // started.
-  this._outstandingAuthRequests = {};
-
-  // Map from caveat tab id to origin.
-  this._caveatTabOrigins = {};
-
-  // Handle tabs being closed.
-  chrome.tabs.onRemoved.addListener(this.onRemovedTab.bind(this));
-}
-
-AuthHandler.prototype.onRemovedTab = function(tabId) {
-  var origin = this._caveatTabOrigins[tabId];
-  if (!origin) {
-    return; // Not one of the caveat tabs.
-  }
-
-  delete this._caveatTabOrigins[tabId];
-
-  if (origin in this._outstandingAuthRequests) {
-    this.finishAuth({
-      origin: origin,
-      cancel: true,
-    });
-  }
-};
-
-// Get an access token from the chrome.identity API.
-// See https://developer.chrome.com/apps/app_identity
-AuthHandler.prototype.getAccessToken = function(cb) {
-  if (process.env.TEST_ACCESS_TOKEN) {
-    return process.nextTick(cb.bind(null, null, process.env.TEST_ACCESS_TOKEN));
-  }
-
-  // This will return an access token for the profile that the user is
-  // signed in to chrome as.  If the user is not signed in to chrome, an
-  // OAuth window will pop up and ask them to sign in.
-  //
-  // For now, we don't have a way to ask the user which profile they would
-  // like to use.  However, once the `chrome.identity.getAccounts` API call
-  // gets out of dev/beta channel, we can get a list of accounts and prompt
-  // the user for which one they would like to use with vanadium.
-  chrome.identity.getAuthToken({
-    interactive: true
-  }, function(token) {
-    // Wrap in process.nextTick so chrome stack traces can use sourceMap.
-    process.nextTick(function(){
-      if (chrome.runtime.lastError) {
-        console.error('Error getting auth token.', chrome.runtime.lastError);
-        return cb(chrome.runtime.lastError);
-      }
-
-      return cb(null, token);
-    });
-  });
-};
-
-// Get the name of all accounts from wspr.  Will be empty if no root account
-// exists.
-AuthHandler.prototype.getAccounts = function(cb) {
-  this._channel.performRpc('auth:get-accounts', {}, cb);
-};
-
-// Get an access token from the user and use it to create the root account on
-// wspr.
-AuthHandler.prototype.createAccount = function(cb) {
-  var ah = this;
-  this.getAccessToken(function(err, token) {
-    if (err) {
-      return cb(err);
-    }
-
-    // If getAccessToken returns an empty token we shouldn't send it to the
-    // identity server. Instead we directly pass an error to the callback which
-    // will purge the cache and try again.
-    if (!token) {
-      return cb(new Error('getAccessToken returned an empty token.'), null,
-        token);
-    }
-
-    ah._channel.performRpc('auth:create-account', {token: token},
-      function(err, createdAccount) {
-        cb(err, createdAccount, token);
-      });
-  });
-};
-
-// Check if an origin is already associated with an account on wspr.
-AuthHandler.prototype.originHasAccount = function(origin, cb) {
-  this._channel.performRpc('auth:origin-has-account', {origin: origin}, cb);
-};
-
-// Associate the account with the origin on wspr.
-AuthHandler.prototype.associateAccount =
-  function(account, origin, caveats, cb) {
-    this._channel.performRpc('auth:associate-account', {
-      account: account,
-      origin: origin,
-      caveats: caveats
-    }, cb);
-};
-
-// Pop up a new tab asking the user to chose their caveats.
-AuthHandler.prototype.getCaveats = function(account, origin, appPort) {
-  // Store the account name on the appPort.
-  appPort.account = account;
-
-  var outstandingAuthRequests = this._outstandingAuthRequests;
-  var caveatTabOrigins = this._caveatTabOrigins;
-  if (origin in this._outstandingAuthRequests) {
-    outstandingAuthRequests[origin].push(appPort);
-
-    // Switch to the corresponding open caveat tab.
-    for (var tabId in caveatTabOrigins) {
-      if (caveatTabOrigins[tabId] === origin) {
-        var tabIdAsNumber = +tabId;
-        chrome.tabs.update(tabIdAsNumber, {active: true});
-        break;
-      }
-    }
-
-    return;
-  }
-  outstandingAuthRequests[origin] = [appPort];
-
-  // Get  currently active tab in the window.
-  var windowId = appPort.sender.tab.windowId;
-  chrome.tabs.query({active: true, windowId: windowId}, function(tabs) {
-    // Store the current tab id so we can switch back to it after the addcaveats
-    // tab is removed.  Note that the currently active tab might not be the same
-    // as the tab that is requesting authentication.
-    if (tabs && tabs[0] && tabs[0].id) {
-      appPort.currentTabId = tabs[0].id;
-    }
-
-    chrome.tabs.create({
-      url: chrome.extension.getURL('html/addcaveats.html') + '?origin=' +
-        encodeURIComponent(origin)
-    }, function(tab) {
-      caveatTabOrigins[tab.id] = origin;
-    });
-  });
-};
-
-// Handle incoming 'auth' message.
-AuthHandler.prototype.handleAuthMessage = function(appPort) {
-  appPort.postMessage({
-    type: 'auth:received'
-  });
-
-  var origin;
-  try {
-    origin = getOrigin(appPort.sender.url);
-  } catch (err) {
-    return sendErrorToContentScript('auth', appPort, err);
-  }
-
-  var ah = this;
-
-  this.getAccounts(function(err, accounts) {
-    if (err) {
-      return sendErrorToContentScript('auth', appPort, err);
-    }
-
-    if (!accounts || accounts.length === 0) {
-      // No account exists.  Create one and then call getCaveats.
-      var retry = true;
-      var createAccountCallback = function(err, createdAccount, token) {
-        if (err) {
-          // If the token we received from chrome.identity.getAuthToken failed
-          // to authenticate for the identity server, it may because that the
-          // cached token has expired.
-          // So, we remove the token from the cache and retry once.
-          // TODO(suharshs,nlacasse): Filter by a more specific set of errors.
-          if (retry && token) {
-            retry = false;
-            return chrome.identity.removeCachedAuthToken({
-              'token': token
-            }, function(){
-              ah.createAccount(createAccountCallback);
-            });
-          } else if (retry) {
-            // If the token was not returned from getAuthToken, force the logout
-            // of the user and try again.
-            // This usually happens when a user has changed their password from
-            // a different browser instance and the current browser isn't logged
-            // into their new account.
-            return chrome.identity.launchWebAuthFlow({
-              'url': 'https://accounts.google.com/logout'
-            }, function(tokenUrl) {
-              ah.createdAccount(createAccountCallback);
-            });
-          }
-          return sendErrorToContentScript('auth', appPort, err);
-        }
-        ah.getCaveats(createdAccount, origin, appPort);
-      };
-
-      ah.createAccount(createAccountCallback);
-    } else {
-      // At least one account already exists. Use the first one.
-      var account = accounts[0];
-
-      // Check if origin is associated.
-      ah.originHasAccount(origin, function(err, hasAccount) {
-        if (err) {
-          return sendErrorToContentScript('auth', appPort, err);
-        }
-
-        if (hasAccount) {
-          // Origin already associated.  Return success.
-          appPort.postMessage({
-            type: 'auth:success',
-            account: account
-          });
-        } else {
-          // No origin associated.  Get caveats and then associate.
-          ah.getCaveats(account, origin, appPort);
-        }
-      });
-    }
-  });
-};
-
-AuthHandler.prototype.handleFinishAuth = function(caveatsPort, msg) {
-  if (caveatsPort.sender.url.indexOf(chrome.extension.getURL(
-      'html/addcaveats.html')) !== 0) {
-    console.error('invalid requester for associateAccount:finish');
-    return;
-  }
-
-
-  this.finishAuth(msg);
-
-  // Close the caveats tab.
-  // Note: This triggers a call onRemovedTab().
-  chrome.tabs.remove(caveatsPort.sender.tab.id);
-};
-
-AuthHandler.prototype.finishAuth = function(msg) {
-  var appPorts = this._outstandingAuthRequests[msg.origin];
-  delete this._outstandingAuthRequests[msg.origin];
-  if (!Array.isArray(appPorts)) {
-    console.error('Finish auth flow request received for unknown origin');
-    return;
-  }
-
-  var self = this;
-  appPorts.forEach(function(appPort) {
-    if (msg.origin !== getOrigin(appPort.sender.url)) {
-      console.error('Invalid origin.');
-      return;
-    }
-
-    if (msg.cancel) {
-      return sendErrorToContentScript('auth', appPort,
-          new Error('User declined to bless origin.'));
-    }
-
-    if (msg.origin !== getOrigin(appPort.sender.url)) {
-      return sendErrorToContentScript('auth', appPort,
-          new Error('Invalid origin.'));
-    }
-
-    if (!appPort.account) {
-      return sendErrorToContentScript('auth', appPort,
-          new Error('No port.account.'));
-    }
-
-    if (!msg.caveats || msg.caveats.length === 0) {
-      return sendErrorToContentScript('auth', appPort,
-          new Error('No caveats selected'));
-    }
-
-    self.associateAccount(appPort.account, msg.origin, msg.caveats,
-      function(err) {
-        if (err) {
-          return sendErrorToContentScript('auth', appPort, err);
-        }
-        appPort.postMessage({
-          type: 'auth:success',
-          account: appPort.account
-        });
-      });
-  });
-};
-
-// Convert an Error object into a bare Object with the same properties.  We do
-// this because port.postMessage calls JSON.stringify, which ignores the message
-// and stack properties on Error objects.
-function errorToObject(err) {
-  var obj = {};
-  Object.getOwnPropertyNames(err).forEach(function(key) {
-    obj[key] = err[key];
-  });
-  return obj;
-}
-
-// Helper functions to send error message back to calling content script.
-function sendErrorToContentScript(type, port, err) {
-  console.error(err);
-  port.postMessage({
-    type: type + ':error',
-    error: errorToObject(err)
-  });
-}
diff --git a/extension/src/background/channel.js b/extension/src/background/channel.js
deleted file mode 100644
index ed2264b..0000000
--- a/extension/src/background/channel.js
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/**
- * @fileoverview Channel RPCs to Nacl plugin.
- */
-
-var vom = require('../../../src/vom');
-var TaskSequence = require('../../../src/lib/task-sequence');
-var channelVdl =
-  require('../../vdl/v.io/x/ref/services/wspr/internal/channel');
-var browsprVdl =
-  require('../../vdl/v.io/x/ref/services/wspr/internal/browspr');
-var vlog = require('../../../src/lib/vlog');
-
-module.exports = RpcChannel;
-
-function uint8ArrayToArrayBuffer(arr) {
-  return arr.buffer.slice(arr.byteOffset, arr.byteOffset + arr.length);
-}
-
-function RpcChannel(sendMessage) {
-  if (!(this instanceof RpcChannel)) {
-    return new RpcChannel(sendMessage);
-  }
-  this.sendMessage = sendMessage;
-  this.lastSeq = 0;
-  this.handlers = {};
-  this.pendingCallbacks = {};
-  this.decodeQueue = new TaskSequence();
-}
-
-RpcChannel.prototype.registerRpcHandler = function(type, func) {
-  this.handlers[type] = func;
-};
-
-RpcChannel.prototype.performRpc = function(type, val, callback) {
-  if (typeof val !== 'object') {
-    throw new Error('val must be of type object, was ' + (typeof val));
-  }
-
-  var BrowsprMessage;
-  switch(type) {
-    case 'start':
-      BrowsprMessage = browsprVdl.StartMessage;
-      break;
-    case 'auth:get-accounts':
-      BrowsprMessage = browsprVdl.GetAccountsMessage;
-      break;
-    case 'auth:create-account':
-      BrowsprMessage = browsprVdl.CreateAccountMessage;
-      break;
-    case 'auth:origin-has-account':
-      BrowsprMessage = browsprVdl.OriginHasAccountMessage;
-      break;
-    case 'auth:associate-account':
-      BrowsprMessage = browsprVdl.AssociateAccountMessage;
-      break;
-    case 'create-instance':
-      BrowsprMessage = browsprVdl.CreateInstanceMessage;
-      break;
-    case 'cleanup':
-      BrowsprMessage = browsprVdl.CleanupMessage;
-      break;
-    default:
-      throw new Error('Unknown RPC type', type);
-  }
-
-  callback = callback || function(){};
-  var seq = ++this.lastSeq;
-  this.pendingCallbacks[seq] = callback;
-  var request = new channelVdl.Request({
-    type: type,
-    seq: seq,
-    body: new BrowsprMessage(val)
-  });
-  this._sendVomEncodedMessage(new channelVdl.Message({
-    request: request
-  }));
-};
-
-RpcChannel.prototype._sendVomEncodedMessage = function(msg) {
-  var writer = new vom.ByteMessageWriter();
-  var enc = new vom.Encoder(writer);
-  enc.encode(msg);
-  var encodedBytes = writer.getBytes();
-  this._postMessage(uint8ArrayToArrayBuffer(encodedBytes));
-};
-
-RpcChannel.prototype._handleRequest = function(req) {
-  var type = req.type;
-  var handler = this.handlers[type];
-  if (handler === undefined) {
-    throw new Error('Undefined handler for type \'' + type + '\'');
-  }
-  var result;
-  var err;
-  try {
-    result = handler(req.body);
-  } catch (e) {
-    err = e.message;
-    // TODO(bprosnitz) Nil is not handled yet in VOM2.
-    // Remove this when it is implemented.
-    result = 'ResultMessageToBeRemovedWhenVOM2IsComplete';
-  }
-  var response = new channelVdl.Response({
-    reqSeq: req.Seq,
-    err: err || '',
-    body: result
-  });
-  this._sendVomEncodedMessage(new channelVdl.Message({
-    response: response
-  }));
-};
-
-RpcChannel.prototype._handleResponse = function(resp) {
-  var seq = resp.reqSeq;
-  var cb = this.pendingCallbacks[seq];
-  delete this.pendingCallbacks[seq];
-  if (cb === undefined) {
-    throw new Error('Received response with no matching sequence number '+
-      JSON.stringify(resp));
-  }
-  if (resp.err !== '') {
-    return cb(new Error(resp.err));
-  }
-  // TODO(nlacasse,bpronitz): Is it OK to just call "val" on the body like this?
-  var body = resp.body && resp.body.val;
-  cb(null, body);
-};
-
-RpcChannel.prototype._handleMessageTask = function(msg) {
-  var msgBytes = new Uint8Array(msg);
-  var reader = new vom.ByteArrayMessageReader(msgBytes);
-  var dec = new vom.Decoder(reader);
-  var channel = this;
-  return dec.decode().then(function(jsMsg) {
-    if (jsMsg._type.name === channelVdl.Message.name) {
-      throw new Error('Message does not have correct Message type: ' +
-                      JSON.stringify(jsMsg));
-    } else if (jsMsg.request) {
-      return channel._handleRequest(jsMsg.request);
-    } else if (jsMsg.response) {
-      return channel._handleResponse(jsMsg.response);
-    } else {
-      var err = new Error('Message has Message type, but no "request" or ' +
-                          '"response" fields: ' + JSON.stringify(jsMsg));
-      vlog.logger.error(err + ': ' + err.stack);
-    }
-  }, function(err) {
-    vlog.logger.error(err + ': ' + err.stack);
-  });
-};
-RpcChannel.prototype.handleMessage = function(msg) {
-  // We add this to the task queue to make sure that the decode callback for
-  // all the messages are peformed in order.
-  this.decodeQueue.addTask(this._handleMessageTask.bind(this, msg));
-};
-
-RpcChannel.prototype._postMessage = function(msg) {
-  this.sendMessage({
-    type: 'browsprRpc',
-    instanceId: -1,
-    origin: '',
-    body: msg,
-  });
-};
diff --git a/extension/src/background/index.js b/extension/src/background/index.js
deleted file mode 100644
index 15aee31..0000000
--- a/extension/src/background/index.js
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var _ = require('lodash');
-var debug = require('debug')('background:index');
-var domready = require('domready');
-
-var AuthHandler = require('./auth-handler');
-var extensionErrors = require('../../../src/browser/extension-errors');
-var getOrigin = require('./util').getOrigin;
-var Nacl = require('./nacl');
-
-
-domready(function() {
-  // Start!
-  var bp = new BackgroundPage();
-  chrome.runtime.onConnect.addListener(
-    bp.handleNewContentScriptConnection.bind(bp));
-
-  // Set bp on the window so it will be accessable from options page.
-  window.bp = bp;
-  // Expose the state object so options page and background can share it and
-  // stay in sync.
-  bp.state = require('../state');
-});
-
-function BackgroundPage() {
-  if (!(this instanceof BackgroundPage)) {
-    return new BackgroundPage();
-  }
-
-  // Map that stores instanceId -> port so messages can be routed back to the
-  // port they came from.
-  this.ports = {};
-
-  // Map that stores port -> instanceId list so browspr can cleanup the
-  // instances corresponding when the port when the port closes.
-  this.instanceIds = new Map();
-
-  debug('background script loaded');
-}
-
-// Start listening to messages from the Nacl plugin.
-BackgroundPage.prototype.registerNaclListeners = function() {
-  this.nacl.on('message', this.handleMessageFromNacl.bind(this));
-  this.nacl.on('crash', this.handleNaclCrash.bind(this));
-};
-
-// Handle messages coming from Nacl by send them to the associated port.
-BackgroundPage.prototype.handleMessageFromNacl = function(msg) {
-  var instanceId = msg.instanceId;
-  var port = this.ports[instanceId];
-  if (!port) {
-    console.error('Message received not matching instance id: ', instanceId);
-    return;
-  }
-  port.postMessage(msg);
-};
-
-
-// Handle messages coming from a content script.
-BackgroundPage.prototype.handleMessageFromContentScript = function(port, msg) {
-  var bp = this;
-
-  if (!this.naclPluginIsActive()) {
-    // Start the plugin if it is not started.
-    this.startNaclPlugin(handleMessage.bind(bp, port, msg));
-  } else {
-    handleMessage(port, msg);
-  }
-
-  function handleMessage(port, msg) {
-    // Wrap in process.nextTick so chrome stack traces can use sourceMap.
-    process.nextTick(function() {
-      debug('background received message from content script.', msg);
-
-      // Dispatch on the type of the message.
-      switch (msg.type) {
-        // From vanadium app.
-        case 'browsprMsg':
-          return bp.handleBrowsprMessage(port, msg);
-        case 'browsprCleanup':
-          return bp.handleBrowsprCleanup(port, msg);
-        case 'createInstance':
-          return bp.handleCreateInstance(port, msg);
-        case 'auth':
-          return bp.authHandler.handleAuthMessage(port);
-
-        // From bless.
-        case 'assocAccount:finish':
-          return bp.authHandler.handleFinishAuth(port, msg);
-
-        // ONLY for tests.
-        case 'intentionallyPanic':
-          return bp._triggerIntentionalPanic();
-
-        default:
-          console.error('unknown message.', msg);
-      }
-    });
-  }
-};
-
-// Trigger a panic in the plug-in (only for tests).
-BackgroundPage.prototype._triggerIntentionalPanic = function() {
-  if (process.env.ALLOW_INTENTIONAL_CRASH) {
-    var panicMsg = {
-      type: 'intentionallyPanic',
-      instanceId: 0,
-      origin: '',
-      body: ''
-    };
-    this.nacl.sendMessage(panicMsg);
-  }
-};
-
-// Handle a content script connecting to this background script.
-BackgroundPage.prototype.handleNewContentScriptConnection = function(port) {
-  port.onMessage.addListener(
-    this.handleMessageFromContentScript.bind(this, port));
-
-  var bp = this;
-  port.onDisconnect.addListener(function() {
-    var instanceIds = bp.instanceIds.get(port) || [];
-    instanceIds.forEach(function(instanceId) {
-      bp.handleBrowsprCleanup(port, {body: {instanceId: instanceId}});
-    });
-  });
-};
-
-// Clean up an instance, and tell Nacl to clean it up as well.
-BackgroundPage.prototype.handleBrowsprCleanup = function(port, msg) {
-  function sendCleanupFinishedMessage() {
-    safePostMessage(port, {type: 'browsprCleanupFinished'});
-  }
-
-  if (!this.naclPluginIsActive()) {
-    // If the plugin isn't started, no need to clean it up.
-    sendCleanupFinishedMessage();
-    return;
-  }
-
-  var instanceId = msg.body.instanceId;
-
-  if (!this.ports[instanceId]) {
-    return console.error('Got cleanup message from instance ' + instanceId +
-        ' with no associated port.');
-  }
-
-  if (this.ports[instanceId] !== port) {
-    return console.error('Got cleanup message for instance ' + instanceId +
-        ' that does not match port.');
-  }
-
-  var bp = this;
-  var now = Date.now();
-  this.nacl.cleanupInstance(instanceId, function() {
-    var end = Date.now();
-    console.log('Cleaned up instance: ' + instanceId + ' in ' +
-                (end - now) + ' ms');
-    bp.instanceIds.set(port, _.remove(bp.instanceIds.get(port), [instanceId]));
-    if (bp.instanceIds.get(port).length === 0) {
-      bp.instanceIds.delete(port);
-    }
-    delete bp.ports[instanceId];
-    sendCleanupFinishedMessage();
-    bp.stopNaclPluginIfUnused();
-  });
-};
-
-BackgroundPage.prototype.isValidMessageForPort = function(msg, port) {
-  var body = msg.body;
-  if (!body) {
-    console.error('Got message with no body: ', msg);
-    return false;
-  }
-  if (!body.instanceId) {
-    console.error('Got message with no instanceId: ', msg);
-    return false;
-  }
-  if (this.ports[body.instanceId] && this.ports[body.instanceId] !== port) {
-    console.error('Got browspr message with instanceId ' +
-        body.instanceId + ' that does not match port.');
-    return false;
-  }
-  return true;
-};
-
-BackgroundPage.prototype.assocPortAndInstanceId = function(port, instanceId) {
-  // Store the instanceId->port.
-  this.ports[instanceId] = port;
-  // Store the port->instanceId.
-  this.instanceIds.set(port,
-      _.union(this.instanceIds.get(port) || [], [instanceId]));
-
-  // Cache the origin on the port object.
-  port.origin = port.origin || getOrigin(port.sender.url);
-};
-
-
-// Handle an createInstance message.
-BackgroundPage.prototype.handleCreateInstance = function(port, msg) {
-  if (!this.isValidMessageForPort(msg, port)) {
-    return console.error('Invalid port for message.  Ignoring.');
-  }
-
-  var body = msg.body;
-  this.assocPortAndInstanceId(port, body.instanceId);
-
-  this.nacl.channel.performRpc('create-instance', {
-    instanceId: body.instanceId,
-    origin: port.origin,
-    namespaceRoots: body.settings.namespaceRoots,
-    proxy: body.settings.proxy
-  }, function(err) {
-    if (err) {
-      return safePostMessage(port, {type: 'createInstance:error', error: err});
-    }
-    safePostMessage(port, {type: 'createInstance:success'});
-  });
-};
-
-// Handle messages that will be sent to Nacl.
-BackgroundPage.prototype.handleBrowsprMessage = function(port, msg) {
-  if (!this.isValidMessageForPort(msg, port)) {
-    return;
-  }
-
-  var body = msg.body;
-  this.assocPortAndInstanceId(port, body.instanceId);
-
-  var naclMsg = {
-    type: msg.type,
-    instanceId: parseInt(body.instanceId),
-    origin: port.origin,
-    body: body.msg
-  };
-  return this.nacl.sendMessage(naclMsg);
-};
-
-// Return true if the nacl plug-in is running.
-BackgroundPage.prototype.naclPluginIsActive = function() {
-  return this.hasOwnProperty('nacl') && this.nacl.isReady;
-};
-
-// Start the nacl plug-in -- add it to the page and register handlers.
-BackgroundPage.prototype.startNaclPlugin = function(cb) {
-  var bp = this;
-  cb = cb || function() {};
-
-  if (!bp.nacl) {
-    bp.nacl = new Nacl();
-    bp.registerNaclListeners();
-    bp.nacl.once('ready', function() {
-      bp.authHandler = new AuthHandler(bp.nacl.channel);
-    });
-  }
-
-  bp.nacl.once('ready', cb.bind(bp));
-};
-
-// Stop the nacl plugin if it is not currently used.
-BackgroundPage.prototype.stopNaclPluginIfUnused = function() {
-  if (Object.keys(this.ports).length === 0) {
-    this.stopNaclPlugin();
-  }
-};
-
-// Stop the nacl plug-in - remove it from the page and clean up state.
-BackgroundPage.prototype.stopNaclPlugin = function() {
-  this.nacl.destroy();
-  delete this.nacl;
-};
-
-// Stop and start the nacl plug-in
-BackgroundPage.prototype.restartNaclPlugin = function(cb) {
-  cb = cb || function() {};
-  if (this.naclPluginIsActive()) {
-    this.stopNaclPlugin();
-  }
-  this.startNaclPlugin(cb);
-};
-
-// Returns an array of all active port objects.
-BackgroundPage.prototype.getAllPorts = function() {
-  var ports = [];
-  _.forEach(this.ports, function(portArray) {
-    ports = ports.concat(portArray);
-  });
-  // Sort the ports array so that _.uniq can use a faster search algorithm.
-  ports = _.sortBy(ports);
-  // The second argument to _.uniq is whether the array is sorted.
-  return _.uniq(ports, true);
-};
-
-// Restart nacl when it crashes.
-BackgroundPage.prototype.handleNaclCrash = function(msg) {
-  // Log the crash to the extension's console.
-  console.error('NACL plugin crashed.');
-  if (msg) {
-    console.error(msg);
-  }
-
-  // Restart the plugin
-  this.stopNaclPlugin();
-
-  // Notify all content scripts about the failure.
-  var crashNotificationMsg = {
-    type: 'crash',
-    body: new extensionErrors.ExtensionCrashError(msg)
-  };
-  this.getAllPorts().forEach(function(port) {
-    safePostMessage(port, crashNotificationMsg);
-  });
-};
-
-function safePostMessage(port, msg) {
-  try {
-    port.postMessage(msg);
-  } catch (e) {
-    // Port no longer exists.  Safe to ignore.
-  }
-}
diff --git a/extension/src/background/nacl.js b/extension/src/background/nacl.js
deleted file mode 100644
index c87bc59..0000000
--- a/extension/src/background/nacl.js
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var domready = require('domready');
-var EE = require('events').EventEmitter;
-var inherits = require('inherits');
-
-var Channel = require('./channel');
-var QueuedRpcChannelWrapper = require('./queued_channel');
-var state = require('../state');
-
-// Clean the extension blessing whenever the extension is updated.
-// See https://developer.chrome.com/extensions/runtime#event-onInstalled
-var cleanBlessingsOnStart = false;
-chrome.runtime.onInstalled.addListener(function(details) {
-  if (details.reason === 'update') {
-    cleanBlessingsOnStart = true;
-  }
-});
-
-module.exports = Nacl;
-
-function Nacl() {
-  if (!(this instanceof Nacl)) {
-    return new Nacl();
-  }
-
-  EE.call(this);
-
-  this._queuedMessages = [];
-
-  // Wait until the dom is ready, then add 'load' and 'message' listeners on the
-  // nacl plugin that will trigger events on this object.
-  var nacl = this;
-  domready(function(){
-    nacl._naclElt = _createNaclElement();
-    document.body.appendChild(nacl._naclElt);
-
-    // 'load' listener must have useCapture argument set to 'true'.
-    nacl._naclElt.addEventListener('load', nacl.emit.bind(nacl, 'load'), true);
-    nacl._naclElt.addEventListener('crash', nacl.emit.bind(nacl, 'crash', null),
-      true);
-    nacl._naclElt.addEventListener('message', function(e) {
-      var msg = e.data;
-      if (msg instanceof ArrayBuffer) {
-        // Message is response from a channel RPC.
-        return nacl._directChannel.handleMessage(msg);
-      }
-      nacl.emit('message', msg);
-    });
-
-    // Channel for bi-directional RPCs.
-    nacl._directChannel = new Channel(nacl._naclElt.postMessage.bind(nacl));
-    nacl.channel = new QueuedRpcChannelWrapper(nacl._directChannel);
-
-    // Send a signal to initialize the nacl plug-in.
-    nacl._start();
-  });
-}
-
-inherits(Nacl, EE);
-
-// Create an embed tag that will contain the nacl plugin.
-function _createNaclElement() {
-  var naclElt = document.createElement('embed');
-
-  var idAttr = document.createAttribute('id');
-  idAttr.value = 'nacl';
-  naclElt.setAttributeNode(idAttr);
-
-  var srcAttr = document.createAttribute('src');
-  srcAttr.value = '/nacl/main.nmf';
-  naclElt.setAttributeNode(srcAttr);
-
-  var typeAttr = document.createAttribute('type');
-  typeAttr.value = 'application/x-nacl';
-  naclElt.setAttributeNode(typeAttr);
-
-  return naclElt;
-}
-
-// Send message from content script to Nacl.
-Nacl.prototype.sendMessage = function(msg) {
-  if (!this._initialized) {
-    this._queuedMessages.push(msg);
-    return;
-  }
-  this._naclElt.postMessage(msg);
-};
-
-Nacl.prototype._start = function() {
-  var nacl = this;
-  var settings = state.settings();
-  console.log(settings);
-
-  this.getBlessingRoot(settings.identitydBlessingUrl.value,
-    function(err, identityBlessingRoot) {
-      if (err) {
-        return nacl.emit('crash', err.message);
-      }
-
-      var body = {
-        cleanupBlessings: cleanBlessingsOnStart,
-        identitydBlessingRoot: identityBlessingRoot,
-        identityd: settings.identityd.value,
-        namespaceRoot: settings.namespaceRoot.value,
-        proxy: settings.proxy.value,
-        logLevel: parseInt(settings.logLevel.value) || 0,
-        logModule: settings.logModule.value || ''
-      };
-
-      cleanBlessingsOnStart = false;
-
-      nacl._directChannel.performRpc('start', body, function(err) {
-        if (err) {
-          return nacl.emit('crash', err.message);
-        }
-
-        nacl._initialized = true;
-        nacl._sendQueuedMessages();
-        nacl.channel.ready();
-        nacl.isReady = true;
-        nacl.emit('ready');
-      });
-    });
-};
-
-Nacl.prototype._sendQueuedMessages = function() {
-  var nacl = this;
-  this._queuedMessages.forEach(function(msg) {
-    nacl._naclElt.postMessage(msg);
-  });
-  this._queuedMessages = [];
-  console.log('Sent queued messages');
-};
-
-// Cache blessind root so we don't fetch it every time we start NaCl.
-var cachedBlessingRoot = null;
-Nacl.prototype.getBlessingRoot = function(url, cb) {
-  if (cachedBlessingRoot) {
-    return process.nextTick(function() {
-      cb(null, cachedBlessingRoot);
-    });
-  }
-
-  console.log('Requesting blessing root from ' + url);
-  var request = require('superagent');
-  request
-      .get(url)
-      .accept('application/json')
-      .end(function(err, res) {
-        if (err) {
-          cb(err);
-        } else if (res.error) {
-          cb(new Error('' + res.status + ': ' + res.message));
-        } else {
-          cachedBlessingRoot = res.body;
-          cb(null, cachedBlessingRoot);
-        }
-      });
-};
-
-Nacl.prototype.cleanupInstance = function(instanceId, cb) {
-  this.channel.performRpc('cleanup', {
-    instanceId: instanceId
-  }, cb);
-};
-
-// Destroy state associated with this Nacl instance.
-// In particular, this removed the added embed tag.
-Nacl.prototype.destroy = function() {
-  this._naclElt.parentNode.removeChild(this._naclElt);
-  this._naclElt = null;
-};
diff --git a/extension/src/background/options.js b/extension/src/background/options.js
deleted file mode 100644
index fc374b1..0000000
--- a/extension/src/background/options.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var domready = require('domready');
-var mercury = require('mercury');
-var settings = require('../components/settings');
-if (typeof window !== 'undefined') {
-  window.debug = require('debug');
-}
-
-domready(function() {
-  chrome.runtime.getBackgroundPage(function(bpWindow) {
-    // Use the state object from the background page, so options and background
-    // stay in sync.
-    var state = bpWindow.bp.state;
-    mercury.app(document.body, state, render);
-  });
-});
-
-function render(state, _diff) {
-  return settings.render(state.settings);
-}
diff --git a/extension/src/background/queued_channel.js b/extension/src/background/queued_channel.js
deleted file mode 100644
index 1d5a559..0000000
--- a/extension/src/background/queued_channel.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/**
- * @fileoverview Channel RPCs where all messages are enqueued until a ready
- * signal is received and then all RPC messages are sent.
- */
-
-module.exports = QueuedRpcChannelWrapper;
-
-function QueuedRpcChannelWrapper(rpcChannel) {
-  this._rpcChannel = rpcChannel;
-  this._ready = false;
-  this._queuedRpcs = [];
-}
-
-QueuedRpcChannelWrapper.prototype.registerRpcHandler = function(type, func) {
-  this._rpcChannel.registerRpcHandler(type, func);
-};
-
-QueuedRpcChannelWrapper.prototype.performRpc = function(type, val, callback) {
-  if (!this._ready) {
-    this._queuedRpcs.push({
-      type: type,
-      val: val,
-      callback: callback
-    });
-    return;
-  }
-
-  this._rpcChannel.performRpc(type, val, callback);
-};
-
-QueuedRpcChannelWrapper.prototype.ready = function() {
-  this._ready = true;
-  var rpcChannel = this._rpcChannel;
-  this._queuedRpcs.forEach(function(rpc) {
-    rpcChannel.performRpc(rpc.type, rpc.val, rpc.callback);
-  });
-};
diff --git a/extension/src/background/util.js b/extension/src/background/util.js
deleted file mode 100644
index 5e858b8..0000000
--- a/extension/src/background/util.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = {
-  getOrigin: getOrigin
-};
-
-// Parse a url and return the origin.
-function getOrigin(url) {
-  var URL = require('url');
-  var parsed = URL.parse(url);
-  return parsed.protocol + '//' + parsed.host;
-}
diff --git a/extension/src/components/settings/index.css b/extension/src/components/settings/index.css
deleted file mode 100644
index a873de8..0000000
--- a/extension/src/components/settings/index.css
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Copyright 2015 The Vanadium Authors. All rights reserved. */
-/* Use of this source code is governed by a BSD-style */
-/* license that can be found in the LICENSE file. */
-
-
-form.settings {
-  box-sizing: border-box;
-  max-width: 50%;
-  min-width: 360px;
-  margin: 0 auto;
-  padding: 1.125em;
-}
-
-form.settings .input {
-  border-bottom: 1px solid grey;
-}
-
-form.settings .input:first-of-type {
-  border-top: 1px solid grey;
-}
-
-form.settings label,
-form.settings input {
-  box-sizing: border-box;
-  display: inline-block;
-  width: 50%;
-  padding: 1.125em;
-}
-
-form.settings label {
-  width: 20%;
-  text-align: right;
-}
-
-form.settings input.button {
-  width: 20%;
-}
diff --git a/extension/src/components/settings/index.js b/extension/src/components/settings/index.js
deleted file mode 100644
index a84ad00..0000000
--- a/extension/src/components/settings/index.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var _ = require('lodash');
-var debug = require('debug')('component:settings');
-var mercury = require('mercury');
-var h = mercury.h;
-var xtend = require('xtend');
-
-var setting = require('./setting');
-
-// Temporary method of dealing with CSS
-var fs = require('fs');
-var insert = require('insert-css');
-var css = fs.readFileSync(__dirname + '/index.css');
-
-module.exports = create;
-module.exports.render = render;
-
-var defaults = {
-  identityd: 'identity/dev.v.io/u/google',
-  identitydBlessingUrl: 'https://dev.v.io/auth/blessing-root',
-  namespaceRoot: '/(dev.v.io:role:vprod:service:mounttabled)@ns.dev.v.io:8101',
-  proxy: 'proxy',
-  logLevel: '0',
-  logModule: ''
-};
-
-function render(settings) {
-  debug('rendering', settings);
-  insert(css);
-
-  return h('div', [
-    h('h3', 'Vanadium NaCl Plugin Options'),
-    'These settings are used to configure the Vanadium NaCl plugin.',
-    'You should use the defaults unless you know what you are doing.',
-    h('br'),
-    h('br'),
-    'NOTE: You must reload the plugin (see button below) ' +
-    'for any changes to take effect.',
-    h('br'),
-    h('br'),
-    h('form.settings', _.map(settings, setting.render)),
-    h('br'),
-    h('br'),
-    h('a', {
-      href: '#',
-      'ev-click': mercury.clickEvent(reloadExtension)
-    }, 'Reload plugin'),
-    h('br'),
-    h('br'),
-    'Manage your identities here: chrome://identity-internals/'
-  ]);
-}
-
-function create() {
-  debug('initializing');
-
-  var settingsObj = defaults;
-
-  var state = mercury.varhash({});
-
-  if (process.env.EXTENSION_SETTINGS) {
-    // Load the settings from the environment variable.
-    var envSettings;
-    try {
-      envSettings = JSON.parse(process.env.EXTENSION_SETTINGS);
-    } catch(e) {
-      throw new Error('Could not parse settings from environment: ', e);
-    }
-    settingsObj = xtend(settingsObj, envSettings);
-  }
-
-  hydrateState(state, settingsObj);
-
-  return {
-    state: state
-  };
-}
-
-// Hydrate the state varhash with settings from obj.
-function hydrateState(state, obj) {
-  _.forEach(obj, function(value, key) {
-    state.put(key, setting(key, value, defaults[key]).state);
-  });
-}
-
-// Reload the extension.
-function reloadExtension() {
-  chrome.runtime.getBackgroundPage(function(bpWindow) {
-    // bpWindow is the 'window' object of the background page.
-    bpWindow.bp.restartNaclPlugin();
-  });
-}
diff --git a/extension/src/components/settings/setting.js b/extension/src/components/settings/setting.js
deleted file mode 100644
index efc279b..0000000
--- a/extension/src/components/settings/setting.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var mercury = require('mercury');
-var h = mercury.h;
-var debug = require('debug')('component:setting');
-
-module.exports = create;
-module.exports.render = render;
-
-function render(setting) {
-  debug('rendering', setting);
-  var id = 'setting-' + setting.key;
-
-  return h('.input', [
-    h('label', { for: id }, setting.key),
-    h('input', {
-      id: id,
-      name: 'value',
-      type: 'text',
-      value: setting.value,
-      'ev-event': mercury.changeEvent(setting.events.update)
-    }),
-    h('input.button', {
-      id: id,
-      name: 'default',
-      type: 'button',
-      value: 'Restore\ndefault',
-      'ev-event': mercury.event(setting.events.restoreDefault)
-    })
-  ]);
-}
-
-function create(key, value, defaultValue) {
-  debug('initializing', key, 'to', value, 'with default', defaultValue);
-
-  var state = mercury.struct({
-    key: mercury.value(key || null),
-    value: mercury.value(value || null),
-    defaultValue: mercury.value(defaultValue || null),
-    events: mercury.input([ 'update', 'restoreDefault' ])
-  });
-
-  state.events.update = function(data) {
-    debug('updating', data);
-    state.value.set(data.value);
-  };
-
-  state.events.restoreDefault = function(){
-    state.value.set(defaultValue);
-  };
-
-  return { state: state };
-}
diff --git a/extension/src/content/event-proxy.js b/extension/src/content/event-proxy.js
deleted file mode 100644
index 08a055c..0000000
--- a/extension/src/content/event-proxy.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var EE = require('eventemitter2').EventEmitter2;
-var inherits = require('inherits');
-
-var types = require('../../../src/browser/event-proxy-message-types');
-
-// PageEventProxy sends messages to the web page, and listens for messages
-// coming from the web page.
-// Note: We need to be careful to not expose the messages to iframes of
-// different origins. dispatchEvent is used instead of postMessage to origin '*'
-// because it isolates message to the sender's origin.
-// Tests showing this: https://gist.github.com/bprosnitz/89db637b2e798ce05a6a
-function PageEventProxy(){
-  if (!(this instanceof PageEventProxy)) {
-    return new PageEventProxy();
-  }
-  EE.call(this);
-  var proxy = this;
-  window.addEventListener(types.TO_EXTENSION, function(ev) {
-    proxy.emit(ev.detail.type, ev.detail.body);
-  });
-
-  // Respond to "is_ready" events with "ready" events.
-  window.addEventListener(types.EXTENSION_IS_READY, function() {
-    window.dispatchEvent(new CustomEvent(types.EXTENSION_READY));
-  });
-}
-inherits(PageEventProxy, EE);
-
-PageEventProxy.prototype.send = function(type, body) {
-  window.dispatchEvent(
-    new window.CustomEvent(types.TO_PAGE, {
-      detail: {
-        type: type,
-        body: body
-      }
-    })
-  );
-};
-
-module.exports = new PageEventProxy();
diff --git a/extension/src/content/index.js b/extension/src/content/index.js
deleted file mode 100644
index 09d32ef..0000000
--- a/extension/src/content/index.js
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var debug = require('debug')('content-script:index');
-
-var pageEventProxy = require('./event-proxy');
-var random = require('../../../src/lib/random');
-
-// Port to communicate with background js.
-// One content script runs per iframe / tabs so there may be multiple ports
-// per page.
-var _backgroundPort;
-function getBackgroundPort() {
-  // Lazily connect to background port.
-  if (!_backgroundPort) {
-    _backgroundPort = chrome.runtime.connect();
-    _backgroundPort.onMessage.addListener(backgroundPageMessageForwarder);
-  }
-  return _backgroundPort;
-}
-
-// We generate and send different instanceIds to the background page than those
-// coming from the web app. This prevents the web app from intentionally
-// colliding with instanceIds from apps on other tabs. The two maps below are
-// used to map between the two instanceIds.
-var backgroundToPage = {};
-var pageToBackground = {};
-
-// If the plug-in crashed, the state of the connected Vanadium instances
-// are invalid. We will block any further messages.
-var invalidated = false;
-
-// Whitelist of message types to allow from the web app.
-var messageTypeWhitelist = [
-  'auth',
-  'browsprCleanup',
-  'browsprMsg',
-  'createInstance'
-];
-if (process.env.ALLOW_INTENTIONAL_CRASH) {
-  messageTypeWhitelist.push('intentionallyPanic');
-}
-
-function isAllowedMessage(type) {
-  return messageTypeWhitelist.indexOf(type) >= 0;
-}
-
-// Forward messages from the webApp to the background page.
-pageEventProxy.onAny(function(body) {
-  if (invalidated && !process.env.ALLOW_INTENTIONAL_CRASH) {
-    pageEventProxy.send('error', 'Refusing to send Vanadium message. ' +
-      'Plug-in crashed and page must be reloaded.');
-    return;
-  }
-
-  // 'this' is bound to event emitter2 instance, which sets 'this.event' to the
-  // type of the event.
-  var type = this.event;
-  debug('content script received message of type', type, 'from page:', body);
-
-  if (!isAllowedMessage(type)) {
-    var err = new Error('Ignoring message with unknown type: ' + type);
-    console.error(err);
-    pageEventProxy.send('error', { message: err.message });
-    return;
-  }
-
-  // Swap the instanceId with a generated one.
-  if (body && body.instanceId) {
-    var outgoingInstanceId = pageToBackground[body.instanceId] ||
-        random.int32();
-    pageToBackground[body.instanceId] = outgoingInstanceId;
-    backgroundToPage[outgoingInstanceId] = body.instanceId;
-    body.instanceId = outgoingInstanceId;
-  }
-
-  try {
-    getBackgroundPort().postMessage({
-      type: this.event,
-      body: body
-    });
-  } catch (err) {
-    pageEventProxy.send('error', 'Error posting message, ' +
-          'you may need to reload this tab. ' + err);
-  }
-});
-
-// Forward any messages from the background page to the webApp.
-function backgroundPageMessageForwarder(msg) {
-  debug('content script received message of type', msg.type,
-    'from background script:', msg.body);
-
-  if (msg.type === 'crash') {
-    // Block any future messages, as we don't currently have a way to
-    // be sure the response will be correct.
-    invalidated = true;
-
-    pageEventProxy.send('crash', msg.body);
-
-    return;
-  }
-
-  // Swap the instanceId with the original one.
-  if (msg.instanceId) {
-    msg.instanceId = backgroundToPage[msg.instanceId];
-  }
-
-  pageEventProxy.send(msg.type, msg);
-}
-
-debug('content script loaded');
diff --git a/extension/src/state.js b/extension/src/state.js
deleted file mode 100644
index 335091a..0000000
--- a/extension/src/state.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var mercury = require('mercury');
-var settings = require('./components/settings');
-var state;
-
-module.exports = state = mercury.struct({
-  error: mercury.value(null),
-  settings: settings().state
-});
-
diff --git a/go/src/v.io/x/js.core/stress/stress.vdl b/go/src/v.io/x/js.core/stress/stress.vdl
deleted file mode 100644
index 6858b7d..0000000
--- a/go/src/v.io/x/js.core/stress/stress.vdl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package stress
-
-import (
-	"time"
-	"v.io/v23/security/access"
-)
-
-type StressResults struct {
-	Iterations int64
-	Qps        float64
-	MsecsPerRpc float64
-}
-
-type Stress interface {
-	// Echo returns the payload that it receives.
-	Echo(Payload []byte) ([]byte | error) {access.Read}
-
-	// ServerEcho runs as many calls to Echo on the name provided in the duration
-	// specified and returns the peformance results.
-	ServerEcho(totalTime time.Duration, name string) (StressResults | error) {access.Read}
-}
diff --git a/go/src/v.io/x/js.core/stress/stress.vdl.go b/go/src/v.io/x/js.core/stress/stress.vdl.go
deleted file mode 100644
index 864888f..0000000
--- a/go/src/v.io/x/js.core/stress/stress.vdl.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file was auto-generated by the vanadium vdl tool.
-// Package: stress
-
-package stress
-
-import (
-	"fmt"
-	"time"
-	"v.io/v23"
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/security/access"
-	"v.io/v23/vdl"
-	_ "v.io/v23/vdlroot/time"
-)
-
-var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
-
-//////////////////////////////////////////////////
-// Type definitions
-
-type StressResults struct {
-	Iterations  int64
-	Qps         float64
-	MsecsPerRpc float64
-}
-
-func (StressResults) __VDLReflect(struct {
-	Name string `vdl:"v.io/x/js.core/stress.StressResults"`
-}) {
-}
-
-func (m *StressResults) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	fieldsTarget1, err := t.StartFields(tt)
-	if err != nil {
-		return err
-	}
-
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Iterations")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromInt(int64(m.Iterations), tt.NonOptional().Field(0).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Qps")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget5.FromFloat(float64(m.Qps), tt.NonOptional().Field(1).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
-			return err
-		}
-	}
-	keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("MsecsPerRpc")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget7.FromFloat(float64(m.MsecsPerRpc), tt.NonOptional().Field(2).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
-			return err
-		}
-	}
-	if err := t.FinishFields(fieldsTarget1); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m *StressResults) MakeVDLTarget() vdl.Target {
-	return &StressResultsTarget{Value: m}
-}
-
-type StressResultsTarget struct {
-	Value             *StressResults
-	iterationsTarget  vdl.Int64Target
-	qpsTarget         vdl.Float64Target
-	msecsPerRpcTarget vdl.Float64Target
-	vdl.TargetBase
-	vdl.FieldsTargetBase
-}
-
-func (t *StressResultsTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
-
-	if ttWant := vdl.TypeOf((*StressResults)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
-	}
-	return t, nil
-}
-func (t *StressResultsTarget) StartField(name string) (key, field vdl.Target, _ error) {
-	switch name {
-	case "Iterations":
-		t.iterationsTarget.Value = &t.Value.Iterations
-		target, err := &t.iterationsTarget, error(nil)
-		return nil, target, err
-	case "Qps":
-		t.qpsTarget.Value = &t.Value.Qps
-		target, err := &t.qpsTarget, error(nil)
-		return nil, target, err
-	case "MsecsPerRpc":
-		t.msecsPerRpcTarget.Value = &t.Value.MsecsPerRpc
-		target, err := &t.msecsPerRpcTarget, error(nil)
-		return nil, target, err
-	default:
-		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/js.core/stress.StressResults", name)
-	}
-}
-func (t *StressResultsTarget) FinishField(_, _ vdl.Target) error {
-	return nil
-}
-func (t *StressResultsTarget) FinishFields(_ vdl.FieldsTarget) error {
-
-	return nil
-}
-
-// Create zero values for each type.
-var (
-	__VDLZeroStressResults = StressResults{}
-)
-
-//////////////////////////////////////////////////
-// Interface definitions
-
-// StressClientMethods is the client interface
-// containing Stress methods.
-type StressClientMethods interface {
-	// Echo returns the payload that it receives.
-	Echo(_ *context.T, Payload []byte, _ ...rpc.CallOpt) ([]byte, error)
-	// ServerEcho runs as many calls to Echo on the name provided in the duration
-	// specified and returns the peformance results.
-	ServerEcho(_ *context.T, totalTime time.Duration, name string, _ ...rpc.CallOpt) (StressResults, error)
-}
-
-// StressClientStub adds universal methods to StressClientMethods.
-type StressClientStub interface {
-	StressClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// StressClient returns a client stub for Stress.
-func StressClient(name string) StressClientStub {
-	return implStressClientStub{name}
-}
-
-type implStressClientStub struct {
-	name string
-}
-
-func (c implStressClientStub) Echo(ctx *context.T, i0 []byte, opts ...rpc.CallOpt) (o0 []byte, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "Echo", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implStressClientStub) ServerEcho(ctx *context.T, i0 time.Duration, i1 string, opts ...rpc.CallOpt) (o0 StressResults, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ServerEcho", []interface{}{i0, i1}, []interface{}{&o0}, opts...)
-	return
-}
-
-// StressServerMethods is the interface a server writer
-// implements for Stress.
-type StressServerMethods interface {
-	// Echo returns the payload that it receives.
-	Echo(_ *context.T, _ rpc.ServerCall, Payload []byte) ([]byte, error)
-	// ServerEcho runs as many calls to Echo on the name provided in the duration
-	// specified and returns the peformance results.
-	ServerEcho(_ *context.T, _ rpc.ServerCall, totalTime time.Duration, name string) (StressResults, error)
-}
-
-// StressServerStubMethods is the server interface containing
-// Stress methods, as expected by rpc.Server.
-// There is no difference between this interface and StressServerMethods
-// since there are no streaming methods.
-type StressServerStubMethods StressServerMethods
-
-// StressServerStub adds universal methods to StressServerStubMethods.
-type StressServerStub interface {
-	StressServerStubMethods
-	// Describe the Stress interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// StressServer returns a server stub for Stress.
-// It converts an implementation of StressServerMethods into
-// an object that may be used by rpc.Server.
-func StressServer(impl StressServerMethods) StressServerStub {
-	stub := implStressServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implStressServerStub struct {
-	impl StressServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implStressServerStub) Echo(ctx *context.T, call rpc.ServerCall, i0 []byte) ([]byte, error) {
-	return s.impl.Echo(ctx, call, i0)
-}
-
-func (s implStressServerStub) ServerEcho(ctx *context.T, call rpc.ServerCall, i0 time.Duration, i1 string) (StressResults, error) {
-	return s.impl.ServerEcho(ctx, call, i0, i1)
-}
-
-func (s implStressServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implStressServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{StressDesc}
-}
-
-// StressDesc describes the Stress interface.
-var StressDesc rpc.InterfaceDesc = descStress
-
-// descStress hides the desc to keep godoc clean.
-var descStress = rpc.InterfaceDesc{
-	Name:    "Stress",
-	PkgPath: "v.io/x/js.core/stress",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "Echo",
-			Doc:  "// Echo returns the payload that it receives.",
-			InArgs: []rpc.ArgDesc{
-				{"Payload", ``}, // []byte
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // []byte
-			},
-			Tags: []*vdl.Value{vdl.ValueOf(access.Tag("Read"))},
-		},
-		{
-			Name: "ServerEcho",
-			Doc:  "// ServerEcho runs as many calls to Echo on the name provided in the duration\n// specified and returns the peformance results.",
-			InArgs: []rpc.ArgDesc{
-				{"totalTime", ``}, // time.Duration
-				{"name", ``},      // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // StressResults
-			},
-			Tags: []*vdl.Value{vdl.ValueOf(access.Tag("Read"))},
-		},
-	},
-}
-
-var __VDLInitCalled bool
-
-// __VDLInit performs vdl initialization.  It is safe to call multiple times.
-// If you have an init ordering issue, just insert the following line verbatim
-// into your source files in this package, right after the "package foo" clause:
-//
-//    var _ = __VDLInit()
-//
-// The purpose of this function is to ensure that vdl initialization occurs in
-// the right order, and very early in the init sequence.  In particular, vdl
-// registration and package variable initialization needs to occur before
-// functions like vdl.TypeOf will work properly.
-//
-// This function returns a dummy value, so that it can be used to initialize the
-// first var in the file, to take advantage of Go's defined init order.
-func __VDLInit() struct{} {
-	if __VDLInitCalled {
-		return struct{}{}
-	}
-
-	// Register types.
-	vdl.Register((*StressResults)(nil))
-
-	return struct{}{}
-}
diff --git a/go/src/v.io/x/js.core/stress/stressd/main.go b/go/src/v.io/x/js.core/stress/stressd/main.go
deleted file mode 100644
index 1e82936..0000000
--- a/go/src/v.io/x/js.core/stress/stressd/main.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"runtime"
-
-	"v.io/v23"
-	"v.io/v23/security"
-	"v.io/x/lib/vlog"
-	"v.io/x/ref/lib/signals"
-	_ "v.io/x/ref/runtime/factories/generic"
-)
-
-func main() {
-	runtime.GOMAXPROCS(runtime.NumCPU())
-	ctx, shutdown := v23.Init()
-	defer shutdown()
-
-	ctx, _, err := v23.WithNewServer(ctx, "", NewStressService(), security.AllowEveryone())
-	if err != nil {
-		vlog.Fatalf("NewServer failed: %v", err)
-	}
-	<-signals.ShutdownOnSignals(ctx)
-}
diff --git a/go/src/v.io/x/js.core/stress/stressd/server.go b/go/src/v.io/x/js.core/stress/stressd/server.go
deleted file mode 100644
index 0f041dd..0000000
--- a/go/src/v.io/x/js.core/stress/stressd/server.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"bytes"
-	"fmt"
-	"time"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/x/js.core/stress"
-)
-
-const payloadSize = 1000
-
-type impl struct{}
-
-func NewStressService() stress.StressServerStub {
-	return stress.StressServer(&impl{})
-}
-
-func (s *impl) Echo(_ *context.T, _ rpc.ServerCall, payload []byte) ([]byte, error) {
-	return payload, nil
-}
-
-func (s *impl) ServerEcho(ctx *context.T, _ rpc.ServerCall, totalTime time.Duration, name string) (stress.StressResults, error) {
-	stub := stress.StressClient(name)
-	payload := make([]byte, payloadSize)
-	for i := range payload {
-		payload[i] = byte(i & 0xff)
-	}
-	var iterations int64
-	var res stress.StressResults
-	start := time.Now()
-	for {
-		got, err := stub.Echo(ctx, payload)
-		if err != nil {
-			return res, err
-		}
-		if !bytes.Equal(got, payload) {
-			return res, fmt.Errorf("Echo returned %v, but expected %v", got, payload)
-		}
-		iterations++
-
-		if time.Since(start) >= totalTime {
-			break
-		}
-	}
-	duration := time.Since(start).Seconds()
-	res.Iterations = iterations
-	res.Qps = float64(iterations) / duration
-	res.MsecsPerRpc = 1000 / res.Qps
-	return res, nil
-}
diff --git a/go/src/v.io/x/js.core/test_service/cache.vdl b/go/src/v.io/x/js.core/test_service/cache.vdl
deleted file mode 100644
index 4292cfe..0000000
--- a/go/src/v.io/x/js.core/test_service/cache.vdl
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package test_service
-
-// KeyPageResult is a page of 10 keys.
-type KeyPageResult [10]string
-
-// A Cache service mimics the memcache interface.
-type Cache interface {
-    // Set sets a value for a key.
-    Set(key string, value any) error
-
-    // Get returns the value for a key.  If the value is not found, returns
-    // a not found error.
-    Get(key string) (any | error)
-
-    // Same as Get, but casts the return argument to an byte.
-    GetAsByte(key string) (byte | error)
-    // Same as Get, but casts the return argument to an int32.
-    GetAsInt32(key string) (int32 | error)
-    // Same as Get, but casts the return argument to an int64.
-    GetAsInt64(key string) (int64 | error)
-    // Same as Get, but casts the return argument to an uint32.
-    GetAsUint32(key string) (uint32 | error)
-    // Same as Get, but casts the return argument to an uint64.
-    GetAsUint64(key string) (uint64 | error)
-    // Same as Get, but casts the return argument to an float32.
-    GetAsFloat32(key string) (float32 | error)
-    // Same as Get, but casts the return argument to an float64.
-    GetAsFloat64(key string) (float64 | error)
-    // Same as Get, but casts the return argument to a string.
-    GetAsString(key string) (string | error)
-    // Same as Get, but casts the return argument to a bool.
-    GetAsBool(key string) (bool | error)
-    // Same as Get, but casts the return argument to an error.
-    GetAsError(key string) (error | error)
-
-    // AsMap returns the full contents of the cache as a map.
-    AsMap() (map[string]any | error)
-
-    // KeyValuePairs returns the full contents of the cache as a slice of pairs.
-    KeyValuePairs() ([]KeyValuePair | error)
-
-    // MostRecentSet returns the key and value and the timestamp for the most
-    // recent set operation
-    // TODO(bprosnitz) support type types and change time to native time type
-    MostRecentSet() (value KeyValuePair, time int64 | error)
-
-    // KeyPage indexes into the keys (in alphanumerically sorted order) and
-    // returns the indexth page of 10 keys.
-    KeyPage(index int64) (KeyPageResult | error)
-
-    // Size returns the total number of entries in the cache.
-    Size() (int64 | error)
-
-    // MultiGet sets up a stream that allows fetching multiple keys.
-    MultiGet() stream<string, any> error
-}
-
-// KeyValuePair is a representation of a cached key and value pair.
-type KeyValuePair struct {
-    Key string
-    Value any
-}
diff --git a/go/src/v.io/x/js.core/test_service/cancel_collector.vdl b/go/src/v.io/x/js.core/test_service/cancel_collector.vdl
deleted file mode 100644
index f5c2e1c..0000000
--- a/go/src/v.io/x/js.core/test_service/cancel_collector.vdl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package test_service
-
-// CancelCollector is a test interface for use in testing cancellation and deadlines.
-type CancelCollector interface {
-	// A function that never returns, but records the status of the given key.
-	NeverReturn(key int64) error
-
-	// Wait for the call with the given key to have the given status.  Possible statuses are:
-	// "running", and, "cancelled".  Returns the number of nanoseconds left on
-	// the deadline of the specified call when the call first began.
-	WaitForStatus(key int64, status string) (timeout int64 | error)
-}
diff --git a/go/src/v.io/x/js.core/test_service/doc.go b/go/src/v.io/x/js.core/test_service/doc.go
deleted file mode 100644
index 949abfd..0000000
--- a/go/src/v.io/x/js.core/test_service/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package test_service is a veyron service that is used for integration testing of the JavaScript API
-package test_service
diff --git a/go/src/v.io/x/js.core/test_service/error_thrower.vdl b/go/src/v.io/x/js.core/test_service/error_thrower.vdl
deleted file mode 100644
index 07d16cd..0000000
--- a/go/src/v.io/x/js.core/test_service/error_thrower.vdl
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package test_service
-
-// A testing interface with methods that throw various types of errors
-type ErrorThrower interface {
-    // Throws v23/vError.Aborted error
-    ThrowAborted() error
-
-    // Throws v23/vError.BadArg error
-    ThrowBadArg() error
-
-    // Throws v23/vError.BadProtocol error
-    ThrowBadProtocol() error
-
-    // Throws v23/vError.Internal error
-    ThrowInternal() error
-
-    // Throws v23/vError.NoAccess error
-    ThrowNoAccess() error
-
-    // Throws v23/vError.NoExist error
-    ThrowNoExist() error
-
-    // Throws v23/vError.NoExistOrNoAccess error
-    ThrowNoExistOrNoAccess() error
-
-    // Throws v23/vError.Unknown error
-    ThrowUnknown() error
-
-    // Throws normal Go error
-    ThrowGoError() error
-
-    // Throws custom error created by using Standard
-    ThrowCustomStandardError() error
-}
diff --git a/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl b/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl
deleted file mode 100644
index ee4e315..0000000
--- a/go/src/v.io/x/js.core/test_service/invoke_method_caveat_id.vdl
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package test_service
-
-import (
-    "v.io/v23/uniqueid"
-    "v.io/v23/security"
-)
-
-type InvokableTestMethod interface {
-    AMethod() (string | error)
-}
-
-type InvokeMethodWithCaveatedIdentity interface {
-    Invoke(name string, cavDesc security.CaveatDescriptor, cavParam any) error
-}
-
-type TestCaveatData struct {
-    A string
-    B any // Use any for value so that we can confirm VDL is being used properly.
-}
-
-const (
-    ConditionallyValidatingTestCaveat = security.CaveatDescriptor{
-        Id: uniqueid.Id{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff},
-        ParamType: typeobject(TestCaveatData),
-    }
-)
diff --git a/go/src/v.io/x/js.core/test_service/native.vdl b/go/src/v.io/x/js.core/test_service/native.vdl
deleted file mode 100644
index 69d3a86..0000000
--- a/go/src/v.io/x/js.core/test_service/native.vdl
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package test_service
-
-import "time"
-
-type NativeTest interface {
-    PassTime(t time.Time) (time.Time | error)
-
-    PassError(e error) error
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_service.vdl.go b/go/src/v.io/x/js.core/test_service/test_service.vdl.go
deleted file mode 100644
index 4d68751..0000000
--- a/go/src/v.io/x/js.core/test_service/test_service.vdl.go
+++ /dev/null
@@ -1,1756 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// This file was auto-generated by the vanadium vdl tool.
-// Package: test_service
-
-package test_service
-
-import (
-	"fmt"
-	"io"
-	"reflect"
-	"time"
-	"v.io/v23"
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/security"
-	"v.io/v23/uniqueid"
-	"v.io/v23/vdl"
-	_ "v.io/v23/vdlroot/time"
-	"v.io/v23/vom"
-)
-
-var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
-
-//////////////////////////////////////////////////
-// Type definitions
-
-// KeyPageResult is a page of 10 keys.
-type KeyPageResult [10]string
-
-func (KeyPageResult) __VDLReflect(struct {
-	Name string `vdl:"v.io/x/js.core/test_service.KeyPageResult"`
-}) {
-}
-
-func (m *KeyPageResult) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	listTarget1, err := t.StartList(tt, 10)
-	if err != nil {
-		return err
-	}
-	for i, elem3 := range *m {
-		elemTarget2, err := listTarget1.StartElem(i)
-		if err != nil {
-			return err
-		}
-		if err := elemTarget2.FromString(string(elem3), tt.NonOptional().Elem()); err != nil {
-			return err
-		}
-		if err := listTarget1.FinishElem(elemTarget2); err != nil {
-			return err
-		}
-	}
-	if err := t.FinishList(listTarget1); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m *KeyPageResult) MakeVDLTarget() vdl.Target {
-	return &KeyPageResultTarget{Value: m}
-}
-
-// KeyPageResult
-type KeyPageResultTarget struct {
-	Value      *KeyPageResult
-	elemTarget vdl.StringTarget
-	vdl.TargetBase
-	vdl.ListTargetBase
-}
-
-func (t *KeyPageResultTarget) StartList(tt *vdl.Type, len int) (vdl.ListTarget, error) {
-
-	if ttWant := vdl.TypeOf((*KeyPageResult)(nil)); !vdl.Compatible(tt, ttWant) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
-	}
-	return t, nil
-}
-func (t *KeyPageResultTarget) StartElem(index int) (elem vdl.Target, _ error) {
-	t.elemTarget.Value = &(*t.Value)[index]
-	target, err := &t.elemTarget, error(nil)
-	return target, err
-}
-func (t *KeyPageResultTarget) FinishElem(elem vdl.Target) error {
-	return nil
-}
-func (t *KeyPageResultTarget) FinishList(elem vdl.ListTarget) error {
-
-	return nil
-}
-
-// KeyValuePair is a representation of a cached key and value pair.
-type KeyValuePair struct {
-	Key   string
-	Value *vom.RawBytes
-}
-
-func (KeyValuePair) __VDLReflect(struct {
-	Name string `vdl:"v.io/x/js.core/test_service.KeyValuePair"`
-}) {
-}
-
-func (m *KeyValuePair) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	fieldsTarget1, err := t.StartFields(tt)
-	if err != nil {
-		return err
-	}
-
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Key")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.Key), tt.NonOptional().Field(0).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("Value")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		if m.Value == nil {
-			if err := fieldTarget5.FromNil(tt.NonOptional().Field(1).Type); err != nil {
-				return err
-			}
-		} else {
-			if err := m.Value.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
-				return err
-			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
-			return err
-		}
-	}
-	if err := t.FinishFields(fieldsTarget1); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m *KeyValuePair) MakeVDLTarget() vdl.Target {
-	return &KeyValuePairTarget{Value: m}
-}
-
-type KeyValuePairTarget struct {
-	Value     *KeyValuePair
-	keyTarget vdl.StringTarget
-
-	vdl.TargetBase
-	vdl.FieldsTargetBase
-}
-
-func (t *KeyValuePairTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
-
-	if ttWant := vdl.TypeOf((*KeyValuePair)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
-	}
-	return t, nil
-}
-func (t *KeyValuePairTarget) StartField(name string) (key, field vdl.Target, _ error) {
-	switch name {
-	case "Key":
-		t.keyTarget.Value = &t.Value.Key
-		target, err := &t.keyTarget, error(nil)
-		return nil, target, err
-	case "Value":
-		target, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.Value))
-		return nil, target, err
-	default:
-		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/js.core/test_service.KeyValuePair", name)
-	}
-}
-func (t *KeyValuePairTarget) FinishField(_, _ vdl.Target) error {
-	return nil
-}
-func (t *KeyValuePairTarget) FinishFields(_ vdl.FieldsTarget) error {
-
-	return nil
-}
-
-type TestCaveatData struct {
-	A string
-	B *vom.RawBytes // Use any for value so that we can confirm VDL is being used properly.
-}
-
-func (TestCaveatData) __VDLReflect(struct {
-	Name string `vdl:"v.io/x/js.core/test_service.TestCaveatData"`
-}) {
-}
-
-func (m *TestCaveatData) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
-	fieldsTarget1, err := t.StartFields(tt)
-	if err != nil {
-		return err
-	}
-
-	keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("A")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-		if err := fieldTarget3.FromString(string(m.A), tt.NonOptional().Field(0).Type); err != nil {
-			return err
-		}
-		if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
-			return err
-		}
-	}
-	keyTarget4, fieldTarget5, err := fieldsTarget1.StartField("B")
-	if err != vdl.ErrFieldNoExist && err != nil {
-		return err
-	}
-	if err != vdl.ErrFieldNoExist {
-
-		if m.B == nil {
-			if err := fieldTarget5.FromNil(tt.NonOptional().Field(1).Type); err != nil {
-				return err
-			}
-		} else {
-			if err := m.B.FillVDLTarget(fieldTarget5, tt.NonOptional().Field(1).Type); err != nil {
-				return err
-			}
-		}
-		if err := fieldsTarget1.FinishField(keyTarget4, fieldTarget5); err != nil {
-			return err
-		}
-	}
-	if err := t.FinishFields(fieldsTarget1); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m *TestCaveatData) MakeVDLTarget() vdl.Target {
-	return &TestCaveatDataTarget{Value: m}
-}
-
-type TestCaveatDataTarget struct {
-	Value   *TestCaveatData
-	aTarget vdl.StringTarget
-
-	vdl.TargetBase
-	vdl.FieldsTargetBase
-}
-
-func (t *TestCaveatDataTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
-
-	if ttWant := vdl.TypeOf((*TestCaveatData)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
-		return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
-	}
-	return t, nil
-}
-func (t *TestCaveatDataTarget) StartField(name string) (key, field vdl.Target, _ error) {
-	switch name {
-	case "A":
-		t.aTarget.Value = &t.Value.A
-		target, err := &t.aTarget, error(nil)
-		return nil, target, err
-	case "B":
-		target, err := vdl.ReflectTarget(reflect.ValueOf(&t.Value.B))
-		return nil, target, err
-	default:
-		return nil, nil, fmt.Errorf("field %s not in struct v.io/x/js.core/test_service.TestCaveatData", name)
-	}
-}
-func (t *TestCaveatDataTarget) FinishField(_, _ vdl.Target) error {
-	return nil
-}
-func (t *TestCaveatDataTarget) FinishFields(_ vdl.FieldsTarget) error {
-
-	return nil
-}
-
-// Create zero values for each type.
-var (
-	__VDLZeroKeyPageResult  = KeyPageResult{}
-	__VDLZeroKeyValuePair   = KeyValuePair{}
-	__VDLZeroTestCaveatData = TestCaveatData{}
-)
-
-//////////////////////////////////////////////////
-// Const definitions
-
-var ConditionallyValidatingTestCaveat = security.CaveatDescriptor{
-	Id: uniqueid.Id{
-		0,
-		17,
-		34,
-		51,
-		68,
-		85,
-		102,
-		119,
-		136,
-		153,
-		170,
-		187,
-		204,
-		221,
-		238,
-		255,
-	},
-	ParamType: vdl.TypeOf((*TestCaveatData)(nil)).Elem(),
-}
-
-//////////////////////////////////////////////////
-// Interface definitions
-
-// CacheClientMethods is the client interface
-// containing Cache methods.
-//
-// A Cache service mimics the memcache interface.
-type CacheClientMethods interface {
-	// Set sets a value for a key.
-	Set(_ *context.T, key string, value *vom.RawBytes, _ ...rpc.CallOpt) error
-	// Get returns the value for a key.  If the value is not found, returns
-	// a not found error.
-	Get(_ *context.T, key string, _ ...rpc.CallOpt) (*vom.RawBytes, error)
-	// Same as Get, but casts the return argument to an byte.
-	GetAsByte(_ *context.T, key string, _ ...rpc.CallOpt) (byte, error)
-	// Same as Get, but casts the return argument to an int32.
-	GetAsInt32(_ *context.T, key string, _ ...rpc.CallOpt) (int32, error)
-	// Same as Get, but casts the return argument to an int64.
-	GetAsInt64(_ *context.T, key string, _ ...rpc.CallOpt) (int64, error)
-	// Same as Get, but casts the return argument to an uint32.
-	GetAsUint32(_ *context.T, key string, _ ...rpc.CallOpt) (uint32, error)
-	// Same as Get, but casts the return argument to an uint64.
-	GetAsUint64(_ *context.T, key string, _ ...rpc.CallOpt) (uint64, error)
-	// Same as Get, but casts the return argument to an float32.
-	GetAsFloat32(_ *context.T, key string, _ ...rpc.CallOpt) (float32, error)
-	// Same as Get, but casts the return argument to an float64.
-	GetAsFloat64(_ *context.T, key string, _ ...rpc.CallOpt) (float64, error)
-	// Same as Get, but casts the return argument to a string.
-	GetAsString(_ *context.T, key string, _ ...rpc.CallOpt) (string, error)
-	// Same as Get, but casts the return argument to a bool.
-	GetAsBool(_ *context.T, key string, _ ...rpc.CallOpt) (bool, error)
-	// Same as Get, but casts the return argument to an error.
-	GetAsError(_ *context.T, key string, _ ...rpc.CallOpt) (error, error)
-	// AsMap returns the full contents of the cache as a map.
-	AsMap(*context.T, ...rpc.CallOpt) (map[string]*vom.RawBytes, error)
-	// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-	KeyValuePairs(*context.T, ...rpc.CallOpt) ([]KeyValuePair, error)
-	// MostRecentSet returns the key and value and the timestamp for the most
-	// recent set operation
-	// TODO(bprosnitz) support type types and change time to native time type
-	MostRecentSet(*context.T, ...rpc.CallOpt) (value KeyValuePair, time int64, _ error)
-	// KeyPage indexes into the keys (in alphanumerically sorted order) and
-	// returns the indexth page of 10 keys.
-	KeyPage(_ *context.T, index int64, _ ...rpc.CallOpt) (KeyPageResult, error)
-	// Size returns the total number of entries in the cache.
-	Size(*context.T, ...rpc.CallOpt) (int64, error)
-	// MultiGet sets up a stream that allows fetching multiple keys.
-	MultiGet(*context.T, ...rpc.CallOpt) (CacheMultiGetClientCall, error)
-}
-
-// CacheClientStub adds universal methods to CacheClientMethods.
-type CacheClientStub interface {
-	CacheClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// CacheClient returns a client stub for Cache.
-func CacheClient(name string) CacheClientStub {
-	return implCacheClientStub{name}
-}
-
-type implCacheClientStub struct {
-	name string
-}
-
-func (c implCacheClientStub) Set(ctx *context.T, i0 string, i1 *vom.RawBytes, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "Set", []interface{}{i0, i1}, nil, opts...)
-	return
-}
-
-func (c implCacheClientStub) Get(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 *vom.RawBytes, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "Get", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsByte(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 byte, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsByte", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsInt32(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 int32, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsInt32", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsInt64(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 int64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsInt64", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsUint32(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 uint32, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsUint32", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsUint64(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 uint64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsUint64", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsFloat32(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 float32, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsFloat32", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsFloat64(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 float64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsFloat64", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsString(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 string, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsString", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsBool(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 bool, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsBool", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) GetAsError(ctx *context.T, i0 string, opts ...rpc.CallOpt) (o0 error, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "GetAsError", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) AsMap(ctx *context.T, opts ...rpc.CallOpt) (o0 map[string]*vom.RawBytes, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "AsMap", nil, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) KeyValuePairs(ctx *context.T, opts ...rpc.CallOpt) (o0 []KeyValuePair, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "KeyValuePairs", nil, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) MostRecentSet(ctx *context.T, opts ...rpc.CallOpt) (o0 KeyValuePair, o1 int64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "MostRecentSet", nil, []interface{}{&o0, &o1}, opts...)
-	return
-}
-
-func (c implCacheClientStub) KeyPage(ctx *context.T, i0 int64, opts ...rpc.CallOpt) (o0 KeyPageResult, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "KeyPage", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) Size(ctx *context.T, opts ...rpc.CallOpt) (o0 int64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "Size", nil, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implCacheClientStub) MultiGet(ctx *context.T, opts ...rpc.CallOpt) (ocall CacheMultiGetClientCall, err error) {
-	var call rpc.ClientCall
-	if call, err = v23.GetClient(ctx).StartCall(ctx, c.name, "MultiGet", nil, opts...); err != nil {
-		return
-	}
-	ocall = &implCacheMultiGetClientCall{ClientCall: call}
-	return
-}
-
-// CacheMultiGetClientStream is the client stream for Cache.MultiGet.
-type CacheMultiGetClientStream interface {
-	// RecvStream returns the receiver side of the Cache.MultiGet client stream.
-	RecvStream() interface {
-		// Advance stages an item so that it may be retrieved via Value.  Returns
-		// true iff there is an item to retrieve.  Advance must be called before
-		// Value is called.  May block if an item is not available.
-		Advance() bool
-		// Value returns the item that was staged by Advance.  May panic if Advance
-		// returned false or was not called.  Never blocks.
-		Value() *vom.RawBytes
-		// Err returns any error encountered by Advance.  Never blocks.
-		Err() error
-	}
-	// SendStream returns the send side of the Cache.MultiGet client stream.
-	SendStream() interface {
-		// Send places the item onto the output stream.  Returns errors
-		// encountered while sending, or if Send is called after Close or
-		// the stream has been canceled.  Blocks if there is no buffer
-		// space; will unblock when buffer space is available or after
-		// the stream has been canceled.
-		Send(item string) error
-		// Close indicates to the server that no more items will be sent;
-		// server Recv calls will receive io.EOF after all sent items.
-		// This is an optional call - e.g. a client might call Close if it
-		// needs to continue receiving items from the server after it's
-		// done sending.  Returns errors encountered while closing, or if
-		// Close is called after the stream has been canceled.  Like Send,
-		// blocks if there is no buffer space available.
-		Close() error
-	}
-}
-
-// CacheMultiGetClientCall represents the call returned from Cache.MultiGet.
-type CacheMultiGetClientCall interface {
-	CacheMultiGetClientStream
-	// Finish performs the equivalent of SendStream().Close, then blocks until
-	// the server is done, and returns the positional return values for the call.
-	//
-	// Finish returns immediately if the call has been canceled; depending on the
-	// timing the output could either be an error signaling cancelation, or the
-	// valid positional return values from the server.
-	//
-	// Calling Finish is mandatory for releasing stream resources, unless the call
-	// has been canceled or any of the other methods return an error.  Finish should
-	// be called at most once.
-	Finish() error
-}
-
-type implCacheMultiGetClientCall struct {
-	rpc.ClientCall
-	valRecv *vom.RawBytes
-	errRecv error
-}
-
-func (c *implCacheMultiGetClientCall) RecvStream() interface {
-	Advance() bool
-	Value() *vom.RawBytes
-	Err() error
-} {
-	return implCacheMultiGetClientCallRecv{c}
-}
-
-type implCacheMultiGetClientCallRecv struct {
-	c *implCacheMultiGetClientCall
-}
-
-func (c implCacheMultiGetClientCallRecv) Advance() bool {
-	c.c.valRecv = nil
-	c.c.errRecv = c.c.Recv(&c.c.valRecv)
-	return c.c.errRecv == nil
-}
-func (c implCacheMultiGetClientCallRecv) Value() *vom.RawBytes {
-	return c.c.valRecv
-}
-func (c implCacheMultiGetClientCallRecv) Err() error {
-	if c.c.errRecv == io.EOF {
-		return nil
-	}
-	return c.c.errRecv
-}
-func (c *implCacheMultiGetClientCall) SendStream() interface {
-	Send(item string) error
-	Close() error
-} {
-	return implCacheMultiGetClientCallSend{c}
-}
-
-type implCacheMultiGetClientCallSend struct {
-	c *implCacheMultiGetClientCall
-}
-
-func (c implCacheMultiGetClientCallSend) Send(item string) error {
-	return c.c.Send(item)
-}
-func (c implCacheMultiGetClientCallSend) Close() error {
-	return c.c.CloseSend()
-}
-func (c *implCacheMultiGetClientCall) Finish() (err error) {
-	err = c.ClientCall.Finish()
-	return
-}
-
-// CacheServerMethods is the interface a server writer
-// implements for Cache.
-//
-// A Cache service mimics the memcache interface.
-type CacheServerMethods interface {
-	// Set sets a value for a key.
-	Set(_ *context.T, _ rpc.ServerCall, key string, value *vom.RawBytes) error
-	// Get returns the value for a key.  If the value is not found, returns
-	// a not found error.
-	Get(_ *context.T, _ rpc.ServerCall, key string) (*vom.RawBytes, error)
-	// Same as Get, but casts the return argument to an byte.
-	GetAsByte(_ *context.T, _ rpc.ServerCall, key string) (byte, error)
-	// Same as Get, but casts the return argument to an int32.
-	GetAsInt32(_ *context.T, _ rpc.ServerCall, key string) (int32, error)
-	// Same as Get, but casts the return argument to an int64.
-	GetAsInt64(_ *context.T, _ rpc.ServerCall, key string) (int64, error)
-	// Same as Get, but casts the return argument to an uint32.
-	GetAsUint32(_ *context.T, _ rpc.ServerCall, key string) (uint32, error)
-	// Same as Get, but casts the return argument to an uint64.
-	GetAsUint64(_ *context.T, _ rpc.ServerCall, key string) (uint64, error)
-	// Same as Get, but casts the return argument to an float32.
-	GetAsFloat32(_ *context.T, _ rpc.ServerCall, key string) (float32, error)
-	// Same as Get, but casts the return argument to an float64.
-	GetAsFloat64(_ *context.T, _ rpc.ServerCall, key string) (float64, error)
-	// Same as Get, but casts the return argument to a string.
-	GetAsString(_ *context.T, _ rpc.ServerCall, key string) (string, error)
-	// Same as Get, but casts the return argument to a bool.
-	GetAsBool(_ *context.T, _ rpc.ServerCall, key string) (bool, error)
-	// Same as Get, but casts the return argument to an error.
-	GetAsError(_ *context.T, _ rpc.ServerCall, key string) (error, error)
-	// AsMap returns the full contents of the cache as a map.
-	AsMap(*context.T, rpc.ServerCall) (map[string]*vom.RawBytes, error)
-	// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-	KeyValuePairs(*context.T, rpc.ServerCall) ([]KeyValuePair, error)
-	// MostRecentSet returns the key and value and the timestamp for the most
-	// recent set operation
-	// TODO(bprosnitz) support type types and change time to native time type
-	MostRecentSet(*context.T, rpc.ServerCall) (value KeyValuePair, time int64, _ error)
-	// KeyPage indexes into the keys (in alphanumerically sorted order) and
-	// returns the indexth page of 10 keys.
-	KeyPage(_ *context.T, _ rpc.ServerCall, index int64) (KeyPageResult, error)
-	// Size returns the total number of entries in the cache.
-	Size(*context.T, rpc.ServerCall) (int64, error)
-	// MultiGet sets up a stream that allows fetching multiple keys.
-	MultiGet(*context.T, CacheMultiGetServerCall) error
-}
-
-// CacheServerStubMethods is the server interface containing
-// Cache methods, as expected by rpc.Server.
-// The only difference between this interface and CacheServerMethods
-// is the streaming methods.
-type CacheServerStubMethods interface {
-	// Set sets a value for a key.
-	Set(_ *context.T, _ rpc.ServerCall, key string, value *vom.RawBytes) error
-	// Get returns the value for a key.  If the value is not found, returns
-	// a not found error.
-	Get(_ *context.T, _ rpc.ServerCall, key string) (*vom.RawBytes, error)
-	// Same as Get, but casts the return argument to an byte.
-	GetAsByte(_ *context.T, _ rpc.ServerCall, key string) (byte, error)
-	// Same as Get, but casts the return argument to an int32.
-	GetAsInt32(_ *context.T, _ rpc.ServerCall, key string) (int32, error)
-	// Same as Get, but casts the return argument to an int64.
-	GetAsInt64(_ *context.T, _ rpc.ServerCall, key string) (int64, error)
-	// Same as Get, but casts the return argument to an uint32.
-	GetAsUint32(_ *context.T, _ rpc.ServerCall, key string) (uint32, error)
-	// Same as Get, but casts the return argument to an uint64.
-	GetAsUint64(_ *context.T, _ rpc.ServerCall, key string) (uint64, error)
-	// Same as Get, but casts the return argument to an float32.
-	GetAsFloat32(_ *context.T, _ rpc.ServerCall, key string) (float32, error)
-	// Same as Get, but casts the return argument to an float64.
-	GetAsFloat64(_ *context.T, _ rpc.ServerCall, key string) (float64, error)
-	// Same as Get, but casts the return argument to a string.
-	GetAsString(_ *context.T, _ rpc.ServerCall, key string) (string, error)
-	// Same as Get, but casts the return argument to a bool.
-	GetAsBool(_ *context.T, _ rpc.ServerCall, key string) (bool, error)
-	// Same as Get, but casts the return argument to an error.
-	GetAsError(_ *context.T, _ rpc.ServerCall, key string) (error, error)
-	// AsMap returns the full contents of the cache as a map.
-	AsMap(*context.T, rpc.ServerCall) (map[string]*vom.RawBytes, error)
-	// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-	KeyValuePairs(*context.T, rpc.ServerCall) ([]KeyValuePair, error)
-	// MostRecentSet returns the key and value and the timestamp for the most
-	// recent set operation
-	// TODO(bprosnitz) support type types and change time to native time type
-	MostRecentSet(*context.T, rpc.ServerCall) (value KeyValuePair, time int64, _ error)
-	// KeyPage indexes into the keys (in alphanumerically sorted order) and
-	// returns the indexth page of 10 keys.
-	KeyPage(_ *context.T, _ rpc.ServerCall, index int64) (KeyPageResult, error)
-	// Size returns the total number of entries in the cache.
-	Size(*context.T, rpc.ServerCall) (int64, error)
-	// MultiGet sets up a stream that allows fetching multiple keys.
-	MultiGet(*context.T, *CacheMultiGetServerCallStub) error
-}
-
-// CacheServerStub adds universal methods to CacheServerStubMethods.
-type CacheServerStub interface {
-	CacheServerStubMethods
-	// Describe the Cache interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// CacheServer returns a server stub for Cache.
-// It converts an implementation of CacheServerMethods into
-// an object that may be used by rpc.Server.
-func CacheServer(impl CacheServerMethods) CacheServerStub {
-	stub := implCacheServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implCacheServerStub struct {
-	impl CacheServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implCacheServerStub) Set(ctx *context.T, call rpc.ServerCall, i0 string, i1 *vom.RawBytes) error {
-	return s.impl.Set(ctx, call, i0, i1)
-}
-
-func (s implCacheServerStub) Get(ctx *context.T, call rpc.ServerCall, i0 string) (*vom.RawBytes, error) {
-	return s.impl.Get(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsByte(ctx *context.T, call rpc.ServerCall, i0 string) (byte, error) {
-	return s.impl.GetAsByte(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsInt32(ctx *context.T, call rpc.ServerCall, i0 string) (int32, error) {
-	return s.impl.GetAsInt32(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsInt64(ctx *context.T, call rpc.ServerCall, i0 string) (int64, error) {
-	return s.impl.GetAsInt64(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsUint32(ctx *context.T, call rpc.ServerCall, i0 string) (uint32, error) {
-	return s.impl.GetAsUint32(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsUint64(ctx *context.T, call rpc.ServerCall, i0 string) (uint64, error) {
-	return s.impl.GetAsUint64(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsFloat32(ctx *context.T, call rpc.ServerCall, i0 string) (float32, error) {
-	return s.impl.GetAsFloat32(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsFloat64(ctx *context.T, call rpc.ServerCall, i0 string) (float64, error) {
-	return s.impl.GetAsFloat64(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsString(ctx *context.T, call rpc.ServerCall, i0 string) (string, error) {
-	return s.impl.GetAsString(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsBool(ctx *context.T, call rpc.ServerCall, i0 string) (bool, error) {
-	return s.impl.GetAsBool(ctx, call, i0)
-}
-
-func (s implCacheServerStub) GetAsError(ctx *context.T, call rpc.ServerCall, i0 string) (error, error) {
-	return s.impl.GetAsError(ctx, call, i0)
-}
-
-func (s implCacheServerStub) AsMap(ctx *context.T, call rpc.ServerCall) (map[string]*vom.RawBytes, error) {
-	return s.impl.AsMap(ctx, call)
-}
-
-func (s implCacheServerStub) KeyValuePairs(ctx *context.T, call rpc.ServerCall) ([]KeyValuePair, error) {
-	return s.impl.KeyValuePairs(ctx, call)
-}
-
-func (s implCacheServerStub) MostRecentSet(ctx *context.T, call rpc.ServerCall) (KeyValuePair, int64, error) {
-	return s.impl.MostRecentSet(ctx, call)
-}
-
-func (s implCacheServerStub) KeyPage(ctx *context.T, call rpc.ServerCall, i0 int64) (KeyPageResult, error) {
-	return s.impl.KeyPage(ctx, call, i0)
-}
-
-func (s implCacheServerStub) Size(ctx *context.T, call rpc.ServerCall) (int64, error) {
-	return s.impl.Size(ctx, call)
-}
-
-func (s implCacheServerStub) MultiGet(ctx *context.T, call *CacheMultiGetServerCallStub) error {
-	return s.impl.MultiGet(ctx, call)
-}
-
-func (s implCacheServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implCacheServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{CacheDesc}
-}
-
-// CacheDesc describes the Cache interface.
-var CacheDesc rpc.InterfaceDesc = descCache
-
-// descCache hides the desc to keep godoc clean.
-var descCache = rpc.InterfaceDesc{
-	Name:    "Cache",
-	PkgPath: "v.io/x/js.core/test_service",
-	Doc:     "// A Cache service mimics the memcache interface.",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "Set",
-			Doc:  "// Set sets a value for a key.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``},   // string
-				{"value", ``}, // *vom.RawBytes
-			},
-		},
-		{
-			Name: "Get",
-			Doc:  "// Get returns the value for a key.  If the value is not found, returns\n// a not found error.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // *vom.RawBytes
-			},
-		},
-		{
-			Name: "GetAsByte",
-			Doc:  "// Same as Get, but casts the return argument to an byte.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // byte
-			},
-		},
-		{
-			Name: "GetAsInt32",
-			Doc:  "// Same as Get, but casts the return argument to an int32.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // int32
-			},
-		},
-		{
-			Name: "GetAsInt64",
-			Doc:  "// Same as Get, but casts the return argument to an int64.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // int64
-			},
-		},
-		{
-			Name: "GetAsUint32",
-			Doc:  "// Same as Get, but casts the return argument to an uint32.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // uint32
-			},
-		},
-		{
-			Name: "GetAsUint64",
-			Doc:  "// Same as Get, but casts the return argument to an uint64.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // uint64
-			},
-		},
-		{
-			Name: "GetAsFloat32",
-			Doc:  "// Same as Get, but casts the return argument to an float32.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // float32
-			},
-		},
-		{
-			Name: "GetAsFloat64",
-			Doc:  "// Same as Get, but casts the return argument to an float64.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // float64
-			},
-		},
-		{
-			Name: "GetAsString",
-			Doc:  "// Same as Get, but casts the return argument to a string.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // string
-			},
-		},
-		{
-			Name: "GetAsBool",
-			Doc:  "// Same as Get, but casts the return argument to a bool.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // bool
-			},
-		},
-		{
-			Name: "GetAsError",
-			Doc:  "// Same as Get, but casts the return argument to an error.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // error
-			},
-		},
-		{
-			Name: "AsMap",
-			Doc:  "// AsMap returns the full contents of the cache as a map.",
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // map[string]*vom.RawBytes
-			},
-		},
-		{
-			Name: "KeyValuePairs",
-			Doc:  "// KeyValuePairs returns the full contents of the cache as a slice of pairs.",
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // []KeyValuePair
-			},
-		},
-		{
-			Name: "MostRecentSet",
-			Doc:  "// MostRecentSet returns the key and value and the timestamp for the most\n// recent set operation\n// TODO(bprosnitz) support type types and change time to native time type",
-			OutArgs: []rpc.ArgDesc{
-				{"value", ``}, // KeyValuePair
-				{"time", ``},  // int64
-			},
-		},
-		{
-			Name: "KeyPage",
-			Doc:  "// KeyPage indexes into the keys (in alphanumerically sorted order) and\n// returns the indexth page of 10 keys.",
-			InArgs: []rpc.ArgDesc{
-				{"index", ``}, // int64
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // KeyPageResult
-			},
-		},
-		{
-			Name: "Size",
-			Doc:  "// Size returns the total number of entries in the cache.",
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // int64
-			},
-		},
-		{
-			Name: "MultiGet",
-			Doc:  "// MultiGet sets up a stream that allows fetching multiple keys.",
-		},
-	},
-}
-
-// CacheMultiGetServerStream is the server stream for Cache.MultiGet.
-type CacheMultiGetServerStream interface {
-	// RecvStream returns the receiver side of the Cache.MultiGet server stream.
-	RecvStream() interface {
-		// Advance stages an item so that it may be retrieved via Value.  Returns
-		// true iff there is an item to retrieve.  Advance must be called before
-		// Value is called.  May block if an item is not available.
-		Advance() bool
-		// Value returns the item that was staged by Advance.  May panic if Advance
-		// returned false or was not called.  Never blocks.
-		Value() string
-		// Err returns any error encountered by Advance.  Never blocks.
-		Err() error
-	}
-	// SendStream returns the send side of the Cache.MultiGet server stream.
-	SendStream() interface {
-		// Send places the item onto the output stream.  Returns errors encountered
-		// while sending.  Blocks if there is no buffer space; will unblock when
-		// buffer space is available.
-		Send(item *vom.RawBytes) error
-	}
-}
-
-// CacheMultiGetServerCall represents the context passed to Cache.MultiGet.
-type CacheMultiGetServerCall interface {
-	rpc.ServerCall
-	CacheMultiGetServerStream
-}
-
-// CacheMultiGetServerCallStub is a wrapper that converts rpc.StreamServerCall into
-// a typesafe stub that implements CacheMultiGetServerCall.
-type CacheMultiGetServerCallStub struct {
-	rpc.StreamServerCall
-	valRecv string
-	errRecv error
-}
-
-// Init initializes CacheMultiGetServerCallStub from rpc.StreamServerCall.
-func (s *CacheMultiGetServerCallStub) Init(call rpc.StreamServerCall) {
-	s.StreamServerCall = call
-}
-
-// RecvStream returns the receiver side of the Cache.MultiGet server stream.
-func (s *CacheMultiGetServerCallStub) RecvStream() interface {
-	Advance() bool
-	Value() string
-	Err() error
-} {
-	return implCacheMultiGetServerCallRecv{s}
-}
-
-type implCacheMultiGetServerCallRecv struct {
-	s *CacheMultiGetServerCallStub
-}
-
-func (s implCacheMultiGetServerCallRecv) Advance() bool {
-	s.s.errRecv = s.s.Recv(&s.s.valRecv)
-	return s.s.errRecv == nil
-}
-func (s implCacheMultiGetServerCallRecv) Value() string {
-	return s.s.valRecv
-}
-func (s implCacheMultiGetServerCallRecv) Err() error {
-	if s.s.errRecv == io.EOF {
-		return nil
-	}
-	return s.s.errRecv
-}
-
-// SendStream returns the send side of the Cache.MultiGet server stream.
-func (s *CacheMultiGetServerCallStub) SendStream() interface {
-	Send(item *vom.RawBytes) error
-} {
-	return implCacheMultiGetServerCallSend{s}
-}
-
-type implCacheMultiGetServerCallSend struct {
-	s *CacheMultiGetServerCallStub
-}
-
-func (s implCacheMultiGetServerCallSend) Send(item *vom.RawBytes) error {
-	return s.s.Send(item)
-}
-
-// CancelCollectorClientMethods is the client interface
-// containing CancelCollector methods.
-//
-// CancelCollector is a test interface for use in testing cancellation and deadlines.
-type CancelCollectorClientMethods interface {
-	// A function that never returns, but records the status of the given key.
-	NeverReturn(_ *context.T, key int64, _ ...rpc.CallOpt) error
-	// Wait for the call with the given key to have the given status.  Possible statuses are:
-	// "running", and, "cancelled".  Returns the number of nanoseconds left on
-	// the deadline of the specified call when the call first began.
-	WaitForStatus(_ *context.T, key int64, status string, _ ...rpc.CallOpt) (timeout int64, _ error)
-}
-
-// CancelCollectorClientStub adds universal methods to CancelCollectorClientMethods.
-type CancelCollectorClientStub interface {
-	CancelCollectorClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// CancelCollectorClient returns a client stub for CancelCollector.
-func CancelCollectorClient(name string) CancelCollectorClientStub {
-	return implCancelCollectorClientStub{name}
-}
-
-type implCancelCollectorClientStub struct {
-	name string
-}
-
-func (c implCancelCollectorClientStub) NeverReturn(ctx *context.T, i0 int64, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "NeverReturn", []interface{}{i0}, nil, opts...)
-	return
-}
-
-func (c implCancelCollectorClientStub) WaitForStatus(ctx *context.T, i0 int64, i1 string, opts ...rpc.CallOpt) (o0 int64, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "WaitForStatus", []interface{}{i0, i1}, []interface{}{&o0}, opts...)
-	return
-}
-
-// CancelCollectorServerMethods is the interface a server writer
-// implements for CancelCollector.
-//
-// CancelCollector is a test interface for use in testing cancellation and deadlines.
-type CancelCollectorServerMethods interface {
-	// A function that never returns, but records the status of the given key.
-	NeverReturn(_ *context.T, _ rpc.ServerCall, key int64) error
-	// Wait for the call with the given key to have the given status.  Possible statuses are:
-	// "running", and, "cancelled".  Returns the number of nanoseconds left on
-	// the deadline of the specified call when the call first began.
-	WaitForStatus(_ *context.T, _ rpc.ServerCall, key int64, status string) (timeout int64, _ error)
-}
-
-// CancelCollectorServerStubMethods is the server interface containing
-// CancelCollector methods, as expected by rpc.Server.
-// There is no difference between this interface and CancelCollectorServerMethods
-// since there are no streaming methods.
-type CancelCollectorServerStubMethods CancelCollectorServerMethods
-
-// CancelCollectorServerStub adds universal methods to CancelCollectorServerStubMethods.
-type CancelCollectorServerStub interface {
-	CancelCollectorServerStubMethods
-	// Describe the CancelCollector interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// CancelCollectorServer returns a server stub for CancelCollector.
-// It converts an implementation of CancelCollectorServerMethods into
-// an object that may be used by rpc.Server.
-func CancelCollectorServer(impl CancelCollectorServerMethods) CancelCollectorServerStub {
-	stub := implCancelCollectorServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implCancelCollectorServerStub struct {
-	impl CancelCollectorServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implCancelCollectorServerStub) NeverReturn(ctx *context.T, call rpc.ServerCall, i0 int64) error {
-	return s.impl.NeverReturn(ctx, call, i0)
-}
-
-func (s implCancelCollectorServerStub) WaitForStatus(ctx *context.T, call rpc.ServerCall, i0 int64, i1 string) (int64, error) {
-	return s.impl.WaitForStatus(ctx, call, i0, i1)
-}
-
-func (s implCancelCollectorServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implCancelCollectorServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{CancelCollectorDesc}
-}
-
-// CancelCollectorDesc describes the CancelCollector interface.
-var CancelCollectorDesc rpc.InterfaceDesc = descCancelCollector
-
-// descCancelCollector hides the desc to keep godoc clean.
-var descCancelCollector = rpc.InterfaceDesc{
-	Name:    "CancelCollector",
-	PkgPath: "v.io/x/js.core/test_service",
-	Doc:     "// CancelCollector is a test interface for use in testing cancellation and deadlines.",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "NeverReturn",
-			Doc:  "// A function that never returns, but records the status of the given key.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``}, // int64
-			},
-		},
-		{
-			Name: "WaitForStatus",
-			Doc:  "// Wait for the call with the given key to have the given status.  Possible statuses are:\n// \"running\", and, \"cancelled\".  Returns the number of nanoseconds left on\n// the deadline of the specified call when the call first began.",
-			InArgs: []rpc.ArgDesc{
-				{"key", ``},    // int64
-				{"status", ``}, // string
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"timeout", ``}, // int64
-			},
-		},
-	},
-}
-
-// ErrorThrowerClientMethods is the client interface
-// containing ErrorThrower methods.
-//
-// A testing interface with methods that throw various types of errors
-type ErrorThrowerClientMethods interface {
-	// Throws v23/vError.Aborted error
-	ThrowAborted(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.BadArg error
-	ThrowBadArg(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.BadProtocol error
-	ThrowBadProtocol(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.Internal error
-	ThrowInternal(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.NoAccess error
-	ThrowNoAccess(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.NoExist error
-	ThrowNoExist(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.NoExistOrNoAccess error
-	ThrowNoExistOrNoAccess(*context.T, ...rpc.CallOpt) error
-	// Throws v23/vError.Unknown error
-	ThrowUnknown(*context.T, ...rpc.CallOpt) error
-	// Throws normal Go error
-	ThrowGoError(*context.T, ...rpc.CallOpt) error
-	// Throws custom error created by using Standard
-	ThrowCustomStandardError(*context.T, ...rpc.CallOpt) error
-}
-
-// ErrorThrowerClientStub adds universal methods to ErrorThrowerClientMethods.
-type ErrorThrowerClientStub interface {
-	ErrorThrowerClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// ErrorThrowerClient returns a client stub for ErrorThrower.
-func ErrorThrowerClient(name string) ErrorThrowerClientStub {
-	return implErrorThrowerClientStub{name}
-}
-
-type implErrorThrowerClientStub struct {
-	name string
-}
-
-func (c implErrorThrowerClientStub) ThrowAborted(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowAborted", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowBadArg(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowBadArg", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowBadProtocol(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowBadProtocol", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowInternal(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowInternal", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowNoAccess(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowNoAccess", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowNoExist(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowNoExist", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowNoExistOrNoAccess(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowNoExistOrNoAccess", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowUnknown(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowUnknown", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowGoError(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowGoError", nil, nil, opts...)
-	return
-}
-
-func (c implErrorThrowerClientStub) ThrowCustomStandardError(ctx *context.T, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "ThrowCustomStandardError", nil, nil, opts...)
-	return
-}
-
-// ErrorThrowerServerMethods is the interface a server writer
-// implements for ErrorThrower.
-//
-// A testing interface with methods that throw various types of errors
-type ErrorThrowerServerMethods interface {
-	// Throws v23/vError.Aborted error
-	ThrowAborted(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.BadArg error
-	ThrowBadArg(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.BadProtocol error
-	ThrowBadProtocol(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.Internal error
-	ThrowInternal(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.NoAccess error
-	ThrowNoAccess(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.NoExist error
-	ThrowNoExist(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.NoExistOrNoAccess error
-	ThrowNoExistOrNoAccess(*context.T, rpc.ServerCall) error
-	// Throws v23/vError.Unknown error
-	ThrowUnknown(*context.T, rpc.ServerCall) error
-	// Throws normal Go error
-	ThrowGoError(*context.T, rpc.ServerCall) error
-	// Throws custom error created by using Standard
-	ThrowCustomStandardError(*context.T, rpc.ServerCall) error
-}
-
-// ErrorThrowerServerStubMethods is the server interface containing
-// ErrorThrower methods, as expected by rpc.Server.
-// There is no difference between this interface and ErrorThrowerServerMethods
-// since there are no streaming methods.
-type ErrorThrowerServerStubMethods ErrorThrowerServerMethods
-
-// ErrorThrowerServerStub adds universal methods to ErrorThrowerServerStubMethods.
-type ErrorThrowerServerStub interface {
-	ErrorThrowerServerStubMethods
-	// Describe the ErrorThrower interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// ErrorThrowerServer returns a server stub for ErrorThrower.
-// It converts an implementation of ErrorThrowerServerMethods into
-// an object that may be used by rpc.Server.
-func ErrorThrowerServer(impl ErrorThrowerServerMethods) ErrorThrowerServerStub {
-	stub := implErrorThrowerServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implErrorThrowerServerStub struct {
-	impl ErrorThrowerServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implErrorThrowerServerStub) ThrowAborted(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowAborted(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowBadArg(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowBadArg(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowBadProtocol(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowBadProtocol(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowInternal(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowInternal(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowNoAccess(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowNoAccess(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowNoExist(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowNoExist(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowNoExistOrNoAccess(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowNoExistOrNoAccess(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowUnknown(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowUnknown(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowGoError(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowGoError(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) ThrowCustomStandardError(ctx *context.T, call rpc.ServerCall) error {
-	return s.impl.ThrowCustomStandardError(ctx, call)
-}
-
-func (s implErrorThrowerServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implErrorThrowerServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{ErrorThrowerDesc}
-}
-
-// ErrorThrowerDesc describes the ErrorThrower interface.
-var ErrorThrowerDesc rpc.InterfaceDesc = descErrorThrower
-
-// descErrorThrower hides the desc to keep godoc clean.
-var descErrorThrower = rpc.InterfaceDesc{
-	Name:    "ErrorThrower",
-	PkgPath: "v.io/x/js.core/test_service",
-	Doc:     "// A testing interface with methods that throw various types of errors",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "ThrowAborted",
-			Doc:  "// Throws v23/vError.Aborted error",
-		},
-		{
-			Name: "ThrowBadArg",
-			Doc:  "// Throws v23/vError.BadArg error",
-		},
-		{
-			Name: "ThrowBadProtocol",
-			Doc:  "// Throws v23/vError.BadProtocol error",
-		},
-		{
-			Name: "ThrowInternal",
-			Doc:  "// Throws v23/vError.Internal error",
-		},
-		{
-			Name: "ThrowNoAccess",
-			Doc:  "// Throws v23/vError.NoAccess error",
-		},
-		{
-			Name: "ThrowNoExist",
-			Doc:  "// Throws v23/vError.NoExist error",
-		},
-		{
-			Name: "ThrowNoExistOrNoAccess",
-			Doc:  "// Throws v23/vError.NoExistOrNoAccess error",
-		},
-		{
-			Name: "ThrowUnknown",
-			Doc:  "// Throws v23/vError.Unknown error",
-		},
-		{
-			Name: "ThrowGoError",
-			Doc:  "// Throws normal Go error",
-		},
-		{
-			Name: "ThrowCustomStandardError",
-			Doc:  "// Throws custom error created by using Standard",
-		},
-	},
-}
-
-// InvokableTestMethodClientMethods is the client interface
-// containing InvokableTestMethod methods.
-type InvokableTestMethodClientMethods interface {
-	AMethod(*context.T, ...rpc.CallOpt) (string, error)
-}
-
-// InvokableTestMethodClientStub adds universal methods to InvokableTestMethodClientMethods.
-type InvokableTestMethodClientStub interface {
-	InvokableTestMethodClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// InvokableTestMethodClient returns a client stub for InvokableTestMethod.
-func InvokableTestMethodClient(name string) InvokableTestMethodClientStub {
-	return implInvokableTestMethodClientStub{name}
-}
-
-type implInvokableTestMethodClientStub struct {
-	name string
-}
-
-func (c implInvokableTestMethodClientStub) AMethod(ctx *context.T, opts ...rpc.CallOpt) (o0 string, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "AMethod", nil, []interface{}{&o0}, opts...)
-	return
-}
-
-// InvokableTestMethodServerMethods is the interface a server writer
-// implements for InvokableTestMethod.
-type InvokableTestMethodServerMethods interface {
-	AMethod(*context.T, rpc.ServerCall) (string, error)
-}
-
-// InvokableTestMethodServerStubMethods is the server interface containing
-// InvokableTestMethod methods, as expected by rpc.Server.
-// There is no difference between this interface and InvokableTestMethodServerMethods
-// since there are no streaming methods.
-type InvokableTestMethodServerStubMethods InvokableTestMethodServerMethods
-
-// InvokableTestMethodServerStub adds universal methods to InvokableTestMethodServerStubMethods.
-type InvokableTestMethodServerStub interface {
-	InvokableTestMethodServerStubMethods
-	// Describe the InvokableTestMethod interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// InvokableTestMethodServer returns a server stub for InvokableTestMethod.
-// It converts an implementation of InvokableTestMethodServerMethods into
-// an object that may be used by rpc.Server.
-func InvokableTestMethodServer(impl InvokableTestMethodServerMethods) InvokableTestMethodServerStub {
-	stub := implInvokableTestMethodServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implInvokableTestMethodServerStub struct {
-	impl InvokableTestMethodServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implInvokableTestMethodServerStub) AMethod(ctx *context.T, call rpc.ServerCall) (string, error) {
-	return s.impl.AMethod(ctx, call)
-}
-
-func (s implInvokableTestMethodServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implInvokableTestMethodServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{InvokableTestMethodDesc}
-}
-
-// InvokableTestMethodDesc describes the InvokableTestMethod interface.
-var InvokableTestMethodDesc rpc.InterfaceDesc = descInvokableTestMethod
-
-// descInvokableTestMethod hides the desc to keep godoc clean.
-var descInvokableTestMethod = rpc.InterfaceDesc{
-	Name:    "InvokableTestMethod",
-	PkgPath: "v.io/x/js.core/test_service",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "AMethod",
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // string
-			},
-		},
-	},
-}
-
-// InvokeMethodWithCaveatedIdentityClientMethods is the client interface
-// containing InvokeMethodWithCaveatedIdentity methods.
-type InvokeMethodWithCaveatedIdentityClientMethods interface {
-	Invoke(_ *context.T, name string, cavDesc security.CaveatDescriptor, cavParam *vom.RawBytes, _ ...rpc.CallOpt) error
-}
-
-// InvokeMethodWithCaveatedIdentityClientStub adds universal methods to InvokeMethodWithCaveatedIdentityClientMethods.
-type InvokeMethodWithCaveatedIdentityClientStub interface {
-	InvokeMethodWithCaveatedIdentityClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// InvokeMethodWithCaveatedIdentityClient returns a client stub for InvokeMethodWithCaveatedIdentity.
-func InvokeMethodWithCaveatedIdentityClient(name string) InvokeMethodWithCaveatedIdentityClientStub {
-	return implInvokeMethodWithCaveatedIdentityClientStub{name}
-}
-
-type implInvokeMethodWithCaveatedIdentityClientStub struct {
-	name string
-}
-
-func (c implInvokeMethodWithCaveatedIdentityClientStub) Invoke(ctx *context.T, i0 string, i1 security.CaveatDescriptor, i2 *vom.RawBytes, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "Invoke", []interface{}{i0, i1, i2}, nil, opts...)
-	return
-}
-
-// InvokeMethodWithCaveatedIdentityServerMethods is the interface a server writer
-// implements for InvokeMethodWithCaveatedIdentity.
-type InvokeMethodWithCaveatedIdentityServerMethods interface {
-	Invoke(_ *context.T, _ rpc.ServerCall, name string, cavDesc security.CaveatDescriptor, cavParam *vom.RawBytes) error
-}
-
-// InvokeMethodWithCaveatedIdentityServerStubMethods is the server interface containing
-// InvokeMethodWithCaveatedIdentity methods, as expected by rpc.Server.
-// There is no difference between this interface and InvokeMethodWithCaveatedIdentityServerMethods
-// since there are no streaming methods.
-type InvokeMethodWithCaveatedIdentityServerStubMethods InvokeMethodWithCaveatedIdentityServerMethods
-
-// InvokeMethodWithCaveatedIdentityServerStub adds universal methods to InvokeMethodWithCaveatedIdentityServerStubMethods.
-type InvokeMethodWithCaveatedIdentityServerStub interface {
-	InvokeMethodWithCaveatedIdentityServerStubMethods
-	// Describe the InvokeMethodWithCaveatedIdentity interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// InvokeMethodWithCaveatedIdentityServer returns a server stub for InvokeMethodWithCaveatedIdentity.
-// It converts an implementation of InvokeMethodWithCaveatedIdentityServerMethods into
-// an object that may be used by rpc.Server.
-func InvokeMethodWithCaveatedIdentityServer(impl InvokeMethodWithCaveatedIdentityServerMethods) InvokeMethodWithCaveatedIdentityServerStub {
-	stub := implInvokeMethodWithCaveatedIdentityServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implInvokeMethodWithCaveatedIdentityServerStub struct {
-	impl InvokeMethodWithCaveatedIdentityServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implInvokeMethodWithCaveatedIdentityServerStub) Invoke(ctx *context.T, call rpc.ServerCall, i0 string, i1 security.CaveatDescriptor, i2 *vom.RawBytes) error {
-	return s.impl.Invoke(ctx, call, i0, i1, i2)
-}
-
-func (s implInvokeMethodWithCaveatedIdentityServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implInvokeMethodWithCaveatedIdentityServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{InvokeMethodWithCaveatedIdentityDesc}
-}
-
-// InvokeMethodWithCaveatedIdentityDesc describes the InvokeMethodWithCaveatedIdentity interface.
-var InvokeMethodWithCaveatedIdentityDesc rpc.InterfaceDesc = descInvokeMethodWithCaveatedIdentity
-
-// descInvokeMethodWithCaveatedIdentity hides the desc to keep godoc clean.
-var descInvokeMethodWithCaveatedIdentity = rpc.InterfaceDesc{
-	Name:    "InvokeMethodWithCaveatedIdentity",
-	PkgPath: "v.io/x/js.core/test_service",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "Invoke",
-			InArgs: []rpc.ArgDesc{
-				{"name", ``},     // string
-				{"cavDesc", ``},  // security.CaveatDescriptor
-				{"cavParam", ``}, // *vom.RawBytes
-			},
-		},
-	},
-}
-
-// NativeTestClientMethods is the client interface
-// containing NativeTest methods.
-type NativeTestClientMethods interface {
-	PassTime(_ *context.T, t time.Time, _ ...rpc.CallOpt) (time.Time, error)
-	PassError(_ *context.T, e error, _ ...rpc.CallOpt) error
-}
-
-// NativeTestClientStub adds universal methods to NativeTestClientMethods.
-type NativeTestClientStub interface {
-	NativeTestClientMethods
-	rpc.UniversalServiceMethods
-}
-
-// NativeTestClient returns a client stub for NativeTest.
-func NativeTestClient(name string) NativeTestClientStub {
-	return implNativeTestClientStub{name}
-}
-
-type implNativeTestClientStub struct {
-	name string
-}
-
-func (c implNativeTestClientStub) PassTime(ctx *context.T, i0 time.Time, opts ...rpc.CallOpt) (o0 time.Time, err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "PassTime", []interface{}{i0}, []interface{}{&o0}, opts...)
-	return
-}
-
-func (c implNativeTestClientStub) PassError(ctx *context.T, i0 error, opts ...rpc.CallOpt) (err error) {
-	err = v23.GetClient(ctx).Call(ctx, c.name, "PassError", []interface{}{&i0}, nil, opts...)
-	return
-}
-
-// NativeTestServerMethods is the interface a server writer
-// implements for NativeTest.
-type NativeTestServerMethods interface {
-	PassTime(_ *context.T, _ rpc.ServerCall, t time.Time) (time.Time, error)
-	PassError(_ *context.T, _ rpc.ServerCall, e error) error
-}
-
-// NativeTestServerStubMethods is the server interface containing
-// NativeTest methods, as expected by rpc.Server.
-// There is no difference between this interface and NativeTestServerMethods
-// since there are no streaming methods.
-type NativeTestServerStubMethods NativeTestServerMethods
-
-// NativeTestServerStub adds universal methods to NativeTestServerStubMethods.
-type NativeTestServerStub interface {
-	NativeTestServerStubMethods
-	// Describe the NativeTest interfaces.
-	Describe__() []rpc.InterfaceDesc
-}
-
-// NativeTestServer returns a server stub for NativeTest.
-// It converts an implementation of NativeTestServerMethods into
-// an object that may be used by rpc.Server.
-func NativeTestServer(impl NativeTestServerMethods) NativeTestServerStub {
-	stub := implNativeTestServerStub{
-		impl: impl,
-	}
-	// Initialize GlobState; always check the stub itself first, to handle the
-	// case where the user has the Glob method defined in their VDL source.
-	if gs := rpc.NewGlobState(stub); gs != nil {
-		stub.gs = gs
-	} else if gs := rpc.NewGlobState(impl); gs != nil {
-		stub.gs = gs
-	}
-	return stub
-}
-
-type implNativeTestServerStub struct {
-	impl NativeTestServerMethods
-	gs   *rpc.GlobState
-}
-
-func (s implNativeTestServerStub) PassTime(ctx *context.T, call rpc.ServerCall, i0 time.Time) (time.Time, error) {
-	return s.impl.PassTime(ctx, call, i0)
-}
-
-func (s implNativeTestServerStub) PassError(ctx *context.T, call rpc.ServerCall, i0 error) error {
-	return s.impl.PassError(ctx, call, i0)
-}
-
-func (s implNativeTestServerStub) Globber() *rpc.GlobState {
-	return s.gs
-}
-
-func (s implNativeTestServerStub) Describe__() []rpc.InterfaceDesc {
-	return []rpc.InterfaceDesc{NativeTestDesc}
-}
-
-// NativeTestDesc describes the NativeTest interface.
-var NativeTestDesc rpc.InterfaceDesc = descNativeTest
-
-// descNativeTest hides the desc to keep godoc clean.
-var descNativeTest = rpc.InterfaceDesc{
-	Name:    "NativeTest",
-	PkgPath: "v.io/x/js.core/test_service",
-	Methods: []rpc.MethodDesc{
-		{
-			Name: "PassTime",
-			InArgs: []rpc.ArgDesc{
-				{"t", ``}, // time.Time
-			},
-			OutArgs: []rpc.ArgDesc{
-				{"", ``}, // time.Time
-			},
-		},
-		{
-			Name: "PassError",
-			InArgs: []rpc.ArgDesc{
-				{"e", ``}, // error
-			},
-		},
-	},
-}
-
-var __VDLInitCalled bool
-
-// __VDLInit performs vdl initialization.  It is safe to call multiple times.
-// If you have an init ordering issue, just insert the following line verbatim
-// into your source files in this package, right after the "package foo" clause:
-//
-//    var _ = __VDLInit()
-//
-// The purpose of this function is to ensure that vdl initialization occurs in
-// the right order, and very early in the init sequence.  In particular, vdl
-// registration and package variable initialization needs to occur before
-// functions like vdl.TypeOf will work properly.
-//
-// This function returns a dummy value, so that it can be used to initialize the
-// first var in the file, to take advantage of Go's defined init order.
-func __VDLInit() struct{} {
-	if __VDLInitCalled {
-		return struct{}{}
-	}
-
-	// Register types.
-	vdl.Register((*KeyPageResult)(nil))
-	vdl.Register((*KeyValuePair)(nil))
-	vdl.Register((*TestCaveatData)(nil))
-
-	return struct{}{}
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/cache_impl.go b/go/src/v.io/x/js.core/test_service/test_serviced/cache_impl.go
deleted file mode 100644
index 08c0d2d..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/cache_impl.go
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"reflect"
-	"sort"
-	"sync"
-	"time"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/verror"
-	"v.io/v23/vom"
-	"v.io/x/js.core/test_service"
-)
-
-const pkgPath = "release/javascript/core/test_service/test_serviced"
-
-var errIndexOutOfBounds = verror.Register(pkgPath+".errIndexOutOfBounds", verror.NoRetry, "{1:}{2:} Page index out of bounds{:_}")
-
-// A simple in-memory implementation of a Cache service.
-type cacheImpl struct {
-	mu             sync.Mutex
-	cache          map[string]*vom.RawBytes
-	mostRecent     test_service.KeyValuePair
-	lastUpdateTime time.Time
-}
-
-// NewCached returns a new implementation of CacheServerMethods.
-func NewCached() test_service.CacheServerMethods {
-	return &cacheImpl{cache: make(map[string]*vom.RawBytes)}
-}
-
-// Set sets a value for a key.  This should never return an error.
-func (c *cacheImpl) Set(ctx *context.T, _ rpc.ServerCall, key string, value *vom.RawBytes) error {
-	c.mu.Lock()
-	ctx.VI(0).Info("Set called with %v", key)
-	c.cache[key] = value
-	c.mostRecent = test_service.KeyValuePair{Key: key, Value: value}
-	c.lastUpdateTime = time.Now()
-	c.mu.Unlock()
-	return nil
-}
-
-// Get returns the value for a key.  If the key is not in the map, it returns
-// an error.
-func (c *cacheImpl) Get(ctx *context.T, _ rpc.ServerCall, key string) (*vom.RawBytes, error) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	if value, ok := c.cache[key]; ok {
-		return value, nil
-	}
-	return nil, verror.New(verror.ErrNoExist, ctx, key)
-}
-
-// getWithTypeCheck gets the key and tests if its type matches the given time, erroring if it does
-// not.
-// This exists mostly to shorted the Get* methods below.
-func (c *cacheImpl) getWithTypeCheck(key string, rt reflect.Type) (interface{}, error) {
-	v, err := c.Get(nil, nil, key)
-	if err != nil {
-		return reflect.Zero(rt).Interface(), err
-	}
-	if !reflect.TypeOf(v).AssignableTo(rt) {
-		return reflect.Zero(rt).Interface(),
-			fmt.Errorf("Cannot convert %v (type %v) to type %v", v, reflect.TypeOf(v), rt)
-	}
-	return v, nil
-}
-
-// Same as Get, but casts the return argument to an int32.
-func (c *cacheImpl) GetAsInt32(_ *context.T, _ rpc.ServerCall, key string) (int32, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(int32(0)))
-	return v.(int32), err
-}
-
-// Same as Get, but casts the return argument to an int64.
-func (c *cacheImpl) GetAsInt64(_ *context.T, _ rpc.ServerCall, key string) (int64, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(int64(0)))
-	return v.(int64), err
-}
-
-// Same as Get, but casts the return argument to an uint8.
-func (c *cacheImpl) GetAsByte(_ *context.T, _ rpc.ServerCall, key string) (byte, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(byte(0)))
-	return v.(uint8), err
-}
-
-// Same as Get, but casts the return argument to an uint32.
-func (c *cacheImpl) GetAsUint32(_ *context.T, _ rpc.ServerCall, key string) (uint32, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(uint32(0)))
-	return v.(uint32), err
-}
-
-// Same as Get, but casts the return argument to an uint64.
-func (c *cacheImpl) GetAsUint64(_ *context.T, _ rpc.ServerCall, key string) (uint64, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(uint64(0)))
-	return v.(uint64), err
-}
-
-// Same as Get, but casts the return argument to a float32.
-func (c *cacheImpl) GetAsFloat32(_ *context.T, _ rpc.ServerCall, key string) (float32, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(float32(0)))
-	return v.(float32), err
-}
-
-// Same as Get, but casts the return argument to a float64.
-func (c *cacheImpl) GetAsFloat64(_ *context.T, _ rpc.ServerCall, key string) (float64, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(float64(0)))
-	return v.(float64), err
-}
-
-// Same as Get, but casts the return argument to a string.
-func (c *cacheImpl) GetAsString(_ *context.T, _ rpc.ServerCall, key string) (string, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(""))
-	return v.(string), err
-}
-
-// Same as Get, but casts the return argument to a bool.
-func (c *cacheImpl) GetAsBool(_ *context.T, _ rpc.ServerCall, key string) (bool, error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf(false))
-	return v.(bool), err
-}
-
-// Same as Get, but converts the string return argument to an error.
-func (c *cacheImpl) GetAsError(_ *context.T, _ rpc.ServerCall, key string) (storedError error, callError error) {
-	v, err := c.getWithTypeCheck(key, reflect.TypeOf([]error{}).Elem())
-	return v.(error), err
-}
-
-// AsMap returns the full contents of the cache as a map.
-func (c *cacheImpl) AsMap(*context.T, rpc.ServerCall) (map[string]*vom.RawBytes, error) {
-	return c.cache, nil
-}
-
-// KeyValuePairs returns the full contents of the cache as a slice of pairs.
-func (c *cacheImpl) KeyValuePairs(*context.T, rpc.ServerCall) ([]test_service.KeyValuePair, error) {
-	c.mu.Lock()
-	kvp := make([]test_service.KeyValuePair, 0, len(c.cache))
-	for key, val := range c.cache {
-		kvp = append(kvp, test_service.KeyValuePair{key, val})
-	}
-	c.mu.Unlock()
-	return kvp, nil
-}
-
-// MostRecentSet returns the key and value and the timestamp for the most
-// recent set operation
-// TODO(bprosnitz) support type types and change time to native time type
-func (c *cacheImpl) MostRecentSet(ctx *context.T, _ rpc.ServerCall) (test_service.KeyValuePair, int64, error) {
-	var err error
-	c.mu.Lock()
-	defer c.mu.Unlock()
-	if c.lastUpdateTime.IsZero() {
-		err = verror.New(verror.ErrNoExist, ctx)
-	}
-	return c.mostRecent, c.lastUpdateTime.Unix(), err
-}
-
-// KeyPage indexes into the keys (in alphanumerically sorted order) and
-// returns the indexth page of 10 keys.
-func (c *cacheImpl) KeyPage(ctx *context.T, _ rpc.ServerCall, index int64) (test_service.KeyPageResult, error) {
-	results := test_service.KeyPageResult{}
-
-	c.mu.Lock()
-	keys := sort.StringSlice{}
-	for key, _ := range c.cache {
-		keys = append(keys, key)
-	}
-	c.mu.Unlock()
-	keys.Sort()
-
-	lowIndex := int(index) * 10
-	if index < 0 || len(keys) <= lowIndex {
-		return results, verror.New(errIndexOutOfBounds, ctx, index)
-	}
-	highIndex := lowIndex + 9
-	if highIndex > len(keys)-1 {
-		highIndex = len(keys) - 1
-	}
-
-	for i := 0; lowIndex+i <= highIndex; i++ {
-		results[i] = keys[lowIndex+i]
-	}
-
-	return results, nil
-}
-
-// Size returns the total number of entries in the cache.
-func (c *cacheImpl) Size(*context.T, rpc.ServerCall) (int64, error) {
-	return int64(len(c.cache)), nil
-}
-
-// MultiGet handles a stream of get requests.  Returns an error if one of the
-// keys in the stream is not in the map or if there was an issue reading
-// the stream.
-func (c *cacheImpl) MultiGet(ctx *context.T, call test_service.CacheMultiGetServerCall) error {
-	for call.RecvStream().Advance() {
-		key := call.RecvStream().Value()
-		c.mu.Lock()
-		value, ok := c.cache[key]
-		c.mu.Unlock()
-		if !ok {
-			return verror.New(verror.ErrNoExist, ctx, key)
-		}
-		call.SendStream().Send(value)
-	}
-	return call.RecvStream().Err()
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/cancel_collector_impl.go b/go/src/v.io/x/js.core/test_service/test_serviced/cancel_collector_impl.go
deleted file mode 100644
index 7b16771..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/cancel_collector_impl.go
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"sync"
-	"time"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/x/js.core/test_service"
-)
-
-type callStatus int
-
-const (
-	unknown = callStatus(iota)
-	running
-	cancelled
-)
-
-func statusFromString(s string) callStatus {
-	switch s {
-	case "running":
-		return running
-	case "cancelled":
-		return cancelled
-	default:
-		return unknown
-	}
-}
-
-// NewCancelCollector returns a new implementation of CancelCollectorServerMethods.
-func NewCancelCollector() test_service.CancelCollectorServerMethods {
-	return &cancelCollectorImpl{
-		infoMap: make(map[int64]*callInfo),
-	}
-}
-
-type callInfo struct {
-	status  callStatus
-	timeout int64
-	cond    *sync.Cond
-}
-
-type cancelCollectorImpl struct {
-	mu      sync.Mutex
-	infoMap map[int64]*callInfo
-}
-
-func (c *cancelCollectorImpl) setStatus(key int64, status callStatus) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
-
-	info := c.infoMap[key]
-	if info.status < status {
-		info.status = status
-		info.cond.Broadcast()
-	}
-}
-
-func (c *cancelCollectorImpl) getInfoLocked(key int64) *callInfo {
-	info, ok := c.infoMap[key]
-	if !ok {
-		info = &callInfo{
-			cond: sync.NewCond(&c.mu),
-		}
-		c.infoMap[key] = info
-	}
-	return info
-}
-
-func (c *cancelCollectorImpl) NeverReturn(ctx *context.T, _ rpc.ServerCall, key int64) error {
-	timeout := int64(0x7FFFFFFFFFFFFFFF / 1000000)
-	if deadline, ok := ctx.Deadline(); ok {
-		timeout = int64(deadline.Sub(time.Now())) / 1000000
-	}
-
-	c.mu.Lock()
-	info := c.getInfoLocked(key)
-	info.timeout = timeout
-	c.mu.Unlock()
-
-	c.setStatus(key, running)
-	<-ctx.Done()
-	c.setStatus(key, cancelled)
-	return nil
-}
-
-func (c *cancelCollectorImpl) WaitForStatus(_ *context.T, _ rpc.ServerCall, key int64, statusStr string) (int64, error) {
-	status := statusFromString(statusStr)
-
-	c.mu.Lock()
-	defer c.mu.Unlock()
-
-	info := c.getInfoLocked(key)
-	for status > info.status {
-		info.cond.Wait()
-	}
-	return info.timeout, nil
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/error_thrower_impl.go b/go/src/v.io/x/js.core/test_service/test_serviced/error_thrower_impl.go
deleted file mode 100644
index cd7f622..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/error_thrower_impl.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"errors"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/verror"
-	"v.io/x/js.core/test_service"
-)
-
-// NewErrorThrower returns a new implementation of ErrorThrowerServerMethods.
-func NewErrorThrower() test_service.ErrorThrowerServerMethods {
-	return &errorThrowerImpl{}
-}
-
-type errorThrowerImpl struct{}
-
-func (e *errorThrowerImpl) ThrowAborted(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrAborted, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowBadArg(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrBadArg, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowBadProtocol(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrBadProtocol, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowInternal(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrInternal, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowNoAccess(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrNoAccess, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowNoExist(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrNoExist, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowNoExistOrNoAccess(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrNoExistOrNoAccess, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowUnknown(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(verror.ErrUnknown, ctx)
-}
-
-func (e *errorThrowerImpl) ThrowGoError(*context.T, rpc.ServerCall) error {
-	return errors.New("GoError!")
-}
-
-var customError = verror.Register(pkgPath+".customError", verror.NoRetry, "{1:}{2:} CustomStandard!{:_}")
-
-func (e *errorThrowerImpl) ThrowCustomStandardError(ctx *context.T, _ rpc.ServerCall) error {
-	return verror.New(customError, ctx)
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/invoke_method_caveat_id_impl.go b/go/src/v.io/x/js.core/test_service/test_serviced/invoke_method_caveat_id_impl.go
deleted file mode 100644
index 3480627..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/invoke_method_caveat_id_impl.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-
-	"v.io/v23"
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/security"
-	"v.io/v23/vom"
-	"v.io/x/js.core/test_service"
-	vsecurity "v.io/x/ref/lib/security"
-)
-
-type invokeMethWCavIdImpl struct{}
-
-var _ test_service.InvokeMethodWithCaveatedIdentityServerMethods = (*invokeMethWCavIdImpl)(nil)
-
-func NewInvokeMethodWithCaveatedIdentityServer() test_service.InvokeMethodWithCaveatedIdentityServerMethods {
-	return &invokeMethWCavIdImpl{}
-}
-
-// Invoke is a method on the InvokeMethodWithCaveatedIdentity service that
-// invokes "AMethod" on the service with the provided name with an identity
-// blessed with a caveat with the provided CaveatDescriptor.
-func (i *invokeMethWCavIdImpl) Invoke(ctx *context.T, call rpc.ServerCall, name string, cavDesc security.CaveatDescriptor, cavParam *vom.RawBytes) error {
-	bytes, err := vom.Encode(cavParam)
-	if err != nil {
-		return err
-	}
-
-	cav := security.Caveat{
-		Id:       cavDesc.Id,
-		ParamVom: bytes,
-	}
-	p := v23.GetPrincipal(ctx)
-	other, _ := security.RemoteBlessingNames(ctx, call.Security())
-	sharedWithOther := p.BlessingStore().ForPeer(other...)
-
-	pWithCaveats, err := vsecurity.NewPrincipal()
-	if err != nil {
-		return err
-	}
-	// The "child" extension below is necessary for the blessing to be authorized
-	// at the JavaScript server (which uses the default authorization policy).
-	b, err := p.Bless(pWithCaveats.PublicKey(), sharedWithOther, "child", cav)
-	if err != nil {
-		return err
-	}
-	if err := vsecurity.SetDefaultBlessings(pWithCaveats, b); err != nil {
-		return err
-	}
-
-	client := test_service.InvokableTestMethodClient(name)
-	ctxWithCaveats, err := v23.WithPrincipal(ctx, pWithCaveats)
-	if err != nil {
-		return err
-	}
-
-	str, err := client.AMethod(ctxWithCaveats)
-	if err != nil {
-		return err
-	}
-	if str != "aResult" {
-		return fmt.Errorf("Got wrong result %q", str)
-	}
-	return nil
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/main.go b/go/src/v.io/x/js.core/test_service/test_serviced/main.go
deleted file mode 100644
index 4bd6d21..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/main.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Command test_serviced is an implementation of the test_service service.
-package main
-
-import (
-	"fmt"
-	"log"
-
-	"v.io/v23"
-	"v.io/x/ref/lib/flags"
-	"v.io/x/ref/lib/signals"
-	_ "v.io/x/ref/runtime/factories/generic"
-	"v.io/x/ref/test"
-)
-
-func main() {
-	flags.SetDefaultHostPort("127.0.0.1:0")
-	ctx, shutdown := test.V23Init()
-	defer shutdown()
-
-	ctx, s, err := v23.WithNewDispatchingServer(ctx, "test_service", NewDispatcher())
-	if err != nil {
-		log.Fatalf("failure creating server: %v", err)
-	}
-	endpoint := s.Status().Endpoints[0]
-	fmt.Printf("Listening at: %v\n", endpoint)
-	<-signals.ShutdownOnSignals(ctx)
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/native_impl.go b/go/src/v.io/x/js.core/test_service/test_serviced/native_impl.go
deleted file mode 100644
index a628aa3..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/native_impl.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"time"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/x/js.core/test_service"
-)
-
-func NewNativeTest() test_service.NativeTestServerMethods {
-	return &nativeTest{}
-}
-
-type nativeTest struct{}
-
-func (*nativeTest) PassTime(_ *context.T, _ rpc.ServerCall, t time.Time) (time.Time, error) {
-	return t, nil
-}
-
-func (*nativeTest) PassError(_ *context.T, _ rpc.ServerCall, e error) error {
-	return e
-}
diff --git a/go/src/v.io/x/js.core/test_service/test_serviced/test_serviced.go b/go/src/v.io/x/js.core/test_service/test_serviced/test_serviced.go
deleted file mode 100644
index 4377378..0000000
--- a/go/src/v.io/x/js.core/test_service/test_serviced/test_serviced.go
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"fmt"
-	"strings"
-
-	"v.io/v23/context"
-	"v.io/v23/rpc"
-	"v.io/v23/security"
-	"v.io/x/js.core/test_service"
-	_ "v.io/x/ref/runtime/factories/generic"
-)
-
-// openAuthorizer allows RPCs from all clients.
-type openAuthorizer struct{}
-
-func (openAuthorizer) Authorize(*context.T, security.Call) error {
-	return nil
-}
-
-type testServiceDispatcher struct {
-	cache           interface{}
-	errorThrower    interface{}
-	cancelCollector interface{}
-	native          interface{}
-	caveatedInvoker interface{}
-}
-
-func NewDispatcher() rpc.Dispatcher {
-	disp := &testServiceDispatcher{
-		cache:           test_service.CacheServer(NewCached()),
-		errorThrower:    test_service.ErrorThrowerServer(NewErrorThrower()),
-		cancelCollector: test_service.CancelCollectorServer(NewCancelCollector()),
-		native:          test_service.NativeTestServer(NewNativeTest()),
-		caveatedInvoker: test_service.InvokeMethodWithCaveatedIdentityServer(NewInvokeMethodWithCaveatedIdentityServer()),
-	}
-	return disp
-}
-
-func (sd *testServiceDispatcher) Lookup(_ *context.T, suffix string) (interface{}, security.Authorizer, error) {
-	authorizer := openAuthorizer{}
-
-	if strings.HasPrefix(suffix, "cache") {
-		return rpc.ReflectInvokerOrDie(sd.cache), authorizer, nil
-	}
-
-	if strings.HasPrefix(suffix, "errorThrower") {
-		return rpc.ReflectInvokerOrDie(sd.errorThrower), authorizer, nil
-	}
-
-	if strings.HasPrefix(suffix, "serviceToCancel") {
-		return rpc.ReflectInvokerOrDie(sd.cancelCollector), authorizer, nil
-	}
-
-	if strings.HasPrefix(suffix, "native") {
-		fmt.Println("got call to native")
-		return rpc.ReflectInvokerOrDie(sd.native), authorizer, nil
-	}
-
-	if strings.HasPrefix(suffix, "caveatedInvoker") {
-		return rpc.ReflectInvokerOrDie(sd.caveatedInvoker), authorizer, nil
-	}
-
-	return rpc.ReflectInvokerOrDie(sd.cache), authorizer, nil
-}
diff --git a/package.json b/package.json
index 3c5968f..d80101f 100644
--- a/package.json
+++ b/package.json
@@ -4,40 +4,27 @@
   "version": "0.1.0",
   "main": "./src/vanadium",
   "dependencies": {
-    "is-browser": "^2.0.1",
-    "ws": "~0.4.31",
-    "xtend": "^4.0.0",
-    "eventemitter2": "~0.4.14",
-    "lru-cache": "~2.5.0",
-    "minimatch": "~2.0.1",
-    "es6-shim": "^0.20.2",
+    "domready": "~1.0.8",
+    "es6-promise": "~2.1.1",
+    "es6-shim": "~0.35.0",
+    "eventemitter2": "~1.0.0",
+    "format": "~0.2.2",
     "inherits": "~2.0.1",
-    "format": "~0.2.1",
-    "randombytes": "2.0.1",
-    "domready": "~1.0.7",
-    "es6-promise": "~2.1.1"
+    "is-browser": "~2.0.1",
+    "lru-cache": "~4.0.1",
+    "minimatch": "~3.0.0",
+    "randombytes": "~2.0.3",
+    "ws": "~1.0.1",
+    "xtend": "~4.0.1"
   },
   "devDependencies": {
-    "node-static": "^0.7.4",
-    "browserify": "^8.1.1",
-    "child-killer": "~1.0.0",
-    "comandante": "0.0.1",
-    "debug": "^2.1.1",
-    "dependency-check": "^1.1.5",
-    "envify": "^3.2.0",
-    "ink-docstrap": "~0.4.12",
-    "jsdoc": "^3.3.0-alpha9",
-    "jshint": "^2.6.0",
-    "minimist": "^1.1.0",
-    "mkdirp": "^0.5.0",
-    "prova": "aghassemi/prova#0.0.4",
-    "run-parallel": "^1.0.0",
-    "which": "^1.0.5",
-    "esprima": "~1.2.2",
-    "tap-xunit": "~1.2.1",
-    "uglifyify": "~3.0.1",
-    "exorcist": "~0.1.6",
-    "bower": "1.3.12",
-    "grunt-cli": "0.1.13"
+    "bower": "~1.7.7",
+    "debug": "~2.2.0",
+    "dependency-check": "~2.5.1",
+    "ink-docstrap": "~1.1.4",
+    "jsdoc": "~3.4.0",
+    "jshint": "~2.9.1",
+    "tape": "~4.5.1",
+    "tap-xunit": "~1.3.1"
   }
 }
diff --git a/test/integration/default-blessing-regex.js b/test/integration/default-blessing-regex.js
deleted file mode 100644
index e883fe0..0000000
--- a/test/integration/default-blessing-regex.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = new RegExp('^test:child.*');
diff --git a/test/integration/default-config.js b/test/integration/default-config.js
deleted file mode 100644
index 7fc3bb5..0000000
--- a/test/integration/default-config.js
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var isBrowser = require('is-browser');
-
-// Use 'null' in browser to use nacl plugin.
-var wspr = isBrowser ? null : 'http://' + process.env.WSPR_ADDR;
-
-module.exports = {
-  wspr: wspr
-};
diff --git a/test/integration/get-service.js b/test/integration/get-service.js
deleted file mode 100644
index 55a0752..0000000
--- a/test/integration/get-service.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var vanadium = require('../../');
-var config = require('./default-config');
-
-module.exports = service;
-
-// DRYs up test code by wrapping the default success case for:
-//
-//    vanadium.init() -> runtime.bindTo() -> assertions -> runtime.close()
-//
-// To make a connection to the default integration test wspr instance and
-// bind to a service use:
-//
-//     service('test_service/cache', function(err, ctx, cache, end, runtime) {
-//       assert.error(err)
-//
-//       // your assertions here...
-//
-//       // use the `end` function to close the underlying runtime/wspr
-//       // connection and end your test run.
-//       end(assert)
-//     })
-//
-function service(name, callback) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      return callback(err);
-    }
-
-    var ctx = runtime.getContext();
-    runtime.getClient().bindTo(ctx, name, function(err, service) {
-      callback(err, ctx, service, end, runtime);
-    });
-
-    // hoisted and passed as the last argument to the callback argument.
-    function end(assert) {
-      if (typeof assert === 'function') {
-        return runtime.close(assert);
-      } else if (!! assert.end && typeof assert.end === 'function') {
-        return runtime.close(function(err) {
-          assert.error(err, 'should not error on runtime.close(...)');
-          assert.end();
-        });
-      } else {
-        var message = 'end(callback) requires a callback or assert object';
-        throw new Error(message);
-      }
-    }
-  });
-}
diff --git a/test/integration/runner.js b/test/integration/runner.js
deleted file mode 100644
index 21558c7..0000000
--- a/test/integration/runner.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var debug = require('debug')('integration-runner');
-var extend = require('xtend');
-var ServiceRunner = require('../services/run-services');
-var serviceRunner;
-var spawn = require('child_process').spawn;
-
-var argv = require('minimist')(process.argv.slice(2), {
-  '--': true,
-  default: {services: ''}
-});
-
-process.on('uncaughtException', function(err) {
-  console.error('Uncaught exception: ' + err);
-  stop(err);
-});
-process.on('SIGINT', stop);
-
-// Spawn test command and stop on exit.
-function runTests() {
-  debug('running tests');
-  var debugEnv = {
-    DEBUG: argv.debug || process.env.DEBUG || '',
-    DEBUG_COLORS: true
-  };
-  var env = extend(process.env, serviceRunner.env, debugEnv);
-
-  var command = argv['--'];
-  var name = command[0];
-  var args = command.slice(1);
-  var proc = spawn(name, args, {env: env});
-
-  // Pipe the test's stdout and stderr to the parent process.
-  proc.stdout.pipe(process.stdout);
-  proc.stderr.pipe(process.stderr);
-  proc.on('error', function(err) {
-    debug('test errored');
-    stop(err);
-  });
-
-  // NOTE: 'exit' is better than 'close' in this context since close can be
-  // emitted multiple times (since multiple processes might share the same
-  // stdio streams)
-  proc.on('exit', function(code, signal) {
-    debug('test process exited - code: %s, signal: %s', code, signal);
-    stop(null, code);
-  });
-}
-
-// Stop all services and exit.
-function stop(err, code) {
-  if (err) {
-    code = code || 1;
-    console.error(err);
-    console.error(err.stack);
-  } else {
-    code = code || 0;
-  }
-
-  serviceRunner.stop(function(err) {
-    if (err) {
-      debug('warning: serviceRunner.stop() failed! exiting anyways: %s', code);
-    } else {
-      debug('runner stopped, exiting: %s', code);
-    }
-    process.exit(code);
-  });
-}
-
-// Starts the "servicerunner" service as well as any services specified in the
-// --services command line flag, then runs tests.
-function startServicesAndRunTests() {
-  var services = [];
-  if (argv.services && argv.services.length) {
-    services = argv.services.split(',');
-  }
-
-  debug('starting core services and: ' + services.join(', '));
-
-  // NOTE(sadovsky): There are all sorts of race conditions and unhandled edge
-  // cases in this code.
-  serviceRunner = new ServiceRunner(services);
-  serviceRunner
-    .on('error', stop)
-    .start(function(err) {
-      if (err) {
-        return stop(err);
-      }
-      runTests();
-    });
-}
-
-startServicesAndRunTests();
diff --git a/test/integration/serve.js b/test/integration/serve.js
deleted file mode 100644
index 44c4b85..0000000
--- a/test/integration/serve.js
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var vanadium = require('../../');
-var config = require('./default-config');
-var extend = require('xtend');
-var defaults = {
-  autoBind: true
-};
-
-module.exports = serve;
-
-// # serve(name, dispatcher, callback)
-//
-// DRYs up test code by wrapping the default success case for:
-//
-//    vanadium.init() ->
-//    runtime.server(name, dispatcher, ...) ->
-//    runtime.bindTo(ctx, name, ...) -> r
-//    assertions ->
-//    runtime.close()
-//
-// To make a connection to the default integration test wspr instance and
-// bind to a service use:
-//
-//     serve('test/service', dispatcher, function(err, res) {
-//       res.service.returnBuiltInError(function(err) {
-//         assert.error(err)
-//
-//         // your assertions here...
-//
-//         // `res` has several attributes to make your life easier:
-//         //
-//         // * runtime: vanadium runtime object
-//         // * config: config passed into vanadium.init()
-//         // * server: returned from runtime._getServer()
-//         // * service: returned from runtime.bindTo(name, ...)
-//         // * end: the end function to shut down the connection
-//
-//
-//         // use the `res.end` function to close the underlying runtime/wspr
-//         // connection and end your test run.
-//         res.end(assert);
-//       })
-//     })
-//
-function serve(name, dispatcher, callback) {
-  var options = defaults;
-  var serverOption;
-  // alternate: serve(options, callback)
-  if (typeof name === 'object') {
-    options = extend(defaults, name);
-    callback = dispatcher;
-    name = options.name;
-    dispatcher = options.dispatcher;
-    serverOption = options.serverOption;
-  }
-
-  vanadium.init(config, function(err, runtime) {
-    // basic response used for failures where we want .close and .end to
-    // still work:
-    var basicRes = {
-      end: end,
-      close: close
-    };
-
-    if (err) {
-      return callback(err, basicRes);
-    }
-
-    runtime.newDispatchingServer(name, dispatcher, serverOption,
-      function(err, server) {
-
-        if (err) {
-          return callback(err, basicRes);
-        }
-
-        var ctx = runtime.getContext();
-
-        waitUntilResolve();
-
-        // The server is not gauranteed to be mounted by the time the
-        // serve call finishes.  We should wait until the name
-        // resolves before calling the callback.  As a side a benefit,
-        // this also speeds up the browser tests, because browspr is
-        // quicker than wspr and so it is more likely to return before
-        // the server is mounted.  The normal backoff for bindTo
-        // starts at 100ms, but this code only waits a few
-        // milliseconds.  TODO(mattr): I have temporarily set this to
-        // retry at longer intervals. In practice this previous code
-        // (which checked every 10ms) allowed the server up to 0.5s or
-        // so to mount through the proxy.  In the new RPC system it
-        // can take a bit longer.  I upped the number of attempts and
-        // retry time to compensate.  We will eventually optimize this
-        // time back down.
-        function waitUntilResolve() {
-          var ns = runtime.getNamespace();
-          var count = 0;
-          runResolve();
-
-          function runResolve() {
-            ns.resolve(ctx, name, function(err, s) {
-              if (err || s.length === 0) {
-                count++;
-                if (count === 20) {
-                  return callback(
-                    new Error(
-                      'Timed out waiting for resolve in serve.js: ' + err),
-                    basicRes);
-                }
-                return setTimeout(runResolve, 100);
-              }
-              completeServe();
-            });
-          }
-        }
-
-        function completeServe() {
-          var res = {
-            runtime: runtime,
-            config: config,
-            close: close,
-            end: end,
-            server: server
-          };
-
-          if (options.autoBind === false) {
-            return callback(err, res, end);
-          }
-
-          function onBind(err, service) {
-            if (err) {
-              return callback(err, basicRes);
-            }
-
-            res.service = service;
-            callback(err, res, end);
-          }
-          var client = runtime.getClient();
-          client.bindTo(ctx, name, onBind);
-        }
-      });
-
-    function close(callback) {
-      return runtime.close(callback);
-    }
-
-    // hoisted and passed as the last argument to the callback argument.
-    function end(assert, errorMsg) {
-      if (!!assert.end && typeof assert.end === 'function') {
-        return close(function(err) {
-          assert.error(err, 'should not error on runtime.close(...)');
-          assert.end(errorMsg);
-        });
-      } else {
-        var message = 'end(callback) requires an assert object';
-        throw new Error(message);
-      }
-    }
-  });
-}
diff --git a/test/integration/test-authorizer.js b/test/integration/test-authorizer.js
deleted file mode 100644
index f88ea69..0000000
--- a/test/integration/test-authorizer.js
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var vanadium = require('../..');
-var test = require('prova');
-var Deferred = require('../../src/lib/deferred');
-var serve = require('./serve');
-var access = vanadium.security.access;
-var permissionsAuthorizer = vanadium.security.access.permissionsAuthorizer;
-var allowEveryoneAuthorizer = vanadium.security.access.allowEveryoneAuthorizer;
-
-var service = {
-  call: function(ctx, serverCall, arg) {
-    return Promise.resolve(1);
-  }
-};
-
-function createPromiseDispatcher(authorizer, tags) {
-  function auth(ctx, call) {
-    if (call.method === '__Signature') {
-      return null;
-    }
-    return authorizer(ctx, call);
-  }
-  var desc = {
-    methods: [
-      {
-        name: 'Call',
-        tags: tags
-      }
-    ]
-  };
-  service._serviceDescription = desc;
-  return function callbackDispatcher(suffix) {
-    return {
-      service: service,
-      authorizer: auth,
-    };
-  };
-}
-
-
-function testErrorCase(assert, authorizer, tags, isPromise) {
-  serve({
-    name: 'authorizerTestService',
-    autoBind: false,
-    dispatcher: isPromise ?
-      createPromiseDispatcher(authorizer, tags) :
-      createCallbackDispatcher(authorizer, tags)
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'authorizerTestService/auth').then(function(service) {
-      service.call(ctx, 'foo').then(function(value) {
-        assert.error(new Error('call should not have succeeded. res:' + value));
-        res.end(assert);
-      }).catch(function(err) {
-        assert.ok(err);
-        res.end(assert);
-      });
-    }, function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-}
-
-test('Test errors are properly returned',
-function(assert) {
-  testErrorCase(assert, function (ctx, call) {
-    var def = new Deferred();
-    function reject() {
-      def.reject(new Error('unauthorized'));
-    }
-    setTimeout(reject, 0);
-    return def.promise;
-  }, [], true);
-});
-
-function createCallbackDispatcher(authorizer, tags) {
-  function auth(ctx, call, cb) {
-    if (call.method === '__Signature') {
-      cb(null);
-    }
-    authorizer(ctx, call, cb);
-  }
-  var desc = {
-    methods: [
-      {
-        name: 'Call',
-        tags: tags
-      }
-    ]
-  };
-  service._serviceDescription = desc;
-  return function callbackDispatcher(suffix) {
-    return {
-      service: service,
-      authorizer: auth,
-    };
-  };
-}
-
-function testSuccessCase(assert, authorizer, tags, isPromise) {
-  serve({
-    name: 'authorizerTestService',
-    autoBind: false,
-    dispatcher: isPromise ?
-      createPromiseDispatcher(authorizer, tags) :
-      createCallbackDispatcher(authorizer, tags)
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'authorizerTestService/auth').then(function(service) {
-      return service.call(ctx, 'foo');
-    }).then(function() {
-      assert.pass('RPC resolved');
-      res.end(assert);
-    }).catch(function(err) {
-      assert.fail('RPC rejected with error:' + err.toString());
-      res.end(assert);
-    });
-  });
-}
-
-
-test('Test successes are handled', function(assert) {
-  testSuccessCase(assert, function (ctx, call, cb) {
-    process.nextTick(cb.bind(null, null));
-  });
-});
-
-test('Test proper context is passed to authorizer', function(assert) {
-  var defaultBlessingRegex = require('./default-blessing-regex');
-
-  testSuccessCase(assert, function (ctx, call, cb) {
-    if (!defaultBlessingRegex.test(call.remoteBlessingStrings[0])) {
-      return cb(new Error('unknown remote blessings ' +
-        call.remoteBlessingStrings));
-    } else if (!defaultBlessingRegex.test(call.localBlessingStrings[0])) {
-      cb(new Error('unknown local blessings ' + call.localBlessingStrings));
-    } else if (call.method !== 'call') {
-      return cb(new Error('wrong method ' + call.method));
-    } else if (call.suffix !== 'auth') {
-      return cb(new Error('wrong suffix ' + call.suffix));
-    }
-    // TODO(bjornick): Fix the endpoint format
-    // } else if (call.remoteEndpoint === endpoint ||
-    //     !call.remoteEndpoint) {
-    //   return new Error('bad endpoint ' + call.remoteEndpoint);
-    // } else if  (call.localEndpoint !== endpoint ||
-    //     !call.localEndpoint) {
-    //   return new Error('bad endpoint ' + call.localEndpoint);
-    // }
-
-    cb();
-  });
-});
-
-test('Test passing in labels', function(assert) {
-  testSuccessCase(assert, function(ctx, call, cb) {
-    if (call.methodTags[0] !== 'foo') {
-      return cb(new Error('wrong label ' + call.label));
-    }
-    return cb();
-  }, ['foo']);
-});
-
-var perms = {
-  foo: {
-    in: ['...']
-  },
-  bar: {}
-};
-var tagPermsAuthorizer = permissionsAuthorizer(perms, access.Tag);
-
-
-test('Test permissionsAuthorizer (public key) - success', function(assert) {
-  var tagBar = new access.Tag('Bar');
-
-  // Passes because we reuse the same public key, despite the tag not being ok.
-  testSuccessCase(assert, tagPermsAuthorizer, [tagBar], true);
-});
-
-test('Test permissionsAuthorizer (tag) - success', function(assert) {
-  var tagFoo = new access.Tag('Foo');
-
-  function diffPublicKeyPermsAuthorizer(ctx, call) {
-    // get rid of public key, just for this example
-    call.remoteBlessings.publicKey = '';
-    tagPermsAuthorizer(ctx, call);
-  }
-
-  // Everyone is allowed via the Foo tag.
-  testSuccessCase(assert, diffPublicKeyPermsAuthorizer, [tagFoo], true);
-});
-
-test('Test permissionsAuthorizer (tag) - failure', function(assert) {
-  var tagBar = new access.Tag('Bar');
-
-  function diffPublicKeyPermsAuthorizer(ctx, call) {
-    // get rid of public key, just for this example to demonstrate failure
-    call.remoteBlessings.publicKey = '';
-    tagPermsAuthorizer(ctx, call);
-  }
-
-  // Nobody is allowed via the Bar tag.
-  testErrorCase(assert, diffPublicKeyPermsAuthorizer, [tagBar], true);
-});
-
-test('Test allowEveryoneAuthorizer() - success', function(assert) {
-  testSuccessCase(assert, allowEveryoneAuthorizer(), [], true);
-});
diff --git a/test/integration/test-bless.js b/test/integration/test-bless.js
deleted file mode 100644
index 2ce1ba1..0000000
--- a/test/integration/test-bless.js
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var config = require('./default-config');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var Blessings = require('../../src/security/blessings');
-var serve = require('./serve');
-var security = vanadium.security;
-
-function validateBlessings(t, blessings) {
-  t.ok(blessings instanceof Blessings, 'Blessings have correct type');
-  t.ok(blessings.chains.length > 0, 'Non-empty chains');
-  t.ok(blessings.publicKey, 'Public key is set');
-}
-
-test('Test bless self without Caveat', function(t) {
-  var rt;
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    rt = runtime;
-
-    runtime.principal.blessSelf(runtime.getContext(), 'blessedname')
-    .then(function(blessings) {
-      validateBlessings(t, blessings);
-      t.equal(blessings.chains.length, 1, 'Has exactly one chain');
-      t.equal(blessings.chains[0].length, 1, 'Chain has exactly one blessing');
-      t.equal(blessings.chains[0][0].extension, 'blessedname',
-        'Has correct extension');
-      t.equal(blessings.chains[0][0].caveats.length, 0, 'Has no caveats');
-      rt.close(t.end);
-    }).catch(function(err) {
-      t.error(err);
-      rt.close(t.end);
-    });
-  });
-});
-
-test('Test bless self with Caveat', function(t) {
-  var rt;
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    rt = runtime;
-
-    var cav = security.createExpiryCaveat(new Date());
-    runtime.principal.blessSelf(runtime.getContext(), 'blessedname', cav,
-      function(err, blessings) {
-      t.error(err);
-      validateBlessings(t, blessings);
-      t.equal(blessings.chains.length, 1, 'Has exactly one chain');
-      t.equal(blessings.chains[0].length, 1, 'Chain has exactly one blessing');
-      t.equal(blessings.chains[0][0].extension, 'blessedname',
-        'Has correct extension');
-      t.equal(blessings.chains[0][0].caveats.length, 1, 'Has one caveat');
-      t.deepEqual(blessings.chains[0][0].caveats[0], cav, 'Has correct caveat');
-      rt.close(t.end);
-    });
-  });
-});
-
-test('Test bless without Caveat from server', function(t) {
-  var service = {
-    method: function(ctx, serverCall, cb) {
-      var secCall = serverCall.securityCall;
-      var rt = vanadium.runtimeForContext(ctx);
-      var remoteKey = secCall.remoteBlessings.publicKey;
-      rt.principal.bless(ctx, remoteKey, secCall.localBlessings,
-       'ext', function(err) {
-         t.ok(err, 'Expected at least one caveat must be specified error');
-         cb(null, null);
-       });
-    }
-  };
-
-  serve('testing/blessnocav', leafDispatcher(service),
-    function(err, res) {
-      if (err) {
-        res.end(t, err);
-        return;
-      }
-
-      res.service.method(res.runtime.getContext(), function(err) {
-        t.error(err);
-        res.end(t);
-      });
-  });
-});
-
-test('Test bless with Caveat from server', function(t) {
-  var service = {
-    method: function(ctx, serverCall, cb) {
-      var rt = vanadium.runtimeForContext(ctx);
-      var secCall = serverCall.securityCall;
-      var remoteKey = secCall.remoteBlessings.publicKey;
-      var expiryCav = security.createExpiryCaveat(new Date(Date.now() - 1000));
-      var constCav = security.createConstCaveat(true);
-      rt.principal.bless(ctx, remoteKey, secCall.localBlessings,
-       'ext', expiryCav, constCav, function(err, blessings) {
-         t.notOk(err, 'No error expected during bless');
-         validateBlessings(t, blessings);
-         for (var i = 0; i < blessings.chains.length; i++) {
-           var chain = blessings.chains[i];
-           t.equal(chain[chain.length - 1].extension, 'ext',
-            'Expected final extension to match');
-           t.deepEqual(chain[chain.length - 1].caveats.sort(objectSorter),
-             [expiryCav, constCav].sort(objectSorter),
-             'Has correct caveats');
-         }
-         cb(null, null);
-       });
-    }
-  };
-
-  serve('testing/blesscav', leafDispatcher(service),
-    function(err, res) {
-      if (err) {
-        res.end(t, err);
-        return;
-      }
-
-      res.service.method(res.runtime.getContext(), function(err) {
-        t.error(err);
-        res.end(t);
-      });
-  });
-});
-
-test('Test bless without Caveat from client (with Granter)', function(t) {
-  var expectedBlessing;
-
-  var service = {
-    method: function(ctx, serverCall) {
-      t.ok(serverCall.grantedBlessings, 'Expect to get granted blessing');
-      t.deepEqual(serverCall.grantedBlessings, expectedBlessing,
-        'Expect to get blessing that was granted.');
-      return 'aResponse';
-    }
-  };
-
-
-  serve('testing/clientblessgranter', leafDispatcher(service),
-    function(err, res) {
-      if (err) {
-        t.end(err);
-        return;
-      }
-
-      var client = res.runtime.getClient();
-      var fiveSecondsInFuture = new Date(Date.now() + 5000);
-      var granterCalled = false;
-      var granterOption = client.callOption({
-        granter: function(ctx, call, cb) {
-          granterCalled = true;
-          res.runtime.principal.bless(res.runtime.getContext(),
-            call.remoteBlessings.publicKey,
-            call.localBlessings,
-            'ext',
-            security.createExpiryCaveat(fiveSecondsInFuture),
-            function(err, blessing) {
-              expectedBlessing = blessing;
-              cb(err, blessing);
-            });
-        }
-      });
-
-      res.service.method(res.runtime.getContext(), granterOption, function(err){
-        t.ok(granterCalled, 'Granter should be called');
-        t.error(err);
-        res.runtime.close(t.end);
-      });
-    });
-});
-
-// Tests add roots by trying to invoke a method with a blessing not in the
-// roots and then adding it to the roots.
-test('Test add roots', function(t) {
-  var service = {
-    method: function(ctx, serverCall) {
-      return 'aResponse';
-    }
-  };
-
-  var authorizer = function(ctx, securityCall) {
-    var hasBlessedName = securityCall.remoteBlessingStrings.some(function(str) {
-      return str === 'blessedname';
-    });
-    if (hasBlessedName) {
-      return Promise.resolve();
-    }
-    return Promise.reject(new Error('Expected blessedname in blessings'));
-  };
-
-  serve('testing/addroots', leafDispatcher(service, authorizer),
-    function(err, res) {
-    if (err) {
-      t.end(err);
-      return;
-    }
-
-    var runtime = res.runtime;
-    var ctx = runtime.getContext();
-    var blessings;
-    var origDefault;
-    var origTripDot;
-    runtime.principal.blessSelf(ctx, 'blessedname')
-    .then(function(selfBlessings) {
-      blessings = selfBlessings;
-      validateBlessings(t, blessings);
-      // Get the original blessings used for '...' and save them for later.
-      return runtime.principal.blessingStore.forPeer(ctx, '...');
-    }).then(function(oldBlessings) {
-      origTripDot = oldBlessings;
-      // Replace it with the union of the old and the new self-blessing
-      return vanadium.security.unionOfBlessings(ctx, oldBlessings, blessings);
-    }).then(function(unionedBlessings) {
-      return runtime.principal.blessingStore.set(ctx, unionedBlessings, '...');
-    }).then(function() {
-      // Get the original default blessings and save them for later.
-      return runtime.principal.blessingStore.getDefault(ctx);
-    }).then(function(oldDefault) {
-      origDefault = oldDefault;
-      // Replace it with the union of the old and the new self-blessing
-      return vanadium.security.unionOfBlessings(ctx, oldDefault, blessings);
-    }).then(function(unionedBlessings) {
-      return runtime.principal.blessingStore.setDefault(ctx, unionedBlessings);
-    }).catch(function(err) {
-      t.error('Failed to configure blessings: ' + err);
-    }).then(function() {
-      // Attempt to call the method; it should fail.
-      return res.service.method(ctx);
-    }).then(function() {
-      t.error('Method call unexpectedly succeeded without valid roots');
-    }).catch(function() {
-      return runtime.principal.addToRoots(ctx, blessings);
-    }).then(function() {
-      // Call the method after addToRoots; it should succeed.
-      return res.service.method(ctx);
-    }).then(function(result) {
-      t.equal(result, 'aResponse', 'Got correct result');
-    }).catch(function(err) {
-      t.error('either blessSelf or addToRoots errored ' + err);
-    }).then(function() {
-      // Reset the blessingStore for default blessings.
-      return runtime.principal.blessingStore.setDefault(ctx, origDefault);
-    }).then(function() {
-      // Reset the blessingStore for peer '...'
-      return runtime.principal.blessingStore.set(ctx, origTripDot, '...');
-    }).catch(function(err) {
-      t.error('Unexpected error resetting blessing store');
-    }).then(function(){
-      res.end(t);
-    });
-  });
-});
-
-function objectSorter(a, b) {
-  return JSON.stringify(a) < JSON.stringify(b);
-}
diff --git a/test/integration/test-blessings-util.js b/test/integration/test-blessings-util.js
deleted file mode 100644
index 48d1a5a..0000000
--- a/test/integration/test-blessings-util.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var config = require('./default-config');
-var security = vanadium.security;
-
-function validateUnionedBlessings(t, blessings) {
-  t.equal(blessings.chains.length, 2, 'Should have 2 chains');
-  t.equal(blessings.chains[0].length, 1, 'First chain has 1 cert');
-  t.equal(blessings.chains[1].length, 1, 'Second chain has 1 cert');
-  t.equal(blessings.chains[0][0].extension, 'blessedname1',
-    'Get first extension on first chain');
-  t.equal(blessings.chains[1][0].extension, 'blessedname2',
-    'Get second extension on second chain');
-  t.deepEqual(blessings.chains[0][0].publicKey, blessings.publicKey,
-    'First public key matches blessing key');
-  t.deepEqual(blessings.chains[1][0].publicKey, blessings.publicKey,
-    'Second public key matches blessing key');
-}
-
-test('Test union of blessings', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessSelf(runtime.getContext(), 'blessedname1')
-    .then(function(blessings1) {
-      return runtime.principal.blessSelf(runtime.getContext(), 'blessedname2')
-      .then(function(blessings2) {
-        return security.unionOfBlessings(
-          runtime.getContext(), blessings1, blessings2);
-      });
-    })
-    .then(function(unionedBlessings) {
-      validateUnionedBlessings(t, unionedBlessings);
-      runtime.close(t.end);
-    }).catch(function(err) {
-      runtime.close();
-      t.end(err);
-    });
-  });
-});
-
-test('Test union of blessings with differing public keys', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessSelf(runtime.getContext(), 'blessedname1')
-    .then(function(blessings1) {
-      return runtime.principal.blessSelf(runtime.getContext(), 'blessedname2')
-      .then(function(blessings2) {
-        // modify the public key so it doesn't match
-        blessings2.chains[0][0].publicKey[0] -= 1;
-        return security.unionOfBlessings(
-          runtime.getContext(), blessings1, blessings2);
-      });
-    })
-    .then(function(unionedBlessings) {
-      runtime.close();
-      t.end('Should have failed due to public keys not matching');
-    }).catch(function(err) {
-      t.ok(err instanceof Error, 'Got error');
-      t.ok(err.toString().indexOf('cannot create union of blessings ' +
-        'bound to different public keys') !== -1,
-        'Should get message about keys differing');
-      runtime.close(t.end);
-    });
-  });
-});
diff --git a/test/integration/test-blessingstore.js b/test/integration/test-blessingstore.js
deleted file mode 100644
index 2ad5d2f..0000000
--- a/test/integration/test-blessingstore.js
+++ /dev/null
@@ -1,383 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var Blessings = require('../../src/security/blessings');
-var config = require('./default-config');
-
-function validateBlessings(t, blessings) {
-  t.ok(blessings instanceof Blessings, 'Blessings have correct type');
-  t.ok(blessings.chains.length > 0, 'Non-empty chains');
-  t.ok(blessings.publicKey, 'Public key is set');
-}
-
-test('Test blessing store set (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-    var blessSelfResult;
-    runtime.principal.blessSelf(runtime.getContext(), 'ext')
-    .then(function(blessings) {
-      validateBlessings(t, blessings);
-      blessSelfResult = blessings;
-
-      return runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern');
-    }).then(function() {
-      return runtime.principal.blessingStore.set(runtime.getContext(),
-        blessSelfResult, 'fake:remote:pattern');
-    }).then(function(firstBlessing) {
-      t.deepEqual(firstBlessing, blessSelfResult,
-        'Should get first blessings back');
-      validateBlessings(t, firstBlessing);
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'either blessSelf or blessingStore.set errored');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test blessing store set (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-    var blessSelfResult;
-    runtime.principal.blessSelf(runtime.getContext(), 'ext',
-      function(err, blessings) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      validateBlessings(t, blessings);
-      blessSelfResult = blessings;
-
-      runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern',
-        function(err) {
-        if (err) {
-          t.error(err);
-          runtime.close(t.end);
-          return;
-        }
-        runtime.principal.blessingStore.set(runtime.getContext(),
-          blessSelfResult, 'fake:remote:pattern',
-          function(err, firstBlessing) {
-          if (err) {
-            t.error(err);
-            runtime.close(t.end);
-            return;
-          }
-          t.deepEqual(firstBlessing, blessSelfResult,
-            'Should get first blessings back');
-          validateBlessings(t, firstBlessing);
-          runtime.close(t.end);
-        });
-      });
-    });
-  });
-});
-
-test('Test blessing store for peer (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessSelf(runtime.getContext(), 'ext')
-    .then(function(blessings) {
-      validateBlessings(t, blessings);
-
-      return runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern');
-    }).then(function() {
-      return runtime.principal.blessingStore.forPeer(runtime.getContext(),
-        'fake:remote:pattern');
-    }).then(function(firstBlessing) {
-      validateBlessings(t, firstBlessing);
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'error in one of the async calls');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test blessing store for peer (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessSelf(runtime.getContext(), 'ext',
-      function(err, blessings) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      validateBlessings(t, blessings);
-
-      runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern',
-        function(err) {
-          if (err) {
-            t.error(err);
-            runtime.close(t.end);
-            return;
-          }
-          return runtime.principal.blessingStore.forPeer(runtime.getContext(),
-            'fake:remote:pattern',
-            function(err, firstBlessing) {
-              validateBlessings(t, firstBlessing);
-              runtime.close(t.end);
-          });
-      });
-    });
-  });
-});
-
-test('Test blessing store set/get default (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    var blessSelfResult;
-    var oldDefaultBlessings;
-    runtime.principal.blessSelf(runtime.getContext(), 'ext')
-    .then(function(blessings) {
-      validateBlessings(t, blessings);
-      blessSelfResult = blessings;
-
-      return runtime.principal.blessingStore.getDefault(runtime.getContext());
-    }).then(function(blessings) {
-      oldDefaultBlessings = blessings;
-      validateBlessings(t, oldDefaultBlessings);
-      return runtime.principal.blessingStore.setDefault(
-        runtime.getContext(), blessSelfResult);
-    }).then(function() {
-      return runtime.principal.blessingStore.getDefault(runtime.getContext());
-    }).then(function(defaultBlessings) {
-      validateBlessings(t, defaultBlessings);
-      t.deepEqual(defaultBlessings, blessSelfResult,
-        'Should get default blessings back');
-
-      // Restore original default blessings
-      return runtime.principal.blessingStore.setDefault(
-        runtime.getContext(), oldDefaultBlessings);
-    }).then(function() {
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'error in one of the async calls');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test blessing store set/get default (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    var blessSelfResult;
-    var oldDefaultBlessings;
-    runtime.principal.blessSelf(runtime.getContext(), 'ext',
-      function(err, blessings) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      validateBlessings(t, blessings);
-      blessSelfResult = blessings;
-
-      runtime.principal.blessingStore.getDefault(runtime.getContext(),
-        function(err, blessings) {
-        if (err) {
-          t.error(err);
-          runtime.close(t.end);
-          return;
-        }
-        oldDefaultBlessings = blessings;
-        validateBlessings(t, oldDefaultBlessings);
-
-        runtime.principal.blessingStore.setDefault(runtime.getContext(),
-          blessSelfResult, function(err) {
-          runtime.principal.blessingStore.getDefault(runtime.getContext(),
-            function(err, defaultBlessings) {
-            if (err) {
-              t.error(err);
-              runtime.close(t.end);
-              return;
-            }
-            validateBlessings(t, defaultBlessings);
-            t.deepEqual(defaultBlessings, blessSelfResult,
-              'Should get default blessings back');
-
-            // Restore original default blessings
-            runtime.principal.blessingStore.setDefault(runtime.getContext(),
-              oldDefaultBlessings, function(err) {
-              t.error(err, 'error setting default');
-              runtime.close(t.end);
-            });
-          });
-        });
-      });
-    });
-  });
-});
-
-test('Test blessing store get public key (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessingStore.getPublicKey(runtime.getContext())
-    .then(function(publicKey) {
-      t.ok(publicKey instanceof Uint8Array && publicKey.length > 0,
-        'got public key');
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'error in getPublicKey()');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test blessing store get public key (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessingStore.getPublicKey(runtime.getContext(),
-      function(err, publicKey) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      t.ok(publicKey instanceof Uint8Array && publicKey.length > 0,
-        'got public key');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test peer blessings (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-    runtime.principal.blessSelf(runtime.getContext(), 'ext')
-    .then(function(blessings) {
-      validateBlessings(t, blessings);
-
-      return runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern');
-    }).then(function() {
-      return runtime.principal.blessingStore.getPeerBlessings(
-        runtime.getContext());
-    }).then(function(peerBlessings) {
-      t.ok(peerBlessings instanceof Map, 'Peer blessings is a map');
-      t.ok(peerBlessings.size > 0, 'Non-empty peer blessings');
-      peerBlessings.forEach(function(blessings, pattern) {
-        t.ok(typeof pattern === 'string' && pattern !== '',
-          'got string pattern');
-        validateBlessings(t, blessings);
-      });
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'error in getPublicKey()');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test peer blessings (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-    runtime.principal.blessSelf(runtime.getContext(), 'ext',
-      function(err, blessings) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      validateBlessings(t, blessings);
-
-      runtime.principal.blessingStore.set(runtime.getContext(),
-        blessings, 'fake:remote:pattern', function(err){
-        if (err) {
-          t.error(err);
-          runtime.close(t.end);
-          return;
-        }
-        runtime.principal.blessingStore.getPeerBlessings(runtime.getContext(),
-          function(err, peerBlessings) {
-          if (err) {
-            t.error(err);
-            runtime.close(t.end);
-            return;
-          }
-          t.ok(peerBlessings instanceof Map, 'Peer blessings is a map');
-          t.ok(peerBlessings.size > 0, 'Non-empty peer blessings');
-          peerBlessings.forEach(function(blessings, pattern) {
-            t.ok(typeof pattern === 'string' && pattern !== '',
-              'got string pattern');
-            validateBlessings(t, blessings);
-          });
-          runtime.close(t.end);
-        });
-      });
-    });
-  });
-});
-
-test('Test blessing store get debug string (promise case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessingStore.getDebugString(runtime.getContext())
-    .then(function(debugString) {
-      t.ok(typeof debugString === 'string' && debugString !== '',
-        'got blessing store debug string');
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.error(err, 'error in getDebugString()');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test blessing store get debug string (callback case)', function(t) {
-  vanadium.init(config, function(err, runtime) {
-    if (err) {
-      t.end(err);
-    }
-
-    runtime.principal.blessingStore.getDebugString(runtime.getContext(),
-      function(err, debugString) {
-      if (err) {
-        t.error(err);
-        runtime.close(t.end);
-        return;
-      }
-      t.ok(typeof debugString === 'string' && debugString !== '',
-        'got blessing store debug string');
-      runtime.close(t.end);
-    });
-  });
-});
diff --git a/test/integration/test-cancellation.js b/test/integration/test-cancellation.js
deleted file mode 100644
index ec9b9c1..0000000
--- a/test/integration/test-cancellation.js
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var service = require('./get-service');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var NO_TIMEOUT = require('../../src/rpc/constants').NO_TIMEOUT;
-var CanceledError = vanadium.verror.CanceledError;
-
-var errorId = new CanceledError(null).id;
-
-function run(ctx, err, collector, end, assert, id, runtime) {
-  if (err) {
-    return assert.end(err);
-  }
-
-  var timeout = 60 * 60 * 1000;
-  ctx = ctx.withTimeout(timeout);
-
-  collector.neverReturn(ctx, id).catch(function(err) {
-    if (err.id !== errorId) {
-      assert.fail(err);
-    }
-  });
-
-  ctx.waitUntilDone().catch(function(err) {
-    assert.ok(err instanceof CanceledError);
-  });
-  var dctx = runtime.getContext().withTimeout(60000);
-  collector.waitForStatus(dctx, id, 'running')
-    .then(function(serverTimeout) {
-      // Ensure that the server got the timeout we set.  We allow up to 10s
-      // of network delay.
-      if (serverTimeout > timeout || serverTimeout < timeout - 10000) {
-        assert.fail('serverTimeout and timeout differ by too much.  ' +
-                    'serverTimeout: ' + serverTimeout +
-                    ' timeout: ' + timeout);
-      }
-
-      // Now cancel the call and check that the server call got cancelled.
-      ctx.cancel();
-      return collector.waitForStatus(dctx, id, 'cancelled');
-    }).then(function(timeout) {
-      dctx.finish();
-      end(assert);
-    }).catch(function(err) {
-      dctx.cancel();
-      assert.error(err);
-      end(assert);
-    });
-}
-
-function newDispatcher() {
-  return leafDispatcher({
-    callInfo: {},
-    _processWaiters: function(key) {
-      var info = this.callInfo[key];
-      if (!info || !info.waiters) {
-        return;
-      }
-      var remaining = [];
-      for (var i = 0; i < info.waiters.length; i++) {
-        var waiter = info.waiters[i];
-        if (waiter.status === info.status) {
-          waiter.cb(null, info.timeout);
-        } else {
-          remaining.push(info);
-        }
-      }
-      info.waiters = remaining;
-    },
-    _onCancel: function(key, err) {
-      var info = this.callInfo[key];
-      info.status = 'cancelled';
-      this._processWaiters(key);
-      info.cb(err);
-    },
-    neverReturn: function(context, serverCall, key, cb) {
-      var info = this.callInfo[key];
-      if (!info) {
-        info = {};
-        this.callInfo[key] = info;
-      }
-      info.status = 'running';
-      info.timeout = NO_TIMEOUT;
-      var deadline = context.deadline();
-      if (deadline !== null) {
-        info.timeout = deadline - Date.now();
-      }
-      info.cb = cb;
-      this._processWaiters(key);
-
-      var server = this;
-      context.waitUntilDone().catch(function(err) {
-        server._onCancel(key, err);
-      });
-    },
-    waitForStatus: function(context, serverCall, key, status, cb) {
-      var info = this.callInfo[key];
-      if (!info) {
-        info = {
-          status: 'unknown'
-        };
-        this.callInfo[key] = info;
-      }
-      if (status === info.status) {
-        cb(null, info.timeout);
-        return;
-      }
-      if (!info.waiters) {
-        info.waiters = [];
-      }
-      info.waiters.push({status: status, cb: cb});
-    }
-  });
-}
-
-test('Test cancellation from JS client to Go server', function(assert) {
-  service('test_service/serviceToCancel', function(err, ctx, collector, end,
-                                                   runtime) {
-    ctx = ctx.withCancel();
-    run(ctx, err, collector, end, assert, 1, runtime);
-  });
-});
-
-test('Test cancellation from JS client to JS server', function(assert) {
-  serve('testing/serviceToCancel', newDispatcher(), function(err, res) {
-    if (err) {
-      assert.error(err);
-      assert.end();
-      return;
-    }
-    var ctx = res.runtime.getContext();
-    run(ctx, err, res.service, res.end, assert, 2, res.runtime);
-  });
-});
diff --git a/test/integration/test-caveat-validation.js b/test/integration/test-caveat-validation.js
deleted file mode 100644
index bfa1b27..0000000
--- a/test/integration/test-caveat-validation.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var testService = require('../vdl-out/v.io/x/js.core/test_service');
-var vdl = vanadium.vdl;
-
-// Service to be invoked
-function AServiceDef() {
-  this.aMethod = function(ctx, serverCall) {
-    return 'aResult';
-  };
-}
-AServiceDef.prototype = new testService.InvokableTestMethod();
-var aService = new AServiceDef();
-
-
-test('caveatValidation', function(t) {
-  var invokerName = 'test_service/caveatedInvoker';
-  var serveName = 'testing/example';
-
-  // Expected data to be passed to the caveat validator.
-  var expectedCaveatData = new testService.TestCaveatData({
-      a: 'a',
-      b: {
-        val: 9,
-        _wrappedType: true,
-        _type: {
-          name: 'NamedInt32',
-          kind: vdl.kind.INT32
-        }
-    }
-  });
-
-  // caveatValidator will validate caveats iff nextCaveatValidationResult
-  // is true
-  var nextCaveatValidationResult = true;
-  function caveatValidator(ctx, call, data) {
-    t.deepEqual(data, expectedCaveatData, 'validator receives correct data');
-    if (!nextCaveatValidationResult) {
-      throw new Error('Intentionally failing caveat validation');
-    }
-  }
-
-  // Serve a service providing aMethod().
-  var dispatcher = leafDispatcher(aService);
-  serve(serveName, dispatcher, function(err, res) {
-    if (err) {
-      res.end(t, 'error in serve: ' + err);
-      return;
-    }
-
-    // Register the caveat validator.
-    res.runtime.caveatRegistry.register(
-      testService.ConditionallyValidatingTestCaveat,
-      caveatValidator);
-
-    // Bind to the go process that will invoke aMethod.
-    var client = res.runtime.getClient();
-    client.bindTo(res.runtime.getContext(), invokerName, function(err, stub) {
-      if (err) {
-        res.end(t, 'error in bindTo: ' + err);
-        return;
-      }
-
-      // Tell the go service to invoke aMethod with a caveat that validates.
-      stub.invoke(res.runtime.getContext(), serveName,
-        testService.ConditionallyValidatingTestCaveat,
-        expectedCaveatData,
-        function(err) {
-        if (err) {
-          res.end(t, 'error in invoke: ' + err);
-          return;
-        }
-
-        // Tell the go service to invoke aMethod with a caveat that fails
-        // validation.
-        nextCaveatValidationResult = false;
-        stub.invoke(res.runtime.getContext(), serveName,
-          testService.ConditionallyValidatingTestCaveat,
-          expectedCaveatData,
-          function(err) {
-            if (err) {
-              // Expected to fail due to validation.
-              nextCaveatValidationResult = true; // reset
-              res.end(t);
-              return;
-            }
-            nextCaveatValidationResult = true; // reset*/
-            res.end(t, 'expected validation error in invoke');
-        });
-      });
-    });
-  });
-});
diff --git a/test/integration/test-client-bind-to.js b/test/integration/test-client-bind-to.js
deleted file mode 100644
index 630f422..0000000
--- a/test/integration/test-client-bind-to.js
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var isBrowser = require('is-browser');
-var test = require('prova');
-var vanadium = require('../../');
-var config = require('./default-config');
-
-test('Test binding to a Go service named test_service/cache - ' +
-  'client.bindTo(name, callback)', function(assert) {
-  var rt;
-
-  vanadium.init(config, oninit);
-
-  function oninit(err, runtime) {
-    assert.error(err);
-
-    rt = runtime;
-    var client = rt.getClient();
-    var ctx = rt.getContext();
-    client.bindTo(ctx, 'test_service/cache', onbind);
-  }
-
-  function onbind(err, service) {
-    assert.error(err);
-    assert.ok(service);
-
-    rt.close(assert.end);
-  }
-});
-
-test('Test binding to a Go service named test_service/cache - ' +
-  'var promise = client.bindTo(name)', function(assert) {
-  vanadium
-  .init(config)
-  .then(bindTo)
-  .catch(assert.end);
-
-  function bindTo(runtime) {
-    var ctx = runtime.getContext();
-    return runtime.getClient()
-    .bindTo(ctx, 'test_service/cache')
-    .then(function(service) {
-      assert.ok(service);
-      runtime.close(assert.end);
-    });
-  }
-});
-
-test('Test binding to a non-existing name - ' +
-  'client.bindTo(badName, callback)', function(assert) {
-  vanadium.init(config, function(err, runtime) {
-    assert.error(err);
-
-    var client = runtime.getClient();
-    var ctx = runtime.getContext().withTimeout(100);
-    client.bindTo(ctx, 'does-not/exist', function(err, service) {
-      assert.ok(err instanceof Error);
-
-      runtime.close(assert.end);
-    });
-  });
-});
-
-test('Test binding to a non-existing name - ' +
-  'var promise = client.bindTo(badName) ', function(assert) {
-  var rt;
-
-  vanadium
-  .init(config)
-  .then(function(runtime) {
-    rt = runtime;
-    var client = rt.getClient();
-    var ctx = runtime.getContext().withTimeout(100);
-    return client.bindTo(ctx, 'does-not/exist');
-  })
-  .then(function(service) {
-    assert.fail('should not succeed');
-    rt.close(assert.end);
-  }, function(err) {
-    assert.ok(err instanceof Error);
-    rt.close(assert.end);
-  })
-  .catch(function(err) {
-    assert.error(err);
-    rt.close(assert.end);
-  });
-});
-
-test('Test using the proxy when proxy Url is invalid - ' +
-  'client.bindTo(name, callback)', function(assert) {
-  if (isBrowser) {
-    return assert.end();
-  }
-
-  vanadium.init({ wspr: 'http://bad-address.tld' }, onruntime);
-
-  function onruntime(err, runtime) {
-    assert.notOk(err);
-    var client = runtime.getClient();
-    client.bindTo(runtime.getContext(), 'test_service/cache', function(err) {
-      assert.ok(err instanceof Error);
-      runtime.close();
-      assert.end();
-    });
-  }
-});
-
-test('Test binding when wspr Url is invalid - ' +
-  'var promise = client.bindTo(name) ', function(assert) {
-  if (isBrowser) {
-    return assert.end();
-  }
-
-  var rt;
-  vanadium
-  .init({ wspr: 'http://bad-address.tld' })
-  .catch(function(err) {
-    assert.notOk(err);
-    assert.end();
-  }).then(function(runtime) {
-    rt = runtime;
-    var client = rt.getClient();
-    return client.bindTo(runtime.getContext(), 'test_service/cache');
-  }).then(function() {
-    rt.close();
-    assert.end('Bind should fail');
-  }).catch(function(err) {
-    assert.ok(err instanceof Error);
-    rt.close();
-    assert.end();
-  });
-});
diff --git a/test/integration/test-client-call-opts.js b/test/integration/test-client-call-opts.js
deleted file mode 100644
index 6414cc8..0000000
--- a/test/integration/test-client-call-opts.js
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var config = require('./default-config');
-var verror = vanadium.verror;
-
-function end(t, rt, err) {
-  t.error(err);
-  rt.close(t.end);
-}
-
-test('Test passing valid options to client.callOption()', function(t) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var client = rt.getClient();
-
-    var opts = client.callOption({ });
-    t.ok(opts, 'with no options should succeed');
-
-    opts = client.callOption({
-      allowedServersPolicy: ['foo']
-    });
-    t.ok(opts, 'with allowedOptions should succeed');
-
-    end(t, rt);
-  });
-});
-
-test('Test passing invalid options to client.callOption()', function(t) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var client = rt.getClient();
-
-    t.throws(function() {
-      client.callOption({
-        invalid: 'key'
-      });
-    },
-    verror.BadArgError,
-    ' with one invalid option should throw BadArgError');
-
-    t.throws(function() {
-      client.callOption({
-        allowedServersPolicy: ['foo'],
-        'invalid': 'key'
-      });
-    },
-    verror.BadArgError,
-    'with one valid and one invalid option should throw BadArgError');
-
-    end(t, rt);
-  });
-});
-
-test('Test passing allowedServersPolicy that matches server blessings',
-  function(t) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var client = rt.getClient();
-
-    client.bindTo(ctx, 'test_service/cache', function(err, cache) {
-      if (err) {
-        return end(t, rt, err);
-      }
-
-      var callOpt = client.callOption({
-        allowedServersPolicy: ['test']
-      });
-
-      cache.set(ctx, 'foo', 'bar', callOpt, function(err) {
-        end(t, rt, err);
-      });
-    });
-  });
-});
-
-test('Test passing allowedServersPolicy that does not match server blessings',
-  function(t) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var client = rt.getClient();
-
-    client.bindTo(ctx, 'test_service/cache', function(err, cache) {
-      if (err) {
-        return end(t, rt, err);
-      }
-
-      var callOpt = client.callOption({
-        allowedServersPolicy: ['bad/blessings']
-      });
-
-      cache.set(ctx, 'foo', 'bar', callOpt, function(err) {
-        t.ok(err, 'should error');
-        end(t, rt);
-      });
-    });
-  });
-});
diff --git a/test/integration/test-dispatcher.js b/test/integration/test-dispatcher.js
deleted file mode 100644
index 3aecb05..0000000
--- a/test/integration/test-dispatcher.js
+++ /dev/null
@@ -1,294 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var serve = require('./serve');
-var Promise = require('../../src/lib/promise');
-
-test('Test sync dispatcher the echos suffixes - ' +
-  'dispatcher/echo/<suffix>', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: callbackDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'dispatcherServiceName/echo/bar',
-      function(err, service) {
-      if (err) {
-        assert.error(err);
-        res.end(assert);
-        return;
-      }
-
-      service.echo(ctx, function(err, result) {
-        assert.error(err);
-
-        assert.equal(result, 'bar');
-        res.end(assert);
-      });
-    });
-  });
-});
-
-test('Test sync dispatcher that counts length of suffix - ' +
-  'dispatcherServiceName/count/<suffix> - one suffix', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: promiseDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'dispatcherServiceName/count/bar',
-      function(err, service) {
-      if (err) {
-        return assert.end(err);
-      }
-
-      service.count(ctx, function(err, result) {
-        assert.error(err);
-
-        assert.equal(result, 3);
-        res.end(assert);
-      });
-    });
-  });
-});
-
-test('Test sync dispatcher that counts length of suffix - ' +
-  'dispatcherServiceName/count/<suffix> - two different suffixes',
-  function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: promiseDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    var promises = [
-      client.bindTo(ctx, 'dispatcherServiceName/count/bar')
-      .then(function(client) {
-        return client.count(ctx);
-      }),
-      client.bindTo(ctx, 'dispatcherServiceName/count/longer')
-      .then(function(client) {
-        return client.count(ctx);
-      })
-    ];
-
-    Promise.all(promises).then(function(results) {
-      assert.equal(results[0], 3);
-      assert.equal(results[1], 6);
-      res.end(assert);
-    })
-    .catch(function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-});
-
-test('Test unknown suffix should return error - ' +
-  'dispatcherServiceName/unknown', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: callbackDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'dispatcherServiceName/unknown',
-      function(err, service) {
-      assert.ok(err, 'should fail');
-      res.end(assert);
-    });
-  });
-});
-
-test('Test async dispatcher using promises - ' +
-  'dispatcher/promise ' +
-  '- success case', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: promiseDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = res.runtime.getContext();
-    var name = 'dispatcherServiceName/promise/whatever';
-    var client = res.runtime.getClient();
-    client.bindTo(ctx, name, function(err, service) {
-      if (err) {
-        return assert.end(err);
-      }
-
-      service.echo(ctx, function(err, result) {
-        assert.error(err);
-        assert.equal(result, 'promise/whatever');
-        res.end(assert);
-      });
-    });
-  });
-});
-
-test('Test async dispatcher using promises - ' +
-  'dispatcherServiceName/promise/fail ' +
-  '- failure case', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: promiseDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'dispatcherServiceName/promise/fail',
-      function(err, service) {
-      assert.ok(err, 'should fail');
-      res.end(assert);
-    });
-  });
-});
-
-test('Test async dispatcher using callbacks - ' +
-  'dispatcherServiceName/callback ' +
-  '- success case', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: callbackDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = res.runtime.getContext();
-
-    var name = 'dispatcherServiceName/callback/whatever';
-    var client = res.runtime.getClient();
-    client.bindTo(ctx, name, function(err, service) {
-      if (err) {
-        return assert.end(err);
-      }
-
-      service.echo(ctx, function(err, result) {
-        assert.error(err);
-        assert.equal(result, 'callback/whatever');
-        res.end(assert);
-      });
-    });
-  });
-});
-
-test('Test async dispatcher using callbacks - '+
-  'dispatcherServiceName/callback/fail ' +
-  '- failure case', function(assert) {
-  serve({
-    name: 'dispatcherServiceName',
-    dispatcher: callbackDispatcher,
-    autoBind: false
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'dispatcherServiceName/callback/fail',
-      function(err, service) {
-      assert.ok(err, 'should fail');
-      res.end(assert);
-    });
-  });
-});
-
-function Counter(string) {
-  this.string = string;
-}
-
-Counter.prototype.count = function(ctx, serverCall) {
-  return this.string.length;
-};
-
-function Echoer(string) {
-  this.string = string;
-}
-
-Echoer.prototype.echo = function(ctx, serverCall) {
-  return this.string;
-};
-
-function promiseDispatcher(suffix) {
-  // dispatcher/echo/:string
-  if (suffix.indexOf('echo/') === 0) {
-    return {
-      service: new Echoer(suffix.substr(5))
-    };
-  // dispatcher/count/:string
-  } else if (suffix.indexOf('count/') === 0) {
-    return {
-      service: new Counter(suffix.substr(6))
-    };
-  // dispatcher/promise/fail
-  } else if (suffix.indexOf('promise/fail') === 0) {
-    return Promise.reject(new Error('bad'));
-  // dispatcher/promise/:string
-  } else if (suffix.indexOf('promise') === 0) {
-    return Promise.resolve({
-      service: new Echoer(suffix)
-    });
-  }
-
-  throw new Error('unknown suffix');
-}
-
-function callbackDispatcher(suffix, cb) {
-  // dispatcher/echo/:string
-  if (suffix.indexOf('echo/') === 0) {
-    cb(null, {
-      service: new Echoer(suffix.substr(5))
-    });
-    return;
-  // dispatcher/count/:string
-  } else if (suffix.indexOf('count/') === 0) {
-    cb(null, {
-      service: new Counter(suffix.substr(6))
-    });
-    return;
-  // dispatcher/callback/fail
-  } else if (suffix.indexOf('callback/fail') === 0) {
-    cb(new Error('errorback'));
-    return;
-  // dispatcher/callback/:string
-  } else if (suffix.indexOf('callback') === 0) {
-    cb(null, { service: new Echoer(suffix)});
-    return;
-  }
-
-  throw new Error('unknown suffix');
-}
diff --git a/test/integration/test-extension-event-proxy.js b/test/integration/test-extension-event-proxy.js
deleted file mode 100644
index e240e8d..0000000
--- a/test/integration/test-extension-event-proxy.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-
-test('Test event proxy connects to extension', function(assert) {
-  // Don't test this in node because there is no extension to talk to.
-  if (!require('is-browser')) {
-    return assert.end();
-  }
-
-  var timeout = 500;
-  var ExtensionEventProxy = require('../../src/browser/event-proxy').ctor;
-  var extensionEventProxy = new ExtensionEventProxy(timeout);
-
-  var finished = false;
-
-  extensionEventProxy.once('error', function(err) {
-    if (!finished) {
-      finished = true;
-      assert.fail(err);
-      extensionEventProxy.destroy();
-      assert.end();
-    }
-  });
-
-  extensionEventProxy.once('connected', function() {
-    if (!finished) {
-      finished = true;
-      extensionEventProxy.destroy();
-      assert.end();
-    }
-  });
-});
-
-// TODO(nlacasse): This test is potentially racey.  It's possible that the
-// event proxy might connect to the extension before the 0ms timeout fires
-// (although I have not seen it happen).
-test('Test event proxy fires error when timeout occurs before connection.',
-    function(assert) {
-      // Don't test this in node because there is no extension to talk to.
-      if (!require('is-browser')) {
-        return assert.end();
-      }
-
-      var timeout = 0;
-      var ExtensionEventProxy = require('../../src/browser/event-proxy').ctor;
-      var extensionEventProxy = new ExtensionEventProxy(timeout);
-
-      var finished = false;
-
-      extensionEventProxy.once('error', function(err) {
-        if (!finished) {
-          finished = true;
-          assert.ok((/timeout/i).test(err.message));
-          extensionEventProxy.destroy();
-          assert.end();
-        }
-      });
-
-      extensionEventProxy.once('connected', function() {
-        if (!finished) {
-          finished = true;
-          assert.fail('Expected the event proxy to timeout, but it did not.');
-          extensionEventProxy.destroy();
-          assert.end();
-        }
-      });
-});
-
-test('Test event proxy rejects unknown message types', function(assert) {
-  // Don't test this in node because there is no extension to talk to.
-  if (!require('is-browser')) {
-    return assert.end();
-  }
-
-  var timeout = 500;
-  var ExtensionEventProxy = require('../../src/browser/event-proxy').ctor;
-  var extensionEventProxy = new ExtensionEventProxy(timeout);
-
-  var finished = false;
-
-  var bogusType = 'foobar';
-
-  extensionEventProxy.once('connected', function() {
-    extensionEventProxy.once('error', function(err) {
-      if (!finished) {
-        finished = true;
-        assert.ok((/unknown type/i).test(err.message));
-        extensionEventProxy.destroy();
-        assert.end();
-      }
-    });
-
-    extensionEventProxy.send(bogusType, {});
-  });
-});
diff --git a/test/integration/test-js-client-server.js b/test/integration/test-js-client-server.js
deleted file mode 100644
index 7866b17..0000000
--- a/test/integration/test-js-client-server.js
+++ /dev/null
@@ -1,1092 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var Deferred = require('../../src/lib/deferred');
-
-var builtins = require('../../src/vdl/builtins');
-var stringify = require('../../src/vdl/stringify');
-var TypeUtil = require('../../src/vdl/type-util');
-var typeServiceVdl =
-  require('../vdl-out/javascript-test/services/type-service');
-var typedStreamingServiceVdl =
-  require('../vdl-out/javascript-test/services/typed-streaming-service');
-
-var vdl = vanadium.vdl;
-
-// TODO(bprosnitz) Combine CacheService and CacheServicePromises so there
-// isn't as much duplicated code.
-
-var CacheService = {
-  cacheMap: {},
-  set: function(context, serverCall, key, value, cb) {
-    this.cacheMap[key] = value;
-
-    process.nextTick(function() {
-      cb(null, undefined);
-    });
-  },
-  get: function(context, serverCall, key, cb) {
-    var val = this.cacheMap[key];
-    if (val === undefined) {
-      var message = 'unknown key ' + JSON.stringify(key);
-      var err = new Error(message);
-
-      process.nextTick(function() {
-        cb(err);
-      });
-    } else {
-      process.nextTick(function() {
-        cb(undefined, val);
-      });
-    }
-  } ,
-  // TODO(bprosnitz) Also test streaming with no return arg.
-  multiGet: function(context, serverCall, $stream, cb) {
-    var numReceived = 0;
-    $stream.on('end', function close() {
-      cb(null, numReceived);
-    });
-    $stream.on('error', function error(e) {
-      cb(e);
-    });
-    var self = this;
-    $stream.on('data', function(key) {
-      numReceived++;
-      if (key !== null) {
-        var val = self.cacheMap[key];
-        if (val === undefined) {
-          cb(new Error('unknown key'));
-        }
-        $stream.write(val);
-      }
-    });
-    $stream.read();
-  },
-  doNothingStream: function(ctx, serverCall, $stream, cb) {
-    cb(null, undefined);
-  },
-  nonAsyncFunction: function(ctx, serverCall, cb) {
-    cb(null, 'RESULT');
-  }
-};
-
-var CacheServicePromises = {
-  cacheMap: {},
-  set: function(context, serverCall, key, value) {
-    this.cacheMap[key] = value;
-  },
-  get: function(context, serverCall, key) {
-    var def = new Deferred();
-    var val = this.cacheMap[key];
-    process.nextTick(function() {
-      if (val === undefined) {
-        // Since we're rejecting the promise before we've returned it
-        // we'll register a catch handler now to avoid an unhandled rejection
-        // warning.
-        def.promise.catch(function() {});
-        def.reject('unknown key');
-      } else {
-        def.resolve(val);
-      }
-    });
-    return def.promise;
-  } ,
-  multiGet: function(context, serverCall, $stream) {
-    var numReceived = 0;
-    var def = new Deferred();
-    $stream.on('end', function() {
-      def.resolve(numReceived);
-    });
-
-    $stream.on('error', function(e) {
-      def.reject(e);
-    });
-    var self = this;
-    $stream.on('data', function(key) {
-      numReceived++;
-      if (key !== null) {
-        var val = self.cacheMap[key];
-        if (val === undefined) {
-          def.reject('unknown key');
-        }
-        $stream.write(val);
-      }
-    });
-    $stream.read();
-    return def.promise;
-  },
-  doNothingStream: function(ctx, serverCall, $stream) {
-  },
-  nonAsyncFunction: function(ctx, serverCall) {
-    return 'RESULT';
-  }
-};
-
-runCache({
-  testName: 'without VDL (JSValue) using callbacks',
-  definition: CacheService,
-  name: 'foo.Cache'
-});
-
-runCache({
-  testName: 'without VDL (JSValue) using promises',
-  definition: CacheServicePromises,
-  name: 'foo.Cache'
-});
-
-// options: testName, definition, name
-function runCache(options) {
-  var namePrefix = 'Test JS client/server rpc ' + options.testName + ' - ';
-
-  test(namePrefix + 'cache.set(key, string) -> cache.get(key)',
-            function(t) {
-    setup(options, function(err, ctx, cache, end) {
-      t.error(err, 'should not error on setup');
-
-      cache.set(ctx, 'foo', 'bar', function(err, res) {
-        t.error(err, 'should not error on set(...)');
-        t.notOk(res, 'should be null');
-
-        cache.get(ctx, 'foo', function(err, res) {
-          t.error(err, 'should not error on get(...)');
-          t.equal(res, 'bar');
-          end(t);
-        });
-      });
-    });
-  });
-
-  test(namePrefix + 'cache.set(key, object, callback)', function(t) {
-    setup(options, function(err, ctx, cache, end) {
-      t.error(err, 'should not error on setup');
-
-      // Expect a map as the JSValue.
-      var expected = new Map([['a', 'foo'], ['b', 2]]);
-
-      cache.set(ctx, 'myObject', expected, function(err, res) {
-        t.error(err, 'should not error on set(...)');
-        t.equal(res, null, 'should be null');
-
-        cache.get(ctx, 'myObject', function(err, res) {
-          t.error(err, 'should not error on get(...)');
-          t.deepEqual(res, expected, 'should match object');
-          end(t);
-        });
-      });
-    });
-  });
-
-  test(namePrefix + 'cache.get("bad-key", callback) - failure',
-            function(t) {
-    setup(options, function(err, ctx, cache, end) {
-      t.error(err, 'should not error on setup');
-
-      cache.get(ctx, 'bad-key', function(err, res) {
-        t.ok(err, 'should err on get(...)');
-        // TODO(bjornick): Use the constant generated by the vdl generator.
-        t.equal(err.id, 'v.io/v23/verror.Unknown');
-        end(t);
-      });
-    });
-  });
-
-  test(namePrefix + 'cache.badMethod() - failure', function(t) {
-    setup(options, function(err, ctx, cache, end) {
-      t.error(err, 'should not error on setup');
-
-      t.throws(function() {
-        cache.badMethod();
-      });
-
-      end(t);
-    });
-  });
-
-  test(namePrefix + 'cache.multiGet()', function(t) {
-    // `cache.multiGet()` returns an object that has a "stream" attribute.
-    // The way the streaming interface is implmented for cache.multiGet()
-    // is that you use stream.write(key) to get the value of a key. The value
-    // is emitted on the stream's data event. In this test there are a few
-    //  steps to set this up:
-    //
-    // 1. Prime the cache by setting a bunch of key/values
-    // 2. Add a listener or create a stream reader to receive the values
-    // 3. Assert the values are correct
-    // 4. End the stream.
-    setup(options, function(err, ctx, cache, end){
-      // 1. Prime the cache by setting a bunch of key/values
-
-      // Build a map of items
-      var items = {};
-      var numItems = 3;
-
-      for (var i = 0; i < numItems; ++i) {
-        items[i] = {
-          key: i,
-          value: 'value: ' + i
-        };
-      }
-
-      // Add them to the cache
-      var jobs = Object.keys(items).map(function(key) {
-        return cache.set(ctx, key, JSON.stringify(items[key]));
-      });
-
-      Promise
-      .all(jobs)
-      .then(function() {
-        // 2. Add a listener or create a stream reader to receive the values
-        var promise = cache.multiGet(ctx);
-        var stream = promise.stream;
-        var writes = 0;
-        var reads = 0;
-
-        // Error handling boilerplate
-        promise.then(function(numReceived) {
-          t.equal(numReceived, numItems, 'received correct number of items');
-          t.equal(reads, numItems, 'had correct number of reads');
-          t.equal(writes, numItems, 'has correct number of writes');
-          end(t);
-        }).catch(error);
-
-        stream.on('error', error);
-
-        // 3. Assert the values are correct
-        // stream "data" event emits cached values
-        stream.on('data', function(value) {
-          var string = value.toString();
-          var json = JSON.parse(string);
-          var actual = json.value;
-          var expected = items[json.key].value;
-
-          t.equal(actual, expected);
-
-          reads++;
-        });
-
-        Object.keys(items).forEach(function(key) {
-          stream.write(key);
-
-          writes++;
-        });
-
-        // 4. End the stream.
-        stream.end();
-      });
-
-      function error(err) {
-        t.error(err, 'should not error');
-        end(t);
-      }
-    });
-  });
-
-  function setup(options, cb) {
-    var dispatcher = leafDispatcher(options.definition);
-    serve('testing/cache', dispatcher, function(err, res) {
-      cb(err, res.runtime.getContext(), res.service, res.end);
-    });
-  }
-}
-
-function TypeService() {}
-TypeService.prototype = new typeServiceVdl.TypeService();
-
-TypeService.prototype.isTyped =  function(context, serverCall, any) {
-  // We expect to receive the internally typed value of the any.
-  // However, clients who send JSValue will not produce a typed value here.
-  return TypeUtil.isTyped(any);
-};
-TypeService.prototype.isString = function(context, serverCall, str) {
-  // We expect to receive a native string, if the client sent us one.
-  return (typeof str === 'string');
-};
-TypeService.prototype.isStruct = function(context, serverCall, struct) {
-  // A struct should always be typed.
-  if (TypeUtil.isTyped(struct)) {
-    return;
-  }
-  // If it was untyped (a JSValue object), then the code is incorrect.
-  throw new Error('did not receive a typed struct' + stringify(struct));
-};
-TypeService.prototype.swap = function(context, serverCall, a, b) {
-  return [b, a];
-};
-
-runTypeService({
-  testName: 'typed, non-async',
-  definition: new TypeService(),
-  name: 'foo.TypeService'
-});
-
-// options: testName, definition, name
-function runTypeService(options) {
-  var namePrefix = 'Test JS client/server rpc ' + options.testName + ' - ';
-  // This test ensures that typed values are sent between JS server and client.
-  // The server expects an input of the ANY type, which means that it ought to
-  // receive a typed value, if we send a typed value.
-  // If we send a JSValue, then it will not end up being wrapped.
-  test(namePrefix + 'typeService.isTyped(...)', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      typeService.isTyped(ctx, 'foo', function(err, res) {
-        t.error(err, 'should not error on isTyped(...)');
-        // Use equal instead of notOk to ensure that res is not wrapped.
-        t.equal(res, false, '\'foo\' is an untyped string');
-
-
-        var VomStr = vdl.registry.lookupOrCreateConstructor(vdl.types.STRING);
-        var typedString = new VomStr('food');
-        typeService.isTyped(ctx, typedString, function(err, res) {
-          t.error(err, 'should not error on isTyped(...)');
-          // Use equal instead of ok to ensure that res is not wrapped.
-          t.equal(res, true, 'VomStr(\'food\') is a typed string');
-          end(t);
-        });
-      });
-    });
-  });
-
-  test(namePrefix + 'typeService.isTyped(...) - promise', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      typeService.isTyped(ctx, 'glue').then(function(res) {
-        t.error(err, 'should not error on isTyped(...)');
-        // Use equal instead of notOk to ensure that res is not wrapped.
-        t.equal(res, false, '\'glue\' is an untyped string');
-
-        var VomStr = vdl.registry.lookupOrCreateConstructor(vdl.types.STRING);
-        var typedString = new VomStr('glued');
-        typeService.isTyped(ctx, typedString, function(err, res) {
-          t.error(err, 'should not error on isTyped(...)');
-          // Use equal instead of ok to ensure that res is not wrapped.
-          t.equal(res, true, 'VomStr(\'glued\') is a typed string');
-          end(t);
-        });
-      }).catch(function error(err) {
-        t.error(err, 'should not error');
-        end(t);
-      });
-    });
-  });
-
-  test(namePrefix + 'typeService.isTyped(undefined) - promise', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      // Check that you can leave an optional (or any) inArg as undefined.
-      // It should not be mistaken for a callback.
-      typeService.isTyped(ctx, undefined).then(function(res) {
-        t.error(err, 'should not error on isTyped(undefined)');
-        t.equal(res, false, 'undefined is treated like JSValue null');
-
-        // Lenient: Having both arg and cb as undefined is fine too.
-        typeService.isTyped(ctx, undefined, undefined).then(function(res) {
-          t.error(err, 'should not error on isTyped(undefined, undefined)');
-          t.equal(res, false, 'undefined is treated like JSValue null');
-
-          // Having any more undefined's is an error (too many args).
-          typeService.isTyped(ctx, undefined, undefined, undefined).then(
-            function(res) {
-
-            t.fail(err, 'should have errored');
-            end(t);
-          }).catch(function(err) {
-            t.ok(err, 'should error');
-            end(t);
-          });
-        });
-      }).catch(function error(err) {
-        t.error(err, 'should not error');
-        end(t);
-      });
-    });
-  });
-
-  // This test ensures that typed values sent between JS server and client are
-  // unwrapped when being processed. Further, the client disallows sending the
-  // wrong type to the server.
-  test(namePrefix + 'typeService.isString(str)', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      typeService.isString(ctx, 'foo', function(err, res) {
-        t.error(err, 'should not error on isString(<a string>)');
-        // Use equal instead of ok to ensure that res is not wrapped.
-        t.equal(res, true, '\'foo\' is a string');
-
-        typeService.isString(ctx, 0, function(err, res) {
-          t.ok(err, 'should error on isString(<not a string>)');
-          end(t);
-        });
-      });
-    });
-  });
-
-  // This test ensures that a typed struct has its type on the other side.
-  // That would prove that it was not decoded as a JSValue.
-  test(namePrefix + 'typeService.isStruct(struct)', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      typeService.isStruct(ctx, {}, function(err, res) {
-        t.error(err, 'should not error on isStruct(...)');
-        end(t);
-      });
-    });
-  });
-
-  // This test ensures that multiple typed I/O arguments are possible in JS.
-  test(namePrefix + 'typeService.swap(a, b)', function(t) {
-    setup(options, function(err, ctx, typeService, end) {
-      t.error(err, 'should not error on setup');
-
-      // Start by swapping JSValue. There are no types attached when returned.
-      var a = '33';
-      var b = 33;
-      typeService.swap(ctx, a, b, function(err, res1, res2) {
-        t.error(err, 'should not error on swap(...)');
-        t.deepEqual([res1, res2], [b, a], 'correctly swapped the 2 inputs');
-
-        // Now, swap a typed value (aa) with a wrapped and typed value (bb).
-        var simpleType = {
-          name: 'SimpleStruct',
-          kind: vdl.kind.STRUCT,
-          fields: [
-            {
-              name: 'Foo',
-              type: vdl.types.INT32
-            },
-            {
-              name: 'Bar',
-              type: vdl.types.BOOL
-            }
-          ]
-        };
-        var SimpleStruct = vdl.registry.lookupOrCreateConstructor(simpleType);
-        var aa = new SimpleStruct({
-          foo: 10,
-          bar: true
-        });
-        var simpleTypeB = vdl.types.INT32;
-        var SimpleInt32 = vdl.registry.lookupOrCreateConstructor(simpleTypeB);
-        var bb = new SimpleInt32(-32);
-        typeService.swap(ctx, aa, bb, function(err, res1, res2) {
-          t.error(err, 'should not error on swap(...)');
-          t.deepEqual([res1, res2], [bb, aa], 'correctly swapped the 2 inputs');
-
-          // Verify that res2 (the original aa) still has the right type.
-          t.ok(TypeUtil.isTyped(res2), 'aa is still typed');
-          t.deepEqual(res2._type, simpleType, 'aa has the correct type');
-
-          // Verify that res1 (the original bb) still has the right type.
-          t.ok(TypeUtil.isTyped(res1), 'bb is still typed');
-          t.deepEqual(res1._type, simpleTypeB, 'bb has the correct type');
-
-          end(t);
-        });
-      });
-    });
-  });
-
-  function setup(options, cb) {
-    var dispatcher = leafDispatcher(options.definition);
-
-    serve('testing/typeService', dispatcher, function(err, res) {
-      cb(err, res.runtime.getContext(), res.service, res.end);
-    });
-  }
-}
-
-var boolListType = typedStreamingServiceVdl.BoolList.prototype._type;
-var numStructType = typedStreamingServiceVdl.NumStruct.prototype._type;
-var typeListType = typedStreamingServiceVdl.TypeList.prototype._type;
-
-// TODO(alexfandrianto): Add a callback version of the typed streaming service.
-// See each test case for what the service method tests.
-function TypedStreamingService() {}
-TypedStreamingService.prototype =
-  new typedStreamingServiceVdl.TypedStreamingService();
-
-// inStreamOnly verifies that typed inStreams work properly.
-TypedStreamingService.prototype.inStreamOnly =
-  function(ctx, serverCall, numTimes, $stream) {
-
-  // Receive stream values numTimes
-  var numReceived = 0;
-  var def = new Deferred();
-  $stream.on('end', function() {
-    if (numReceived !== numTimes) {
-      var err = new Error('Got ' + numReceived + '. Wanted ' + numTimes);
-      def.reject(err);
-    }
-    def.resolve(numReceived);
-  });
-
-  $stream.on('error', function(e) {
-    def.reject(e);
-  });
-  $stream.on('data', function(str) {
-    if (typeof str !== 'string') {
-      def.reject(new Error('Expected a string, but got ' + str));
-    }
-    numReceived++;
-  });
-  $stream.read();
-  $stream.write('No outstream type; this cannot be sent');
-  return def.promise;
-};
-
-// outStreamOnly verifies that typed outStreams work properly.
-TypedStreamingService.prototype.outStreamOnly =
-  function(ctx, serverCall, numTimes, $stream, cb) {
-
-  // Send stream values numTimes
-  var numSent = 0;
-  while (numSent < numTimes) {
-    $stream.write(numSent); // Despite sending int, we autoconvert to BigInt.
-    numSent++;
-  }
-  return cb(null, numSent);
-};
-
-// bidirBoolListNegationsStream tests that bidirectional streams can send
-// composite types back and forth, as well as modify the data items streamed.
-TypedStreamingService.prototype.bidirBoolListNegationStream =
-  function(ctx, serverCall, $stream) {
-
-  // Given a list of bool, send the opposite bools back.
-  var numReceived = 0;
-  var def = new Deferred();
-  $stream.on('end', function() {
-    def.resolve(numReceived);
-  });
-
-  $stream.on('error', function(e) {
-    def.reject(e);
-  });
-  $stream.on('data', function(boolList) {
-    numReceived++;
-    var oppList = boolList.map(function(b) {
-      return !b;
-    });
-    $stream.write(oppList);
-  });
-  $stream.read();
-  return def.promise;
-};
-
-// structValueStream converts a number to a struct based on that number.
-// Ensures that custom-defined types can be sent across the stream.
-TypedStreamingService.prototype.structValueStream =
-  function(ctx, serverCall, $stream) {
-
-  // Given a number, send a number struct back.
-  var numReceived = 0;
-  var def = new Deferred();
-  $stream.on('end', function() {
-    def.resolve(numReceived);
-  });
-  $stream.on('error', function(e) {
-    def.reject(e);
-  });
-  $stream.on('data', function(num) {
-    numReceived++;
-    $stream.write({
-      'number': num,
-      'bigInt': vdl.BigInt.fromNativeNumber(num),
-      'string': '' + num
-    });
-  });
-  $stream.read();
-  return def.promise;
-};
-
-// anyStream tests that typed values can pass through a bidirectional stream.
-TypedStreamingService.prototype.anyStream =
-  function(ctx, serverCall, types, $stream) {
-
-  // Given a list of types, listen to a stream of values.
-  // Errors if any of the values received did not match their expected type.
-  // Stream those values back directly.
-  var typesReceived = [];
-  var def = new Deferred();
-  $stream.on('end', function() {
-    def.resolve(typesReceived);
-  });
-  $stream.on('error', function(e) {
-    def.reject(e);
-  });
-  $stream.on('data', function(val) {
-    // Verify that the value has no type if native, or matches, otherwise.
-    var expectedType = types[typesReceived.length];
-    if (expectedType.equals(vdl.types.JSVALUE) && val._type !== undefined) {
-      def.reject(new Error('Native value had a type: ' +
-        JSON.stringify(val)));
-    }
-    if (!expectedType.equals(vdl.types.JSVALUE) &&
-      !expectedType.equals(val._type)) {
-      def.reject(new Error('Value had wrong type: ' +
-        JSON.stringify(val)));
-    }
-
-    // The value had the corerct type. Write the same value back.
-    // Note: Native values lack types, so use the JSValue type instead.
-    typesReceived.push(val._type || vdl.types.JSVALUE);
-    $stream.write(val);
-  });
-  $stream.read();
-  return def.promise;
-};
-
-runTypedStreamingService({
-  testName: 'typed, streaming, non-async',
-  definition: new TypedStreamingService(),
-  name: 'foo.TypedStreamingService'
-});
-
-// options: testName, definition, name
-function runTypedStreamingService(options) {
-  var namePrefix = 'Test JS client/server rpc ' + options.testName + ' - ';
-
-  // typedStreamingService.inStreamOnly tests:
-  // - correct # of values sent to server
-  // - values received by server have correct type
-  // - outStream is null
-  // - client never gets data, even though server tries to send on outStream
-  test(namePrefix + 'typedStreamingService.inStreamOnly(...)',
-    function(t) {
-
-    setup(options, function(err, ctx, typedStreamingService, end) {
-      t.error(err, 'should not error on setup');
-
-      // The # of strings we intend to send.
-      var strList = ['asdf', ';lkj', 'qwer', 'poiu'];
-      var numStrs = strList.length;
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: numStrs,
-        inData: strList,
-        serviceMethod: typedStreamingService.inStreamOnly,
-        writeType: vdl.types.STRING,
-        readType: null,
-        onResolveFunc: function(numReceived) {
-          t.equal(numReceived, numStrs,
-            'service received correct # of strings');
-          end(t);
-        },
-        onDataFunc: function(value, dataIndex) {
-          t.fail('received data from the stream: ' + JSON.stringify(value));
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // This test verifies that the stream promise rejects normally.
-  // We send 4 items, but we claim to the server that we will send 6.
-  // Note: the stream also passes the same reject error to the error stream.
-  test(namePrefix + 'typedStreamingService.inStreamOnly(...) - failure',
-    function(t) {
-
-    setup(options, function(err, ctx, typedStreamingService, end) {
-      t.error(err, 'should not error on setup');
-
-      // The # of strings we intend to send.
-      var strList = ['asdf', ';lkj', 'qwer', 'poiu'];
-      var numStrs = strList.length + 2; // mismatch
-
-      // The stream will send an error on the error stream just before the
-      // Promise rejects.
-      var onErrorFunc = function(err) {
-        t.ok(err, 'should error');
-        t.ok(err.message.indexOf('Got 4. Wanted 6') !== -1,
-          'has correct error message');
-      };
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: numStrs,
-        inData: strList,
-        serviceMethod: typedStreamingService.inStreamOnly,
-        writeType: vdl.types.STRING,
-        readType: null,
-        onResolveFunc: function(numReceived) {
-          t.fail('should have errored; did not send correct # of strings');
-          end(t);
-        },
-        onDataFunc: function(value, dataIndex) {
-          t.fail('received data from the stream: ' + JSON.stringify(value));
-        },
-        onErrorFunc: onErrorFunc,
-        onRejectFunc: function(err) {
-          onErrorFunc(err);
-          end(t);
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // This test verifies that the client cannot send a bad type onto the stream.
-  // It also verifies that this bad value is not sent to the server.
-  // Thus, the promise rejects, and the client gets an error while attempting to
-  // write the bad value (write an int instead of a string).
-  // Note: the stream also passes the same reject error to the error stream.
-  test(namePrefix + 'typedStreamingService.inStreamOnly(...) - failure 2',
-    function(t) {
-
-    setup(options, function(err, ctx, typedStreamingService, end) {
-      t.error(err, 'should not error on setup');
-
-      // The # of strings we intend to send.
-      var strList = [6];
-      var numStrs = strList.length;
-
-      // The stream will send an error on the error stream just before the
-      // Promise rejects.
-      var onErrorFunc = function(err) {
-        t.ok(err, 'should error');
-        t.ok(err.message.indexOf('Got 0. Wanted 1') !== -1,
-          'has correct error message');
-      };
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: numStrs,
-        inData: strList,
-        serviceMethod: typedStreamingService.inStreamOnly,
-        writeType: vdl.types.STRING,
-        readType: null,
-        onResolveFunc: function(numReceived) {
-          t.fail('should have errored; sent an int');
-          end(t);
-        },
-        onDataFunc: function(value, dataIndex) {
-          t.fail('received data from the stream: ' + JSON.stringify(value));
-        },
-        inDataThrowRegexp: /.*cannot convert to string.*/,
-        onErrorFunc: onErrorFunc,
-        onRejectFunc: function(err) {
-          onErrorFunc(err);
-          end(t);
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // typedStreamingService.outStreamOnly tests:
-  // - correct # of values read and outputted
-  // - values received by server have the correct type
-  // - inStream is null
-  test(namePrefix + 'typedStreamingService.outStreamOnly(...)', function(t) {
-
-    setup(options, function(err, ctx, typedStreamingService, end) {
-      t.error(err, 'should not error on setup');
-
-      // The # of BigInts we want to receive and # received so far.
-      var numInts = 3;
-      var numOutStream = 0;
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: numInts,
-        inData: [],
-        serviceMethod: typedStreamingService.outStreamOnly,
-        writeType: null,
-        readType: vdl.types.INT64,
-        onResolveFunc: function(numSent) {
-          t.equal(numSent, numInts, 'service knows # of values sent');
-          t.equal(numOutStream, numInts, 'service sent correct # of values');
-          end(t);
-        },
-        onDataFunc: function(value, dataIndex) {
-          t.ok(value instanceof vdl.BigInt, 'value is a BigInt');
-          numOutStream++;
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // typedStreamingService.bidirBoolListNegationStream tests:
-  // - custom defined type (simple) can be sent and received properly
-  // - the values can be modified and returned (each bool is negated)
-  test(namePrefix + 'typedStreamingService.bidirBoolListNegationStream()',
-    function(t) {
-
-    setup(options, function(err, ctx, typedStreamingService, end){
-      t.error(err, 'should not error on setup');
-
-      // These are the testcases.
-      var boolLists = [
-        undefined,          // Note: undefined autoconverts to empty list.
-        [],
-        [true],
-        [false, true, true],
-        [undefined, false], // Note: undefined autoconverts to false.
-      ];
-      var expectedLists = [
-        [],
-        [],
-        [false],
-        [true, false, false],
-        [true, true]
-      ];
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: undefined,
-        inData: boolLists,
-        serviceMethod: typedStreamingService.bidirBoolListNegationStream,
-        writeType: boolListType,
-        readType: boolListType,
-        onResolveFunc: function(numReceived) {
-          t.deepEqual(numReceived, boolLists.length,
-            'service sent correct # of values');
-          end(t);
-        },
-        onDataFunc: function(actual, dataIndex) {
-          t.ok(Array.isArray(actual), 'value is an array');
-          t.deepEqual(actual, expectedLists[dataIndex],
-            'bools were flipped');
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // typedStreamingService.structValueStream tests:
-  // - values with a named struct type can be received properly
-  test(namePrefix + 'typedStreamingService.structValueStream()', function(t) {
-    setup(options, function(err, ctx, typedStreamingService, end){
-      t.error(err, 'should not error on setup');
-
-      // These are the testcases.
-      var numbers = [
-        undefined, // Note: undefined autoconverts to 0
-        3,
-        -500000
-      ];
-      var NumStruct = vdl.registry.lookupOrCreateConstructor(numStructType);
-      var expectedNumStructs = [
-        new NumStruct({
-          string: '0'
-        }),
-        new NumStruct({
-          number: 3,
-          bigInt: vdl.BigInt.fromNativeNumber(3),
-          string: '3'
-        }),
-        new NumStruct({
-          number: -500000,
-          bigInt: vdl.BigInt.fromNativeNumber(-500000),
-          string: '-500000'
-        })
-      ];
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: undefined,
-        inData: numbers,
-        serviceMethod: typedStreamingService.structValueStream,
-        writeType: vdl.types.FLOAT64,
-        readType: numStructType,
-        onResolveFunc: function(numReceived) {
-          t.deepEqual(numReceived, numbers.length,
-            'service sent correct # of values');
-          end(t);
-        },
-        onDataFunc: function(actual, dataIndex) {
-          t.ok(actual instanceof NumStruct, 'value is a NumStruct');
-          t.deepEqual(actual, expectedNumStructs[dataIndex],
-            'number converted to NumStruct');
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  // typedStreamingService.anyStream tests:
-  // - the any stream succeeds in both directions
-  // - complicated types can be sent across the stream in both directions
-  // - the types received by the server match the expected types
-  // - the types received by the client match the expected types
-  test(namePrefix + 'typedStreamingService.anyStream()', function(t) {
-    setup(options, function(err, ctx, typedStreamingService, end){
-      t.error(err, 'should not error on setup');
-
-      // These are the testcases.
-      var typesSent = [
-        vdl.types.JSVALUE,
-        vdl.types.INT32,
-        vdl.types.INT64,
-        vdl.types.COMPLEX128,
-        vdl.types.STRING,
-        vdl.types.BOOL,
-        numStructType,
-        boolListType,
-        typeListType
-      ];
-
-      var NumStruct = vdl.registry.lookupOrCreateConstructor(numStructType);
-      var BoolList = vdl.registry.lookupOrCreateConstructor(boolListType);
-      var TypeList = vdl.registry.lookupOrCreateConstructor(typeListType);
-
-      var sendList = [
-        3.14,
-        new builtins.INT32(5),
-        new builtins.INT64(-15),
-        new builtins.COMPLEX128(new vdl.Complex(5, -5)),
-        new builtins.STRING('abc'),
-        new builtins.BOOL(true),
-        new NumStruct({
-          number: -0.5
-        }),
-        new BoolList([true, true, false, false]),
-        new TypeList(typesSent)
-      ];
-
-      // Prepare and run the stream test.
-      var testdata = {
-        inArg: typesSent,
-        inData: sendList,
-        serviceMethod: typedStreamingService.anyStream,
-        writeType: vdl.types.ANY,
-        readType: vdl.types.ANY,
-        onResolveFunc: function(typesReceived) {
-          t.deepEqual(typesReceived, typesSent,
-          'service sent back the correct types');
-          end(t);
-        },
-        onDataFunc: function(actual, dataIndex) {
-          if (actual._type === undefined) {
-            t.ok(typesSent[dataIndex].equals(vdl.types.JSVALUE),
-              'value is native');
-          } else {
-            t.deepEqual(actual._type, typesSent[dataIndex], 'type matches');
-          }
-          t.deepEqual(actual, sendList[dataIndex], 'received correct value');
-        }
-      };
-      streamTest(t, ctx, testdata, end);
-    });
-  });
-
-  function setup(options, cb) {
-    var dispatcher = leafDispatcher(options.definition);
-
-    serve('testing/typeService', dispatcher, function(err, res) {
-      cb(err, res.runtime.getContext(), res.service, res.end);
-    });
-  }
-}
-
-/*
- * Performs a stream test that assumes <= 1 input arg to the service method.
- * testdata contains inArg, inData, serviceMethod, writeType, readType,
- * onResolveFunc, onDataFunc
- * Note: onResolveFunc and onDataFunc should end the test.
- * Optional testdata fields: inDataThrowRegexp, onErrorFunc, and onRejectFunc;
- * these are most useful for error test cases.
- */
-function streamTest(t, ctx, testdata, end) {
-  // The Error function is optional; successful test cases never need it.
-  function error(err) {
-    t.error(err, 'should not error');
-    end(t);
-  }
-
-  // Determine the correct onRejectFunc and onErrorFunc handlers.
-  var onRejectFunc = testdata.onRejectFunc || error;
-  var onErrorFunc = testdata.onErrorFunc || error;
-
-  // 1. Create a stream reader/writer to receive the values
-  var promise = testdata.serviceMethod(ctx, testdata.inArg);
-  var stream = promise.stream;
-  t.deepEqual(stream.writeType, testdata.writeType, 'inStream matches type');
-  t.deepEqual(stream.readType, testdata.readType, 'outStream matches type');
-
-  // 2. Handle RPC
-  promise.then(testdata.onResolveFunc).catch(onRejectFunc);
-
-  // 3. Setup listeners for the stream. Data should be NumStructs
-  stream.on('error', onErrorFunc);
-
-  var dataIndex = 0;
-  stream.on('data', function(actual) {
-    testdata.onDataFunc(actual, dataIndex);
-    dataIndex++;
-  });
-
-  // 4. Send data through the stream.
-  for (var i = 0; i < testdata.inData.length; i++) {
-    if (testdata.inDataThrowRegexp) {
-      t.throws(stream.write.bind(stream, testdata.inData[i]),
-        testdata.inDataThrowRegexp, 'stream write throws on bad input');
-    } else {
-      stream.write(testdata.inData[i]);
-    }
-  }
-
-  // 5. End the stream.
-  stream.end();
-}
-
-test('Test server stream exception handling', function(assert) {
-  var exception;
-
-  if (typeof window === 'undefined') {
-    process.on('uncaughtException', function setexception(err) {
-      exception = err;
-      process.removeListener('uncaughtException', setexception);
-    });
-  } else {
-    window.onerror = function(message, url, line, column, err) {
-      exception = err;
-      // Put it back to the default
-      window.onerror = null;
-    };
-  }
-
-  var service = {
-    get: function get(context, serverCall, $stream, cb) {
-      $stream.on('end', cb.bind(null, null, {}));
-      $stream.on('error', cb);
-      $stream.on('data', function ondata(buffer) {
-        throw new Error('Woah!');
-      });
-    }
-  };
-
-  setup(service, function ready(err, context, remote, end) {
-    assert.error(err, 'should not error on setup');
-
-    var stream = remote.get(context, function(err) {
-      assert.error(err);
-      assert.ok(exception, 'stream exceptions should be raised');
-      end(assert);
-    }).stream;
-
-    stream.write('foo');
-    stream.end();
-  });
-
-  function setup(service, cb) {
-    var dispatcher = leafDispatcher(service);
-    var name = 'test/server-stream-exception';
-
-    serve(name, dispatcher, function(err, res) {
-      cb(err, res.runtime.getContext(), res.service, res.end);
-    });
-  }
-});
diff --git a/test/integration/test-nacl-plugin-crash.js b/test/integration/test-nacl-plugin-crash.js
deleted file mode 100644
index 8e19eb1..0000000
--- a/test/integration/test-nacl-plugin-crash.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var serve = require('./serve');
-
-// Test serving and making an RPC call.
-// name is the name of the service to serve and cb is called after completion.
-function validateCommunication(t, name, cb) {
-  var response = 5;
-
-  var dispatcher = leafDispatcher({
-    anRpc: function(context, serverCall, cb) {
-      cb(null, response);
-    }
-  });
-
-  serve(name, dispatcher, function(err, res) {
-    if (err) {
-      return cb(err);
-    }
-
-    res.service.anRpc(res.runtime.getContext(), function(err, result) {
-      t.error(err, 'Err expected to be null');
-      t.equal(result, response, 'Expected different response from anRpc()');
-      cb(null, res.close, res.runtime);
-    });
-  });
-}
-
-test('Test recovery from nacl plugin crash', function(t) {
-  if (!require('is-browser')) {
-    return t.end();
-  }
-
-  var errors = require('../../src/verror/index');
-  var eventProxy = require('../../src/browser/event-proxy');
-
-  // validate comunication first, partially because this initializes the
-  // nacl plugin.
-  validateCommunication(t, 'test/name1', function(err, close1, runtime) {
-    if (err) {
-      return t.end(err);
-    }
-
-    // Handle the crash.
-    runtime.once('crash', function(err) {
-      t.ok(err instanceof errors.ExtensionCrashError,
-        'Receive ExtensionCrashError object.');
-
-      // Perform another communication validation.
-      validateCommunication(t, 'test/name2', function(err, close2) {
-        if (err) {
-          t.error(err);
-          return close1(function() {
-            t.ok(err, 'runtime.close should error because nacl crashed.');
-            t.end();
-          });
-        }
-
-        close1(function(err1) {
-          t.ok(err1, 'First runtime.close should error because nacl crashed.');
-          close2(t.end);
-        });
-      });
-    });
-
-    // Send a message triggering a nacl plug-in crash.
-    eventProxy.send('intentionallyPanic');
-  });
-});
diff --git a/test/integration/test-namespace.js b/test/integration/test-namespace.js
deleted file mode 100644
index 2cab811..0000000
--- a/test/integration/test-namespace.js
+++ /dev/null
@@ -1,895 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var Promise = require('../../src/lib/promise');
-
-var config = require('./default-config');
-var Promise = require('../../src/lib/promise');
-var random = require('../../src/lib/random');
-var timeouts = require('./timeouts');
-var vanadium = require('../../');
-var verror = vanadium.verror;
-var access = vanadium.security.access;
-var reserved = vanadium.rpc.reserved;
-
-var namespaceRoot = process.env.V23_NAMESPACE;
-var PREFIX = 'namespace-testing/';
-var MINUTE = 60 * 1000; // a minute
-
-test('Test globbing children - glob(' + PREFIX + '*)', function(assert) {
-  var runtime;
-
-  init(config).then(function glob(rt) {
-    runtime = rt;
-    var namespace = rt.getNamespace();
-    var ctx = runtime.getContext();
-    var rpc = namespace.glob(ctx, PREFIX + '*');
-    rpc.catch(end);
-    return readAllMountPoints(rpc.stream);
-  }).then(function validate(actual) {
-    var expected = [{
-      name: PREFIX + 'cottage',
-      isLeaf: false
-    }, {
-      name: PREFIX + 'house',
-      isLeaf: false
-    }];
-    assertResults(actual, expected, assert);
-    end();
-  }).catch(end);
-
-  function end(err) {
-    assert.error(err);
-    if (runtime) {
-      runtime.close(assert.end);
-    } else {
-      assert.end();
-    }
-  }
-});
-
-test('Test glob().stream - exception handling', function(assert) {
-  vanadium.init(function onruntime(err, runtime) {
-    if (err) {
-      return end(err);
-    }
-
-    var namespace = runtime.getNamespace();
-    var context = runtime.getContext();
-    var promise = namespace.glob(context, '*');
-    var stream = promise.stream;
-    var exception;
-
-    promise.catch(function(err) {
-      assert.error(err, 'should not catch expceptions in stream');
-    });
-
-    if (typeof window === 'undefined') {
-      process.on('uncaughtException', function setexception(err) {
-        exception = err;
-        process.removeListener('uncaughtException', setexception);
-      });
-    } else {
-      window.onerror = function(message, url, line, column, err) {
-        exception = err;
-        // Put it back to the default
-        window.onerror = null;
-      };
-    }
-
-    // NOTE: Using assert.throws(fn) here is not possible since the fix is to
-    // use process.nextTick(...) wich will have the raised exception bypass the
-    // try/catch stack around where assert.throws(...) calls the passed in fn.
-    stream.once('data', function onentry(entry) {
-      throw new Error('Woah!');
-    });
-
-    stream.on('end', end);
-
-    function end(err) {
-      if (err) {
-        assert.error(err, 'should not error');
-      }
-
-      assert.ok(exception, 'glob-stream exceptions should be raised');
-
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-});
-
-test('Test globbing nested levels - glob(' + PREFIX + 'cottage/*/*/*)',
-  function(assert) {
-    var runtime;
-
-    init(config).then(function glob(rt) {
-      runtime = rt;
-      var namespace = rt.getNamespace();
-      var ctx = runtime.getContext();
-      var rpc = namespace.glob(ctx, PREFIX + 'cottage/*/*/*');
-      rpc.catch(end);
-      return readAllMountPoints(rpc.stream);
-    }).then(function validate(actual) {
-      var expected = [{
-        name: PREFIX + 'cottage/lawn/back/sprinkler',
-        isLeaf: true
-      }, {
-        name: PREFIX + 'cottage/lawn/front/sprinkler',
-        isLeaf: true
-      }];
-      assertResults(actual, expected, assert);
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test globbing non-existing name - glob(' + PREFIX + 'does/not/exist)',
-  function(assert) {
-    var runtime;
-
-    init(config).then(function glob(rt) {
-      runtime = rt;
-      var namespace = rt.getNamespace();
-      var ctx = runtime.getContext();
-      var rpc = namespace.glob(ctx, PREFIX + 'does/not/exist');
-      rpc.catch(end);
-      return readAllMountPoints(rpc.stream);
-    }).then(function validate(actual) {
-      var expected = [];
-      assert.deepEqual(actual.sort(), expected.sort());
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test glob\'s promise is resolved when glob finishes.' +
-  '- var promise = glob(' + PREFIX + '*)',
-  function(assert) {
-    var runtime;
-
-    init(config).then(function glob(rt) {
-      runtime = rt;
-      var namespace = rt.getNamespace();
-      var ctx = runtime.getContext();
-      return namespace.glob(ctx, PREFIX + '*');
-    }).then(function(finalResult) {
-      assert.notOk(finalResult, 'there is no final result for glob');
-      assert.pass('Promise resolved when glob finished.');
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test glob\'s callback is called when glob finishes.' +
-  '- glob(' + PREFIX + '*, cb)',
-  function(assert) {
-    var runtime;
-
-    init(config).then(function glob(rt) {
-      runtime = rt;
-      var namespace = rt.getNamespace();
-      var ctx = runtime.getContext();
-      namespace.glob(ctx, PREFIX + '*', function(err, finalResult) {
-        assert.error(err);
-
-        assert.notOk(finalResult, 'there is no final result for glob');
-        assert.pass('Promise resolved when glob finished.');
-        end();
-      });
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test globbing non-existing rooted name - ' +
-  'glob(/RootedBadName.Google.tld:1234/*)',
-  function(assert) {
-
-    // increase timeout for this test as it retries bad-url until timeout.
-    assert.timeout(timeouts.long);
-
-    var runtime;
-    vanadium.init(config).then(function glob(rt) {
-      runtime = rt;
-      var namespace = rt.getNamespace();
-      // Note: Glob will always timeout after 30s
-      // see v.io/x/ref/runtime/internal/naming/namespace/parallelstartcall.go
-      // This means we'll get a timeout error on the glob stream before
-      // timeouts.long expires.
-      var rpc = namespace.glob(rt.getContext(),
-        '/RootedBadName.Google.tld:1234/*');
-      rpc.catch(function(err) {
-        // Ignore the timeout error.
-      });
-
-      // We expect no actual result items but one stream error result item
-      rpc.stream.on('data', function(item) {
-        assert.notOk(item, 'Should not get any actual results');
-      });
-
-      var numErrorItems = 0;
-      rpc.stream.on('error', function(errItem) {
-        if (numErrorItems > 0) {
-          end('expected only one error item');
-        }
-        numErrorItems++;
-        assert.ok(errItem, 'Should get one error result item');
-        assert.ok(errItem.error instanceof verror.TimeoutError ||
-          errItem.error instanceof verror.NoServersError,
-          'error item should have error field of type TimeoutError or ' +
-          'NoServersError');
-        assert.equal(errItem.name, '/RootedBadName.Google.tld:1234',
-          'error item should have a name');
-      });
-
-      rpc.stream.on('end', function() {
-        assert.equal(numErrorItems, 1,
-          'must end with 1 GlobError, got: ' + numErrorItems);
-        end();
-      });
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test mounting and unmounting - ' +
-  'mount(' + PREFIX + 'new/name), unmount(' + PREFIX + 'new/name)',
-  function(assert) {
-    var runtime;
-    var namespace;
-    var expectedServerAddress;
-    var initialName = PREFIX + 'first/name';
-    var secondaryName = PREFIX + 'new/name';
-
-    var ctx;
-    vanadium.init(config).then(function createServer(rt) {
-        runtime = rt;
-        namespace = rt.getNamespace();
-        ctx = rt.getContext();
-        return rt.newServer(initialName, {});
-      })
-      .then(function() {
-        return waitForPublish(initialName, runtime);
-      })
-      .then(function resolve() {
-        return namespace.resolve(ctx, initialName);
-      }).then(function mount(endpoints) {
-        expectedServerAddress = endpoints[0];
-        return namespace.mount(ctx, secondaryName, expectedServerAddress,
-          MINUTE);
-      }).then(function() {
-        return waitForPublish(initialName, runtime);
-      }).then(function resolve() {
-        return namespace.resolve(ctx, secondaryName);
-      }).then(function validate(resolveResult) {
-        assert.equals(resolveResult.length, 1);
-        assert.equals(resolveResult[0], expectedServerAddress);
-      }).then(function unmount() {
-        return namespace.unmount(ctx, secondaryName);
-      }).then(function() {
-        return waitForUnpublish(secondaryName, runtime);
-      }).then(function resolve() {
-        namespace.resolve(ctx, secondaryName, function cb(err) {
-          assert.ok(err, 'no resolving after unmount()');
-          end();
-        });
-      }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test resolving to mounttable - ' +
-  'resolveToMountTable(' + PREFIX + 'cottage)',
-  function(assert) {
-    var runtime;
-
-    var ctx;
-    init(config).then(function resolveToMountTable(rt) {
-      runtime = rt;
-      ctx = runtime.getContext();
-      var namespace = rt.getNamespace();
-      return namespace.resolveToMounttable(ctx, PREFIX + 'cottage');
-    }).then(function validate(mounttableNames) {
-      assert.equals(mounttableNames.length, 1);
-      var mounttableName = mounttableNames[0];
-      assert.ok(mounttableName.indexOf(namespaceRoot) === 0);
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test flushing cache entry - ' +
-  'flushCacheEntry(' + PREFIX + 'house/alarm)',
-  function(assert) {
-    var runtime;
-    var namespace;
-    var name = PREFIX + 'house/alarm';
-
-    init(config).then(function flushCacheEntry(rt) {
-      runtime = rt;
-      namespace = rt.getNamespace();
-      return namespace.flushCacheEntry(name);
-    }).then(function validate() {
-      // We don't check the return result of flushCachEntry since there is no
-      // guarantee that it was in the cache to be flushed in the first place.
-      // Even if we do a resolve() before this step to cache it, it may still
-      // get evicted by the time we call flushCacheEntry for different reasons
-      // such as cache being full, service remounting itself, parent mount-point
-      // expiring.
-      assert.pass('cache flushed');
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test disabling cache - disableCache(true)', function(assert) {
-  var runtime;
-  var namespace;
-  var name = PREFIX + 'house/alarm';
-
-  var ctx;
-  init(config).then(function disableCache(rt) {
-    runtime = rt;
-    ctx = rt.getContext();
-    namespace = rt.getNamespace();
-    return namespace.disableCache(true);
-  }).then(function resolveButItShouldNotGetCached(rt) {
-    return namespace.resolve(ctx, name);
-  }).then(function tryFlushCacheEntry() {
-    return namespace.flushCacheEntry(name);
-  }).then(function validate(flushed) {
-    assert.notOk(flushed, 'no cache to be flushed');
-    end();
-  }).catch(end);
-
-  function end(err) {
-    assert.error(err);
-    if (runtime) {
-      runtime.close(assert.end);
-    } else {
-      assert.end();
-    }
-  }
-});
-
-test('Test setting roots to valid endpoints - ' +
-  'setRoots(valid)',
-  function(assert) {
-    var runtime;
-    var namespace;
-    var ctx;
-
-    init(config).then(function setRoots(rt) {
-      runtime = rt;
-      namespace = rt.getNamespace();
-      ctx = rt.getContext();
-      // Set the roots to a valid root, we expect normal glob results.
-      return namespace.setRoots(namespaceRoot);
-    }).then(function glob() {
-      var rpc = namespace.glob(ctx, PREFIX + '*');
-      rpc.catch(end);
-      return readAllMountPoints(rpc.stream);
-    }).then(function validate(actual) {
-      var expected = [{
-        name: PREFIX + 'cottage',
-        isLeaf: false
-      }, {
-        name: PREFIX + 'house',
-        isLeaf: false
-      }];
-      assertResults(actual, expected, assert);
-      end();
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test setting roots to invalid endpoint - ' +
-  'setRoots(invalid)',
-  function(assert) {
-
-    // increase timeout for this test as it retries bad-url until timeout.
-    assert.timeout(timeouts.max);
-
-    var runtime;
-    var namespace;
-    var ctx;
-    vanadium.init(config).then(function setRoots(rt) {
-      runtime = rt;
-      namespace = rt.getNamespace();
-      ctx = rt.getContext();
-      // Set the roots to a invalid roots, then we don't expect resolution.
-      return namespace.setRoots(['/bad-root-1.tld:80', '/bad-root-2.tld:1234']);
-    }).then(function bind() {
-      // Since setRoots changes runtimes Namespace roots, binding to any name
-      // should now fail
-      var client = runtime.getClient();
-      ctx = ctx.withTimeout(timeouts.short);
-      return client.bindTo(ctx, PREFIX + 'house/kitchen/lights')
-        .then(function() {
-          assert.fail('Should not have been able to bind with invalid roots');
-        }, function(err) {
-          assert.ok(err);
-          assert.ok(err instanceof Error);
-          ctx.finish();
-          end();
-        });
-    }).catch(end);
-
-    function end(err) {
-      assert.error(err);
-      if (runtime) {
-        runtime.close(assert.end);
-      } else {
-        assert.end();
-      }
-    }
-  });
-
-test('Test getting roots - roots()', function(assert) {
-  var runtime;
-
-  init(config).then(function roots(rt) {
-    runtime = rt;
-    var namespace = rt.getNamespace();
-    return namespace.roots();
-  }).then(function validate(roots) {
-    assert.equals(roots.length, 1);
-    assert.ok(roots.indexOf(namespaceRoot === 0));
-    end();
-  }).catch(end);
-
-  function end(err) {
-    assert.error(err);
-    if (runtime) {
-      runtime.close(assert.end);
-    } else {
-      assert.end();
-    }
-  }
-});
-
-test('Test setting and getting roots - ' +
-  'setRoots(), roots(cb)',
-  function(assert) {
-    var runtime;
-    var namespace;
-
-    vanadium.init(config, onInit);
-
-    function onInit(err, rt) {
-      assert.error(err);
-      runtime = rt;
-      namespace = rt.getNamespace();
-      namespace.setRoots('/root1:80', '/root2:1234', onSetRoots);
-    }
-
-    function onSetRoots(err) {
-      assert.error(err);
-      namespace.roots(onRoots);
-    }
-
-    function onRoots(err, roots) {
-      assert.error(err);
-      assert.ok(roots[0].indexOf('root1:80' >= 0));
-      assert.ok(roots[1].indexOf('root2:1234' >= 0));
-      if (runtime) {
-        runtime.close(assert.end);
-      }
-    }
-  });
-
-test('Test getPermissions() on non-existant name', function(assert) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var ns = rt.getNamespace();
-    var name = 'non/existant/name';
-
-    ns.getPermissions(ctx, name, function(err) {
-      assert.ok(err, 'should error');
-      rt.close(assert.end);
-    });
-  });
-});
-
-test('Test setting and getting permissions - ' +
-  'setPermissions(), getPermissions()',
-  function(assert) {
-    vanadium.init(config, function(err, rt) {
-      if (err) {
-        return assert.end(err);
-      }
-
-      var ctx = rt.getContext();
-      var ns = rt.getNamespace();
-      // Note: we use a random name here so we can run the test multiple times
-      // with the same mounttable without getting locked out of a name.
-      var name = 'path/to/some/name/' + random.hex();
-
-      var perms = new access.Permissions(new Map([
-        [access.Admin, new access.AccessList({
-          'in': ['...'],
-          'notIn': ['foo']
-        })],
-        [access.Read, new access.AccessList({
-          'in': ['bar/baz']
-        })],
-        [access.Write, new access.AccessList({
-          'notIn': ['biz/qux']
-        })]
-      ]));
-
-      ns.setPermissions(ctx, name, perms, function(err) {
-        if (err) {
-          return end(err);
-        }
-
-        ns.getPermissions(ctx, name, function(err, gotPerms, gotVersion) {
-          if (err) {
-            return end(err);
-          }
-
-          assert.equal(typeof gotVersion, 'string',
-            'getPermissions returns a string version');
-
-          assert.ok(gotPerms, 'getPermissions returns a permissions');
-          assert.deepEqual(gotPerms, perms.val,
-            'getPermissions returns the same permissions that we set');
-
-          ns.setPermissions(ctx, name, perms, 'wrongVersion', function(err) {
-            assert.ok(err, 'setPermissions with a bad version should error');
-
-            ns.setPermissions(ctx, name, perms, gotVersion, function(err) {
-              assert.error(err,
-                'setPermissions with the correct version should not error');
-              end();
-            });
-          });
-        });
-      });
-
-      function end(err) {
-        assert.error(err, 'should not error');
-        rt.close(assert.end);
-      }
-    });
-  });
-
-test('Test delete() on non-existant name', function(assert) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var ns = rt.getNamespace();
-    var name = 'non/existant/name';
-
-    ns.delete(ctx, name, true, function(err) {
-      assert.error(err, 'should not error');
-      rt.close(assert.end);
-    });
-  });
-});
-
-test('Test delete() unmounts a name', function(assert) {
-
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var ns = rt.getNamespace();
-    var name = 'name/that/will/be/deleted';
-    var ep = '/@6@ws@2.2.2.2:2222@@e8972f90fe028674f78a164f001d07c5@s@@';
-
-    ns.mount(ctx, name, ep, MINUTE)
-      .then(function onMount(err) {
-        if (err) {
-          return end(err);
-        }
-      }).then(function() {
-        return waitForPublish(name, rt);
-      }).then(function resolveOnce() {
-        return ns.resolve(ctx, name);
-      }).then(function validateResolvedEp(gotEps) {
-        assert.equal(gotEps.length, 1, 'resolves to a single endpoint');
-        assert.equal(ep, gotEps[0], 'resolves to the correct endpoint');
-      }).then(function deleteName() {
-        return ns.delete(ctx, name, false);
-      }).then(function resolveTwice() {
-        ns.resolve(ctx, name, function(err) {
-          assert.ok(err, 'name should be unmounted');
-          end();
-        });
-      }).catch(function(err) {
-        assert.error(err);
-        end(err);
-      });
-
-    function end(err) {
-      assert.error(err, 'should not error');
-      rt.close(assert.end);
-    }
-  });
-});
-
-test('Test delete() on name with no children', function(assert) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var ns = rt.getNamespace();
-    var name = 'path/to/name/with/no/children';
-
-    var perms = new access.Permissions(new Map([
-      [access.Admin, new access.AccessList({
-        'in': ['...'],
-      })]
-    ]));
-
-    ns.setPermissions(ctx, name, perms, function(err) {
-      if (err) {
-        return end(err);
-      }
-
-      ns.delete(ctx, name, false, end);
-    });
-
-    function end(err) {
-      assert.error(err, 'should not error');
-      rt.close(assert.end);
-    }
-  });
-});
-
-test('Test delete() on name with children', function(assert) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var ctx = rt.getContext();
-    var ns = rt.getNamespace();
-    var name = 'path/to/name/with/children';
-    var childName1 = vanadium.naming.join(name, 'child1');
-    var childName2 = vanadium.naming.join(name, 'node/child2');
-
-    var perms = new access.Permissions(new Map([
-      [access.Admin, new access.AccessList({
-        'in': ['...'],
-      })]
-    ]));
-
-    // Create all three names.
-    ns.setPermissions(ctx, name, perms, function(err) {
-      if (err) {
-        return end(err);
-      }
-      ns.setPermissions(ctx, childName1, perms, function(err) {
-        if (err) {
-          return end(err);
-        }
-        ns.setPermissions(ctx, childName2, perms, function(err) {
-          if (err) {
-            return end(err);
-          }
-
-          ns.delete(ctx, name, false, function(err) {
-            assert.ok(err, 'should error if we don\'t delete subchildren');
-
-            ns.delete(ctx, name, true, function(err) {
-              assert.error(err, 'should not error if we delete subchildren');
-              end();
-            });
-          });
-        });
-      });
-    });
-
-    function end(err) {
-      assert.error(err, 'should not error');
-      rt.close(assert.end);
-    }
-  });
-});
-
-/*
- * Given a glob stream, returns a promise that will resolve to an array
- * of glob results after all the results have been collected from the stream.
- */
-function readAllMountPoints(stream) {
-  var mps = [];
-  return new Promise(function(resolve, reject) {
-    stream.on('data', function(mountPoint) {
-      mps.push(mountPoint);
-    });
-
-    stream.on('end', function(name) {
-      resolve(mps);
-    });
-
-    stream.on('error', function(errItem) {
-      // we don't expect any errors other than GlobNotImplementedError
-      if (!(errItem.error instanceof reserved.GlobNotImplementedError)) {
-        reject(errItem.error);
-      }
-    });
-  });
-}
-
-function assertResults(got, want, assert) {
-  var toEqual = [];
-  got.forEach(function(e) {
-    toEqual.push({
-      name: e.name,
-      isLeaf: e.isLeaf
-    });
-  });
-  assert.deepEqual(want.sort(mpSorter), toEqual.sort(mpSorter));
-
-  function mpSorter(a, b) {
-    return a.name.localeCompare(b.name);
-  }
-}
-
-var SAMPLE_NAMESPACE = [
-  'house/alarm',
-  'house/living-room/lights',
-  'house/living-room/smoke-detector',
-  'house/kitchen/lights',
-  'cottage/alarm',
-  'cottage/lawn/back/sprinkler',
-  'cottage/lawn/front/sprinkler',
-];
-
-function init(config) {
-  var runtime;
-  return vanadium.init(config)
-    .then(function serveEmptyService(rt) {
-      runtime = rt;
-      return rt.newServer('', {});
-    })
-    .then(function publishUnderMultipleNames(server) {
-      var addNamesRequests = SAMPLE_NAMESPACE.map(function(name) {
-        return server.addName(PREFIX + name);
-      });
-      return Promise.all(addNamesRequests);
-    })
-    .then(function waitUntilAllNamesPublished() {
-      var resolveRequests = SAMPLE_NAMESPACE.map(function(name) {
-        return waitForPublish(PREFIX + name, runtime);
-      });
-      return Promise.all(resolveRequests);
-    })
-    .then(function ready() {
-      return runtime;
-    });
-
-}
-
-function waitForPublish(name, runtime) {
-  return wait(name, runtime, false);
-}
-
-function waitForUnpublish(name, runtime) {
-  return wait(name, runtime, true);
-}
-
-// Helper function that waits until name is published or unpublished,
-// it checks every 100ms for a total of 50 tries before failing.
-function wait(name, runtime, waitForUnpublish) {
-  var WAIT_TIME = 100;
-  var MAX_TRIES = 50;
-  return new Promise(function(resolve, reject) {
-    var ns = runtime.getNamespace();
-    var count = 0;
-    runResolve();
-
-    function runResolve() {
-      ns.resolve(runtime.getContext(), name, function(err, s) {
-        if (err && err.id !== 'v.io/v23/naming.nameDoesntExist') {
-          reject(err);
-          return;
-        }
-        var continueLoop = err;
-        if (waitForUnpublish) {
-          continueLoop = !continueLoop;
-        }
-        if (continueLoop) {
-          count++;
-          if (count === MAX_TRIES) {
-            var verb = waitForUnpublish ? 'unpublished' : 'published';
-            reject(
-              new Error('Timed out waiting for ' + name + ' to be ' + verb)
-            );
-            return;
-          }
-          return setTimeout(runResolve, WAIT_TIME);
-        }
-        resolve();
-      });
-    }
-  });
-}
\ No newline at end of file
diff --git a/test/integration/test-new-server.js b/test/integration/test-new-server.js
deleted file mode 100644
index 70d6a61..0000000
--- a/test/integration/test-new-server.js
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var Promise = require('../../src/lib/promise');
-var Deferred = require('../../src/lib/deferred');
-var config = require('./default-config');
-var timeouts = require('./timeouts');
-var isBrowser = require('is-browser');
-var promiseWhile = require('../../src/lib/async-helper').promiseWhile;
-
-var NAME_PREFIX = 'new-server-testing-چשઑᜰ/';
-
-var service = {
-  changeChannel: function(ctx, serverCall) {
-    throw new Error('NotImplemented');
-  }
-};
-
-var fooService = {
-  foo: function(ctx, serverCall) {
-    return 'foo result';
-  }
-};
-
-var barService = {
-  bar: function(ctx, serverCall) {
-    return 'bar result';
-  }
-};
-
-test('Test creating a JS service named livingroom/tv - ' +
-  'rt.newServer(name, service, callback)', function(assert) {
-  vanadium.init(config, function(err, runtime) {
-    assert.error(err);
-
-    runtime.newServer('livingroom/tv', service, function(err) {
-      assert.error(err);
-      runtime.close(assert.end);
-    });
-  });
-});
-
-test('Test creating a JS service named livingroom/tv - ' +
-  'var promise = rt.newServer(name, service)', function(assert) {
-  vanadium.init(config, function(err, runtime) {
-    assert.error(err);
-
-    runtime.newServer('livingroom/tv', service)
-    .then(function() {
-      runtime.close(assert.end);
-    })
-    .catch(function(err) {
-      assert.error(err);
-      runtime.close(assert.end);
-    });
-  });
-});
-
-test('Test creating a JS service when proxy Url is invalid - '+
-  'rt.newServer(name, service, callback)', function(t) {
-  if (isBrowser) {
-    return t.end();
-  }
-
-  vanadium.init({ wspr: 'http://bad-address.tld' }, function(err, runtime) {
-    t.notOk(err, 'no error expected on init() since wspr isn\'t ' +
-      'contacted');
-    runtime.newServer('should/fail', service, function(err) {
-      t.ok(err, 'should get error after attempting to serve with bad proxy');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test creating a JS service when proxy Url is invalid - '+
-  'var promise = runtime.newServer(name, service)', function(t) {
-  if (isBrowser) {
-    return t.end();
-  }
-
-  vanadium.init({ wspr: 'http://bad-address.tld' }, function(err, runtime) {
-    t.notOk(err, 'no error expected on init() since wspr isn\'t ' +
-      'contacted');
-    runtime.newServer('should/fail', service).then(function() {
-      t.fail('serve expected to fail but succeeded');
-      runtime.close(t.end);
-    }).catch(function(err) {
-      t.ok(err, 'should get error after attempting to serve with bad proxy');
-      runtime.close(t.end);
-    });
-  });
-});
-
-test('Test creating a JS service under multiple names - ' +
-  'runtime.addName(name), runtime.removeName(name)', function(assert) {
-  var ctx;
-
-  vanadium.init(config, function(err, runtime) {
-    assert.error(err);
-
-    var client = runtime.getClient();
-    ctx = runtime.getContext();
-    var server;
-    runtime.newServer('livingroom/tv', service)
-    .then(function addSecondName(s) {
-      server = s;
-      return server.addName('bedroom/tv');
-    })
-    .then(function bindToSecondName() {
-      return client.bindTo(ctx, 'bedroom/tv');
-    })
-    .then(function verifySecondName(newObject){
-      assert.ok(newObject && newObject.changeChannel, 'new name works');
-    })
-    .then(function removeSecondName() {
-      return server.removeName('bedroom/tv');
-    })
-    .then(function waitForNameToBeRemoved() {
-      var numTries = 0;
-      function tryBindTo() {
-        numTries++;
-        if (numTries > 5) {
-          return Promise.resolve(false);
-        }
-        var shortCtx = runtime.getContext().withTimeout(200);
-        return runtime.getNamespace().resolve(shortCtx, 'bedroom/tv')
-        .then(function() {
-          return true;
-        }).catch(function(err) {
-          return false;
-        });
-      }
-      // Resolve every 100ms until the name is removed, or 5 tries are
-      // attempted.
-      return promiseWhile(tryBindTo, function() {
-        var def = new Deferred();
-        setTimeout(function() {
-          def.resolve();
-        }, 100);
-        return def.promise;
-      });
-    }).then(function bindToRemovedSecondName() {
-      var shortCtx = runtime.getContext().withTimeout(100);
-      client.bindTo(shortCtx, 'bedroom/tv')
-      .then(function verifyRemovedSecondName(a) {
-        assert.fail('should not be able to bind to a removed name');
-        runtime.close(assert.end);
-      }, function verifyRemovedSecondName(err) {
-        assert.ok(err instanceof Error, 'should fail');
-        runtime.close(assert.end);
-      });
-    })
-    .catch(function(err) {
-      assert.error(err);
-      runtime.close(assert.end);
-    });
-  });
-});
-
-test('Test running several JS servers concurrently and under multiple ' +
-  'names', function(assert) {
-  var ctx;
-
-  var runtime;
-  var fooServer;
-  var barServer;
-  var fooStub;
-  var barStub;
-  var client;
-
-  // big test, give it more time to finish
-  assert.timeout(timeouts.long);
-
-  return vanadium.init(config)
-  .then(function createTwoServers(rt) {
-    runtime = rt;
-    client = rt.getClient();
-    ctx = rt.getContext();
-    return Promise.all([
-      rt.newServer(NAME_PREFIX + 'foo', fooService ),
-      rt.newServer(NAME_PREFIX + 'bar', barService )
-    ]);
-  })
-  .then(function publishFooAndBarUnderAdditionalNames(servers) {
-    fooServer = servers[0];
-    barServer = servers[1];
-    return Promise.all([
-      fooServer.addName(NAME_PREFIX + 'foo-fighter'),
-      barServer.addName(NAME_PREFIX + 'bar-baz')
-    ]);
-  })
-  .then(function bindToFoo() {
-    // BindTo foo or foo-fighter which ever comes back first
-    return Promise.race([
-      client.bindTo(ctx, NAME_PREFIX + 'foo'),
-      client.bindTo(ctx, NAME_PREFIX + 'foo-fighter')
-    ]);
-  })
-  .then(function validateFooStub(foo) {
-    fooStub = foo;
-    assert.ok(fooStub['foo'], 'foo stub has method foo()');
-    return fooStub.foo(ctx).then(function CallToFooRetruned(result) {
-      assert.equal(result, 'foo result');
-    });
-  })
-  .then(function stopFoo() {
-    return fooServer.stop();
-  })
-  .then(function validateFooWasStopped() {
-    var shortCtx = runtime.getContext().withTimeout(100);
-    return fooStub.foo(shortCtx)
-      .then(function() {
-        assert.fail('should have failed to call foo() after stop');
-      }, function(err) {
-        assert.ok(err);
-        assert.ok(err instanceof Error);
-      });
-  })
-  .then(function bindToBar() {
-    // BindTo bar or bar-fighter which ever comes back first
-    return Promise.race([
-      client.bindTo(ctx, NAME_PREFIX + 'bar'),
-      client.bindTo(ctx, NAME_PREFIX + 'bar-fighter')
-    ]);
-  })
-  .then(function validateBarStub(bar) {
-    barStub = bar;
-    assert.ok(barStub['bar'], 'bar stub has method bar()');
-    return barStub.bar(ctx).then(
-      function CallToBarRetruned(result) {
-      assert.equal(result, 'bar result');
-    });
-  })
-  .then(function stopBar() {
-    return barServer.stop();
-  })
-  .then(function validateBarWasStopped() {
-    var shortCtx = runtime.getContext().withTimeout(100);
-    return barStub.bar(shortCtx)
-      .then(function() {
-        assert.fail('should have failed to call bar() after stop');
-      }, function(err) {
-        assert.ok(err);
-        assert.ok(err instanceof Error);
-      });
-  })
-  .then(end)
-  .catch(end);
-
-  function end(err) {
-    assert.error(err);
-    if (runtime) {
-      runtime.close(assert.end);
-    } else {
-      assert.end();
-    }
-  }
-});
diff --git a/test/integration/test-remote-blessings.js b/test/integration/test-remote-blessings.js
deleted file mode 100644
index e179a5a..0000000
--- a/test/integration/test-remote-blessings.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-
-var config = require('./default-config');
-var defaultBlessingRegex = require('./default-blessing-regex');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var serve = require('./serve');
-var vanadium = require('../../');
-
-function assertBlessings(blessings, t) {
-  t.ok(Array.isArray(blessings), 'blessings is an array');
-  t.ok(blessings.length > 0, 'blessings has at least one blessing');
-  t.ok(defaultBlessingRegex.test(blessings[0]),
-      'blessings[0]: ' + blessings[0] +
-      ' should match the default blessings regex ' + defaultBlessingRegex);
-}
-
-var serverName = 'foo';
-function newDispatcher() {
-  return leafDispatcher({
-    bar: function(ctx, serverCall) {}
-  });
-}
-
-test('Test remote blessings with no method name ' +
-    '- client.remoteBlessings(' + serverName + ', cb)', function(t) {
-  serve(serverName, newDispatcher(), function(err, res) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-
-    client.remoteBlessings(ctx, serverName, function(err, blessings) {
-      if (err) {
-        t.error(err);
-        res.end(t);
-      }
-
-      assertBlessings(blessings, t);
-
-      res.end(t);
-    });
-  });
-});
-
-test('Test remote blessings with known method ' +
-    '- client.remoteBlessings(' + serverName + ', bar, cb)', function(t) {
-  serve(serverName, newDispatcher(), function(err, res) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-
-    client.remoteBlessings(ctx, serverName, 'bar', function(err, blessings) {
-      if (err) {
-        t.error(err);
-        res.end(t);
-      }
-
-      assertBlessings(blessings, t);
-
-      res.end(t);
-    });
-  });
-});
-
-test('Test remote blessings with unknown method ' +
-    '- client.remoteBlessings(' + serverName + ', baz, cb)', function(t) {
-  serve(serverName, newDispatcher(), function(err, res) {
-    if (err) {
-      return t.end(err);
-    }
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-
-    client.remoteBlessings(ctx, serverName, 'baz', function(err, blessings) {
-      if (err) {
-        t.error(err);
-        res.end(t);
-      }
-
-      assertBlessings(blessings, t);
-
-      res.end(t);
-    });
-  });
-});
-
-test('Test remote blessings with non-existant server ' +
-    '- client.remoteBlessings(unknown, cb)', function(t) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return t.end(err);
-    }
-    var client = rt.getClient();
-    var ctx = rt.getContext();
-
-    client.remoteBlessings(ctx, 'unknown', function(err, blessings) {
-      t.ok(err, 'should error');
-      rt.close(t.end);
-    });
-  });
-});
diff --git a/test/integration/test-runtime-close.js b/test/integration/test-runtime-close.js
deleted file mode 100644
index b96a2c7..0000000
--- a/test/integration/test-runtime-close.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var config = require('./default-config');
-
-test('Test closing runtime - runtime.close(cb)', function(assert) {
-  vanadium.init(config, oninit);
-
-  var rt;
-  function oninit(err, runtime) {
-    rt = runtime;
-    var ctx = runtime.getContext();
-    assert.error(err);
-    var client = runtime.getClient();
-    client.bindTo(ctx, 'test_service/cache', onbind);
-  }
-
-  function onbind(err, service) {
-    assert.error(err);
-    rt.close(assert.end);
-  }
-});
-
-test('Test closing runtime - var promise = runtime.close()', function(assert) {
-  vanadium
-  .init(config)
-  .then(bindTo)
-  .then(close)
-  .then(end)
-  .catch(assert.end);
-
-  var rt;
-
-  function bindTo(runtime) {
-    rt = runtime;
-    var client = runtime.getClient();
-    var ctx = runtime.getContext();
-    return client.bindTo(ctx, 'test_service/cache');
-  }
-
-  function close(service) {
-    return rt.close().then(function() {
-      assert.pass('Runtime closed successfully');
-    }).catch(function(err) {
-      assert.fail(err);
-    });
-  }
-
-  function end() {
-    assert.end();
-  }
-});
diff --git a/test/integration/test-sending-blessings.js b/test/integration/test-sending-blessings.js
deleted file mode 100644
index b47004a..0000000
--- a/test/integration/test-sending-blessings.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var WireBlessings = vanadium.security.WireBlessings;
-var Blessings = require('../../src/security/blessings');
-var security = vanadium.security;
-var types = vanadium.vdl.types;
-
-var blessingsService = {
-  createBlessings: function(ctx, serverCall, publicKey) {
-    var principal = vanadium.runtimeForContext(ctx).principal;
-    var expiryDate = new Date((new Date()).getTime() + 6000000);
-
-    return principal.blessingStore.getDefault(ctx).then(function(defaultBless) {
-      return principal.bless(ctx, publicKey, defaultBless, 'friend',
-                           security.createExpiryCaveat(expiryDate));
-    });
-  },
-  verifyBlessings: function(ctx, serverCall) {
-    var secCall = serverCall.securityCall;
-    // We can't look for an exact blessing, because node and browser tests
-    // have different root blessings.  Instead of looking for a particular
-    // blessing, we try to find the extension blessing string.
-    var hasGeneratedBlessing = secCall.remoteBlessingStrings.some(function(s) {
-      return s.indexOf(':friend') !== -1;
-    });
-    if (!hasGeneratedBlessing) {
-      throw new Error('bad blessings ' + secCall.remoteBlessingStrings);
-    }
-    return;
-  },
-  _serviceDescription: {
-    methods: [{
-      name: 'CreateBlessings',
-      inArgs: [{
-        type: types.STRING
-      }],
-      outArgs: [{
-        type: WireBlessings.prototype._type,
-      }]
-    }, {
-      name: 'VerifyBlessings',
-      inArgs: [],
-      outArgs: [],
-    }]
-  }
-};
-
-test('Test blessings are passed as return args', function(assert) {
-  serve('testing/blessings', leafDispatcher(blessingsService),
-        function(err, res) {
-    var principal = res.runtime.principal;
-
-    var ctx = res.runtime.getContext();
-    principal.blessingStore.getPublicKey(ctx).then(function(key) {
-      return res.service.createBlessings(ctx, key).then(function(blessings) {
-        assert.ok(blessings instanceof Blessings, 'Is a blessing');
-        return principal.blessingStore.set(ctx, blessings, 'test');
-      }).then(function() {
-        return res.service.verifyBlessings(ctx);
-      }).then(function() {
-        assert.ok(true, 'blessings succeed');
-        res.end(assert);
-      });
-    }).catch(function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-});
diff --git a/test/integration/test-server-call.js b/test/integration/test-server-call.js
deleted file mode 100644
index b1a5ae4..0000000
--- a/test/integration/test-server-call.js
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var serve = require('./serve');
-
-// Services that handles anything in a/b/* where b is the service name
-var service = {
-  getSuffix: function(ctx, serverCall) {
-    return serverCall.securityCall.suffix;
-  },
-  getContext: function(ctx, serverCall) {
-    return serverCall;
-  },
-  getArgs: function(ctx, serverCall, a, b, c, $stream, cb) {
-    var results = {
-      call: serverCall,
-      a: a,
-      b: b,
-      c: c
-    };
-
-    cb(null, results);
-  }
-};
-
-function dispatcher(suffix, cb) {
-  cb(null, {
-      service: service
-  });
-}
-
-var expectedContext = {
-  suffix: 'suf',
-  methodTags: []
-};
-
-function contains(actual, expected, assert) {
-  for (var key in expected) {
-    if (!expected.hasOwnProperty(key)) {
-      continue;
-    }
-    assert.deepEqual(actual[key], expected[key]);
-  }
-}
-
-var defaultBlessingRegex = require('./default-blessing-regex');
-
-function blessingStringsMatch(strings, regex, assert) {
-  assert.ok(strings.length > 0, 'Context has strings');
-
-  for (var i = 0; i < strings.length; i++) {
-    assert.ok(regex.test(strings[i]),
-        'string[' + i + '] matches expected name');
-  }
-}
-
-function validateEndpoint(ep, assert) {
-  assert.ok(typeof ep === 'string',
-            'Endpoint should be string');
-  assert.ok(ep !== '', 'endpoint should not be empty');
-}
-
-function validateContext(call, assert) {
-  blessingStringsMatch(call.localBlessingStrings, defaultBlessingRegex,
-                         assert);
-  blessingStringsMatch(call.remoteBlessingStrings, defaultBlessingRegex,
-                         assert);
-  validateEndpoint(call.localEndpoint, assert);
-  validateEndpoint(call.remoteEndpoint, assert);
-}
-
-test('Test non-empty suffix is available in context', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b/foo', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getSuffix(ctx, function(err, suffix) {
-        assert.error(err, 'should not error on getSuffix(...)');
-        assert.equal(suffix, 'foo');
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test Unicode suffix is available in context', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b/چשઑᜰ', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getSuffix(ctx, function(err, suffix) {
-        assert.error(err, 'should not error on getSuffix(...)');
-        assert.equal(suffix, 'چשઑᜰ');
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test empty suffix is available in context - ', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getSuffix(ctx, function(err, suffix) {
-        assert.error(err, 'should not error on getSuffix(...)');
-        assert.equal(suffix, '');
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test nested suffix /parent/suffix ', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b/parent/suf', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getSuffix(ctx, function(err, suffix) {
-        assert.error(err, 'should not error on getSuffix(...)');
-        assert.equal(suffix, 'parent/suf');
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test context object', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b/suf', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getContext(ctx, function(err, call) {
-        assert.error(err, 'should not error on getContext(...)');
-        contains(call.securityCall, expectedContext, assert);
-        validateContext(call.securityCall, assert);
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test context object and injected stream', function(assert) {
-  serve('a/b', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, 'a/b/suf', function(err, service) {
-      assert.error(err, 'should not error on runtime.bindTo(...)');
-
-      service.getArgs(ctx, '-a-','-b-','-c-', function(err, results) {
-        assert.error(err, 'service.getArgs(...) should not error');
-
-        contains(results, {
-          a: '-a-',
-          b: '-b-',
-          c: '-c-'
-        }, assert);
-
-        var call = results.call.securityCall;
-        contains(call, expectedContext, assert);
-        validateContext(call, assert);
-        end(assert);
-      });
-    });
-  });
-});
diff --git a/test/integration/test-server-context.js b/test/integration/test-server-context.js
deleted file mode 100644
index 762a4d5..0000000
--- a/test/integration/test-server-context.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var LANG_KEY = require('../../src/runtime/shared-context-keys').LANG_KEY;
-var dispatcher = leafDispatcher({
-  test: function(ctx, serverCall) {
-    return ctx.value(LANG_KEY);
-  }
-}, function auth(ctx, call) {
-  if (ctx.value(LANG_KEY) !== 'my-lang') {
-    throw new Error('bad lang ' + ctx.value(LANG_KEY));
-  }
-});
-test('Test language in context', function(assert) {
-  serve('context', dispatcher, function(err, res, end) {
-    assert.error(err, 'should not error on serve(...)');
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext().withValue(LANG_KEY, 'my-lang');
-    client.bindTo(ctx, 'context').then(function(service) {
-      return service.test(ctx);
-    }).then(function(lang) {
-      assert.equal(lang, 'my-lang');
-      res.end(assert);
-    }).catch(function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-});
diff --git a/test/integration/test-server-errors.js b/test/integration/test-server-errors.js
deleted file mode 100644
index 24e363d..0000000
--- a/test/integration/test-server-errors.js
+++ /dev/null
@@ -1,149 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var Deferred = require('../../src/lib/deferred');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var message = 'failure';
-
-testStandardErrors();
-testNonStandardErrors();
-
-function testStandardErrors() {
-  var error = new Error(message);
-  var errorThrower = {
-    throwError: function(ctx, serverCall) {
-      throw error;
-    },
-    returnErrorInCallback: function(ctx, serverCall, cb) {
-      cb(error, null);
-    },
-    returnStringErrorInCallback: function(ctx, serverCall, cb) {
-      cb(message, null);
-    },
-    rejectPromise: function(ctx, serverCall) {
-      var def = new Deferred();
-      def.promise.catch(function() {});
-      def.reject(error);
-      return def.promise;
-    },
-    throwCustomError: function(ctx, serverCall) {
-      function CustomError(message) {
-        Error.call(this);
-        this.name = 'CustomError';
-        this.message = message;
-        this.stack = (new Error()).stack;
-      }
-      CustomError.prototype = new Error();
-      CustomError.prototype.constructor = CustomError;
-
-      throw new CustomError(message);
-    }
-  };
-  var dispatcher = leafDispatcher(errorThrower);
-  var methods = Object.keys(errorThrower);
-
-  methods.forEach(function(method) {
-    test('Test returning errors of type error() - ' +
-      method + '(callback)', function(assert) {
-
-      serve('js/errorThrower/' + method, dispatcher, function(err, res) {
-        if (err) {
-          return assert.end(err);
-        }
-
-        var ctx = res.runtime.getContext();
-        res.service[method](ctx, function(err) {
-          assert.ok(err, 'should error');
-          assert.ok(err instanceof Error, 'should be Error');
-          // TODO(jasoncampbell): The JS is missing support for server context
-          // that would allow the error.message to be translated properly as it
-          // travels through the supporting vanadium services. Currently the
-          // message will be converted to "wsprd Root Error " after it goes out
-          // over the wire and gets to the client. To resolve this we need to
-          // make sure that the context (contains server name and operation)
-          // and the params are sent along in error cases. So that the msg
-          // string can be convert the template "{1} {2} Error {_}" into
-          // something like "my-server my-method Error Error: my-error-message"
-          //
-          // SEE: v.io/v23/verror
-          // assert.equal(err.message, message);
-          assert.notEqual(err.stack, error.stack,
-            'the original stack should not be sent over the wire');
-          res.end(assert);
-        });
-      });
-    });
-  });
-}
-
-function testNonStandardErrors() {
-  var nonStandardErrorThrower = {
-    throwString: function(ctx, serverCall) {
-      throw message;
-    },
-    rejectPromiseWithString: function(ctx, serverCall) {
-      var def = new Deferred();
-      def.promise.catch(function() {});
-      def.reject(message);
-      return def.promise;
-    },
-    throwNull: function(ctx, serverCall) {
-      throw null;
-    },
-    throwEmpty: function(ctx, serverCall) {
-      throw '';
-    },
-    rejectNothing: function(ctx, serverCall) {
-      var def = new Deferred();
-      def.promise.catch(function() {});
-      def.reject();
-      return def.promise;
-    },
-    rejectNull: function(ctx, serverCall) {
-      var def = new Deferred();
-      def.promise.catch(function() {});
-      def.reject(null);
-      return def.promise;
-    },
-    rejectEmpty: function(ctx, serverCall) {
-      var def = new Deferred();
-      def.promise.catch(function() {});
-      def.reject('');
-      return def.promise;
-    }
-  };
-  var dispatcher = leafDispatcher(nonStandardErrorThrower);
-
-  Object.keys(nonStandardErrorThrower).forEach(function(method) {
-    test('Test returning errors that are not of standard type error() - ' +
-      method + '()', function(assert) {
-
-      serve('js/thrower/' + method, dispatcher, function(err, res) {
-        if (err) {
-          return assert.end(err);
-        }
-
-        var ctx = res.runtime.getContext();
-        res.service[method](ctx, function(err) {
-          assert.ok(err, 'should error');
-          assert.ok(err instanceof Error, 'should be Error');
-          // TODO(jasoncampbell): Update once context and param support is
-          // available in JS.
-          //
-          // SEE: test/integration/test-server-error.js:62
-          // assert.equal(err.message, 'Unknown exception.');
-          // TODO(bprosnitz) Change back to
-          // assert.deepEquals(err.idAction, vanadium.errors.IdActions);
-          assert.ok(err instanceof vanadium.verror.UnknownError,
-            'error ids match');
-          assert.ok(err.stack, 'error has a stack');
-          res.end(assert);
-        });
-      });
-    });
-  });
-}
diff --git a/test/integration/test-server-glob.js b/test/integration/test-server-glob.js
deleted file mode 100644
index f91bcc9..0000000
--- a/test/integration/test-server-glob.js
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var serve = require('./serve');
-var Promise = require('../../src/lib/promise');
-var vanadium = require('../../');
-var naming = vanadium.naming;
-var verror = vanadium.verror;
-
-var ALBUMS = [
-  'public',
-  'public/2014',
-  'public/2014/california',
-  'public/2014/california/los-angeles',
-  'public/2014/california/san-francisco',
-  'public/2014/california/san-francisco/golden-gate',
-  'public/2014/newyork',
-  'public/2014/newyork/nyc',
-  'public/2014/newyork/nyc/empire-state',
-  'public/2015',
-  'private',
-  'private/2013',
-  'private/2013/california',
-  'private/2013/california/wedding',
-  'private/2013/california/wedding/reception'
-];
-
-function Directory() {
-  this.children = {};
-}
-
-Directory.prototype._addChild = function(name, node) {
-  this.children[name] = node;
-};
-
-Directory.prototype.__globChildren = function(ctx, serverCall, $stream) {
-  Object.keys(this.children).forEach(function(child) {
-    $stream.write(child);
-  });
-};
-
-function createNodes(files) {
-  var root = new Directory();
-  for (var i = 0; i < files.length; i++) {
-    var path = files[i].split('/');
-    var currentNode = root;
-    for (var j = 0; j < path.length; j++) {
-      var component = path[j];
-      var node = currentNode.children[component];
-      // Add this element if it doesn't exist.
-      if (!node) {
-        node = new Directory();
-        currentNode._addChild(component, node);
-      }
-      currentNode = node;
-    }
-  }
-  return root;
-}
-
-function createAuthorizer(disallowed) {
-  return function(ctx, call) {
-    for (var i = 0; i < disallowed.length; i++) {
-      if (call.suffix === disallowed[i]) {
-        return new Error('disallowed');
-      }
-    }
-    return;
-  };
-}
-
-function createDispatcher(root, disallowed) {
-  return function(suffix) {
-    var auth;
-    if (disallowed) {
-      auth = createAuthorizer(disallowed);
-    }
-    if (suffix === '') {
-      return {
-        service: root,
-        authorizer: auth
-      };
-    }
-    var path = suffix.split('/');
-    var current = root;
-    for (var i = 0; i < path.length; i++) {
-      current = current.children[path[i]];
-      if (!current) {
-        return Promise.reject(new Error('not found'));
-      }
-    }
-    return Promise.resolve({
-      service: current,
-      authorizer: auth
-    });
-  };
-}
-
-function runChildrenGlobTest(pattern, expectedResults, disallowed, assert) {
-  runGlobTest(pattern, expectedResults,
-              createDispatcher(createNodes(ALBUMS), disallowed),
-              disallowed,
-              assert);
-}
-
-function runGlobTest(pattern, expectedResults, dispatcher, expectedErrors,
-  assert) {
-  serve({
-    name: 'testGlob',
-    autoBind: false,
-    dispatcher: dispatcher
-  }, function(err, res) {
-    if (err) {
-      return assert.end(err);
-    }
-
-    var namespace = res.runtime.getNamespace();
-    var ctx = res.runtime.getContext();
-    var globRPC = namespace.glob(ctx, pattern);
-    var stream = globRPC.stream;
-    var globResults = [];
-    var globErrors = [];
-    var hadErrors = false;
-    stream.on('data', function(mountPoint) {
-      globResults.push(mountPoint.name);
-    });
-
-    stream.on('error', function(errItem) {
-      hadErrors = true;
-      assert.ok(errItem.error instanceof Error);
-      assert.ok(typeof errItem.name === 'string');
-
-      // The tests are setup to error based on name, which is this glob error.
-      assert.ok(errItem.error instanceof verror.NoServersError);
-      globErrors.push(errItem.name);
-    });
-
-    stream.on('end', function() {
-      globResults.sort();
-      expectedResults.sort();
-      assert.deepEqual(globResults, expectedResults);
-      if (expectedErrors) {
-        globErrors.sort();
-        expectedErrors.sort();
-        assert.deepEqual(globErrors, expectedErrors);
-        assert.ok(hadErrors, 'expected to have errors on the stream');
-      } else {
-        assert.notOk(hadErrors, 'expected not to have errors on the stream');
-      }
-      res.end(assert);
-    });
-
-  });
-}
-
-test('Test globbing all descendants of root - GlobChildren - ' +
-  'glob(testGlob/...)', function(assert) {
-  var expectedResults = ALBUMS.map(function(s) { return 'testGlob/' + s; });
-  // We need to push testGlob twice because we get one entry from the
-  // mountable and the next entry from the glob method.  This is expected
-  // behavior.
-  expectedResults.push('testGlob');
-  expectedResults.push('testGlob');
-  expectedResults.sort();
-  runChildrenGlobTest('testGlob/...', expectedResults, null, assert);
-});
-
-test('Test globbing all descendants of a child - GlobChildren - ' +
-  ' glob(testGlob/private/...)',
-  function(assert) {
-  var expectedResults = [
-    'testGlob/private',
-    'testGlob/private/2013',
-    'testGlob/private/2013/california',
-    'testGlob/private/2013/california/wedding',
-    'testGlob/private/2013/california/wedding/reception',
-  ];
-  runChildrenGlobTest('testGlob/private/...', expectedResults, null, assert);
-});
-
-test('Test globbing children of root - GlobChildren - glob(testGlob/*)',
-  function(assert) {
-  var expectedResults = [
-    'testGlob/private',
-    'testGlob/public',
-  ];
-  runChildrenGlobTest('testGlob/*', expectedResults, null, assert);
-});
-
-test('Test globbing pattern testGlob/*/*/california - GlobChildren',
-  function(assert) {
-  var expectedResults = [
-    'testGlob/private/2013/california',
-    'testGlob/public/2014/california',
-  ];
-  runChildrenGlobTest('testGlob/*/*/california', expectedResults, null, assert);
-});
-
-test('Test globbing pattern testGlob/*/20*/california/... - GlobChildren',
-  function(assert) {
-  var expectedResults = [
-    'testGlob/private/2013/california',
-    'testGlob/private/2013/california/wedding',
-    'testGlob/private/2013/california/wedding/reception',
-    'testGlob/public/2014/california',
-    'testGlob/public/2014/california/los-angeles',
-    'testGlob/public/2014/california/san-francisco',
-    'testGlob/public/2014/california/san-francisco/golden-gate',
-  ];
-  runChildrenGlobTest('testGlob/*/20*/california/...', expectedResults, null,
-                      assert);
-});
-
-test('Test globbing a partially restricted namespace - GlobChildren -' +
-  ' testGlob/private is restricted', function(assert) {
-  var expectedResults = [
-    'testGlob',
-    'testGlob',
-    'testGlob/public',
-    'testGlob/public/2014',
-    'testGlob/public/2014/california',
-    'testGlob/public/2014/california/los-angeles',
-    'testGlob/public/2014/california/san-francisco',
-    'testGlob/public/2014/california/san-francisco/golden-gate',
-    'testGlob/public/2014/newyork',
-    'testGlob/public/2014/newyork/nyc',
-    'testGlob/public/2014/newyork/nyc/empire-state',
-    'testGlob/public/2015'
-  ];
-
-  var restrictedNames = ['private'];
-  runChildrenGlobTest('testGlob/...', expectedResults, restrictedNames, assert);
-});
-
-test('Test globbing a fully restricted namespace - GlobChildren -' +
-  ' all children of root are restricted', function(assert) {
-  var expectedResults = [
-    'testGlob',
-    'testGlob'
-  ];
-  var restrictedNames = ['private', 'public'];
-  runChildrenGlobTest('testGlob/...', expectedResults, restrictedNames, assert);
-});
-
-function FullGlobber() {
-}
-
-FullGlobber.prototype.__glob = function(ctx, serverCall, glob, $stream) {
-    var mountEntry = new naming.MountEntry({
-      name: naming.join(serverCall.securityCall.suffix, glob),
-    });
-    $stream.write(new naming.GlobReply({
-      entry: mountEntry
-    }));
-};
-
-test('Test globbing all descendants of root - FullGlobber - glob(testGlob/...)',
-  function(assert) {
-  var expectedResults = [
-    'testGlob',
-    'testGlob/...',
-  ];
-  function dispatcher(suffix) {
-    return {
-      service: new FullGlobber(),
-    };
-  }
-  runGlobTest('testGlob/...', expectedResults, dispatcher, null, assert);
-});
-
-test('Test globbing all descendants of a child - FullGlobber - ' +
-  'glob(testGlob/bar/...)', function(assert) {
-  var expectedResults = [
-    'testGlob/bar/...',
-  ];
-  function dispatcher(suffix) {
-    return {
-      service: new FullGlobber(),
-    };
-  }
-  runGlobTest('testGlob/bar/...', expectedResults, dispatcher, null, assert);
-});
-
-
-function ChildGlobber(children) {
-  this.children = children;
-}
-
-ChildGlobber.prototype.__globChildren = function(ctx, $stream) {
-  for (var i = 0; i < this.children.length; i++) {
-    $stream.write(this.children[i]);
-  }
-};
-
-test('Test mixing GlobChildren and FullGlobber', function(assert) {
-  var expectedResults = [
-    'testGlob/foo/bar/baz',
-  ];
-
-  function dispatcher(suffix) {
-    var service;
-    if (suffix === '') {
-     service = new ChildGlobber(['foo', 'bar']);
-    } else if (suffix === 'foo') {
-      service = new FullGlobber();
-    } else {
-      service = new ChildGlobber([]);
-    }
-    return {
-      service: service,
-    };
-  }
-  runGlobTest('testGlob/foo/bar/baz', expectedResults, dispatcher, null,
-    assert);
-});
diff --git a/test/integration/test-server-option.js b/test/integration/test-server-option.js
deleted file mode 100644
index ddcf6c8..0000000
--- a/test/integration/test-server-option.js
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var serve = require('./serve');
-
-function dispatcher(suffix) {
-  return {
-    service: function(ctx, serverCall) {
-      throw new Error('NotImplemented');
-    },
-    authorizer: function(ctx, call) {
-      return null;
-    }
-  };
-}
-
-test('Test IsLeaf=True Server Option', function(t) {
-  var serverOption = vanadium.rpc.serverOption({
-    isLeaf: true
-  });
-  var name = 'testing/serverOption/isLeafTrue';
-
-  var servObj = {
-    name: name,
-    dispatcher: dispatcher,
-    serverOption: serverOption
-  };
-
-  serve(servObj, function(err, res) {
-    t.error(err);
-
-    var rt = res.runtime;
-    var ns = rt.getNamespace();
-    var stream = ns.glob(rt.getContext(), name).stream;
-    stream.on('data', function(mp) {
-      t.error(err);
-
-      t.equal(mp.isLeaf, true, 'Glob must indicate server is a leaf');
-      t.equal(mp.servesMountTable, false,
-        'Glob must indicate server is not a mounttable');
-      res.end(t);
-    });
-  });
-});
-
-test('Test IsLeaf=False Server Option', function(t) {
-  var serverOption = vanadium.rpc.serverOption({
-    isLeaf: false
-  });
-  var name = 'testing/serverOption/isLeafFalse';
-
-  var servObj = {
-    name: name,
-    dispatcher: dispatcher,
-    serverOption: serverOption
-  };
-
-  serve(servObj, function(err, res) {
-    t.error(err);
-
-    var rt = res.runtime;
-    var ns = rt.getNamespace();
-    var stream = ns.glob(rt.getContext(), name).stream;
-    stream.on('data', function(mp) {
-      t.error(err);
-
-      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
-      t.equal(mp.servesMountTable, false,
-        'Glob must indicate server is not a mounttable');
-      res.end(t);
-    });
-  });
-});
-
-//test('Test ServesMountTable=True Server Option', function(t) {
-//  var serverOption = vanadium.rpc.serverOption({
-//    servesMountTable: true
-//  });
-//  var name = 'testing/serverOption/ServesMountTableTrue';
-//
-//  var servObj = {
-//    name: name,
-//    dispatcher: dispatcher,
-//    serverOption: serverOption
-//  };
-//
-//  serve(servObj, function(err, res) {
-//    t.error(err);
-//
-//    var rt = res.runtime;
-//    var ns = rt.getNamespace();
-//    var stream = ns.glob(rt.getContext(), name).stream;
-//    stream.on('data', function(mp) {
-//      t.error(err);
-//
-//      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
-//      t.equal(mp.servesMountTable, true,
-//        'Glob must indicate server is a mounttable');
-//      res.end(t);
-//    });
-//  });
-//});
-
-test('Test ServesMountTable=false server option', function(t) {
-  var serverOption = vanadium.rpc.serverOption({
-    servesMountTable: false
-  });
-  var name = 'testing/serverOption/ServesMountTableFalse';
-
-  var servObj = {
-    name: name,
-    dispatcher: dispatcher,
-    serverOption: serverOption
-  };
-
-  serve(servObj, function(err, res) {
-    t.error(err);
-
-    var rt = res.runtime;
-    var ns = rt.getNamespace();
-    var stream = ns.glob(rt.getContext(), name).stream;
-    stream.on('data', function(mp) {
-      t.error(err);
-
-      t.equal(mp.isLeaf, false, 'Glob must indicate server is not a leaf');
-      t.equal(mp.servesMountTable, false,
-        'Glob must indicate server is not a mounttable');
-      res.end(t);
-    });
-  });
-});
-
-//test('Test ServesMountTable=ture and IsLeaf=true server option',
-//  function(t) {
-//    var serverOption = vanadium.rpc.serverOption({
-//      servesMountTable: true,
-//      isLeaf: true
-//    });
-//    var name = 'testing/serverOption/Both';
-//
-//    var servObj = {
-//      name: name,
-//      dispatcher: dispatcher,
-//      serverOption: serverOption
-//    };
-//
-//    serve(servObj, function(err, res) {
-//      t.error(err);
-//
-//      var rt = res.runtime;
-//      var ns = rt.getNamespace();
-//      var stream = ns.glob(rt.getContext(), name).stream;
-//      stream.on('data', function(mp) {
-//        t.error(err);
-//
-//        t.equal(mp.isLeaf, true, 'Glob must indicate server is a leaf');
-//        t.equal(mp.servesMountTable, true,
-//          'Glob must indicate server is a mounttable');
-//        res.end(t);
-//      });
-//    });
-//  });
\ No newline at end of file
diff --git a/test/integration/test-server-stop.js b/test/integration/test-server-stop.js
deleted file mode 100644
index 118ffd6..0000000
--- a/test/integration/test-server-stop.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var dispatcher = leafDispatcher({
-  foo: function(ctx, serverCall) {
-    return 'bar';
-  }
-});
-var name = 'my-test/service';
-
-test('Test stopping a JS service - ' +
-  'server.stop(callback)', function(assert) {
-  serve(name, dispatcher, function(err, res) {
-    assert.error(err);
-
-    res.server.stop(function(err) {
-      assert.error(err);
-
-      var ctx = res.runtime.getContext().withTimeout(100);
-      res.service.foo(ctx, function(err, result) {
-        assert.ok(err, 'should fail');
-        res.end(assert);
-      });
-    });
-  });
-});
-
-
-test('Test stopping a JS service - ' +
-  'var promise = server.stop()', function(assert) {
-  serve(name, dispatcher, function(err, res) {
-    assert.error(err);
-
-    var ctx = res.runtime.getContext().withTimeout(100);
-    res.server.stop()
-    .then(function() {
-      return res.service.foo(ctx);
-    })
-    .then(function() {
-      assert.fail('should not succeed');
-      res.end(assert);
-    }, function(err) {
-      assert.ok(err, 'should fail');
-      res.end(assert);
-    })
-    .catch(function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-});
-
-test('Test stopping a JS service twice - ' +
-  'server.stop(callback)', function(assert) {
-  serve(name, dispatcher, function(err, res) {
-    assert.error(err);
-
-    res.server.stop(function(err) {
-      assert.error(err);
-
-      res.server.stop(function(err) {
-        assert.error(err);
-        res.end(assert);
-      });
-    });
-  });
-});
diff --git a/test/integration/test-service-cache.js b/test/integration/test-service-cache.js
deleted file mode 100644
index de12003..0000000
--- a/test/integration/test-service-cache.js
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var NoExistError = vanadium.verror.NoExistError;
-var config = require('./default-config');
-var service = require('./get-service');
-var Promise = require('../../src/lib/promise');
-
-test('Test set() of Go sample cache service - ' +
-  'cache.set(key, value, callback)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache.set(ctx, 'foo', 'bar', function(err, result) {
-      assert.error(err);
-      end(assert);
-    });
-  });
-});
-
-test('Test set() of Go sample cache service - ' +
-  'var promise = cache.set(key, value)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache.set(ctx, 'foo', 'bar')
-    .then(function() {
-      end(assert);
-    }, function(err) {
-      assert.err(err);
-      end(assert);
-    });
-  });
-});
-
-test('Test get() of Go sample cache service - ' +
-  'cache.get(key, value, callback)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache.set(ctx, 'baz', 'qux', function(err, result) {
-      assert.error(err);
-
-      cache.get(ctx, 'baz', function(err, value) {
-        assert.error(err);
-        assert.equal(value, 'qux');
-        end(assert);
-      });
-    });
-  });
-});
-
-test('Test get() of Go sample cache service - ' +
-  'var promise = cache.get(key, value)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache.set(ctx, 'baz', 'qux')
-    .then(function() {
-      return cache.get(ctx, 'baz');
-    })
-    .then(function(value) {
-      assert.equal(value, 'qux');
-      end(assert);
-    })
-    .catch(function(err) {
-      // I dont think this does what I think it does
-      assert.error(err);
-      end(assert);
-    });
-  });
-});
-
-test('Test get() with invalid key of Go sample cache service - ' +
-  'cache.get(key, value, callback)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache.get(ctx, 'is not a thing', function(err, value) {
-      assert.ok(err instanceof NoExistError, 'should error');
-      assert.ok(err.message, 'test_serviced:"cache".Get: ' +
-        'Does not exist: is not a thing');
-      end(assert);
-    });
-  });
-});
-
-test('Test get() with invalid key of Go sample cache service - ' +
-  'var promise = cache.get(key, value) - failure', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    cache
-    .get(ctx, 'really not a thing')
-    .then(function() {
-      assert.fail('should not succeed');
-      end(assert);
-    })
-    .catch(function(err) {
-      assert.ok(err instanceof NoExistError, 'should error');
-      assert.ok(err.message, 'test_serviced:"cache".Get: ' +
-        'Does not exist: really not a thing');
-      end(assert);
-    });
-  });
-});
-
-test('Test calling a non-existing method of Go sample cache service - ' +
-  'cache.badMethod()', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    assert.throws(function() {
-      // The cache stub doesn't have this method.
-      cache.notEvenAThing('whatever');
-    });
-
-    end(assert);
-  });
-});
-
-test('Test multiGet() streaming method of Go sample cache service - ' +
-  'var stream = cache.multiGet().stream', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    // `cache.mutliGet()` returns an object that has a "stream" attribute.
-    // The way the streaming interface is implmented for cache.mutliGet()
-    // is that you use stream.write(key) to get the value of a key. The value
-    // is emitted on the stream's data event. In this test there are a few
-    //  steps to set this up:
-    //
-    // * Prime the cache by setting a bunch of key/values
-    // * Add a listener or create a stream reader to recieve the values
-    // * Assert the values are correct
-    // * End the stream.
-
-    // Build a map of items
-    var items = {};
-    for (var i = 0; i < 10; ++i) {
-      items[i] = {
-        key: i,
-        value: 'next value: ' + i
-      };
-    }
-
-    // Add them to the cache
-    var jobs = Object.keys(items).map(function(key) {
-      return cache.set(ctx, key, JSON.stringify(items[key]));
-    });
-
-    Promise
-    .all(jobs)
-    .then(function() {
-      var promise = cache.multiGet(ctx);
-      var stream = promise.stream;
-
-      // Error handling boilerplate
-      promise.catch(error);
-      stream.on('error', error);
-
-      // "data" event emits cached values
-      stream.on('data', function(value) {
-        var string = value.toString();
-        var json = JSON.parse(string);
-        var actual = json.value;
-        var expected = items[json.key].value;
-
-        assert.equal(actual, expected);
-      });
-
-      stream.on('end', function() {
-        end(assert);
-      });
-
-      Object.keys(items).forEach(function(key) {
-        stream.write(key);
-      });
-
-      stream.end();
-    });
-
-    function error(err) {
-      assert.error(err);
-      end(assert);
-    }
-  });
-});
-
-test('Test getting signature of Go sample cache service - ' +
-  'var promise = client.signature(ctx, test_service/cache)', function(assert) {
-  vanadium.init(config)
-  .then(function(runtime) {
-    var ctx = runtime.getContext();
-    var client = runtime.getClient();
-    client.signature(ctx, 'test_service/cache')
-    .then(function(sigs) {
-      assert.ok(sigs, 'received something');
-      assert.ok(Array.isArray(sigs), 'receives a signature array');
-      runtime.close(assert.end);
-    }).catch(function(err) {
-      assert.error(err);
-      runtime.close(assert.end);
-    });
-  }).catch(assert.end);
-});
-
-test('Test getting signature of Go sample cache service - ' +
-  'client.signature(ctx, test_service/cache, callback)', function(assert) {
-  vanadium.init(config, function(err, runtime) {
-    if(err) {
-      assert.end(err);
-    }
-
-    var ctx = runtime.getContext();
-    var client = runtime.getClient();
-    client.signature(ctx, 'test_service/cache', function(err, sigs) {
-      assert.error(err);
-      assert.ok(sigs, 'received something');
-      assert.ok(Array.isArray(sigs), 'receives a signature array');
-      runtime.close(assert.end);
-    });
-  });
-});
-
-test('Test a streaming method timing out - ' +
-  'var promise = cache.multiGet(shortTimeout)', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-
-    var shortCtx = ctx.withTimeout(10); // very short timeout
-    var promise = cache.multiGet(shortCtx); // streaming method
-    promise.then(function success() {
-      assert.fail('Should have timedout and errored but succeeded');
-      end(assert);
-    }, function error() {
-      assert.pass('Steaming method timedout correctly');
-      end(assert);
-    });
-  });
-});
diff --git a/test/integration/test-service-errors.js b/test/integration/test-service-errors.js
deleted file mode 100644
index 1e6f31e..0000000
--- a/test/integration/test-service-errors.js
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var service = require('./get-service');
-var verror = vanadium.verror;
-var VanadiumError = verror.VanadiumError;
-
-test('Test Go service returning Aborted error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwAborted(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Aborted') !== -1);
-      assert.ok(err instanceof verror.AbortedError, 'should be AbortedError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning BadArg error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwBadArg(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Bad argument') !== -1);
-      assert.ok(err instanceof verror.BadArgError, 'should be BadArgError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning BadProtocol error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwBadProtocol(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Bad protocol') !== -1);
-      assert.ok(err instanceof verror.BadProtocolError,
-        'should be BadProtocolError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning Internal error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwInternal(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Internal error') !== -1);
-      assert.ok(err instanceof verror.InternalError,
-        'should be InternalError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning NoAccess error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwNoAccess(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Access denied') !== -1);
-      assert.ok(err instanceof verror.NoAccessError,
-        'should be NoAccessError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning NoExist error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwNoExist(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Does not exist') !== -1);
-      assert.ok(err instanceof verror.NoExistError, 'should be NoExistError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning NoExistOrNoAccess error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwNoExistOrNoAccess(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Does not exist or access denied') !== -1);
-      assert.ok(err instanceof verror.NoExistOrNoAccessError,
-        'should be NoExistOrNoAccess');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning Unknown error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwUnknown(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('Error') !== -1);
-      assert.ok(err instanceof VanadiumError, 'should be VanadiumError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning GoError error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwGoError(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('GoError!') !== -1);
-      assert.ok(err instanceof VanadiumError, 'should be VanadiumError');
-      end(assert);
-    });
-  });
-});
-
-test('Test Go service returning CustomStandard error - ' +
-  'errorThrower.method(callback)', function(assert) {
-  service('test_service/errorThrower', function(err, ctx, errorThrower, end) {
-    assert.error(err);
-
-    errorThrower.throwCustomStandardError(ctx, function(err) {
-      assert.ok(err, 'should error');
-      assert.ok(err.message.indexOf('CustomStandard!') !== -1);
-      assert.ok(err instanceof VanadiumError, 'should be VanadiumError');
-      end(assert);
-    });
-  });
-});
diff --git a/test/integration/test-service-native.js b/test/integration/test-service-native.js
deleted file mode 100644
index 242ee53..0000000
--- a/test/integration/test-service-native.js
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var vanadium = require('../../');
-var service = require('./get-service');
-var makeError = vanadium.verror.makeError;
-var actions = vanadium.verror.actions;
-
-var E = makeError('randomPrefix.verror', actions.NO_RETRY,
-                  '{1} {2}: RandomError: {_}');
-
-test('Test PassTime of Go native service', function(assert) {
-  service('test_service/native', function(err, ctx, native, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-    var now = new Date();
-    native.passTime(ctx, now, function(err, result) {
-      assert.error(err);
-      assert.ok(result instanceof Date, 'native type is returned');
-      var diff = Math.abs(result - now);
-      // It might be ok to do an equals on the two date objects but because
-      // Numbers are floating point and there is some amount of math to do
-      // the conversion, === on these dates might not be true even when the
-      // dates are really the same.
-      assert.ok(diff < 1);
-      end(assert);
-    });
-  });
-});
-
-test('Test PassError of Go native service', function(assert) {
-  service('test_service/native', function(err, ctx, native, end) {
-    assert.error(err);
-    if (err) {
-      return end(assert);
-    }
-    var e = new E(null, 'extra string', 4, false);
-    var expectedMessage = 'app op: RandomError: extra string 4 false';
-    native.passError(ctx, e, function(err, result) {
-      // Bluebird adds __stackCleaned__ as part of its processing but it
-      // doesn't show up in the vom decoded message, so we can't do a
-      // deepEqual.
-      assert.equal(e.id, err.id);
-      assert.equal(e.retryCode, err.retryCode);
-      assert.equal(e.msg, err.msg);
-      assert.equal(e.message, err.message);
-      assert.equal(e.msg, expectedMessage);
-      assert.equal(e.message, expectedMessage);
-      // The decoded error has the paramList values wrapped, since the
-      // paramList is a list of any.  The error passed into the call
-      // does not have that wrapping.  We add the wrapping to e to make sure
-      // the decoded error has the wrapped paramlist.
-      // Note: 'extra string', 4, and false are native values. They would
-      // normally be converted to JSValue since the paramList is []any. However,
-      // they are specifically guessed to be string, number, and bool in order
-      // to avoid revealing JSValue to other languages in the common case.
-      // https://github.com/veyron/release-issues/issues/1560
-      e.paramList = e.paramList.map(function (v) { return { val: v }; });
-      assert.deepEqual(e.paramList, err.paramList);
-      end(assert);
-    });
-  });
-});
diff --git a/test/integration/test-vanadium-init.js b/test/integration/test-vanadium-init.js
deleted file mode 100644
index 23c6509..0000000
--- a/test/integration/test-vanadium-init.js
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var extend = require('xtend');
-var isBrowser = require('is-browser');
-var parallel = require('run-parallel');
-var test = require('prova');
-
-var config = require('./default-config');
-var vanadium = require('../../');
-
-test('Test vanadium.init({authenticate: true}) gives runtime with account name',
-    function(t) {
-
-  var c = extend({authenticate: true}, config);
-
-  vanadium.init(c, function(err, rt) {
-    if (!isBrowser) {
-      t.ok(err, 'should error in node');
-      return t.end();
-    }
-
-    if (err) {
-      t.error(err);
-      return t.end(err);
-    }
-
-    t.ok(rt, 'runtime exists');
-    t.ok(rt.accountName, 'runtime has accountName property');
-    t.ok(typeof rt.accountName === 'string', 'rt.accountName is string');
-    t.ok(rt.accountName.length > 0, 'rt.accountName has length > 0');
-    t.end();
-  });
-});
-
-test('Test vanadium.init({authenticate: true}) twice gives two runtimes',
-    function(t) {
-
-  if (!isBrowser) {
-    return t.end();
-  }
-
-  var c = extend({authenticate: true}, config);
-
-  function vanadiumInit(cb) {
-    vanadium.init(c, cb);
-  }
-
-  parallel([vanadiumInit, vanadiumInit], function(err, runtimes) {
-    if (err) {
-      t.error(err);
-      t.end();
-      return;
-    }
-
-    runtimes.forEach(function(rt) {
-      t.ok(rt, 'runtime exists');
-      t.ok(rt.accountName, 'runtime has accountName property');
-      t.ok(typeof rt.accountName === 'string', 'rt.accountName is string');
-      t.ok(rt.accountName.length > 0, 'rt.accountName has length > 0');
-    });
-
-    t.end();
-  });
-});
-
-test('Test config logLevel INFO sets the vlog logLevel', function(t) {
-  var c = extend({logLevel: vanadium.vlog.levels.INFO }, config);
-
-  vanadium.init(c, function(err, rt) {
-    if (err) {
-      t.error(err);
-      return t.end(err);
-    }
-
-    t.equal(vanadium.vlog.logger.level, vanadium.vlog.levels.INFO);
-    rt.close(t.end);
-  });
-});
-
-test('Test config logLevel ERROR sets the vlog logLevel', function(t) {
-  var c = extend({logLevel: vanadium.vlog.levels.ERROR }, config);
-
-  vanadium.init(c, function(err, rt) {
-    if (err) {
-      t.error(err);
-      return t.end(err);
-    }
-
-    t.equal(vanadium.vlog.logger.level, vanadium.vlog.levels.ERROR);
-    rt.close(t.end);
-  });
-});
-
-test('Test vanadium.init({authenticate: false}) gives runtime ' +
-    'with unknown name', function(t) {
-
-  var c = extend({authenticate: false}, config);
-
-  vanadium.init(c, function(err, rt) {
-    if (err) {
-      t.error(err);
-      return t.end(err);
-    }
-
-    t.ok(rt, 'runtime exists');
-    t.equal(rt.accountName, 'unknown', 'rt.accountName is "unknown"');
-    rt.close(t.end);
-  });
-});
-
-test('Test passing namespaceRoots to vanadium.init() sets the namespaceRoots',
-    function(t) {
-
-  var roots = ['/some-root.tld:1234', '/other-root.tld:80'];
-
-  var c = extend({namespaceRoots: roots}, config);
-
-  vanadium.init(c, function(err, rt) {
-    if (!isBrowser) {
-      t.ok(err, 'should error in node');
-      return t.end();
-    }
-
-    if (err) {
-      t.error(err, 'should not error');
-      return t.end();
-    }
-
-    rt.getNamespace().roots(function(err, gotRoots) {
-      if (err) {
-        t.error(err);
-        return rt.close(t.end);
-      }
-
-      t.ok(gotRoots, 'runtime.namespace has roots');
-      t.deepEqual(gotRoots.sort(), roots.sort(),
-          'runtime.namespace has the correct roots');
-
-      rt.close(t.end);
-    });
-  });
-});
-
-// Helper that remounts a server at 'from' to a name 'to'.
-function remount(from, to, cb) {
-  vanadium.init(config, function(err, rt) {
-    if (err) {
-      return cb(err);
-    }
-    var ns = rt.getNamespace();
-    var ctx = rt.getContext().withTimeout(5000);
-
-    ns.resolve(ctx, from, function(err, servers) {
-      if (err) {
-        return end(err);
-      }
-
-      ns.mount(ctx, to, servers[0], 0, false, end);
-    });
-
-    function end(err) {
-      rt.close(function(){
-        cb(err);
-      });
-    }
-  });
-}
-
-test('Test passing proxy to vanadium.init() sets the proxy',
-  function(t) {
-
-  // Remount the proxy under a new name.
-  var existingProxyName = 'test/proxy';
-  var newProxyName = 'new/name/for/proxy';
-
-  remount(existingProxyName, newProxyName, function(err) {
-    if (err) {
-      return t.end(err);
-    }
-
-    // Initialize a new runtime with the new proxy name.
-    var c = extend({proxy: newProxyName}, config);
-
-    vanadium.init(c, function(err, rt) {
-      if (!isBrowser) {
-        t.ok(err, 'should error in node');
-        return t.end();
-      }
-
-      if (err) {
-        t.error(err, 'should not error');
-        return t.end();
-      }
-
-      // Create a new server, and verify that we can call it.
-      var serverName = 'pingpong';
-      var service = {
-        ping: function(ctx, serverCall){
-          return 'pong';
-        }
-      };
-      rt.newServer(serverName, service, function(err) {
-        if (err) {
-          return end(err);
-        }
-
-        var client = rt.getClient();
-        var ctx = rt.getContext().withTimeout(5000);
-        client.bindTo(ctx, serverName, function(err, pingpong) {
-          if (err) {
-            return end(err);
-          }
-          t.ok(pingpong, 'bindTo returns the correct service');
-          end(null);
-        });
-      });
-
-      function end(err) {
-        t.error(err);
-        rt.close(t.end);
-      }
-    });
-  });
-});
diff --git a/test/integration/test-vtrace.js b/test/integration/test-vtrace.js
deleted file mode 100644
index 6da7720..0000000
--- a/test/integration/test-vtrace.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var test = require('prova');
-var service = require('./get-service');
-var vanadium = require('../../');
-var serve = require('./serve');
-var leafDispatcher = require('../../src/rpc/leaf-dispatcher');
-var vtrace = vanadium.vtrace;
-
-function findSpan(name, trace) {
-  for (var i = 0; i < trace.spans.length; i++) {
-    var span = trace.spans[i];
-    if (span.name === name) {
-      return span;
-    }
-  }
-  return null;
-}
-
-test('Test receiving traces with a JavaScript client', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end, runtime) {
-    vtrace.forceCollect(ctx);
-    if (err) {
-      end(assert, err);
-    }
-    cache.set(ctx, 'key', 'val').then(function() {
-      var span = vtrace.getSpan(ctx);
-      var record = vtrace.getStore(ctx).traceRecord(span.trace);
-      // We expect to see spans at least from:
-      // The js client.
-      assert.ok(findSpan('<jsclient>"test_service/cache".set', record));
-      // The wspr proxy.
-      assert.ok(findSpan('<wspr>"test_service/cache".Set', record));
-      // The go server.
-      assert.ok(findSpan('"cache".Set', record));
-      end(assert);
-    });
-  });
-});
-
-test('Test using collectRegexp', function(assert) {
-  service('test_service/cache', function(err, ctx, cache, end, runtime) {
-    if (err) {
-      end(assert, err);
-    }
-    var store = vtrace.getStore(ctx);
-    store.setCollectRegexp('\.get$');
-
-    var t1 = ctx;
-    var t2 = vtrace.withNewTrace(ctx);
-
-    cache.set(t1, 'key', 'val').then(function() {
-      return cache.get(t2, 'key');
-    }).then(function() {
-      var records = store.traceRecords();
-      assert.equals(records.length, 1);
-      assert.ok(findSpan('"cache".Get', records[0]));
-      end(assert);
-    });
-  });
-});
-
-var SpanService = {
-  makeSpan: function(context, serverCall) {
-    context = vtrace.withNewSpan(context, 'in makeSpan');
-    vtrace.getSpan(context).finish();
-  }
-};
-
-test('Test receiving traces from a javascript server', function(assert) {
-  serve('testing/span', leafDispatcher(SpanService), function(err, res) {
-    assert.error(err);
-    var serverCtx = res.runtime.getContext();
-
-    var clientCtx = vtrace.withNewStore(serverCtx);
-    var trace = vtrace.getSpan(clientCtx).trace;
-    vtrace.forceCollect(clientCtx);
-    res.service.makeSpan(clientCtx).then(function() {
-      var record = vtrace.getStore(clientCtx).traceRecord(trace);
-      // We expect to see spans at least from:
-      // The js client.
-      assert.ok(findSpan('<jsclient>"testing/span".makeSpan', record));
-      // The wspr proxy.
-      assert.ok(findSpan('<wspr>"testing/span".MakeSpan', record));
-      // The js server.
-      assert.ok(findSpan('<jsserver>"".makeSpan', record));
-      // A custom span.
-      assert.ok(findSpan('in makeSpan', record));
-      res.end(assert);
-    }).catch(function(err) {
-      assert.error(err);
-      res.end(assert);
-    });
-  });
-});
diff --git a/test/integration/timeouts.js b/test/integration/timeouts.js
deleted file mode 100644
index 1cdcb5c..0000000
--- a/test/integration/timeouts.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = {
-  instant: 100,
-  quick: 1 * 1000,
-  short: 5 * 1000,
-  standard: 10 * 1000,
-  long: 60 * 1000,
-  longer: 2 * 60 * 1000,
-  max: 5 * 60 * 1000
-};
\ No newline at end of file
diff --git a/test/load/test-echo.js b/test/load/test-echo.js
deleted file mode 100644
index 2928052..0000000
--- a/test/load/test-echo.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var service = require('../integration/get-service');
-var serve = require('../integration/serve');
-var Stress = require('../vdl-out/v.io/x/js.core/stress').Stress;
-var test = require('prova');
-
-test.timeout(60 * 5 * 1000);
-
-var PAYLOAD_SIZE = 1000;
-var DURATION = 1 * 60 * 1000;
-test('load test echo', function(assert) {
-  service('/localhost:8141', function(err, ctx, echoer, end, rt) {
-    assert.error(err);
-    var payload = new Uint8Array(PAYLOAD_SIZE);
-    for (var i = 0; i < PAYLOAD_SIZE; i++) {
-      payload[i] = i && 0xff;
-    }
-    var iterations = 0;
-    var start = Date.now();
-    callEcho();
-    function callEcho() {
-      iterations++;
-      if ((iterations % 500) === 0) {
-        assert.ok(true, 'done with ' + iterations);
-      }
-      if ((Date.now() - start) > DURATION) {
-        return finish();
-      }
-      echoer.echo(ctx, payload).then(callEcho).catch(finish);
-    }
-
-    function finish(err) {
-      assert.error(err);
-      var duration = (Date.now() - start) / 1000;
-      var data = {
-        qps: iterations/duration,
-        iterations: iterations,
-      };
-      data.msecsPerRPC = 1000/data.qps;
-      assert.ok(true, JSON.stringify(data));
-      end(assert);
-    }
-  });
-});
-
-function Echoer() {}
-
-Echoer.prototype._serviceDescription = Stress.prototype._serviceDescription;
-
-Echoer.prototype.echo = function(ctx, serverCall, bytes) {
-  return Promise.resolve(bytes);
-};
-
-var echoer = new Echoer();
-
-function alwaysAuth(ctx, call) {
-  return Promise.resolve();
-}
-
-function dispatcher(suffix) {
-  return {
-    service: echoer,
-    authorizer: alwaysAuth
-  };
-}
-
-/*
- * The setup of this test is to have a JS server running under the name load
- * and then ask the Go stressd server to create a go client and run the
- * performance test against our server for DURATION milliseconds and return
- * the results
- */
-test('load test echo server', function(assert) {
-  var opts = {
-    name: 'load',
-    dispatcher: dispatcher,
-    autoBind: false,
-  };
-  serve(opts, function(err, res) {
-    assert.error(err);
-    if (err) {
-      res.end(assert);
-    }
-    // In order to run a performance test where we have a go client send
-    // a bunch of tests to the server, we tell the stressd server to run
-    // a peformance test against the server we just started.
-    var client = res.runtime.getClient();
-    var ctx = res.runtime.getContext();
-    client.bindTo(ctx, '/localhost:8141').then(function(stub) {
-      ctx = ctx.withTimeout(DURATION * 2);
-      return stub.serverEcho(ctx, { seconds: DURATION / 1000 }, 'load');
-    }).then(function(result) {
-      result.iterations = result.iterations.toNativeNumberApprox();
-      assert.ok(true, JSON.stringify(result));
-      res.end(assert);
-    }).catch(function(err) {
-      res.end(assert, err);
-    });
-  });
-});
diff --git a/test/services/config-sampled.js b/test/services/config-sampled.js
deleted file mode 100644
index 69dde48..0000000
--- a/test/services/config-sampled.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = {
-  flags: {}
-};
diff --git a/test/services/config-stressd.js b/test/services/config-stressd.js
deleted file mode 100644
index 7473093..0000000
--- a/test/services/config-stressd.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-module.exports = {
-  flags: {
-    'v23.tcp.address': ':8141'
-  }
-};
diff --git a/test/services/run-services.js b/test/services/run-services.js
deleted file mode 100644
index 1b8166a..0000000
--- a/test/services/run-services.js
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO(sadovsky): Rename this file service-runner.js.
-
-var debug = require('debug')('run-services');
-var EE = require('events').EventEmitter;
-var extend = require('xtend');
-var inherits = require('util').inherits;
-var mkdirp = require('mkdirp');
-var parallel = require('run-parallel');
-var path = require('path');
-var service = require('./service');
-
-module.exports = Runner;
-
-/**
- * var runner = Runner(names=[])
- *
- * Emits: start, stop, error
- *
- * @param {Array} names of the vanadium services to run.
- * @returns {Runner}
- */
-function Runner(names) {
-  if (!(this instanceof Runner)) {
-    return new Runner(names);
-  }
-
-  // TODO(sadovsky): Make these fields private.
-  var runner = this;
-
-  EE.call(runner);
-
-  // Env vars produced by servicerunner job. These are made visible to clients
-  // in case they want to pass them to other subprocesses.
-  runner.env = {};
-
-  runner._names = names;
-  runner._services = [];
-
-  // Used to make start() and stop() idempotent.
-  runner._startCalled = false;
-  runner._stopCalled = false;
-}
-
-inherits(Runner, EE);
-
-Runner.prototype.start = function(cb) {
-  var runner = this;
-  if (runner._startCalled) {
-    debug('warning: start called multiple times');
-    return;
-  }
-  runner._startCalled = true;
-
-  debug('starting core services...');
-  runner._setup(function() {
-    debug('core services ready; starting additional services...');
-    var services = runner._names.map(runner._add.bind(runner));
-    // Note, we don't map over runner._services because that includes
-    // servicerunner.
-    var jobs = services.map(createStartWorker);
-    parallel(jobs, function(err) {
-      debug('started all services');
-      runner.emit('start');
-      cb(err);
-    });
-  });
-
-  return runner;
-};
-
-Runner.prototype._add = function(name) {
-  var runner = this;
-  var env = extend(process.env, runner.env);
-  var s = service(name, env);
-  s.on('error', function(err) {
-    debug('error detected, stopping all services');
-    runner.emit('error', err);
-    runner.stop();
-  });
-  runner._services.push(s);
-  return s;
-};
-
-// Creates a temporary directory for output, generates a principal, starts core
-// services (mount table, proxyd, wsprd), writes various vars to runner.env,
-// then calls cb.
-Runner.prototype._setup = function(cb) {
-  var runner = this;
-
-  mkdirp(path.resolve('tmp/log'), createCredentials);
-
-  function createCredentials(err) {
-    if (err) {
-      return runner.emit('error', err);
-    }
-    runner.env.V23_CREDENTIALS = path.resolve('tmp/test-credentials');
-    service('principal')
-      .exec('create -with-passphrase=false -overwrite ' +
-             runner.env.V23_CREDENTIALS + ' test',
-	          function(err, stdout, stderr) {
-              if (err) {
-                return runner.emit('error', err);
-              }
-              stdout.on('close', startCoreServices);
-            });
-  }
-
-  function startCoreServices() {
-    runner
-      ._add('servicerunner')
-      .on('vars', function(vars) {
-        runner.env = extend(runner.env, {
-          IDENTITYD: vars.TEST_IDENTITYD_NAME + '/google',
-          IDENTITYD_BLESSING_URL:
-              vars.TEST_IDENTITYD_HTTP_ADDR + '/auth/blessing-root',
-          V23_NAMESPACE: vars.MT_NAME,
-          PROXY_ADDR: vars.PROXY_NAME,
-          WSPR_ADDR: vars.WSPR_ADDR
-        });
-        console.log('Tests running with environment: ', runner.env);
-      })
-      .on('ready', function() {
-        debug('core services running');
-        cb();
-      })
-      .spawn();
-  }
-};
-
-Runner.prototype.stop = function(cb) {
-
-  var runner = this;
-  if (runner._stopCalled) {
-    var errText = 'stop called multiple times';
-    debug(errText);
-    if (cb) {
-      cb(new Error(errText));
-    }
-    return;
-  }
-  runner._stopCalled = true;
-
-  cb = cb || function() {};
-
-  debug('stopping...');
-
-  // Remove all error listeners before killing any services so that services
-  // don't complain when other services they depend on are shut down.
-  runner._services.map(function(s) {
-    s.removeAllListeners('error');
-  });
-
-  var jobs = runner._services.map(createStopWorker);
-  parallel(jobs, function(err) {
-    debug('stopped');
-    runner.emit('stop');
-    cb(err);
-  });
-};
-
-function createStartWorker(service) {
-  return function start(cb) {
-    debug('spawning: %s', service.name);
-    service.on('ready', function ready() {
-      debug('ready: %s', service.name);
-      cb();
-    });
-    service.spawn();
-  };
-}
-
-function createStopWorker(service) {
-  return function stop(cb) {
-    debug('exiting %s', service.name);
-    service.on('exit', cb);
-    service.kill('SIGTERM');
-  };
-}
diff --git a/test/services/service.js b/test/services/service.js
deleted file mode 100644
index d00d1e7..0000000
--- a/test/services/service.js
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-var path = require('path');
-var spawn = require('child_process').spawn;
-var inherits = require('util').inherits;
-var EE = require('events').EventEmitter;
-var extend = require('xtend');
-var which = require('which');
-var PassThrough = require('stream').PassThrough;
-var fs = require('fs');
-
-var JIRI_ROOT = process.env.JIRI_ROOT;
-var VANADIUM_BINS = [
-  path.join(JIRI_ROOT, 'release/javascript/core/go/bin'),
-  path.join(JIRI_ROOT, 'release/javascript/core/nacl/scripts')
-];
-var DEFAULT_FLAGS = {
-  v: 3,
-  log_dir: path.resolve('tmp/log')  // jshint ignore:line
-};
-
-process.env.PATH += ':' + VANADIUM_BINS.join(':');
-
-module.exports = Service;
-
-function Service(name, env) {
-  if (!(this instanceof Service)) {
-    return new Service(name, env);
-  }
-
-  var service = this;
-
-  EE.call(service);
-
-  try {
-    service.config = require('./config-' + name);
-  } catch (e) {
-    service.config = {};
-  }
-
-  service.name = name;
-  service.args = flags(extend(DEFAULT_FLAGS, service.config.flags));
-  service.env = env || {};
-}
-
-inherits(Service, EE);
-
-Service.prototype.spawn = function(args) {
-  var service = this;
-
-  args = args || service.args;
-
-  if (!JIRI_ROOT) {
-    var err = new Error('Please export $JIRI_ROOT to proceed');
-    return service.emit('error', err);
-  }
-
-  which(service.name, function(err, bin) {
-    if (err) {
-      return service.emit('error', notfound(service.name));
-    }
-
-    var errlog = '';
-
-    service.process = spawn(bin, args, {env: service.env});
-
-    if (service.name !== 'servicerunner') {
-        service.emit('ready');
-    }
-
-    if (service.process.stdout) {
-      service.process.stdout.pipe(fs.createWriteStream(
-        path.join('tmp', service.name + '.stdout.log')));
-
-      if (service.name === 'servicerunner') {
-        service.process.stdout.on('data', function(data) {
-          service.emit('vars', JSON.parse(data.toString()));
-          service.emit('ready');
-        });
-      }
-    }
-
-    // Buffer stderr until close so that a meaningful error can be emitted
-    // when a non-zero exit code is encountered.
-    //
-    // NOTE: All vanadium bins log to stderr so this buffer will just grow
-    // until that is resolved...
-    if (service.process.stderr) {
-      var stderr = new PassThrough();
-      service.process.stderr.pipe(stderr);
-      stderr.pipe(fs.createWriteStream(
-        path.join('tmp', service.name + '.stderr.log')));
-
-      stderr.on('data', function(data) {
-        errlog += data;
-      });
-    }
-
-    service.process.on('close', function(code) {
-      if (code === 0) {
-        return;
-      }
-
-      var message = [
-        'non-zero exit code: ' + code,
-        'while running: ' + service.name + ' ' + args.join(' '),
-        '\n',
-        errlog
-      ].join('\n');
-
-      service.emit('error', new Error(message));
-    });
-
-    [ 'exit', 'close' ].forEach(function(name) {
-        service.process.on(name, service.emit.bind(service, name));
-    });
-
-    service.emit('spawn', service.process.stdout, service.process.stderr);
-  });
-};
-
-// A quick wrapper for short run execs, useful for non-deamons like the
-// principal command.
-Service.prototype.exec = function(command, cb) {
-  var service = this;
-  service
-    .on('error', cb.bind(service))
-    .on('spawn', cb.bind(service, null))
-    .spawn(command.split(' '));
-};
-
-Service.prototype.kill = function() {
-  var service = this;
-
-  if (service.process) {
-    service.process.kill.apply(service.process, arguments);
-  }
-};
-
-function notfound(name) {
-  var message = 'Vanadium binary not found: ' + name + '\n' +
-      'Please run "make clean" and try again.' +
-      'If problem persists, "make go/bin -B" can force building of binaries.';
-
-  return new Error(message);
-}
-
-function flags(obj) {
-  var args = Object.keys(obj).map(function(key) {
-    return ['-', key, '=', obj[key]].join('');
-  });
-
-  return args;
-}
diff --git a/test/ui/README.md b/test/ui/README.md
deleted file mode 100644
index 12d70c9..0000000
--- a/test/ui/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Vanadium JavaScript UI Test
-
-## About
-
-The UI tests use the maven architecture. This package manager uses
-the build information from pom.xml to compile a WebDriver program.
-
-The UI library in this repository defines VanadiumUITestBase, which
-uses WebDriver to run Chrome and install the Vanadium Extension.
-
-It also defines HTMLReporter, which is used to grab screenshots and
-generate an HTML report of the WebDriver test.
-
-## Usage
-
-The expected use of the library is to subclass VanadiumUITestBase and
-write a JUnit test function. The HTMLReporter should be started at the
-beginning of the test and generated upon test completion.
-
-A distinct pom.xml should be written for the tests, and it should
-include a dependency to this library.
-
-In order to install and use the Vanadium Extension, it is important to
-have the credentials of a Google account. It is not recommended that
-these credentials be visible to the public. Maven properties and
-environment variables can be used to keep them private.
-
-See release.projects.browser and www for example usages.
-
-## Display Port
-
-To run a test, one will generally set the DISPLAY environment variable
-to :0 or run Xvfb at a specific display port. Set this value in the
-test project's pom.xml file.
-
-Note that when running with :0, the test will run with the current
-display. Mouse and key actions performed during this period will interfere with the WebDriver test.
-
-While :0 is good for watching tests as they run, the screenshots taken
-are not guaranteed to be accurate.
-
-## Invoking maven
-
-At least 4 flags are required when running the maven test:
-- chromeDriverBin: Location of the Chrome WebDriver binary
-- htmlReportsRelativePath: Directory to output an HTML report (relative to $WORKSPACE)
-- googleBotUsername: Username for a Google account
-- googleBotPassword: Password for that user
-
-Here is an example invocation:
-WORKSPACE=$WORKSPACE mvn test \
-  -f=$LOCATION_OF_POM_XML \
-  -Dtest=$UI_TEST_NAME \
-  -DchromeDriverBin=$CHROME_WEBDRIVER \
-  -DhtmlReportsRelativePath=$HTML_REPORT_RELATIVE_PATH \
-  -DgoogleBotUsername=$BOT_USERNAME \
-  -DgoogleBotPassword=$BOT_PASSWORD
diff --git a/test/ui/pom.xml b/test/ui/pom.xml
deleted file mode 100644
index f233058..0000000
--- a/test/ui/pom.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <name>Vanadium Webdriver</name>
-  <groupId>io.v.webdriver</groupId>
-  <artifactId>vanadium_webdriver</artifactId>
-  <version>0.1</version>
-
-  <dependencies>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.4</version>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.freemarker</groupId>
-      <artifactId>freemarker</artifactId>
-      <version>2.3.22</version>
-    </dependency>
-    <dependency>
-      <groupId>org.seleniumhq.selenium</groupId>
-      <artifactId>selenium-chrome-driver</artifactId>
-      <version>2.45.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.seleniumhq.selenium</groupId>
-      <artifactId>selenium-support</artifactId>
-      <version>2.45.0</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <version>3.2</version>
-        <configuration>
-            <source>1.7</source>
-            <target>1.7</target>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/test/ui/src/test/java/io/v/webdriver/RobotHelper.java b/test/ui/src/test/java/io/v/webdriver/RobotHelper.java
deleted file mode 100644
index bca09c4..0000000
--- a/test/ui/src/test/java/io/v/webdriver/RobotHelper.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver;
-
-import java.awt.AWTException;
-import java.awt.Robot;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
-import java.awt.event.KeyEvent;
-
-/**
- * A helper class for Robot related functions.
- * <p>
- * Most of the automation should be done through WebDriver APIs, but some elements (e.g. Chrome's
- * native Sign-in page or the confirmation dialog after an extension is installed) cannot be
- * accessed and controlled by WebDriver. In those cases, we use Robot to send key strokes, mouse
- * clicks, etc.
- *
- * @author jingjin@google.com
- */
-public class RobotHelper {
-  /**
-   * This is a singleton instance.
-   */
-  private static RobotHelper instance;
-
-  private final Robot robot;
-
-  public static RobotHelper sharedInstance() throws AWTException {
-    if (instance == null) {
-      instance = new RobotHelper();
-    }
-    return instance;
-  }
-
-  private RobotHelper() throws AWTException {
-    robot = new Robot();
-    robot.setAutoDelay(200);
-    robot.setAutoWaitForIdle(true);
-  }
-
-  /**
-   * Enters the given text to the focused element.
-   *
-   * <p>To make the process easier, we copy the given text to system clipboard and paste it into the
-   * target element. Otherwise, we have to call "keyPress" and "keyRelease" on each key stroke.
-   *
-   * @param text the text to enter.
-   */
-  public void enterText(String text) {
-    // Copy text to clipboard.
-    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
-    StringSelection stringSelection = new StringSelection(text);
-    clipboard.setContents(stringSelection, stringSelection);
-
-    // Send Ctrl+V to paste.
-    robot.keyPress(KeyEvent.VK_CONTROL);
-    robot.keyPress(KeyEvent.VK_V);
-    robot.keyRelease(KeyEvent.VK_V);
-    robot.keyRelease(KeyEvent.VK_CONTROL);
-  }
-
-  /**
-   * Presses TAB.
-   */
-  public void tab() {
-    robot.keyPress(KeyEvent.VK_TAB);
-    robot.keyRelease(KeyEvent.VK_TAB);
-  }
-
-  /**
-   * Presses Enter.
-   */
-  public void enter() {
-    robot.keyPress(KeyEvent.VK_ENTER);
-    robot.keyRelease(KeyEvent.VK_ENTER);
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java b/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
deleted file mode 100644
index e4f2fa3..0000000
--- a/test/ui/src/test/java/io/v/webdriver/TestFailureWatcher.java
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver;
-
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriverService;
-
-import io.v.webdriver.htmlreport.HTMLReportData;
-import io.v.webdriver.htmlreport.HTMLReporter;
-
-/**
- * A class for performing actions when any test case fails.
- *
- * @author jingjin@google.com
- */
-public class TestFailureWatcher extends TestWatcher {
-  private VanadiumUITestBase uiTest;
-  private WebDriver driver;
-  private ChromeDriverService service;
-
-  public void setup(VanadiumUITestBase uiTest, WebDriver driver, ChromeDriverService service) {
-    this.uiTest = uiTest;
-    this.driver = driver;
-    this.service = service;
-  }
-
-  @Override
-  protected void failed(Throwable e, Description description) {
-    // Grab all the browser logs and print them out.
-    uiTest.printConsoleLogs();
-
-    // Take a screenshot for the current screen and write the html report.
-    HTMLReportData data = uiTest.getCurrentHTMLReportData();
-    Util.takeScreenshot((TakesScreenshot)driver, "test-failed.png", "Test Failed", data);
-    HTMLReporter reporter = new HTMLReporter(data);
-    try {
-      reporter.generateReport();
-    } catch (Exception e1) {
-      System.err.println("Failed to write html report.\n" + Util.getStackTrace(e1));
-    }
-  }
-
-  @Override
-  protected void finished(Description description) {
-    driver.quit();
-    service.stop();
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/Util.java b/test/ui/src/test/java/io/v/webdriver/Util.java
deleted file mode 100644
index 4fb0d25..0000000
--- a/test/ui/src/test/java/io/v/webdriver/Util.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver;
-
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-import org.openqa.selenium.OutputType;
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.WebDriver;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.Enumeration;
-
-/**
- * Utility functions.
- *
- * @author jingjin@google.com
- */
-public class Util {
-
-  /**
-   * Sleeps for given milliseconds.
-   *
-   * <p>This is mainly used for waiting between Robot related operations. For WebDriver, we should
-   * use "wait.until".
-   *
-   * @param ms number of milliseconds to sleep.
-   */
-  public static void sleep(int ms) {
-    try {
-      Thread.sleep(ms);
-    } catch (InterruptedException e) {
-      e.printStackTrace();
-    }
-  }
-
-  /**
-   * Converts the given exception's stack trace to a string.
-   *
-   * @param e the exception to convert to string.
-   */
-  public static String getStackTrace(Exception e) {
-    StringWriter sw = new StringWriter();
-    PrintWriter pw = new PrintWriter(sw);
-    e.printStackTrace(pw);
-    return sw.toString();
-  }
-
-  /**
-   * Replaces illegal character in the given file name.
-   *
-   * @param filename the original file name.
-   */
-  public static String getSafeFilename(String filename) {
-    return filename.replaceAll("[^a-zA-Z0-9.-]", "_").toLowerCase();
-  }
-
-  /**
-   * Takes a screenshot.
-   *
-   * <p>It uses the WebDriver to grab the screenshot data, saves it to the given file,
-   * and records it in the given htmlReportData.
-   *
-   * @param TakesScreenshot a driver that can getScreenshotAs, such as a ChromeDriver.
-   * @param fileName the file to save the screenshot to.
-   * @param caption the caption of the screenshot.
-   * @param htmlReportData the data model to add screenshot data to.
-   */
-  public static void takeScreenshot(TakesScreenshot taker, String fileName,
-    String caption, HTMLReportData htmlReportData) {
-
-    String fullFileName =
-      String.format("%s-%s", getSafeFilename(htmlReportData.getTestName()), fileName);
-    Runtime rt = Runtime.getRuntime();
-    try {
-      byte[] imageData = taker.getScreenshotAs(OutputType.BYTES); // throws WebDriverException
-      File imageFile = new File(htmlReportData.getReportDir(), fullFileName);
-      FileOutputStream fos = new FileOutputStream(imageFile);
-      fos.write(imageData);
-      fos.close();
-    } catch (Exception e) {
-      System.err.printf("Failed to copy screenshot to %s/%s\n", htmlReportData.getReportDir(), fullFileName);
-      e.printStackTrace();
-    }
-
-    htmlReportData.addScreenshotData(fullFileName, caption);
-  }
-
-  /**
-   * Prints the address of each network interface on the machine.
-   * Taken from http://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java
-   */
-  public static void printIPAddresses() {
-    try {
-      Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
-      while(e.hasMoreElements())
-      {
-          NetworkInterface n = e.nextElement();
-          Enumeration<InetAddress> ee = n.getInetAddresses();
-          while (ee.hasMoreElements())
-          {
-              InetAddress i = ee.nextElement();
-              System.out.println(i.getHostAddress());
-          }
-      }
-    } catch(SocketException e) {
-      System.err.println("Could not print IP addresses");
-      e.printStackTrace();
-    }
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java b/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java
deleted file mode 100644
index bd3a5dc..0000000
--- a/test/ui/src/test/java/io/v/webdriver/VanadiumUITestBase.java
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver;
-
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.chrome.ChromeDriverService;
-import org.openqa.selenium.chrome.ChromeOptions;
-import org.openqa.selenium.logging.LogEntries;
-import org.openqa.selenium.logging.LogEntry;
-import org.openqa.selenium.logging.LogType;
-import org.openqa.selenium.logging.LoggingPreferences;
-import org.openqa.selenium.remote.CapabilityType;
-import org.openqa.selenium.remote.DesiredCapabilities;
-
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-import io.v.webdriver.commonpages.ChromeSignInPage;
-import io.v.webdriver.commonpages.CaveatTabPage;
-import io.v.webdriver.commonpages.ExtensionInstallationPage;
-import io.v.webdriver.commonpages.ExtensionOptionPage;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Date;
-import java.util.logging.Level;
-
-/**
- * The base class for all Vanadium UI tests.
- *
- * @author jingjin@google.com
- */
-public class VanadiumUITestBase {
-  /**
-   * System property name for Chrome driver binary. This will be set from the mvn command line.
-   */
-  private static final String PROPERTY_CHROME_DRIVER_BIN = "chromeDriverBin";
-
-  /**
-   * System property name for html report path relative to Jenkins workspace dir. This will be set
-   * from the mvn command line.
-   */
-  private static final String PROPERTY_HTML_REPORTS_RELATIVE_PATH = "htmlReportsRelativePath";
-
-  /**
-   * System property name for the bot username and bot password. These will be set from the mvn command line.
-   */
-  private static final String PROPERTY_GOOGLE_BOT_USERNAME = "googleBotUsername";
-  private static final String PROPERTY_GOOGLE_BOT_PASSWORD = "googleBotPassword";
-
-  /**
-   * System property name for the path to the Vanadium extension. Optional.
-   */
-  private static final String PROPERTY_VANADIUM_EXTENSION_PATH = "vanadiumExtensionPath";
-  protected boolean hasExtension;
-
-  /**
-   * The base dir to store html reports
-   */
-  protected final String htmlReportsDir;
-
-  /**
-   * A variable to keep track of the current htmlReportData.
-   */
-  protected HTMLReportData curHTMLReportData;
-
-  /**
-   * The username and password of the bot account used to sign in to Google/Chrome.
-   */
-  protected String botUsername;
-  protected String botPassword;
-
-  /**
-   * Vanadium extension installation url.
-   */
-  private static final String URL_EXTENSION = "https://chrome.google.com/webstore/detail/"
-      + "vanadium-extension/jcaelnibllfoobpedofhlaobfcoknpap";
-
-  protected ChromeDriverService service;
-
-  protected WebDriver driver;
-
-  public VanadiumUITestBase() {
-    htmlReportsDir = createReportsDir();
-  }
-
-  /**
-   * This "Rule" is used to catch failed test cases so we can act on it.
-   */
-  @Rule
-  public TestFailureWatcher testFailureWatcher = new TestFailureWatcher();
-
-  /**
-   * Basic WebDriver and other setup tasks. This will be executed before each test case.
-   */
-  @Before
-  public void setup() throws IOException {
-    // TODO(alexfandrianto): Used to debug the IP address of the machine. Possibly remove.
-    Util.printIPAddresses();
-
-    String chromeDriverBin = System.getProperty(PROPERTY_CHROME_DRIVER_BIN);
-    botUsername = System.getProperty(PROPERTY_GOOGLE_BOT_USERNAME);
-    botPassword = System.getProperty(PROPERTY_GOOGLE_BOT_PASSWORD);
-    System.out.println("ChromeDriver binary: " + chromeDriverBin);
-    service = new ChromeDriverService.Builder().usingDriverExecutable(new File(chromeDriverBin))
-        .usingAnyFreePort().build();
-    service.stop();
-    service.start();
-
-    // Set up the ability to grab the console.log from the browser.
-    DesiredCapabilities capabilities = DesiredCapabilities.chrome();
-    LoggingPreferences logPrefs = new LoggingPreferences();
-    logPrefs.enable(LogType.BROWSER, Level.ALL);
-    capabilities.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
-
-    // If an extension was chosen, use that.
-    String vanadiumExtensionPath = System.getProperty(PROPERTY_VANADIUM_EXTENSION_PATH);
-    if (vanadiumExtensionPath != null) {
-      ChromeOptions options = new ChromeOptions();
-      options.addArguments("load-extension=" + System.getProperty("vanadiumExtensionPath"));
-
-      capabilities.setCapability(ChromeOptions.CAPABILITY, options);
-      hasExtension = true;
-    }
-
-    // Create the driver and start using it.
-    driver = new ChromeDriver(service, capabilities);
-    driver.manage().window().maximize();
-
-    testFailureWatcher.setup(this, driver, service);
-  }
-
-  public HTMLReportData getCurrentHTMLReportData() {
-    return curHTMLReportData;
-  }
-
-  private String createReportsDir() {
-    String workspaceRoot = System.getenv("WORKSPACE");
-    if (workspaceRoot == null) {
-      workspaceRoot = System.getenv("HOME");
-    }
-    if (workspaceRoot == null) {
-      return "";
-    }
-    String reportsDir = String.format("%s/%s", workspaceRoot,
-        System.getProperty(PROPERTY_HTML_REPORTS_RELATIVE_PATH, "htmlReports"));
-    File reportsFile = new File(reportsDir);
-    if (!reportsFile.exists()) {
-      if (reportsFile.mkdirs()) {
-        System.out.println(String.format("Reports dir '%s' created", reportsDir));
-      } else {
-        throw new RuntimeException(String.format("Failed to create reports dir '%s'", reportsDir));
-      }
-    }
-    return reportsDir;
-  }
-
-  /**
-   * Grab all of the log entries from the browser and print them out.
-   */
-  public void printConsoleLogs() {
-    LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
-    for (LogEntry entry : logEntries) {
-        System.out.println(new Date(entry.getTimestamp()) + " " + entry.getLevel() + " " + entry.getMessage());
-    }
-  }
-
-  /**
-   * Sign in and install the extension, if necessary.
-   * A simple wrapper around signIn and installExtension.
-   */
-  protected void signInAndInstallExtension(HTMLReportData reportData) throws Exception {
-    signIn(reportData);
-    if (!this.hasExtension) {
-      installExtension(reportData);
-    }
-  }
-
-  /**
-   * Sign into Chrome. This is needed to use the extension.
-   */
-  protected void signIn(HTMLReportData reportData) throws Exception {
-    // Sign into Chrome.
-    ChromeSignInPage chromeSignInPage = new ChromeSignInPage(driver, reportData);
-    chromeSignInPage.go();
-    chromeSignInPage.signIn(botUsername, botPassword);
-  }
-
-  /**
-   * UI tests will commonly need to install the extension.
-   * The process involves installing the extension and
-   * verifying that it was installed successfully.
-   */
-  protected void installExtension(HTMLReportData reportData) throws Exception {
-    // Install Vanadium extension.
-    ExtensionInstallationPage extensionInstallationPage =
-        new ExtensionInstallationPage(driver, URL_EXTENSION, reportData);
-    extensionInstallationPage.go();
-    extensionInstallationPage.login(botPassword);
-    extensionInstallationPage.install();
-
-    hasExtension = true;
-
-    // Check Vanadium extension option page.
-    Util.sleep(4000);
-    ExtensionOptionPage extensionOptionPage = new ExtensionOptionPage(driver, reportData);
-    extensionOptionPage.go();
-  }
-
-  /**
-   * UI tests will commonly need to bypass a caveat page.
-   */
-  protected void handleCaveatTab(HTMLReportData reportData) throws Exception {
-    CaveatTabPage caveatTabPage = new CaveatTabPage(driver, reportData);
-    caveatTabPage.bless();
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java
deleted file mode 100644
index e1473ba..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/CaveatTabPage.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import com.google.common.base.Function;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.TimeoutException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.WebDriverWait;
-
-import io.v.webdriver.RobotHelper;
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-import java.awt.AWTException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-import java.util.Set;
-
-/**
- * Vanadium extension caveat tab page.
- *
- * @author jingjin@google.com
- */
-public class CaveatTabPage extends PageBase {
-  public CaveatTabPage(WebDriver driver,
-      HTMLReportData htmlReportData) throws UnsupportedEncodingException {
-    super(driver, "", htmlReportData);
-  }
-
-  private static final int WAIT_TIME = 70; // 70s wait time; allow time for an error to appear and to grab a screenshot of it
-
-  public void bless() {
-    log("Waiting for Caveat Tab...");
-    Util.takeScreenshot((TakesScreenshot)driver, "waiting-caveats.png", "Waiting for Caveats", htmlReportData);
-    final String mainTabHandle = driver.getWindowHandle();
-
-    // Wait until the corresponding tab is there, which means we should get two window handles.
-    String selectCaveatsTabHandle = waitForCaveatTab(mainTabHandle);
-    driver.switchTo().window(selectCaveatsTabHandle);
-
-    log("Accept blessing");
-    // We need to click on the "Bless" button in the "select caveats" page.
-    WebElement btnBless =
-        wait.until(ExpectedConditions.elementToBeClickable(By.id("submit-caveats")));
-    Util.takeScreenshot((TakesScreenshot)driver, "select-caveats.png", "Selecting Caveats", htmlReportData);
-    btnBless.click();
-    driver.switchTo().window(mainTabHandle);
-  }
-
-  // Attempts to wait until the caveat tab page shows up.
-  // Returns the handle to it.
-  private String waitForCaveatTab(final String mainTabHandle) throws TimeoutException {
-    return new WebDriverWait(driver, WAIT_TIME).until(new Function<WebDriver, String>() {
-      @Override
-      public String apply(WebDriver input) {
-        Set<String> handles = driver.getWindowHandles();
-        if (handles.size() != 2) {
-          return null;
-        }
-        for (String handle : handles) {
-          if (!handle.equals(mainTabHandle)) {
-            return handle;
-          }
-        }
-        return null;
-      }
-    });
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java
deleted file mode 100644
index 82838ef..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/ChromeSignInPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.TakesScreenshot;
-
-import io.v.webdriver.RobotHelper;
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-import java.awt.AWTException;
-
-/**
- * Chrome's native Sign-In page.
- *
- * @author jingjin@google.com
- */
-public class ChromeSignInPage extends PageBase {
-  private static final String URL_CHROME_SIGNIN = "chrome://chrome-signin";
-
-  public ChromeSignInPage(WebDriver driver, HTMLReportData htmlReportData) {
-    super(driver, URL_CHROME_SIGNIN, htmlReportData);
-  }
-
-  @Override
-  public void go() {
-    super.goWithoutTakingScreenshot();
-
-    // For this page we need to wait a little bit before entering username/password.
-    Util.sleep(2000);
-    takeScreenshotUsingPageName();
-  }
-
-  public void signIn(String username, String password) throws AWTException {
-    // Sign in.
-    log("Sign in");
-    RobotHelper robotHelper = RobotHelper.sharedInstance();
-    robotHelper.enterText(username);
-    robotHelper.tab();
-    robotHelper.enterText(password);
-    robotHelper.tab();
-    Util.takeScreenshot((TakesScreenshot)driver, "before-chrome-signin.png", "Before Signing In Chrome", htmlReportData);
-    robotHelper.enter();
-    Util.sleep(2000);
-
-    // Dismiss a "Sign-in successful" popup.
-    // This popup is not accessible by WebDriver.
-    log("Dismiss 'Sign-in successful' prompt");
-    robotHelper.enter();
-    Util.takeScreenshot((TakesScreenshot)driver, "after-chrome-signin.png", "After Signing In Chrome", htmlReportData);
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java
deleted file mode 100644
index 1f430a2..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionInstallationPage.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.TimeoutException;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-
-import io.v.webdriver.RobotHelper;
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-import java.awt.AWTException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-
-/**
- * Vanadium extension installation page.
- *
- * @author jingjin@google.com
- */
-public class ExtensionInstallationPage extends PageBase {
-  private static final String GOOGLE_LOGIN_URL = "https://accounts.google.com/ServiceLogin";
-
-  public ExtensionInstallationPage(WebDriver driver, String extentionUrl,
-      HTMLReportData htmlReportData) throws UnsupportedEncodingException {
-    super(driver, GOOGLE_LOGIN_URL + "?continue=" + URLEncoder.encode(extentionUrl, "UTF-8"),
-        htmlReportData);
-  }
-
-  public void login(String password) throws TimeoutException {
-    log("Log in using Google account");
-    WebElement btnSignin = wait.until(ExpectedConditions.elementToBeClickable(By.id("signIn")));
-    WebElement passwdTextField = driver.findElement(By.id("Passwd"));
-    passwdTextField.sendKeys(password);
-    Util.takeScreenshot((TakesScreenshot)driver, "google-account-signin.png", "Google Account Sign-In", htmlReportData);
-    btnSignin.click();
-  }
-
-  public void install() throws AWTException, TimeoutException {
-    log("Install extension");
-    WebElement btnAddToChrome = wait.until(
-        ExpectedConditions.elementToBeClickable(By.cssSelector("div[aria-label='Add to Chrome']")));
-    Util.takeScreenshot((TakesScreenshot)driver, "before-install-extension.png", "Before Installing Extension",
-        htmlReportData);
-    btnAddToChrome.click();
-    Util.sleep(4000); // This sleep gives the page time to pop up a confirm box.
-
-    // Tab+Enter activates the "Add" button in the extension installation popup.
-    // This popup is not accessible by WebDriver.
-    log("Confirm adding extension to Chrome");
-    RobotHelper robotHelper = RobotHelper.sharedInstance();
-    robotHelper.tab();
-    robotHelper.enter();
-    wait.until(ExpectedConditions.elementToBeClickable(
-        By.cssSelector("div[aria-label='Added to Chrome']")));
-    // It might take some time for the extension to actually be installed.
-    Util.sleep(3000);
-    Util.takeScreenshot((TakesScreenshot)driver, "after-install-extension.png", "After Installing Extension",
-        htmlReportData);
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionOptionPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionOptionPage.java
deleted file mode 100644
index 30885c6..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/ExtensionOptionPage.java
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-/**
- * Vanadium extension's option page.
- *
- * @author jingjin@google.com
- */
-public class ExtensionOptionPage extends PageBase {
-  private static final String URL_OPTIONS =
-      "chrome-extension://jcaelnibllfoobpedofhlaobfcoknpap/html/options.html";
-
-  public ExtensionOptionPage(WebDriver driver, HTMLReportData htmlReportData) {
-    super(driver, URL_OPTIONS, htmlReportData);
-  }
-
-  @Override
-  public void go() {
-    super.goWithoutTakingScreenshot();
-
-    // For this page we need to do an extra refresh once to make the page appear.
-    driver.navigate().refresh();
-    Util.sleep(1000);
-    takeScreenshotUsingPageName();
-
-    // Verify the "Reload plugin" link is present.
-    wait.until(ExpectedConditions.presenceOfElementLocated(By.linkText("Reload plugin")));
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java b/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java
deleted file mode 100644
index bb2df3c..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/OAuthLoginPage.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import org.openqa.selenium.By;
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-/**
- * Google OAuth login page.
- *
- * @author jingjin@google.com
- */
-public class OAuthLoginPage extends PageBase {
-  public OAuthLoginPage(WebDriver driver, HTMLReportData htmlReportData) {
-    // This page is often triggered by some other page.
-    super(driver, "", htmlReportData);
-  }
-
-  public void login() {
-    log("OAuth login");
-    Util.takeScreenshot((TakesScreenshot)driver, "oauth-login.png", "OAuth Login", htmlReportData);
-    WebElement btnSignInGoogle = wait.until(ExpectedConditions.elementToBeClickable(
-        By.xpath("//button[contains(text(), 'Sign in with a Google Account')]")));
-    btnSignInGoogle.click();
-
-    log("Accept access info");
-    Util.takeScreenshot((TakesScreenshot)driver, "accept-access-info.png", "Accepting Access Info", htmlReportData);
-    WebElement btnAccept =
-        wait.until(ExpectedConditions.elementToBeClickable(By.id("submit_approve_access")));
-    btnAccept.click();
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java b/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java
deleted file mode 100644
index f3f9874..0000000
--- a/test/ui/src/test/java/io/v/webdriver/commonpages/PageBase.java
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.commonpages;
-
-import org.openqa.selenium.TakesScreenshot;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.support.ui.WebDriverWait;
-
-import io.v.webdriver.Util;
-import io.v.webdriver.htmlreport.HTMLReportData;
-
-/**
- * Base page class.
- *
- * @author jingjin@google.com
- */
-public class PageBase {
-  /**
-   * Default timeout in seconds for WebDriver to wait for a condition.
-   */
-  public static final int TIMEOUT_SECONDS = 10;
-
-  /**
-   * Page URL.
-   */
-  private String url;
-
-  /**
-   * Informative page name used in logging.
-   */
-  private final String pageName;
-
-  protected final WebDriver driver;
-
-  protected final WebDriverWait wait;
-
-  protected final HTMLReportData htmlReportData;
-
-  public PageBase(WebDriver driver, String url, HTMLReportData htmlReportData) {
-    this.driver = driver;
-    this.url = url;
-    this.htmlReportData = htmlReportData;
-    this.pageName = this.getClass().getSimpleName();
-
-    wait = new WebDriverWait(driver, TIMEOUT_SECONDS);
-  }
-
-  public void go() {
-    goWithoutTakingScreenshot();
-    takeScreenshotUsingPageName();
-  }
-
-  public void goWithoutTakingScreenshot() {
-    log("Go to " + url);
-    driver.get(url);
-  }
-
-  protected void log(String msg) {
-    System.out.println(String.format("[%s]: %s", pageName, msg));
-  }
-
-  /**
-   * Takes a screenshot for the current page and names it using pageName.
-   */
-  protected void takeScreenshotUsingPageName() {
-    Util.takeScreenshot((TakesScreenshot)driver, String.format("%s.png", Util.getSafeFilename(pageName)), pageName,
-        htmlReportData);
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReportData.java b/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReportData.java
deleted file mode 100644
index 998258d..0000000
--- a/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReportData.java
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.htmlreport;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Data model class for used in HTML report generation.
- *
- * @author jingjin@google.com
- */
-public class HTMLReportData {
-  /**
-   * A list of screenshots in the report.
-   */
-  private final List<ScreenshotData> screenshots = new ArrayList<ScreenshotData>();
-
-  /**
-   * The report's base dir.
-   */
-  private final String reportDir;
-
-  /**
-   * The name of the test associated with the data.
-   */
-  private final String testName;
-
-  public HTMLReportData(String testName, String reportDir) {
-    this.testName = testName;
-    this.reportDir = reportDir;
-  }
-
-  public String getReportDir() {
-    return reportDir;
-  }
-
-  public String getTestName() {
-    return testName;
-  }
-
-  public void addScreenshotData(String fileName, String caption) {
-    screenshots.add(new ScreenshotData(fileName, caption));
-  }
-
-  public List<ScreenshotData> getScreenshots() {
-    return screenshots;
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReporter.java b/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReporter.java
deleted file mode 100644
index ef249ac..0000000
--- a/test/ui/src/test/java/io/v/webdriver/htmlreport/HTMLReporter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.htmlreport;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateExceptionHandler;
-
-import io.v.webdriver.Util;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * Generate HTML report that has screenshots of all test steps.
- *
- * @author jingjin@google.com
- */
-public class HTMLReporter {
-  private final String reportFileName;
-  private final HTMLReportData data;
-
-  public HTMLReporter(HTMLReportData data) {
-    this.reportFileName = String.format("%s.html", Util.getSafeFilename(data.getTestName()));
-    this.data = data;
-  }
-
-  public void generateReport() throws Exception {
-    // Setup and load template.
-    Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
-    cfg.setClassForTemplateLoading(this.getClass(), "");
-    cfg.setDefaultEncoding("UTF-8");
-    cfg.setLocale(Locale.US);
-    cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
-
-    // Figure out where the report.ftl file is.
-    File f = new File(System.getenv("JIRI_ROOT") + "/release/javascript/core/test/ui/src/test/java/io/v/webdriver/htmlreport");
-    String path = f.getAbsolutePath();
-    cfg.setDirectoryForTemplateLoading(new File(path));
-
-    // This template formats the HTML report.
-    Template template = cfg.getTemplate("report.ftl");
-
-    // Prepare data.
-    Map<String, Object> input = new HashMap<String, Object>();
-    input.put("data", data);
-
-    // Generate output.
-    String reportPath = String.format("%s/%s", data.getReportDir(), reportFileName);
-    Writer fileWriter = new FileWriter(new File(reportPath));
-    try {
-      template.process(input, fileWriter);
-    } finally {
-      fileWriter.close();
-    }
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/htmlreport/ScreenshotData.java b/test/ui/src/test/java/io/v/webdriver/htmlreport/ScreenshotData.java
deleted file mode 100644
index db7c77f..0000000
--- a/test/ui/src/test/java/io/v/webdriver/htmlreport/ScreenshotData.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.webdriver.htmlreport;
-
-/**
- * Data model for a screenshot image.
- *
- * @author jingjin@google.com
- */
-public class ScreenshotData {
-  /**
-   * The base file name (not including the full path) of the screenshot image file.
-   */
-  private final String fileName;
-
-  /**
-   * The caption of the screenshot.
-   */
-  private final String caption;
-
-  public ScreenshotData(String fileName, String caption) {
-    this.fileName = fileName;
-    this.caption = caption;
-  }
-
-  public String getFileName() {
-    return fileName;
-  }
-
-  public String getCaption() {
-    return caption;
-  }
-}
diff --git a/test/ui/src/test/java/io/v/webdriver/htmlreport/report.ftl b/test/ui/src/test/java/io/v/webdriver/htmlreport/report.ftl
deleted file mode 100644
index 166a919..0000000
--- a/test/ui/src/test/java/io/v/webdriver/htmlreport/report.ftl
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>${data.testName}</title>
-    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
-    <link  href="https://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.css" rel="stylesheet">
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/fotorama/4.6.3/fotorama.js"></script>
-    <script>
-     // Set "Test Failed" caption to red background.
-     $(function() {
-        $('.fotorama').on('fotorama:show', function(e, fotorama, extra) {
-          $(".fotorama__caption__wrap").each(function(index) {
-            if ($(this).text() == "Test Failed") {
-              $(this).addClass('failed-test');
-            }
-          });
-        });
-      });
-    </script>
-    <style>
-      body {
-        font-family: Helvetica, Arial, sans-serif;
-      }
-
-      h1 {
-        font-size: 20px;
-        color: #0097A7;
-      }
-
-      .failed-test {
-        background-color: rgba(200, 0, 0, 0.9) !important;
-        color: white !important;
-      }
-
-      .fotorama__caption {
-        left: auto !important;
-        right: 0px;
-        top: 0px;
-      }
-
-      .fotorama__caption__wrap {
-        border: solid 1px #AAA;
-        font-weight: bold;
-      }
-
-      .fotorama__thumb-border {
-        border-color: #0097A7 !important;
-      }
-
-      .fotorama__wrap {
-        margin: 0 auto;
-      }
-    </style>
-  </head>
-  <body>
-    <h1>${data.testName}</h1>
-    <div class="fotorama"
-        data-width="800px"
-        data-ratio="800/600"
-        data-nav="thumbs"
-        data-keyboard="true"
-        data-thumbwidth=60
-        data-thumbheight=45>
-      <#list data.screenshots as screenshot>
-        <img class="failed-test" src="${screenshot.fileName}" data-caption="${screenshot.caption}"/>
-      </#list>
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/test/unit/test-arg-inspector.js b/test/unit/test-arg-inspector.js
index 9d48ecd..7bfc686 100644
--- a/test/unit/test-arg-inspector.js
+++ b/test/unit/test-arg-inspector.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var ArgInspector = require('../../src/lib/arg-inspector.js');
 
 test('var args = argInspector(fn)', function(t) {
diff --git a/test/unit/test-async-call.js b/test/unit/test-async-call.js
index f17e96b..a3db333 100644
--- a/test/unit/test-async-call.js
+++ b/test/unit/test-async-call.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Promise = require('../../src/lib/promise');
 var asyncCall = require('../../src/lib/async-call');
 var InspectableFunction = require('../../src/lib/inspectable-function');
diff --git a/test/unit/test-async-helper.js b/test/unit/test-async-helper.js
index dfbbc44..21766cc 100644
--- a/test/unit/test-async-helper.js
+++ b/test/unit/test-async-helper.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Promise = require('../../src/lib/promise');
 var asyncHelper = require('../../src/lib/async-helper');
 
diff --git a/test/unit/test-blessings-cache.js b/test/unit/test-blessings-cache.js
index a7b9e0b..2e52a5b 100644
--- a/test/unit/test-blessings-cache.js
+++ b/test/unit/test-blessings-cache.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var BlessingsCache = require('../../src/security/blessings-cache');
 var principal =
   require('../../src/gen-vdl/v.io/x/ref/services/wspr/internal/principal');
diff --git a/test/unit/test-blessings.js b/test/unit/test-blessings.js
index 30b1f1c..a7a631f 100644
--- a/test/unit/test-blessings.js
+++ b/test/unit/test-blessings.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Blessings = require('../../src/security/blessings');
 var vom = require('./../../src/vom');
 var WireBlessings =
diff --git a/test/unit/test-caveat-validator-registry.js b/test/unit/test-caveat-validator-registry.js
index 27f105b..39e81c5 100644
--- a/test/unit/test-caveat-validator-registry.js
+++ b/test/unit/test-caveat-validator-registry.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var CaveatValidatorRegistry =
   require('../../src/security/caveat-validator-registry');
 var context = require('../../src/context');
diff --git a/test/unit/test-context.js b/test/unit/test-context.js
index 295429e..fb1ea50 100644
--- a/test/unit/test-context.js
+++ b/test/unit/test-context.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for the context library.
  */
 
-var test = require('prova');
+var test = require('tape');
 var context = require('../../src/context');
 var verror = require('../../src/gen-vdl/v.io/v23/verror');
 
diff --git a/test/unit/test-create-caveats.js b/test/unit/test-create-caveats.js
index f9421df..e8e8337 100644
--- a/test/unit/test-create-caveats.js
+++ b/test/unit/test-create-caveats.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var types = require('../../src/vdl/types');
 var kind = require('../../src/vdl/kind');
 var vdlSecurity = require('../vdl-out/v.io/v23/security');
diff --git a/test/unit/test-create-signature.js b/test/unit/test-create-signature.js
index e2f5247..d981199 100644
--- a/test/unit/test-create-signature.js
+++ b/test/unit/test-create-signature.js
@@ -5,7 +5,7 @@
 /**
  * @fileoverview Tests of generating signature with multiple descriptions
  */
-var test = require('prova');
+var test = require('tape');
 var createSignature = require('../../src/vdl/create-signature');
 var vdl = require('../../src/vdl');
 var stringify = require('../../src/vdl/stringify');
diff --git a/test/unit/test-deferred.js b/test/unit/test-deferred.js
index ad78ba6..5ae9484 100644
--- a/test/unit/test-deferred.js
+++ b/test/unit/test-deferred.js
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 
-var test = require('prova');
+var test = require('tape');
 var Deferred = require('../../src/lib/deferred');
 
 test('var deferred = new Deferred() - success', function(assert) {
diff --git a/test/unit/test-error-catalog.js b/test/unit/test-error-catalog.js
index f4662b3..970ffd3 100644
--- a/test/unit/test-error-catalog.js
+++ b/test/unit/test-error-catalog.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Catalog = require('../../src/verror/catalog');
 
 test('set and lookup', function(assert) {
diff --git a/test/unit/test-error-format.js b/test/unit/test-error-format.js
index f16d7d7..4fe3952 100644
--- a/test/unit/test-error-format.js
+++ b/test/unit/test-error-format.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var formatError = require('../../src/verror/format');
 
 function expectFormatParams(t, format, expected) {
diff --git a/test/unit/test-error-tostring.js b/test/unit/test-error-tostring.js
index f6d1cb9..a34c539 100644
--- a/test/unit/test-error-tostring.js
+++ b/test/unit/test-error-tostring.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var verror = require('../../src/gen-vdl/v.io/v23/verror');
 
 test('Working toString on BadArgError (a VanadiumError)', function(t) {
diff --git a/test/unit/test-inspectable-function.js b/test/unit/test-inspectable-function.js
index bd26325..b81959f 100644
--- a/test/unit/test-inspectable-function.js
+++ b/test/unit/test-inspectable-function.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var InspectableFunction = require('../../src/lib/inspectable-function');
 
 test('apply()', function(t) {
diff --git a/test/unit/test-invoker-invoke.js b/test/unit/test-invoker-invoke.js
index db3f3c1..a2f5d7e 100644
--- a/test/unit/test-invoker-invoke.js
+++ b/test/unit/test-invoker-invoke.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var verror = require('../../').verror;
 var Invoker = require('../../src/invocation/invoker.js');
 var Context = require('../../src/context').Context;
diff --git a/test/unit/test-invoker.js b/test/unit/test-invoker.js
index 841250d..dc6333a 100644
--- a/test/unit/test-invoker.js
+++ b/test/unit/test-invoker.js
@@ -9,7 +9,7 @@
  * compatible with that expected by the JavaScript signature generator.
  */
 
-var test = require('prova');
+var test = require('tape');
 var Invoker = require('../../src/invocation/invoker.js');
 var Context = require('../../src/context').Context;
 var vdl = require('../../src/vdl');
diff --git a/test/unit/test-namespace-util.js b/test/unit/test-namespace-util.js
index 441fd1a..75ad9d2 100644
--- a/test/unit/test-namespace-util.js
+++ b/test/unit/test-namespace-util.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var names = require('../../src/naming/util');
 var ep = '@6@tcp@127.0.0.1:22@@@@@s@dev.v.io:blessing,v.io:blessing:b2@@';
 var rootedEp = '/' + ep;
diff --git a/test/unit/test-permissions-authorizer.js b/test/unit/test-permissions-authorizer.js
index 970d3b1..f4df793 100644
--- a/test/unit/test-permissions-authorizer.js
+++ b/test/unit/test-permissions-authorizer.js
@@ -3,7 +3,7 @@
 // license that can be found in the LICENSE file.
 
 
-var test = require('prova');
+var test = require('tape');
 var permissionsAuthorizer =
   require('../../src/security/access/permissions-authorizer');
 var access = require('../../src/gen-vdl/v.io/v23/security/access');
diff --git a/test/unit/test-proxy.js b/test/unit/test-proxy.js
index bc75be3..b347697 100644
--- a/test/unit/test-proxy.js
+++ b/test/unit/test-proxy.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Proxy = require('../../src/proxy');
 
 test('creating instances', function(assert) {
diff --git a/test/unit/test-random.js b/test/unit/test-random.js
index 5bf71cd..c9ecdc5 100644
--- a/test/unit/test-random.js
+++ b/test/unit/test-random.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 
 var random = require('../../src/lib/random');
 
diff --git a/test/unit/test-rpc-client.js b/test/unit/test-rpc-client.js
index f205eb0..89dbb96 100644
--- a/test/unit/test-rpc-client.js
+++ b/test/unit/test-rpc-client.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Client = require('../../src/rpc/client.js');
 var context = require('../../src/context');
 var createSignature = require('../../src/vdl/create-signature');
diff --git a/test/unit/test-rpc-signature-cache.js b/test/unit/test-rpc-signature-cache.js
index 2289292..6cfa88d 100644
--- a/test/unit/test-rpc-signature-cache.js
+++ b/test/unit/test-rpc-signature-cache.js
@@ -8,7 +8,7 @@
  * cache signatures per object name in JavaScript.
  * Scope of the cache is per proxy connection.
  */
-var test = require('prova');
+var test = require('tape');
 var context = require('../../src/context');
 var createMockProxy = require('./mock-proxy');
 var Outgoing = require('../../src/proxy/message-type').Outgoing;
diff --git a/test/unit/test-server-router.js b/test/unit/test-server-router.js
index 9bcbd04..c75f56d 100644
--- a/test/unit/test-server-router.js
+++ b/test/unit/test-server-router.js
@@ -6,7 +6,7 @@
  * @fileoveriew Tests server_router.js.
  */
 
-var test = require('prova');
+var test = require('tape');
 var Router = require('../../src/rpc/server-router');
 var Server = require('../../src/rpc/server');
 var Outgoing = require('../../src/proxy/message-type').Outgoing;
diff --git a/test/unit/test-service-reflection.js b/test/unit/test-service-reflection.js
index 746f560..6004288 100644
--- a/test/unit/test-service-reflection.js
+++ b/test/unit/test-service-reflection.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var isPublicMethod = require('../../src/lib/service-reflection').isPublicMethod;
 
 function AConstructor() {
diff --git a/test/unit/test-signature.js b/test/unit/test-signature.js
index 285c2ff..af6aba0 100644
--- a/test/unit/test-signature.js
+++ b/test/unit/test-signature.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests of signature generation.
  */
 
-var test = require('prova');
+var test = require('tape');
 var Interface = require('../../src/vdl/interface');
 var vdl = require('../../src/vdl');
 var stringify = require('../../src/vdl/stringify');
diff --git a/test/unit/test-standard-caveat-validators.js b/test/unit/test-standard-caveat-validators.js
index 41e545e..a811dcf 100644
--- a/test/unit/test-standard-caveat-validators.js
+++ b/test/unit/test-standard-caveat-validators.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var CaveatValidatorRegistry =
   require('../../src/security/caveat-validator-registry');
 var caveats = require('../../src/security/caveats');
diff --git a/test/unit/test-task-sequence.js b/test/unit/test-task-sequence.js
index b7fac99..4e46b1d 100644
--- a/test/unit/test-task-sequence.js
+++ b/test/unit/test-task-sequence.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Promise = require('../../src/lib/promise');
 var TaskSequence = require('../../src/lib/task-sequence');
 var promiseFor = require('../../src/lib/async-helper').promiseFor;
diff --git a/test/unit/test-uniqueid.js b/test/unit/test-uniqueid.js
index 93b8c5c..1ab9692 100644
--- a/test/unit/test-uniqueid.js
+++ b/test/unit/test-uniqueid.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for the uniqueid library.
  */
 
-var test = require('prova');
+var test = require('tape');
 var uniqueid = require('../../src/lib/uniqueid');
 var vdl = require('../../src/gen-vdl/v.io/v23/uniqueid');
 var typeutil = require('../../src/vdl/type-util');
diff --git a/test/unit/test-verror.js b/test/unit/test-verror.js
index 48176a4..64e334c 100644
--- a/test/unit/test-verror.js
+++ b/test/unit/test-verror.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var verror = require('../../src/gen-vdl/v.io/v23/verror');
 var Context = require('../../src/context').Context;
 var VanadiumError = require('../../src/verror/vanadium-error');
diff --git a/test/unit/test-vlog.js b/test/unit/test-vlog.js
index d655b7c..9f15c89 100644
--- a/test/unit/test-vlog.js
+++ b/test/unit/test-vlog.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var vlog = require('../../src/lib/vlog').logger;
 var Vlog = require('../../src/lib/vlog').Vlog;
 var levels = require('../../src/lib/vlog').levels;
diff --git a/test/unit/test-vtrace.js b/test/unit/test-vtrace.js
index 82f9415..45aa644 100644
--- a/test/unit/test-vtrace.js
+++ b/test/unit/test-vtrace.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for the vtrace library.
  */
 
-var test = require('prova');
+var test = require('tape');
 var context = require('../../src/context');
 var vtrace = require('../../src/vtrace');
 var vdl = require('../../src/gen-vdl/v.io/v23/vtrace');
diff --git a/test/vdl/test-big-int.js b/test/vdl/test-big-int.js
index 689116a..967e484 100644
--- a/test/vdl/test-big-int.js
+++ b/test/vdl/test-big-int.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for BigInt.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BigInt = require('./../../src/vdl/big-int.js');
 
diff --git a/test/vdl/test-byte-util.js b/test/vdl/test-byte-util.js
index d09522c..52ee13e 100644
--- a/test/vdl/test-byte-util.js
+++ b/test/vdl/test-byte-util.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for byte util.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var ByteUtil = require('./../../src/vdl/byte-util.js');
 
diff --git a/test/vdl/test-canonicalize.js b/test/vdl/test-canonicalize.js
index 31627fc..96696f0 100644
--- a/test/vdl/test-canonicalize.js
+++ b/test/vdl/test-canonicalize.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for canonicalize.js
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BigInt = require('./../../src/vdl/big-int.js');
 var Complex = require('./../../src/vdl/complex.js');
diff --git a/test/vdl/test-complex.js b/test/vdl/test-complex.js
index 589c737..f13d025 100644
--- a/test/vdl/test-complex.js
+++ b/test/vdl/test-complex.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var Complex = require('./../../src/vdl/complex');
 
 test('toString', function(assert) {
diff --git a/test/vdl/test-create-constructor.js b/test/vdl/test-create-constructor.js
index 3e1cebc..e5af39b 100644
--- a/test/vdl/test-create-constructor.js
+++ b/test/vdl/test-create-constructor.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests create-constructor.js
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BigInt = require('./../../src/vdl/big-int.js');
 var createConstructor = require('./../../src/vdl/create-constructor.js');
diff --git a/test/vdl/test-js-value-convert.js b/test/vdl/test-js-value-convert.js
index 35c5c17..2251968 100644
--- a/test/vdl/test-js-value-convert.js
+++ b/test/vdl/test-js-value-convert.js
@@ -8,7 +8,7 @@
  * Tests of the shallow convertTonative are performed in canonicalize.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var registry = require('./../../src/vdl/registry.js');
 var types = require('./../../src/vdl/types.js');
diff --git a/test/vdl/test-registry.js b/test/vdl/test-registry.js
index cf0c0c5..592af70 100644
--- a/test/vdl/test-registry.js
+++ b/test/vdl/test-registry.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for registry.js
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var registry = require('./../../src/vdl/registry.js');
 var registryMultipleRequire = require('./../../src/vdl/registry.js');
diff --git a/test/vdl/test-stringify.js b/test/vdl/test-stringify.js
index c9df294..3c193d7 100644
--- a/test/vdl/test-stringify.js
+++ b/test/vdl/test-stringify.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for stringify.js
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var stringify = require('./../../src/vdl/stringify.js');
 
diff --git a/test/vdl/test-type-compatible.js b/test/vdl/test-type-compatible.js
index ce802ac..74161d6 100644
--- a/test/vdl/test-type-compatible.js
+++ b/test/vdl/test-type-compatible.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for type conversion compatibility.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var kind = require('./../../src/vdl/kind.js');
 var Type = require('./../../src/vdl/type.js');
diff --git a/test/vdl/test-type-toString.js b/test/vdl/test-type-toString.js
index 1ed6635..86c9045 100644
--- a/test/vdl/test-type-toString.js
+++ b/test/vdl/test-type-toString.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for toString in type.js and types.js
  */
 
-var test = require('prova');
+var test = require('tape');
 var testCases = require('./type-test-cases.js');
 
 var Type = require('./../../src/vdl/type.js');
diff --git a/test/vdl/test-type-util.js b/test/vdl/test-type-util.js
index ab54e2e..b55279f 100644
--- a/test/vdl/test-type-util.js
+++ b/test/vdl/test-type-util.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 
 var typeUtil = require('../../src/vdl/type-util.js');
 var vdl = require('../../src/vdl');
diff --git a/test/vdl/test-vdl-base.js b/test/vdl/test-vdl-base.js
index 47a7dea..bc38f60 100644
--- a/test/vdl/test-vdl-base.js
+++ b/test/vdl/test-vdl-base.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var base = require('../vdl-out/v.io/x/ref/lib/vdl/testdata/base');
 var context = require('../../src/context');
 var SharedContextKeys = require('../../src/runtime/shared-context-keys');
diff --git a/test/vdl/test-vdl-errors.js b/test/vdl/test-vdl-errors.js
index 156520a..30b8274 100644
--- a/test/vdl/test-vdl-errors.js
+++ b/test/vdl/test-vdl-errors.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var verror = require('../../src/gen-vdl/v.io/v23/verror');
 var ec = require('../../src/vdl/error-conversion');
 var types = require('../../src/vdl/types');
diff --git a/test/vdl/test-vdl-native.js b/test/vdl/test-vdl-native.js
index da9ed7c..3ec6ad4 100644
--- a/test/vdl/test-vdl-native.js
+++ b/test/vdl/test-vdl-native.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var time = require('../vdl-out/javascript-test/time');
 
 test('time constants are Dates', function(assert) {
diff --git a/test/vom/test-binary-reader.js b/test/vom/test-binary-reader.js
index c627b5d..bcb882d 100644
--- a/test/vom/test-binary-reader.js
+++ b/test/vom/test-binary-reader.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for binary reader.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BinaryReader = require('./../../src/vom/binary-reader.js');
 var ByteUtil = require('./../../src/vdl/byte-util.js');
diff --git a/test/vom/test-encode-decode.js b/test/vom/test-encode-decode.js
index 29d71b8..2cb8c86 100644
--- a/test/vom/test-encode-decode.js
+++ b/test/vom/test-encode-decode.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests of VOM encoding and decoding.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var kind = require('./../../src/vdl/kind.js');
 var registry = require('./../../src/vdl/registry.js');
diff --git a/test/vom/test-native-type.js b/test/vom/test-native-type.js
index 7167452..3ce1c58 100644
--- a/test/vom/test-native-type.js
+++ b/test/vom/test-native-type.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 
 var ByteMessageWriter = require(
     './../../src/vom/byte-message-writer');
diff --git a/test/vom/test-raw-vom-compatibility.js b/test/vom/test-raw-vom-compatibility.js
index 8620583..bbf2ebc 100644
--- a/test/vom/test-raw-vom-compatibility.js
+++ b/test/vom/test-raw-vom-compatibility.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests compatibility with go.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BigInt = require('./../../src/vdl/big-int.js');
 var RawVomWriter = require('./../../src/vom/raw-vom-writer');
diff --git a/test/vom/test-raw-vom-recoverability.js b/test/vom/test-raw-vom-recoverability.js
index 02c578d..47950df 100644
--- a/test/vom/test-raw-vom-recoverability.js
+++ b/test/vom/test-raw-vom-recoverability.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests recovering written vom data js to js.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var BigInt = require('./../../src/vdl/big-int.js');
 var RawVomWriter = require('./../../src/vom/raw-vom-writer');
diff --git a/test/vom/test-stream-reader.js b/test/vom/test-stream-reader.js
index 0e43391..d1ee3ee 100644
--- a/test/vom/test-stream-reader.js
+++ b/test/vom/test-stream-reader.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for stream reader.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var StreamReader = require('./../../src/vom/stream-reader.js');
 var ByteUtil = require('./../../src/vdl/byte-util.js');
diff --git a/test/vom/test-type-encoding.js b/test/vom/test-type-encoding.js
index faf7a30..7b61b4c 100644
--- a/test/vom/test-type-encoding.js
+++ b/test/vom/test-type-encoding.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for TypeEncoder and TypeDecoder.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var stringify = require('./../../src/vdl/stringify.js');
 var types = require('./../../src/vdl/types.js');
diff --git a/test/vom/test-vdl-arith.js b/test/vom/test-vdl-arith.js
index e8c1385..018b83d 100644
--- a/test/vom/test-vdl-arith.js
+++ b/test/vom/test-vdl-arith.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-var test = require('prova');
+var test = require('tape');
 var vom = require('../../src/vom');
 var IfaceSigType =
   require('../../src/gen-vdl/v.io/v23/vdlroot/signature').Interface;
diff --git a/test/vom/test-vom-compatibility.js b/test/vom/test-vom-compatibility.js
index 6ddee0d..03ece3b 100644
--- a/test/vom/test-vom-compatibility.js
+++ b/test/vom/test-vom-compatibility.js
@@ -6,7 +6,7 @@
  * @fileoverview Tests for encoder and decoder compatibility.
  */
 
-var test = require('prova');
+var test = require('tape');
 
 var testdata80 = require('../vdl-out/v.io/v23/vom/testdata/data80');
 var testdata81 = require('../vdl-out/v.io/v23/vom/testdata/data81');
