v.io/jiri: refactor to move DataDir out of jiri, part 2.

Continue the migration to use devtools/tooldata
rather than jiri/util and devtools/data.
In particular, the functionality built into the jiri tool
for managing GOPATH and VDLPATH is moved out out jiri, as
are related commands. In particular:

jiri profile env can no longer access GOPATH and VDLPATH
jiri go env GOPATH is now the only way to access GOPATH values
jiri go env VDLPATH is now the only way to access VDLPATH values

the pseudo profile, 'jiri', is gone.

MultiPart: 2/2
Change-Id: I24d73a58652ea0d2c9071a863ee88409cd969532
diff --git a/data/.api b/data/.api
new file mode 100644
index 0000000..f08fb87
--- /dev/null
+++ b/data/.api
@@ -0,0 +1,45 @@
+pkg data, func ConfigFilePath(*jiri.X) (string, error)
+pkg data, func DataDirPath(*jiri.X, string) (string, error)
+pkg data, func LoadConfig(*jiri.X) (*Config, error)
+pkg data, func LoadOncallRotation(*jiri.X) (*OncallRotation, error)
+pkg data, func NewConfig(...ConfigOpt) *Config
+pkg data, func Oncall(*jiri.X, time.Time) (*OncallShift, error)
+pkg data, func OncallRotationPath(*jiri.X) (string, error)
+pkg data, func SaveConfig(*jiri.X, *Config) error
+pkg data, func ThirdPartyBinPath(*jiri.X, string) (string, error)
+pkg data, method (Config) APICheckProjects() map[string]struct{}
+pkg data, method (Config) CopyrightCheckProjects() map[string]struct{}
+pkg data, method (Config) GoPath(*jiri.X) string
+pkg data, method (Config) GoWorkspaces() []string
+pkg data, method (Config) GroupTests([]string) []string
+pkg data, method (Config) JenkinsMatrixJobs() map[string]JenkinsMatrixJobInfo
+pkg data, method (Config) ProjectTests([]string) []string
+pkg data, method (Config) Projects() []string
+pkg data, method (Config) TestDependencies(string) []string
+pkg data, method (Config) TestParts(string) []string
+pkg data, method (Config) VDLPath(*jiri.X) string
+pkg data, method (Config) VDLWorkspaces() []string
+pkg data, type APICheckProjectsOpt map[string]struct{}
+pkg data, type Config struct
+pkg data, type ConfigOpt interface, unexported methods
+pkg data, type CopyrightCheckProjectsOpt map[string]struct{}
+pkg data, type GoWorkspacesOpt []string
+pkg data, type JenkinsMatrixJobInfo struct
+pkg data, type JenkinsMatrixJobInfo struct, HasArch bool
+pkg data, type JenkinsMatrixJobInfo struct, HasOS bool
+pkg data, type JenkinsMatrixJobInfo struct, HasParts bool
+pkg data, type JenkinsMatrixJobInfo struct, Name string
+pkg data, type JenkinsMatrixJobInfo struct, ShowOS bool
+pkg data, type JenkinsMatrixJobsOpt map[string]JenkinsMatrixJobInfo
+pkg data, type OncallRotation struct
+pkg data, type OncallRotation struct, Shifts []OncallShift
+pkg data, type OncallRotation struct, XMLName xml.Name
+pkg data, type OncallShift struct
+pkg data, type OncallShift struct, Date string
+pkg data, type OncallShift struct, Primary string
+pkg data, type OncallShift struct, Secondary string
+pkg data, type ProjectTestsOpt map[string][]string
+pkg data, type TestDependenciesOpt map[string][]string
+pkg data, type TestGroupsOpt map[string][]string
+pkg data, type TestPartsOpt map[string][]string
+pkg data, type VDLWorkspacesOpt []string
diff --git a/gologcop/gologcop_test.go b/gologcop/gologcop_test.go
index e0bbb0d..e40ffb9 100644
--- a/gologcop/gologcop_test.go
+++ b/gologcop/gologcop_test.go
@@ -24,6 +24,7 @@
 	"v.io/jiri/profiles"
 	"v.io/jiri/profiles/profilesreader"
 	"v.io/jiri/tool"
