diff --git a/go1.10.1/main.go b/go1.10.1/main.go
new file mode 100644
index 0000000..1c66143
--- /dev/null
+++ b/go1.10.1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10.1 command runs the go command from Go 1.10.1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10.1
+//     $ go1.10.1 download
+//
+// And then use the go1.10.1 command as if it were your normal
+// go command.
+//
+// See the release notes at https://golang.org/doc/devel/release.html#go1.10.minor
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10.1")
+}
diff --git a/go1.10.2/main.go b/go1.10.2/main.go
new file mode 100644
index 0000000..ceecb46
--- /dev/null
+++ b/go1.10.2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10.2 command runs the go command from go1.10.2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10.2
+//     $ go1.10.2 download
+//
+// And then use the go1.10.2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.10.2
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10.2")
+}
diff --git a/go1.10.3/main.go b/go1.10.3/main.go
new file mode 100644
index 0000000..8ab2684
--- /dev/null
+++ b/go1.10.3/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10.3 command runs the go command from go1.10.3.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10.3
+//     $ go1.10.3 download
+//
+// And then use the go1.10.3 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.10.3
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10.3")
+}
diff --git a/go1.10/go1.10.go b/go1.10/go1.10.go
new file mode 100644
index 0000000..3838b69
--- /dev/null
+++ b/go1.10/go1.10.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10 command runs the go command from go1.10.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10
+//     $ go1.10 download
+//
+// And then use the go1.10 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.10
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10")
+}
diff --git a/go1.10beta1/main.go b/go1.10beta1/main.go
new file mode 100644
index 0000000..035a333
--- /dev/null
+++ b/go1.10beta1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10beta1 command runs the go command from go1.10beta1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10beta1
+//     $ go1.10beta1 download
+//
+// And then use the go1.10beta1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.10
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10beta1")
+}
diff --git a/go1.10beta2/main.go b/go1.10beta2/main.go
new file mode 100644
index 0000000..3aa8027b
--- /dev/null
+++ b/go1.10beta2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10beta2 command runs the go command from go1.10beta2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10beta2
+//     $ go1.10beta2 download
+//
+// And then use the go1.10beta2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.10
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10beta2")
+}
diff --git a/go1.10rc1/main.go b/go1.10rc1/main.go
new file mode 100644
index 0000000..5357da5
--- /dev/null
+++ b/go1.10rc1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10rc1 command runs the go command from go1.10rc1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10rc1
+//     $ go1.10rc1 download
+//
+// And then use the go1.10rc1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://tip.golang.org/doc/go1.10
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10rc1")
+}
diff --git a/go1.10rc2/main.go b/go1.10rc2/main.go
new file mode 100644
index 0000000..b168e4b
--- /dev/null
+++ b/go1.10rc2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.10rc2 command runs the go command from go1.10rc2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.10rc2
+//     $ go1.10rc2 download
+//
+// And then use the go1.10rc2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://tip.golang.org/doc/go1.10
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.10rc2")
+}
diff --git a/go1.11beta1/main.go b/go1.11beta1/main.go
new file mode 100644
index 0000000..ab7ee8e
--- /dev/null
+++ b/go1.11beta1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.11beta1 command runs the go command from go1.11beta1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.11beta1
+//     $ go1.11beta1 download
+//
+// And then use the go1.11beta1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://tip.golang.org/doc/go1.11
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.11beta1")
+}
diff --git a/go1.8.1/main.go b/go1.8.1/main.go
new file mode 100644
index 0000000..149124c
--- /dev/null
+++ b/go1.8.1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.1 command runs the go command from go1.8.1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.1
+//     $ go1.8.1 download
+//
+// And then use the go1.8.1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.1")
+}
diff --git a/go1.8.2/main.go b/go1.8.2/main.go
new file mode 100644
index 0000000..4f12699
--- /dev/null
+++ b/go1.8.2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.2 command runs the go command from go1.8.2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.2
+//     $ go1.8.2 download
+//
+// And then use the go1.8.2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.2")
+}
diff --git a/go1.8.3/main.go b/go1.8.3/main.go
new file mode 100644
index 0000000..297a2a0
--- /dev/null
+++ b/go1.8.3/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.3 command runs the go command from go1.8.3.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.3
+//     $ go1.8.3 download
+//
+// And then use the go1.8.3 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.3")
+}
diff --git a/go1.8.4/main.go b/go1.8.4/main.go
new file mode 100644
index 0000000..85013c3
--- /dev/null
+++ b/go1.8.4/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.4 command runs the go command from go1.8.4.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.4
+//     $ go1.8.4 download
+//
+// And then use the go1.8.4 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.4")
+}
diff --git a/go1.8.5/main.go b/go1.8.5/main.go
new file mode 100644
index 0000000..9b073a7
--- /dev/null
+++ b/go1.8.5/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.5 command runs the go command from go1.8.5.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.5
+//     $ go1.8.5 download
+//
+// And then use the go1.8.5 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.5")
+}
diff --git a/go1.8.6/main.go b/go1.8.6/main.go
new file mode 100644
index 0000000..7ce24df
--- /dev/null
+++ b/go1.8.6/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.6 command runs the go command from go1.8.6.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.6
+//     $ go1.8.6 download
+//
+// And then use the go1.8.6 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.6")
+}
diff --git a/go1.8.7/main.go b/go1.8.7/main.go
new file mode 100644
index 0000000..5374562
--- /dev/null
+++ b/go1.8.7/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8.7 command runs the go command from go1.8.7.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8.7
+//     $ go1.8.7 download
+//
+// And then use the go1.8.7 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8.7")
+}
diff --git a/go1.8/main.go b/go1.8/main.go
new file mode 100644
index 0000000..5c6d564
--- /dev/null
+++ b/go1.8/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.8 command runs the go command from go1.8.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8
+//     $ go1.8 download
+//
+// And then use the go1.8 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8")
+}
diff --git a/go1.8beta1/main.go b/go1.8beta1/main.go
new file mode 100644
index 0000000..04320d5
--- /dev/null
+++ b/go1.8beta1/main.go
@@ -0,0 +1,24 @@
+// Copyright 2016 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.
+
+// The go1.8beta1 command runs the go command from go1.8beta1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8beta1
+//     $ go1.8beta1 download
+//
+// And then use the go1.8beta1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8beta1")
+}
diff --git a/go1.8beta2/main.go b/go1.8beta2/main.go
new file mode 100644
index 0000000..f4c2389
--- /dev/null
+++ b/go1.8beta2/main.go
@@ -0,0 +1,24 @@
+// Copyright 2016 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.
+
+// The go1.8beta2 command runs the go command from go1.8beta2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8beta2
+//     $ go1.8beta2 download
+//
+// And then use the go1.8beta2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8beta2")
+}
diff --git a/go1.8rc1/main.go b/go1.8rc1/main.go
new file mode 100644
index 0000000..4a62bbc
--- /dev/null
+++ b/go1.8rc1/main.go
@@ -0,0 +1,24 @@
+// Copyright 2016 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.
+
+// The go1.8rc1 command runs the go command from go1.8rc1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8rc1
+//     $ go1.8rc1 download
+//
+// And then use the go1.8rc1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8rc1")
+}
diff --git a/go1.8rc2/main.go b/go1.8rc2/main.go
new file mode 100644
index 0000000..d8b2099
--- /dev/null
+++ b/go1.8rc2/main.go
@@ -0,0 +1,24 @@
+// Copyright 2016 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.
+
+// The go1.8rc2 command runs the go command from go1.8rc2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8rc2
+//     $ go1.8rc2 download
+//
+// And then use the go1.8rc2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8rc2")
+}
diff --git a/go1.8rc3/main.go b/go1.8rc3/main.go
new file mode 100644
index 0000000..b1197fc
--- /dev/null
+++ b/go1.8rc3/main.go
@@ -0,0 +1,24 @@
+// Copyright 2016 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.
+
+// The go1.8rc3 command runs the go command from go1.8rc3.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.8rc3
+//     $ go1.8rc3 download
+//
+// And then use the go1.8rc3 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.8
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.8rc3")
+}
diff --git a/go1.9.1/main.go b/go1.9.1/main.go
new file mode 100644
index 0000000..075f867
--- /dev/null
+++ b/go1.9.1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.1 command runs the go command from go1.9.1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.1
+//     $ go1.9.1 download
+//
+// And then use the go1.9.1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.1")
+}
diff --git a/go1.9.2/main.go b/go1.9.2/main.go
new file mode 100644
index 0000000..cb3c755
--- /dev/null
+++ b/go1.9.2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.2 command runs the go command from go1.9.2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.2
+//     $ go1.9.2 download
+//
+// And then use the go1.9.2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.2")
+}
diff --git a/go1.9.3/main.go b/go1.9.3/main.go
new file mode 100644
index 0000000..28f48cb
--- /dev/null
+++ b/go1.9.3/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.3 command runs the go command from go1.9.3.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.3
+//     $ go1.9.3 download
+//
+// And then use the go1.9.3 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.3")
+}
diff --git a/go1.9.4/main.go b/go1.9.4/main.go
new file mode 100644
index 0000000..6d74de5
--- /dev/null
+++ b/go1.9.4/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.4 command runs the go command from go1.9.4.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.4
+//     $ go1.9.4 download
+//
+// And then use the go1.9.4 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.4")
+}
diff --git a/go1.9.5/main.go b/go1.9.5/main.go
new file mode 100644
index 0000000..93c97d1
--- /dev/null
+++ b/go1.9.5/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.5 command runs the go command from Go 1.9.5.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.5
+//     $ go1.9.5 download
+//
+// And then use the go1.9.5 command as if it were your normal
+// go command.
+//
+// See the release notes at https://golang.org/doc/devel/release.html#go1.9.minor
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.5")
+}
diff --git a/go1.9.6/main.go b/go1.9.6/main.go
new file mode 100644
index 0000000..48eeaeb
--- /dev/null
+++ b/go1.9.6/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.6 command runs the go command from go1.9.6.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.6
+//     $ go1.9.6 download
+//
+// And then use the go1.9.6 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9.6
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.6")
+}
diff --git a/go1.9.7/main.go b/go1.9.7/main.go
new file mode 100644
index 0000000..514a606
--- /dev/null
+++ b/go1.9.7/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9.7 command runs the go command from go1.9.7.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9.7
+//     $ go1.9.7 download
+//
+// And then use the go1.9.7 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9.7
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9.7")
+}
diff --git a/go1.9/main.go b/go1.9/main.go
new file mode 100644
index 0000000..49e2e15
--- /dev/null
+++ b/go1.9/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9 command runs the go command from go1.9.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9
+//     $ go1.9 download
+//
+// And then use the go1.9 command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9")
+}
diff --git a/go1.9beta1/main.go b/go1.9beta1/main.go
new file mode 100644
index 0000000..5c339df
--- /dev/null
+++ b/go1.9beta1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9beta1 command runs the go command from go1.9beta1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9beta1
+//     $ go1.9beta1 download
+//
+// And then use the go1.9beta1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9beta1")
+}
diff --git a/go1.9beta2/main.go b/go1.9beta2/main.go
new file mode 100644
index 0000000..c887378
--- /dev/null
+++ b/go1.9beta2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9beta2 command runs the go command from go1.9beta2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9beta2
+//     $ go1.9beta2 download
+//
+// And then use the go1.9beta2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://beta.golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9beta2")
+}
diff --git a/go1.9rc1/main.go b/go1.9rc1/main.go
new file mode 100644
index 0000000..5e01704
--- /dev/null
+++ b/go1.9rc1/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9rc1 command runs the go command from go1.9rc1.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9rc1
+//     $ go1.9rc1 download
+//
+// And then use the go1.9rc1 command as if it were your normal go
+// command.
+//
+// See the release notes at https://tip.golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9rc1")
+}
diff --git a/go1.9rc2/main.go b/go1.9rc2/main.go
new file mode 100644
index 0000000..0a267d8
--- /dev/null
+++ b/go1.9rc2/main.go
@@ -0,0 +1,24 @@
+// 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.
+
+// The go1.9rc2 command runs the go command from go1.9rc2.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/go1.9rc2
+//     $ go1.9rc2 download
+//
+// And then use the go1.9rc2 command as if it were your normal go
+// command.
+//
+// See the release notes at https://tip.golang.org/doc/go1.9
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("go1.9rc2")
+}
diff --git a/internal/genv/main.go b/internal/genv/main.go
new file mode 100755
index 0000000..1f32863
--- /dev/null
+++ b/internal/genv/main.go
@@ -0,0 +1,86 @@
+// 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.
+
+// The genv command generates version-specific go command source files.
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"html/template"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+func usage() {
+	fmt.Fprintln(os.Stderr, "usage: genv <version>...")
+	os.Exit(2)
+}
+
+func main() {
+	if len(os.Args) == 1 {
+		usage()
+	}
+	for _, version := range os.Args[1:] {
+		if !strings.HasPrefix(version, "go") {
+			failf("version names should have the 'go' prefix")
+		}
+		var buf bytes.Buffer
+		if err := mainTmpl.Execute(&buf, struct {
+			Year    int
+			Version string
+		}{time.Now().Year(), version}); err != nil {
+			failf("mainTmpl.execute: %v", err)
+		}
+		path := filepath.Join(os.Getenv("GOPATH"), "src/golang.org/dl", version, "main.go")
+		if err := os.Mkdir(filepath.Dir(path), 0755); err != nil {
+			failf("os.Mkdir: %v", err)
+		}
+		if err := ioutil.WriteFile(path, buf.Bytes(), 0666); err != nil {
+			failf("ioutil.WriteFile: %v", err)
+		}
+		fmt.Println("Wrote", path)
+		if err := exec.Command("gofmt", "-w", path).Run(); err != nil {
+			failf("could not gofmt file %q: %v", path, err)
+		}
+	}
+}
+
+func failf(format string, args ...interface{}) {
+	if len(format) == 0 || format[len(format)-1] != '\n' {
+		format += "\n"
+	}
+	fmt.Fprintf(os.Stderr, format, args...)
+	os.Exit(1)
+}
+
+var mainTmpl = template.Must(template.New("main").Parse(`// Copyright {{.Year}} 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.
+
+// The {{.Version}} command runs the go command from {{.Version}}.
+//
+// To install, run:
+//
+//     $ go get golang.org/dl/{{.Version}}
+//     $ {{.Version}} download
+//
+// And then use the {{.Version}} command as if it were your normal go
+// command.
+//
+// See the release notes at https://golang.org/doc/{{.Version}}
+//
+// File bugs at https://golang.org/issues/new
+package main
+
+import "golang.org/dl/internal/version"
+
+func main() {
+	version.Run("{{.Version}}")
+}
+`))
diff --git a/internal/version/version.go b/internal/version/version.go
new file mode 100644
index 0000000..95874fa
--- /dev/null
+++ b/internal/version/version.go
@@ -0,0 +1,453 @@
+// Copyright 2016 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.
+
+// The version package permits running a specific version of Go.
+package version
+
+import (
+	"archive/tar"
+	"archive/zip"
+	"compress/gzip"
+	"crypto/sha256"
+	"errors"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os"
+	"os/exec"
+	"os/user"
+	"path"
+	"path/filepath"
+	"runtime"
+	"strings"
+	"time"
+
+	"golang.org/x/build/envutil"
+)
+
+func init() {
+	http.DefaultTransport = &userAgentTransport{http.DefaultTransport}
+}
+
+// Run runs the "go" tool of the provided Go version.
+func Run(version string) {
+	log.SetFlags(0)
+
+	root, err := goroot(version)
+	if err != nil {
+		log.Fatalf("%s: %v", version, err)
+	}
+
+	if len(os.Args) == 2 && os.Args[1] == "download" {
+		if err := install(root, version); err != nil {
+			log.Fatalf("%s: download failed: %v", version, err)
+		}
+		os.Exit(0)
+	}
+
+	if _, err := os.Stat(filepath.Join(root, unpackedOkay)); err != nil {
+		log.Fatalf("%s: not downloaded. Run '%s download' to install to %v", version, version, root)
+	}
+
+	gobin := filepath.Join(root, "bin", "go"+exe())
+	cmd := exec.Command(gobin, os.Args[1:]...)
+	cmd.Stdin = os.Stdin
+	cmd.Stdout = os.Stdout
+	cmd.Stderr = os.Stderr
+	cmd.Env = envutil.Dedup(caseInsensitiveEnv, append(os.Environ(), "GOROOT="+root))
+	if err := cmd.Run(); err != nil {
+		// TODO: return the same exit status maybe.
+		os.Exit(1)
+	}
+	os.Exit(0)
+}
+
+// install installs a version of Go to the named target directory, creating the
+// directory as needed.
+func install(targetDir, version string) error {
+	if _, err := os.Stat(filepath.Join(targetDir, unpackedOkay)); err == nil {
+		log.Printf("%s: already downloaded in %v", version, targetDir)
+		return nil
+	}
+
+	goURL, err := versionArchiveURL(version)
+	if err != nil {
+		return err
+	}
+	if err := os.MkdirAll(targetDir, 0755); err != nil {
+		return err
+	}
+	res, err := http.Head(goURL)
+	if err != nil {
+		return err
+	}
+	if res.StatusCode == http.StatusNotFound {
+		return fmt.Errorf("no binary release of %v for %v/%v at %v", version, getOS(), runtime.GOARCH, goURL)
+	}
+	if res.StatusCode != http.StatusOK {
+		return fmt.Errorf("server returned %v checking size of %v", http.StatusText(res.StatusCode), goURL)
+	}
+	base := path.Base(goURL)
+	archiveFile := filepath.Join(targetDir, base)
+	if fi, err := os.Stat(archiveFile); err != nil || fi.Size() != res.ContentLength {
+		if err != nil && !os.IsNotExist(err) {
+			// Something weird. Don't try to download.
+			return err
+		}
+		if err := copyFromURL(archiveFile, goURL); err != nil {
+			return fmt.Errorf("error downloading %v: %v", goURL, err)
+		}
+		fi, err = os.Stat(archiveFile)
+		if err != nil {
+			return err
+		}
+		if fi.Size() != res.ContentLength {
+			return fmt.Errorf("downloaded file %s size %v doesn't match server size %v", archiveFile, fi.Size(), res.ContentLength)
+		}
+	}
+	wantSHA, err := slurpURLToString(goURL + ".sha256")
+	if err != nil {
+		return err
+	}
+	if err := verifySHA256(archiveFile, strings.TrimSpace(wantSHA)); err != nil {
+		return fmt.Errorf("error verifying SHA256 of %v: %v", archiveFile, err)
+	}
+	log.Printf("Unpacking %v ...", archiveFile)
+	if err := unpackArchive(targetDir, archiveFile); err != nil {
+		return fmt.Errorf("extracting archive %v: %v", archiveFile, err)
+	}
+	if err := ioutil.WriteFile(filepath.Join(targetDir, unpackedOkay), nil, 0644); err != nil {
+		return err
+	}
+	log.Printf("Success. You may now run '%v'", version)
+	return nil
+}
+
+// unpackArchive unpacks the provided archive zip or tar.gz file to targetDir,
+// removing the "go/" prefix from file entries.
+func unpackArchive(targetDir, archiveFile string) error {
+	switch {
+	case strings.HasSuffix(archiveFile, ".zip"):
+		return unpackZip(targetDir, archiveFile)
+	case strings.HasSuffix(archiveFile, ".tar.gz"):
+		return unpackTarGz(targetDir, archiveFile)
+	default:
+		return errors.New("unsupported archive file")
+	}
+}
+
+// unpackTarGz is the tar.gz implementation of unpackArchive.
+func unpackTarGz(targetDir, archiveFile string) error {
+	r, err := os.Open(archiveFile)
+	if err != nil {
+		return err
+	}
+	defer r.Close()
+	madeDir := map[string]bool{}
+	zr, err := gzip.NewReader(r)
+	if err != nil {
+		return err
+	}
+	tr := tar.NewReader(zr)
+	for {
+		f, err := tr.Next()
+		if err == io.EOF {
+			break
+		}
+		if err != nil {
+			return err
+		}
+		if !validRelPath(f.Name) {
+			return fmt.Errorf("tar file contained invalid name %q", f.Name)
+		}
+		rel := filepath.FromSlash(strings.TrimPrefix(f.Name, "go/"))
+		abs := filepath.Join(targetDir, rel)
+
+		fi := f.FileInfo()
+		mode := fi.Mode()
+		switch {
+		case mode.IsRegular():
+			// Make the directory. This is redundant because it should
+			// already be made by a directory entry in the tar
+			// beforehand. Thus, don't check for errors; the next
+			// write will fail with the same error.
+			dir := filepath.Dir(abs)
+			if !madeDir[dir] {
+				if err := os.MkdirAll(filepath.Dir(abs), 0755); err != nil {
+					return err
+				}
+				madeDir[dir] = true
+			}
+			wf, err := os.OpenFile(abs, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode.Perm())
+			if err != nil {
+				return err
+			}
+			n, err := io.Copy(wf, tr)
+			if closeErr := wf.Close(); closeErr != nil && err == nil {
+				err = closeErr
+			}
+			if err != nil {
+				return fmt.Errorf("error writing to %s: %v", abs, err)
+			}
+			if n != f.Size {
+				return fmt.Errorf("only wrote %d bytes to %s; expected %d", n, abs, f.Size)
+			}
+			if !f.ModTime.IsZero() {
+				if err := os.Chtimes(abs, f.ModTime, f.ModTime); err != nil {
+					// benign error. Gerrit doesn't even set the
+					// modtime in these, and we don't end up relying
+					// on it anywhere (the gomote push command relies
+					// on digests only), so this is a little pointless
+					// for now.
+					log.Printf("error changing modtime: %v", err)
+				}
+			}
+		case mode.IsDir():
+			if err := os.MkdirAll(abs, 0755); err != nil {
+				return err
+			}
+			madeDir[abs] = true
+		default:
+			return fmt.Errorf("tar file entry %s contained unsupported file type %v", f.Name, mode)
+		}
+	}
+	return nil
+}
+
+// unpackZip is the zip implementation of unpackArchive.
+func unpackZip(targetDir, archiveFile string) error {
+	zr, err := zip.OpenReader(archiveFile)
+	if err != nil {
+		return err
+	}
+	defer zr.Close()
+
+	for _, f := range zr.File {
+		name := strings.TrimPrefix(f.Name, "go/")
+
+		outpath := filepath.Join(targetDir, name)
+		if f.FileInfo().IsDir() {
+			if err := os.MkdirAll(outpath, 0755); err != nil {
+				return err
+			}
+			continue
+		}
+
+		rc, err := f.Open()
+		if err != nil {
+			return err
+		}
+
+		// File
+		if err := os.MkdirAll(filepath.Dir(outpath), 0755); err != nil {
+			return err
+		}
+		out, err := os.OpenFile(outpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
+		if err != nil {
+			return err
+		}
+		_, err = io.Copy(out, rc)
+		rc.Close()
+		if err != nil {
+			out.Close()
+			return err
+		}
+		if err := out.Close(); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+// verifySHA256 reports whether the named file has contents with
+// SHA-256 of the given wantHex value.
+func verifySHA256(file, wantHex string) error {
+	f, err := os.Open(file)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	hash := sha256.New()
+	if _, err := io.Copy(hash, f); err != nil {
+		return err
+	}
+	if fmt.Sprintf("%x", hash.Sum(nil)) != wantHex {
+		return fmt.Errorf("%s corrupt? does not have expected SHA-256 of %v", file, wantHex)
+	}
+	return nil
+}
+
+// slurpURLToString downloads the given URL and returns it as a string.
+func slurpURLToString(url_ string) (string, error) {
+	res, err := http.Get(url_)
+	if err != nil {
+		return "", err
+	}
+	defer res.Body.Close()
+	if res.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("%s: %v", url_, res.Status)
+	}
+	slurp, err := ioutil.ReadAll(res.Body)
+	if err != nil {
+		return "", fmt.Errorf("reading %s: %v", url_, err)
+	}
+	return string(slurp), nil
+}
+
+// copyFromURL downloads srcURL to dstFile.
+func copyFromURL(dstFile, srcURL string) (err error) {
+	f, err := os.Create(dstFile)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			f.Close()
+			os.Remove(dstFile)
+		}
+	}()
+	c := &http.Client{
+		Transport: &userAgentTransport{&http.Transport{
+			// It's already compressed. Prefer accurate ContentLength.
+			// (Not that GCS would try to compress it, though)
+			DisableCompression: true,
+			DisableKeepAlives:  true,
+			Proxy:              http.ProxyFromEnvironment,
+		}},
+	}
+	res, err := c.Get(srcURL)
+	if err != nil {
+		return err
+	}
+	defer res.Body.Close()
+	if res.StatusCode != http.StatusOK {
+		return errors.New(res.Status)
+	}
+	pw := &progressWriter{w: f, total: res.ContentLength}
+	n, err := io.Copy(pw, res.Body)
+	if err != nil {
+		return err
+	}
+	if res.ContentLength != -1 && res.ContentLength != n {
+		return fmt.Errorf("copied %v bytes; expected %v", n, res.ContentLength)
+	}
+	pw.update() // 100%
+	return f.Close()
+}
+
+type progressWriter struct {
+	w     io.Writer
+	n     int64
+	total int64
+	last  time.Time
+}
+
+func (p *progressWriter) update() {
+	end := " ..."
+	if p.n == p.total {
+		end = ""
+	}
+	fmt.Fprintf(os.Stderr, "Downloaded %0.1f%% (%d / %d bytes)%s\n",
+		(100.0*float64(p.n))/float64(p.total),
+		p.n, p.total, end)
+}
+
+func (p *progressWriter) Write(buf []byte) (n int, err error) {
+	n, err = p.w.Write(buf)
+	p.n += int64(n)
+	if now := time.Now(); now.Unix() != p.last.Unix() {
+		p.update()
+		p.last = now
+	}
+	return
+}
+
+// getOS returns runtime.GOOS. It exists as a function just for lazy
+// testing of the Windows zip path when running on Linux/Darwin.
+func getOS() string {
+	return runtime.GOOS
+}
+
+// versionArchiveURL returns the zip or tar.gz URL of the given Go version.
+func versionArchiveURL(version string) (string, error) {
+	goos := getOS()
+
+	// TODO: Maybe we should parse
+	// https://storage.googleapis.com/go-builder-data/dl-index.txt ?
+	// Let's just guess the URL for now and see if it's there.
+	// Then we don't have to maintain that txt file too.
+	ext := ".tar.gz"
+	if goos == "windows" {
+		ext = ".zip"
+	}
+	arch := runtime.GOARCH
+	if goos == "linux" && runtime.GOARCH == "arm" {
+		arch = "armv6l"
+	}
+	return "https://storage.googleapis.com/golang/" + version + "." + goos + "-" + arch + ext, nil
+}
+
+const caseInsensitiveEnv = runtime.GOOS == "windows"
+
+// unpackedOkay is a sentinel zero-byte file to indicate that the Go
+// version was downloaded and unpacked successfully.
+const unpackedOkay = ".unpacked-success"
+
+func exe() string {
+	if runtime.GOOS == "windows" {
+		return ".exe"
+	}
+	return ""
+}
+
+func goroot(version string) (string, error) {
+	home, err := homedir()
+	if err != nil {
+		return "", fmt.Errorf("failed to get home directory: %v", err)
+	}
+	return filepath.Join(home, "sdk", version), nil
+}
+
+func homedir() (string, error) {
+	switch getOS() {
+	case "plan9":
+		return "", fmt.Errorf("%q not yet supported", runtime.GOOS)
+	case "windows":
+		if dir := os.Getenv("USERPROFILE"); dir != "" {
+			return dir, nil
+		}
+		return "", errors.New("can't find user home directory; %USERPROFILE% is empty")
+	default:
+		if dir := os.Getenv("HOME"); dir != "" {
+			return dir, nil
+		}
+		if u, err := user.Current(); err == nil && u.HomeDir != "" {
+			return u.HomeDir, nil
+		}
+		return "", errors.New("can't find user home directory; $HOME is empty")
+	}
+}
+
+func validRelPath(p string) bool {
+	if p == "" || strings.Contains(p, `\`) || strings.HasPrefix(p, "/") || strings.Contains(p, "../") {
+		return false
+	}
+	return true
+}
+
+type userAgentTransport struct {
+	rt http.RoundTripper
+}
+
+func (uat userAgentTransport) RoundTrip(r *http.Request) (*http.Response, error) {
+	version := runtime.Version()
+	if strings.Contains(version, "devel") {
+		// Strip the SHA hash and date. We don't want spaces or other tokens (see RFC2616 14.43)
+		version = "devel"
+	}
+	r.Header.Set("User-Agent", "golang-x-build-version/"+version)
+	return uat.rt.RoundTrip(r)
+}
