VOL-595 - container image name consistency and general cleanup

Change-Id: Iccac1ccba61537cefa046118df139196e9e87713
diff --git a/compose/docker-compose-all.yml.j2 b/compose/docker-compose-all.yml.j2
new file mode 100755
index 0000000..f358573
--- /dev/null
+++ b/compose/docker-compose-all.yml.j2
@@ -0,0 +1,291 @@
+# Copyright 2017 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.
+version: "3"
+services:
+
+  # The Fluentd container is part of the data collection
+  # infrastructure.
+  fluentd:
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: replicated
+      replicas: {{ SWARM_MANAGER_COUNT | default(2) }}
+      restart_policy:
+        condition: any
+    environment:
+        SERVICE_24224_NAME: "fluentd-intake"
+        FLUENTD_CONF: fluent.conf
+        WAIT_FOR: "fluentdactv:24224 fluentdstby:24224"
+        WAIT_FOR_TIMEOUT: 0
+    networks:
+      - voltha-net
+    ports:
+      - "24224"
+
+  # Free RADIUS can be used to test VOLTHA's authentication 
+  # sequence, i.e., EAPOL from a device behind an OLT to 
+  # RADIUS authentication on the back end systems. By default
+  # no instances of Free RADIUS are deployed.
+  freeradius:
+    deploy:
+      replicas: 0
+    image: "${REGISTRY}marcelmaatkamp/freeradius:${RADIUS_TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    ports:
+      - "1812:1812/udp"
+      - "1813:1813"
+      - "18120:18120"
+    
+    # CONFIG: When deploying a Free RADIUS instance client and user
+    #      information will need to be configured for the service to
+    #      operate correctly.
+    #
+    #volumes:
+    #   - ${RADIUS_ROOT}/data/clients.conf:/etc/raddb/clients.conf
+    #   - ${RADIUS_ROOT}/data/users:/etc/raddb/users
+    networks:
+      - voltha-net
+
+  # The cluster manager container calculates and servers ONOS cluster
+  # meta data via HTTP so that ONOS instances can form an HA cluster.
+  # The cluster manager must run on a manager node so that it can 
+  # retrieve service information from manager nodes
+  onos_cluster_manager:
+    image: "${REGISTRY}voltha/unum:${TAG:-latest}"
+    deploy:
+      replicas: 1
+      placement:
+        constraints:
+          - node.role == manager
+    environment:
+      PERIOD: "10s"
+      LOG_LEVEL: "debug"
+      ORCHESTRATION: "swarm://"
+      LABELS: "org.voltha.onos.cluster:true"
+      NETWORK: "org.voltha.onos.cluster:true"
+    ports:
+      - 5411:5411
+    networks:
+      - voltha-net
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+
+  # ONOS is the SDN controller for the solution and handles AAA,
+  # IGMP proxy, and L2 DHCP requests as well as manages flows
+  # down to the virtual devices (MCAST + OLT flows).
+  # Currently there is a single instance of ONOS as some of the
+  # applications running under ONOS do not support HA.
+  onos:
+    deploy:
+      replicas: 1
+      labels:
+        org.voltha.onos.cluster: "true"
+    image: "${REGISTRY}voltha/onos:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    ports:
+      - 8101:8101 # ssh
+      - 6653:6653 # OF
+      - 8181:8181 # UI
+    environment:
+      EXTRA_JAVA_OPTS: "-Donos.cluster.metadata.uri=http://onos_cluster_manager:5411/config/"
+    networks:
+      - voltha-net
+
+  # The VCORE container is the core capabilities of VOLTHA including
+  # interacting with device adapters
+  vcore:
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: {{ SWARM_MANAGER_COUNT | default(3) }}
+    entrypoint:
+      - voltha/voltha/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --kafka=kafka
+      - --rest-port=8880
+      - --grpc-port=50556
+      - --instance-id-is-container-name
+      - --backend=consul
+      - --inter-core-subnet=172.29.19.0/24
+      - --pon-subnet=172.29.19.0/24
+    networks:
+      - voltha-net
+    ports:
+      - "8880:8880"
+      - "18880:18880"
+      - "50556:50556"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The OpenFlow Agent support the OpenFlow protocol communication
+  # between ONOS and VOLTHA.
+  ofagent:
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+    entrypoint:
+      - /ofagent/ofagent/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --controller=onos:6653
+      - --grpc-endpoint=vcore:50556
+      - --instance-id-is-container-name
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+    networks:
+      - voltha-net
+
+  # The VOLTHA container supports load balancing of request to
+  # the VOLTHA components as well as surfaces a REST API and maps
+  # the requests to GPRC
+  voltha:
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+    entrypoint:
+      - /usr/local/bin/envoyd
+      - -envoy-cfg-template
+      - "/envoy/voltha-grpc-proxy.template.json"
+      - -envoy-config
+      - "/envoy/voltha-grpc-proxy.json"
+    networks:
+      - voltha-net
+    ports:
+      - "50555:50555"
+      - "8882:8882"
+      - "8443:8443"
+      - "8001:8001"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The CLI container provides an CLI to the VOLTHA capabilitiy 
+  # that can be accessed via SSH.
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: {{ SWARM_MANAGER_COUNT | default(2) }}
+    entrypoint:
+      - /cli/cli/setup.sh
+      - -C consul:8500
+      - -g voltha:50555
+      - -s voltha:18880
+      - -G
+    networks:
+      - voltha-net
+    ports:
+      - "5022:22"
+
+  # The Netconf container provides an NETCONF API to be used
+  # with VOLTHA and maps that to GRPC requests
+  netconf:
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: global
+    environment:
+      SERVICE_1830_NAME: "netconf-server"
+    entrypoint:
+      - /netconf/netconf/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --grpc-endpoint=voltha:50555
+      - --instance-id-is-container-name
+    networks:
+      - voltha-net
+    ports:
+      - "830:1830"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The tools container provides a bash command shell to which
+  # an operator can SSH that has the same network connectivity
+  # as other VOLTHA containers and is thus a convenient 
+  # troubleshooting tool
+  tools:
+    image: "${REGISTRY}voltha/tools:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: replicated
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+    ports:
+      - "4022:22"
+    networks:
+      - voltha-net
+      - kafka-net
+
+networks:
+  onos:
+    driver: overlay
+    driver_opts:
+      encrypted: "true"
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.25.0.0/24
+    labels:
+      org.voltha.onos.cluster: "true"
+
+  voltha-net:
+    external:
+      name: voltha_net
+
+  kafka-net:
+    external:
+      name: kafka_net
diff --git a/compose/docker-compose-auth-test.yml b/compose/docker-compose-auth-test.yml
index c4d4fc7..f5d4b67 100644
--- a/compose/docker-compose-auth-test.yml
+++ b/compose/docker-compose-auth-test.yml
@@ -3,7 +3,7 @@
 services:
 
  freeradius:
