diff --git a/vendor/cmd/go/internal/modget/get.go b/vendor/cmd/go/internal/modget/get.go
index 17ffdcf..e6756c3 100644
--- a/vendor/cmd/go/internal/modget/get.go
+++ b/vendor/cmd/go/internal/modget/get.go
@@ -8,7 +8,14 @@
 import (
 	"cmd/go/internal/base"
 	"cmd/go/internal/get"
+	"cmd/go/internal/load"
+	"cmd/go/internal/modfetch"
+	"cmd/go/internal/module"
+	"cmd/go/internal/mvs"
+	"cmd/go/internal/semver"
+	"cmd/go/internal/vgo"
 	"cmd/go/internal/work"
+	"strings"
 )
 
 var CmdGet = &base.Command{
@@ -139,8 +146,9 @@
 	getFix = CmdGet.Flag.Bool("fix", false, "")
 	getM   = CmdGet.Flag.Bool("m", false, "")
 	getT   = CmdGet.Flag.Bool("t", false, "")
-	getU   = CmdGet.Flag.Bool("u", false, "")
+
 	// -insecure is get.Insecure
+	// -u is vgo.GetU
 	// -v is cfg.BuildV
 )
 
@@ -148,10 +156,131 @@
 	work.AddBuildFlags(CmdGet)
 	CmdGet.Run = runGet // break init loop
 	CmdGet.Flag.BoolVar(&get.Insecure, "insecure", get.Insecure, "")
+	CmdGet.Flag.BoolVar(&vgo.GetU, "u", vgo.GetU, "")
 }
 
 func runGet(cmd *base.Command, args []string) {
-	// OK because the command is also unregistered.
-	// For now we're still running vgo.CmdGet.
-	panic("unimplemented")
+	if vgo.GetU && len(args) > 0 {
+		base.Fatalf("vgo get: -u not supported with argument list")
+	}
+	if !vgo.GetU && len(args) == 0 {
+		base.Fatalf("vgo get: need arguments or -u")
+	}
+
+	if vgo.GetU {
+		vgo.LoadBuildList()
+		return
+	}
+
+	vgo.Init()
+	vgo.InitMod()
+	var upgrade []module.Version
+	var downgrade []module.Version
+	var newPkgs []string
+	for _, pkg := range args {
+		var path, vers string
+		/* OLD CODE
+		if n := strings.Count(pkg, "(") + strings.Count(pkg, ")"); n > 0 {
+			i := strings.Index(pkg, "(")
+			j := strings.Index(pkg, ")")
+			if n != 2 || i < 0 || j <= i+1 || j != len(pkg)-1 && pkg[j+1] != '/' {
+				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
+				continue
+			}
+			path, vers = pkg[:i], pkg[i+1:j]
+			pkg = pkg[:i] + pkg[j+1:]
+		*/
+		if i := strings.Index(pkg, "@"); i >= 0 {
+			path, pkg, vers = pkg[:i], pkg[:i], pkg[i+1:]
+			if strings.Contains(vers, "@") {
+				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
+				continue
+			}
+		} else {
+			path = pkg
+			vers = "latest"
+		}
+		if vers == "none" {
+			downgrade = append(downgrade, module.Version{Path: path, Version: ""})
+		} else {
+			info, err := modfetch.Query(path, vers, vgo.Allowed)
+			if err != nil {
+				base.Errorf("vgo get %v: %v", pkg, err)
+				continue
+			}
+			upgrade = append(upgrade, module.Version{Path: path, Version: info.Version})
+			newPkgs = append(newPkgs, pkg)
+		}
+	}
+	args = newPkgs
+
+	// Upgrade.
+	var err error
+	list, err := mvs.Upgrade(vgo.Target, vgo.Reqs(), upgrade...)
+	if err != nil {
+		base.Fatalf("vgo get: %v", err)
+	}
+	vgo.SetBuildList(list)
+
+	vgo.LoadBuildList()
+
+	// Downgrade anything that went too far.
+	version := make(map[string]string)
+	for _, mod := range vgo.BuildList() {
+		version[mod.Path] = mod.Version
+	}
+	for _, mod := range upgrade {
+		if semver.Compare(mod.Version, version[mod.Path]) < 0 {
+			downgrade = append(downgrade, mod)
+		}
+	}
+
+	if len(downgrade) > 0 {
+		list, err := mvs.Downgrade(vgo.Target, vgo.Reqs(), downgrade...)
+		if err != nil {
+			base.Fatalf("vgo get: %v", err)
+		}
+		vgo.SetBuildList(list)
+
+		// TODO: Check that everything we need to import is still available.
+		/*
+			local := v.matchPackages("all", v.Reqs[:1])
+			for _, path := range local {
+				dir, err := v.importDir(path)
+				if err != nil {
+					return err // TODO
+				}
+				imports, testImports, err := scanDir(dir, v.Tags)
+				for _, path := range imports {
+					xxx
+				}
+				for _, path := range testImports {
+					xxx
+				}
+			}
+		*/
+	}
+	vgo.WriteGoMod()
+
+	if *getD {
+		// Download all needed code as side-effect.
+		vgo.LoadALL()
+	}
+
+	if *getM {
+		return
+	}
+
+	if len(args) > 0 {
+		work.BuildInit()
+		var list []string
+		for _, p := range load.PackagesAndErrors(args) {
+			if p.Error == nil || !strings.HasPrefix(p.Error.Err, "no Go files") {
+				list = append(list, p.ImportPath)
+			}
+		}
+		if len(list) > 0 {
+			work.InstallPackages(list)
+		}
+	}
 }
