diff --git a/lib/testutil/init.go b/lib/testutil/init.go
index 4e328b3..d451c27 100644
--- a/lib/testutil/init.go
+++ b/lib/testutil/init.go
@@ -56,6 +56,13 @@
 
 var Rand *Random
 var once sync.Once
+var RunIntegrationTests bool
+
+const IntegrationTestsFlag = "v23.tests"
+
+func init() {
+	flag.BoolVar(&RunIntegrationTests, IntegrationTestsFlag, false, "Run integration tests.")
+}
 
 // Init sets up state for running tests: Adjusting GOMAXPROCS,
 // configuring the vlog logging library, setting up the random number generator
diff --git a/lib/testutil/integration/testdata/integration_test.go b/lib/testutil/integration/testdata/integration_test.go
index 5d11ed6..eadb7be 100644
--- a/lib/testutil/integration/testdata/integration_test.go
+++ b/lib/testutil/integration/testdata/integration_test.go
@@ -15,7 +15,7 @@
 }
 
 func TestBinaryFromPath(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	bash := env.BinaryFromPath("/bin/bash")
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 0511b15..fcc8571 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -38,13 +38,15 @@
 	"v.io/core/veyron/lib/expect"
 	"v.io/core/veyron/lib/modules"
 	"v.io/core/veyron/lib/modules/core"
+	"v.io/core/veyron/lib/testutil"
+
 	tsecurity "v.io/core/veyron/lib/testutil/security"
 	"v.io/core/veyron2"
 	"v.io/core/veyron2/security"
 )
 
 // Test represents the currently running test. In a local end-to-end test
-// environment obtained though NewTestEnvironment, this interface will be
+// environment obtained though New, this interface will be
 // implemented by Go's standard testing.T.
 //
 // We are planning to implement a regression testing environment that does not
@@ -66,16 +68,17 @@
 	Skipped() bool
 }
 
-// TestEnvironment represents a test environment. You should obtain
-// an instance with NewTestEnvironment. Typically, an end-to-end
+// T represents a test environment. Typically, an end-to-end
 // test will begin with:
 //   func TestFoo(t *testing.T) {
-//     env := integration.NewTestEnvironment(t)
+//     env := integration.New(t)
 //     defer env.Cleanup()
 //
 //     ...
 //   }
