diff --git a/Makefile b/Makefile
index 4675b73..a699518 100644
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,7 @@
 
 VENVDIR := venv-$(shell uname -s | tr '[:upper:]' '[:lower:]')
 
-.PHONY: $(DIRS) $(DIRS_CLEAN) $(DIRS_FLAKE8) flake8 docker-base voltha ofagent podder netconf shovel onos dashd vcli portainer grafana nginx consul registrator envoy golang envoyd tools opennms logstash unum
+.PHONY: $(DIRS) $(DIRS_CLEAN) $(DIRS_FLAKE8) flake8 docker-base voltha ofagent netconf shovel onos dashd vcli portainer grafana nginx consul envoy golang envoyd tools opennms logstash unum
 
 # This should to be the first and default target in this Makefile
 help:
@@ -60,7 +60,6 @@
 	@echo "docker-base  : Build the base docker container used by all other dockers"
 	@echo "voltha       : Build the voltha docker container"
 	@echo "ofagent      : Build the ofagent docker container"
-	@echo "podder       : Build the podder docker container"
 	@echo "netconf      : Build the netconf docker container"
 	@echo "shovel       : Build the shovel docker container"
 	@echo "onos         : Build the onos docker container"
@@ -110,11 +109,11 @@
 
 jenkins : protos jenkins-containers
 
-jenkins-containers: docker-base voltha ofagent netconf consul registrator unum
+jenkins-containers: docker-base voltha ofagent netconf consul unum
 
 prod-containers: docker-base voltha ofagent netconf shovel dashd vcli grafana consul tools golang envoyd envoy fluentd unum
 
-containers: docker-base voltha ofagent podder netconf shovel onos tester config-push dashd vcli portainer grafana nginx consul registrator tools golang envoyd envoy fluentd unum
+containers: docker-base voltha ofagent netconf shovel onos tester config-push dashd vcli portainer grafana nginx consul tools golang envoyd envoy fluentd unum
 
 docker-base:
 	docker build $(DOCKER_BUILD_ARGS) -t cord/voltha-base -f docker/Dockerfile.base .
@@ -128,9 +127,6 @@
 ofagent:
 	docker build $(DOCKER_BUILD_ARGS) -t cord/ofagent -f docker/Dockerfile.ofagent .
 
-podder:
-	docker build $(DOCKER_BUILD_ARGS) -t cord/podder -f docker/Dockerfile.podder .
-
 tools:
 	docker build $(DOCKER_BUILD_ARGS) -t voltha/tools -f docker/Dockerfile.tools .
 
@@ -171,9 +167,6 @@
 consul:
 	docker build $(DOCKER_BUILD_ARGS) -t voltha/consul -f docker/Dockerfile.consul .
 
-registrator:
-	docker build $(DOCKER_BUILD_ARGS) -t voltha/registrator -f docker/Dockerfile.registrator .
-
 grafana:
 	docker build $(DOCKER_BUILD_ARGS) -t voltha/grafana -f docker/Dockerfile.grafana .
 
@@ -216,9 +209,6 @@
 	docker pull ubuntu:xenial
 	docker pull wurstmeister/kafka:1.0.0
 	docker pull zookeeper:3.4.11
-	# These images are depricated and should be removed in subsequent commits.
-	docker pull gliderlabs/registrator:v7
-	docker pull wurstmeister/zookeeper:3.4.6
 fetch:
 	docker pull consul:0.9.2
 	docker pull fluent/fluentd:v0.14.23.rc1
@@ -229,11 +219,6 @@
 	docker pull lyft/envoy:29361deae91575a1d46c7a21e913f19e75622ebe
 	docker pull registry:2
 	docker pull kamon/grafana_graphite:3.0
-	# These images are depricated and should be removed in subsequent commits.
-	docker pull gliderlabs/registrator:v7
-	docker pull wurstmeister/zookeeper:3.4.6
-	docker pull nginx:1.13.6
-
 
 purge-venv:
 	rm -fr ${VENVDIR}