diff --git a/vendor/cmd/go/internal/vgo/build.go b/vendor/cmd/go/internal/vgo/build.go
index ce06ee2..efee74b 100644
--- a/vendor/cmd/go/internal/vgo/build.go
+++ b/vendor/cmd/go/internal/vgo/build.go
@@ -70,7 +70,7 @@
 // addUpdate fills in m.Update if an updated version is available.
 func addUpdate(m *modinfo.ModulePublic) {
 	if m.Version != "" {
-		if info, err := modfetch.Query(m.Path, "latest", allowed); err == nil && info.Version != m.Version {
+		if info, err := modfetch.Query(m.Path, "latest", Allowed); err == nil && info.Version != m.Version {
 			m.Update = &modinfo.ModulePublic{
 				Path:    m.Path,
 				Version: info.Version,
diff --git a/vendor/cmd/go/internal/vgo/get.go b/vendor/cmd/go/internal/vgo/get.go
deleted file mode 100644
index fcc76d4..0000000
--- a/vendor/cmd/go/internal/vgo/get.go
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2018 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 vgo
-
-import (
-	"strings"
-
-	"cmd/go/internal/base"
-	"cmd/go/internal/load"
-	"cmd/go/internal/modfetch"
-	"cmd/go/internal/module"
-	"cmd/go/internal/mvs"
-	"cmd/go/internal/semver"
-	"cmd/go/internal/work"
-)
-
-var CmdGet = &base.Command{
-	UsageLine: "get [build flags] [modules or packages]",
-	Short:     "download and install versioned modules and dependencies",
-	Long: `
-Get downloads the latest versions of modules containing the named packages,
-along with the versions of the dependencies required by those modules
-(not necessarily the latest ones).
-
-It then installs the named packages, like 'go install'.
-
-By default, get downloads the named packages, updates go.mod, and builds the packages.
-As a special case if a package is a module root and has no code, no error is reported.
-
-TODO make this better
-
-The -m flag causes get to update the module file but not build anything.
-
-The -d flag causes get to download the code and update the module file but not build anything.
-
-The -u flag causes get to download the latest version of dependencies as well.
-
-Each package being updated can be suffixed with @version to specify
-the desired version. Specifying a version older than the one currently
-in use causes a downgrade, which may in turn downgrade other
-modules using that one, to keep everything consistent.
-
-TODO: Make this documentation better once the semantic dust settles.
-	`,
-}
-
-var (
-	getD = CmdGet.Flag.Bool("d", false, "")
-	getM = CmdGet.Flag.Bool("m", false, "")
-	getU = CmdGet.Flag.Bool("u", false, "")
-)
-
-func init() {
-	CmdGet.Run = runGet // break init loop
-	work.AddBuildFlags(CmdGet)
-}
-
-func runGet(cmd *base.Command, args []string) {
-	if *getU && len(args) > 0 {
-		base.Fatalf("vgo get: -u not supported with argument list")
-	}
-	if !*getU && len(args) == 0 {
-		base.Fatalf("vgo get: need arguments or -u")
-	}
-
-	if *getU {
-		LoadBuildList()
-		return
-	}
-
-	Init()
-	InitMod()
-	var upgrade []module.Version
-	var downgrade []module.Version
-	var newPkgs []string
-	for _, pkg := range args {
-		var path, vers string
-		/* OLD CODE
-		if n := strings.Count(pkg, "(") + strings.Count(pkg, ")"); n > 0 {
-			i := strings.Index(pkg, "(")
-			j := strings.Index(pkg, ")")
-			if n != 2 || i < 0 || j <= i+1 || j != len(pkg)-1 && pkg[j+1] != '/' {
-				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
-				continue
-			}
-			path, vers = pkg[:i], pkg[i+1:j]
-			pkg = pkg[:i] + pkg[j+1:]
-		*/
-		if i := strings.Index(pkg, "@"); i >= 0 {
-			path, pkg, vers = pkg[:i], pkg[:i], pkg[i+1:]
-			if strings.Contains(vers, "@") {
-				base.Errorf("vgo get: invalid module version syntax: %s", pkg)
-				continue
-			}
-		} else {
-			path = pkg
-			vers = "latest"
-		}
-		if vers == "none" {
-			downgrade = append(downgrade, module.Version{Path: path, Version: ""})
-		} else {
-			info, err := modfetch.Query(path, vers, allowed)
-			if err != nil {
-				base.Errorf("vgo get %v: %v", pkg, err)
-				continue
-			}
-			upgrade = append(upgrade, module.Version{Path: path, Version: info.Version})
-			newPkgs = append(newPkgs, pkg)
-		}
-	}
-	args = newPkgs
-
-	// Upgrade.
-	var err error
-	buildList, err = mvs.Upgrade(Target, newReqs(buildList), upgrade...)
-	if err != nil {
-		base.Fatalf("vgo get: %v", err)
-	}
-
-	LoadBuildList()
-
-	// Downgrade anything that went too far.
-	version := make(map[string]string)
-	for _, mod := range buildList {
-		version[mod.Path] = mod.Version
-	}
-	for _, mod := range upgrade {
-		if semver.Compare(mod.Version, version[mod.Path]) < 0 {
-			downgrade = append(downgrade, mod)
-		}
-	}
-
-	if len(downgrade) > 0 {
-		buildList, err = mvs.Downgrade(Target, newReqs(buildList, buildList[1:]...), downgrade...)
-		if err != nil {
-			base.Fatalf("vgo get: %v", err)
-		}
-
-		// TODO: Check that everything we need to import is still available.
-		/*
-			local := v.matchPackages("all", v.Reqs[:1])
-			for _, path := range local {
-				dir, err := v.importDir(path)
-				if err != nil {
-					return err // TODO
-				}
-				imports, testImports, err := scanDir(dir, v.Tags)
-				for _, path := range imports {
-					xxx
-				}
-				for _, path := range testImports {
-					xxx
-				}
-			}
-		*/
-	}
-	WriteGoMod()
-
-	if *getD {
-		// Download all needed code as side-effect.
-		LoadALL()
-	}
-
-	if *getM {
-		return
-	}
-
-	if len(args) > 0 {
-		work.BuildInit()
-		var list []string
-		for _, p := range load.PackagesAndErrors(args) {
-			if p.Error == nil || !strings.HasPrefix(p.Error.Err, "no Go files") {
-				list = append(list, p.ImportPath)
-			}
-		}
-		if len(list) > 0 {
-			work.InstallPackages(list)
-		}
-	}
-}
diff --git a/vendor/cmd/go/internal/vgo/init.go b/vendor/cmd/go/internal/vgo/init.go
index f257a78..2d74967 100644
--- a/vendor/cmd/go/internal/vgo/init.go
+++ b/vendor/cmd/go/internal/vgo/init.go
@@ -259,7 +259,8 @@
 	WriteGoMod()
 }
 
-func allowed(m module.Version) bool {
+// Allowed reports whether module m is allowed (not excluded) by the main module's go.mod.
+func Allowed(m module.Version) bool {
 	return !excluded[m]
 }
 
diff --git a/vendor/cmd/go/internal/vgo/load.go b/vendor/cmd/go/internal/vgo/load.go
index 81861e3..dc2677e 100644
--- a/vendor/cmd/go/internal/vgo/load.go
+++ b/vendor/cmd/go/internal/vgo/load.go
@@ -47,6 +47,9 @@
 // which should be used instead.
 var loaded *loader
 
+// get -u flag; TODO: remove.
+var GetU bool
+
 // ImportPaths returns the set of packages matching the args (patterns),
 // adding modules to the build list as needed to satisfy new imports.
 func ImportPaths(args []string) []string {
@@ -382,7 +385,7 @@
 func (ld *loader) load(roots func() []string) {
 	var err error
 	mvsOp := mvs.BuildList
-	if *getU {
+	if GetU {
 		mvsOp = mvs.UpgradeAll
 	}
 	ld.buildList = buildList
@@ -633,7 +636,7 @@
 	ld.missingMu.Unlock()
 
 	fmt.Fprintf(os.Stderr, "resolving import %q\n", path)
-	repo, info, err := modfetch.Import(path, allowed)
+	repo, info, err := modfetch.Import(path, Allowed)
 	if err != nil {
 		base.Errorf("vgo: %s: %v", pkg.stackText(), err)
 		return
@@ -922,7 +925,7 @@
 	// only ever returns untagged versions,
 	// which is not what we want.
 	fmt.Fprintf(os.Stderr, "vgo: finding %s latest\n", m.Path)
-	info, err := modfetch.Query(m.Path, "latest", allowed)
+	info, err := modfetch.Query(m.Path, "latest", Allowed)
 	if err != nil {
 		return module.Version{}, err
 	}
diff --git a/vendor/cmd/go/main.go b/vendor/cmd/go/main.go
index 9df4d3a..6f25c25 100644
--- a/vendor/cmd/go/main.go
+++ b/vendor/cmd/go/main.go
@@ -87,7 +87,7 @@
 
 	if vgo.MustBeVgo {
 		// If running as vgo or with -vgo, change get now to change help message.
-		*get.CmdGet = *vgo.CmdGet
+		*get.CmdGet = *modget.CmdGet
 	}
 
 	cfg.CmdName = args[0] // for error messages
@@ -146,7 +146,7 @@
 		vgo.Init()
 		if vgo.Enabled() {
 			// Might not have done this above, so do it now.
-			*get.CmdGet = *vgo.CmdGet
+			*get.CmdGet = *modget.CmdGet
 		}
 	}
 
