diff --git a/vendor/cmd/go/internal/envcmd/env.go b/vendor/cmd/go/internal/envcmd/env.go
index 603f7b5..d2de069 100644
--- a/vendor/cmd/go/internal/envcmd/env.go
+++ b/vendor/cmd/go/internal/envcmd/env.go
@@ -16,6 +16,7 @@
 	"cmd/go/internal/cache"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/load"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/work"
 )
 
@@ -129,6 +130,7 @@
 		{Name: "CGO_LDFLAGS", Value: strings.Join(ldflags, " ")},
 		{Name: "PKG_CONFIG", Value: b.PkgconfigCmd()},
 		{Name: "GOGCCFLAGS", Value: strings.Join(cmd[3:], " ")},
+		{Name: "VGOMODROOT", Value: vgo.ModRoot},
 	}
 }
 
diff --git a/vendor/cmd/go/internal/get/get.go b/vendor/cmd/go/internal/get/get.go
index 0fee5f0..6e9b498 100644
--- a/vendor/cmd/go/internal/get/get.go
+++ b/vendor/cmd/go/internal/get/get.go
@@ -18,6 +18,7 @@
 	"cmd/go/internal/load"
 	"cmd/go/internal/search"
 	"cmd/go/internal/str"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/web"
 	"cmd/go/internal/work"
 )
