VOL-1613: Redo Makefile and Dockerfile to new standard

Needed for proper releases

Also update system-test compose and docs needed to
run images using new build.

Change-Id: Idc00317de476fe943ec937977bf863a46c1e8305
diff --git a/.gitignore b/.gitignore
index ef199d3..1c464a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,9 +13,6 @@
 .vagrant
 *.box
 
-# venv
-.venv
-
 # Ansible
 ansible/*.retry
 
@@ -23,12 +20,7 @@
 *.swp
 
 # Virtualenv
-venv
-venv-darwin
-venv-linux
-adapters/venv
-adapters/venv-linux
-adapters/venv-darwin
+python/venv-*
 
 # Protobuf output files
 python/**/*_pb2.py
diff --git a/Makefile b/Makefile
index 79f4baa..147b405 100644
--- a/Makefile
+++ b/Makefile
@@ -14,52 +14,37 @@
 # limitations under the License.
 #
 
-SHELL=/bin/bash -e -o pipefail
+# set default shell
+SHELL = bash -e -o pipefail
 
 # Variables
-VERSION			?= $(shell cat ./VERSION)
+VERSION                  ?= $(shell cat ./VERSION)
 
-ifeq ($(TAG),)
-TAG := latest
+## Docker related
+DOCKER_REGISTRY          ?=
+DOCKER_REPOSITORY        ?=
+DOCKER_BUILD_ARGS        ?=
+DOCKER_TAG               ?= ${VERSION}
+RWCORE_IMAGENAME         := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-rw-core:${DOCKER_TAG}
+ROCORE_IMAGENAME         := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-ro-core:${DOCKER_TAG}
+AFROUTER_IMAGENAME       := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}afrouter:${DOCKER_TAG}
+AFROUTERTEST_IMAGENAME   := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}afroutertest:${DOCKER_TAG}
+AFROUTERD_IMAGENAME      := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}afrouterd:${DOCKER_TAG}
+SIMULATEDOLT_IMAGENAME   := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-adapter-simulated-olt:${DOCKER_TAG}
+SIMULATEDONU_IMAGENAME   := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-adapter-simulated-onu:${DOCKER_TAG}
+
+## Docker labels. Only set ref and commit date if committed
+DOCKER_LABEL_VCS_URL     ?= $(shell git remote get-url $(shell git remote))
+DOCKER_LABEL_BUILD_DATE  ?= $(shell date -u "+%Y-%m-%dT%H:%M:%SZ")
+DOCKER_LABEL_COMMIT_DATE = $(shell git show -s --format=%cd --date=iso-strict HEAD)
+
+ifeq ($(shell git ls-files --others --modified --exclude-standard 2>/dev/null | wc -l | sed -e 's/ //g'),0)
+  DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD)
+else
+  DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD)+dirty
 endif
 
-ifeq ($(TARGET_TAG),)
-TARGET_TAG := latest
-endif
-
-# If no DOCKER_HOST_IP is specified grab a v4 IP address associated with
-# the default gateway
-ifeq ($(DOCKER_HOST_IP),)
-DOCKER_HOST_IP := $(shell ifconfig $$(netstat -rn | grep -E '^(default|0.0.0.0)' | head -1 | awk '{print $$NF}') | grep inet | awk '{print $$2}' | sed -e 's/addr://g')
-endif
-
-
-ifneq ($(http_proxy)$(https_proxy),)
-# Include proxies from the environment
-DOCKER_PROXY_ARGS = \
-       --build-arg http_proxy=$(http_proxy) \
-       --build-arg https_proxy=$(https_proxy) \
-       --build-arg ftp_proxy=$(ftp_proxy) \
-       --build-arg no_proxy=$(no_proxy) \
-       --build-arg HTTP_PROXY=$(HTTP_PROXY) \
-       --build-arg HTTPS_PROXY=$(HTTPS_PROXY) \
-       --build-arg FTP_PROXY=$(FTP_PROXY) \
-       --build-arg NO_PROXY=$(NO_PROXY)
-endif
-
-DOCKER_BUILD_ARGS = \
-	--build-arg TAG=$(TAG) \
-	--build-arg REGISTRY=$(REGISTRY) \
-	--build-arg REPOSITORY=$(REPOSITORY) \
-	$(DOCKER_PROXY_ARGS) $(DOCKER_CACHE_ARG) \
-	 --rm --force-rm \
-	$(DOCKER_BUILD_EXTRA_ARGS)
-
-DOCKER_IMAGE_LIST = \
-	rw_core
-
-
-.PHONY: $(DIRS) $(DIRS_CLEAN) $(DIRS_FLAKE8) rw_core ro_core protos kafka db tests python simulators k8s afrouter arouterd base
+.PHONY: rw_core ro_core simulated_olt simulated_onu afrouter afrouterd local-protos
 
 # This should to be the first and default target in this Makefile
 help:
@@ -68,63 +53,115 @@
 	@echo
 	@echo "build         : Build the docker images."
 	@echo "                  - If this is the first time you are building, choose 'make build' option."
-	@echo "rw_core       : Build the rw_core docker container"
-	@echo "ro_core       : Build the ro_core docker container"
-	@echo "afrouter      : Build the afrouter docker container"
-	@echo "afrouterTest  : Build the afrouterTest docker container"
-	@echo "afrouterd     : Build the afrouterd docker container"
-	@echo "simulated_olt : Build the simulated_olt docker container"
-	@echo "simulated_onu : Build the simulated_onu docker container"
+	@echo "rw_core       : Build the rw_core docker image"
+	@echo "ro_core       : Build the ro_core docker image"
+	@echo "afrouter      : Build the afrouter docker image"
+	@echo "afrouterTest  : Build the afrouterTest docker image"
+	@echo "afrouterd     : Build the afrouterd docker image"
+	@echo "simulated_olt : Build the simulated_olt docker image"
+	@echo "simulated_onu : Build the simulated_onu docker image"
+	@echo "docker-push   : Push the docker images to an external repository"
 	@echo "lint-style    : Verify code is properly gofmt-ed"
 	@echo "lint-sanity   : Verify that 'go vet' doesn't report any issues"
-	@echo "lint-dep      : Verify the integrity of the `dep` files"
+	@echo "lint-dep      : Verify the integrity of the 'dep' files"
 	@echo "lint          : Shorthand for lint-style & lint-sanity"
 	@echo "test          : Generate reports for all go tests"
 	@echo
 
 
-# Parallel Build
-$(DIRS):
-	@echo "    MK $@"
-	$(Q)$(MAKE) -C $@
+## Docker targets
 
-# Parallel Clean
-DIRS_CLEAN = $(addsuffix .clean,$(DIRS))
-$(DIRS_CLEAN):
-	@echo "    CLEAN $(basename $@)"
-	$(Q)$(MAKE) -C $(basename $@) clean
+build: docker-build
 
-build: containers
+docker-build: rw_core ro_core simulated_olt simulated_onu afrouter afrouterd
 