diff --git a/common/utils/dockerhelpers.py b/common/utils/dockerhelpers.py
index 89acab6..4620aef 100644
--- a/common/utils/dockerhelpers.py
+++ b/common/utils/dockerhelpers.py
@@ -30,18 +30,6 @@
 docker_socket = os.environ.get('DOCKER_SOCK', 'unix://tmp/docker.sock')
 log = get_logger()
 
-
-def remove_container(id, force=True):
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        containers = docker_cli.remove_container(id, force=force)
-
-    except Exception, e:
-        log.exception('failed', e=e)
-        raise
-
-    return containers
-
 def get_my_containers_name():
     """
     Return the docker containers name in which this process is running.
@@ -85,168 +73,3 @@
 
     return info
 
-
-def create_host_config(volumes, ports):
-    try:
-        port_bindings = ports
-        binds = ['{0}:{1}'.format(k, v) for k, v in volumes.iteritems()]
-        docker_cli = Client(base_url=docker_socket)
-        host_config = docker_cli.create_host_config(binds=binds,
-                                                    port_bindings=port_bindings)
-    except Exception, e:
-        log.exception('failed-host-config-creation', volumes, ports, e=e)
-        raise
-
-    return host_config
-
-def connect_container_to_network(container, net_id, links):
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        docker_cli.connect_container_to_network(container, net_id, links=links)
-    except Exception, e:
-        log.exception('failed-connection-to-network',
-                      container=container, net_id=net_id, e=e)
-        raise
-
-def create_networking_config(name, links):
-    """
-    Creates a container networks based on a set of containers.
-    :param name: the network name
-    :param links: the set of containers to link
-    :return: a network configuration
-    """
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        networking_config = docker_cli.create_networking_config({
-            name : docker_cli.create_endpoint_config(links=links)
-        })
-    except Exception, e:
-        log.exception('failed-network-creation', name, e=e)
-        raise
-
-    return networking_config
-
-def stop_container(container, timeout=10):
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        docker_cli.stop(container, timeout=timeout)
-    except Exception, e:
-        log.exception('failed', e=e)
-        raise
-
-def create_container(args):
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        container = docker_cli.create_container(**args)
-    except Exception, e:
-        log.exception('failed', e=e)
-        raise
-    return container
-
-def start_container(container):
-    """
-    Starts a requested container with the appropriate configuration.
-    :param args: contains arguments for container creation
-        (see https://docker-py.readthedocs.io/en/stable/api/#create_container)
-    :return: the containers name
-    """
-    try:
-        docker_cli = Client(base_url=docker_socket)
-        response = docker_cli.start(container=container.get('Id'))
-    except Exception, e:
-        log.exception('failed', e=e)
-        raise
-    return response
-
-class EventProcessor(object):
-    """
-    This class handles the api session and allows for it to
-    be terminated.
-    """
-    def __init__(self, threads=1):
-        self.client = CustomClient(base_url=docker_socket)
-        self.events = self.client.events(decode=True)
-        log.info("starting", threads=threads)
-        self.exec_service = ThreadPoolExecutor(max_workers=threads)
-
-    def stop_listening(self):
-        """
-        Shuts down the socket.
-        :return: None
-        """
-        if self.events is not None:
-            sock = self.client._get_raw_response_socket(self.events.response)
-            sock.shutdown(socket.SHUT_RDWR)
-
-
-    def listen_for_events(self, handlers):
-        """
-        Listens to the docker event stream and applies the functions
-        in the passed handler to each event.
-
-        docker containers can report the following events:
-
-        attach, commit, copy, create, destroy, detach, die,
-        exec_create, exec_detach, exec_start, export,
-        health_status, kill, oom, pause, rename, resize,
-        restart, start, stop, top, unpause, update
-
-        :param handlers: a dict of functions
-        :return: None
-        """
-        if not handlers or len(handlers) == 0:
-            raise ValueError("Handlers cannot be empty")
-
-        for event in self.events:
-            for k in ['time', 'Time']:
-                if k in event:
-                    event[k] = datetime.fromtimestamp(event[k])
-            log.debug('docker-event', event=event)
-
-            data = {}
-            i = get_id(event)
-            if i is not None:
-                try:
-                    if 'from' in event or 'From' in event:
-                        data = self.client.inspect_container(i)
-                    else:
-                        data = self.client.inspect_image(i)
-                    data[i] = data
-                except errors.NotFound:
-                    log.debug('no-data-for-container', container=i)
-
-            status = get_status(event)
-            if status in handlers:
-                self.exec_service.submit(handlers[get_status(event)], event,
-                                         data, handlers['podder_config'])
-            else:
-                log.debug('no-handler', handler=status)
-
-class CustomGenerator(object):
-    """
-    This is a custom ugly class that allows for the generator
-    to be (kind of) cleanly closed.
-    """
-    def __init__(self, stream, response, decode):
-        self.stream = stream
-        self.response = response
-        self.decode = decode
-
-    def __iter__(self):
-        for item in super(CustomClient, self.stream).\
-                _stream_helper(self.response, self.decode):
-            yield item
-
-class CustomClient(Client):
-    def _stream_helper(self, response, decode=False):
-        return CustomGenerator(self, response, decode)
-
-def get_status(event):
-    for k in ['status', 'Status']:
-        if k in event:
-            return event[k]
-
-def get_id(event):
-    for k in ['id', 'ID', 'Id']:
-        if k in event:
-            return event[k]
diff --git a/compose/docker-compose-system-test-with-podder.yml b/compose/docker-compose-system-test-with-podder.yml
deleted file mode 100644
index 2295848..0000000
--- a/compose/docker-compose-system-test-with-podder.yml
+++ /dev/null
@@ -1,160 +0,0 @@
-version: '2'
-services:
-  #
-  # Single-node zookeeper service
-  #
-  zookeeper:
-    image: wurstmeister/zookeeper
-    ports:
-    - 2181
-    environment:
-      SERVICE_2181_NAME: "zookeeper"
-  #
-  # Single-node kafka service
-  #
-  kafka:
-    image: wurstmeister/kafka
-    ports:
-     - 9092
-    environment:
-      KAFKA_ADVERTISED_HOST_NAME: ${DOCKER_HOST_IP}
-      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
-      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
-      KAFKA_HEAP_OPTS: "-Xmx256M -Xms128M"
-      SERVICE_9092_NAME: "kafka"
-    depends_on:
-    - consul
-    volumes:
-      - /var/run/docker.sock:/var/run/docker.sock
-  #
-  # Single-node consul agent
-  #
-  consul:
-    image: consul:latest
-    command: agent -server -bootstrap -client 0.0.0.0 -ui
-    ports:
-    - "8300:8300"
-    - "8400:8400"
-    - "8500:8500"
-    - "8600:8600/udp"
-    environment:
-      #SERVICE_53_IGNORE: "yes"
-      SERVICE_8300_IGNORE: "yes"
-      SERVICE_8400_IGNORE: "yes"
-      SERVICE_8500_NAME: "consul-rest"
-  #
-  # Registrator
-  #
-  registrator:
-    image: gliderlabs/registrator:latest
-    command: [
-      "-ip=${DOCKER_HOST_IP}",
-      "-retry-attempts", "100",
-      # "-internal",
-      "consul://consul:8500"
-    ]
-    links:
-    - consul
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
-  #
-  # Fluentd log server
-  #
-  fluentd:
-    image: fluent/fluentd
-    ports:
-    - "24224:24224"
-    volumes:
-    - "/tmp/fluentd:/fluentd/log"
-    environment:
-      SERVICE_24224_NAME: "fluentd-intake"
-
-  #
-  # Podder service instance
-  #
-  podder:
-    image: cord/podder
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
-    restart: unless-stopped
-
-  #
-  # Graphite-Grafana-statsd service instance
-  # (demo place-holder for external KPI system)
-  #
-  grafana:
-    image: kamon/grafana_graphite
-    ports:
-    - "8882:80"
-    - "2003:2003"
-    - "2004:2004"
-    - "8126:8126"
-    - "8125:8125/udp"
-    environment:
-      SERVICE_80_NAME:   "grafana-web-ui"
-      SERVICE_2003_NAME: "carbon-plain-text-intake"
-      SERVICE_2004_NAME: "carbon-pickle-intake"
-      SERVICE_8126_NAME: "statsd-tcp-intake"
-      SERVICE_8125_NAME: "statsd-udp-intake"
-
-  #
-  # Shovel (Kafka-graphite-gateway)
-  #
-  shovel:
-    image: cord/shovel
-    command: [
-      "/shovel/shovel/main.py",
-      "--kafka=@kafka",
-      "--consul=${DOCKER_HOST_IP}:8500",
-      "--topic=voltha.kpis",
-      "--host=${DOCKER_HOST_IP}"
-    ]
-    depends_on:
-    - consul
-    - kafka
-    - grafana
-
-  #
-  # Voltha server instance(s)
-  #
-  voltha:
-    image: cord/voltha
-    command: [
-      "/voltha/voltha/main.py",
-      "-v",
-      "--consul=${DOCKER_HOST_IP}:8500",
-      "--fluentd=fluentd:24224",
-      "--rest-port=8880",
-      "--grpc-port=50555",
-      "--kafka=@kafka",
-      "--instance-id-is-container-name",
-      "-v"
-    ]
-    ports:
-    - 8880
-    - 50555
-    - 18880
-    depends_on:
-    - consul
-    - podder
-    links:
-    - consul
-    - fluentd
-    environment:
-      SERVICE_8880_NAME: "voltha-health"
-      SERVICE_8880_CHECK_HTTP: "/health"
-      SERVICE_8880_CHECK_INTERVAL: "5s"
-      SERVICE_8880_CHECK_TIMEOUT: "1s"
-      SERVICE_50555_NAME: "voltha-grpc"
-      SERVICE_18880_NAME: "voltha-sim-rest"
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
-    networks:
-    - default
-    - ponmgmt
-
-networks:
-  default:
-    driver: bridge
-  ponmgmt:
-    driver: bridge
diff --git a/docker/Dockerfile.podder b/docker/Dockerfile.podder
deleted file mode 100644
index 30857cd..0000000
--- a/docker/Dockerfile.podder
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-#
-# 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 cord/voltha-base
-
-MAINTAINER Zsolt Haraszti <zharaszt@ciena.com>
-MAINTAINER Ali Al-Shabibi <ali.al-shabibi@onlab.us>
-MAINTAINER Nathan Knuth   <nathan.knuth@tibitcom.com>
-
-RUN mkdir /podder && touch /podder/__init__.py
-ENV PYTHONPATH=/podder
-COPY common /podder/common
-COPY podder /podder/podder
-
-# Exposing process and default entry point
-CMD ["python", "podder/podder/main.py"]
diff --git a/docs/manuals/user/labtests/V01_voltha_bringup_deploy.md b/docs/manuals/user/labtests/V01_voltha_bringup_deploy.md
index f198ba0..2667d56 100644
--- a/docs/manuals/user/labtests/V01_voltha_bringup_deploy.md
+++ b/docs/manuals/user/labtests/V01_voltha_bringup_deploy.md
@@ -58,7 +58,6 @@
   Creating compose_chameleon_1
   Creating compose_netconf_1
   Creating compose_zookeeper_1
-  Creating compose_podder_1
   Creating compose_kafka_1
   Creating compose_grafana_1
   Creating compose_shovel_1
@@ -93,7 +92,6 @@
   compose_kafka_1         start-kafka.sh                   Up      0.0.0.0:...
   compose_netconf_1       /netconf/netconf/main.py - ...   Up      0.0.0.0:...
   compose_ofagent_1       /ofagent/ofagent/main.py - ...   Up
-  compose_podder_1        python podder/podder/main.py     Up
   compose_registrator_1   /bin/registrator -ip=10.0. ...   Up
   compose_shovel_1        /shovel/shovel/main.py --k ...   Up
   compose_voltha_1        /voltha/voltha/main.py -v  ...   Up      0.0.0.0:...
diff --git a/podder/handlers.py b/podder/handlers.py
deleted file mode 100644
index 825cd60..0000000
--- a/podder/handlers.py
+++ /dev/null
@@ -1,148 +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 common.utils.dockerhelpers import create_host_config, create_container, start_container, create_networking_config, \
-    get_all_running_containers, inspect_container, remove_container
-from docker import errors
-
-from structlog import get_logger
-import yaml
-
-log = get_logger()
-
-INSTANCE_ID_KEY = 'com.docker.compose.container-number'
-INSTANCE_NAME_KEY = 'name'
-
-
-def check(event):
-    return ('from' in event) and\
-           ('Actor' in event and 'Attributes' in event['Actor'] and\
-                        INSTANCE_ID_KEY in event['Actor']['Attributes']) and\
-           ('Actor' in event and 'Attributes' in event['Actor'] and\
-                        INSTANCE_NAME_KEY in event['Actor']['Attributes'])
-
-def get_entry(key, dico, mandatory = False, noneval=None):
-    if key in dico:
-        return dico[key]
-    if mandatory:
-        raise Exception('Key {} must be in container config'.format(key))
-    return noneval
-
-def obtain_network_name(data):
-    return data['NetworkSettings']['Networks'].keys()
-
-
-def create_network_config(network, links):
-    if links is None:
-        return None
-    # Assuming only one network exists....
-    return create_networking_config(network[0], { l : l for l in links})
-
-def process_value(value):
-    if value is None:
-        return None
-    if isinstance(value, dict):
-        return value
-    if isinstance(value, list):
-        retval = {}
-        for item in value:
-            if not isinstance(item, int) and ':' in item:
-                item_split = item.split(':')
-                retval[item_split[0]] = item_split[1]
-            else:
-                retval[item] = None
-        return retval
-    raise Exception('Cannot handle {}'.format(value))
-
-def construct_container_spec(config):
-    container_spec = {}
-    container_spec['image'] = get_entry('image', config, mandatory=True)
-    container_spec['command'] = get_entry('command', config, mandatory=True)
-    container_spec['environment'] = get_entry('environment', config, noneval={})
-    container_spec['ports'] = get_entry('ports', config)
-    container_spec['volumes'] = get_entry('volumes', config)
-    return container_spec
-
-def service_shutdown(service, instance_name, config):
-    containers = get_all_running_containers()
-    for container in containers:
-        try:
-            info = inspect_container(container['Id'])
-        except errors.NotFound, e:
-            continue
-        envs = info['Config']['Env']
-        for env in envs:
-            for name in env.split('='):
-                if name == instance_name:
-                    log.info('Removing container {}'.format(container['Names']))
-                    remove_container(container['Id'])
-
-def start_slaves(service, instance_name, instance_id, data, conf):
-    network = obtain_network_name(data)
-    # still assuming a single network
-    config = yaml.load(conf.render(data=data, network=network[0]))
-
-    if service not in config['services']:
-        log.debug('Unknown service {}'.format(service))
-        return
-    for slave in config['services'][service]['slaves']:
-        if slave not in config['slaves']:
-            log.debug('Unknown slave service {}'.format(slave))
-            continue
-
-        netcfg = create_network_config(network, get_entry('links', config['slaves'][slave]))
-        container_spec = construct_container_spec(config['slaves'][slave])
-        container_spec['networking_config'] = netcfg
-        if 'volumes' in container_spec:
-            container_spec['host_config'] = create_host_config(
-                process_value(container_spec['volumes']),
-                process_value(container_spec['ports']))
-        container_spec['name'] = 'podder_%s_%s' % (slave, instance_id)
-
-        container_spec['environment']['PODDER_MASTER'] = instance_name
-
-        container = create_container(container_spec)
-        log.info('Starting slaves for {}'.format(instance_name))
-        start_container(container)
-
-
-def stop_slaves(service, instance_name, instance_id, data, conf):
-    log.info('Stopping slaves for {}'.format(instance_name))
-    config = yaml.load(conf.render())
-    if service in config['services']:
-        service_shutdown(service, instance_name, config)
-    else:
-        # handle slave shutdown; restart him
-        pass
-
-
-def handler_start(event, data, config):
-    if not check(event):
-        log.debug('event {} is invalid'.format(event) )
-        return
-    service = event['from']
-    instance_name = event['Actor']['Attributes'][INSTANCE_NAME_KEY]
-    instance_id = event['Actor']['Attributes'][INSTANCE_ID_KEY]
-    start_slaves(service, instance_name, instance_id, data, config)
-
-def handler_stop(event, data, config):
-    if not check(event):
-        log.debug('event {} is invalid'.format(event) )
-        return
-    service = event['from']
-    instance_name = event['Actor']['Attributes'][INSTANCE_NAME_KEY]
-    instance_id = event['Actor']['Attributes'][INSTANCE_ID_KEY]
-    stop_slaves(service, instance_name, instance_id, data, config)
-
diff --git a/podder/main.py b/podder/main.py
deleted file mode 100755
index 412ae58..0000000
--- a/podder/main.py
+++ /dev/null
@@ -1,181 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import argparse
-import os
-
-import yaml
-from podder import Podder
-
-from common.structlog_setup import setup_logging
-from common.utils.nethelpers import get_my_primary_local_ipv4
-
-defs = dict(
-    slaves=os.environ.get('SLAVES', './slaves.yml.j2'),
-    config=os.environ.get('CONFIG', './podder.yml'),
-    consul=os.environ.get('CONSUL', 'localhost:8500'),
-    external_host_address=os.environ.get('EXTERNAL_HOST_ADDRESS',
-                                         get_my_primary_local_ipv4()),
-    grpc_endpoint=os.environ.get('GRPC_ENDPOINT', 'localhost:50055'),
-    fluentd=os.environ.get('FLUENTD', None),
-    instance_id=os.environ.get('INSTANCE_ID', os.environ.get('HOSTNAME', '1')),
-    internal_host_address=os.environ.get('INTERNAL_HOST_ADDRESS',
-                                         get_my_primary_local_ipv4()),
-    work_dir=os.environ.get('WORK_DIR', '/tmp/podder'),
-    threads=os.environ.get('PODDER_THREADS', 5)
-)
-
-def parse_args():
-
-    parser = argparse.ArgumentParser()
-
-    _help = ('Path to podder.yml config file (default: %s). '
-             'If relative, it is relative to main.py of podder.'
-             % defs['config'])
-    parser.add_argument('-c', '--config',
-                        dest='config',
-                        action='store',
-                        default=defs['config'],
-                        help=_help)
-
-    _help = ('Path to slaves configuration file (default %s).'
-            'If relative, it is relative to main.py of podder.'
-             % defs['slaves'])
-    parser.add_argument('-s', '--slaves',
-                        dest='slaves',
-                        action='store',
-                        default=defs['slaves'],
-                        help=_help)
-
-    _help = '<hostname>:<port> to consul agent (default: %s)' % defs['consul']
-    parser.add_argument(
-        '-C', '--consul', dest='consul', action='store',
-        default=defs['consul'],
-        help=_help)
-
-
-    _help = ('<hostname>:<port> to fluentd server (default: %s). (If not '
-             'specified (None), the address from the config file is used'
-             % defs['fluentd'])
-    parser.add_argument('-F', '--fluentd',
-                        dest='fluentd',
-                        action='store',
-                        default=defs['fluentd'],
-                        help=_help)
-
-    _help = ('unique string id of this ofagent instance (default: %s)'
-             % defs['instance_id'])
-    parser.add_argument('-i', '--instance-id',
-                        dest='instance_id',
-                        action='store',
-                        default=defs['instance_id'],
-                        help=_help)
-
-    _help = 'omit startup banner log lines'
-    parser.add_argument('-n', '--no-banner',
-                        dest='no_banner',
-                        action='store_true',
-                        default=False,
-                        help=_help)
-
-    _help = "suppress debug and info logs"
-    parser.add_argument('-q', '--quiet',
-                        dest='quiet',
-                        action='count',
-                        help=_help)
-
-    _help = 'enable verbose logging'
-    parser.add_argument('-v', '--verbose',
-                        dest='verbose',
-                        action='count',
-                        help=_help)
-
-    _help = 'Number of events to handle in parallel'
-    parser.add_argument('-e', '--events-in-parallel',
-                        dest='threads',
-                        type=int,
-                        default=defs['threads'],
-                        action='store',
-                        help=_help)
-
-
-    args = parser.parse_args()
-
-    # post-processing
-
-    return args
-
-def load_file(file):
-    path = file
-    if path.startswith('.'):
-        dir = os.path.dirname(os.path.abspath(__file__))
-        path = os.path.join(dir, path)
-    path = os.path.abspath(path)
-    with open(path) as fd:
-        contents = fd.read()
-    return contents
-
-def load_config(config):
-    contents = load_file(config)
-    return yaml.load(contents)
-
-
-banner = r'''
- _____
-|     |          |    |
-|     |          |    |
-|_____|_____ ____|____| ___   _
-|     |     |    |    |/ _ \ /
-|     |_____|____|____|\____|
-'''
-
-def print_banner(log):
-    for line in banner.strip('\n').splitlines():
-        log.info(line)
-    log.info('(to stop: press Ctrl-C)')
-
-class Main(object):
-
-    def __init__(self):
-        self.args = args = parse_args()
-        self.config = load_config(args.config)
-        self.slave_config = load_file(args.slaves)
-
-        verbosity_adjust = (args.verbose or 0) - (args.quiet or 0)
-        self.log = setup_logging(self.config.get('logging', {}),
-                                 args.instance_id,
-                                 verbosity_adjust=verbosity_adjust,
-                                 fluentd=args.fluentd)
-
-        self.consul_manager = None
-
-        if not args.no_banner:
-            print_banner(self.log)
-
-    def start(self):
-        self.startup_components()
-
-    def startup_components(self):
-        self.log.info('starting-internal-components')
-        args = self.args
-        self.podder = Podder(args, self.slave_config)
-        self.log.info('started-internal-components')
-        self.podder.run()
-
-
-if __name__ == '__main__':
-    Main().start()
diff --git a/podder/podder.py b/podder/podder.py
deleted file mode 100644
index e3a2fe4..0000000
--- a/podder/podder.py
+++ /dev/null
@@ -1,60 +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 handlers import handler_start, handler_stop
-from structlog import get_logger
-from jinja2 import Template
-
-from common.utils.dockerhelpers import EventProcessor
-
-class Podder(object):
-
-    log = get_logger()
-
-    def __init__(self, args, slave_config):
-        self.log.info('Initializing Podder')
-        self.running = False
-        self.events = EventProcessor(threads=args.threads)
-        self.handlers = { 'podder_config' : Template(slave_config) }
-
-    def run(self):
-        if self.running:
-            return
-        self.running = True
-
-        self.initialize()
-
-    def shutdown(self):
-        try:
-            self.events.stop_listening()
-        except:
-            self.log.info('Shutting down')
-
-    def initialize(self):
-        self.define_handlers()
-        while True:
-            try:
-                self.events.listen_for_events(self.handlers)
-            except KeyboardInterrupt:
-                self.shutdown()
-                break
-            except Exception, e:
-                self.log.info('Handler exception', e)
-
-    def define_handlers(self):
-        self.handlers['start'] = handler_start
-        self.handlers['stop'] = handler_stop
-
diff --git a/podder/podder.yml b/podder/podder.yml
deleted file mode 100644
index 9a43048..0000000
--- a/podder/podder.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-logging:
-    version: 1
-
-    formatters:
-      brief:
-        format: '%(message)s'
-      default:
-        format: '%(asctime)s.%(msecs)03d %(levelname)-8s %(module)s.%(funcName)s %(message)s'
-        datefmt: '%Y%m%dT%H%M%S'
-      fluent_fmt:
-        '()': fluent.handler.FluentRecordFormatter
-        format:
-          level: '%(levelname)s'
-          hostname: '%(hostname)s'
-          where: '%(module)s.%(funcName)s'
-
-    handlers:
-        console:
-            class : logging.StreamHandler
-            level: DEBUG
-            formatter: default
-            stream: ext://sys.stdout
-        fluent:
-            class: fluent.handler.FluentHandler
-            host: localhost
-            port: 24224
-            tag: voltha.logging
-            formatter: fluent_fmt
-            level: DEBUG
-        null:
-            class: logging.NullHandler
-
-    loggers:
-        amqp:
-            handlers: [null]
-            propagate: False
-        conf:
-            handlers: [null]
-            propagate: False
-        '': # root logger
-            handlers: [console, fluent]
-            level: INFO # this can be bumped up/down by -q and -v command line
-                        # options
-            propagate: False
\ No newline at end of file
diff --git a/podder/slaves.yml.j2 b/podder/slaves.yml.j2
deleted file mode 100644
index d72bae9..0000000
--- a/podder/slaves.yml.j2
+++ /dev/null
@@ -1,59 +0,0 @@
-{% macro address(data, network) -%}
-    {% if data is defined and network is defined -%}
-    {{ data['NetworkSettings']['Networks'][network]['IPAddress'] }}:50555 }}
-    {%- else -%}
-    None:None
-    {%- endif %}
-{%- endmacro %}
-
-services:
-  cord/voltha:
-    slaves: ["chameleon", "ofagent"]
-
-
-slaves:
-  chameleon:
-    image: cord/chameleon
-    command: [
-      "/chameleon/chameleon/main.py",
-      "-v",
-      "--consul=consul:8500",
-      "--fluentd=fluentd:24224",
-      "--rest-port=8881",
-      "--grpc-endpoint={{ address(data, network) }}",
-      "--instance-id-is-container-name",
-      "-v"
-    ]
-    ports:
-    - 8881
-    depends_on:
-    - consul
-    - voltha
-    links:
-    - consul
-    - fluentd
-    environment:
-      SERVICE_8881_NAME: "chameleon-rest"
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
-  
-  ofagent:
-    image: cord/ofagent
-    command: [
-      "/ofagent/ofagent/main.py",
-      "-v",
-      "--consul=${DOCKER_HOST_IP}:8500",
-      "--fluentd=fluentd:24224",
-      "--controller=${DOCKER_HOST_IP}:6633",
-      "--grpc-endpoint={{ address(data, network) }}",
-      "--instance-id-is-container-name",
-      "-v"
-    ]
-    depends_on:
-    - consul
-    - voltha
-    links:
-    - consul
-    - fluentd
-    volumes:
-    - "/var/run/docker.sock:/tmp/docker.sock"
