diff --git a/ofagent/connection_mgr.py b/ofagent/connection_mgr.py
new file mode 100644
index 0000000..9a17121
--- /dev/null
+++ b/ofagent/connection_mgr.py
@@ -0,0 +1,231 @@
+#
+# 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 sys
+
+from twisted.internet import reactor
+from twisted.internet.defer import Deferred, inlineCallbacks, returnValue
+
+from common.utils.asleep import asleep
+from common.utils.consulhelpers import get_endpoint_from_consul
+from structlog import get_logger
+import grpc
+from protos import voltha_pb2
+from grpc_client import GrpcClient
+
+from agent import Agent
+
+class ConnectionManager(object):
+
+    log = get_logger()
+
+    def __init__(self, consul_endpoint, voltha_endpoint, controller_endpoint,
+                 voltha_retry_interval=0.5, devices_refresh_interval=60):
+
+        self.log.info('Initializing connection manager')
+        self.controller_endpoint = controller_endpoint
+        self.consul_endpoint = consul_endpoint
+        self.voltha_endpoint = voltha_endpoint
+
+        self.channel = None
+        self.connected_devices = None
+        self.unprocessed_devices = None
+        self.agent_map = {}
+        self.grpc_client = None
+        self.device_id_map = None
+
+        self.voltha_retry_interval = voltha_retry_interval
+        self.devices_refresh_interval = devices_refresh_interval
+
+        self.running = False
+
+    @inlineCallbacks
+    def run(self):
+        if self.running:
+            return
+
+        self.log.info('Running connection manager')
+
+        self.running = True
+
+        # Get voltha grpc endpoint
+        self.channel = self.get_grpc_channel_with_voltha()
+
+        # Connect to voltha using grpc and fetch the list of logical devices
+        yield self.get_list_of_logical_devices_from_voltha()
+
+        # Create shared gRPC API object
+        self.grpc_client = GrpcClient(self.channel, self.device_id_map)
+
+        # Instantiate an OpenFlow agent for each logical device
+        self.refresh_openflow_agent_connections()
+
+        reactor.addSystemEventTrigger('before', 'shutdown', self.shutdown)
+        reactor.callLater(0, self.monitor_connections)
+
+        returnValue(self)
+
+
+    def shutdown(self):
+        # clean up all controller connections
+        for key, value in enumerate(self.agent_map):
+            value.stop()
+        self.running = False
+        # TODO: close grpc connection to voltha
+
+    def resolve_endpoint(self, endpoint):
+        ip_port_endpoint = endpoint
+        if endpoint.startswith('@'):
+            try:
+                ip_port_endpoint = get_endpoint_from_consul(
+                    self.consul_endpoint, endpoint[1:])
+                self.log.info(
+                    'Found endpoint {} service at {}'.format(endpoint,
+                                                             ip_port_endpoint))
+            except Exception as e:
+                self.log.error('Failure to locate {} service from '
+                               'consul {}:'.format(endpoint, repr(e)))
+                return
+        if ip_port_endpoint:
+            host, port = ip_port_endpoint.split(':', 2)
+            return host, int(port)
+
+    def get_grpc_channel_with_voltha(self):
+        self.log.info('Resolving voltha endpoint {} from consul'.format(
+            self.voltha_endpoint))
+        host, port = self.resolve_endpoint(self.voltha_endpoint)
+        assert host is not None
+        assert port is not None
+        # Create grpc channel to Voltha
+        channel = grpc.insecure_channel('{}:{}'.format(host, port))
+        self.log.info('Acquired a grpc channel to voltha')
+        return channel
+
+
+    @inlineCallbacks
+    def get_list_of_logical_devices_from_voltha(self):
+        while True:
+            self.log.info('Retrieve devices from voltha')
+            try:
+                stub = voltha_pb2.VolthaLogicalLayerStub(self.channel)
+                devices = stub.ListLogicalDevices(
+                    voltha_pb2.NullMessage()).items
+                for device in devices:
+                    self.log.info("Devices {} -> {}".format(device.id,
+                                                            device.datapath_id))
+                self.unprocessed_devices = devices
+                self.device_id_map = dict(
+                    (device.datapath_id, device.id) for device in devices)
+                return
+            except Exception as e:
+                self.log.error('Failure to retrieve devices from '
+                               'voltha: {}'.format(repr(e)))
+
+            self.log.info('reconnect', after_delay=self.voltha_retry_interval)
+            yield asleep(self.voltha_retry_interval)
+
+
+    def refresh_openflow_agent_connections(self):
+        # Compare the new device list again the previous
+        # For any new device, an agent connection will be created.  For
+        # existing device that are no longer part of the list then that
+        # agent connection will be stopped
+
+        # If the ofagent has no previous devices then just add them
+        if self.connected_devices is None:
+            datapath_ids_to_add = [device.datapath_id for device in self.unprocessed_devices]
+        else:
+            previous_datapath_ids = [device.datapath_id for device in self.connected_devices]
+            current_datapath_ids = [device.datapath_id for device in self.unprocessed_devices]
+            datapath_ids_to_add = [d for d in current_datapath_ids if
+                                 d not in previous_datapath_ids]
+            datapath_ids_to_remove = [d for d in previous_datapath_ids if
+                                 d not in current_datapath_ids]
+
+            # Check for no change
+            if not datapath_ids_to_add and not datapath_ids_to_remove:
+                self.log.info('No new devices found.  No OF agent update '
+                              'required')
+                return
+
+            self.log.info('Updating OF agent connections.')
+            print self.agent_map
+
+            # Stop previous agents
+            for datapath_id in datapath_ids_to_remove:
+                if self.agent_map.has_key(datapath_id):
+                    self.agent_map[datapath_id].stop()
+                    del self.agent_map[datapath_id]
+                    self.log.info('Removed OF agent with datapath id {'
+                                  '}'.format(datapath_id))
+
+        # Add the new agents
+        for datapath_id in datapath_ids_to_add:
+            self.agent_map[datapath_id] = Agent(self.controller_endpoint,
+                                                datapath_id,
+                                                self.grpc_client)
+            self.agent_map[datapath_id].run()
+            self.log.info('Launched OF agent with datapath id {}'.format(
+                datapath_id))
+
+        # replace the old device list with the new ones
+        self.connected_devices = self.unprocessed_devices
+        self.unprocessed_devices = None
+
+    @inlineCallbacks
+    def monitor_connections(self):
+        while True:
+            # sleep first
+            yield asleep(self.devices_refresh_interval)
+            self.log.info('Monitor connections')
+            yield self.get_list_of_logical_devices_from_voltha()
+            self.refresh_openflow_agent_connections()
+
+# class Model(object):
+#     def __init__(self, id, path):
+#         self.id=id
+#         self.datapath_id=path,
+
+
+# if __name__ == '__main__':
+#     conn = ConnectionManager("10.0.2.15:3181", "localhost:50555",
+#                              "10.100.198.150:6633")
+#
+#     conn.connected_devices = None
+#     model1 = Model('12311', 'wdadsa1')
+#     model2 = Model('12312', 'wdadsa2')
+#     model3 = Model('12313', 'wdadsa3')
+#     model4 = Model('12314', 'wdadsa4')
+#
+#     conn.unprocessed_devices = [model1, model2, model3]
+#
+#     conn.refresh_openflow_agent_connections()
+#
+#
+#     # val = [device.datapath_id for device in conn.connected_devices]
+#     # print val
+#     #
+#     # for (id,n) in enumerate(val):
+#     #     print n
+#
+#
+#     conn.unprocessed_devices = [model1, model2, model3]
+#
+#     conn.refresh_openflow_agent_connections()
+#
+#     conn.unprocessed_devices = [model1, model2, model4]
+#
+#     conn.refresh_openflow_agent_connections()
\ No newline at end of file
diff --git a/ofagent/main.py b/ofagent/main.py
index 0d8c8d4..7d0cdf7 100755
--- a/ofagent/main.py
+++ b/ofagent/main.py
@@ -14,22 +14,154 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-
-"""TODO This is a POC placeholder """
+import argparse
 import os