-containers: base rw_core ro_core simulated_olt simulated_onu afrouter arouterd
-
-base:
+local-protos:
 ifdef LOCAL_PROTOS
 	mkdir -p vendor/github.com/opencord/voltha-protos/go
 	cp -r ${GOPATH}/src/github.com/opencord/voltha-protos/go/* vendor/github.com/opencord/voltha-protos/go
 endif
-	docker build $(DOCKER_BUILD_ARGS) -t base:latest -f docker/Dockerfile.base .
 
-afrouter: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}afrouter:${TAG} -f docker/Dockerfile.arouter .
+afrouter: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${AFROUTER_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.afrouter .
 
-afrouterTest: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}afroutertest:${TAG} -f docker/Dockerfile.arouterTest .
+afrouterTest: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${AFROUTERTEST_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.afrouterTest .
 
-arouterd: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}afrouterd:${TAG} -f docker/Dockerfile.arouterd .
+afrouterd: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${AFROUTERD_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.afrouterd .
 
-rw_core: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-rw-core:${TAG} -f docker/Dockerfile.rw_core .
+rw_core: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${RWCORE_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.rw_core .
 
-ro_core: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-ro-core:${TAG} -f docker/Dockerfile.ro_core .
+ro_core: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${ROCORE_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.ro_core .
 
-simulated_olt: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-adapter-simulated-olt:${TAG} -f docker/Dockerfile.simulated_olt .
+simulated_olt: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${SIMULATEDOLT_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.simulated_olt .
 
-simulated_onu: base
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-adapter-simulated-onu:${TAG} -f docker/Dockerfile.simulated_onu .
+simulated_onu: local-protos
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${SIMULATEDONU_IMAGENAME} \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.simulated_onu .
+
+docker-push:
+	docker push ${AFROUTER_IMAGENAME}
+	docker push ${AFROUTERTEST_IMAGENAME}
+	docker push ${AFROUTERD_IMAGENAME}
+	docker push ${RWCORE_IMAGENAME}
+	docker push ${ROCORE_IMAGENAME}
+	docker push ${SIMULATEDOLT_IMAGENAME}
+	docker push ${SIMULATEDONU_IMAGENAME}
+
+
+## lint and unit tests
 
 lint-style:
 ifeq (,$(shell which gofmt))
diff --git a/compose/system-test.yml b/compose/system-test.yml
index 1d6bc51..71dea7c 100644
--- a/compose/system-test.yml
+++ b/compose/system-test.yml
@@ -29,6 +29,7 @@
     - 2181:2181
     networks:
     - default
+    restart: unless-stopped
 
 
   kafka:
@@ -45,6 +46,7 @@
      - 9092:9092
     networks:
     - default
+    restart: unless-stopped
 
 
   etcd:
@@ -66,10 +68,11 @@
     - 4001
     networks:
     - default
+    restart: unless-stopped
 
 
   rw_core:
-    image: voltha-rw-core
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-rw-core:${DOCKER_TAG}"
     entrypoint:
         - /app/rw_core
         - -kv_store_type=etcd
@@ -95,7 +98,7 @@
 
 
   cli:
-    image: "${REGISTRY}${REPOSITORY}voltha-cli:latest"
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-cli:${DOCKER_TAG}"
     logging:
       driver: "json-file"
       options:
@@ -110,10 +113,11 @@
     - default
     ports:
     - "5022:22"
+    restart: unless-stopped
 
 
   ofagent:
-    image: "${REGISTRY}${REPOSITORY}voltha-ofagent:latest"
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-ofagent:${DOCKER_TAG}"
     logging:
       driver: "json-file"
       options:
@@ -135,7 +139,7 @@
 
 
   onos:
-    image: "voltha/voltha-onos:latest"
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-onos:${DOCKER_TAG}"
     ports:
     - "8101:8101" # ssh
     - "6653:6653" # OF
@@ -151,7 +155,7 @@
 
 
   adapter_openolt:
-    image: "${REGISTRY}${REPOSITORY}voltha-openolt-adapter${TAG}"
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-openolt-adapter:${DOCKER_TAG}"
     logging:
       driver: "json-file"
       options:
@@ -173,7 +177,7 @@
 
 
   adapter_openonu:
-    image: "${REGISTRY}${REPOSITORY}voltha-openonu-adapter${TAG}"
+    image: "${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-openonu-adapter:${DOCKER_TAG}"
     logging:
       driver: "json-file"
       options:
diff --git a/docker/Dockerfile.afrouter b/docker/Dockerfile.afrouter
new file mode 100644
index 0000000..de2646f
--- /dev/null
+++ b/docker/Dockerfile.afrouter
@@ -0,0 +1,74 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -------------
+# Build stage
+
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
+
+WORKDIR $GOPATH/src/github.com/opencord/voltha-go
+
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
+# Copy files
+COPY rw_core ./rw_core
+COPY afrouter ./afrouter
+
+# Copy config and runtime protobuf needed for routing
+RUN cp afrouter/arouter.json /build
+RUN cp vendor/github.com/opencord/voltha-protos/go/voltha.pb /build
+
+# Build
+RUN cd afrouter && go build -o /build/afrouter
+
+# -------------
+# Image creation stage
+
+FROM alpine:3.9.4
+
+# Set the working directory
+WORKDIR /app
+
+# Copy required files
+COPY --from=build-env /build/afrouter /app/
+COPY --from=build-env /build/arouter.json /app/
+COPY --from=build-env /build/voltha.pb /app
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=afrouter \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.afrouterTest b/docker/Dockerfile.afrouterTest
new file mode 100644
index 0000000..3f159d6
--- /dev/null
+++ b/docker/Dockerfile.afrouterTest
@@ -0,0 +1,88 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -------------
+# Build stage
+
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
+
+WORKDIR $GOPATH/src/github.com/opencord/voltha-go
+
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
+# Copy files
+COPY rw_core ./rw_core
+COPY afrouter ./afrouter
+COPY tests/afrouter ./tests/afrouter
+COPY tests/afrouter /build/tests
+
+# Copy proto files
+COPY vendor/ $GOPATH/src
+
+# Copy config and runtime protobuf needed for routing
+RUN cp afrouter/arouter.json /build/tests/suites/
+RUN cp vendor/github.com/opencord/voltha-protos/go/voltha.pb /build/tests/suites/
+
+# Build
+RUN cd afrouter && go build --tags integration -o /build/afrouter
+RUN cd tests/afrouter && go build --tags integration -o /build/afrouterTest
+
+# Run tests
+RUN cd /build/tests/suites && /build/afrouterTest -config main.json -logLevel 1
+
+# -------------
+# Image creation stage
+
+FROM alpine:3.9.4
+
+# Set the working directory
+WORKDIR /app
+
+# Copy required files
+COPY --from=build-env /build/afrouter /app/tests/
+COPY --from=build-env /build/afrouterTest /app/tests/
+COPY --from=build-env /build/tests/suites/arouter.json /app/
+COPY --from=build-env /build/tests/suites/voltha.pb /app/tests/
+COPY --from=build-env /build/tests /app/tests/
+COPY --from=build-env /src/tests /app/tests/
+
+CMD tests/runAll tests
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=afroutertest \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.afrouterd b/docker/Dockerfile.afrouterd
new file mode 100644
index 0000000..242984a
--- /dev/null
+++ b/docker/Dockerfile.afrouterd
@@ -0,0 +1,73 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# -------------
+# Build stage
+
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
+
+WORKDIR $GOPATH/src/github.com/opencord/voltha-go
+
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
+# Copy files
+COPY rw_core ./rw_core
+COPY afrouter ./afrouter
+COPY arouterd ./arouterd
+
+# Copy config
+RUN cp afrouter/arouter.json /build
+
+# Build
+RUN cd arouterd && go build -o /build/arouterd
+
+# -------------
+# Image creation stage
+
+FROM alpine:3.9.4
+
+# Set the working directory
+WORKDIR /app
+
+# Copy required files
+COPY --from=build-env /build/arouterd /app/
+COPY --from=build-env /build/arouter.json /app/
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=afrouterd \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.arouter b/docker/Dockerfile.arouter
deleted file mode 100644
index 659d78b..0000000
--- a/docker/Dockerfile.arouter
+++ /dev/null
@@ -1,32 +0,0 @@
-# -------------
-# Build stage
-
-FROM base AS build-env
-
-WORKDIR $GOPATH/src/github.com/opencord/voltha-go
-
-# Copy files
-COPY rw_core ./rw_core
-COPY afrouter ./afrouter
-
-# Copy config and runtime protobuf needed for routing
-RUN cp afrouter/arouter.json /build
-RUN cp vendor/github.com/opencord/voltha-protos/go/voltha.pb /build
-
-# Build
-RUN cd afrouter && go build -o /build/afrouter
-
-
-# -------------
-# Image creation stage
-
-FROM alpine:3.9
-
-# Set the working directory
-WORKDIR /app
-
-# Copy required files
-COPY --from=build-env /build/afrouter /app/
-COPY --from=build-env /build/arouter.json /app/
-COPY --from=build-env /build/voltha.pb /app
-
diff --git a/docker/Dockerfile.arouterTest b/docker/Dockerfile.arouterTest
deleted file mode 100644
index 5fbfc12..0000000
--- a/docker/Dockerfile.arouterTest
+++ /dev/null
@@ -1,44 +0,0 @@
-# -------------
-# Build stage
-
-FROM base AS build-env
-
-WORKDIR $GOPATH/src/github.com/opencord/voltha-go
-
-# Copy files
-COPY rw_core ./rw_core
-COPY afrouter ./afrouter
-COPY tests/afrouter ./tests/afrouter
-COPY tests/afrouter /build/tests
-
-# Copy proto files
-COPY vendor/ $GOPATH/src
-
-# Copy config and runtime protobuf needed for routing
-RUN cp afrouter/arouter.json /build/tests/suites/
-RUN cp vendor/github.com/opencord/voltha-protos/go/voltha.pb /build/tests/suites/
-
-# Build
-RUN cd afrouter && go build --tags integration -o /build/afrouter
-RUN cd tests/afrouter && go build --tags integration -o /build/afrouterTest
-
-# Run tests
-RUN cd /build/tests/suites && /build/afrouterTest -config main.json -logLevel 1
-
-# -------------
-# Image creation stage
-
-FROM alpine:3.9
-
-# Set the working directory
-WORKDIR /app
-
-# Copy required files
-COPY --from=build-env /build/afrouter /app/tests/
-COPY --from=build-env /build/afrouterTest /app/tests/
-COPY --from=build-env /build/tests/suites/arouter.json /app/
-COPY --from=build-env /build/tests/suites/voltha.pb /app/tests/
-COPY --from=build-env /build/tests /app/tests/
-COPY --from=build-env /src/tests /app/tests/
-
-CMD tests/runAll tests
diff --git a/docker/Dockerfile.arouterd b/docker/Dockerfile.arouterd
deleted file mode 100644
index 59fac45..0000000
--- a/docker/Dockerfile.arouterd
+++ /dev/null
@@ -1,31 +0,0 @@
-# -------------
-# Build stage
-
-FROM base AS build-env
-
-WORKDIR $GOPATH/src/github.com/opencord/voltha-go
-
-# Copy files
-COPY rw_core ./rw_core
-COPY afrouter ./afrouter
-COPY arouterd ./arouterd
-
-# Copy config
-RUN cp afrouter/arouter.json /build
-
-# Build
-RUN cd arouterd && go build -o /build/arouterd
-
-
-# -------------
-# Image creation stage
-
-FROM alpine:3.9
-
-# Set the working directory
-WORKDIR /app
-
-# Copy required files
-COPY --from=build-env /build/arouterd /app/
-COPY --from=build-env /build/arouter.json /app/
-
diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base
deleted file mode 100644
index d07aacb..0000000
--- a/docker/Dockerfile.base
+++ /dev/null
@@ -1,20 +0,0 @@
-# -------------
-# Build stage
-
-FROM golang:1.10-alpine3.9
-
-# Install required packages
-RUN apk add --no-cache wget git make build-base
-
-# Prepare directory structure
-RUN ["mkdir", "-p", "/build"]
-RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
-RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
-
-WORKDIR $GOPATH/src/github.com/opencord/voltha-go
-
-# Copy common files.
-COPY common ./common
-COPY db ./db
-COPY kafka ./kafka
-COPY vendor ./vendor
diff --git a/docker/Dockerfile.ro_core b/docker/Dockerfile.ro_core
index 8d561c2..8f870bc 100644
--- a/docker/Dockerfile.ro_core
+++ b/docker/Dockerfile.ro_core
@@ -1,21 +1,49 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # -------------
 # Build stage
 
-FROM base AS build-env
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
 
 WORKDIR $GOPATH/src/github.com/opencord/voltha-go
 
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
 # Copy files.
 COPY ro_core ./ro_core
 
 # Build
 RUN cd ro_core && go build -o /build/ro_core
 
-
 # -------------
 # Image creation stage
 
-FROM alpine:3.9
+FROM alpine:3.9.4
 
 # Set the working directory
 WORKDIR /app
@@ -23,3 +51,17 @@
 # Copy required files
 COPY --from=build-env /build/ro_core /app/
 
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-ro-core \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.rw_core b/docker/Dockerfile.rw_core
index ca83f13..11dedce 100644
--- a/docker/Dockerfile.rw_core
+++ b/docker/Dockerfile.rw_core
@@ -1,21 +1,49 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # -------------
 # Build stage
 
-FROM base AS build-env
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
 
 WORKDIR $GOPATH/src/github.com/opencord/voltha-go
 
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
 # Copy files
 COPY rw_core ./rw_core
 
 # Build
 RUN cd rw_core && go build -o /build/rw_core
 
-
 # -------------
 # Image creation stage
 
-FROM alpine:3.9
+FROM alpine:3.9.4
 
 # Set the working directory
 WORKDIR /app
@@ -23,3 +51,17 @@
 # Copy required files
 COPY --from=build-env /build/rw_core /app/
 
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-rw-core \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.simulated_olt b/docker/Dockerfile.simulated_olt
index 4a3f548..3475172 100644
--- a/docker/Dockerfile.simulated_olt
+++ b/docker/Dockerfile.simulated_olt
@@ -1,10 +1,39 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # -------------
 # Build stage
 
-FROM base AS build-env
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
 
 WORKDIR $GOPATH/src/github.com/opencord/voltha-go
 
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
 # Copy files
 COPY adapters/simulated_olt ./adapters/simulated_olt
 COPY adapters/common ./adapters/common
@@ -13,14 +42,27 @@
 # Build
 RUN cd adapters/simulated_olt && go build -o /build/simulated_olt
 
-
 # -------------
 # Image creation stage
 
-FROM alpine:3.9 
+FROM alpine:3.9.4 
 # Set the working directory
 WORKDIR /app
 
 # Copy required files
 COPY --from=build-env /build/simulated_olt /app/
 
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-adapter-simulated-olt \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/docker/Dockerfile.simulated_onu b/docker/Dockerfile.simulated_onu
index d5df9cf..ce26973 100644
--- a/docker/Dockerfile.simulated_onu
+++ b/docker/Dockerfile.simulated_onu
@@ -1,10 +1,39 @@
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # -------------
 # Build stage
 
-FROM base AS build-env
+FROM golang:1.12-alpine3.9 AS build-env
+
+# Install required packages
+RUN apk add --no-cache wget git make build-base protobuf protobuf-dev
+
+# Prepare directory structure
+RUN ["mkdir", "-p", "/build"]
+RUN ["mkdir", "-p", "$GOPATH/src", "$GOPATH/pkg", "$GOPATH/bin"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord"]
+RUN ["mkdir", "-p", "$GOPATH/src/github.com/opencord/voltha-go"]
 
 WORKDIR $GOPATH/src/github.com/opencord/voltha-go
 
+# Copy common files.
+COPY common ./common
+COPY db ./db
+COPY kafka ./kafka
+COPY vendor ./vendor
+
 # Copy files
 COPY adapters/simulated_onu ./adapters/simulated_onu
 COPY adapters/common ./adapters/common
@@ -13,11 +42,10 @@
 # Build
 RUN cd adapters/simulated_onu && go build -o /build/simulated_onu
 
-
 # -------------
 # Image creation stage
 
-FROM alpine:3.9
+FROM alpine:3.9.4
 
 # Set the working directory
 WORKDIR /app
@@ -25,3 +53,17 @@
 # Copy required files
 COPY --from=build-env /build/simulated_onu /app/
 
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-adapter-simulated-onu \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/python/Makefile b/python/Makefile
index 4fa911e..4fd5fe2 100644
--- a/python/Makefile
+++ b/python/Makefile
@@ -14,227 +14,153 @@
 # limitations under the License.
 #
 
-ifneq ($(VOLTHA_BUILD),docker)
-ifeq ($(VOLTHA_BASE)_set,_set)
-$(error To get started, please source the env.sh file)
-endif
+# set default shell
+SHELL = bash -e -o pipefail
+
+# Variables
+VERSION                  ?= $(shell cat ../VERSION)
+
+## Docker related
+DOCKER_REGISTRY          ?=
+DOCKER_REPOSITORY        ?=
+DOCKER_BUILD_ARGS        ?=
+DOCKER_TAG               ?= ${VERSION}
+OFAGENT_IMAGENAME        := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-ofagent:${DOCKER_TAG}
+CLI_IMAGENAME            := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-cli:${DOCKER_TAG}
+PONSIMOLT_IMAGENAME      := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-adapter-ponsim-olt:${DOCKER_TAG}
+PONSIMONU_IMAGENAME      := ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}voltha-adapter-ponsim-onu:${DOCKER_TAG}
+
+## Docker labels. Only set ref and commit date if committed
+DOCKER_LABEL_VCS_URL     ?= $(shell git remote get-url $(shell git remote))
+DOCKER_LABEL_BUILD_DATE  ?= $(shell date -u "+%Y-%m-%dT%H:%M:%SZ")
+DOCKER_LABEL_COMMIT_DATE = $(shell git show -s --format=%cd --date=iso-strict HEAD)
+
+ifeq ($(shell git ls-files --others --modified --exclude-standard 2>/dev/null | wc -l | sed -e 's/ //g'),0)
+  DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD)
+else
+  DOCKER_LABEL_VCS_REF = $(shell git rev-parse HEAD)+dirty
 endif
 
-ifeq ($(TAG),)
-TAG := latest
-endif
-
-ifeq ($(TARGET_TAG),)
-TARGET_TAG := latest
-endif
-
-# If no DOCKER_HOST_IP is specified grab a v4 IP address associated with
-# the default gateway
-ifeq ($(DOCKER_HOST_IP),)
-DOCKER_HOST_IP := $(shell ifconfig $$(netstat -rn | grep -E '^(default|0.0.0.0)' | head -1 | awk '{print $$NF}') | grep inet | awk '{print $$2}' | sed -e 's/addr://g')
-endif
-
-ifneq ($(http_proxy)$(https_proxy),)
-# Include proxies from the environment
-DOCKER_PROXY_ARGS = \
-       --build-arg http_proxy=$(http_proxy) \
-       --build-arg https_proxy=$(https_proxy) \
-       --build-arg ftp_proxy=$(ftp_proxy) \
-       --build-arg no_proxy=$(no_proxy) \
-       --build-arg HTTP_PROXY=$(HTTP_PROXY) \
-       --build-arg HTTPS_PROXY=$(HTTPS_PROXY) \
-       --build-arg FTP_PROXY=$(FTP_PROXY) \
-       --build-arg NO_PROXY=$(NO_PROXY)
-endif
-
-DOCKER_BUILD_ARGS = \
-	--build-arg TAG=$(TAG) \
-	--build-arg REGISTRY=$(REGISTRY) \
-	--build-arg REPOSITORY=$(REPOSITORY) \
-	$(DOCKER_PROXY_ARGS) $(DOCKER_CACHE_ARG) \
-	 --rm --force-rm \
-	$(DOCKER_BUILD_EXTRA_ARGS)
-
-DOCKER_BUILD_EXTRA_ARGS = \
-	--build-arg LOCAL_PYVOLTHA=${LOCAL_PYVOLTHA} \
-	--build-arg LOCAL_PROTOS=${LOCAL_PROTOS}
-
-VENVDIR := venv-$(shell uname -s | tr '[:upper:]' '[:lower:]')
-
-DOCKER_IMAGE_LIST = \
-	base \
-	adapter-ponsim-olt \
-	adapter-ponsim-onu
-
-# The following list was scavanged from the compose / stack files as well as
-# from the Dockerfiles. If nothing else it highlights that VOLTHA is not
-# using consistent versions for some of the containers.
-
-FETCH_BUILD_IMAGE_LIST = \
-       alpine:3.6 \
-       centos:7 \
-       centurylink/ca-certs:latest \
-       grpc/python:latest \
-       ubuntu:xenial
-
-FETCH_COMPOSE_IMAGE_LIST = \
-        wurstmeister/kafka:latest \
-        wurstmeister/zookeeper:latest
-
-# find k8s -type f | xargs grep image: | awk '{print $NF}' | sed -e 's/\"//g' | sed '/:.*$/!s/$/:latest/g' | sort -u | sed -e 's/^/       /g' -e 's/$/ \\/g'
-# Manually remove some image from this list as they don't reflect the new 
-# naming conventions for the VOLTHA build
-FETCH_K8S_IMAGE_LIST = \
-       wurstmeister/kafka:1.0.0 \
-       zookeeper:3.4.11
-
-FETCH_IMAGE_LIST = $(shell echo $(FETCH_BUILD_IMAGE_LIST) $(FETCH_COMPOSE_IMAGE_LIST) $(FETCH_K8S_IMAGE_LIST) | tr ' ' '\n' | sort -u)
-
-.PHONY: $(DIRS) $(DIRS_CLEAN) $(DIRS_FLAKE8) flake8 base ponsim_olt ponsim_onu protos cli ofagent kafka common start stop tag push pull
+.PHONY: venv ofagent cli adapter_ponsim_olt adapter_ponsim_onu local-protos local-pyvoltha
 
 # This should to be the first and default target in this Makefile
 help:
 	@echo "Usage: make [<target>]"
 	@echo "where available targets are:"
 	@echo
-	@echo "build        : Build the Adapters protos and docker images.\n\
-               If this is the first time you are building, choose \"make build\" option."
-	@echo "clean        : Remove files created by the build and tests"
-	@echo "distclean    : Remove venv directory"
-	@echo "fetch        : Pre-fetch artifacts for subsequent local builds"
-	@echo "help         : Print this help"
-	@echo "rebuild-venv : Rebuild local Python virtualenv from scratch"
-	@echo "venv         : Build local Python virtualenv if did not exist yet"
-	@echo "containers   : Build all the docker containers"
-	@echo "base         : Build the base docker container used by all other dockers"
-	@echo "adapter_ponsim_olt       : Build the ponsim olt adapter docker container"
-	@echo "adapter_ponsim_onu       : Build the ponsim olt adapter docker container"
-	@echo "ofagent      : Build the openflow agent docker container"
-	@echo "tag          : Tag a set of images"
-	@echo "push         : Push the docker images to an external repository"
-	@echo "pull         : Pull the docker images from a repository"
+	@echo "build                : Build all docker images"
+	@echo "                         - If this is the first time you are building, choose 'make build' option."
+	@echo "help                 : Print this help"
+	@echo "ofagent              : Build the openflow agent docker image"
+	@echo "cli                  : Build the voltha CLI docker image"
+	@echo "adapter_ponsim_olt   : Build the ponsim olt adapter docker image"
+	@echo "adapter_ponsim_onu   : Build the ponsim onu adapter docker image"
+	@echo "docker-push   : Push the docker images to an external repository"
+	@echo "venv                 : Build local Python virtualenv"
+	@echo "clean                : Remove files created by the build and tests"
+	@echo "distclean            : Remove venv directory"
 	@echo
 
-## New directories can be added here
-#DIRS:=
 
-## If one directory depends on another directory that
-## dependency can be expressed here
-##
-## For example, if the Tibit directory depended on the eoam
-## directory being built first, then that can be expressed here.
-##  driver/tibit: eoam
+## Docker targets
 
-# Parallel Build
-$(DIRS):
-	@echo "    MK $@"
-	$(Q)$(MAKE) -C $@
+build: docker-build
 
-# Parallel Clean
-DIRS_CLEAN = $(addsuffix .clean,$(DIRS))
-$(DIRS_CLEAN):
-	@echo "    CLEAN $(basename $@)"
-	$(Q)$(MAKE) -C $(basename $@) clean
+docker-build: ofagent cli adapter_ponsim_olt adapter_ponsim_onu
 
-# Parallel Flake8
-DIRS_FLAKE8 = $(addsuffix .flake8,$(DIRS))
-$(DIRS_FLAKE8):
-	@echo "    FLAKE8 $(basename $@)"
-	-$(Q)$(MAKE) -C $(basename $@) flake8
+local-protos:
+	mkdir -p local_imports
+ifdef LOCAL_PROTOS
+	mkdir -p local_imports/voltha-protos/dist
+	cp ../../voltha-protos/dist/*.tar.gz local_imports/voltha-protos/dist/
+endif
 
-build: containers
-
-containers: base adapter_ponsim_olt adapter_ponsim_onu ofagent cli
-
-base:
+local-pyvoltha:
 	mkdir -p local_imports
 ifdef LOCAL_PYVOLTHA
 	mkdir -p local_imports/pyvoltha/dist
 	cp ../../pyvoltha/dist/*.tar.gz local_imports/pyvoltha/dist/
 endif
-ifdef LOCAL_PROTOS
-	mkdir -p local_imports/voltha-protos/dist
-	cp ../../voltha-protos/dist/*.tar.gz local_imports/voltha-protos/dist/
+
+ofagent: local-protos local-pyvoltha
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${OFAGENT_IMAGENAME} \
+    --build-arg LOCAL_PYVOLTHA=$(LOCAL_PYVOLTHA) \
+    --build-arg LOCAL_PROTOS=$(LOCAL_PROTOS) \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.ofagent .
+
+cli: local-protos local-pyvoltha
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${CLI_IMAGENAME} \
+    --build-arg LOCAL_PYVOLTHA=$(LOCAL_PYVOLTHA) \
+    --build-arg LOCAL_PROTOS=$(LOCAL_PROTOS) \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.cli .
+
+adapter_ponsim_olt: local-protos local-pyvoltha
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${PONSIMOLT_IMAGENAME} \
+    --build-arg LOCAL_PYVOLTHA=$(LOCAL_PYVOLTHA) \
+    --build-arg LOCAL_PROTOS=$(LOCAL_PROTOS) \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.adapter_ponsim_olt .
+
+adapter_ponsim_onu: local-protos local-pyvoltha
+	docker build $(DOCKER_BUILD_ARGS) \
+    -t ${PONSIMONU_IMAGENAME} \
+    --build-arg LOCAL_PYVOLTHA=$(LOCAL_PYVOLTHA) \
+    --build-arg LOCAL_PROTOS=$(LOCAL_PROTOS) \
+    --build-arg org_label_schema_version="${VERSION}" \
+    --build-arg org_label_schema_vcs_url="${DOCKER_LABEL_VCS_URL}" \
+    --build-arg org_label_schema_vcs_ref="${DOCKER_LABEL_VCS_REF}" \
+    --build-arg org_label_schema_build_date="${DOCKER_LABEL_BUILD_DATE}" \
+    --build-arg org_opencord_vcs_commit_date="${DOCKER_LABEL_COMMIT_DATE}" \
+    -f docker/Dockerfile.adapter_ponsim_onu .
+
+docker-push:
+	docker push ${OFAGENT_IMAGENAME}
+	docker push ${CLI_IMAGENAME}
+	docker push ${PONSIMOLT_IMAGENAME}
+	docker push ${PONSIMONU_IMAGENAME}
+
+
+## Python venv dev environment
+
+VENVDIR := venv-volthago
+
+venv: distclean local-protos local-pyvoltha
+	virtualenv ${VENVDIR};\
+        source ./${VENVDIR}/bin/activate ; set -u ;\
+	rm ${VENVDIR}/local/bin ${VENVDIR}/local/lib ${VENVDIR}/local/include ;\
+        pip install -r requirements.txt
+
+ifdef LOCAL_PYVOLTHA
+	source ./${VENVDIR}/bin/activate ; set -u ;\
+	pip install local_imports/pyvoltha/dist/*.tar.gz
 endif
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-base:${TAG} -f docker/Dockerfile.base .
-
-
-adapter_ponsim_olt:
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-adapter-ponsim-olt:${TAG} -f docker/Dockerfile.adapter_ponsim_olt .
-
-adapter_ponsim_onu:
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-adapter-ponsim-onu:${TAG} -f docker/Dockerfile.adapter_ponsim_onu .
-
-ofagent:
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-ofagent:${TAG} -f docker/Dockerfile.ofagent .
-
-cli:
-	docker build $(DOCKER_BUILD_ARGS) -t ${REGISTRY}${REPOSITORY}voltha-cli:${TAG} -f docker/Dockerfile.cli .
-
-tag: $(patsubst  %,%.tag,$(DOCKER_IMAGE_LIST))
-
-push: tag $(patsubst  %,%.push,$(DOCKER_IMAGE_LIST))
-
-pull: $(patsubst  %,%.pull,$(DOCKER_IMAGE_LIST))
-
-%.tag:
-	docker tag ${REGISTRY}${REPOSITORY}voltha-$(subst .tag,,$@):${TAG} ${TARGET_REGISTRY}${TARGET_REPOSITORY}voltha-$(subst .tag,,$@):${TARGET_TAG}
-
-%.push:
-	docker push ${TARGET_REGISTRY}${TARGET_REPOSITORY}voltha-$(subst .push,,$@):${TARGET_TAG}
-
-%.pull:
-	docker pull ${REGISTRY}${REPOSITORY}voltha-$(subst .pull,,$@):${TAG}
+ifdef LOCAL_PROTOS
+	source ./${VENVDIR}/bin/activate ; set -u ;\
+	pip install local_imports/voltha-protos/dist/*.tar.gz
+endif
 
 clean:
-	find . -name '*.pyc' | xargs rm -f
 	rm -rf local_imports
+	find . -name '*.pyc' | xargs rm -f
 
 distclean: clean
 	rm -rf ${VENVDIR}
 
-fetch:
-	@bash -c ' \
-		for i in $(FETCH_IMAGE_LIST); do \
-			docker pull $$i; \
-		done'
-
-purge-venv:
-	rm -fr ${VENVDIR}
-
-rebuild-venv: purge-venv venv
-
-ifneq ($(VOLTHA_BUILD),docker)
-venv: ${VENVDIR}/.built
-else
-venv:
-endif
-
-${VENVDIR}/.built:
-	@ virtualenv ${VENVDIR}
-	@ . ${VENVDIR}/bin/activate && \
-	    pip install --upgrade pip; \
-	    if ! pip install -r requirements.txt; \
-	    then \
-	        echo "On MAC OS X, if the installation failed with an error \n'<openssl/opensslv.h>': file not found,"; \
-	        echo "see the BUILD.md file for a workaround"; \
-	    else \
-	        uname -s > ${VENVDIR}/.built; \
-	    fi
-
-ifdef LOCAL_PYVOLTHA
-	mkdir -p local_imports/pyvoltha/dist
-	cp ../../pyvoltha/dist/*.tar.gz local_imports/pyvoltha/dist/
-	. ${VENVDIR}/bin/activate && \
-	    pip install local_imports/pyvoltha/dist/*.tar.gz
-endif
-ifdef LOCAL_PROTOS
-	mkdir -p local_imports/voltha-protos/dist
-	cp ../../voltha-protos/dist/*.tar.gz local_imports/voltha-protos/dist/
-	. ${VENVDIR}/bin/activate && \
-	    pip install local_imports/voltha-protos/dist/*.tar.gz
-endif
-
-flake8: $(DIRS_FLAKE8)
-
 # end file
diff --git a/python/docker/Dockerfile.adapter_ponsim_olt b/python/docker/Dockerfile.adapter_ponsim_olt
index 2d6c033..d5d1bf0 100644
--- a/python/docker/Dockerfile.adapter_ponsim_olt
+++ b/python/docker/Dockerfile.adapter_ponsim_olt
@@ -11,13 +11,30 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-ARG TAG=latest
-ARG REGISTRY=
-ARG REPOSITORY=
+FROM ubuntu:16.04
 
-FROM ${REGISTRY}${REPOSITORY}voltha-base:${TAG}
+# Update to have latest images
+RUN apt-get update && \
+    apt-get install -y python openssl iproute2 libpcap-dev wget build-essential git binutils python-dev libffi-dev libssl-dev
 
-MAINTAINER Voltha Community <info@opennetworking.org>
+# Install current version of pip rather than outdated pip from apt
+RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
+RUN python /tmp/get-pip.py
+
+# Install adapter requirements.
+COPY requirements.txt /tmp/requirements.txt
+RUN pip install -r /tmp/requirements.txt
+
+ARG LOCAL_PYVOLTHA
+ARG LOCAL_PROTOS
+COPY local_imports/ /local_imports/
+RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
+    pip install /local_imports/pyvoltha/dist/*.tar.gz ; \
+fi
+
+RUN if [ -n "$LOCAL_PROTOS" ] ; then \
+    pip install /local_imports/voltha-protos/dist/*.tar.gz ; \
+fi
 
 # Bundle app source
 RUN mkdir /voltha && touch /voltha/__init__.py
@@ -28,3 +45,18 @@
 
 # Exposing process and default entry point
 CMD ["python", "/voltha/python/adapters/ponsim_olt/main.py"]
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-adapter-ponsim-olt \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/python/docker/Dockerfile.adapter_ponsim_onu b/python/docker/Dockerfile.adapter_ponsim_onu
index e34483e..10c8ef2 100644
--- a/python/docker/Dockerfile.adapter_ponsim_onu
+++ b/python/docker/Dockerfile.adapter_ponsim_onu
@@ -11,13 +11,30 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-ARG TAG=latest
-ARG REGISTRY=
-ARG REPOSITORY=
+FROM ubuntu:16.04
 
-FROM ${REGISTRY}${REPOSITORY}voltha-base:${TAG}
+# Update to have latest images
+RUN apt-get update && \
+    apt-get install -y python openssl iproute2 libpcap-dev wget build-essential git binutils python-dev libffi-dev libssl-dev
 
-MAINTAINER Voltha Community <info@opennetworking.org>
+# Install current version of pip rather than outdated pip from apt
+RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
+RUN python /tmp/get-pip.py
+
+# Install adapter requirements.
+COPY requirements.txt /tmp/requirements.txt
+RUN pip install -r /tmp/requirements.txt
+
+ARG LOCAL_PYVOLTHA
+ARG LOCAL_PROTOS
+COPY local_imports/ /local_imports/
+RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
+    pip install /local_imports/pyvoltha/dist/*.tar.gz ; \
+fi
+
+RUN if [ -n "$LOCAL_PROTOS" ] ; then \
+    pip install /local_imports/voltha-protos/dist/*.tar.gz ; \
+fi
 
 # Bundle app source
 RUN mkdir /voltha && touch /voltha/__init__.py
@@ -28,3 +45,18 @@
 
 # Exposing process and default entry point
 CMD ["python", "/voltha/python/adapters/ponsim_onu/main.py"]
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-adapter-ponsim-onu \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/python/docker/Dockerfile.base b/python/docker/Dockerfile.base
deleted file mode 100644
index 70f4c3f..0000000
--- a/python/docker/Dockerfile.base
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright 2016 the original author or authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM ubuntu:xenial
-
-MAINTAINER Voltha Community <info@opennetworking.org>
-
-ARG LOCAL_PYVOLTHA
-ARG LOCAL_PROTOS
-
-# Update to have latest images
-RUN apt-get update && \
-    apt-get install -y python python-pip openssl iproute2 libpcap-dev wget
-
-COPY requirements.txt /tmp/requirements.txt
-
-# pip install cython enum34 six && \
-# Install app dependencies
-RUN wget https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64.deb && \
-    dpkg -i *.deb && \
-    rm -f *.deb && \
-    apt-get update && \
-    apt-get install -y wget build-essential make gcc binutils python-dev libffi-dev libssl-dev git && \
-    pip install -r /tmp/requirements.txt
-
-#COPY POTENTIAL LOCAL IMPORTS
-COPY local_imports/ /local_imports/
-
-RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \ 
-        pip install /local_imports/pyvoltha/dist/*.tar.gz ; \
-fi 
-
-RUN if [ -n "$LOCAL_PROTOS" ] ; then \
-        pip install /local_imports/voltha-protos/dist/*.tar.gz ; \
-fi
-
-RUN     apt-get purge -y wget build-essential make gcc binutils python-dev libffi-dev libssl-dev git && \
-    apt-get autoremove -y
-
-
diff --git a/python/docker/Dockerfile.cli b/python/docker/Dockerfile.cli
index 42a3c65..9f340de 100644
--- a/python/docker/Dockerfile.cli
+++ b/python/docker/Dockerfile.cli
@@ -11,13 +11,30 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-ARG TAG=latest
-ARG REGISTRY=
-ARG REPOSITORY=
+FROM ubuntu:16.04
 
-FROM ${REGISTRY}${REPOSITORY}voltha-base:${TAG}
+# Update to have latest images
+RUN apt-get update && \
+    apt-get install -y python openssl iproute2 libpcap-dev wget build-essential git binutils python-dev libffi-dev libssl-dev
 
-MAINTAINER Voltha Community <info@opennetworking.org>
+# Install current version of pip rather than outdated pip from apt
+RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
+RUN python /tmp/get-pip.py
+
+# Install adapter requirements.
+COPY requirements.txt /tmp/requirements.txt
+RUN pip install -r /tmp/requirements.txt
+
+ARG LOCAL_PYVOLTHA
+ARG LOCAL_PROTOS
+COPY local_imports/ /local_imports/
+RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
+    pip install /local_imports/pyvoltha/dist/*.tar.gz ; \
+fi
+
+RUN if [ -n "$LOCAL_PROTOS" ] ; then \
+    pip install /local_imports/voltha-protos/dist/*.tar.gz ; \
+fi
 
 # Bundle app source
 RUN mkdir /voltha && touch /voltha/__init__.py
@@ -26,7 +43,6 @@
 RUN touch /voltha/python/__init__.py
 RUN touch /voltha/python/cli/__init__.py
 
-
 # Setup the voltha user
 RUN useradd -b /home -d /home/voltha voltha -s /bin/bash
 RUN mkdir /home/voltha
@@ -50,3 +66,18 @@
 ENTRYPOINT ["/usr/bin/dumb-init", "--"]
 
 CMD ["/voltha/python/cli/setup.sh"]
+
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
+
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-cli \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/python/docker/Dockerfile.ofagent b/python/docker/Dockerfile.ofagent
index 564da05..2037fa0 100644
--- a/python/docker/Dockerfile.ofagent
+++ b/python/docker/Dockerfile.ofagent
@@ -11,13 +11,30 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-ARG TAG=latest
-ARG REGISTRY=
-ARG REPOSITORY=
+FROM ubuntu:16.04
 
-FROM ${REGISTRY}${REPOSITORY}voltha-base:${TAG}
+# Update to have latest images
+RUN apt-get update && \
+    apt-get install -y python openssl iproute2 libpcap-dev wget build-essential git binutils python-dev libffi-dev libssl-dev
 
-MAINTAINER Voltha Community <info@opennetworking.org>
+# Install current version of pip rather than outdated pip from apt
+RUN wget -O /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py
+RUN python /tmp/get-pip.py
+
+# Install adapter requirements.
+COPY requirements.txt /tmp/requirements.txt
+RUN pip install -r /tmp/requirements.txt
+
+ARG LOCAL_PYVOLTHA
+ARG LOCAL_PROTOS
+COPY local_imports/ /local_imports/
+RUN if [ -n "$LOCAL_PYVOLTHA" ] ; then \
+    pip install /local_imports/pyvoltha/dist/*.tar.gz ; \
+fi
+
+RUN if [ -n "$LOCAL_PROTOS" ] ; then \
+    pip install /local_imports/voltha-protos/dist/*.tar.gz ; \
+fi
 
 # Bundle app source
 RUN mkdir /ofagent  && \
@@ -27,7 +44,17 @@
 COPY ofagent /ofagent/ofagent
 COPY pki /ofagent/pki
 
-ENTRYPOINT ["/usr/bin/dumb-init", "--"]
+# Label image
+ARG org_label_schema_version=unknown
+ARG org_label_schema_vcs_url=unknown
+ARG org_label_schema_vcs_ref=unknown
+ARG org_label_schema_build_date=unknown
+ARG org_opencord_vcs_commit_date=unknown
 
-# Exposing process and default entry point
-CMD ["dumb-init", "python", "ofagent/ofagent/main.py"]
+LABEL org.label-schema.schema-version=1.0 \
+      org.label-schema.name=voltha-ofagent \
+      org.label-schema.version=$org_label_schema_version \
+      org.label-schema.vcs-url=$org_label_schema_vcs_url \
+      org.label-schema.vcs-ref=$org_label_schema_vcs_ref \
+      org.label-schema.build-date=$org_label_schema_build_date \
+      org.opencord.vcs-commit-date=$org_opencord_vcs_commit_date
diff --git a/python/env.sh b/python/env.sh
index ec3b52f..c9a6245 100644
--- a/python/env.sh
+++ b/python/env.sh
@@ -12,18 +12,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 # sourcing this file is needed to make local development and integration testing work
-export VOLTHA_BASE=$PWD
 
-# load local python virtualenv if exists, otherwise create it
-VENVDIR="venv-$(uname -s | tr '[:upper:]' '[:lower:]')"
-if [ ! -e "$VENVDIR/.built" ]; then
-    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
-    echo "Initializing OS-appropriate virtual env."
-    echo "This will take a few minutes."
-    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
-    make venv
+# load local python virtualenv if exists
+VENVDIR="venv-volthago"
+if [ -e "$VENVDIR/bin/activate" ]; then
+    . $VENVDIR/bin/activate
+else
+   echo "Run 'make venv' to setup python development environment"
 fi
-. $VENVDIR/bin/activate
-
-# add top-level voltha dir to pythonpath
-export PYTHONPATH=$VOLTHA_BASE/$VENVDIR/lib/python2.7/site-packages:$PYTHONPATH:$VOLTHA_BASE:$VOLTHA_BASE/cli:$VOLTHA_BASE/protos/third_party
diff --git a/quickstart.md b/quickstart.md
index b78d35a..e217afa 100644
--- a/quickstart.md
+++ b/quickstart.md
@@ -47,7 +47,7 @@
 
 ### VOLTHA Protos
 
-Library containing all VOLTHA gRPC Protobuf definitions and the build system to produce needed stubs in Python and Golang.  This package is available via python's pip or golang's "dep" or "go get".   If you need to **edit protos and test those changes locally** you will need to refer to the voltha-protos README.
+Library containing all VOLTHA gRPC Protobuf definitions and the build system to produce needed stubs in Python and Golang.  Stable versions of this package is available via python's pip or golang's "dep" or "go get".   If you need to **edit protos and test those changes locally** you will need to refer to the voltha-protos README and export needed environment variables to include the local build.
 
 https://github.com/opencord/voltha-protos/blob/master/README.md
 
@@ -76,15 +76,18 @@
 cd ~/source/voltha-protos/
 ls dist/    #python pip tarball output
 ls go/      #golang stubs
-
-export LOCAL_PROTOS=true
-
-
 ```
 
+Set an environment variable for below Golang and Python builds to inform the Makefile to copy files into the local vendor folder or to use the local pip tar.gz.  Useful for development testing.
+```sh
+export LOCAL_PROTOS=true
+```
+
+
+
 ### PyVoltha PIP Library
 
-Python library of common core functions.  Once this stabilizes then you will no longer need a local build, the needed version will be in pip.  Currently the plan is to push the pyvoltha pip library once a sprint into PyPi.   Currently PyVoltha includes generated python stubs of voltha gRPC protos.
+Python library of common core functions.  Stable versions of this package is available via python's pip.  If you need to **edit this library and test those changes locally** you will need to export needed environment variables to include the local build..
 
 ```sh
 cd ~/source/
@@ -92,15 +95,13 @@
 ```
 
 Generate the local tar.gz that is the dev version of pyvoltha:
-
 ```sh
 cd ~/source/pyvoltha/
 make dist
 ls dist/    #python pip tarball output
 ```
 
-Set an environment variable for below python builds to inform the Makefile to use the local pip tar.gz
-
+Set an environment variable for below Python builds to inform the Makefile to use the local pip tar.gz.  Useful for development testing.
 ```sh
 export LOCAL_PYVOLTHA=true
 ```
@@ -129,58 +130,98 @@
 
 The steps below generate the needed docker images and the Docker build system sets up the Go environment within a container image.  Build Go docker images, rw_core being whats most needed for now.
 This should work without setting up a golang environment:
-
 ```sh
+export DOCKER_TAG=latest
 cd ~/source/voltha-go
 make build
 ```
 
-Build Python CLI and OFAgent docker images.  Python ofagent, cli, and ponsim build system needs to be told to create protos docker image using environment variable.  This will no longer be needed when python components use pyvoltha and voltha-protos packages.
+Set an environment variable for other Golang builds to inform the Makefile to copy files into the local vendor folder.  Useful for development testing.
 ```sh
-export VOLTHA_BUILD=docker
+export LOCAL_VOLTHAGO=true
+```
+
+Build Python CLI and OFAgent docker images.
+```sh
+export DOCKER_TAG=latest
 cd ~/source/voltha-go/python
 make build
 ```
 
 
 
-### VOLTHA 2.0 OpenOLT (python)
+### VOLTHA 2.0 OpenOLT (Golang and Python)
 
+Checkout and link openolt source into GOPATH for openolt development.  This is similar to voltha-go above.
 ```sh
 cd ~/source/
 git clone https://gerrit.opencord.org/voltha-openolt-adapter.git
+
+mkdir -p $GOPATH/src/github.com/opencord
+ln -s ~/source/voltha-openolt-adapter $GOPATH/src/github.com/opencord/voltha-openolt-adapter
+
+cd $GOPATH/src/github.com/opencord/voltha-openolt-adapter
+go build main.go    # verify vendor and other dependancies. output binary not actually used in container builds
 ```
 
-Build the openolt container.  Inform the Makefile to use a local build of PyVoltha and voltha-protos.  This will copy the pyvoltha tar.gz and voltha-protos from their respective build tree and include in the openolt build tree.  Once PyVoltha and voltha-protos is stable this will not be needed.
+Build the openolt container.  Above LOCAL environment variables can be used to include local library builds of PyVoltha, voltha-go, and voltha-protos.  This will copy the pyvoltha tar.gz and voltha-protos from their respective build tree and include in the openolt build tree.
+
+Golang Openolt
 ```sh
+export DOCKER_TAG=latest
+cd ~/source/voltha-openolt-adapter/
+make build
+```
+
+Python Openolt
+```sh
+export DOCKER_TAG=latest
 cd ~/source/voltha-openolt-adapter/python/
 make build
 ```
 
 
 
-### VOLTHA 2.0 OpenONU (python)
+### VOLTHA 2.0 OpenONU (Python)
 
 ```sh
 cd ~/source/
 git clone https://gerrit.opencord.org/voltha-openonu-adapter.git
 ```
 
-Build the openonu container.  Inform the Makefile to use a local build of PyVoltha and voltha-protos.  This will copy the pyvoltha tar.gz and voltha-protos from their respective build tree and include in the openonu build tree.  Once PyVoltha and voltha-protos is stable this will not be needed.
+Build the openonu container.  Above LOCAL environment variables can be used to include local builds of PyVoltha and voltha-protos.  This will copy the pyvoltha tar.gz and voltha-protos from their respective build tree and include in the openonu build tree.
 ```sh
+export DOCKER_TAG=latest
 cd ~/source/voltha-openonu-adapter/python
 make build
 ```
 
 
 
+### ONOS with VOLTHA Compatible Apps
+
+By default the standard onos docker image does not contain nor start any apps needed by voltha.  If you use the standard image then you need to use the onos restful api to load needed apps.  For development convienence there is an onos docker image build that adds in the current compatible voltha apps.
+```sh
+cd ~/source/
+git clone https://gerrit.opencord.org/voltha-onos.git
+```
+
+Build the onos image with added onos apps (olt, aaa, sadis, dhcpl2relay).
+```sh
+export DOCKER_TAG=latest
+cd ~/source/voltha-onos
+make build
+```
+
 
 
 ## Test
 
-Run the combined compose file that starts the core, its dependent systems and the openonu and openolt adapters.  Export an environment variable of your non-localhost ip address needed for inter-container communication.
+Run the combined compose file that starts the core, its dependent systems and the openonu and openolt adapters.  Export an environment variable of your non-localhost ip address needed for inter-container communication.  For convienence you can also export DOCKER_TAG to signify the docker images tag you would like to use.  Though for typical development you may have to edit compose/system-test.yml to override the specific docker image DOCKER_TAG needed.
 ```sh
 export DOCKER_HOST_IP=##YOUR_LOCAL_IP##
+export DOCKER_TAG=latest
+
 cd ~/source/voltha-go
 docker-compose -f compose/system-test.yml up -d
 ```