@@ -91,6 +92,10 @@
 }
 
 func runGet(cmd *base.Command, args []string) {
+	if vgo.Enabled() {
+		base.Fatalf("go get: vgo not implemented")
+	}
+
 	work.BuildInit()
 
 	if *getF && !*getU {
diff --git a/vendor/cmd/go/internal/help/help.go b/vendor/cmd/go/internal/help/help.go
index b4c5217..488ef7b 100644
--- a/vendor/cmd/go/internal/help/help.go
+++ b/vendor/cmd/go/internal/help/help.go
@@ -64,6 +64,10 @@
 
 var usageTemplate = `Go is a tool for managing Go source code.
 
+This is vgo, an experimental go command with support for package versioning.
+Even though you are invoking it as vgo, most of the messages printed will
+still say "go", not "vgo". Sorry.
+
 Usage:
 
 	go command [arguments]
diff --git a/vendor/cmd/go/internal/list/list.go b/vendor/cmd/go/internal/list/list.go
index 7435273..bf52614 100644
--- a/vendor/cmd/go/internal/list/list.go
+++ b/vendor/cmd/go/internal/list/list.go
@@ -16,6 +16,7 @@
 	"cmd/go/internal/base"
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/load"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/work"
 )
 
@@ -149,6 +150,10 @@
 var listE = CmdList.Flag.Bool("e", false, "")
 var listFmt = CmdList.Flag.String("f", "{{.ImportPath}}", "")
 var listJson = CmdList.Flag.Bool("json", false, "")
+var listM = CmdList.Flag.Bool("m", false, "")
+var listU = CmdList.Flag.Bool("u", false, "")
+var listT = CmdList.Flag.Bool("t", false, "")
+
 var nl = []byte{'\n'}
 
 func runList(cmd *base.Command, args []string) {
@@ -156,6 +161,19 @@
 	out := newTrackingWriter(os.Stdout)
 	defer out.w.Flush()
 
+	if *listM {
+		if *listU {
+			vgo.ListMU()
+			return
+		}
+		vgo.ListM()
+		return
+	}
+	if *listT {
+		vgo.ListT(args)
+		return
+	}
+
 	var do func(*load.PackagePublic)
 	if *listJson {
 		do = func(p *load.PackagePublic) {
diff --git a/vendor/cmd/go/internal/load/icfg.go b/vendor/cmd/go/internal/load/icfg.go
deleted file mode 100644
index d8dd664..0000000
--- a/vendor/cmd/go/internal/load/icfg.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2017 The Go 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 load
-
-import (
-	"bytes"
-	"encoding/json"
-	"errors"
-	"io/ioutil"
-)
-
-// DebugDeprecatedImportcfg is installed as the undocumented -debug-deprecated-importcfg build flag.
-// It is useful for debugging subtle problems in the go command logic but not something
-// we want users to depend on. The hope is that the "deprecated" will make that clear.
-// We intend to remove this flag in Go 1.11.
-var DebugDeprecatedImportcfg debugDeprecatedImportcfgFlag
-
-type debugDeprecatedImportcfgFlag struct {
-	enabled bool
-	Import  map[string]string
-	Pkg     map[string]*debugDeprecatedImportcfgPkg
-}
-
-type debugDeprecatedImportcfgPkg struct {
-	Dir    string
-	Import map[string]string
-}
-
-var (
-	debugDeprecatedImportcfgMagic = []byte("# debug-deprecated-importcfg\n")
-	errImportcfgSyntax            = errors.New("malformed syntax")
-)
-
-func (f *debugDeprecatedImportcfgFlag) String() string { return "" }
-
-func (f *debugDeprecatedImportcfgFlag) Set(x string) error {
-	if x == "" {
-		*f = debugDeprecatedImportcfgFlag{}
-		return nil
-	}
-	data, err := ioutil.ReadFile(x)
-	if err != nil {
-		return err
-	}
-
-	if !bytes.HasPrefix(data, debugDeprecatedImportcfgMagic) {
-		return errImportcfgSyntax
-	}
-	data = data[len(debugDeprecatedImportcfgMagic):]
-
-	f.Import = nil
-	f.Pkg = nil
-	if err := json.Unmarshal(data, &f); err != nil {
-		return errImportcfgSyntax
-	}
-	f.enabled = true
-	return nil
-}
-
-func (f *debugDeprecatedImportcfgFlag) lookup(parent *Package, path string) (dir, newPath string) {
-	newPath = path
-	if p := f.Import[path]; p != "" {
-		newPath = p
-	}
-	if parent != nil {
-		if p1 := f.Pkg[parent.ImportPath]; p1 != nil {
-			if p := p1.Import[path]; p != "" {
-				newPath = p
-			}
-		}
-	}
-	if p2 := f.Pkg[newPath]; p2 != nil {
-		return p2.Dir, newPath
-	}
-	return "", ""
-}
diff --git a/vendor/cmd/go/internal/load/pkg.go b/vendor/cmd/go/internal/load/pkg.go
index 9f5f858..f49dfdb 100644
--- a/vendor/cmd/go/internal/load/pkg.go
+++ b/vendor/cmd/go/internal/load/pkg.go
@@ -22,6 +22,7 @@
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/search"
 	"cmd/go/internal/str"
+	"cmd/go/internal/vgo"
 )
 
 var IgnoreImports bool // control whether we ignore imports in packages
@@ -137,6 +138,8 @@
 	OmitDebug    bool                 // tell linker not to write debug information
 	GobinSubdir  bool                 // install target would be subdir of GOBIN
 
+	ModuleInfo string // add this ModuleInfo to package main
+
 	Asmflags   []string // -asmflags for this package
 	Gcflags    []string // -gcflags for this package
 	Ldflags    []string // -ldflags for this package
@@ -400,13 +403,19 @@
 	importPath := path
 	origPath := path
 	isLocal := build.IsLocalImport(path)
-	var debugDeprecatedImportcfgDir string
+	var vgoDir string
+	var vgoErr error
 	if isLocal {
 		importPath = dirToImportPath(filepath.Join(srcDir, path))
-	} else if DebugDeprecatedImportcfg.enabled {
-		if d, i := DebugDeprecatedImportcfg.lookup(parent, path); d != "" {
-			debugDeprecatedImportcfgDir = d
-			importPath = i
+	} else if vgo.Enabled() {
+		parentPath := ""
+		if parent != nil {
+			parentPath = parent.ImportPath
+		}
+		var p string
+		vgoDir, p, vgoErr = vgo.Lookup(parentPath, path)
+		if vgoErr == nil {
+			importPath = p
 		}
 	} else if mode&UseVendor != 0 {
 		// We do our own vendor resolution, because we want to
@@ -431,11 +440,11 @@
 		// in order to return partial information.
 		var bp *build.Package
 		var err error
-		if debugDeprecatedImportcfgDir != "" {
-			bp, err = cfg.BuildContext.ImportDir(debugDeprecatedImportcfgDir, 0)
-		} else if DebugDeprecatedImportcfg.enabled {
+		if vgoDir != "" {
+			bp, err = cfg.BuildContext.ImportDir(vgoDir, 0)
+		} else if vgoErr != nil {
 			bp = new(build.Package)
-			err = fmt.Errorf("unknown import path %q: not in import cfg", importPath)
+			err = fmt.Errorf("unknown import path %q: %v", importPath, vgoErr)
 		} else {
 			buildMode := build.ImportComment
 			if mode&UseVendor == 0 || path != origPath {
@@ -448,7 +457,7 @@
 		if cfg.GOBIN != "" {
 			bp.BinDir = cfg.GOBIN
 		}
-		if debugDeprecatedImportcfgDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
+		if vgoDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path &&
 			!strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") {
 			err = fmt.Errorf("code in directory %s expects import %q", bp.Dir, bp.ImportComment)
 		}
@@ -457,7 +466,7 @@
 			p = setErrorPos(p, importPos)
 		}
 
-		if debugDeprecatedImportcfgDir == "" && origPath != cleanImport(origPath) {
+		if vgoDir == "" && origPath != cleanImport(origPath) {
 			p.Error = &PackageError{
 				ImportStack: stk.Copy(),
 				Err:         fmt.Sprintf("non-canonical import path: %q should be %q", origPath, pathpkg.Clean(origPath)),
@@ -534,9 +543,13 @@
 // x/vendor/path, vendor/path, or else stay path if none of those exist.
 // VendoredImportPath returns the expanded path or, if no expansion is found, the original.
 func VendoredImportPath(parent *Package, path string) (found string) {
-	if DebugDeprecatedImportcfg.enabled {
-		if d, i := DebugDeprecatedImportcfg.lookup(parent, path); d != "" {
-			return i
+	if vgo.Enabled() {
+		parentPath := ""
+		if parent != nil {
+			parentPath = parent.ImportPath
+		}
+		if _, p, e := vgo.Lookup(parentPath, path); e == nil {
+			return p
 		}
 		return path
 	}
@@ -1184,6 +1197,10 @@
 		setError(fmt.Sprintf("case-insensitive import collision: %q and %q", p.ImportPath, other))
 		return
 	}
+
+	if p.Name == "main" {
+		p.Internal.ModuleInfo = vgo.PackageModuleInfo(p.ImportPath, p.Deps)
+	}
 }
 
 // SafeArg reports whether arg is a "safe" command-line argument,
@@ -1456,7 +1473,7 @@
 	if cmdlineMatchers == nil {
 		SetCmdlinePatterns(search.CleanImportPaths(args))
 	}
-	return search.ImportPaths(args)
+	return vgo.ImportPaths(args)
 }
 
 func ImportPathsForGoGet(args []string) []string {
@@ -1550,6 +1567,8 @@
 	}
 	ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil }
 
+	vgo.AddImports(gofiles)
+
 	var err error
 	if dir == "" {
 		dir = base.Cwd
diff --git a/vendor/cmd/go/internal/work/build.go b/vendor/cmd/go/internal/work/build.go
index 191e45c..c6ab084 100644
--- a/vendor/cmd/go/internal/work/build.go
+++ b/vendor/cmd/go/internal/work/build.go
@@ -230,7 +230,6 @@
 
 	// Undocumented, unstable debugging flags.
 	cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
-	cmd.Flag.Var(&load.DebugDeprecatedImportcfg, "debug-deprecated-importcfg", "")
 }
 
 // fileExtSplit expects a filename and returns the name
diff --git a/vendor/cmd/go/internal/work/exec.go b/vendor/cmd/go/internal/work/exec.go
index c4c1500..1c47bfd 100644
--- a/vendor/cmd/go/internal/work/exec.go
+++ b/vendor/cmd/go/internal/work/exec.go
@@ -29,8 +29,15 @@
 	"cmd/go/internal/cfg"
 	"cmd/go/internal/load"
 	"cmd/go/internal/str"
+	"cmd/go/internal/vgo"
 )
 
+func init() {
+	vgo.InstallHook = func(args []string) {
+		CmdInstall.Run(CmdInstall, args)
+	}
+}
+
 // actionList returns the list of actions in the dag rooted at root
 // as visited in a depth-first post-order traversal.
 func actionList(root *Action) []*Action {
@@ -292,6 +299,8 @@
 		}
 	}
 
+	fmt.Fprintf(h, "moduleinfo %q\n", p.Internal.ModuleInfo)
+
 	return h.Sum()
 }
 
@@ -569,6 +578,14 @@
 		return nil
 	}
 
+	// TODO(vgo): If have module info, write file to objdir, add to gofiles.
+	if p.Internal.ModuleInfo != "" {
+		if err := b.writeFile(objdir+"_gomod_.go", vgo.ModInfoProg(p.Internal.ModuleInfo)); err != nil {
+			return err
+		}
+		gofiles = append(gofiles, objdir+"_gomod_.go")
+	}
+
 	// Compile Go.
 	objpkg := objdir + "_pkg_.a"
 	ofile, out, err := BuildToolchain.gc(b, a, objpkg, icfg.Bytes(), len(sfiles) > 0, gofiles)
diff --git a/vendor/cmd/go/main.go b/vendor/cmd/go/main.go
index dbe6b78..c5a6df4 100644
--- a/vendor/cmd/go/main.go
+++ b/vendor/cmd/go/main.go
@@ -32,6 +32,7 @@
 	"cmd/go/internal/tool"
 	"cmd/go/internal/version"
 	"cmd/go/internal/vet"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/work"
 )
 
@@ -51,6 +52,8 @@
 		run.CmdRun,
 		test.CmdTest,
 		tool.CmdTool,
+		vgo.CmdVendor,
+		vgo.CmdVerify,
 		version.CmdVersion,
 		vet.CmdVet,
 
@@ -78,6 +81,11 @@
 		base.Usage()
 	}
 
+	if vgo.MustBeVgo {
+		// If running as vgo or with -vgo, change get now to change help message.
+		*get.CmdGet = *vgo.CmdGet
+	}
+
 	cfg.CmdName = args[0] // for error messages
 	if args[0] == "help" {
 		help.Help(args[1:])
@@ -115,6 +123,13 @@
 		os.Exit(2)
 	}
 
+	if !vgo.MustBeVgo {
+		if vgo.Init(); vgo.Enabled() {
+			// Didn't do this above, so do it now.
+			*get.CmdGet = *vgo.CmdGet
+		}
+	}
+
 	// Set environment (GOOS, GOARCH, etc) explicitly.
 	// In theory all the commands we invoke should have
 	// the same default computation of these as we do,
diff --git a/vendor/cmd/go/vgo_test.go b/vendor/cmd/go/vgo_test.go
index a6ccd26..6cc8297 100644
--- a/vendor/cmd/go/vgo_test.go
+++ b/vendor/cmd/go/vgo_test.go
@@ -5,7 +5,12 @@
 package Main_test
 
 import (
+	"cmd/go/internal/modconv"
+	"cmd/go/internal/vgo"
+	"io/ioutil"
+	"os"
 	"runtime"
+	"sort"
 	"testing"
 )
 
@@ -19,3 +24,30 @@
 	tg.setenv("VGOROOT", runtime.GOROOT())
 	tg.run("env")
 }
+
+func TestFindModRoot(t *testing.T) {
+	tg := testgo(t)
+	defer tg.cleanup()
+	tg.makeTempdir()
+
+	tg.must(os.MkdirAll(tg.path("x/Godeps"), 0777))
+	tg.must(os.MkdirAll(tg.path("x/vendor"), 0777))
+	tg.must(os.MkdirAll(tg.path("x/y/z"), 0777))
+	tg.must(os.MkdirAll(tg.path("x/.git"), 0777))
+	var files []string
+	for file := range modconv.Converters {
+		files = append(files, file)
+	}
+	files = append(files, "go.mod")
+	files = append(files, ".git/config")
+	sort.Strings(files)
+
+	for file := range modconv.Converters {
+		tg.must(ioutil.WriteFile(tg.path("x/"+file), []byte{}, 0666))
+		root, file1 := vgo.FindModuleRoot(tg.path("x/y/z"), tg.path("."), true)
+		if root != tg.path("x") || file1 != file {
+			t.Errorf("%s: findModuleRoot = %q, %q, want %q, %q", file, root, file1, tg.path("x"), file)
+		}
+		tg.must(os.Remove(tg.path("x/" + file)))
+	}
+}