-type TestEnvironment interface {
+type T interface {
+	Test
+
 	// Cleanup cleans up the environment and deletes all its artifacts.
 	Cleanup()
 
@@ -109,9 +112,6 @@
 	// TempDir creates a temporary directory. Temporary directories and
 	// their contents will be deleted by Cleanup.
 	TempDir() string
-
-	// Test returns the currently running test.
-	Test() Test
 }
 
 type TestBinary interface {
@@ -134,9 +134,9 @@
 // For example:
 //   bin := env.BinaryFromPath("/bin/bash")
 //   inv := bin.Start("-c", "echo hello world 1>&2")
-//   var buf bytes.Buffer
-//   inv.WaitOrDie(nil, bufio.NewWriter(&buf))
-//   // buf.Bytes() now contains 'hello world\n'
+//   var stderr bytes.Buffer
+//   inv.WaitOrDie(nil, &stderr)
+//   // stderr.Bytes() now contains 'hello world\n'
 type Invocation interface {
 	Stdin() io.Writer
 	Stdout() io.Reader
@@ -166,7 +166,7 @@
 
 type integrationTestEnvironment struct {
 	// The testing framework.
-	t Test
+	Test
 
 	// The function to shutdown the context used to create the environment.
 	shutdown veyron2.Shutdown
@@ -221,7 +221,7 @@
 func (i *integrationTestBinaryInvocation) Kill(sig syscall.Signal) error {
 	pid := (*i.handle).Pid()
 	(*i.handle).Shutdown(nil, nil)
-	i.env.t.Logf("sending signal %v to PID %d", sig, pid)
+	i.env.Logf("sending signal %v to PID %d", sig, pid)
 	return syscall.Kill(pid, sig)
 }
 
@@ -235,7 +235,7 @@
 }
 
 func (i *integrationTestBinaryInvocation) Output() string {
-	return readerToString(i.env.t, i.Stdout())
+	return readerToString(i.env, i.Stdout())
 }
 
 func (i *integrationTestBinaryInvocation) Wait(stdout, stderr io.Writer) error {
@@ -244,15 +244,15 @@
 
 func (i *integrationTestBinaryInvocation) WaitOrDie(stdout, stderr io.Writer) {
 	if err := i.Wait(stdout, stderr); err != nil {
-		i.env.t.Fatalf("FATAL: Wait() for pid %d failed: %v", (*i.handle).Pid(), err)
+		i.env.Fatalf("FATAL: Wait() for pid %d failed: %v", (*i.handle).Pid(), err)
 	}
 }
 
 func (b *integrationTestBinary) cleanup() {
 	binaryDir := path.Dir(b.path)
-	b.env.t.Logf("cleaning up %s", binaryDir)
+	b.env.Logf("cleaning up %s", binaryDir)
 	if err := os.RemoveAll(binaryDir); err != nil {
-		b.env.t.Logf("WARNING: RemoveAll(%s) failed (%v)", binaryDir, err)
+		b.env.Logf("WARNING: RemoveAll(%s) failed (%v)", binaryDir, err)
 	}
 }
 
@@ -265,12 +265,12 @@
 	if _, file, line, ok := runtime.Caller(1); ok {
 		locationString = fmt.Sprintf("(requested at %s:%d) ", filepath.Base(file), line)
 	}
-	b.env.t.Logf("%sstarting %s %s", locationString, b.Path(), strings.Join(args, " "))
+	b.env.Logf("%sstarting %s %s", locationString, b.Path(), strings.Join(args, " "))
 	handle, err := b.env.shell.StartExternalCommand(b.envVars, append([]string{b.Path()}, args...)...)
 	if err != nil {
-		b.env.t.Fatalf("StartExternalCommand(%v, %v) failed: %v", b.Path(), strings.Join(args, ", "), err)
+		b.env.Fatalf("StartExternalCommand(%v, %v) failed: %v", b.Path(), strings.Join(args, ", "), err)
 	}
-	b.env.t.Logf("started PID %d\n", handle.Pid())
+	b.env.Logf("started PID %d\n", handle.Pid())
 	return &integrationTestBinaryInvocation{
 		env:    b.env,
 		handle: &handle,
@@ -299,24 +299,24 @@
 	}
 
 	for _, tempFile := range e.tempFiles {
-		e.t.Logf("cleaning up %s", tempFile.Name())
+		e.Logf("cleaning up %s", tempFile.Name())
 		if err := tempFile.Close(); err != nil {
-			e.t.Logf("WARNING: Close(%q) failed: %v", tempFile.Name(), err)
+			e.Logf("WARNING: Close(%q) failed: %v", tempFile.Name(), err)
 		}
 		if err := os.RemoveAll(tempFile.Name()); err != nil {
-			e.t.Logf("WARNING: RemoveAll(%q) failed: %v", tempFile.Name(), err)
+			e.Logf("WARNING: RemoveAll(%q) failed: %v", tempFile.Name(), err)
 		}
 	}
 
 	for _, tempDir := range e.tempDirs {
-		e.t.Logf("cleaning up %s", tempDir)
+		e.Logf("cleaning up %s", tempDir)
 		if err := os.RemoveAll(tempDir); err != nil {
-			e.t.Logf("WARNING: RemoveAll(%q) failed: %v", tempDir, err)
+			e.Logf("WARNING: RemoveAll(%q) failed: %v", tempDir, err)
 		}
 	}
 
 	if err := e.shell.Cleanup(os.Stdout, os.Stderr); err != nil {
-		e.t.Fatalf("WARNING: could not clean up shell (%v)", err)
+		e.Fatalf("WARNING: could not clean up shell (%v)", err)
 	}
 }
 
@@ -330,7 +330,7 @@
 	// Get the current working directory.
 	cwd, err := os.Getwd()
 	if err != nil {
-		e.t.Fatalf("Getwd() failed: %v", err)
+		e.Fatalf("Getwd() failed: %v", err)
 	}
 
 	// Transfer stdin, stdout, and stderr to the new process
@@ -338,7 +338,7 @@
 	dev := "/dev/tty"
 	fd, err := syscall.Open(dev, syscall.O_RDWR, 0)
 	if err != nil {
-		e.t.Logf("WARNING: Open(%v) failed, was asked to create a debug shell but cannot: %v", dev, err)
+		e.Logf("WARNING: Open(%v) failed, was asked to create a debug shell but cannot: %v", dev, err)
 		return
 	}
 	file := os.NewFile(uintptr(fd), dev)
@@ -348,15 +348,15 @@
 	}
 
 	// Start up a new shell.
-	writeStringOrDie(e.t, file, ">> Starting a new interactive shell\n")
-	writeStringOrDie(e.t, file, "Hit CTRL-D to resume the test\n")
+	writeStringOrDie(e, file, ">> Starting a new interactive shell\n")
+	writeStringOrDie(e, file, "Hit CTRL-D to resume the test\n")
 	if len(e.builtBinaries) > 0 {
-		writeStringOrDie(e.t, file, "Built binaries:\n")
+		writeStringOrDie(e, file, "Built binaries:\n")
 		for _, value := range e.builtBinaries {
-			writeStringOrDie(e.t, file, "\t"+value.Path()+"\n")
+			writeStringOrDie(e, file, "\t"+value.Path()+"\n")
 		}
 	}
-	writeStringOrDie(e.t, file, fmt.Sprintf("Root mounttable endpoint: %s\n", e.RootMT()))
+	writeStringOrDie(e, file, fmt.Sprintf("Root mounttable endpoint: %s\n", e.RootMT()))
 
 	shellPath := "/bin/sh"
 	if shellPathFromEnv := os.Getenv("SHELL"); shellPathFromEnv != "" {
@@ -364,16 +364,16 @@
 	}
 	proc, err := os.StartProcess(shellPath, []string{}, &attr)
 	if err != nil {
-		e.t.Fatalf("StartProcess(%q) failed: %v", shellPath, err)
+		e.Fatalf("StartProcess(%q) failed: %v", shellPath, err)
 	}
 
 	// Wait until user exits the shell
 	state, err := proc.Wait()
 	if err != nil {
-		e.t.Fatalf("Wait(%v) failed: %v", shellPath, err)
+		e.Fatalf("Wait(%v) failed: %v", shellPath, err)
 	}
 
-	writeStringOrDie(e.t, file, fmt.Sprintf("<< Exited shell: %s\n", state.String()))
+	writeStringOrDie(e, file, fmt.Sprintf("<< Exited shell: %s\n", state.String()))
 }
 
 func (e *integrationTestEnvironment) BinaryFromPath(path string) TestBinary {
@@ -386,18 +386,18 @@
 }
 
 func (e *integrationTestEnvironment) BuildGoPkg(binary_path string) TestBinary {
-	e.t.Logf("building %s...", binary_path)
+	e.Logf("building %s...", binary_path)
 	if cached_binary := e.builtBinaries[binary_path]; cached_binary != nil {
-		e.t.Logf("using cached binary for %s at %s.", binary_path, cached_binary.Path())
+		e.Logf("using cached binary for %s at %s.", binary_path, cached_binary.Path())
 		return cached_binary
 	}
 	built_path, cleanup, err := buildPkg(binary_path)
 	if err != nil {
-		e.t.Fatalf("buildPkg() failed: %v", err)
+		e.Fatalf("buildPkg() failed: %v", err)
 		return nil
 	}
 	output_path := path.Join(built_path, path.Base(binary_path))
-	e.t.Logf("done building %s, written to %s.", binary_path, output_path)
+	e.Logf("done building %s, written to %s.", binary_path, output_path)
 	binary := &integrationTestBinary{
 		env:         e,
 		envVars:     nil,
@@ -411,9 +411,9 @@
 func (e *integrationTestEnvironment) TempFile() *os.File {
 	f, err := ioutil.TempFile("", "")
 	if err != nil {
-		e.t.Fatalf("TempFile() failed: %v", err)
+		e.Fatalf("TempFile() failed: %v", err)
 	}
-	e.t.Logf("created temporary file at %s", f.Name())
+	e.Logf("created temporary file at %s", f.Name())
 	e.tempFiles = append(e.tempFiles, f)
 	return f
 }
@@ -421,17 +421,13 @@
 func (e *integrationTestEnvironment) TempDir() string {
 	f, err := ioutil.TempDir("", "")
 	if err != nil {
-		e.t.Fatalf("TempDir() failed: %v", err)
+		e.Fatalf("TempDir() failed: %v", err)
 	}
-	e.t.Logf("created temporary directory at %s", f)
+	e.Logf("created temporary directory at %s", f)
 	e.tempDirs = append(e.tempDirs, f)
 	return f
 }
 
-func (e *integrationTestEnvironment) Test() Test {
-	return e.t
-}
-
 // Creates a new local testing environment. A local testing environment has a
 // root mounttable endpoint at RootMT() and a security principle available via
 // Principal().
@@ -445,7 +441,7 @@
 //
 //     ...
 //   }
-func NewTestEnvironment(t Test) TestEnvironment {
+func New(t Test) T {
 	ctx, shutdown := veyron2.Init()
 
 	t.Log("creating root principal")
@@ -468,7 +464,7 @@
 	t.Logf("mounttable available at %s", mtEndpoint)
 
 	return &integrationTestEnvironment{
-		t:             t,
+		Test:          t,
 		principal:     principal,
 		builtBinaries: make(map[string]*integrationTestBinary),
 		shell:         shell,
@@ -480,6 +476,16 @@
 	}
 }
 
+// RunTest runs a single Vanadium integration test.
+func RunTest(t Test, fn func(i T)) {
+	if !testutil.RunIntegrationTests {
+		t.Skip()
+	}
+	i := New(t)
+	fn(i)
+	i.Cleanup()
+}
+
 // BuildPkg returns a path to a directory that contains the built binary for
 // the given packages and a function that should be invoked to clean up the
 // build artifacts. Note that the clients of this function should not modify
diff --git a/services/mgmt/application/applicationd/testdata/integration_test.go b/services/mgmt/application/applicationd/testdata/integration_test.go
index 5969c43..ba449c5 100644
--- a/services/mgmt/application/applicationd/testdata/integration_test.go
+++ b/services/mgmt/application/applicationd/testdata/integration_test.go
@@ -18,7 +18,7 @@
 	"v.io/core/veyron/tools/application",
 }
 
-func helper(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, expectError bool, credentials, cmd string, args ...string) string {
+func helper(t *testing.T, env integration.T, clientBin integration.TestBinary, expectError bool, credentials, cmd string, args ...string) string {
 	args = append([]string{"-veyron.credentials=" + credentials, "-veyron.namespace.root=" + env.RootMT(), cmd}, args...)
 	inv := clientBin.Start(args...)
 	out := inv.Output()
@@ -33,15 +33,15 @@
 
 }
 
-func matchEnvelope(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, expectError bool, credentials, name, suffix string) string {
+func matchEnvelope(t *testing.T, env integration.T, clientBin integration.TestBinary, expectError bool, credentials, name, suffix string) string {
 	return helper(t, env, clientBin, expectError, credentials, "match", naming.Join(name, suffix), "test-profile")
 }
 
-func putEnvelope(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, credentials, name, suffix, envelope string) string {
+func putEnvelope(t *testing.T, env integration.T, clientBin integration.TestBinary, credentials, name, suffix, envelope string) string {
 	return helper(t, env, clientBin, false, credentials, "put", naming.Join(name, suffix), "test-profile", envelope)
 }
 
-func removeEnvelope(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, credentials, name, suffix string) string {
+func removeEnvelope(t *testing.T, env integration.T, clientBin integration.TestBinary, credentials, name, suffix string) string {
 	return helper(t, env, clientBin, false, credentials, "remove", naming.Join(name, suffix), "test-profile")
 }
 
@@ -50,7 +50,7 @@
 }
 
 func TestApplicationRepository(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	// Generate credentials.
diff --git a/services/mgmt/binary/binaryd/testdata/integration_test.go b/services/mgmt/binary/binaryd/testdata/integration_test.go
index 87ff0f4..c1f61df 100644
--- a/services/mgmt/binary/binaryd/testdata/integration_test.go
+++ b/services/mgmt/binary/binaryd/testdata/integration_test.go
@@ -50,7 +50,7 @@
 	}
 }
 
-func deleteFile(env integration.TestEnvironment, clientBin integration.TestBinary, credentials, name, suffix string) {
+func deleteFile(env integration.T, clientBin integration.TestBinary, credentials, name, suffix string) {
 	deleteArgs := []string{
 		"-veyron.credentials=" + credentials,
 		"-veyron.namespace.root=" + env.RootMT(),
@@ -59,7 +59,7 @@
 	clientBin.Start(deleteArgs...).WaitOrDie(nil, nil)
 }
 
-func downloadFile(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, expectError bool, credentials, name, path, suffix string) {
+func downloadFile(t *testing.T, env integration.T, clientBin integration.TestBinary, expectError bool, credentials, name, path, suffix string) {
 	downloadArgs := []string{
 		"-veyron.credentials=" + credentials,
 		"-veyron.namespace.root=" + env.RootMT(),
@@ -90,7 +90,7 @@
 	}
 }
 
-func rootURL(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, credentials, name string) string {
+func rootURL(t *testing.T, env integration.T, clientBin integration.TestBinary, credentials, name string) string {
 	rootArgs := []string{
 		"-veyron.credentials=" + credentials,
 		"-veyron.namespace.root=" + env.RootMT(),
@@ -99,7 +99,7 @@
 	return strings.TrimSpace(clientBin.Start(rootArgs...).Output())
 }
 
-func uploadFile(t *testing.T, env integration.TestEnvironment, clientBin integration.TestBinary, credentials, name, path, suffix string) {
+func uploadFile(t *testing.T, env integration.T, clientBin integration.TestBinary, credentials, name, path, suffix string) {
 	uploadArgs := []string{
 		"-veyron.credentials=" + credentials,
 		"-veyron.namespace.root=" + env.RootMT(),
@@ -113,7 +113,7 @@
 }
 
 func TestBinaryRepositoryIntegration(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	// Build the required binaries.
diff --git a/services/mgmt/build/buildd/testdata/integration_test.go b/services/mgmt/build/buildd/testdata/integration_test.go
index d6d4384..f913b35 100644
--- a/services/mgmt/build/buildd/testdata/integration_test.go
+++ b/services/mgmt/build/buildd/testdata/integration_test.go
@@ -29,7 +29,7 @@
 }
 
 func TestBuildServerIntegration(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	// Generate credentials.
diff --git a/services/mgmt/profile/profiled/testdata/integration_test.go b/services/mgmt/profile/profiled/testdata/integration_test.go
index c20c8e3..9c4f6ac 100644
--- a/services/mgmt/profile/profiled/testdata/integration_test.go
+++ b/services/mgmt/profile/profiled/testdata/integration_test.go
@@ -12,7 +12,7 @@
 	"v.io/core/veyron2/naming"
 )
 
-func profileCommandOutput(t *testing.T, env integration.TestEnvironment, profileBin integration.TestBinary, expectError bool, command, name, suffix string) string {
+func profileCommandOutput(t *testing.T, env integration.T, profileBin integration.TestBinary, expectError bool, command, name, suffix string) string {
 	labelArgs := []string{
 		"-veyron.namespace.root=" + env.RootMT(),
 		command, naming.Join(name, suffix),
@@ -29,7 +29,7 @@
 	return strings.TrimSpace(out)
 }
 
-func putProfile(t *testing.T, env integration.TestEnvironment, profileBin integration.TestBinary, name, suffix string) {
+func putProfile(t *testing.T, env integration.T, profileBin integration.TestBinary, name, suffix string) {
 	putArgs := []string{
 		"-veyron.namespace.root=" + env.RootMT(),
 		"put", naming.Join(name, suffix),
@@ -37,7 +37,7 @@
 	profileBin.Start(putArgs...).WaitOrDie(os.Stdout, os.Stderr)
 }
 
-func removeProfile(t *testing.T, env integration.TestEnvironment, profileBin integration.TestBinary, name, suffix string) {
+func removeProfile(t *testing.T, env integration.T, profileBin integration.TestBinary, name, suffix string) {
 	removeArgs := []string{
 		"-veyron.namespace.root=" + env.RootMT(),
 		"remove", naming.Join(name, suffix),
@@ -50,7 +50,7 @@
 }
 
 func TestProfileRepository(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	// Start the profile repository.
diff --git a/tools/debug/testdata/integration_test.go b/tools/debug/testdata/integration_test.go
index ed17bcc..1c23518 100644
--- a/tools/debug/testdata/integration_test.go
+++ b/tools/debug/testdata/integration_test.go
@@ -23,7 +23,7 @@
 }
 
 func TestDebugGlob(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
@@ -39,7 +39,7 @@
 }
 
 func TestDebugGlobLogs(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	fileName := filepath.Base(env.TempFile().Name())
@@ -54,7 +54,7 @@
 }
 
 func TestReadHostname(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	path := env.RootMT() + "/__debug/stats/system/hostname"
@@ -69,7 +69,7 @@
 	}
 }
 
-func createTestLogFile(t *testing.T, env integration.TestEnvironment, content string) *os.File {
+func createTestLogFile(t *testing.T, env integration.T, content string) *os.File {
 	file := env.TempFile()
 	_, err := file.Write([]byte(content))
 	if err != nil {
@@ -79,7 +79,7 @@
 }
 
 func TestLogSize(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
@@ -99,7 +99,7 @@
 }
 
 func TestStatsRead(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
@@ -118,7 +118,7 @@
 }
 
 func TestStatsWatch(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
@@ -162,7 +162,7 @@
 }
 
 func TestVTrace(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
@@ -216,7 +216,7 @@
 }
 
 func TestPprof(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/debug")
diff --git a/tools/naming/simulator/simulator_test.go b/tools/naming/simulator/simulator_test.go
new file mode 100644
index 0000000..9d5ef0f
--- /dev/null
+++ b/tools/naming/simulator/simulator_test.go
@@ -0,0 +1,46 @@
+package main_test
+
+//go:generate v23 integration generate .
+
+import (
+	"bytes"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"regexp"
+	"testing"
+
+	"v.io/core/veyron/lib/modules"
+	"v.io/core/veyron/lib/testutil/integration"
+)
+
+func TestHelperProcess(t *testing.T) {
+	modules.DispatchInTest()
+}
+func V23TestSimulator(t integration.T) {
+	binary := t.BuildGoPkg("v.io/core/veyron/tools/naming/simulator")
+	files, err := ioutil.ReadDir("./testdata")
+	if err != nil {
+		t.Fatal(err)
+	}
+	scripts := []string{}
+	re := regexp.MustCompile(`.*\.scr`)
+	for _, f := range files {
+		if !f.IsDir() && re.MatchString(f.Name()) {
+			scripts = append(scripts, "./testdata/"+f.Name())
+		}
+	}
+	for _, script := range scripts {
+		if testing.Verbose() {
+			fmt.Fprintf(os.Stderr, "Script %v\n", script)
+		}
+		invocation := binary.Start("--file", script)
+		var stdout, stderr bytes.Buffer
+		if err := invocation.Wait(&stdout, &stderr); err != nil {
+			fmt.Fprintf(os.Stderr, "Script %v failed\n", script)
+			fmt.Fprintln(os.Stderr, stdout)
+			fmt.Fprintln(os.Stderr, stderr)
+			t.Error(err)
+		}
+	}
+}
diff --git a/tools/naming/simulator/testdata/integration_test.go b/tools/naming/simulator/testdata/integration_test.go
index be038a7..c28e792 100644
--- a/tools/naming/simulator/testdata/integration_test.go
+++ b/tools/naming/simulator/testdata/integration_test.go
@@ -1,7 +1,6 @@
 package testdata
 
 import (
-	"bufio"
 	"bytes"
 	"fmt"
 	"io/ioutil"
@@ -20,7 +19,7 @@
 }
 
 func TestSimulator(t *testing.T) {
-	env := integration.NewTestEnvironment(t)
+	env := integration.New(t)
 	defer env.Cleanup()
 	binary := env.BuildGoPkg("v.io/core/veyron/tools/naming/simulator")
 	files, err := ioutil.ReadDir(".")
@@ -36,14 +35,12 @@
 	}
 	for _, script := range scripts {
 		invocation := binary.Start("--file", script)
-		output := invocation.Output()
-		var buf bytes.Buffer
-		if err := invocation.Wait(nil, bufio.NewWriter(&buf)); err != nil {
-			errorOutput := string(buf.Bytes())
+		var stdout, stderr bytes.Buffer
+		if err := invocation.Wait(&stdout, &stderr); err != nil {
 			fmt.Fprintf(os.Stderr, "Script %v failed\n", script)
-			fmt.Fprintln(os.Stderr, output)
-			fmt.Fprintln(os.Stderr, errorOutput)
-			t.Fatal(err)
+			fmt.Fprintln(os.Stderr, stdout)
+			fmt.Fprintln(os.Stderr, stderr)
+			t.Error(err)
 		}
 	}
 }
diff --git a/tools/naming/simulator/v23_test.go b/tools/naming/simulator/v23_test.go
new file mode 100644
index 0000000..dfde460
--- /dev/null
+++ b/tools/naming/simulator/v23_test.go
@@ -0,0 +1,19 @@
+// This file was auto-generated via go generate.
+// DO NOT UPDATE MANUALLY
+package main_test
+
+import "testing"
+import "os"
+
+import "v.io/core/veyron/lib/testutil"
+import "v.io/core/veyron/lib/testutil/integration"
+
+func TestMain(m *testing.M) {
+	testutil.Init()
+	// TODO(cnicolaou): call modules.Dispatch and remove the need for TestHelperProcess
+	os.Exit(m.Run())
+}
+
+func TestV23Simulator(t *testing.T) {
+	integration.RunTest(t, V23TestSimulator)
+}