-
-import grpc
+import sys
 import yaml
-from twisted.internet import reactor
+from twisted.internet.defer import inlineCallbacks
 
-from agent import Agent
+base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.append(base_dir)
+sys.path.append(os.path.join(base_dir, '/ofagent/protos/third_party'))
+
+from common.utils.dockerhelpers import get_my_containers_name
+from common.utils.nethelpers import get_my_primary_local_ipv4
 from common.utils.structlog_setup import setup_logging
-from protos import voltha_pb2
+from connection_mgr import ConnectionManager
 
-from grpc_client import GrpcClient
+defs = dict(
+    config=os.environ.get('CONFIG', './ofagent.yml'),
+    consul=os.environ.get('CONSUL', 'localhost:8500'),
+    controller=os.environ.get('CONTROLLER', 'localhost:6633'),
+    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/ofagent')
+)
 
 
-def load_config(path):
+def parse_args():
+
+    parser = argparse.ArgumentParser()
+
+    _help = ('Path to ofagent.yml config file (default: %s). '
+             'If relative, it is relative to main.py of ofagent.'
+             % defs['config'])
+    parser.add_argument('-c', '--config',
+                        dest='config',
+                        action='store',
+                        default=defs['config'],
+                        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 openflow controller (default: %s)' % \
+            defs['controller']
+    parser.add_argument(
+        '-O', '--controller', dest='controller', action='store',
+        default=defs['controller'],
+        help=_help)
+
+    _help = ('<hostname> or <ip> at which ofagent is reachable from outside '
+             'the cluster (default: %s)' % defs['external_host_address'])
+    parser.add_argument('-E', '--external-host-address',
+                        dest='external_host_address',
+                        action='store',
+                        default=defs['external_host_address'],
+                        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 = ('gRPC end-point to connect to. It can either be a direct'
+             'definition in the form of <hostname>:<port>, or it can be an'
+             'indirect definition in the form of @<service-name> where'
+             '<service-name> is the name of the grpc service as registered'
+             'in consul (example: @voltha-grpc). (default: %s'
+             % defs['grpc_endpoint'])
+    parser.add_argument('-G', '--grpc-endpoint',
+                        dest='grpc_endpoint',
+                        action='store',
+                        default=defs['grpc_endpoint'],
+                        help=_help)
+
+    _help = ('<hostname> or <ip> at which ofagent is reachable from inside'
+             'the cluster (default: %s)' % defs['internal_host_address'])
+    parser.add_argument('-H', '--internal-host-address',
+                        dest='internal_host_address',
+                        action='store',
+                        default=defs['internal_host_address'],
+                        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 = ('work dir to compile and assemble generated files (default=%s)'
+             % defs['work_dir'])
+    parser.add_argument('-w', '--work-dir',
+                        dest='work_dir',
+                        action='store',
+                        default=defs['work_dir'],
+                        help=_help)
+
+    _help = ('use docker container name as ofagent instance id'
+             ' (overrides -i/--instance-id option)')
+    parser.add_argument('--instance-id-is-container-name',
+                        dest='instance_id_is_container_name',
+                        action='store_true',
+                        default=False,
+                        help=_help)
+
+    args = parser.parse_args()
+
+    # post-processing
+
+    if args.instance_id_is_container_name:
+        args.instance_id = get_my_containers_name()
+
+    return args
+
+
+def load_config(args):
+    path = args.config
     if path.startswith('.'):
         dir = os.path.dirname(os.path.abspath(__file__))
         path = os.path.join(dir, path)
@@ -38,39 +170,73 @@
         config = yaml.load(fd)
     return config
 
+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)
+
+        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)
+
+        # components
+        self.connection_manager = None
+
+        self.exiting = False
+
+        if not args.no_banner:
+            print_banner(self.log)
+
+        self.startup_components()
+
+    def start(self):
+        self.start_reactor()  # will not return except Keyboard interrupt
+
+    @inlineCallbacks
+    def startup_components(self):
+        self.log.info('starting-internal-components')
+        args = self.args
+        self.connection_manager = yield ConnectionManager(args.consul,
+                                                          args.grpc_endpoint,
+                                                          args.controller).run()
+        self.log.info('started-internal-services')
+
+    @inlineCallbacks
+    def shutdown_components(self):
+        """Execute before the reactor is shut down"""
+        self.log.info('exiting-on-keyboard-interrupt')
+        self.exiting = True
+        if self.connection_manager is not None:
+            yield self.connection_manager.shutdown()
+
+    def start_reactor(self):
+        from twisted.internet import reactor
+        reactor.callWhenRunning(
+            lambda: self.log.info('twisted-reactor-started'))
+
+        reactor.addSystemEventTrigger('before', 'shutdown',
+                                      self.shutdown_components)
+        reactor.run()
+
 
 if __name__ == '__main__':
-
-    # Load config and setup logging
-    config = load_config('./ofagent.yml')
-    setup_logging(config.get('logging', {}), '1')
-
-
-    # Create grpc channel to Voltha and grab client stub
-    channel = grpc.insecure_channel('localhost:50055')
-
-    # Connect to voltha using grpc and fetch the list of logical devices
-    stub = voltha_pb2.VolthaLogicalLayerStub(channel)
-    devices = stub.ListLogicalDevices(voltha_pb2.NullMessage()).items
-    print 'device id and datapaht_id list:'
-    for device in devices:
-        print '\t{} -> {}'.format(device.id, device.datapath_id)
-
-    # make a device.datapath_id -> device.id map (this will need to be actively
-    # managed in the real agent based on devices coming and going
-    device_id_map = dict((device.datapath_id, device.id) for device in devices)
-
-    # Create shared gRPC API object
-    grpc_client = GrpcClient(channel, device_id_map)
-
-    # Instantiate an OpenFlow agent for each logical device
-    agents = [
-        Agent('localhost:6633', device.datapath_id, grpc_client).run()
-        for device in devices
-    ]
-
-    def shutdown():
-        [a.stop() for a in agents]
-
-    reactor.addSystemEventTrigger('before', 'shutdown', shutdown)
-    reactor.run()
+    Main().start()