-  image: "marcelmaatkamp/freeradius"
+   image: "${REGISTRY}marcelmaatkamp/freeradius:${RADIUS_TAG:-latest}"
   ports:
    - "1812:1812/udp"
    - "1813:1813"
@@ -16,7 +16,7 @@
     ipv4_address: 172.25.0.100
 
  onos:
-  image: "cord/onos"
+  image: "${REGISTRY}voltha/onos:${TAG:-latest}"
   ports:
    - "8101:8101" # ssh
    - "6653:6653" # OF
@@ -28,7 +28,7 @@
      ipv4_address: 172.25.0.200
 
 # onos_config_push:
-#  image: onos-config-push:phase2
+#  image: "${REGISTRY}onos-config-push:${TAG:-latest}"
 #  environment:
 #   ONOS_CONNECTION: 'onos:8181'
 #  volumes:
@@ -39,7 +39,7 @@
 #   - "onos:onos"
 
 # freeradius-test:
-#  image: "marcelmaatkamp/freeradius"
+#  image: "${REGISTRY}marcelmaatkamp/freeradius:${RADIUS_TAG:-latest}"
 #  command: "radtest user password freeradius 0 SECRET"
 #  networks:
 #   authnet:
diff --git a/compose/docker-compose-vcli.yml b/compose/docker-compose-cli.yml
similarity index 86%
rename from compose/docker-compose-vcli.yml
rename to compose/docker-compose-cli.yml
index 553fc14..e980f51 100644
--- a/compose/docker-compose-vcli.yml
+++ b/compose/docker-compose-cli.yml
@@ -4,13 +4,13 @@
 # The stackfile assumes that overlay network 'voltha_net' has already been
 # created. To deploy the stack, issue the command:
 #
-#     docker stack deploy -c docker-compose-vcli.yml cli
+#     docker stack deploy -c docker-compose-cli.yml cli
 #
 
 version: "3"
 services:
   cli:
-    image: cord/vcli:latest
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-consul-cluster.yml b/compose/docker-compose-consul-cluster.yml
index 5bd37b9..16a4a45 100644
--- a/compose/docker-compose-consul-cluster.yml
+++ b/compose/docker-compose-consul-cluster.yml
@@ -1,4 +1,17 @@
+# Copyright 2017 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.
+
 # This stackfile deploys a Consul cluster to a docker swarm.
 #
 # The Consul cluster depends on:
@@ -9,13 +22,12 @@
 #     docker stack deploy -c docker-compose-consul-cluster.yml consul
 #
 # This command will create overlay network 'consul_net'.
-#
 
 version: "3"
 services:
 
   consul:
-    image: consul:0.9.2
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     logging:
       driver: "json-file"
       options:
@@ -30,18 +42,15 @@
           - node.role == manager
       restart_policy:
         condition: on-failure
-    environment:
-      CONSUL_LOCAL_CONFIG: "{disable_update_check: true}"
-      CONSUL_BIND_INTERFACE: eth0
     entrypoint:
       - consul
       - agent
       - -server
-      - -bootstrap-expect=3
+      - -bootstrap-expect=${SWARM_MANAGER_COUNT:-3}
       - -config-dir=/consul/config
       - -data-dir=/consul/data              # mandatory property
-      - -bind={{ GetInterfaceIP "eth0" }}
       - -client=0.0.0.0
+      - -advertise={{ GetAllInterfaces | include "network" "172.29.20.0/29" | sort "size,address" | attr "address" }}
       - -ui
       - -raft-protocol=3
       - -rejoin
@@ -60,8 +69,8 @@
       - "8500:8500"
       - "8600:8600/udp"
     volumes:
-      - /cord/incubator/voltha/consul/data:/consul/data
-      - /cord/incubator/voltha/consul/config:/consul/config
+      - ${CONSUL_ROOT:-/cord/incubator/voltha/consul}/data:/consul/data
+      - ${CONSUL_ROOT:-/cord/incubator/voltha/consul}/config:/consul/config
 
 networks:
   net:
