diff --git a/.gitignore b/.gitignore
index 67b192530..dabe0024c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /operator
+prometheus-config-reloader
 .build/
 *~
 *.tgz
@@ -10,4 +11,9 @@ __pycache__
 .env/
 .history/
 .vscode/
-tmp
\ No newline at end of file
+tmp
+
+# These are empty target files, created on every docker build. Their sole
+# purpose is to track the last target execution time to evalualte, whether the
+# container needds to be rebuild
+hack/*-image
diff --git a/.travis.yml b/.travis.yml
index d7e082e06..2211be460 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,27 +9,32 @@ before_install:
   - export PATH=$PATH:$HOME/.local/bin
 jobs:
   include:
+  - stage: Sanity check and tests
+
   # Check generated contents are up to date and code is formatted.
-  - stage: Sanity check and unit tests
-    script: ./scripts/check-make-generate.sh
-  - script: cd contrib/kube-prometheus && make test
-  # Build Prometheus config reloader
-  - script: cd contrib/prometheus-config-reloader && make build
+    script: make format generate-in-docker && git diff --exit-code
+  - script: cd contrib/kube-prometheus && make test-in-docker
   # Build Prometheus Operator rule config map to rule file crds cli tool
   - script: cd cmd/po-rule-migration && go install
   # Ensure vendor folder matches vendor.json
   - script: ./scripts/golang-dep-ensure.sh
   # Unit tests
-  - script: make test
+  - script: make test-unit
   # E2e tests
     script: ./scripts/travis-e2e.sh
   - script: ./scripts/travis-e2e-helm.sh
+
+
   - stage: deploy
+
     script: skip
     deploy:
       provider: script
       script: make helm-sync-s3
       on:
         branch: master
+
+
   - stage: push-docker-image
+
     script: ./scripts/travis-push-docker-image.sh
diff --git a/Dockerfile b/Dockerfile
index 11dc5668e..73333b9ae 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 FROM quay.io/prometheus/busybox:latest
 
-ADD .build/linux-amd64/operator /bin/operator
+ADD operator /bin/operator
 
 ENTRYPOINT ["/bin/operator"]
diff --git a/Makefile b/Makefile
index 2010c94f9..ce83d119c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,136 +1,222 @@
 SHELL=/bin/bash -o pipefail
+
 REPO?=quay.io/coreos/prometheus-operator
 TAG?=$(shell git rev-parse --short HEAD)
-NAMESPACE?=po-e2e-$(shell LC_ALL=C tr -dc a-z0-9 < /dev/urandom | head -c 13 ; echo '')
-KUBECONFIG?=$(HOME)/.kube/config
 
-PROMU := $(GOPATH)/bin/promu
-PREFIX ?= $(shell pwd)
-ifeq ($(GOBIN),)
-GOBIN :=${GOPATH}/bin
-endif
+PO_CRDGEN_BINARY:=$(GOPATH)/bin/po-crdgen
+OPENAPI_GEN_BINARY:=$(GOPATH)/bin/openapi-gen
+DEEPCOPY_GEN_BINARY:=$(GOPATH)/bin/deepcopy-gen
+GOJSONTOYAML_BINARY:=$(GOPATH)/bin/gojsontoyaml
+JB_BINARY:=$(GOPATH)/bin/jb
+PO_DOCGEN_BINARY:=$(GOPATH)/bin/po-docgen
+EMBEDMD_BINARY:=$(GOPATH)/bin/embedmd
+
+GOLANG_FILES:=$(shell find . -name \*.go -print)
 pkgs = $(shell go list ./... | grep -v /vendor/ | grep -v /test/)
 
-all: check-license format build test
 
-build: promu
-	@$(PROMU) build --prefix $(PREFIX)
+.PHONY: all
+all: format generate build test
 
-short-build:
-	go install github.com/coreos/prometheus-operator/cmd/operator
 
-po-crdgen:
-	go install github.com/coreos/prometheus-operator/cmd/po-crdgen
+############
+# Building #
+############
 
-crossbuild: promu
-	@$(PROMU) crossbuild
-	cd contrib/prometheus-config-reloader && make build
+.PHONY: build
+build: operator prometheus-config-reloader
 
-test:
-	@go test $(TEST_RUN_ARGS) -short $(pkgs)
+operator: $(GOLANG_FILES)
+	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o $@ cmd/operator/main.go
 
-format:
+prometheus-config-reloader:
+	GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o $@ cmd/$@/main.go
+
+pkg/client/monitoring/v1/zz_generated.deepcopy.go: $(DEEPCOPY_GEN_BINARY)
+	$(DEEPCOPY_GEN_BINARY) \
+	-i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1 \
+	--go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header" \
+	-v=4 \
+	--logtostderr \
+	--bounding-dirs "github.com/coreos/prometheus-operator/pkg/client" \
+	--output-file-base zz_generated.deepcopy
+
+pkg/client/monitoring/v1alpha1/zz_generated.deepcopy.go: $(DEEPCOPY_GEN_BINARY)
+	$(DEEPCOPY_GEN_BINARY) \
+	-i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1alpha1 \
+	--go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header" \
+	-v=4 \
+	--logtostderr \
+	--bounding-dirs "github.com/coreos/prometheus-operator/pkg/client" \
+	--output-file-base zz_generated.deepcopy
+
+.PHONY: image
+image: hack/operator-image hack/prometheus-config-reloader-image
+
+hack/operator-image: Dockerfile operator
+# Create empty target file, for the sole purpose of recording when this target
+# was last executed via the last-modification timestamp on the file. See
+# https://www.gnu.org/software/make/manual/make.html#Empty-Targets
+	docker build -t $(REPO):$(TAG) .
+	touch $@
+
+hack/prometheus-config-reloader-image: cmd/prometheus-config-reloader/Dockerfile prometheus-config-reloader
+# Create empty target file, for the sole purpose of recording when this target
+# was last executed via the last-modification timestamp on the file. See
+# https://www.gnu.org/software/make/manual/make.html#Empty-Targets
+	docker build -t quay.io/coreos/prometheus-config-reloader:$(TAG) -f cmd/prometheus-config-reloader/Dockerfile .
+	touch $@
+
+
+##############
+# Generating #
+##############
+
+.PHONY: generate
+generate: Documentation/*
+
+.PHONY: generate-in-docker
+generate-in-docker: hack/jsonnet-docker-image
+	docker run \
+	--rm \
+	-u=$(shell id -u $(USER)):$(shell id -g $(USER)) \
+	-v `pwd`:/go/src/github.com/coreos/prometheus-operator \
+	po-jsonnet make generate
+
+.PHONY: kube-prometheus
+kube-prometheus:
+	cd contrib/kube-prometheus; $(MAKE) generate
+
+example/prometheus-operator-crd/**.crd.yaml: pkg/client/monitoring/v1/openapi_generated.go $(PO_CRDGEN_BINARY)
+	po-crdgen prometheus > example/prometheus-operator-crd/prometheus.crd.yaml
+	po-crdgen alertmanager > example/prometheus-operator-crd/alertmanager.crd.yaml
+	po-crdgen servicemonitor > example/prometheus-operator-crd/servicemonitor.crd.yaml
+	po-crdgen prometheusrule > example/prometheus-operator-crd/prometheusrule.crd.yaml
+
+jsonnet/prometheus-operator/**-crd.libsonnet: example/prometheus-operator-crd/**.crd.yaml $(GOJSONTOYAML_BINARY)
+	cat example/prometheus-operator-crd/alertmanager.crd.yaml   | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/alertmanager-crd.libsonnet
+	cat example/prometheus-operator-crd/prometheus.crd.yaml     | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/prometheus-crd.libsonnet
+	cat example/prometheus-operator-crd/servicemonitor.crd.yaml | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/servicemonitor-crd.libsonnet
+	cat example/prometheus-operator-crd/prometheusrule.crd.yaml | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/prometheusrule-crd.libsonnet
+
+pkg/client/monitoring/v1/openapi_generated.go: $(OPENAPI_GEN_BINARY)
+	$(OPENAPI_GEN_BINARY) \
+	-i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/api/core/v1 \
+	-p github.com/coreos/prometheus-operator/pkg/client/monitoring/v1 \
+	--go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header"
+
+bundle.yaml: example/rbac/prometheus-operator/*.yaml
+	hack/generate-bundle.sh
+
+hack/generate/vendor: $(JB_BINARY) jsonnet/prometheus-operator/**
+	cd hack/generate; $(JB_BINARY) install;
+
+example/non-rbac/prometheus-operator.yaml: hack/generate/vendor hack/generate/prometheus-operator-non-rbac.jsonnet
+	hack/generate/build-non-rbac-prometheus-operator.sh
+
+example/rbac/prometheus-operator/*.yaml: hack/generate/vendor hack/generate/prometheus-operator-rbac.jsonnet
+	hack/generate/build-rbac-prometheus-operator.sh
+
+jsonnet/prometheus-operator/prometheus-operator.libsonnet: VERSION
+	sed -i                                                            \
+		"s/prometheusOperator: 'v.*',/prometheusOperator: 'v$(shell cat VERSION)',/" \
+		jsonnet/prometheus-operator/prometheus-operator.libsonnet;
+
+FULLY_GENERATED_DOCS = Documentation/api.md Documentation/compatibility.md
+TO_BE_EXTENDED_DOCS = $(filter-out $(FULLY_GENERATED_DOCS), $(wildcard Documentation/*.md))
+
+Documentation/api.md: $(PO_DOCGEN_BINARY) pkg/client/monitoring/v1/types.go
+	$(PO_DOCGEN_BINARY) api pkg/client/monitoring/v1/types.go > $@
+
+Documentation/compatibility.md: $(PO_DOCGEN_BINARY) pkg/prometheus/statefulset.go
+	$(PO_DOCGEN_BINARY) compatibility > $@
+
+$(TO_BE_EXTENDED_DOCS): $(EMBEDMD_BINARY) $(shell find example) kube-prometheus
+	$(EMBEDMD_BINARY) -w `find Documentation -name "*.md" | grep -v vendor`
+
+
+##############
+# Formatting #
+##############
+
+.PHONY: format
+format: go-fmt check-license
+
+.PHONY: go-fmt
+go-fmt:
 	go fmt $(pkgs)
 
+.PHONY: check-license
 check-license:
 	./scripts/check_license.sh
 
-container:
-	docker build -t $(REPO):$(TAG) .
-	cd contrib/prometheus-config-reloader && docker build -t quay.io/coreos/prometheus-config-reloader:$(TAG) .
 
-e2e-test:
+###########
+# Testing #
+###########
+
+.PHONY: test
+test: test-unit test-e2e
+
+.PHONY: test-unit
+test-unit:
+	@go test $(TEST_RUN_ARGS) -short $(pkgs)
+
+.PHONY: test-e2e
+test-e2e: NAMESPACE?=po-e2e-$(shell LC_ALL=C tr -dc a-z0-9 < /dev/urandom | head -c 13 ; echo '')
+test-e2e: KUBECONFIG?=$(HOME)/.kube/config
+test-e2e:
 	go test -timeout 55m -v ./test/e2e/ $(TEST_RUN_ARGS) --kubeconfig=$(KUBECONFIG) --operator-image=$(REPO):$(TAG) --namespace=$(NAMESPACE)
 
-e2e-status:
-	kubectl get prometheus,alertmanager,servicemonitor,statefulsets,deploy,svc,endpoints,pods,cm,secrets,replicationcontrollers --all-namespaces
-
-e2e: container
-	$(MAKE) e2e-test
-
-e2e-helm:
+.PHONY: test-e2e-helm
+test-e2e-helm:
 	./helm/hack/e2e-test.sh
 	# package the chart and verify if they have the version bumped
 	helm/hack/helm-package.sh "alertmanager grafana prometheus prometheus-operator exporter-kube-dns exporter-kube-scheduler exporter-kubelets exporter-node exporter-kube-controller-manager exporter-kube-etcd exporter-kube-state exporter-kubernetes exporter-coredns"
 	helm/hack/sync-repo.sh false
 
-clean-e2e:
-	kubectl -n $(NAMESPACE) delete prometheus,alertmanager,servicemonitor,statefulsets,deploy,svc,endpoints,pods,cm,secrets,replicationcontrollers --all
-	kubectl delete namespace $(NAMESPACE)
 
-promu:
-	@go get -u github.com/prometheus/promu
+########
+# Misc #
+########
 
-embedmd:
-	@go get github.com/campoy/embedmd
-
-po-docgen:
-	@go install github.com/coreos/prometheus-operator/cmd/po-docgen
-
-docs: embedmd po-docgen
-	$(GOPATH)/bin/embedmd -w `find Documentation contrib/kube-prometheus/ -name "*.md" | grep -v vendor`
-	$(GOPATH)/bin/po-docgen api pkg/client/monitoring/v1/types.go > Documentation/api.md
-	$(GOPATH)/bin/po-docgen compatibility > Documentation/compatibility.md
-
-generate: jsonnet-docker
-	docker run --rm -u=$(shell id -u $(USER)):$(shell id -g $(USER)) -v `pwd`:/go/src/github.com/coreos/prometheus-operator po-jsonnet make generate-deepcopy generate-openapi generate-crd jsonnet generate-bundle generate-kube-prometheus docs
-
-
-$(GOBIN)/openapi-gen:
-	go get -u -v -d k8s.io/code-generator/cmd/openapi-gen
-	cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10
-	go install k8s.io/code-generator/cmd/openapi-gen
-
-$(GOBIN)/deepcopy-gen:
-	go get -u -v -d k8s.io/code-generator/cmd/deepcopy-gen
-	cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10
-	go install k8s.io/code-generator/cmd/deepcopy-gen
-
-openapi-gen: $(GOBIN)/openapi-gen
-
-deepcopy-gen: $(GOBIN)/deepcopy-gen
-
-generate-deepcopy: deepcopy-gen
-	$(GOBIN)/deepcopy-gen -i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1 --go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header" -v=4 --logtostderr --bounding-dirs "github.com/coreos/prometheus-operator/pkg/client" --output-file-base zz_generated.deepcopy
-	$(GOBIN)/deepcopy-gen -i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1alpha1 --go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header" -v=4 --logtostderr --bounding-dirs "github.com/coreos/prometheus-operator/pkg/client" --output-file-base zz_generated.deepcopy
-
-generate-openapi: openapi-gen
-	$(GOBIN)/openapi-gen  -i github.com/coreos/prometheus-operator/pkg/client/monitoring/v1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/api/core/v1  -p github.com/coreos/prometheus-operator/pkg/client/monitoring/v1 --go-header-file="$(GOPATH)/src/github.com/coreos/prometheus-operator/.header"
-
-generate-bundle:
-	hack/generate-bundle.sh
-
-generate-kube-prometheus:
-	cd contrib/kube-prometheus; $(MAKE) generate-raw
-
-jsonnet: jb
-	# Update the Prometheus Operator version in kube-prometheus
-	sed -i                                                            \
-		"s/prometheusOperator: 'v.*',/prometheusOperator: 'v$(shell cat VERSION)',/" \
-		jsonnet/prometheus-operator/prometheus-operator.libsonnet;
-	cd hack/generate; jb install;
-	hack/generate/build-jsonnet.sh
-
-jb:
-	go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb
-
-jsonnet-docker:
+hack/jsonnet-docker-image: scripts/jsonnet/Dockerfile
 	docker build -f scripts/jsonnet/Dockerfile -t po-jsonnet .
+	touch $@
 
+.PHONY: helm-sync-s3
 helm-sync-s3:
 	helm/hack/helm-package.sh "alertmanager grafana prometheus prometheus-operator exporter-kube-dns exporter-kube-scheduler exporter-kubelets exporter-node exporter-kube-controller-manager exporter-kube-etcd exporter-kube-state exporter-kubernetes exporter-coredns"
 	helm/hack/sync-repo.sh true
 	helm/hack/helm-package.sh kube-prometheus
 	helm/hack/sync-repo.sh true
 
-generate-crd: generate-openapi po-crdgen
-	po-crdgen prometheus > example/prometheus-operator-crd/prometheus.crd.yaml
-	po-crdgen alertmanager > example/prometheus-operator-crd/alertmanager.crd.yaml
-	po-crdgen servicemonitor > example/prometheus-operator-crd/servicemonitor.crd.yaml
-	po-crdgen prometheusrule > example/prometheus-operator-crd/prometheusrule.crd.yaml
-	cat example/prometheus-operator-crd/alertmanager.crd.yaml   | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/alertmanager-crd.libsonnet
-	cat example/prometheus-operator-crd/prometheus.crd.yaml     | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/prometheus-crd.libsonnet
-	cat example/prometheus-operator-crd/servicemonitor.crd.yaml | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/servicemonitor-crd.libsonnet
-	cat example/prometheus-operator-crd/prometheusrule.crd.yaml | gojsontoyaml -yamltojson > jsonnet/prometheus-operator/prometheusrule-crd.libsonnet
 
-.PHONY: all build crossbuild test format check-license container e2e-test e2e-status e2e clean-e2e embedmd apidocgen docs generate-crd jb
+############
+# Binaries #
+############
+
+$(EMBEDMD_BINARY):
+	@go get github.com/campoy/embedmd
+
+$(JB_BINARY):
+	go get -u github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb
+
+$(PO_CRDGEN_BINARY): cmd/po-crdgen/**.go
+	go install github.com/coreos/prometheus-operator/cmd/po-crdgen
+
+$(PO_DOCGEN_BINARY): cmd/po-docgen/**.go
+	go install github.com/coreos/prometheus-operator/cmd/po-docgen
+
+$(OPENAPI_GEN_BINARY):
+	go get -u -v -d k8s.io/code-generator/cmd/openapi-gen
+	cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10
+	go install k8s.io/code-generator/cmd/openapi-gen
+
+$(DEEPCOPY_GEN_BINARY):
+	go get -u -v -d k8s.io/code-generator/cmd/deepcopy-gen
+	cd $(GOPATH)/src/k8s.io/code-generator; git checkout release-1.10
+	go install k8s.io/code-generator/cmd/deepcopy-gen
+
+$(GOJSONTOYAML_BINARY):
+	go get -u github.com/brancz/gojsontoyaml
diff --git a/contrib/prometheus-config-reloader/Dockerfile b/cmd/prometheus-config-reloader/Dockerfile
similarity index 100%
rename from contrib/prometheus-config-reloader/Dockerfile
rename to cmd/prometheus-config-reloader/Dockerfile
diff --git a/contrib/prometheus-config-reloader/main.go b/cmd/prometheus-config-reloader/main.go
similarity index 100%
rename from contrib/prometheus-config-reloader/main.go
rename to cmd/prometheus-config-reloader/main.go
diff --git a/contrib/kube-prometheus/Makefile b/contrib/kube-prometheus/Makefile
index fc1e79738..9cd7f86fb 100644
--- a/contrib/kube-prometheus/Makefile
+++ b/contrib/kube-prometheus/Makefile
@@ -1,26 +1,61 @@
 JSONNET_FMT := jsonnet fmt -n 2 --max-blank-lines 2 --string-style s --comment-style s
 
-image:
-	docker build -f ../../scripts/jsonnet/Dockerfile -t po-jsonnet ../../
+JB_BINARY:=$(GOPATH)/bin/jb
+EMBEDMD_BINARY:=$(GOPATH)/bin/embedmd
 
-generate: image
+# edit 1
+
+all: generate fmt test
+
+../../hack/jsonnet-docker-image: ../../scripts/jsonnet/Dockerfile
+# Create empty target file, for the sole purpose of recording when this target
+# was last executed via the last-modification timestamp on the file. See
+# https://www.gnu.org/software/make/manual/make.html#Empty-Targets
+	docker build -f - -t po-jsonnet . < ../../scripts/jsonnet/Dockerfile
+	touch $@
+
+generate-in-docker: ../../hack/jsonnet-docker-image
 	@echo ">> Compiling assets and generating Kubernetes manifests"
-	docker run --rm -u=$(shell id -u $(USER)):$(shell id -g $(USER)) -v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ --workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus po-jsonnet make generate-raw
+	docker run \
+	--rm \
+	-u=$(shell id -u $(USER)):$(shell id -g $(USER)) \
+	-v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ \
+	--workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus \
+	po-jsonnet make generate
 
-generate-raw: fmt
-	jb install
+generate: manifests/** **.md
+
+**.md: $(EMBEDMD_BINARY) $(shell find examples) build.sh example.jsonnet
+	echo '>>> inside **.md'
+	$(EMBEDMD_BINARY) -w `find . -name "*.md" | grep -v vendor`
+
+manifests/**: vendor/** example.jsonnet
 	./build.sh
 
+vendor/**: $(JB_BINARY) jsonnetfile.json
+	$(JB_BINARY) install
+
 fmt:
 	find . -name 'vendor' -prune -o -name '*.libsonnet' -o -name '*.jsonnet' -print | \
 		xargs -n 1 -- $(JSONNET_FMT) -i
 
-test: image
-	@echo ">> Compiling assets and generating Kubernetes manifests"
-	docker run --rm -u=$(shell id -u $(USER)):$(shell id -g $(USER)) -v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ --workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus po-jsonnet make test-raw
-
-test-raw: crdtojsonnet
-	jb install
+test: $(JB_BINARY)
+	$(JB_BINARY) install
 	./test.sh
 
-.PHONY: image generate crdtojsonnet generate-raw test test-raw fmt
+test-in-docker: ../../hack/jsonnet-docker-image
+	@echo ">> Compiling assets and generating Kubernetes manifests"
+	docker run \
+	--rm \
+	-u=$(shell id -u $(USER)):$(shell id -g $(USER)) \
+	-v $(shell dirname $(dir $(abspath $(dir $$PWD)))):/go/src/github.com/coreos/prometheus-operator/ \
+	--workdir /go/src/github.com/coreos/prometheus-operator/contrib/kube-prometheus \
+	po-jsonnet make test
+
+$(JB_BINARY):
+	go get -u github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb
+
+$(EMBEDMD_BINARY):
+	go get github.com/campoy/embedmd
+
+.PHONY: generate generate-in-docker test test-in-docker fmt
diff --git a/contrib/prometheus-config-reloader/.gitignore b/contrib/prometheus-config-reloader/.gitignore
deleted file mode 100644
index 0bae95193..000000000
--- a/contrib/prometheus-config-reloader/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-prometheus-config-reloader
diff --git a/contrib/prometheus-config-reloader/Makefile b/contrib/prometheus-config-reloader/Makefile
deleted file mode 100644
index f916f8df4..000000000
--- a/contrib/prometheus-config-reloader/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-all: build
-
-FLAGS =
-ENVVAR = GOOS=linux GOARCH=amd64 CGO_ENABLED=0
-NAME = prometheus-config-reloader
-REPO?=quay.io/coreos/$(NAME)
-TAG?=v0.20.0
-IMAGE = $(REPO):$(TAG)
-
-build:
-	$(ENVVAR) go build -o $(NAME) main.go
-
-container: build
-	docker build -t $(IMAGE) .
-
-push: container
-	docker push $(IMAGE)
-
-clean:
-	rm -f $(NAME)
-
-.PHONY: all build container push clean
diff --git a/contrib/prometheus-config-reloader/examples/prometheus-config-reloader.yaml b/contrib/prometheus-config-reloader/examples/prometheus-config-reloader.yaml
deleted file mode 100644
index 9469b240d..000000000
--- a/contrib/prometheus-config-reloader/examples/prometheus-config-reloader.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: prometheus-config-reloader-example
-data:
----
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: prometheus-config-reloader
-spec:
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: prometheus-config-reloader
-    spec:
-      volumes:
-      - name: rules
-        emptyDir: {}
-      - name: config
-        configMap:
-          name: prometheus-config-reloader-example
-      containers:
-      - name: ubuntu
-        image: ubuntu
-        command: ["sleep", "3600"]
-        volumeMounts:
-        - name: rules
-          mountPath: /etc/prometheus/rules
-          readOnly: true
-      - name: prometheus-config-reloader
-        image: quay.io/coreos/prometheus-config-reloader:v0.0.4
-        args:
-        - '-config-volume-dir=/etc/prometheus/config'
-        - '-rule-volume-dir=/etc/prometheus/rules'
-        - '-reload-url=http://localhost:9090/-/reload'
-        resources:
-          requests:
-            memory: "16Mi"
-            cpu: "50m"
-          limits:
-            memory: "32Mi"
-            cpu: "100m"
-        volumeMounts:
-        - name: config
-          readOnly: true
-          mountPath: /etc/prometheus/config
-        - name: rules
-          mountPath: /etc/prometheus/rules
-
diff --git a/contrib/prometheus-config-reloader/examples/updated-configmap.yaml b/contrib/prometheus-config-reloader/examples/updated-configmap.yaml
deleted file mode 100644
index 1a43a80b8..000000000
--- a/contrib/prometheus-config-reloader/examples/updated-configmap.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: prometheus-config-reloader-example
-data:
-  configmaps.json: |+
-    {
-      "items": [
-        {
-          "key": "default/test0"
-        },
-        {
-          "key": "default/test1"
-        },
-        {
-          "key": "default/test2"
-        }
-      ]
-    }
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: test0
-data:
-  test.rules: |+
-    test0
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: test1
-data:
-  test.rules: |+
-    test1
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: test2
-data:
-  test.rules: |+
-    test2
diff --git a/hack/generate/build-non-rbac-prometheus-operator.sh b/hack/generate/build-non-rbac-prometheus-operator.sh
new file mode 100755
index 000000000..8ef300bdd
--- /dev/null
+++ b/hack/generate/build-non-rbac-prometheus-operator.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+jsonnet -J hack/generate/vendor hack/generate/prometheus-operator-non-rbac.jsonnet | gojsontoyaml > example/non-rbac/prometheus-operator.yaml
diff --git a/hack/generate/build-jsonnet.sh b/hack/generate/build-rbac-prometheus-operator.sh
similarity index 68%
rename from hack/generate/build-jsonnet.sh
rename to hack/generate/build-rbac-prometheus-operator.sh
index f44c99306..438a68bb7 100755
--- a/hack/generate/build-jsonnet.sh
+++ b/hack/generate/build-rbac-prometheus-operator.sh
@@ -8,5 +8,3 @@ for file in "${files[@]}"
 do
     jq -r ".[\"${file}\"]" tmp/po.json | gojsontoyaml > "example/rbac/prometheus-operator/${file}"
 done
-
-jsonnet -J hack/generate/vendor hack/generate/prometheus-operator-non-rbac.jsonnet | gojsontoyaml > example/non-rbac/prometheus-operator.yaml
diff --git a/scripts/check-make-generate.sh b/scripts/check-make-generate.sh
deleted file mode 100755
index 2f931f865..000000000
--- a/scripts/check-make-generate.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-# exit immediately when a command fails
-set -e
-# only exit with zero if all commands of the pipeline exit successfully
-set -o pipefail
-# error on unset variables
-set -u
-# print each command before executing it
-set -x
-
-make check-license
-make format
-make generate
-
-git diff --exit-code
diff --git a/scripts/travis-e2e-helm.sh b/scripts/travis-e2e-helm.sh
index 6230644f3..092e2d531 100755
--- a/scripts/travis-e2e-helm.sh
+++ b/scripts/travis-e2e-helm.sh
@@ -18,6 +18,6 @@ mkdir .tmp || true
 wget https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.2.tar.gz -qO - | tar -xz -C .tmp/
 cd .tmp/util-linux-2.30.2 && ./autogen.sh && ./configure && make nsenter && sudo cp nsenter /usr/local/bin && cd -  
 
-make e2e-helm
+make test-e2e-helm
 
 $(dirname "$BASH_SOURCE")/delete-minikube.sh
diff --git a/scripts/travis-e2e.sh b/scripts/travis-e2e.sh
index e30f8b6e3..6edde9efa 100755
--- a/scripts/travis-e2e.sh
+++ b/scripts/travis-e2e.sh
@@ -13,7 +13,7 @@ $(dirname "$BASH_SOURCE")/create-minikube.sh
 # waiting for kube-dns to be ready
 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'; until kubectl -n kube-system get pods -lk8s-app=kube-dns -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True"; do sleep 1;echo "waiting for kube-dns to be available"; kubectl get pods --all-namespaces; done
 
-make crossbuild
-make e2e
+make build image
+make test-e2e
 
 $(dirname "$BASH_SOURCE")/delete-minikube.sh