diff --git a/var/spack/repos/builtin/packages/go-bootstrap/package.py b/var/spack/repos/builtin/packages/go-bootstrap/package.py
new file mode 100644
index 0000000000000000000000000000000000000000..fd0b5bc5d1b3f4bc6f4e067d55037ac3804682e0
--- /dev/null
+++ b/var/spack/repos/builtin/packages/go-bootstrap/package.py
@@ -0,0 +1,51 @@
+import os
+import shutil
+import glob
+from spack import *
+
+# THIS PACKAGE SHOULD NOT EXIST
+# it exists to make up for the inability to:
+# * use an external go compiler
+# * have go depend on itself
+# * have a sensible way to find gccgo without a dep on gcc
+
+class GoBootstrap(Package):
+    """Old C-bootstrapped go to bootstrap real go"""
+    homepage = "https://golang.org"
+    url = "https://go.googlesource.com/go"
+
+    extendable = True
+
+    # temporary fix until tags are pulled correctly
+    version('1.4.2', git='https://go.googlesource.com/go', tag='go1.4.2')
+
+    variant('test',
+            default=True,
+            description="Run tests as part of build, a good idea but quite"
+            " time consuming")
+
+    provides('golang@:1.4.2')
+
+    depends_on('git')
+
+    def install(self, spec, prefix):
+        bash = which('bash')
+        with working_dir('src'):
+            if '+test' in spec:
+                bash('all.bash')
+            else:
+                bash('make.bash')
+
+        try:
+            os.makedirs(prefix)
+        except OSError:
+            pass
+        for f in glob.glob('*'):
+            if os.path.isdir(f):
+                shutil.copytree(f, os.path.join(prefix, f))
+            else:
+                shutil.copy2(f, os.path.join(prefix, f))
+
+    def setup_environment(self, spack_env, run_env):
+        spack_env.set('GOROOT_FINAL', self.spec.prefix)
+
diff --git a/var/spack/repos/builtin/packages/go/package.py b/var/spack/repos/builtin/packages/go/package.py
index f1057e6bed3b7f973f3b3dd0a7efac2bf376c9a6..28e0d1ba7f39089db95f89b793fdc260b0c93765 100644
--- a/var/spack/repos/builtin/packages/go/package.py
+++ b/var/spack/repos/builtin/packages/go/package.py
@@ -1,6 +1,7 @@
 import os
 import shutil
 import glob
+import llnl.util.tty as tty
 from spack import *
 
 
@@ -11,8 +12,6 @@ class Go(Package):
 
     extendable = True
 
-    # temporary fix until tags are pulled correctly
-    version('1.4.2', git='https://go.googlesource.com/go', tag='go1.4.2')
     version('1.5.4', git='https://go.googlesource.com/go', tag='go1.5.4')
     version('1.6.2', git='https://go.googlesource.com/go', tag='go1.6.2')
 
@@ -24,8 +23,8 @@ class Go(Package):
     provides('golang')
 
     # to-do, make non-c self-hosting compilers feasible without backflips
-    # should be go_compiler, but that creates an infinite loop
-    depends_on('gcc@5:', when='@1.5:')
+    # should be a dep on external go compiler
+    depends_on('go-bootstrap')
     depends_on('git')
 
     def install(self, spec, prefix):
@@ -47,34 +46,37 @@ def install(self, spec, prefix):
                 shutil.copy2(f, os.path.join(prefix, f))
 
     def setup_environment(self, spack_env, run_env):
-        # spack_env.set("GOROOT", self.spec.prefix)
-        # run_env.set("GOROOT", self.spec.prefix)
         spack_env.set('GOROOT_FINAL', self.spec.prefix)
-        spack_env.set('GOROOT_BOOTSTRAP', self.spec['gcc'].prefix)
+        spack_env.set('GOROOT_BOOTSTRAP', self.spec['go-bootstrap'].prefix)
 
     def setup_dependent_package(self, module, ext_spec):
-        #  Add a go command/compiler for extensions
-        module.go = Executable(join_path(self.spec.prefix.bin, 'go'))
-
-    def setup_dependent_environment(self, spack_env, run_env, ext_spec):
         """Called before go modules' install() methods.
 
-        In most cases, extensions will only need to have two lines::
+        In most cases, extensions will only need to set GOPATH and use go::
 
-        go('get', '<package>')
+        env = os.environ
+        env['GOPATH'] = self.source_path + ':' + env['GOPATH']
+        go('get', '<package>', env=env)
         shutil.copytree('bin', os.path.join(prefix, '/bin'))
         """
+        #  Add a go command/compiler for extensions
+        module.go = Executable(join_path(self.spec.prefix.bin, 'go'))
 
+    def setup_dependent_environment(self, spack_env, run_env, ext_spec):
         if os.environ.get('GOROOT', False):
             tty.warn('GOROOT is set, this is not recommended')
 
+        path_components = []
         # Set GOPATH to include paths of dependencies
-        for d in extension_spec.traverse():
+        for d in ext_spec.traverse():
             if d.package.extends(self.spec):
-                spack_env.prepend_path('GOPATH', d.prefix)
+                path_components.append(d.prefix)
 
         # This *MUST* be first, this is where new code is installed
-        spack_env.prepend_path('GOPATH', ext_spec.package.stage.source_path)
+        spack_env.set('GOPATH', ':'.join(path_components))
 
         # Allow packages to find this when using module or dotkit
-        run_env.prepend_path('GOPATH', ext_spec.prefix)
+        run_env.prepend_path('GOPATH', ':'.join(
+            [ext_spec.prefix] + path_components))
+
+
diff --git a/var/spack/repos/builtin/packages/hub/package.py b/var/spack/repos/builtin/packages/hub/package.py
index 5f3926533a350a0038413ad49c067905c045578b..ed8b742e42c4bd93355fbf18327626791ec94f62 100644
--- a/var/spack/repos/builtin/packages/hub/package.py
+++ b/var/spack/repos/builtin/packages/hub/package.py
@@ -1,4 +1,5 @@
 from spack import *
+import os
 
 
 class Hub(Package):
@@ -16,7 +17,8 @@ class Hub(Package):
     extends("go")
 
     def install(self, spec, prefix):
-        os.environ['GOPATH'] = os.getcwd()
+        env = os.environ
+        env['GOPATH'] = self.stage.source_path + ':' + env['GOPATH']
         bash = which('bash')
         bash(os.path.join('script', 'build'), '-o', os.path.join(prefix, 'bin',
                                                                  'hub'))
diff --git a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
index da21a0f65651746f3c586da72258ed160570151b..9c9a66cdefc9894edeafb6111fe0d1672e1c2064 100644
--- a/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
+++ b/var/spack/repos/builtin/packages/the_platinum_searcher/package.py
@@ -15,5 +15,7 @@ class ThePlatinumSearcher(Package):
     extends("go")
 
     def install(self, spec, prefix):
-        go('install', self.package)
+        env = os.environ
+        env['GOPATH'] = self.stage.source_path + ':' + env['GOPATH']
+        go('install', self.package, env=env)
         shutil.copytree('bin', os.path.join(prefix, 'bin'))