+	"v.io/x/devtools/tooldata"
 )
 
 const (
@@ -62,6 +63,7 @@
 func TestRemove(t *testing.T) {
 	fake, cleanup := jiritest.NewFakeJiriRoot(t)
 	defer cleanup()
+
 	var stdout bytes.Buffer
 	fake.X.Context = tool.NewContext(tool.ContextOpts{Stdout: &stdout})
 	if _, err := configureDefaultBuildConfig(fake.X, []string{"testpackage"}); err != nil {
@@ -175,6 +177,7 @@
 func testInject(t *testing.T, iface, prefix string, testPackageCount int) {
 	fake, cleanup := jiritest.NewFakeJiriRoot(t)
 	defer cleanup()
+
 	if _, err := configureDefaultBuildConfig(fake.X, []string{"testpackage"}); err != nil {
 		t.Fatal(err)
 	}
@@ -216,6 +219,9 @@
 }
 
 func configureDefaultBuildConfig(jirix *jiri.X, tags []string) (cleanup func(), err error) {
+	if err := tooldata.SaveConfig(jirix, tooldata.NewConfig()); err != nil {
+		return nil, err
+	}
 	rd, err := profilesreader.NewReader(jirix, profilesreader.SkipProfiles, "")
 	if err != nil {
 		return nil, fmt.Errorf("failed to obtain the Vanadium environment: %v", err)
@@ -236,6 +242,7 @@
 func doTest(t *testing.T, packages []string) (*token.FileSet, map[funcDeclRef]error) {
 	fake, cleanup := jiritest.NewFakeJiriRoot(t)
 	defer cleanup()
+
 	if _, err := configureDefaultBuildConfig(fake.X, []string{"testpackage"}); err != nil {
 		t.Fatal(err)
 	}
diff --git a/internal/golib/go.go b/internal/golib/go.go
index a954aae..27de6f8 100644
--- a/internal/golib/go.go
+++ b/internal/golib/go.go
@@ -33,15 +33,44 @@
 // generated.
 const ExtraLDFlagsFlagDescription = `This tool sets some ldflags automatically, e.g. to set binary metadata.  The extra-ldflags are appended to the end of those automatically generated ldflags.  Note that if your go command line specifies -ldflags explicitly, it will override both the automatically generated ldflags as well as the extra-ldflags.`
 
+var goEnvVars = map[string]bool{
+	"CC":                   true,
+	"CGO_ENABLED":          true,
+	"CXX":                  true,
+	"GOARCH":               true,
+	"GOBIN":                true,
+	"GOEXE":                true,
+	"GOGCCFLAGS":           true,
+	"GOHOSTARCH":           true,
+	"GOHOSTOS":             true,
+	"GOOS":                 true,
+	"GOPATH":               true,
+	"GORACE":               true,
+	"GOROOT":               true,
+	"GOTOOLDIR":            true,
+	"GO15VENDOREXPERIMENT": true,
+}
+
 // PrepareGo runs recommended checks on the environment and related commands
 // before execution of the Go toolchain. The Go toolchain should use the
-// returned args.
+// returned args. PrepareGo for the 'env' strips any enviornment variables
+// that the go command doesn't understand.
 //
 // For example, it ensures that all Go files generated by the VDL compiler are
 // up-to-date. It also generates flags so that build information can be embedded
 // in resulting binaries.
 func PrepareGo(jirix *jiri.X, env map[string]string, args []string, extraLDFlags, installSuffix string) ([]string, error) {
 	switch args[0] {
+	case "env":
+		rargs := []string{"env"}
+		for _, v := range args[1:] {
+			if !goEnvVars[v] {
+				fmt.Fprintf(jirix.Stdout(), "%s\n", env[v])
+			} else {
+				rargs = append(rargs, v)
+			}
+		}
+		return rargs, nil
 	case "build", "install":
 		// Provide default ldflags to populate build info metadata in the
 		// binary. Any manual specification of ldflags already in the args
diff --git a/internal/test/color.go b/internal/test/color.go
new file mode 100644
index 0000000..8be6144
--- /dev/null
+++ b/internal/test/color.go
@@ -0,0 +1,27 @@
+// 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
+
+import "fmt"
+
+type Color int
+
+const (
+	Black Color = iota + 30
+	Red
+	Green
+	Yellow
+	Blue
+	Magenta
+	Cyan
+	White
+
+	start = "\033["
+	reset = "\033[0m"
+)
+
+func ColorString(str string, color Color) string {
+	return fmt.Sprintf("%s0;%dm%s%s", start, color, str, reset)
+}
diff --git a/internal/test/test.go b/internal/test/test.go
index dfef2a1..d8b3241 100644
--- a/internal/test/test.go
+++ b/internal/test/test.go
@@ -9,7 +9,6 @@
 	"time"
 
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 )
 
 // DefaultTimeout identifies the maximum time each test is allowed to
@@ -61,7 +60,7 @@
 func Pass(ctx *tool.Context, format string, a ...interface{}) {
 	strOK := "ok"
 	if ctx.Color() {
-		strOK = util.ColorString("ok", util.Green)
+		strOK = ColorString("ok", Green)
 	}
 	fmt.Fprintf(ctx.Stdout(), "%s   ", strOK)
 	fmt.Fprintf(ctx.Stdout(), format, a...)
@@ -70,7 +69,7 @@
 func Fail(ctx *tool.Context, format string, a ...interface{}) {
 	strFail := "fail"
 	if ctx.Color() {
-		strFail = util.ColorString("fail", util.Red)
+		strFail = ColorString("fail", Red)
 	}
 	fmt.Fprintf(ctx.Stderr(), "%s ", strFail)
 	fmt.Fprintf(ctx.Stderr(), format, a...)
@@ -79,7 +78,7 @@
 func Warn(ctx *tool.Context, format string, a ...interface{}) {
 	strWarn := "warn"
 	if ctx.Color() {
-		strWarn = util.ColorString("warn", util.Yellow)
+		strWarn = ColorString("warn", Yellow)
 	}
 	fmt.Fprintf(ctx.Stderr(), "%s ", strWarn)
 	fmt.Fprintf(ctx.Stderr(), format, a...)
diff --git a/internal/xunit/xunit.go b/internal/xunit/xunit.go
index da248b3..7af943b 100644
--- a/internal/xunit/xunit.go
+++ b/internal/xunit/xunit.go
@@ -17,7 +17,7 @@
 	"time"
 
 	"v.io/jiri"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 )
 
 type TestSuites struct {
@@ -112,7 +112,7 @@
 // it contains test results generated by "go test -v", and returns it
 // as an in-memory data structure.
 func TestSuitesFromGoTestOutput(jirix *jiri.X, testOutput io.Reader) ([]*TestSuite, error) {
-	bin, err := util.ThirdPartyBinPath(jirix, "go2xunit")
+	bin, err := tooldata.ThirdPartyBinPath(jirix, "go2xunit")
 	if err != nil {
 		return nil, err
 	}
diff --git a/jiri-api/api.go b/jiri-api/api.go
index 4e1a4fb..340a65d 100644
--- a/jiri-api/api.go
+++ b/jiri-api/api.go
@@ -26,7 +26,7 @@
 	"v.io/jiri/project"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 	"v.io/x/lib/envvar"
 )
@@ -314,7 +314,7 @@
 }
 
 func doAPICheck(jirix *jiri.X, args []string, detailedOutput bool) error {
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return err
 	}
@@ -345,7 +345,7 @@
 }
 
 func runAPIFix(jirix *jiri.X, args []string) error {
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return err
 	}
diff --git a/jiri-api/api_test.go b/jiri-api/api_test.go
index b6cade1..6a2e8f4 100644
--- a/jiri-api/api_test.go
+++ b/jiri-api/api_test.go
@@ -17,7 +17,7 @@
 	"v.io/jiri/project"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 )
 
 func writeFileOrDie(t *testing.T, jirix *jiri.X, path, contents string) {
@@ -89,8 +89,8 @@
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
 
-	config := util.NewConfig(util.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
@@ -129,8 +129,8 @@
 func TestPublicAPICheckOk(t *testing.T) {
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
-	config := util.NewConfig(util.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
@@ -169,8 +169,8 @@
 func TestPublicAPIMissingAPIFile(t *testing.T) {
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
-	config := util.NewConfig(util.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
@@ -206,8 +206,8 @@
 func TestPublicAPIMissingAPIFileNoPublicAPI(t *testing.T) {
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
-	config := util.NewConfig(util.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
@@ -242,8 +242,8 @@
 func TestPublicAPIMissingAPIFileNotRequired(t *testing.T) {
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
-	config := util.NewConfig(util.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.APICheckProjectsOpt(map[string]struct{}{"test": struct{}{}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
@@ -281,7 +281,7 @@
 func TestPublicAPIUpdate(t *testing.T) {
 	fake, cleanup := setupAPITest(t)
 	defer cleanup()
-	if err := util.SaveConfig(fake.X, util.NewConfig()); err != nil {
+	if err := tooldata.SaveConfig(fake.X, tooldata.NewConfig()); err != nil {
 		t.Fatalf("%v", err)
 	}
 	branch := "my-branch"
diff --git a/jiri-api/doc.go b/jiri-api/doc.go
index 1007005..7be4cc6 100644
--- a/jiri-api/doc.go
+++ b/jiri-api/doc.go
@@ -29,7 +29,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -72,7 +72,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -105,7 +105,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-copyright/copyright.go b/jiri-copyright/copyright.go
index cb71550..35ecc21 100644
--- a/jiri-copyright/copyright.go
+++ b/jiri-copyright/copyright.go
@@ -30,7 +30,7 @@
 	"v.io/jiri/project"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 )
 
@@ -162,7 +162,7 @@
 
 // copyrightHelper implements the logic of "jiri copyright {check,fix}".
 func copyrightHelper(jirix *jiri.X, args []string, fix bool) error {
-	dataDir, err := project.DataDirPath(jirix, "jiri")
+	dataDir, err := tooldata.DataDirPath(jirix, "jiri")
 	if err != nil {
 		return err
 	}
@@ -170,7 +170,7 @@
 	if err != nil {
 		return err
 	}
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return err
 	}
diff --git a/jiri-copyright/copyright_test.go b/jiri-copyright/copyright_test.go
index a9a0bbf..d5e60e5 100644
--- a/jiri-copyright/copyright_test.go
+++ b/jiri-copyright/copyright_test.go
@@ -29,7 +29,7 @@
 	})
 
 	// Load assets.
-	assets, err := loadAssets(fake.X, filepath.Join("..", "data"))
+	assets, err := loadAssets(fake.X, filepath.Join("..", "tooldata", "data"))
 	if err != nil {
 		t.Fatalf("%v", err)
 	}
diff --git a/jiri-dockergo/doc.go b/jiri-dockergo/doc.go
index 8a88f3e..51dafc5 100644
--- a/jiri-dockergo/doc.go
+++ b/jiri-dockergo/doc.go
@@ -49,7 +49,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-dockergo/go.go b/jiri-dockergo/go.go
index 96d4203..8d30948 100644
--- a/jiri-dockergo/go.go
+++ b/jiri-dockergo/go.go
@@ -20,6 +20,7 @@
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
 	"v.io/x/devtools/internal/golib"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 	"v.io/x/lib/lookpath"
 )
@@ -84,15 +85,24 @@
 	if len(args) == 0 {
 		return jirix.UsageErrorf("not enough arguments")
 	}
+	config, err := tooldata.LoadConfig(jirix)
+	if err != nil {
+		return err
+	}
 	rd, err := profilesreader.NewReader(jirix, readerFlags.ProfilesMode, readerFlags.DBFilename)
 	if err != nil {
 		return err
 	}
-	profileNames := profilesreader.InitProfilesFromFlag(readerFlags.Profiles, profilesreader.DoNotAppendJiriProfile)
+	profileNames := strings.Split(readerFlags.Profiles, ",")
 	if err := rd.ValidateRequestedProfilesAndTarget(profileNames, readerFlags.Target); err != nil {
 		return err
 	}
 	rd.MergeEnvFromProfiles(readerFlags.MergePolicies, readerFlags.Target, "jiri")
+	mp := profilesreader.MergePolicies{
+		"GOPATH":  profilesreader.PrependPath,
+		"VDLPATH": profilesreader.PrependPath,
+	}
+	profilesreader.MergeEnv(mp, rd.Vars, []string{config.GoPath(jirix), config.VDLPath(jirix)})
 	if jirix.Verbose() {
 		fmt.Fprintf(jirix.Stdout(), "Merged profiles: %v\n", readerFlags.Profiles)
 		fmt.Fprintf(jirix.Stdout(), "Merge policies: %v\n", readerFlags.MergePolicies)
@@ -122,6 +132,9 @@
 	if args, err = golib.PrepareGo(jirix, envMap, args, extraLDFlags, installSuffix); err != nil {
 		return err
 	}
+	if len(args) == 1 && args[0] == "env" {
+		return nil
+	}
 	if jirix.Verbose() {
 		fmt.Fprintf(jirix.Stderr(), "Using docker image: %q\n", img)
 	}
diff --git a/jiri-go/doc.go b/jiri-go/doc.go
index 887ec39..57126aa 100644
--- a/jiri-go/doc.go
+++ b/jiri-go/doc.go
@@ -23,7 +23,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-go/go.go b/jiri-go/go.go
index d207461..bfceb0d 100644
--- a/jiri-go/go.go
+++ b/jiri-go/go.go
@@ -19,6 +19,7 @@
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
 	"v.io/x/devtools/internal/golib"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 	"v.io/x/lib/lookpath"
 )
@@ -57,15 +58,24 @@
 	if len(args) == 0 {
 		return jirix.UsageErrorf("not enough arguments")
 	}
+	config, err := tooldata.LoadConfig(jirix)
+	if err != nil {
+		return err
+	}
 	rd, err := profilesreader.NewReader(jirix, readerFlags.ProfilesMode, readerFlags.DBFilename)
 	if err != nil {
 		return err
 	}
-	profileNames := profilesreader.InitProfilesFromFlag(readerFlags.Profiles, profilesreader.AppendJiriProfile)
+	profileNames := strings.Split(readerFlags.Profiles, ",")
 	if err := rd.ValidateRequestedProfilesAndTarget(profileNames, readerFlags.Target); err != nil {
 		return err
 	}
 	rd.MergeEnvFromProfiles(readerFlags.MergePolicies, readerFlags.Target, profileNames...)
+	mp := profilesreader.MergePolicies{
+		"GOPATH":  profilesreader.PrependPath,
+		"VDLPATH": profilesreader.PrependPath,
+	}
+	profilesreader.MergeEnv(mp, rd.Vars, []string{config.GoPath(jirix), config.VDLPath(jirix)})
 	if !systemGoFlag {
 		if len(rd.Get("GOROOT")) > 0 {
 			rd.PrependToPATH(filepath.Join(rd.Get("GOROOT"), "bin"))
@@ -84,6 +94,11 @@
 	if args, err = golib.PrepareGo(jirix, envMap, args, extraLDFlags, installSuffix); err != nil {
 		return err
 	}
+	// Don't run go env if PrepareGo stripped off the environment
+	// variables that the go tool doesn't understand - e.g. VDLPATH.
+	if len(args) == 1 && args[0] == "env" {
+		return nil
+	}
 	// Run the go tool.
 	goBin, err := lookpath.Look(envMap, "go")
 	if err != nil {
diff --git a/jiri-go/go_test.go b/jiri-go/go_test.go
index 06b9c7f..422e96d 100644
--- a/jiri-go/go_test.go
+++ b/jiri-go/go_test.go
@@ -16,8 +16,8 @@
 	"v.io/jiri/profiles/profilesreader"
 	"v.io/jiri/project"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/buildinfo"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/metadata"
 )
 
@@ -57,8 +57,8 @@
 	if err := fake.UpdateUniverse(false); err != nil {
 		t.Fatal(err)
 	}
-	config := util.NewConfig(util.GoWorkspacesOpt([]string{"test"}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.GoWorkspacesOpt([]string{"test"}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatal(err)
 	}
 
@@ -78,6 +78,9 @@
 	defer cleanup()
 	jirix := fake.X
 	start := time.Now().UTC()
+	if err := tooldata.SaveConfig(jirix, tooldata.NewConfig()); err != nil {
+		t.Fatal(err)
+	}
 	s := jirix.NewSeq()
 	// Set up a temp directory.
 	dir, err := s.TempDir("", "v23_metadata_test")
diff --git a/jiri-goext/doc.go b/jiri-goext/doc.go
index 8bafa9f..88d9ef8 100644
--- a/jiri-goext/doc.go
+++ b/jiri-goext/doc.go
@@ -22,7 +22,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -59,7 +59,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-oncall/oncall.go b/jiri-oncall/oncall.go
index ebc98cb..d417479 100644
--- a/jiri-oncall/oncall.go
+++ b/jiri-oncall/oncall.go
@@ -13,7 +13,7 @@
 
 	"v.io/jiri"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 )
 
@@ -42,7 +42,7 @@
 }
 
 func runOncall(jirix *jiri.X, _ []string) error {
-	shift, err := util.Oncall(jirix, time.Now())
+	shift, err := tooldata.Oncall(jirix, time.Now())
 	if err != nil {
 		return err
 	}
@@ -51,7 +51,7 @@
 }
 
 func runOncallList(jirix *jiri.X, _ []string) error {
-	rotation, err := util.LoadOncallRotation(jirix)
+	rotation, err := tooldata.LoadOncallRotation(jirix)
 	if err != nil {
 		return err
 	}
diff --git a/jiri-profile-v23/go_profile/go.go b/jiri-profile-v23/go_profile/go.go
index 2c8b69a..6f2bc8e 100644
--- a/jiri-profile-v23/go_profile/go.go
+++ b/jiri-profile-v23/go_profile/go.go
@@ -22,7 +22,7 @@
 	"v.io/jiri/profiles"
 	"v.io/jiri/profiles/profilesmanager"
 	"v.io/jiri/profiles/profilesutil"
-	"v.io/jiri/project"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/envvar"
 )
 
@@ -466,7 +466,7 @@
 		if err := s.Chdir(tmpDir).Last(bin, targetABI); err != nil {
 			return err
 		}
-		dataPath, err := project.DataDirPath(jirix, "")
+		dataPath, err := tooldata.DataDirPath(jirix, "")
 		if err != nil {
 			return err
 		}
diff --git a/jiri-profile-v23/java_profile/java.go b/jiri-profile-v23/java_profile/java.go
index 487e1ad..c0511c3 100644
--- a/jiri-profile-v23/java_profile/java.go
+++ b/jiri-profile-v23/java_profile/java.go
@@ -176,7 +176,7 @@
 		jirix.NewSeq().Last("xdg-open", dlURL)
 		return "", fmt.Errorf("Please follow the instructions in the browser to install JDK, then set JAVA_HOME and re-run the profile installation command")
 	default:
-		return "", fmt.Errorf("OS %q is not supported", target.OS)
+		return "", fmt.Errorf("OS %q is not supported", target.OS())
 	}
 }
 
diff --git a/jiri-run/doc.go b/jiri-run/doc.go
index d03219a..a3aed7f 100644
--- a/jiri-run/doc.go
+++ b/jiri-run/doc.go
@@ -21,7 +21,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-run/run.go b/jiri-run/run.go
index 353efbb..bf3f4b2 100644
--- a/jiri-run/run.go
+++ b/jiri-run/run.go
@@ -17,6 +17,7 @@
 	"v.io/jiri/profiles/profilesreader"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 )
 
@@ -51,15 +52,24 @@
 	if len(args) == 0 {
 		return jirix.UsageErrorf("no command to run")
 	}
+	config, err := tooldata.LoadConfig(jirix)
+	if err != nil {
+		return err
+	}
 	rd, err := profilesreader.NewReader(jirix, readerFlags.ProfilesMode, readerFlags.DBFilename)
 	if err != nil {
 		return err
 	}
-	profileNames := profilesreader.InitProfilesFromFlag(readerFlags.Profiles, profilesreader.DoNotAppendJiriProfile)
+	profileNames := strings.Split(readerFlags.Profiles, ",")
 	if err := rd.ValidateRequestedProfilesAndTarget(profileNames, readerFlags.Target); err != nil {
 		return err
 	}
 	rd.MergeEnvFromProfiles(readerFlags.MergePolicies, readerFlags.Target, profileNames...)
+	mp := profilesreader.MergePolicies{
+		"GOPATH":  profilesreader.PrependPath,
+		"VDLPATH": profilesreader.PrependPath,
+	}
+	profilesreader.MergeEnv(mp, rd.Vars, []string{config.GoPath(jirix), config.VDLPath(jirix)})
 	if envFlag {
 		fmt.Fprintf(jirix.Stdout(), "Merged profiles: %v\n", profileNames)
 		fmt.Fprintf(jirix.Stdout(), "Merge policies: %v\n", readerFlags.MergePolicies)
diff --git a/jiri-test/doc.go b/jiri-test/doc.go
index d83368b..d815d62 100644
--- a/jiri-test/doc.go
+++ b/jiri-test/doc.go
@@ -25,7 +25,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -63,7 +63,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -93,7 +93,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -146,7 +146,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -171,7 +171,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/jiri-test/internal/test/cobertura.go b/jiri-test/internal/test/cobertura.go
index 40cb7e7..7477a9c 100644
--- a/jiri-test/internal/test/cobertura.go
+++ b/jiri-test/internal/test/cobertura.go
@@ -15,7 +15,7 @@
 	"v.io/jiri"
 	"v.io/jiri/profiles"
 	"v.io/jiri/profiles/profilesreader"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 )
 
 type testCoverage struct {
@@ -72,7 +72,7 @@
 // it contains the coverage information generated by "go test -cover",
 // and returns it as an in-memory data structure.
 func coverageFromGoTestOutput(jirix *jiri.X, testOutput io.Reader) (*testCoverage, error) {
-	bin, err := util.ThirdPartyBinPath(jirix, "gocover-cobertura")
+	bin, err := tooldata.ThirdPartyBinPath(jirix, "gocover-cobertura")
 	if err != nil {
 		return nil, err
 	}
diff --git a/jiri-test/internal/test/go.go b/jiri-test/internal/test/go.go
index f2c3041..c41ff2e 100644
--- a/jiri-test/internal/test/go.go
+++ b/jiri-test/internal/test/go.go
@@ -36,10 +36,10 @@
 	"v.io/jiri/project"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/goutil"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/devtools/vbinary/exitcode"
 	"v.io/x/lib/host"
 	"v.io/x/lib/set"
@@ -480,11 +480,17 @@
 func goListPackagesAndFuncs(jirix *jiri.X, opts []Opt, pkgs []string, matcher funcMatcher) ([]string, map[string][]string, error) {
 	fmt.Fprintf(jirix.Stdout(), "listing test packages and functions ... ")
 
+	config, err := tooldata.LoadConfig(jirix)
+	if err != nil {
+		return nil, nil, err
+	}
 	rd, err := profilesreader.NewReader(jirix, profilesreader.UseProfiles, ProfilesDBFilename)
 	if err != nil {
 		return nil, nil, err
 	}
-	rd.MergeEnvFromProfiles(profilesreader.JiriMergePolicies(), profiles.NativeTarget(), "jiri")
+
+	rd.MergeEnvFromProfiles(profilesreader.JiriMergePolicies(), profiles.NativeTarget())
+	profilesreader.MergeEnv(profilesreader.JiriMergePolicies(), rd.Vars, []string{config.GoPath(jirix), config.VDLPath(jirix)})
 	pkgList, err := goutil.List(jirix, goListOpts(opts), pkgs...)
 	if err != nil {
 		fmt.Fprintf(jirix.Stdout(), "failed\n%s\n", err.Error())
@@ -1607,7 +1613,7 @@
 //   in the first N-1 parts.
 func identifyPackagesToTest(jirix *jiri.X, testName string, opts []Opt, allPkgs []string) (pkgsOpt, error) {
 	// Read config file to get the part.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return nil, err
 	}
diff --git a/jiri-test/internal/test/go_test.go b/jiri-test/internal/test/go_test.go
index 158f3ca..6c5aa75 100644
--- a/jiri-test/internal/test/go_test.go
+++ b/jiri-test/internal/test/go_test.go
@@ -21,6 +21,7 @@
 	"v.io/jiri/tool"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 )
 
 // failuresMatch checks whether the given test failures match. The Message
@@ -382,6 +383,10 @@
 	fake, cleanupFake := jiritest.NewFakeJiriRoot(t)
 	defer cleanupFake()
 
+	if err := tooldata.SaveConfig(fake.X, tooldata.NewConfig()); err != nil {
+		t.Fatal(err)
+	}
+
 	testName := "test-go-build"
 	cleanupTest, err := initTestImpl(fake.X, false, false, false, testName, nil, "")
 	if err != nil {
diff --git a/jiri-test/internal/test/release.go b/jiri-test/internal/test/release.go
index dd2b6e9..1e0c30d 100644
--- a/jiri-test/internal/test/release.go
+++ b/jiri-test/internal/test/release.go
@@ -18,8 +18,8 @@
 	"v.io/jiri/collect"
 	"v.io/jiri/retry"
 	"v.io/jiri/runutil"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/devtools/tooldata"
 )
 
 const (
@@ -536,7 +536,7 @@
 	relativePath := strings.TrimPrefix(target, manifestDir+string(filepath.Separator))
 
 	// Get all the tests to run.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return nil, newInternalError(err, "LoadConfig")
 	}
diff --git a/jiri-test/internal/test/run.go b/jiri-test/internal/test/run.go
index 449cff4..a211661 100644
--- a/jiri-test/internal/test/run.go
+++ b/jiri-test/internal/test/run.go
@@ -22,9 +22,9 @@
 	"v.io/jiri/profiles/profilesreader"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 )
 
 const (
@@ -237,7 +237,7 @@
 	testCtx := newTestContext(jirix, env)
 
 	// Parse tests and dependencies from config file.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return nil, err
 	}
@@ -528,7 +528,7 @@
 
 // createTestDepGraph creates a test dependency graph given a map of
 // dependencies and a list of tests.
-func createTestDepGraph(config *util.Config, tests []string) (testDepGraph, error) {
+func createTestDepGraph(config *tooldata.Config, tests []string) (testDepGraph, error) {
 	// For the given list of tests, build a map from the test name
 	// to its testInfo object using the dependency data extracted
 	// from the given dependency config data "dep".
diff --git a/jiri-test/internal/test/run_test.go b/jiri-test/internal/test/run_test.go
index fa4555b..5bd1777 100644
--- a/jiri-test/internal/test/run_test.go
+++ b/jiri-test/internal/test/run_test.go
@@ -13,13 +13,13 @@
 	"testing"
 
 	"v.io/jiri/jiritest"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 )
 
 func TestProjectTests(t *testing.T) {
-	config := util.NewConfig(util.ProjectTestsOpt(map[string][]string{
+	config := tooldata.NewConfig(tooldata.ProjectTestsOpt(map[string][]string{
 		"vanadium": []string{"vanadium-go-build", "vanadium-go-test"},
 		"default":  []string{"tools-go-build", "tools-go-test"},
 	}))
@@ -209,7 +209,7 @@
 
 func TestCreateDepGraph(t *testing.T) {
 	type testCase struct {
-		config        *util.Config
+		config        *tooldata.Config
 		tests         []string
 		expectedTests testDepGraph
 		expectDepLoop bool
@@ -217,7 +217,7 @@
 	testCases := []testCase{
 		// A single test without any dependencies.
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{"A": []string{}})),
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{"A": []string{}})),
 			tests:  []string{"A"},
 			expectedTests: testDepGraph{
 				"A": &testNode{
@@ -228,7 +228,7 @@
 		},
 		// A -> B
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{"A": []string{"B"}})),
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{"A": []string{"B"}})),
 			tests:  []string{"A", "B"},
 			expectedTests: testDepGraph{
 				"A": &testNode{
@@ -243,7 +243,7 @@
 		},
 		// A -> {B, C, D}
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{"A": []string{"B", "C", "D"}})),
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{"A": []string{"B", "C", "D"}})),
 			tests:  []string{"A", "B", "C", "D"},
 			expectedTests: testDepGraph{
 				"A": &testNode{
@@ -266,7 +266,7 @@
 		},
 		// Same as above, but "dep" has no data.
 		testCase{
-			config: util.NewConfig(),
+			config: tooldata.NewConfig(),
 			tests:  []string{"A", "B", "C", "D"},
 			expectedTests: testDepGraph{
 				"A": &testNode{
@@ -289,7 +289,7 @@
 		},
 		// A -> {B, C, D}, but A is the only given test to resolve dependency for.
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{"A": []string{"B", "C", "D"}})),
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{"A": []string{"B", "C", "D"}})),
 			tests:  []string{"A"},
 			expectedTests: testDepGraph{
 				"A": &testNode{
@@ -300,7 +300,7 @@
 		},
 		// A -> {B, C, D} -> E
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{
 				"A": []string{"B", "C", "D"},
 				"B": []string{"E"},
 				"C": []string{"E"},
@@ -334,7 +334,7 @@
 		// A -> B
 		// B -> C, C -> B
 		testCase{
-			config: util.NewConfig(util.TestDependenciesOpt(map[string][]string{
+			config: tooldata.NewConfig(tooldata.TestDependenciesOpt(map[string][]string{
 				"A": []string{"B"},
 				"B": []string{"C"},
 				"C": []string{"B"},
diff --git a/jiri-test/internal/test/vdl.go b/jiri-test/internal/test/vdl.go
index 8c9069f..81131a7 100644
--- a/jiri-test/internal/test/vdl.go
+++ b/jiri-test/internal/test/vdl.go
@@ -16,6 +16,7 @@
 	"v.io/jiri/profiles/profilesreader"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 )
 
 // vanadiumGoVDL checks that all VDL-based Go source files are
@@ -35,12 +36,18 @@
 		return nil, newInternalError(err, "Install VDL")
 	}
 
+	config, err := tooldata.LoadConfig(jirix)
+	if err != nil {
+		return nil, err
+	}
+
 	// Check that "vdl audit --lang=go all" produces no output.
 	rd, err := profilesreader.NewReader(jirix, profilesreader.UseProfiles, ProfilesDBFilename)
 	if err != nil {
 		return nil, err
 	}
 	rd.MergeEnvFromProfiles(profilesreader.JiriMergePolicies(), profiles.NativeTarget(), "jiri")
+	profilesreader.MergeEnv(profilesreader.JiriMergePolicies(), rd.Vars, []string{config.GoPath(jirix), config.VDLPath(jirix)})
 	env := rd.ToMap()
 	env["VDLROOT"] = filepath.Join(jirix.Root, "release", "go", "src", "v.io", "v23", "vdlroot")
 	vdl := filepath.Join(jirix.Root, "release", "go", "bin", "vdl")
diff --git a/jiri-test/test_test.go b/jiri-test/test_test.go
index 046e72e..fa98397 100644
--- a/jiri-test/test_test.go
+++ b/jiri-test/test_test.go
@@ -12,8 +12,8 @@
 
 	"v.io/jiri/jiritest"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/jiri-test/internal/test"
+	"v.io/x/devtools/tooldata"
 )
 
 func TestTestProject(t *testing.T) {
@@ -28,8 +28,8 @@
 	defer os.Setenv("WORKSPACE", oldWorkspace)
 
 	// Setup a fake config.
-	config := util.NewConfig(util.ProjectTestsOpt(map[string][]string{"https://test-project": []string{"ignore-this"}}))
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	config := tooldata.NewConfig(tooldata.ProjectTestsOpt(map[string][]string{"https://test-project": []string{"ignore-this"}}))
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 
diff --git a/jiridoc/doc.go b/jiridoc/doc.go
index 4d5a3fe..6234205 100644
--- a/jiridoc/doc.go
+++ b/jiridoc/doc.go
@@ -13,7 +13,6 @@
 
 The jiri commands are:
    cl           Manage project changelists
-   contributors List project contributors
    import       Adds imports to .jiri_manifest file
    profile      Display information about installed profiles
    project      Manage the jiri projects
@@ -25,6 +24,7 @@
    help         Display help for commands or topics
 The jiri external commands are:
    api          Manage vanadium public API
+   contributors List project contributors
    copyright    Manage vanadium copyright
    dockergo     Execute the go command in a docker container
    go           Execute the go tool using the vanadium environment
@@ -187,28 +187,6 @@
  -v=false
    Print verbose output.
 
-Jiri contributors - List project contributors
-
-Lists project contributors. Projects to consider can be specified as an
-argument. If no projects are specified, all projects in the current manifest are
-considered by default.
-
-Usage:
-   jiri contributors [flags] <projects>
-
-<projects> is a list of projects to consider.
-
-The jiri contributors flags are:
- -aliases=
-   Path to the aliases file.
- -n=false
-   Show number of contributions.
-
- -color=true
-   Use color to format output.
- -v=false
-   Print verbose output.
-
 Jiri import
 
 Command "import" adds imports to the $JIRI_ROOT/.jiri_manifest file, which
@@ -310,7 +288,7 @@
    	Note: if no profiles are specified then the requested field will be displayed for all profiles.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -328,7 +306,7 @@
 
 List profile specific and target specific environment variables. If the
 requested environment variable name ends in = then only the value will be
-printed, otherwise both name and value are printed, i.e. GOPATH="foo" vs just
+printed, otherwise both name and value are printed, i.e. CFLAGS="foo" vs just
 "foo".
 
 If no environment variable names are requested then all will be printed in
@@ -345,7 +323,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -487,7 +465,6 @@
                 branches
    list         List existing jiri projects and branches
    shell-prompt Print a succinct status of projects suitable for shell prompts
-   poll         Poll existing jiri projects
 
 The jiri project flags are:
  -color=true
@@ -586,26 +563,6 @@
  -v=false
    Print verbose output.
 
-Jiri project poll - Poll existing jiri projects
-
-Poll jiri projects that can affect the outcome of the given tests and report
-whether any new changes in these projects exist. If no tests are specified, all
-projects are polled by default.
-
-Usage:
-   jiri project poll [flags] <test ...>
-
-<test ...> is a list of tests that determine what projects to poll.
-
-The jiri project poll flags are:
- -manifest=
-   Name of the project manifest.
-
- -color=true
-   Use color to format output.
- -v=false
-   Print verbose output.
-
 Jiri rebuild - Rebuild all jiri tools
 
 Rebuilds all jiri tools and installs the resulting binaries into
@@ -824,7 +781,7 @@
    -show-key-prefix or -collate-stdout.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -905,7 +862,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -942,7 +899,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -975,7 +932,7 @@
    Name of the project manifest.
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -986,6 +943,33 @@
  -v=false
    Print verbose output.
 
+Jiri contributors - List project contributors
+
+List project contributors.
+
+Usage:
+   jiri contributors [flags] <command>
+
+The jiri contributors commands are:
+   contributors List project contributors
+
+Jiri contributors contributors - List project contributors
+
+Lists project contributors. Projects to consider can be specified as an
+argument. If no projects are specified, all projects in the current manifest are
+considered by default.
+
+Usage:
+   jiri contributors contributors [flags] <projects>
+
+<projects> is a list of projects to consider.
+
+The jiri contributors contributors flags are:
+ -aliases=
+   Path to the aliases file.
+ -n=false
+   Show number of contributions.
+
 Jiri copyright - Manage vanadium copyright
 
 This command can be used to check if all source code files of Vanadium projects
@@ -1092,7 +1076,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1122,7 +1106,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1150,7 +1134,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1180,7 +1164,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1452,7 +1436,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1553,7 +1537,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1585,7 +1569,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1615,7 +1599,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1668,7 +1652,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
@@ -1693,7 +1677,7 @@
    specify an environment variable in the form: <var>=[<val>],...
  -merge-policies=+CCFLAGS,+CGO_CFLAGS,+CGO_CXXFLAGS,+CGO_LDFLAGS,+CXXFLAGS,GOARCH,GOOS,GOPATH:,^GOROOT*,+LDFLAGS,:PATH,VDLPATH:
    specify policies for merging environment variables
- -profiles=v23:base,jiri
+ -profiles=v23:base
    a comma separated list of profiles to use
  -profiles-db=$JIRI_ROOT/.jiri_root/profile_db
    the path, relative to JIRI_ROOT, that contains the profiles database.
diff --git a/postsubmit/cmd.go b/postsubmit/cmd.go
index 51aba9b..ad19bf5 100644
--- a/postsubmit/cmd.go
+++ b/postsubmit/cmd.go
@@ -15,8 +15,8 @@
 	"v.io/jiri/gitutil"
 	"v.io/jiri/project"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 )
 
@@ -112,7 +112,7 @@
 // started based on the given projects.
 func jenkinsTestsToStart(jirix *jiri.X, projects []string) ([]string, error) {
 	// Parse tools config to get project-tests map.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return nil, err
 	}
diff --git a/postsubmit/cmd_test.go b/postsubmit/cmd_test.go
index df5cc41..407620a 100644
--- a/postsubmit/cmd_test.go
+++ b/postsubmit/cmd_test.go
@@ -9,7 +9,7 @@
 	"testing"
 
 	"v.io/jiri/jiritest"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 )
 
 func TestJenkinsTestsToStart(t *testing.T) {
@@ -17,17 +17,17 @@
 	defer cleanup()
 
 	// Create a fake configuration file.
-	config := util.NewConfig(
-		util.ProjectTestsOpt(map[string][]string{
+	config := tooldata.NewConfig(
+		tooldata.ProjectTestsOpt(map[string][]string{
 			"release.go.core": []string{"go", "javascript"},
 			"release.js.core": []string{"javascript"},
 		}),
-		util.TestGroupsOpt(map[string][]string{
+		tooldata.TestGroupsOpt(map[string][]string{
 			"go":         []string{"vanadium-go-build", "vanadium-go-test", "vanadium-go-race"},
 			"javascript": []string{"vanadium-js-integration", "vanadium-js-unit"},
 		}),
 	)
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 
diff --git a/presubmit/query.go b/presubmit/query.go
index f662481..6477014 100644
--- a/presubmit/query.go
+++ b/presubmit/query.go
@@ -21,7 +21,7 @@
 	"v.io/jiri/project"
 	"v.io/jiri/runutil"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 )
 
@@ -136,7 +136,7 @@
 	}()
 
 	// Load Jenkins matrix jobs config.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return err
 	}
@@ -478,7 +478,7 @@
 }
 
 func (s *clsSender) getTestsToRun(jirix *jiri.X, projects []string) ([]string, error) {
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return nil, err
 	}
diff --git a/presubmit/query_test.go b/presubmit/query_test.go
index fd2d303..6772770 100644
--- a/presubmit/query_test.go
+++ b/presubmit/query_test.go
@@ -15,7 +15,7 @@
 	"v.io/jiri/jiritest"
 	"v.io/jiri/project"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
+	"v.io/x/devtools/tooldata"
 )
 
 func TestMultiPartCLSet(t *testing.T) {
@@ -227,15 +227,15 @@
 	defer cleanup()
 
 	// Create a fake configuration file.
-	config := util.NewConfig(
-		util.ProjectTestsOpt(map[string][]string{
+	config := tooldata.NewConfig(
+		tooldata.ProjectTestsOpt(map[string][]string{
 			"release.go.core": []string{"go", "javascript"},
 		}),
-		util.ProjectTestsOpt(map[string][]string{
+		tooldata.ProjectTestsOpt(map[string][]string{
 			"release.js.core": []string{"javascript"},
 		}),
 	)
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 
@@ -331,18 +331,18 @@
 	defer cleanup()
 
 	// Create a fake configuration file.
-	config := util.NewConfig(
-		util.ProjectTestsOpt(map[string][]string{
+	config := tooldata.NewConfig(
+		tooldata.ProjectTestsOpt(map[string][]string{
 			"release.go.core": []string{"go", "javascript"},
 		}),
-		util.TestGroupsOpt(map[string][]string{
+		tooldata.TestGroupsOpt(map[string][]string{
 			"go": []string{"vanadium-go-build", "vanadium-go-test", "vanadium-go-race"},
 		}),
-		util.TestPartsOpt(map[string][]string{
+		tooldata.TestPartsOpt(map[string][]string{
 			"vanadium-go-race": []string{"v.io/x/ref/services/device/...", "v.io/x/ref/runtime/..."},
 		}),
 	)
-	if err := util.SaveConfig(fake.X, config); err != nil {
+	if err := tooldata.SaveConfig(fake.X, config); err != nil {
 		t.Fatalf("%v", err)
 	}
 
diff --git a/presubmit/result.go b/presubmit/result.go
index 114aa84..eeda2b3 100644
--- a/presubmit/result.go
+++ b/presubmit/result.go
@@ -22,9 +22,9 @@
 	"v.io/jiri"
 	"v.io/jiri/jenkins"
 	"v.io/jiri/tool"
-	"v.io/jiri/util"
 	"v.io/x/devtools/internal/test"
 	"v.io/x/devtools/internal/xunit"
+	"v.io/x/devtools/tooldata"
 	"v.io/x/lib/cmdline"
 	"v.io/x/lib/set"
 )
@@ -121,7 +121,7 @@
 //
 // If the main job is not a multi-configuration job, the spec will be:
 // <jobName>/<suffix>.
-func genBuildSpec(jobName string, axisValues axisValuesInfo, suffix string, matrixJobsConf map[string]util.JenkinsMatrixJobInfo) string {
+func genBuildSpec(jobName string, axisValues axisValuesInfo, suffix string, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) string {
 	axis, ok := matrixJobsConf[jobName]
 
 	// Not a multi-configuration job.
@@ -146,7 +146,7 @@
 
 // genSubJobLabel returns a descriptive label for given Jenkins job's sub-job.
 // For more info, please see comments of the subJobSpec method above.
-func genSubJobLabel(jobName string, axisValues axisValuesInfo, matrixJobsConf map[string]util.JenkinsMatrixJobInfo) string {
+func genSubJobLabel(jobName string, axisValues axisValuesInfo, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) string {
 	axis, ok := matrixJobsConf[jobName]
 
 	// Not a multi-configuration job.
@@ -205,7 +205,7 @@
 // collect all those files and store them in the above directory structure.
 func runResult(jirix *jiri.X, args []string) (e error) {
 	// Load Jenkins matrix jobs config.
-	config, err := util.LoadConfig(jirix)
+	config, err := tooldata.LoadConfig(jirix)
 	if err != nil {
 		return err
 	}
@@ -260,7 +260,7 @@
 // getPostSubmitBuildData returns a map from job names to the data of the
 // corresponding postsubmit builds that ran before the recorded test result
 // timestamps.
-func getPostSubmitBuildData(jirix *jiri.X, testResults []testResultInfo, matrixJobsConf map[string]util.JenkinsMatrixJobInfo) (map[string]*postSubmitBuildData, error) {
+func getPostSubmitBuildData(jirix *jiri.X, testResults []testResultInfo, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) (map[string]*postSubmitBuildData, error) {
 	jenkinsObj, err := jirix.Jenkins(jenkinsHostFlag)
 	if err != nil {
 		return nil, err
@@ -311,7 +311,7 @@
 
 type testReporter struct {
 	// matrixJobsConf stores configs for Jenkins matrix jobs.
-	matrixJobsConf map[string]util.JenkinsMatrixJobInfo
+	matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo
 	// testResults stores presubmit results to report.
 	testResults []testResultInfo
 	// postSubmitResults stores postsubmit results (indexed by test names) used to
@@ -419,7 +419,7 @@
 
 // reportOncall reports current vanadium oncall.
 func (r *testReporter) reportOncall(jirix *jiri.X) {
-	shift, err := util.Oncall(jirix, time.Now())
+	shift, err := tooldata.Oncall(jirix, time.Now())
 	if err != nil {
 		fmt.Fprintf(jirix.Stderr(), "%v\n", err)
 	} else {
@@ -543,7 +543,7 @@
 
 // lastCompletedBuildStatus gets the status of the last completed
 // build for a given Jenkins job.
-func lastCompletedBuildStatus(jirix *jiri.X, jobName string, axisValues axisValuesInfo, matrixJobsConf map[string]util.JenkinsMatrixJobInfo) (*jenkins.BuildInfo, error) {
+func lastCompletedBuildStatus(jirix *jiri.X, jobName string, axisValues axisValuesInfo, matrixJobsConf map[string]tooldata.JenkinsMatrixJobInfo) (*jenkins.BuildInfo, error) {
 	jenkins, err := jirix.Jenkins(jenkinsHostFlag)
 	if err != nil {
 		return nil, err
diff --git a/tooldata/data/config.v1.xml b/tooldata/data/config.v1.xml
index 50ace3b..5d4b531 100644
--- a/tooldata/data/config.v1.xml
+++ b/tooldata/data/config.v1.xml
@@ -38,7 +38,6 @@
   <goWorkspaces>
     <workspace>infrastructure/go</workspace>
     <workspace>release/go</workspace>
-    <workspace>release/javascript/core/go</workspace>
     <workspace>release/projects/physical-lock/go</workspace>
     <workspace>release/projects/sensorlog/go</workspace>
     <workspace>roadmap/go</workspace>
@@ -48,9 +47,7 @@
     <job arch="false" OS="true" parts="false" showOS="true">third_party-go-build</job>
     <job arch="false" OS="true" parts="false" showOS="true">third_party-go-test</job>
     <job arch="false" OS="true" parts="true"  showOS="false">third_party-go-race</job>
-    <!-- TODO(spetrovic): this is flaky due to profile issues.  Re-enable after fixing.
     <job arch="false" OS="true" parts="false" showOS="true">vanadium-android-build</job>
-    -->
     <job arch="false" OS="true" parts="false" showOS="false">vanadium-bootstrap</job>
     <job arch="true"  OS="true" parts="false" showOS="true">vanadium-go-build</job>
     <job arch="true"  OS="true" parts="false" showOS="true">vanadium-go-test</job>
@@ -66,7 +63,6 @@
     <project name="release.go.jiri">
       <test>go</test>
       <test>java</test>
-      <test>javascript</test>
       <test>projects</test>
       <test>vanadium-bootstrap</test>
       <test>vanadium-copyright</test>
@@ -74,7 +70,6 @@
     <project name="release.go.v23">
       <test>go</test>
       <test>java</test>
-      <test>javascript</test>
       <test>mojo</test>
       <test>projects</test>
       <test>vanadium-bootstrap</test>
@@ -83,7 +78,6 @@
     <project name="release.go.x.devtools">
       <test>go</test>
       <test>java</test>
-      <test>javascript</test>
       <test>mojo</test>
       <test>projects</test>
       <test>third_party-go</test>
@@ -97,7 +91,6 @@
     <project name="release.go.x.lib">
       <test>go</test>
       <test>java</test>
-      <test>javascript</test>
       <test>mojo</test>
       <test>projects</test>
       <test>vanadium-bootstrap</test>
@@ -106,7 +99,6 @@
     <project name="release.go.x.ref">
       <test>go</test>
       <test>java</test>
-      <test>javascript</test>
       <test>mojo</test>
       <test>projects</test>
       <test>vanadium-bootstrap</test>
@@ -150,7 +142,9 @@
     </project>
     <project name="release.projects.reader">
       <test>vanadium-copyright</test>
-      <test>vanadium-reader-test</test>
+      <!-- TODO(sadovsky,nlacasse): Re-enable this test once the syncbase API change is done.
+        <test>vanadium-reader-test</test>
+      -->
     </project>
     <project name="release.projects.sensorlog">
       <test>go</test>
@@ -165,7 +159,6 @@
     </project>
     <project name="third_party">
       <test>go</test>
-      <test>javascript</test>
       <test>projects</test>
       <test>third_party-go</test>
     </project>
@@ -220,20 +213,20 @@
     <group name="java">
       <test>baku-android-build</test>
       <test>baku-java-test</test>
-      <!-- TODO(spetrovic): this is flaky due to profile issues.  Re-enable after fixing.
       <test>vanadium-android-build</test>
-      -->
       <test>vanadium-java-test</test>
     </group>
     <group name="javascript">
       <test>vanadium-js-unit</test>
       <test>vanadium-js-vdl</test>
-      <test>vanadium-js-vdl-audit</test>
       <test>vanadium-js-vom</test>
+      <test>vanadium-js-vdl-audit</test>
     </group>
     <group name="mojo">
       <test>vanadium-mojo-discovery-test</test>
-      <test>vanadium-mojo-syncbase-test</test>
+      <!-- TODO(sadovsky,nlacasse): Re-enable this test once the syncbase API change is done.
+        <test>vanadium-mojo-syncbase-test</test>
+      -->
       <test>vanadium-mojo-v23proxy-unit-test</test>
       <!-- NOTE(caprita): this is flaky.  See v.io/i/1226
       <test>vanadium-mojo-v23proxy-integration-test</test>
@@ -265,7 +258,6 @@
   </testParts>
   <vdlWorkspaces>
     <workspace>release/go</workspace>
-    <workspace>release/javascript/core/go</workspace>
     <workspace>release/projects/physical-lock/go</workspace>
     <workspace>release/projects/sensorlog/go</workspace>
     <workspace>roadmap/go</workspace>
diff --git a/tooldata/data/oncall.v1.xml b/tooldata/data/oncall.v1.xml
index d324c25..087f553 100644
--- a/tooldata/data/oncall.v1.xml
+++ b/tooldata/data/oncall.v1.xml
@@ -4,6 +4,16 @@
 -->
 <rotation>
   <shift>
+    <primary>jlodhia</primary>
+    <secondary>herbertc</secondary>
+    <startDate>Mar 07, 2016 08:00:00 AM</startDate>
+  </shift>
+  <shift>
+    <primary>razvanm</primary>
+    <secondary>hpucha</secondary>
+    <startDate>Mar 14, 2016 08:00:00 AM</startDate>
+  </shift>
+  <shift>
     <primary>mattr</primary>
     <secondary>jasoncampbell</secondary>
     <startDate>Mar 21, 2016 08:00:00 AM</startDate>