diff --git a/compose/docker-compose-dashd.yml b/compose/docker-compose-dashd.yml
index 752ad45..3b5080d 100755
--- a/compose/docker-compose-dashd.yml
+++ b/compose/docker-compose-dashd.yml
@@ -4,7 +4,7 @@
   # Dashboard daemon
   #
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     command: [
       "/dashd/dashd/main.py",
       "--kafka=@kafka",
@@ -23,17 +23,17 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
 
   #
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
 
   #
   # Graphite-Grafana-statsd service instance
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: kamon/grafana_graphite
+    image: "${REGISTRY}kamon/grafana_graphite:${TAG:-latest}"
diff --git a/compose/docker-compose-docutests.yml b/compose/docker-compose-docutests.yml
index d53b1db..6a0db8c 100644
--- a/compose/docker-compose-docutests.yml
+++ b/compose/docker-compose-docutests.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -63,7 +63,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -75,7 +75,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -115,7 +115,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -140,7 +140,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
diff --git a/compose/docker-compose-elasticsearch.yml b/compose/docker-compose-elasticsearch.yml
index 0b190b2..97f6176 100644
--- a/compose/docker-compose-elasticsearch.yml
+++ b/compose/docker-compose-elasticsearch.yml
@@ -2,7 +2,7 @@
 
 services:
   elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:5.6.0
+    image: "${REGISTRY}docker.elastic.co/elasticsearch/elasticsearch:${ELASTIC_TAG:-5.6.0}"
     environment:
       - transport.host=localhost
       - transport.tcp.port=9300
diff --git a/compose/docker-compose-envoy-swarm.yml b/compose/docker-compose-envoy-swarm.yml
index b9e905d..fc299e9 100644
--- a/compose/docker-compose-envoy-swarm.yml
+++ b/compose/docker-compose-envoy-swarm.yml
@@ -10,7 +10,7 @@
 version: "3"
 services:
   voltha:
-    image: voltha/envoy:latest
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-fixed-port.yml b/compose/docker-compose-fixed-port.yml
index 5fb8749..d3b1c85 100644
--- a/compose/docker-compose-fixed-port.yml
+++ b/compose/docker-compose-fixed-port.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
      - "2181:2181"
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - "9092:9092"
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -62,7 +62,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -75,7 +75,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: kamon/grafana_graphite
+    image: "${REGISTRY}kamon/grafana_graphite:${GRAPHITE_TAG:-latest}"
     ports:
     - "8882:80"
     - "2003:2003"
@@ -93,7 +93,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -111,7 +111,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -154,7 +154,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -179,7 +179,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
@@ -207,7 +207,7 @@
   # Dashboard daemon
   #
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     command: [
       "/dashd/dashd/main.py",
       "--kafka=@kafka",
diff --git a/compose/docker-compose-fluentd-agg-cluster.yml b/compose/docker-compose-fluentd-agg-cluster.yml
index 9f82fa4..fceb6cf 100644
--- a/compose/docker-compose-fluentd-agg-cluster.yml
+++ b/compose/docker-compose-fluentd-agg-cluster.yml
@@ -13,7 +13,7 @@
 #
 
   fluentdactv:
-    image: cord/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
@@ -30,10 +30,10 @@
     ports:
       - "24224"
     volumes:
-      - "/var/log/voltha/logging_volume:/fluentd/log"
+      - ${VOLTHA_LOGS:-/var/log/voltha/logging_volume}:/fluentd/log
 
   fluentdstby:
-    image: cord/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
@@ -50,7 +50,7 @@
     ports:
       - "24224"
     volumes:
-      - "/var/log/voltha/logging_volume:/fluentd/log"
+      - ${VOLTHA_LOGS:-/var/log/voltha/logging_volume}:/fluentd/log
 
 networks:
   voltha-net:
diff --git a/compose/docker-compose-fluentd-cluster.yml b/compose/docker-compose-fluentd-cluster.yml
index dead717..18b9812 100644
--- a/compose/docker-compose-fluentd-cluster.yml
+++ b/compose/docker-compose-fluentd-cluster.yml
@@ -13,7 +13,7 @@
 #
 
   fluentd:
-    image: cord/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-grafana-swarm.yml b/compose/docker-compose-grafana-swarm.yml
index 0ff00de..bf6bd76 100644
--- a/compose/docker-compose-grafana-swarm.yml
+++ b/compose/docker-compose-grafana-swarm.yml
@@ -12,7 +12,7 @@
 version: "3"
 services:
   grafana:
-    image: kamon/grafana_graphite
+    image: "${REGISTRY}kamon/grafana_graphite:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-kafka-cluster.yml b/compose/docker-compose-kafka-cluster.yml
index 1c2dbb2..53fd141 100644
--- a/compose/docker-compose-kafka-cluster.yml
+++ b/compose/docker-compose-kafka-cluster.yml
@@ -16,7 +16,7 @@
 version: '3'
 services:
     zk1:
-        image: zookeeper
+        image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
         logging:
             driver: "json-file"
             options:
@@ -29,7 +29,7 @@
             ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
 
     zk2:
-        image: zookeeper
+        image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
         logging:
             driver: "json-file"
             options:
@@ -42,7 +42,7 @@
             ZOO_SERVERS: server.1=zk1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zk3:2888:3888
 
     zk3:
-        image: zookeeper
+        image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
         logging:
             driver: "json-file"
             options:
@@ -57,7 +57,7 @@
     kafka:
         deploy:
             mode: global
-        image: wurstmeister/kafka
+        image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
         logging:
             driver: "json-file"
             options:
diff --git a/compose/docker-compose-logstash-swarm.yml b/compose/docker-compose-logstash-swarm.yml
index 1f566ed..814ed9d 100644
--- a/compose/docker-compose-logstash-swarm.yml
+++ b/compose/docker-compose-logstash-swarm.yml
@@ -2,7 +2,7 @@
 
 services:
   logstash:
-    image: cord/logstash
+    image: "${REGISTRY}voltha/logstash:${TAG:-latest}"
     environment:
       - log.level=info
       - xpack.monitoring.enabled=false
diff --git a/compose/docker-compose-logstash.yml b/compose/docker-compose-logstash.yml
index 38a5881..53a875f 100644
--- a/compose/docker-compose-logstash.yml
+++ b/compose/docker-compose-logstash.yml
@@ -2,7 +2,7 @@
 
 services:
   logstash:
-    image: cord/logstash
+    image: "${REGISTRY}voltha/logstash:${TAG:-latest}"
     environment:
       - log.level=info
     command: logstash -f /etc/logstash/conf.d/
diff --git a/compose/docker-compose-netconf-swarm.yml b/compose/docker-compose-netconf-swarm.yml
index 3259c47..8df65ac 100644
--- a/compose/docker-compose-netconf-swarm.yml
+++ b/compose/docker-compose-netconf-swarm.yml
@@ -13,7 +13,7 @@
 version: "3"
 services:
   netconf:
-    image: cord/netconf:latest
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-netopeer.yml b/compose/docker-compose-netopeer.yml
index 6ed9953..df00ec4 100755
--- a/compose/docker-compose-netopeer.yml
+++ b/compose/docker-compose-netopeer.yml
@@ -1,6 +1,6 @@
 version: '2'
 services:
   netopeer:
-    image: cord/netopeer
+    image: "${REGISTRY}voltha/netopeer:${TAG:-latest}"
     ports:
       - "1830:830"
diff --git a/compose/docker-compose-ofagent-swarm.yml b/compose/docker-compose-ofagent-swarm.yml
index d11ffcf..ef0be02 100644
--- a/compose/docker-compose-ofagent-swarm.yml
+++ b/compose/docker-compose-ofagent-swarm.yml
@@ -9,7 +9,7 @@
 version: "3.2"
 services:
     ofagent:
-        image: cord/ofagent
+        image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
         logging:
             driver: "json-file"
             options:
diff --git a/compose/docker-compose-ofagent-test.yml b/compose/docker-compose-ofagent-test.yml
index 20d20ca..d20a6a5 100644
--- a/compose/docker-compose-ofagent-test.yml
+++ b/compose/docker-compose-ofagent-test.yml
@@ -5,7 +5,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -21,7 +21,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -38,7 +38,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -50,7 +50,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -88,7 +88,7 @@
     - ponmgmt
 
   envoy:
-    image: voltha/envoy
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     entrypoint:
       - /usr/local/bin/envoyd
       - -envoy-cfg-template
@@ -112,8 +112,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L",
@@ -130,7 +130,7 @@
   # onos-1
   #
   onos1:
-    image: cord/onos 
+    image: "${REGISTRY}voltha/onos:${TAG:-latest}"
     container_name: onos1
     ports:
     - 6633:6653
@@ -146,7 +146,7 @@
   # onos-2
   #
   onos2:
-    image: cord/onos
+    image: "${REGISTRY}voltha/onos:${TAG:-latest}"
     container_name: onos2
     ports:
     - 6644:6653
@@ -162,7 +162,7 @@
   # onos-3
   #
   onos3:
-    image: cord/onos
+    image: "${REGISTRY}voltha/onos:${TAG:-latest}"
     container_name: onos3
     ports:
     - 6655:6653
@@ -177,7 +177,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: /ofagent/ofagent/main.py -v --consul=${DOCKER_HOST_IP}:8500 --fluentd=fluentd:24224 --controller ${DOCKER_HOST_IP}:6633 ${DOCKER_HOST_IP}:6644 ${DOCKER_HOST_IP}:6655 --grpc-endpoint=@voltha-grpc --instance-id-is-container-name --enable-tls --key-file=/ofagent/pki/voltha.key --cert-file=/ofagent/pki/voltha.crt
     depends_on:
     - consul
diff --git a/compose/docker-compose-onos-swarm.yml b/compose/docker-compose-onos-swarm.yml
index f4cc89b..d441cb0 100644
--- a/compose/docker-compose-onos-swarm.yml
+++ b/compose/docker-compose-onos-swarm.yml
@@ -11,7 +11,7 @@
     freeradius:
         deploy:
             replicas: 1
-        image: "marcelmaatkamp/freeradius"
+        image: "${REGISTRY}marcelmaatkamp/freeradius:${RADIUS_TAG:-latest}"
         logging:
             driver: "json-file"
             options:
@@ -29,7 +29,7 @@
             - voltha-net
 
     onos_cluster_manager:
-        image: "voltha/unum"
+        image: "${REGISTRY}voltha/unum:${TAG:-latest}"
         deploy:
             replicas: 1
             placement:
@@ -52,7 +52,7 @@
            replicas: 3
            labels:
                org.voltha.onos.cluster: "true"
-        image: "cord/onos"
+        image: "${REGISTRY}voltha/onos:${TAG:-latest}"
         logging:
             driver: "json-file"
             options:
diff --git a/compose/docker-compose-opennms.yml b/compose/docker-compose-opennms.yml
index d1dbcb6..fe9b349 100644
--- a/compose/docker-compose-opennms.yml
+++ b/compose/docker-compose-opennms.yml
@@ -1,12 +1,12 @@
 version: '2'
 services:
   database_data:
-    image: tianon/true
+    image: "${REGISTRY}tianon/true:${TRUE_TAG:-latest}"
     volumes:
         - /var/lib/postgresql/data
 
   database:
-    image: postgres:9.6.1
+    image: "${REGISTRY}postgres:${POSTGRES_TAG:-9.6.1}"
     env_file:
       - ./opennms/env/postgres.env
     ports:
@@ -17,14 +17,14 @@
       - database_data:rw
 
   opennms_data:
-    image: tianon/true
+    image: "${REGISTRY}tianon/true:${TRUE_TAG:-latest}"
     volumes:
       - /var/log/opennms
       - /var/opennms/rrd
       - /var/opennms/reports
 
   opennms:
-    image: cord/opennms
+    image: "${REGISTRY}voltha/opennms:${TAG:-latest}"
     env_file:
       - ./opennms/env/opennms.env
       - ./opennms/env/postgres.env
diff --git a/compose/docker-compose-registry.yml b/compose/docker-compose-registry.yml
index dc6bb91..cb44be9 100644
--- a/compose/docker-compose-registry.yml
+++ b/compose/docker-compose-registry.yml
@@ -8,7 +8,7 @@
 version: "3"
 services:
   registry:
-    image: registry:2
+    image: "${REGISTRY}registry:${REGISTRY_TAG:-2}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-stats-swarm.yml b/compose/docker-compose-stats-swarm.yml
index 447be5c..5120e8a 100644
--- a/compose/docker-compose-stats-swarm.yml
+++ b/compose/docker-compose-stats-swarm.yml
@@ -15,7 +15,7 @@
 version: "3"
 services:
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
@@ -34,7 +34,7 @@
       - voltha-net
 
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-system-test-dispatcher.yml b/compose/docker-compose-system-test-dispatcher.yml
index 286ebbe..d88517a 100644
--- a/compose/docker-compose-system-test-dispatcher.yml
+++ b/compose/docker-compose-system-test-dispatcher.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -63,7 +63,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -76,7 +76,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: voltha/grafana
+    image: "${REGISTRY}voltha/grafana:${TAG:-latest}"
     ports:
     - "8883:80"
     - "2003:2003"
@@ -95,7 +95,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -113,7 +113,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -151,7 +151,7 @@
     - ponmgmt
 
   envoy:
-    image: voltha/envoy
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     entrypoint:
       - /usr/local/bin/envoyd
       - -envoy-cfg-template
@@ -175,8 +175,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L",
@@ -197,7 +197,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -222,7 +222,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
diff --git a/compose/docker-compose-system-test-encrypted.yml b/compose/docker-compose-system-test-encrypted.yml
index 7973dd7..aff19ca 100644
--- a/compose/docker-compose-system-test-encrypted.yml
+++ b/compose/docker-compose-system-test-encrypted.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: voltha/consul
+    image: "${REGISTRY}voltha/consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: voltha/registrator
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -66,7 +66,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -79,7 +79,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: voltha/grafana
+    image: "${REGISTRY}voltha/grafana:${TAG:-latest}"
     ports:
     - "8882:80"
     - "2003:2003"
@@ -98,7 +98,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -116,7 +116,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -154,8 +154,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L"
@@ -175,7 +175,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -200,7 +200,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
@@ -228,7 +228,7 @@
   # Dashboard daemon
   #
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     command: [
       "/dashd/dashd/main.py",
       "--kafka=@kafka",
@@ -247,7 +247,7 @@
   # Nginx service consolidation
   #
   nginx:
-    image: voltha/nginx
+    image: "${REGISTRY}voltha/nginx:${TAG:-latest}"
     ports:
     - "80:80"
     environment:
@@ -267,7 +267,7 @@
   # Docker ui
   #
   portainer:
-    image: voltha/portainer
+    image: "${REGISTRY}voltha/portainer:${TAG:-latest}"
     ports:
     - "9000:9000"
     environment:
diff --git a/compose/docker-compose-system-test-persistence.yml b/compose/docker-compose-system-test-persistence.yml
index ece46bf..963055c 100644
--- a/compose/docker-compose-system-test-persistence.yml
+++ b/compose/docker-compose-system-test-persistence.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -63,7 +63,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -76,7 +76,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: voltha/grafana
+    image: "${REGISTRY}voltha/grafana:${TAG:-latest}"
     ports:
     - "8883:80"
     - "2003:2003"
@@ -95,7 +95,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -113,7 +113,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -151,7 +151,7 @@
     - ponmgmt
 
   envoy:
-    image: voltha/envoy
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     entrypoint:
       - /usr/local/bin/envoyd
       - -envoy-cfg-template
@@ -175,8 +175,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L",
@@ -197,7 +197,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -222,7 +222,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
diff --git a/compose/docker-compose-system-test-with-etcd.yml b/compose/docker-compose-system-test-with-etcd.yml
index a02a9cf..b35d7cb 100644
--- a/compose/docker-compose-system-test-with-etcd.yml
+++ b/compose/docker-compose-system-test-with-etcd.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Single-node etcd server
   #
   etcd:
-    image: quay.io/coreos/etcd:v3.2.9
+    image: "${REGISTRY}quay.io/coreos/etcd:${ETCD_TAG:-v3.2.9}"
     command: [
       "etcd",
       "--name=etcd0",
@@ -66,7 +66,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -83,7 +83,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -96,7 +96,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: voltha/grafana
+    image: "${REGISTRY}voltha/grafana:${TAG:-latest}"
     ports:
     - "8883:80"
     - "2003:2003"
@@ -115,7 +115,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -133,7 +133,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -174,7 +174,7 @@
     - ponmgmt
 
   envoy:
-    image: voltha/envoy
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     entrypoint:
       - /usr/local/bin/envoyd
       - -envoy-cfg-template
@@ -206,8 +206,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L",
@@ -228,7 +228,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -256,7 +256,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
@@ -284,7 +284,7 @@
   # Dashboard daemon
   #
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     command: [
       "/dashd/dashd/main.py",
       "--kafka=@kafka",
@@ -303,7 +303,7 @@
   # Nginx service consolidation
   #
   nginx:
-    image: voltha/nginx
+    image: "${REGISTRY}voltha/nginx:${TAG:-latest}"
     ports:
     - "80:80"
     environment:
@@ -321,7 +321,7 @@
   # Docker ui
   #
   portainer:
-    image: voltha/portainer
+    image: "${REGISTRY}voltha/portainer:${TAG:-latest}"
     ports:
     - "9000:9000"
     environment:
diff --git a/compose/docker-compose-system-test.yml b/compose/docker-compose-system-test.yml
index 0ce7920..7231ed9 100644
--- a/compose/docker-compose-system-test.yml
+++ b/compose/docker-compose-system-test.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092
     environment:
@@ -30,7 +30,7 @@
   # Single-node consul agent
   #
   consul:
-    image: consul:latest
+    image: "${REGISTRY}consul:${CONSUL_TAG:-0.9.2}"
     command: agent -server -bootstrap -client 0.0.0.0 -ui
     ports:
     - "8300:8300"
@@ -46,7 +46,7 @@
   # Registrator
   #
   registrator:
-    image: gliderlabs/registrator:latest
+    image: "${REGISTRY}gliderlabs/registrator:${REGISTRATOR_TAG:-latest}"
     command: [
       "-ip=${DOCKER_HOST_IP}",
       "-retry-attempts", "100",
@@ -63,7 +63,7 @@
   # Fluentd log server
   #
   fluentd:
-    image: fluent/fluentd
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
     ports:
     - "24224:24224"
     volumes:
@@ -76,7 +76,7 @@
   # (demo place-holder for external KPI system)
   #
   grafana:
-    image: voltha/grafana
+    image: "${REGISTRY}voltha/grafana:${TAG:-latest}"
     ports:
     - "8883:80"
     - "2003:2003"
@@ -95,7 +95,7 @@
   # Shovel (Kafka-graphite-gateway)
   #
   shovel:
-    image: cord/shovel
+    image: "${REGISTRY}voltha/shovel:${TAG:-latest}"
     command: [
       "/shovel/shovel/main.py",
       "--kafka=@kafka",
@@ -113,7 +113,7 @@
   # Voltha server instance(s)
   #
   voltha:
-    image: cord/voltha
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     command: [
       "/voltha/voltha/main.py",
       "-v",
@@ -151,7 +151,7 @@
     - ponmgmt
 
   envoy:
-    image: voltha/envoy
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
     entrypoint:
       - /usr/local/bin/envoyd
       - -envoy-cfg-template
@@ -175,8 +175,8 @@
   #
   # Voltha cli container
   #
-  vcli:
-    image: cord/vcli
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
     command: [
       "/cli/cli/setup.sh",
       "-L",
@@ -197,7 +197,7 @@
   # ofagent server instance
   #
   ofagent:
-    image: cord/ofagent
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
     command: [
       "/ofagent/ofagent/main.py",
       "-v",
@@ -225,7 +225,7 @@
   # Netconf server instance(s)
   #
   netconf:
-    image: cord/netconf
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
     privileged: true
     command: [
       "/netconf/netconf/main.py",
@@ -253,7 +253,7 @@
   # Dashboard daemon
   #
   dashd:
-    image: cord/dashd
+    image: "${REGISTRY}voltha/dashd:${TAG:-latest}"
     command: [
       "/dashd/dashd/main.py",
       "--kafka=@kafka",
@@ -272,7 +272,7 @@
   # Nginx service consolidation
   #
   nginx:
-    image: voltha/nginx
+    image: "${REGISTRY}voltha/nginx:${TAG:-latest}"
     ports:
     - "80:80"
     environment:
@@ -290,7 +290,7 @@
   # Docker ui
   #
   portainer:
-    image: voltha/portainer
+    image: "${REGISTRY}voltha/portainer:${TAG:-latest}"
     ports:
     - "9000:9000"
     environment:
diff --git a/compose/docker-compose-voltha-swarm.yml b/compose/docker-compose-voltha-swarm.yml
index bff9f90..cbbe319 100644
--- a/compose/docker-compose-voltha-swarm.yml
+++ b/compose/docker-compose-voltha-swarm.yml
@@ -1,7 +1,7 @@
 version: "3"
 services:
   vcore:
-    image: cord/voltha:latest
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
     logging:
       driver: "json-file"
       options:
diff --git a/compose/docker-compose-zk-kafka-test.yml b/compose/docker-compose-zk-kafka-test.yml
index 09c562b..748a9c2 100644
--- a/compose/docker-compose-zk-kafka-test.yml
+++ b/compose/docker-compose-zk-kafka-test.yml
@@ -4,7 +4,7 @@
   # Single-node zookeeper service
   #
   zookeeper:
-    image: wurstmeister/zookeeper
+    image: "${REGISTRY}wurstmeister/zookeeper:${ZK_TAG:-latest}"
     ports:
     - 2181:2181
     environment:
@@ -13,7 +13,7 @@
   # Single-node kafka service
   #
   kafka:
-    image: wurstmeister/kafka
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-latest}"
     ports:
      - 9092:9092
     environment:
@@ -22,4 +22,4 @@
       KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
       SERVICE_9092_NAME: "kafka"
     volumes:
-      - /var/run/docker.sock:/var/run/docker.sock
\ No newline at end of file
+      - /var/run/docker.sock:/var/run/docker.sock
diff --git a/compose/voltha-stack.yml.j2 b/compose/voltha-stack.yml.j2
new file mode 100644
index 0000000..09033d4
--- /dev/null
+++ b/compose/voltha-stack.yml.j2
@@ -0,0 +1,484 @@
+# Copyright 2017 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.
+#
+#
+# SWARM_MANAGER_COUNT - The number of managers in the swarm cluster. This is
+#               used to limit the number of instances of some of the 
+#               service instances for smaller clusters. 
+#               [ NOTE - currently this parameter is handled via a Jinga2
+#                 templating capability, because as of 17.09.0-ce Docker
+#                 cannot use and environment variable for the `replicas`
+#                 attribute on a container. ]
+# REGISTRY    - The docker registry from which images should be pulled.
+#               If specified if should end in a `/`. Defaults to empty.
+# TAG         - The tag that should be used when referencing VOLTHA docker
+#               images, defaults to `latest`.
+# CONSUL_ROOT - The local path on which the consul/data and consul/config
+#               directories should be created. Defaults to `/var/local`.
+# VOLTHA_LOGS - The location into which `fluentd` should writes logs.
+#               Defaults to `/var/log`.
+# RADIUS_ROOT - The location in which the `data/clients.conf` and 
+#               `data/users` configuration files can be found. Defaults
+#               to `/var/local`.
+# DOCKER_HOST_IP -
+# ZK_TAG      - The tag that should be used when referencing the ZooKeeper
+#               docker image. Defaults to `3.4.11`.
+# KAFKA_TAG   - The tag that should be used when referencing the Kafka
+#               docker image. Default to `1.0.0`.
+# CONSUL_TAG  - The tag that should be used when referencing the Consul
+#               docker image. Defaults to `0.9.2`.
+# RADIUS_TAG  - The tag that should be used when referencing the FreeRADIUS
+#               docker image. Defaults to `latest`.
+version: "3"
+
+services:
+  zk1:
+    image: "${REGISTRY}zookeeper:${ZK_TAG:-3.4.11}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    networks:
+      - kafka-net
+    environment:
+      ZOO_MY_ID: 1
+      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
+
+  zk2:
+    image: "${REGISTRY}zookeeper:${ZK_TAG:-3.4.11}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    networks:
+      - kafka-net
+    environment:
+      ZOO_MY_ID: 2
+      ZOO_SERVERS: server.1=zk1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zk3:2888:3888
+
+  zk3:
+    image: "${REGISTRY}zookeeper:${ZK_TAG:-3.4.11}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    networks:
+      - kafka-net
+    environment:
+      ZOO_MY_ID: 3
+      ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=0.0.0.0:2888:3888
+
+  kafka:
+    deploy:
+      mode: global
+    image: "${REGISTRY}wurstmeister/kafka:${KAFKA_TAG:-1.0.0}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    environment:
+      KAFKA_ADVERTISED_PORT: 9092
+      KAFKA_ZOOKEEPER_CONNECT: zk1:2181,zk2:2181,zk3:2181
+      KAFKA_HEAP_OPTS: -Xmx256M -Xms128M
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+    networks:
+      - kafka-net
+      - voltha-net
+    ports:
+      - 9092:9092
+
+  consul:
+    image: ${REGISTRY}consul:${CONSUL_TAG:-0.9.2}
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+
+    # Deploy to all docker manager nodes
+    deploy:
+      mode: global
+      placement:
+        constraints:
+          - node.role == manager
+      restart_policy:
+        condition: on-failure
+    entrypoint:
+      - consul
+      - agent
+      - -server
+      - -bootstrap-expect={{ SWARM_MANAGER_COUNT | default(1) }}
+      - -config-dir=/consul/config
+      - -data-dir=/consul/data              # mandatory property
+      - -client=0.0.0.0
+      - -advertise={{ '{{' }} GetAllInterfaces | include "network" "172.29.20.0/29" | sort "size,address" | attr "address" {{ '}}' }}
+      - -ui
+      - -raft-protocol=3
+      - -rejoin
+      - -retry-join=172.29.20.2
+      - -retry-join=172.29.20.3
+      - -retry-join=172.29.20.4
+      - -retry-join=172.29.20.5
+      - -retry-join=172.29.20.6
+      - -retry-join=172.29.20.7
+    networks:
+      - consul-net
+      - voltha-net
+    ports:
+      - "8300:8300"
+      - "8400:8400"
+      - "8500:8500"
+      - "8600:8600/udp"
+{%- if CONSUL_ROOT is defined and CONSUL_ROOT %}
+    volumes:
+      - {{ CONSUL_ROOT }}/data:/consul/data
+      - {{ CONSUL_ROOT }}/config:/consul/config
+{%- endif %}
+
+  fluentdactv:
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+    environment:
+        FLUENTD_CONF: fluent-agg.conf
+    networks:
+      - voltha-net
+    ports:
+      - "24224"
+{%- if VOLTHA_LOGS is defined and VOLTHA_LOGS %}
+    volumes:
+      - "{{ VOLTHA_LOGS }}:/fluentd/log"
+{%- endif %}
+
+  fluentdstby:
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+    environment:
+        FLUENTD_CONF: fluent-agg.conf
+    networks:
+      - voltha-net
+    ports:
+      - "24224"
+{%- if VOLTHA_LOGS is defined and VOLTHA_LOGS %}
+    volumes:
+      - "{{ VOLTHA_LOGS }}:/fluentd/log"
+{%- endif %}
+
+  # The Fluentd container is part of the data collection
+  # infrastructure.
+  fluentd:
+    image: "${REGISTRY}voltha/fluentd:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: replicated
+      replicas: {{ SWARM_MANAGER_COUNT | default(1) }}
+      restart_policy:
+        condition: any
+    environment:
+        SERVICE_24224_NAME: "fluentd-intake"
+        FLUENTD_CONF: fluent.conf
+        WAIT_FOR: "fluentdactv:24224 fluentdstby:24224"
+        WAIT_FOR_TIMEOUT: 0
+    networks:
+      - voltha-net
+    ports:
+      - "24224"
+
+  # Free RADIUS can be used to test VOLTHA's authentication 
+  # sequence, i.e., EAPOL from a device behind an OLT to 
+  # RADIUS authentication on the back end systems. By default
+  # no instances of Free RADIUS are deployed.
+  freeradius:
+    deploy:
+      replicas: 0
+    image: "${REGISTRY}marcelmaatkamp/freeradius:${RADIUS_TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    ports:
+      - "1812:1812/udp"
+      - "1813:1813"
+      - "18120:18120"
+  
+{%- if RADIUS_ROOT is defined and RADIUS_ROOT %}  
+    # CONFIG: When deploying a Free RADIUS instance client and user
+    #      information will need to be configured for the service to
+    #      operate correctly.
+    #
+    volumes:
+      - {{ RADIUS_ROOT }}/data/clients.conf:/etc/raddb/clients.conf
+      - {{ RADIUS_ROOT }}/data/users:/etc/raddb/users
+{%- endif %}
+    networks:
+      - voltha-net
+
+  # The cluster manager container calculates and servers ONOS cluster
+  # meta data via HTTP so that ONOS instances can form an HA cluster.
+  # The cluster manager must run on a manager node so that it can 
+  # retrieve service information from manager nodes
+  onos_cluster_manager:
+    image: "${REGISTRY}voltha/unum:${TAG:-latest}"
+    deploy:
+      replicas: 1
+      placement:
+        constraints:
+          - node.role == manager
+    environment:
+      PERIOD: "10s"
+      LOG_LEVEL: "debug"
+      ORCHESTRATION: "swarm://"
+      LABELS: "org.voltha.onos.cluster:true"
+      NETWORK: "org.voltha.onos.cluster:true"
+    ports:
+      - 5411:5411
+    networks:
+      - voltha-net
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+
+  # ONOS is the SDN controller for the solution and handles AAA,
+  # IGMP proxy, and L2 DHCP requests as well as manages flows
+  # down to the virtual devices (MCAST + OLT flows).
+  # Currently there is a single instance of ONOS as some of the
+  # applications running under ONOS do not support HA.
+  onos:
+    deploy:
+      replicas: 1
+      labels:
+        org.voltha.onos.cluster: "true"
+    image: "${REGISTRY}voltha/onos:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    ports:
+      - 8101:8101 # ssh
+      - 6653:6653 # OF
+      - 8181:8181 # UI
+    environment:
+      EXTRA_JAVA_OPTS: "-Donos.cluster.metadata.uri=http://onos_cluster_manager:5411/config/"
+    networks:
+      - voltha-net
+
+  # The VCORE container is the core capabilities of VOLTHA including
+  # interacting with device adapters
+  vcore:
+    image: "${REGISTRY}voltha/voltha:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: {{ SWARM_MANAGER_COUNT | default(1) }}
+    entrypoint:
+      - voltha/voltha/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --kafka=kafka
+      - --rest-port=8880
+      - --grpc-port=50556
+      - --instance-id-is-container-name
+      - --backend=consul
+      - --inter-core-subnet=172.29.19.0/24
+      - --pon-subnet=172.29.19.0/24
+    networks:
+      - voltha-net
+    ports:
+      - "8880:8880"
+      - "18880:18880"
+      - "50556:50556"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The OpenFlow Agent support the OpenFlow protocol communication
+  # between ONOS and VOLTHA.
+  ofagent:
+    image: "${REGISTRY}voltha/ofagent:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+    entrypoint:
+      - /ofagent/ofagent/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --controller=onos:6653
+      - --grpc-endpoint=vcore:50556
+      - --instance-id-is-container-name
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+    networks:
+      - voltha-net
+
+  # The VOLTHA container supports load balancing of request to
+  # the VOLTHA components as well as surfaces a REST API and maps
+  # the requests to GPRC
+  voltha:
+    image: "${REGISTRY}voltha/envoy:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: 1
+    #environment:
+    #  DOCKER_HOST_IP: "${DOCKER_HOST_IP}"
+    entrypoint:
+      - /usr/local/bin/envoyd
+      - -envoy-cfg-template
+      - "/envoy/voltha-grpc-proxy.template.json"
+      - -envoy-config
+      - "/envoy/voltha-grpc-proxy.json"
+    networks:
+      - voltha-net
+    ports:
+      - "50555:50555"
+      - "8882:8882"
+      - "8443:8443"
+      - "8001:8001"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The CLI container provides an CLI to the VOLTHA capabilitiy 
+  # that can be accessed via SSH.
+  cli:
+    image: "${REGISTRY}voltha/cli:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      replicas: {{ SWARM_MANAGER_COUNT | default(1) }}
+    #environment:
+    #  DOCKER_HOST_IP: "${DOCKER_HOST_IP}"
+    entrypoint:
+      - /cli/cli/setup.sh
+      - -C consul:8500
+      - -g voltha:50555
+      - -s voltha:18880
+      - -G
+    networks:
+      - voltha-net
+    ports:
+      - "5022:22"
+
+  # The Netconf container provides an NETCONF API to be used
+  # with VOLTHA and maps that to GRPC requests
+  netconf:
+    image: "${REGISTRY}voltha/netconf:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: global
+    environment:
+      SERVICE_1830_NAME: "netconf-server"
+    entrypoint:
+      - /netconf/netconf/main.py
+      - -v
+      - --consul=consul:8500
+      - --fluentd=fluentd:24224
+      - --grpc-endpoint=voltha:50555
+      - --instance-id-is-container-name
+    networks:
+      - voltha-net
+    ports:
+      - "830:1830"
+    volumes:
+      - /var/run/docker.sock:/tmp/docker.sock
+
+  # The tools container provides a bash command shell to which
+  # an operator can SSH that has the same network connectivity
+  # as other VOLTHA containers and is thus a convenient 
+  # troubleshooting tool
+  tools:
+    image: "${REGISTRY}voltha/tools:${TAG:-latest}"
+    logging:
+      driver: "json-file"
+      options:
+        max-size: "10m"
+        max-file: 3
+    deploy:
+      mode: replicated
+      replicas: 1
+      restart_policy:
+        condition: on-failure
+    ports:
+      - "4022:22"
+    networks:
+      - voltha-net
+      - kafka-net
+
+networks:
+  consul-net:
+    driver: overlay
+    driver_opts:
+      encrypted: "true"
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.29.20.0/29
+
+  voltha-net:
+    driver: overlay
+    driver_opts:
+      encrypted: "true"
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.29.19.0/24
+    labels:
+      org.voltha.onos.cluster: "true"
+
+  kafka-net:
+    driver: overlay
+    driver_opts:
+      encrypted: "true"