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()
