diff --git a/.gitignore b/.gitignore
index 875c22e572fade469a60164ef89fe0f18bc34bac..a87d17f5edeaf74132d8e2bcee5f12f36674c856 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,9 @@
 /vendor/*
 /rootfs/manager/bin/manager
 /rootfs/manager/bin/kubectl
+/rootfs/manager/bin/v1.*
 /rootfs/resourcifier/bin/resourcifier
 /rootfs/resourcifier/bin/kubectl
+/rootfs/resourcifier/bin/v1.*
 /rootfs/expandybird/bin/expandybird
 /rootfs/expandybird/opt/expansion
diff --git a/rootfs/include.mk b/rootfs/include.mk
index 43d779adb0d06faa020529ebfcf04036c2f8bf4f..a7e3948d247ed93815acc426431b787d22f5a9e9 100644
--- a/rootfs/include.mk
+++ b/rootfs/include.mk
@@ -15,7 +15,17 @@
 # If you update this image please check the tag value before pushing.
 
 DOCKER_REGISTRY ?= gcr.io
-PREFIX := $(DOCKER_REGISTRY)/$(PROJECT)
+
+# Legacy support for $PROJECT
+DOCKER_PROJECT ?= $(PROJECT)
+
+# Support both local and remote repos, and support no project.
+ifdef $(DOCKER_PROJECT)
+PREFIX := $(DOCKER_REGISTRY)/$(DOCKER_PROJECT)
+else
+PREFIX := $(DOCKER_REGISTRY)
+endif
+
 FULL_IMAGE := $(PREFIX)/$(IMAGE)
 
 TAG ?= git-$(shell git rev-parse --short HEAD)
@@ -26,6 +36,7 @@ PLATFORM ?= $(DEFAULT_PLATFORM)
 DEFAULT_ARCH := $(shell uname -m)
 ARCH ?= $(DEFAULT_ARCH)
 
+
 .PHONY: info
 info:
 	@echo "Build tag: ${TAG}"
@@ -51,10 +62,12 @@ container: .project .docker binary extras
 	docker tag -f $(FULL_IMAGE):latest $(FULL_IMAGE):$(TAG)
 
 .project:
-	@if [[ -z "${PROJECT}" ]]; then echo "PROJECT variable must be set"; exit 1; fi
+ifeq ($(DOCKER_REGISTRY), gcr.io)
+	$(error "One or both of DOCKER_REGISTRY and DOCKER_PROJECT must be set.")
+endif
 
 .docker:
-	@if [[ -z `which docker` ]] || ! docker version &> /dev/null; then echo "docker is not installed correctly"; exit 1; fi
+	@if [[ -z `which docker` ]] || ! docker --version &> /dev/null; then echo "docker is not installed correctly"; exit 1; fi
 
 CROSS_IMAGE := $(PLATFORM)-$(ARCH)/$(IMAGE)/$(IMAGE)
 
@@ -67,3 +80,11 @@ binary:
 		echo cp ../../bin/$(IMAGE) ./bin ; \
 		cp ../../bin/$(IMAGE) ./bin ; \
 	fi
+
+.PHONY: kubectl
+kubectl:
+ifeq ("$(wildcard bin/$(KUBE_VERSION))", "")
+	touch bin/$(KUBE_VERSION)
+	curl -fsSL -o bin/kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBE_VERSION}/bin/linux/amd64/kubectl
+	chmod +x bin/kubectl
+endif
diff --git a/rootfs/manager/Makefile b/rootfs/manager/Makefile
index 4c38b8e40dac75911f30f8d6cd1f43826d950067..0b1f4c681b88d7c8c0dfd6c96d8e289b3c6a352a 100644
--- a/rootfs/manager/Makefile
+++ b/rootfs/manager/Makefile
@@ -19,8 +19,3 @@ include ../include.mk
 
 .PHONY: extras
 extras: kubectl
-
-.PHONY: kubectl
-kubectl:
-	curl -fsSL -o bin/kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBE_VERSION}/bin/linux/amd64/kubectl
-	chmod +x bin/kubectl
diff --git a/rootfs/resourcifier/Makefile b/rootfs/resourcifier/Makefile
index d1a62ebca6003eebb4972d7218ad2854d09a7365..bbf66ee66b79323ec3a33367c4c54c7b3afd7582 100644
--- a/rootfs/resourcifier/Makefile
+++ b/rootfs/resourcifier/Makefile
@@ -19,8 +19,3 @@ include ../include.mk
 
 .PHONY: extras
 extras: kubectl
-
-.PHONY: kubectl
-kubectl:
-	curl -fsSL -o bin/kubectl https://storage.googleapis.com/kubernetes-release/release/${KUBE_VERSION}/bin/linux/amd64/kubectl
-	chmod +x bin/kubectl