diff --git a/requirements.txt b/requirements.txt
index c63fc59..7009e4e 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -47,6 +47,8 @@
 zmq>=0.0.0
 pyzmq>=16.0.2
 txZMQ==0.8.0
+ncclient==0.5.3
+xmltodict==0.11.0
 dicttoxml
 
 # python-consul>=0.6.1  we need the pre-released version for now, because 0.6.1 does not
diff --git a/voltha/adapters/adtran_olt/README.md b/voltha/adapters/adtran_olt/README.md
index d0344e5..889157f 100644
--- a/voltha/adapters/adtran_olt/README.md
+++ b/voltha/adapters/adtran_olt/README.md
@@ -1,2 +1,30 @@
 # Adtran OLT Device Adapter
 
+To preprovision an Adtran OLT, you will need to provide the IP Address and 
+the NETCONF/REST credentials for the device.  The NETCONF/REST credentials are an
+extension of the existing **preprovision_olt** command and these are placed after
+entering two dashes '_--_'.  The full syntax to use is.
+
+| Short | Long          | Default | Notes
+| :---: + :-----------: + :-----: + -----
+|  -u   | --nc_username | ''      | NETCONF username
+|  -p   | --nc_password | ''      | NETCONF Password
+|  -t   | --nc_port     | 830     | NETCONF TCP Port
+|  -U   | --rc_username | ''      | REST USERNAME
+|  -P   | --rc_password | ''      | REST PASSWORD
+|  -T   | --rc_port     | 8081    | REST PORT
+
+For example, if your Adtran OLT is address 10.17.174.193 with the default TCP ports and
+NETCONF credentials of admin/admin and REST credentials of ADMIN/ADMIN, the command line
+would be
+
+```bash
+    preprovision_olt -t adtran_olt -i 10.17.174.193 -- -u admin -p admin -U ADMIN -P ADMIN
+```
+or
+```bash
+    preprovision_olt -t adtran_olt -i 10.17.174.193 -- --nc_username admin --nc_password admin --rc_username ADMIN --rc_password ADMIN
+```
+
+Currently the Adtran Device Adapter will enable all PON ports on startup and attempt to activate any discovered ONUs.
+This behaviour will change once PON Management is fully supported.
\ No newline at end of file
diff --git a/voltha/adapters/adtran_olt/adtran_device_handler.py b/voltha/adapters/adtran_olt/adtran_device_handler.py
index fe8370a..e61eb8d 100644
--- a/voltha/adapters/adtran_olt/adtran_device_handler.py
+++ b/voltha/adapters/adtran_olt/adtran_device_handler.py
@@ -16,15 +16,18 @@
 """
 Adtran generic VOLTHA device handler
 """
+import argparse
 import datetime
 import pprint
+import shlex
+import time
 
 import arrow
-import re
 import structlog
 from twisted.internet import reactor, defer
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.defer import inlineCallbacks, returnValue
 
+from voltha.adapters.adtran_olt.net.adtran_netconf import AdtranNetconfClient
 from voltha.adapters.adtran_olt.net.adtran_rest import AdtranRestClient
 from voltha.protos import third_party
 from voltha.protos.common_pb2 import OperStatus, AdminState, ConnectStatus
@@ -36,6 +39,8 @@
     OFPC_GROUP_STATS, OFPC_TABLE_STATS, OFPC_FLOW_STATS
 from voltha.registry import registry
 
+from common.utils.asleep import asleep
+
 _ = third_party
 
 
@@ -68,6 +73,9 @@
     # HTTP shortcuts
     HELLO_URI = '/restconf/adtran-hello:hello'
 
+    # RPC XML shortcuts
+    RESTART_RPC = '<system-restart xmlns="urn:ietf:params:xml:ns:yang:ietf-system"/>'
+
     def __init__(self, adapter, device_id, username='', password='', timeout=20):
         self.adapter = adapter
         self.adapter_agent = adapter.adapter_agent
@@ -82,30 +90,45 @@
         # Northbound and Southbound ports
         self.northbound_ports = {}  # port number -> Port
         self.southbound_ports = {}  # port number -> Port  (For PON, use pon-id as key)
-        self.management_ports = {}  # port number -> Port   TODO: Not currently supported
+        # self.management_ports = {}  # port number -> Port   TODO: Not currently supported
 
         self.num_northbound_ports = None
         self.num_southbound_ports = None
-        self.num_management_ports = None
+        # self.num_management_ports = None
+
+        self.ip_address = None
+        self.timeout = timeout
+        self.restart_failure_timeout = 5 * 60   # 5 Minute timeout
 
         # REST Client
-        self.ip_address = None
         self.rest_port = None
-        self.rest_timeout = timeout
         self.rest_username = username
         self.rest_password = password
         self.rest_client = None
 
+        # NETCONF Client
+        self.netconf_port = None
+        self.netconf_username = username
+        self.netconf_password = password
+        self.netconf_client = None
+
         # Heartbeat support
         self.heartbeat_count = 0
         self.heartbeat_miss = 0
-        self.heartbeat_interval = 10  # TODO: Decrease before release
+        self.heartbeat_interval = 10  # TODO: Decrease before release or any scale testing
         self.heartbeat_failed_limit = 3
         self.heartbeat_timeout = 5
         self.heartbeat = None
         self.heartbeat_last_reason = ''
 
-        self.max_ports = 1  # TODO: Remove later
+        # Virtualized OLT Support
+        self.is_virtual_olt = False
+
+        # Installed flows
+        self.flow_entries = {}  # Flow ID/name -> FlowEntry
+
+        # TODO Remove items below after one PON fully supported and working as expected
+        self.max_ports = 1
 
     def __del__(self):
         # Kill any startup or heartbeat defers
@@ -114,65 +137,108 @@
         if d is not None:
             d.cancel()
 
+        ldi, self.logical_device_id = self.logical_device_id, None
+
         h, self.heartbeat = self.heartbeat, None
 
         if h is not None:
             h.cancel()
 
+        # Remove the logical device
+
+        if ldi is not None:
+            logical_device = self.adapter_agent.get_logical_device(ldi)
+            self.adapter_agent.delete_logical_device(logical_device)
+
         self.northbound_ports.clear()
         self.southbound_ports.clear()
 
     def __str__(self):
-        return "AdtranDeviceHandler: {}:{}".format(self.ip_address, self.rest_port)
+        return "AdtranDeviceHandler: {}".format(self.ip_address)
+
+    def parse_provisioning_options(self, device):
+        if not device.ipv4_address:
+            self.activate_failed(device, 'No ip_address field provided')
+
+        self.ip_address = device.ipv4_address
+
+        #############################################################
+        # Now optional parameters
+
+        def check_tcp_port(value):
+            ivalue = int(value)
+            if ivalue <= 0 or ivalue > 65535:
+                raise argparse.ArgumentTypeError("%s is a not a valid port number" % value)
+            return ivalue
+
+        parser = argparse.ArgumentParser(description='Adtran Device Adapter')
+        parser.add_argument('--nc_username', '-u', action='store', default='hsvroot', help='NETCONF username')
+        parser.add_argument('--nc_password', '-p', action='store', default='BOSCO', help='NETCONF Password')
+        parser.add_argument('--nc_port', '-t', action='store', default=830, type=check_tcp_port,
+                            help='NETCONF TCP Port')
+        parser.add_argument('--rc_username', '-U', action='store', default='ADMIN', help='REST username')
+        parser.add_argument('--rc_password', '-P', action='store', default='PASSWORD', help='REST Password')
+        parser.add_argument('--rc_port', '-T', action='store', default=8081, type=check_tcp_port,
+                            help='REST TCP Port')
+
+        try:
+            args = parser.parse_args(shlex.split(device.extra_args))
+
+            self.netconf_username = args.nc_username
+            self.netconf_password = args.nc_password
+            self.netconf_port = args.nc_port
+
+            self.rest_username = args.rc_username
+            self.rest_password = args.rc_password
+            self.rest_port = args.rc_port
+
+        except argparse.ArgumentError as e:
+            self.activate_failed(device,
+                                 'Invalid arguments: {}'.format(e.message),
+                                 reachable=False)
+        except Exception as e:
+            self.log.exception('parsing error: {}'.format(e.message))
 
     @inlineCallbacks
-    def activate(self, device):
+    def activate(self, device, reconciling=False):
         """
         Activate the OLT device
 
         :param device: A voltha.Device object, with possible device-type
-                specific extensions.
+                       specific extensions.
+        :param reconciling: If True, this adapter is taking over for a previous adapter
+                            for an existing OLT
         """
-        self.log.info('AdtranDeviceHandler.activating', device=device)
+        self.log.info('AdtranDeviceHandler.activating', device=device, reconciling=reconciling)
 
         if self.logical_device_id is None:
-            if not device.host_and_port:
-                self.activate_failed(device, 'No host_and_port field provided')
-
-            pattern = '(?P<host>[^:/ ]+).?(?P<port>[0-9]*).*'
-            info = re.match(pattern, device.host_and_port)
-
-            if not info or len(info.group('host')) == 0 or len(info.group('port')) == 0 or \
-                            (int(info.group('port')) if info.group('port') else None) is None:
-                self.activate_failed(device, 'Invalid Host or Port provided',
-                                     reachable=False)
-
-            self.ip_address = str(info.group('host'))
-            self.rest_port = int(info.group('port'))
+            # Parse our command line options for this device
+            self.parse_provisioning_options(device)
 
             ############################################################################
             # Start initial discovery of RESTCONF support (if any)
-            self.rest_client = AdtranRestClient(self.ip_address,
-                                                self.rest_port,
-                                                self.rest_username,
-                                                self.rest_password,
-                                                self.rest_timeout)
+
             try:
-                # content: (dict) Modules from the hello message
-
-                self.startup = self.rest_client.request('GET', self.HELLO_URI, name='hello')
-
+                self.startup = self.make_restconf_connection()
                 results = yield self.startup
                 self.log.debug('HELLO Contents: {}'.format(pprint.PrettyPrinter().pformat(results)))
 
+                # See if this is a virtualized OLT. If so, no NETCONF support available
+
+                self.is_virtual_olt = 'module-info' in results and\
+                                      any(mod.get('module-name', None) == 'adtran-ont-mock'
+                                          for mod in results['module-info'])
+                if self.is_virtual_olt:
+                    self.log.info('*** VIRTUAL OLT detected ***')
+
             except Exception as e:
-                results = None
                 self.log.exception('Initial RESTCONF adtran-hello failed', e=e)
                 self.activate_failed(device, e.message, reachable=False)
 
             ############################################################################
-            # TODO: Get these six via NETCONF and from the derived class
+            # Start initial discovery of NETCONF support (if any)
 
+<<<<<<< HEAD
             device.model = 'TODO: Adtran PizzaBox, YUM'
             device.hardware_version = 'TODO: H/W Version'
             device.firmware_version = 'TODO: S/W Version'
@@ -180,11 +246,42 @@
                                          Image(version="TODO: S/W Version")
                                        ])
             device.serial_number = 'TODO: Serial Number'
+=======
+            if not self.is_virtual_olt:
+                try:
+                    self.startup = self.make_netconf_connection()
+                    yield self.startup
+>>>>>>> c577acb... netconf client support and disable-enable support
 
-            device.root = True
-            device.vendor = 'Adtran, Inc.'
-            device.connect_status = ConnectStatus.REACHABLE
-            self.adapter_agent.update_device(device)
+                except Exception as e:
+                    self.log.exception('Initial NETCONF connection failed', e=e)
+                    self.activate_failed(device, e.message, reachable=False)
+
+            ############################################################################
+            # Get the device Information
+
+            if reconciling:
+                device.connect_status = ConnectStatus.REACHABLE
+                self.adapter_agent.update_device(device)
+            else:
+                try:
+                    self.startup = self.get_device_info(device)
+                    results = yield self.startup
+
+                    device.model = results.get('model', 'unknown')
+                    device.hardware_version = results.get('hardware_version', 'unknown')
+                    device.firmware_version = results.get('firmware_version', 'unknown')
+                    device.software_version = results.get('software_version', 'unknown')
+                    device.serial_number = results.get('serial_number', 'unknown')
+
+                    device.root = True
+                    device.vendor = results.get('vendor', 'Adtran, Inc.')
+                    device.connect_status = ConnectStatus.REACHABLE
+                    self.adapter_agent.update_device(device)
+
+                except Exception as e:
+                    self.log.exception('Device Information request(s) failed', e=e)
+                    self.activate_failed(device, e.message, reachable=False)
 
             try:
                 # Enumerate and create Northbound NNI interfaces
@@ -195,8 +292,9 @@
                 self.startup = self.process_northbound_ports(device, results)
                 yield self.startup
 
-                for port in self.northbound_ports.itervalues():
-                    self.adapter_agent.add_port(device.id, port.get_port())
+                if not reconciling:
+                    for port in self.northbound_ports.itervalues():
+                        self.adapter_agent.add_port(device.id, port.get_port())
 
             except Exception as e:
                 self.log.exception('Northbound port enumeration and creation failed', e=e)
@@ -212,13 +310,15 @@
                 self.startup = self.process_southbound_ports(device, results)
                 yield self.startup
 
-                for port in self.southbound_ports.itervalues():
-                    self.adapter_agent.add_port(device.id, port.get_port())
+                if not reconciling:
+                    for port in self.southbound_ports.itervalues():
+                        self.adapter_agent.add_port(device.id, port.get_port())
 
             except Exception as e:
                 self.log.exception('Southbound port enumeration and creation failed', e=e)
                 self.activate_failed(device, e.message)
 
+<<<<<<< HEAD
             # Complete activation by setting up logical device for this OLT and saving
             # off the devices parent_id
 
@@ -273,25 +373,31 @@
                 for port in self.northbound_ports.itervalues():
                     self.startup = port.start()
                     yield self.startup
+=======
+            if reconciling:
+                if device.admin_state == AdminState.ENABLED:
+                    if device.parent_id:
+                        self.logical_device_id = device.parent_id
+                        self.adapter_agent.reconcile_logical_device(device.parent_id)
+                    else:
+                        self.log.info('no-logical-device-set')
+>>>>>>> c577acb... netconf client support and disable-enable support
 
-            except Exception as e:
-                self.log.exception('Failed to start northbound port(s)', e=e)
-                self.activate_failed(device, e.message)
+                # Reconcile child devices
+                self.adapter_agent.reconcile_child_devices(device.id)
+            else:
+                # Complete activation by setting up logical device for this OLT and saving
+                # off the devices parent_id
 
-            try:
-                start_downlinks = self.initial_port_state == AdminState.ENABLED
+                self.logical_device_id = self.create_logical_device(device)
 
-                for port in self.southbound_ports.itervalues():
-                    self.startup = port.start() if start_downlinks else port.stop()
-                    yield self.startup
+            # Create logical ports for all southbound and northbound interfaces
 
-            except Exception as e:
-                self.log.exception('Failed to start southbound port(s)', e=e)
-                self.activate_failed(device, e.message)
+            self.create_logical_ports(device, self.logical_device_id, reconciling)
 
             # Complete device specific steps
             try:
-                self.startup = self.complete_device_specific_activation(device, results)
+                self.startup = self.complete_device_specific_activation(device, reconciling)
                 if self.startup is not None:
                     yield self.startup
 
@@ -303,12 +409,8 @@
 
             self.start_heartbeat(delay=10)
 
-            # Save off logical ID and specify that we active
-
-            self.logical_device_id = ld_initialized.id
-
             device = self.adapter_agent.get_device(device.id)
-            device.parent_id = ld_initialized.id
+            device.parent_id = self.logical_device_id
             device.oper_status = OperStatus.ACTIVE
             self.adapter_agent.update_device(device)
 
@@ -331,6 +433,127 @@
         self.adapter_agent.update_device(device)
         raise RuntimeError('Failed to activate OLT: {}'.format(device.reason))
 
+    def make_netconf_connection(self, connect_timeout=None):
+        ############################################################################
+        # Start initial discovery of NETCONF support
+
+        if self.netconf_client is None:
+            self.netconf_client = AdtranNetconfClient(self.ip_address,
+                                                      self.netconf_port,
+                                                      self.netconf_username,
+                                                      self.netconf_password,
+                                                      self.timeout)
+        if self.netconf_client.connected:
+            return defer.returnValue(True)
+
+        timeout = connect_timeout or self.timeout
+        return self.netconf_client.connect(timeout)
+
+    def make_restconf_connection(self, get_timeout=None):
+        if self.rest_client is None:
+            self.rest_client = AdtranRestClient(self.ip_address,
+                                                self.rest_port,
+                                                self.rest_username,
+                                                self.rest_password,
+                                                self.timeout)
+
+        timeout = get_timeout or self.timeout
+        return self.rest_client.request('GET', self.HELLO_URI, name='hello', timeout=timeout)
+
+    def create_logical_device(self, device):
+        ld = LogicalDevice(
+            # NOTE: not setting id and datapath_id will let the adapter agent pick id
+            desc=ofp_desc(mfr_desc=device.vendor,
+                          hw_desc=device.hardware_version,
+                          sw_desc=device.software_version,
+                          serial_num=device.serial_number,
+                          dp_desc='n/a'),
+            switch_features=ofp_switch_features(n_buffers=256,  # TODO fake for now
+                                                n_tables=2,  # TODO ditto
+                                                capabilities=(
+                                                    # OFPC_FLOW_STATS |  # TODO: Enable if we support it
+                                                    # OFPC_TABLE_STATS | # TODO: Enable if we support it
+                                                    # OFPC_GROUP_STATS | # TODO: Enable if we support it
+                                                    OFPC_PORT_STATS)),
+            root_device_id=device.id)
+
+        ld_initialized = self.adapter_agent.create_logical_device(ld)
+
+        return ld_initialized
+
+    @inlineCallbacks
+    def create_logical_ports(self, device, ld_initialized, reconciling):
+
+        if not reconciling:
+            for port in self.northbound_ports.itervalues():
+                lp = port.get_logical_port()
+                if lp is not None:
+                    self.adapter_agent.add_logical_port(ld_initialized.id, lp)
+
+            for port in self.southbound_ports.itervalues():
+                lp = port.get_logical_port()
+                if lp is not None:
+                    self.adapter_agent.add_logical_port(ld_initialized.id, lp)
+
+            # Set the ports in a known good initial state
+            try:
+                for port in self.northbound_ports.itervalues():
+                    self.startup = port.reset()
+                    results = yield self.startup
+                    self.log.debug('Northbound Port reset results', results=results)
+
+            except Exception as e:
+                self.log.exception('Failed to reset northbound ports to known good initial state', e=e)
+                self.activate_failed(device, e.message)
+
+            try:
+                for port in self.southbound_ports.itervalues():
+                    self.startup = port.reset()
+                    results = yield self.startup
+                    self.log.debug('Southbound Port reset results', results=results)
+
+            except Exception as e:
+                self.log.exception('Failed to reset southbound ports to known good initial state', e=e)
+                self.activate_failed(device, e.message)
+
+        # Start/stop the interfaces as needed
+        try:
+            for port in self.northbound_ports.itervalues():
+                self.startup = port.start()
+                results = yield self.startup
+                self.log.debug('Northbound Port start results', results=results)
+
+        except Exception as e:
+            self.log.exception('Failed to start northbound port(s)', e=e)
+            self.activate_failed(device, e.message)
+
+        try:
+            if reconciling:
+                start_downlinks = device.admin_state == AdminState.ENABLED
+            else:
+                start_downlinks = self.initial_port_state == AdminState.ENABLED
+
+            for port in self.southbound_ports.itervalues():
+                self.startup = port.start() if start_downlinks else port.stop()
+                results = yield self.startup
+                self.log.debug('Southbound Port start results', results=results)
+
+        except Exception as e:
+            self.log.exception('Failed to start southbound port(s)', e=e)
+            self.activate_failed(device, e.message)
+
+    @inlineCallbacks
+    def device_information(self, device):
+        """
+        Examine the various managment models and extract device information for
+        VOLTHA use
+
+        :param device: A voltha.Device object, with possible device-type
+                specific extensions.
+        :return: (Deferred or None).
+        """
+        yield defer.Deferred(lambda c: c.callback("Not Required"))
+
     @inlineCallbacks
     def enumerate_northbound_ports(self, device):
         """
@@ -396,7 +619,7 @@
         yield defer.Deferred(lambda c: c.callback("Not Required"))
 
     @inlineCallbacks
-    def complete_device_specific_activation(self, _device, _content):
+    def complete_device_specific_activation(self, _device, _reconciling):
         return None
 
     def deactivate(self, device):
@@ -409,6 +632,342 @@
         if h is not None:
             h.cancel()
 
+        # TODO: What else (delete logical device, ???)
+
+    @inlineCallbacks
+    def disable(self):
+        """
+        This is called when a previously enabled device needs to be disabled based on a NBI call.
+        """
+        self.log.info('disabling', device_id=self.device_id)
+
+        # Get the latest device reference
+        device = self.adapter_agent.get_device(self.device_id)
+
+        # Suspend any active healthchecks / pings
+
+        h, self.heartbeat = self.heartbeat, None
+
+        if h is not None:
+            h.cancel()
+
+        # Update the operational status to UNKNOWN
+
+        device.oper_status = OperStatus.UNKNOWN
+        device.connect_status = ConnectStatus.UNREACHABLE
+        self.adapter_agent.update_device(device)
+
+        # Remove the logical device
+        ldi, self.logical_device_id = self.logical_device_id, None
+
+        if ldi is not None:
+            logical_device = self.adapter_agent.get_logical_device(ldi)
+            self.adapter_agent.delete_logical_device(logical_device)
+
+        # Disable all child devices first
+        self.adapter_agent.update_child_devices_state(self.device_id,
+                                                      admin_state=AdminState.DISABLED)
+
+        # Remove the peer references from this device
+        self.adapter_agent.delete_all_peer_references(self.device_id)
+
+        # Set all ports to disabled
+        self.adapter_agent.disable_all_ports(self.device_id)
+
+        for port in self.northbound_ports.itervalues():
+            port.stop()
+
+        for port in self.southbound_ports.itervalues():
+            port.stop()
+
+        # Disable all flows            TODO: Do we want to delete them?
+        # TODO: Use bulk methods if possible
+
+        for flow in self.flow_entries.itervalues():
+            flow.disable()
+
+        # Shutdown communications with OLT
+
+        if self.netconf_client is not None:
+            try:
+                yield self.netconf_client.close()
+            except Exception as e:
+                self.log.exception('NETCONF client shutdown failed', e=e)
+
+        def _null_clients():
+            self.netconf_client = None
+            self.rest_client = None
+
+        reactor.callLater(0, _null_clients)
+
+        self.log.info('disabled', device_id=device.id)
+
+    @inlineCallbacks
+    def reenable(self):
+        """
+        This is called when a previously disabled device needs to be enabled based on a NBI call.
+        """
+        self.log.info('re-enabling', device_id=self.device_id)
+
+        # Get the latest device reference
+        device = self.adapter_agent.get_device(self.device_id)
+
+        # Update the connect status to REACHABLE
+        device.connect_status = ConnectStatus.REACHABLE
+        self.adapter_agent.update_device(device)
+
+        # Set all ports to enabled
+        self.adapter_agent.enable_all_ports(self.device_id)
+
+        try:
+            yield self.make_restconf_connection()
+
+        except Exception as e:
+            self.log.exception('RESTCONF adtran-hello reconnect failed', e=e)
+            # TODO: What is best way to handle reenable failure?
+
+        if not self.is_virtual_olt:
+            try:
+                yield self.make_netconf_connection()
+
+            except Exception as e:
+                self.log.exception('NETCONF re-connection failed', e=e)
+                # TODO: What is best way to handle reenable failure?
+
+        # Recreate the logical device
+
+        ld_initialized = self.create_logical_device(device)
+
+        # Create logical ports for all southbound and northbound interfaces
+
+        self.create_logical_ports(device, ld_initialized, False)
+
+        device = self.adapter_agent.get_device(device.id)
+        device.parent_id = ld_initialized.id
+        device.oper_status = OperStatus.ACTIVE
+        self.adapter_agent.update_device(device)
+        self.logical_device_id = ld_initialized.id
+
+        # Reenable all child devices
+        self.adapter_agent.update_child_devices_state(device.id,
+                                                      admin_state=AdminState.ENABLED)
+
+        for port in self.northbound_ports.itervalues():
+            port.start()
+
+        for port in self.southbound_ports.itervalues():
+            port.start()
+
+        # TODO:
+        # 1) Restart health check / pings
+
+        # Enable all flows
+        # TODO: Use bulk methods if possible
+
+        for flow in self.flow_entries:
+            flow.enable()
+
+        self.log.info('re-enabled', device_id=device.id)
+
+    @inlineCallbacks
+    def reboot(self):
+        """
+        This is called to reboot a device based on a NBI call.  The admin state of the device
+        will not change after the reboot.
+        """
+        self.log.debug('reboot')
+
+        # Update the operational status to ACTIVATING and connect status to
+        # UNREACHABLE
+
+        device = self.adapter_agent.get_device(self.device_id)
+        previous_oper_status = device.oper_status
+        previous_conn_status = device.connect_status
+        device.oper_status = OperStatus.ACTIVATING
+        device.connect_status = ConnectStatus.UNREACHABLE
+        self.adapter_agent.update_device(device)
+
+        # Update the child devices connect state to UNREACHABLE
+        self.adapter_agent.update_child_devices_state(self.device_id,
+                                                      connect_status=ConnectStatus.UNREACHABLE)
+        # Issue reboot command
+
+        if not self.is_virtual_olt:
+            try:
+                yield self.netconf_client.rpc(AdtranDeviceHandler.RESTART_RPC)
+
+            except Exception as e:
+                self.log.exception('NETCONF client shutdown', e=e)
+                # TODO: On failure, what is the best thing to do?
+
+            # Shutdown communications with OLT. Typically it takes about 2 seconds
+            # or so after the reply before the restart actually occurs
+
+            try:
+                response = yield self.netconf_client.close()
+                self.log.debug('Restart response XML was: {}'.format('ok' if response.ok else 'bad'))
+
+            except Exception as e:
+                self.log.exception('NETCONF client shutdown', e=e)
+
+        def _null_clients():
+            self.netconf_client = None
+            self.rest_client = None
+
+        yield reactor.callLater(0, _null_clients)
+
+        # Run remainder of reboot process as a new task. The OLT then may be up in a
+        # few moments or may take 3 minutes or more depending on any self tests enabled
+
+        current_time = time.time();
+        timeout = current_time + self.restart_failure_timeout
+
+        self.log('*** Current time is {}, timeout is {}'.format(current_time, timeout))
+
+        yield reactor.callLater(10, self._finish_reboot, timeout,
+                                previous_oper_status, previous_conn_status)
+
+    @inlineCallbacks
+    def _finish_reboot(self, timeout, previous_oper_status, previous_conn_status):
+        # Now wait until REST & NETCONF are re-established or we timeout
+
+        if self.netconf_client is None and not self.is_virtual_olt:
+            self.log.debug('Attempting to restore NETCONF connection')
+            try:
+                response = yield self.make_netconf_connection(connect_timeout=3)
+                self.log.debug('Restart NETCONF connection XML was: {}'.format(response.xml))
+
+            except Exception as e:
+                self.log.debug('No NETCONF connection yet: {}'.format(e.message))
+                try:
+                    yield self.netconf_client.close()
+                except Exception as e:
+                    self.log.exception(e.message)
+                finally:
+                    def _null_netconf():
+                        self.log.debug('Nulling out the NETCONF client')
+                        self.netconf_client = None
+                    reactor.callLater(0, _null_netconf)
+
+        elif self.rest_client is None:
+            self.log.debug('Attempting to restore RESTCONF connection')
+            try:
+                response = yield self.make_restconf_connection(get_timeout=3)
+                self.log.debug('Restart RESTCONF connection XML was: {}'.format(response.xml))
+
+            except Exception:
+                self.log.debug('No RESTCONF connection yet')
+                self.rest_client = None
+
+        if (self.netconf_client is None and not self.is_virtual_olt) or self.rest_client is None:
+            current_time = time.time();
+
+            self.log('Current time is {}, timeout is {}'.format(current_time, timeout))
+
+            if current_time < timeout:
+                self.log.info('Device not responding yet, will try again...')
+                yield reactor.callLater(10, self._finish_reboot, timeout,
+                                        previous_oper_status, previous_conn_status)
+
+            if self.netconf_client is None and not self.is_virtual_olt:
+                self.log.error('Could not restore NETCONF communications after device RESET')
+                pass        # TODO: What is best course of action if cannot get clients back?
+
+            if self.rest_client is None:
+                self.log.error('Could not restore RESTCONF communications after device RESET')
+                pass        # TODO: What is best course of action if cannot get clients back?
+
+        # Pause additional 5 seconds to let things OLT microservices complete some more initialization
+
+        yield asleep(5)
+
+        # Get the latest device reference
+
+        device = self.adapter_agent.get_device(self.device_id)
+        device.oper_status = previous_oper_status
+        device.connect_status = previous_conn_status
+        self.adapter_agent.update_device(device)
+
+        # Update the child devices connect state to REACHABLE
+        self.adapter_agent.update_child_devices_state(self.device_id,
+                                                      connect_status=ConnectStatus.REACHABLE)
+
+        # Connect back up to OLT so heartbeats/polls start working again
+        try:
+            yield self.make_restconf_connection()
+
+        except Exception as e:
+            self.log.exception('RESTCONF adtran-hello connect after reboot failed', e=e)
+            # TODO: What is best way to handle reenable failure?
+
+        if not self.is_virtual_olt:
+            try:
+                yield self.make_netconf_connection()
+
+            except Exception as e:
+                self.log.exception('NETCONF re-connection after reboot failed', e=e)
+                # TODO: What is best way to handle reenable failure?
+
+        self.log.info('rebooted', device_id=self.device_id)
+
+    @inlineCallbacks
+    def delete(self):
+        """
+        This is called to delete a device from the PON based on a NBI call.
+        If the device is an OLT then the whole PON will be deleted.
+        """
+        self.log.info('deleting', device_id=self.device_id)
+
+        # Cancel any outstanding tasks
+
+        d, self.startup = self.startup, None
+        if d is not None:
+            d.cancel()
+
+        h, self.heartbeat = self.heartbeat, None
+        if h is not None:
+            h.cancel()
+
+        # TODO:
+        # 1) Remove all flows from the device
+
+        self.flow_entries.clear()
+
+        # Remove all child devices
+        self.adapter_agent.delete_all_child_devices(self.device_id)
+
+        # Remove the logical device
+        logical_device = self.adapter_agent.get_logical_device(self.logical_device_id)
+        self.adapter_agent.delete_logical_device(logical_device)
+
+        # Remove the peer references from this device
+        self.adapter_agent.delete_all_peer_references(self.device_id)
+
+        # Tell all ports to stop any background processing
+
+        for port in self.northbound_ports.itervalues():
+            port.delete()
+
+        for port in self.southbound_ports.itervalues():
+            port.delete()
+
+        self.northbound_ports.clear()
+        self.southbound_ports.clear()
+
+        # Shutdown communications with OLT
+
+        if self.netconf_client is not None:
+            try:
+                yield self.netconf_client.close()
+            except Exception as e:
+                self.log.exception('NETCONF client shutdown', e=e)
+
+            self.netconf_client = None
+
+        self.rest_client = None
+
+        self.log.info('deleted', device_id=self.device_id)
+
     @inlineCallbacks
     def get_device_info(self, device):
         """
@@ -422,8 +981,15 @@
                 specific extensions. Such extensions shall be described as part of
                 the device type specification returned by device_types().
         """
-        pass
-        return None  # raise NotImplementedError('TODO: You should override this in your derived class???')
+        device = {}
+        # device['model'] = 'TODO: Adtran PizzaBox, YUM'
+        # device['hardware_version'] = 'TODO: H/W Version'
+        # device['firmware_version'] = 'TODO: S/W Version'
+        # device['software_version'] = 'TODO: S/W Version'
+        # device['serial_number'] = 'TODO: Serial Number'
+        # device['vendor'] = 'Adtran, Inc.'
+
+        returnValue(device)
 
     def start_heartbeat(self, delay=10):
         assert delay > 1
diff --git a/voltha/adapters/adtran_olt/adtran_olt.py b/voltha/adapters/adtran_olt/adtran_olt.py
index 3f23288..32d34fd 100644
--- a/voltha/adapters/adtran_olt/adtran_olt.py
+++ b/voltha/adapters/adtran_olt/adtran_olt.py
@@ -68,7 +68,6 @@
 
         :return: (None or Deferred)
         """
-        log.debug('starting', interface=self.interface)
         log.info('started', interface=self.interface)
 
     def stop(self):
@@ -78,7 +77,6 @@
 
         :return: (None or Deferred)
         """
-        log.debug('stopping', interface=self.interface)
         log.info('stopped', interface=self.interface)
 
     def adapter_descriptor(self):
@@ -140,16 +138,21 @@
         reactor.callLater(0, self.devices_handlers[device.id].activate, device)
         return device
 
-
     def reconcile_device(self, device):
         """
-        TODO:  Is invoked whenever a Voltha instance is started using data 
-        from a failed instance. 
-        :param device: 
-        :return: 
-        """
-        raise NotImplementedError()
+        Make sure the adapter looks after given device. Called when this device has
+        changed ownership from another Voltha instance to this one (typically, this
+        occurs when the previous voltha instance went down).
 
+        :param device: A voltha.Device object, with possible device-type specific
+                       extensions. Such extensions shall be described as part of
+                       the device type specification returned by device_types().
+        :return: (Deferred) Shall be fired to acknowledge device ownership.
+        """
+        log.info('reconcile-device', device=device)
+        self.devices_handlers[device.id] = AdtranOltHandler(self, device.id)
+        reactor.callLater(0, self.devices_handlers[device.id].activate, device, reconciling=True)
+        return device
 
     def abandon_device(self, device):
         """
@@ -160,12 +163,13 @@
         :return: (Deferred) Shall be fired to acknowledge abandonment.
         """
         log.info('abandon-device', device=device)
-        handler = self.devices_handlers.pop(device.id)
-
-        if handler is not None:
-            reactor.callLater(0, handler.deactivate, device)
-
-        return device
+        raise NotImplementedError()
+        # handler = self.devices_handlers.pop(device.id)
+        #
+        # if handler is not None:
+        #     reactor.callLater(0, handler.deactivate, device)
+        #
+        # return device
 
     def disable_device(self, device):
         """
@@ -176,7 +180,8 @@
         :return: (Deferred) Shall be fired to acknowledge disabling the device.
         """
         log.debug('disable_device', device=device)
-        raise NotImplementedError()
+        reactor.callLater(0, self.devices_handlers[device.id].disable)
+        return device
 
     def reenable_device(self, device):
         """
@@ -187,7 +192,8 @@
         :return: (Deferred) Shall be fired to acknowledge re-enabling the device.
         """
         log.debug('reenable_device', device=device)
-        raise NotImplementedError()
+        reactor.callLater(0, self.devices_handlers[device.id].reenable)
+        return device
 
     def reboot_device(self, device):
         """
@@ -198,7 +204,8 @@
         :return: (Deferred) Shall be fired to acknowledge the reboot.
         """
         log.info('reboot_device', device=device)
-        raise NotImplementedError()
+        reactor.callLater(0, self.devices_handlers[device.id].reboot)
+        return device
 
     def self_test_device(self, device):
         """
@@ -218,7 +225,8 @@
         :return: (Deferred) Shall be fired to acknowledge the deletion.
         """
         log.info('delete_device', device=device)
-        raise NotImplementedError()
+        reactor.callLater(0, self.devices_handlers[device.id].delete)
+        return device
 
     def get_device_details(self, device):
         """
@@ -245,7 +253,7 @@
         log.info('bulk-flow-update', device_id=device.id, flows=flows,
                  groups=groups)
         assert len(groups.items) == 0, "Cannot yet deal with groups"
-        raise NotImplementedError()
+
         handler = self.devices_handlers[device.id]
         return handler.update_flow_table(flows.items, device)
 
diff --git a/voltha/adapters/adtran_olt/adtran_olt_handler.py b/voltha/adapters/adtran_olt/adtran_olt_handler.py
index f037565..03046b4 100644
--- a/voltha/adapters/adtran_olt/adtran_olt_handler.py
+++ b/voltha/adapters/adtran_olt/adtran_olt_handler.py
@@ -22,14 +22,11 @@
 
 from adtran_device_handler import AdtranDeviceHandler
 from codec.olt_state import OltState
+from flow.flow_entry import FlowEntry
 from net.adtran_zmq import AdtranZmqClient
 from voltha.extensions.omci.omci import *
-from voltha.protos.common_pb2 import OperStatus, AdminState
+from voltha.protos.common_pb2 import AdminState
 from voltha.protos.device_pb2 import Device
-from voltha.protos.openflow_13_pb2 import OFPPF_100GB_FD, OFPPF_FIBER, OFPPS_LIVE
-
-
-# from ncclient import manager
 
 
 class AdtranOltHandler(AdtranDeviceHandler):
@@ -85,7 +82,48 @@
         AdtranDeviceHandler.__del__(self)
 
     def __str__(self):
-        return "AdtranOltHandler: {}:{}".format(self.ip_address, self.rest_port)
+        return "AdtranOltHandler: {}".format(self.ip_address)
+
+    @inlineCallbacks
+    def get_device_info(self, device):
+        """
+        Perform an initial network operation to discover the device hardware
+        and software version. Serial Number would be helpful as well.
+
+        Upon successfully retrieving the information, remember to call the
+        'start_heartbeat' method to keep in contact with the device being managed
+
+        :param device: A voltha.Device object, with possible device-type
+                specific extensions. Such extensions shall be described as part of
+                the device type specification returned by device_types().
+        """
+        from codec.physical_entities_state import PhysicalEntitiesState
+
+        device = {}
+
+        if self.is_virtual_olt:
+            returnValue(device)
+
+        pe_state = PhysicalEntitiesState(self.netconf_client)
+        self.startup = pe_state.get_state()
+        results = yield self.startup
+
+        modules = pe_state.get_physical_entities('adtn-phys-mod:module')
+        if isinstance(modules, list):
+            module = modules[0]
+            name = str(module['model-name']).translate(None, '?')
+            model = str(module['model-number']).translate(None, '?')
+
+            device['model'] = '{} - {}'.format(name, model) if len(name) > 0 else \
+                module['parent-entity']
+            device['hardware_version'] = str(module['hardware-revision']).translate(None, '?')
+            device['serial_number'] = str(module['serial-number']).translate(None, '?')
+            device['vendor'] = 'Adtran, Inc.'
+            software = module['software']['software']
+            device['firmware_version'] = str(software['startup-revision']).translate(None, '?')
+            device['software_version'] = str(software['running-revision']).translate(None, '?')
+
+        returnValue(device)
 
     @inlineCallbacks
     def enumerate_northbound_ports(self, device):
@@ -96,40 +134,24 @@
                 specific extensions.
         :return: (Deferred or None).
         """
-        # TODO: For now, hard code some JSON. Eventually will be XML from NETConf
+        try:
+            from codec.ietf_interfaces import IetfInterfacesState
+            from nni_port import MockNniPort
 
-        ports = [
-            {'port_no': 1,
-             'admin_state': AdminState.ENABLED,
-             'oper_status': OperStatus.ACTIVE,
-             'ofp_state': OFPPS_LIVE,
-             'ofp_capabilities': OFPPF_100GB_FD | OFPPF_FIBER,
-             'current_speed': OFPPF_100GB_FD,
-             'max_speed': OFPPF_100GB_FD},
-            {'port_no': 2,
-             'admin_state': AdminState.ENABLED,
-             'oper_status': OperStatus.ACTIVE,
-             'ofp_state': OFPPS_LIVE,
-             'ofp_capabilities': OFPPF_100GB_FD | OFPPF_FIBER,
-             'current_speed': OFPPF_100GB_FD,
-             'max_speed': OFPPF_100GB_FD},
-            {'port_no': 3,
-             'admin_state': AdminState.ENABLED,
-             'oper_status': OperStatus.ACTIVE,
-             'ofp_state': OFPPS_LIVE,
-             'ofp_capabilities': OFPPF_100GB_FD | OFPPF_FIBER,
-             'current_speed': OFPPF_100GB_FD,
-             'max_speed': OFPPF_100GB_FD},
-            {'port_no': 4,
-             'admin_state': AdminState.ENABLED,
-             'oper_status': OperStatus.ACTIVE,
-             'ofp_state': OFPPS_LIVE,
-             'ofp_capabilities': OFPPF_100GB_FD | OFPPF_FIBER,
-             'current_speed': OFPPF_100GB_FD,
-             'max_speed': OFPPF_100GB_FD}
-        ]
+            if self.is_virtual_olt:
+                results = MockNniPort.get_nni_port_state_results()
+            else:
+                ietf_interfaces = IetfInterfacesState(self.netconf_client)
+                self.startup = ietf_interfaces.get_state()
+                results = yield self.startup
 
-        yield returnValue(ports)
+            ports = ietf_interfaces.get_nni_port_entries(results)
+
+            yield returnValue(ports)
+
+        except Exception as e:
+            log.exception('enumerate_northbound_ports', e=e)
+            raise
 
     def process_northbound_ports(self, device, results):
         """
@@ -141,14 +163,15 @@
                 you implemented. The type and contents are up to you to
         :return: (Deferred or None).
         """
-        from nni_port import NniPort
+        from nni_port import NniPort, MockNniPort
 
         for port in results:
             port_no = port['port_no']
             self.log.info('Processing northbound port {}/{}'.format(port_no, port['port_no']))
             assert port_no
             assert port_no not in self.northbound_ports
-            self.northbound_ports[port_no] = NniPort(self, **port)
+            self.northbound_ports[port_no] = NniPort(self, **port) if not self.is_virtual_olt \
+                else MockNniPort(self, **port)
 
         self.num_northbound_ports = len(self.northbound_ports)
 
@@ -182,11 +205,9 @@
         from pon_port import PonPort
 
         for pon in results:
-
             # Number PON Ports after the NNI ports
             pon_id = pon['pon-id']
             log.info('Processing pon port {}'.format(pon_id))
-
             assert pon_id not in self.southbound_ports
 
             admin_state = AdminState.ENABLED if pon.get('enabled',
@@ -198,13 +219,12 @@
                                                     admin_state=admin_state)
 
             # TODO: For now, limit number of PON ports to make debugging easier
-
             if len(self.southbound_ports) >= self.max_ports:
                 break
 
         self.num_southbound_ports = len(self.southbound_ports)
 
-    def complete_device_specific_activation(self, device, results):
+    def complete_device_specific_activation(self, device, reconciling):
         """
         Perform an initial network operation to discover the device hardware
         and software version. Serial Number would be helpful as well.
@@ -215,9 +235,8 @@
                 specific extensions. Such extensions shall be described as part of
                 the device type specification returned by device_types().
 
-        :param results: (dict) original adtran-hello RESTCONF results body
+        :param reconciling: (boolean) True if taking over for another VOLTHA
         """
-        #
         # For the pizzabox OLT, periodically query the OLT state of all PONs. This
         # is simpler then having each PON port do its own poll.  From this, we can:
         #
@@ -228,16 +247,54 @@
         # o TODO Update some PON level statistics
 
         self.zmq_client = AdtranZmqClient(self.ip_address, self.rx_packet)
-        # self.nc_client = manager.connect(host='',  # self.ip_address,
-        #                                  username=self.rest_username,
-        #                                  password=self.rest_password,
-        #                                  hostkey_verify=False,
-        #                                  allow_agent=False,
-        #                                  look_for_keys=False)
-
         self.status_poll = reactor.callLater(1, self.poll_for_status)
         return None
 
+    def disable(self):
+        c, self.zmq_client = self.zmq_client, None
+        if c is not None:
+            c.shutdown()
+
+        d, self.status_poll = self.status_poll, None
+        if d is not None:
+            d.cancel()
+
+        super(AdtranOltHandler, self).disable()
+
+    def reenable(self):
+        super(AdtranOltHandler, self).reenable()
+
+        self.zmq_client = AdtranZmqClient(self.ip_address, self.rx_packet)
+        self.status_poll = reactor.callLater(1, self.poll_for_status)
+
+    def reboot(self):
+        c, self.zmq_client = self.zmq_client, None
+        if c is not None:
+            c.shutdown()
+
+        d, self.status_poll = self.status_poll, None
+        if d is not None:
+            d.cancel()
+
+        super(AdtranOltHandler, self).reboot()
+
+    def _finish_reboot(self, timeout, previous_oper_status, previous_conn_status):
+        super(AdtranOltHandler, self)._finish_reboot(timeout, previous_oper_status, previous_conn_status)
+
+        self.zmq_client = AdtranZmqClient(self.ip_address, self.rx_packet)
+        self.status_poll = reactor.callLater(1, self.poll_for_status)
+
+    def delete(self):
+        c, self.zmq_client = self.zmq_client, None
+        if c is not None:
+            c.shutdown()
+
+        d, self.status_poll = self.status_poll, None
+        if d is not None:
+            d.cancel()
+
+        super(AdtranOltHandler, self).delete()
+
     def rx_packet(self, message):
         try:
             self.log.info('rx_Packet: Message from ONU')
@@ -314,7 +371,18 @@
     @inlineCallbacks
     def update_flow_table(self, flows, device):
         self.log.info('bulk-flow-update', device_id=device.id, flows=flows)
-        raise NotImplementedError('TODO: Not yet implemented')
+
+        for flow in flows:
+            # TODO: Do we get duplicates here (ie all flows re-pushed on each individual flow add?)
+
+            flow_entry = FlowEntry.create(flow, self)
+
+            if flow_entry is not None:
+                flow_entry.install()
+
+                if flow_entry.name not in self.flow_entries:
+                    # TODO: Do we get duplicates here (ie all flows re-pushed on each individual flow add?)
+                    self.flow_entries[flow_entry.name] = flow_entry
 
     @inlineCallbacks
     def send_proxied_message(self, proxy_address, msg):
diff --git a/voltha/adapters/adtran_olt/codec/ietf_interfaces.py b/voltha/adapters/adtran_olt/codec/ietf_interfaces.py
new file mode 100644
index 0000000..e041040
--- /dev/null
+++ b/voltha/adapters/adtran_olt/codec/ietf_interfaces.py
@@ -0,0 +1,283 @@
+from twisted.internet.defer import inlineCallbacks, returnValue
+import xmltodict
+import structlog
+from voltha.protos.openflow_13_pb2 import OFPPF_1GB_FD, OFPPF_10GB_FD, OFPPF_40GB_FD, OFPPF_100GB_FD
+from voltha.protos.openflow_13_pb2 import OFPPF_FIBER, OFPPF_COPPER
+from voltha.protos.openflow_13_pb2 import OFPPS_LIVE, OFPPC_PORT_DOWN, OFPPS_LINK_DOWN, OFPPF_OTHER
+from voltha.protos.common_pb2 import OperStatus, AdminState
+
+log = structlog.get_logger()
+
+_ietf_interfaces_config_rpc = """
+    <filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+      <interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
+        <interface/>
+      </interfaces>
+    </filter>
+"""
+
+_ietf_interfaces_state_rpc = """
+    <filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+      <interfaces-state xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
+        <interface>
+          <name/>
+          <type/>
+          <admin-status/>
+          <oper-status/>
+          <last-change/>
+          <phys-address/>
+          <speed/>
+        </interface>
+      </interfaces-state>
+    </filter>
+"""
+
+_allowed_with_default_types = ['report-all', 'report-all-tagged', 'trim', 'explicit']
+
+# TODO: Centralize the item below as a function in a core util module
+
+
+def _with_defaults(default_type=None):
+    if default_type is None:
+        return ""
+
+    assert(default_type in _allowed_with_default_types)
+    return """
+    <with-defaults xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults">
+        {}</with-defaults>""".format(default_type)
+
+
+class IetfInterfacesConfig(object):
+    def __init__(self, session):
+        self._session = session
+
+    @inlineCallbacks
+    def get_config(self, source='running', with_defaults=None):
+
+        filter = _ietf_interfaces_config_rpc + _with_defaults(with_defaults)
+
+        request = self._session.get(source, filter=filter)
+        rpc_reply = yield request
+        returnValue(rpc_reply)
+
+    def get_interfaces(self, rpc_reply, interface_type=None):
+        """
+        Get the physical entities of a particular type
+        :param rpc_reply: Reply from previous get or request
+        :param interface_type: (String or List) The type of interface (case-insensitive)
+        :return: list) of OrderDict interface entries
+        """
+        result_dict = xmltodict.parse(rpc_reply.data_xml)
+
+        entries = result_dict['data']['interfaces']
+
+        if interface_type is None:
+            return entries
+
+        for entry in entries:
+            import pprint
+            log.info(pprint.PrettyPrinter(indent=2).pformat(entry))
+
+        def _matches(entry, value):
+            if 'type' in entry and '#text' in entry['type']:
+                text_val = entry['type']['#text'].lower()
+                if isinstance(value, list):
+                    return any(v.lower() in text_val for v in value)
+                return value.lower() in text_val
+            return False
+
+        return [entry for entry in entries if _matches(entry, interface_type)]
+
+
+class IetfInterfacesState(object):
+    def __init__(self, session):
+        self._session = session
+
+    @inlineCallbacks
+    def get_state(self):
+        try:
+            request = self._session.get(_ietf_interfaces_state_rpc)
+            rpc_reply = yield request
+            returnValue(rpc_reply)
+
+        except Exception as e:
+            log.exception('get_state', e=e)
+            raise
+
+    @staticmethod
+    def get_interfaces(self, rpc_reply, key='type', key_value=None):
+        """
+        Get the physical entities of a particular type
+        :param key_value: (String or List) The type of interface (case-insensitive)
+        :return: list) of OrderDict interface entries
+        """
+        result_dict = xmltodict.parse(rpc_reply.data_xml)
+        entries = result_dict['data']['interfaces-state']['interface']
+
+        if key_value is None:
+            return entries
+
+        for entry in entries:
+            import pprint
+            log.info(pprint.PrettyPrinter(indent=2).pformat(entry))
+
+        def _matches(entry, key, value):
+            if key in entry and '#text' in entry[key]:
+                text_val = entry[key]['#text'].lower()
+                if isinstance(value, list):
+                    return any(v.lower() in text_val for v in value)
+                return value.lower() in text_val
+            return False
+
+        return [entry for entry in entries if _matches(entry, key, key_value)]
+
+    @staticmethod
+    def _get_admin_state(entry):
+        state_map = {
+            'up': AdminState.ENABLED,
+            'down': AdminState.DISABLED,
+            'testing': AdminState.DISABLED
+        }
+        return state_map.get(entry.get('admin-status', 'down'),
+                             AdminState.UNKNOWN)
+
+    @staticmethod
+    def _get_oper_status(entry):
+        state_map = {
+            'up': OperStatus.ACTIVE,
+            'down': OperStatus.FAILED,
+            'testing': OperStatus.TESTING,
+            'unknown': OperStatus.UNKNOWN,
+            'dormant': OperStatus.DISCOVERED,
+            'not-present': OperStatus.UNKNOWN,
+            'lower-layer-down': OperStatus.FAILED
+        }
+        return state_map.get(entry.get('oper-status', 'down'),
+                             OperStatus.UNKNOWN)
+
+    @staticmethod
+    def _get_mac_addr(entry):
+        mac_addr = entry.get('phys-address', None)
+        if mac_addr is None:
+            import random
+            # TODO: Get with qumram team about phys addr
+            mac_addr = '08:00:{}{}:{}{}:{}{}:00'.format(random.randint(0, 9),
+                                                        random.randint(0, 9),
+                                                        random.randint(0, 9),
+                                                        random.randint(0, 9),
+                                                        random.randint(0, 9),
+                                                        random.randint(0, 9))
+        return mac_addr
+
+    @staticmethod
+    def _get_speed_value(entry):
+        speed = entry.get('speed') or IetfInterfacesState._get_speed_via_name(entry.get('name'))
+        if isinstance(speed, str):
+            return long(speed)
+        return speed
+
+    @staticmethod
+    def _get_speed_via_name(name):
+        speed_map = {
+            'terabit':         1000000000000,
+            'hundred-gigabit':  100000000000,
+            'fourty-gigabit':    40000000000,
+            'ten-gigabit':       10000000000,
+            'gigabit':            1000000000,
+        }
+        for n,v in speed_map.iteritems():
+            if n in name.lower():
+                return v
+        return 0
+
+    @staticmethod
+    def _get_of_state(entry):
+        # If port up and ready: OFPPS_LIVE
+        # If port config bit is down: OFPPC_PORT_DOWN
+        # If port state bit is down: OFPPS_LINK_DOWN
+        if IetfInterfacesState._get_admin_state(entry) == AdminState.ENABLED:
+            return OFPPS_LIVE \
+                if IetfInterfacesState._get_oper_status(entry) == OperStatus.ACTIVE \
+                else OFPPS_LINK_DOWN
+
+        return OFPPC_PORT_DOWN
+
+    @staticmethod
+    def _get_of_capabilities(entry):
+        # The capabilities field is a bitmap that uses a combination of the following flags :
+        # Capabilities supported by the datapath
+        # enum ofp_capabilities {
+        #    OFPC_FLOW_STATS = 1 << 0,   /* Flow statistics. */
+        #    OFPC_TABLE_STATS = 1 << 1,  /* Table statistics. */
+        #    OFPC_PORT_STATS = 1 << 2,   /* Port statistics. */
+        #    OFPC_GROUP_STATS = 1 << 3,  /* Group statistics. */
+        #    OFPC_IP_REASM = 1 << 5,     /* Can reassemble IP fragments. */
+        #    OFPC_QUEUE_STATS = 1 << 6,  /* Queue statistics. */
+        #    OFPC_PORT_BLOCKED = 1 << 8, /* Switch will block looping ports. */
+        #    OFPC_BUNDLES = 1 << 9,      /* Switch supports bundles. */
+        #    OFPC_FLOW_MONITORING = 1 << 10, /* Switch supports flow monitoring. */
+        # }
+        # enum ofp_port_features {
+        #     OFPPF_10MB_HD = 1 << 0, /* 10 Mb half-duplex rate support. */
+        #     OFPPF_10MB_FD = 1 << 1, /* 10 Mb full-duplex rate support. */
+        #     OFPPF_100MB_HD = 1 << 2, /* 100 Mb half-duplex rate support. */
+        #     OFPPF_100MB_FD = 1 << 3, /* 100 Mb full-duplex rate support. */
+        #     OFPPF_1GB_HD = 1 << 4, /* 1 Gb half-duplex rate support. */
+        #     OFPPF_1GB_FD = 1 << 5, /* 1 Gb full-duplex rate support. */
+        #     OFPPF_10GB_FD = 1 << 6, /* 10 Gb full-duplex rate support. */
+        #     OFPPF_40GB_FD = 1 << 7, /* 40 Gb full-duplex rate support. */
+        #     OFPPF_100GB_FD = 1 << 8, /* 100 Gb full-duplex rate support. */
+        #     OFPPF_1TB_FD = 1 << 9, /* 1 Tb full-duplex rate support. */
+        #     OFPPF_OTHER = 1 << 10, /* Other rate, not in the list. */
+        #     OFPPF_COPPER = 1 << 11, /* Copper medium. */
+        #     OFPPF_FIBER = 1 << 12, /* Fiber medium. */
+        #     OFPPF_AUTONEG = 1 << 13, /* Auto-negotiation. */
+        #     OFPPF_PAUSE = 1 << 14, /* Pause. */
+        #     OFPPF_PAUSE_ASYM = 1 << 15 /* Asymmetric pause. */
+        # }
+        # TODO: Look into adtran-physical-entities and decode xSFP type any other settings
+        return IetfInterfacesState._get_of_speed(entry) | OFPPF_FIBER
+
+    @staticmethod
+    def _get_of_speed(entry):
+        speed = IetfInterfacesState._get_speed_value(entry)
+        speed_map = {
+            1000000000: OFPPF_1GB_FD,
+            10000000000: OFPPF_10GB_FD,
+            40000000000: OFPPF_40GB_FD,
+            100000000000: OFPPF_100GB_FD,
+        }
+        return speed_map.get(speed, OFPPF_OTHER)
+
+    @staticmethod
+    def get_nni_port_entries(rpc_reply, nni_type='ethernet'):
+        """
+        Get the port entries that make up the northbound interfaces
+
+        :param rpc_reply:
+        :param nni_type:
+        :return:
+        """
+        port_no = 1
+        ports = []
+        result_dict = xmltodict.parse(rpc_reply.data_xml)
+        entries = result_dict['data']['interfaces-state']['interface']
+        nni_ports = [entry for entry in entries if 'name' in entry and nni_type in entry['name']]
+
+        for entry in nni_ports:
+            port = {
+                'port_no': port_no,
+                'name': entry.get('name', 'unknown'),
+                # 'label': None,
+                'mac_address': IetfInterfacesState._get_mac_addr(entry),
+                'admin_state': IetfInterfacesState._get_admin_state(entry),
+                'oper_status': IetfInterfacesState._get_oper_status(entry),
+                'ofp_state': IetfInterfacesState._get_of_state(entry),
+                'ofp_capabilities': IetfInterfacesState._get_of_capabilities(entry),
+                'current_speed': IetfInterfacesState._get_of_speed(entry),
+                'max_speed': IetfInterfacesState._get_of_speed(entry),
+            }
+            ports.append(port)
+            port_no += 1
+
+        return ports
diff --git a/voltha/adapters/adtran_olt/codec/olt_state.py b/voltha/adapters/adtran_olt/codec/olt_state.py
index 32b43aa..8ab07db 100644
--- a/voltha/adapters/adtran_olt/codec/olt_state.py
+++ b/voltha/adapters/adtran_olt/codec/olt_state.py
@@ -146,8 +146,8 @@
             mobility protecting state.
                 onu-bit-octects:
                   type binary { length "4 .. 1024"; }
-                  description  each bit position indicates corresponding ONU's status 
-                               (true or false) whether that ONU's is in 
+                  description  each bit position indicates corresponding ONU's status
+                               (true or false) whether that ONU's is in
                                wavelength mobility protecting state or not
                                For 128 ONTs per PON, the size of this
                                array will be 16. onu-bit-octects[0] and MSB bit in that byte
@@ -164,7 +164,7 @@
         def discovered_onu(self):
             """
             Immutable Set of each Optical Network Unit(ONU) that has been activated via discovery
-                key/value: serial-number (string)               
+                key/value: serial-number (string)
             """
             return frozenset([sn['serial-number'] for sn in self._packet.get('discovered-onu', [])
                               if 'serial-number' in sn])
diff --git a/voltha/adapters/adtran_olt/codec/physical_entities_state.py b/voltha/adapters/adtran_olt/codec/physical_entities_state.py
new file mode 100644
index 0000000..ed0156f
--- /dev/null
+++ b/voltha/adapters/adtran_olt/codec/physical_entities_state.py
@@ -0,0 +1,66 @@
+from ..net.adtran_netconf import adtran_module_url
+from twisted.internet.defer import inlineCallbacks, returnValue
+import xmltodict
+import structlog
+
+log = structlog.get_logger()
+
+_phys_entities_rpc = """
+    <filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+      <physical-entities-state xmlns="{}">
+        <physical-entity/>
+      </physical-entities-state>
+    </filter>
+    """.format(adtran_module_url('adtran-physical-entities'))
+
+
+class PhysicalEntitiesState(object):
+    def __init__(self, session):
+        self._session = session
+        self._rpc_reply = None
+
+    @inlineCallbacks
+    def get_state(self):
+        self._rpc_reply =  None
+        request = self._session.get(_phys_entities_rpc)
+        self._rpc_reply = yield request
+        returnValue(self._rpc_reply)
+
+    @property
+    def physical_entities(self):
+        """
+        :return: (list) of OrderDict physical entities
+        """
+        if self._rpc_reply is None:
+            # TODO: Support auto-get?
+            return None
+
+        result_dict = xmltodict.parse(self._rpc_reply.data_xml)
+        return result_dict['data']['physical-entities-state']['physical-entity']
+
+    def get_physical_entities(self, classification=None):
+        """
+        Get the physical entities of a particular type
+        :param classification: (String or List) The classification or general hardware type of the
+                                                component identified by this physical entity
+                                                (case-insensitive)
+        :return: (list) of OrderDict physical entities
+        """
+        entries = self.physical_entities
+
+        if classification is None:
+            return entries
+
+        # for entry in entries:
+        #     import pprint
+        #     log.info(pprint.PrettyPrinter(indent=2).pformat(entry))
+
+        def _matches(entry, value):
+            if 'classification' in entry and '#text' in entry['classification']:
+                text_val = entry['classification']['#text'].lower()
+                if isinstance(value, list):
+                    return any(v.lower() in text_val for v in value)
+                return value.lower() in text_val
+            return False
+
+        return [entry for entry in entries if _matches(entry, classification)]
diff --git a/voltha/adapters/adtran_olt/flow/__init__.py b/voltha/adapters/adtran_olt/flow/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/voltha/adapters/adtran_olt/flow/__init__.py
diff --git a/voltha/adapters/adtran_olt/flow/acl.py b/voltha/adapters/adtran_olt/flow/acl.py
new file mode 100644
index 0000000..6228afc
--- /dev/null
+++ b/voltha/adapters/adtran_olt/flow/acl.py
@@ -0,0 +1,174 @@
+#
+# Copyright 2017-present Adtran, Inc.
+#
+# 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 random
+
+from enum import Enum
+import structlog
+from twisted.internet.defer import inlineCallbacks, returnValue
+
+from voltha.core.logical_device_agent import mac_str_to_tuple
+from voltha.protos.common_pb2 import OperStatus, AdminState
+from voltha.protos.device_pb2 import Port
+from voltha.protos.logical_device_pb2 import LogicalPort
+from voltha.protos.openflow_13_pb2 import OFPPF_100GB_FD, OFPPF_FIBER, OFPPS_LIVE, ofp_port
+
+import voltha.core.flow_decomposer as fd
+
+log = structlog.get_logger()
+
+_acl_list = {}      # Key -> Name: List of encoded EVCs
+
+
+class ACL(object):
+    """
+    Class to wrap Trap-to-Controller functionality
+    """
+
+    def __init__(self, flow_entry):
+        self._installed = False
+        self._status_message = None
+        self._parent = flow_entry           # FlowEntry parent
+        self._flow = flow_entry.flow
+        self._handler = flow_entry.handler
+        self._name = None
+
+        self._valid = self._decode()
+
+    @staticmethod
+    def create(flow_entry):
+        pass                    # TODO: Start here Thursday
+
+    @staticmethod
+    def flow_to_name(flow, handler):
+        return 'ACL-{}-{}'.format(flow.id, handler.id)
+
+    @property
+    def valid(self):
+        return self._valid
+
+    @property
+    def installed(self):
+        return self._installed
+
+    @property
+    def status(self):
+        return self._status_message
+
+    def install(self):
+        if not self._installed:
+            if self._name in _acl_list:
+                self._status_message = "ACL '{}' already is installed".format(self.name)
+                raise Exception(self._status_message)   # TODO: A unique exception type would work here
+
+            raise NotImplemented('TODO: Implement this')
+
+            self._installed = True
+            _acl_list[self.name] = self
+            pass
+
+        return self._installed
+
+    def remove(self):
+        if self._installed:
+            raise NotImplemented('TODO: Implement this')
+
+            self._installed = False
+            _acl_list.pop(self._name)
+            pass
+
+        return not self._installed
+
+    def enable(self):
+        if not self._enabled:
+            raise NotImplemented("TODO: Implement this")
+            self._enabled = False
+
+    def disable(self):
+        if self._enabled:
+            raise NotImplemented("TODO: Implement this")
+            self._enabled = True
+
+    def _decode(self):
+        """
+        Examine flow rules and extract appropriate settings for both this EVC
+        and creates any EVC-Maps required.
+        """
+        self._name = ACL.flow_to_name(self._flow, self._handler)
+
+        # Determine this flow's type
+
+        status = self._decode_traffic_selector() and self._decode_traffic_treatment()
+
+        if status:
+            pass    # TODO
+
+            if status:
+                pass     # TODO
+            else:
+                pass     # TODO
+
+        return status
+
+    def _is_men_port(self, port):
+        return port in self._handler.northbound_ports(port)
+
+    def _is_uni_port(self, port):
+        return port in self._handler.southbound_ports(port)
+
+    def _is_logical_port(self, port):
+        return not self._is_men_port(port) and not self._is_uni_port(port)
+
+    def _get_port_name(self, port):
+        if self._is_logical_port(port):
+            raise NotImplemented('TODO: Logical ports not yet supported')
+
+        if self._is_men_port(port):
+            return self._handler.northbound_ports[port].name
+
+        return None
+
+    def _decode_traffic_selector(self):
+        """
+        Extract EVC related traffic selection settings
+        """
+        in_port = fd.get_in_port(self._flow)
+        assert in_port is not None
+
+        return True
+
+    def _decode_traffic_treatment(self):
+        out_port = fd.get_out_port(self._flow)
+
+        return True
+
+    # BULK operations
+
+    @staticmethod
+    def enable_all():
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def disable_all():
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def remove_all():
+        """
+        Remove all ACLs from hardware
+        """
+        raise NotImplemented("TODO: Implement this")
+
diff --git a/voltha/adapters/adtran_olt/flow/evc.py b/voltha/adapters/adtran_olt/flow/evc.py
new file mode 100644
index 0000000..27ce42f
--- /dev/null
+++ b/voltha/adapters/adtran_olt/flow/evc.py
@@ -0,0 +1,292 @@
+#
+# Copyright 2017-present Adtran, Inc.
+#
+# 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 random
+
+from enum import Enum
+import structlog
+from twisted.internet.defer import inlineCallbacks, returnValue
+
+from voltha.core.logical_device_agent import mac_str_to_tuple
+from voltha.protos.common_pb2 import OperStatus, AdminState
+from voltha.protos.device_pb2 import Port
+from voltha.protos.logical_device_pb2 import LogicalPort
+from voltha.protos.openflow_13_pb2 import OFPPF_100GB_FD, OFPPF_FIBER, OFPPS_LIVE, ofp_port
+
+import voltha.core.flow_decomposer as fd
+
+log = structlog.get_logger()
+
+_evc_list = {}      # Key -> Name: List of encoded EVCs
+
+EVC_NAME_FORMAT = 'EVC-VOLTHA-{}-{}'
+EVC_NAME_REGEX = 'EVC-VOLTHA-{}'.format('regex-here')
+DEFAULT_STPID = 0x8100
+
+
+class EVC(object):
+    """
+    Class to wrap EVC functionality
+    """
+    class SwitchingMethod(Enum):
+        SINGLE_TAGGED = 0
+        DOUBLE_TAGGED = 1
+        MAC_SWITCHED = 2
+
+    class Men2UniManipulation(Enum):
+        SYMETRIC = 0
+        POP_OUT_TAG_ONLY = 1
+
+    class ElineFlowType(Enum):
+        NNI_TO_UNI = 0,
+        UNI_TO_NNI = 1,
+        NNI_TO_NNI = 2,
+        ACL_FILTER = 3,
+        UNKNOWN = 4,
+        UNSUPPORTED = 5     # Or Invalid
+
+    def __init__(self, flow_entry):
+        self._installed = False
+        self._status_message = None
+        self._parent = flow_entry           # FlowEntry parent
+        self._flow = flow_entry.flow
+        self._handler = flow_entry.handler
+        self._evc_maps = []                 # One if E-Line
+
+        self._flow_type = EVC.ElineFlowType.UNKNOWN
+
+        # EVC related properties
+        self._name = EVC.flow_to_name(flow_entry.flow, flow_entry.handler)
+        self._enabled = True
+        self._ce_vlan_preservation = True
+        self._men_ports = []
+        self._s_tag = -1
+        self._stpid = DEFAULT_STPID
+
+        self._switching_method = EVC.SwitchingMethod.SINGLE_TAGGED
+        self._men_to_uni_tag_manipulation = EVC.Men2UniManipulation.SYMETRIC
+
+        self._valid = self._decode()
+
+    @staticmethod
+    def flow_to_name(flow, handler):
+        return EVC_NAME_FORMAT.format(flow.id, handler.id)
+
+    @staticmethod
+    def create(flow_entry):
+        # Does it already exist?
+
+        evc = _evc_list.get(EVC.flow_to_name(flow_entry.flow, flow_entry.handler))
+
+        if evc is None:
+            evc = EVC(flow_entry.flow, flow_entry.handler)
+
+            if evc is not None:
+                pass    # Look up any EVC that
+                return
+            pass        # Start decode here
+
+        return evc
+
+    @property
+    def valid(self):
+        return self._valid
+
+    @property
+    def installed(self):
+        return self._installed
+
+    @property
+    def status(self):
+        return self._status_message
+
+    def install(self):
+        if not self._installed:
+            if self._name in _evc_list:
+                self._status_message = "EVC '{}' already is installed".format(self._name)
+                raise Exception(self._status_message)   # TODO: A unique exception type would work here
+
+            raise NotImplemented('TODO: Implement this')
+            # xml = '<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">' \
+            #       '<evcs xmlns="http://www.adtran.com/ns/yang/adtran-evcs">' \
+            #       '<adtn-evc:evc xmlns:adtn-evc="http://www.adtran.com/ns/yang/adtran-evcs">'
+            #
+            # xml += '<adtn-evc:name>' + name + '</adtn-evc:name>'
+            #
+            # if stag:
+            #     xml += '<adtn-evc:stag>' + stag + '</adtn-evc:stag>'
+            #
+            # if preserve:
+            #     xml += '<adtn-evc:ce-vlan-preservation>' + preserve + '</adtn-evc:ce-vlan-preservation>'
+            #
+            # if enabled:
+            #     xml += '<adtn-evc:enabled>' + enabled + '</adtn-evc:enabled>'
+            # else:
+            #     xml += '<adtn-evc:enabled>' + "true" + '</adtn-evc:enabled>'
+            #
+            # xml += '</adtn-evc:evc></evc></config>'
+            #
+            # print "Creating EVC %s" % name
+            #
+            # print mgr.mgr.edit_config(target="running",
+            #                           config=xml,
+            #                           default_operation="merge",
+            #                           format="xml")
+
+            self._installed = True
+            _evc_list[self.name] = self
+            pass
+
+        return self._installed
+
+    def remove(self):
+        if self._installed:
+            raise NotImplemented('TODO: Implement this')
+            # xml = '<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">' \
+            #       '<evcs xmlns="http://www.adtran.com/ns/yang/adtran-evcs">' \
+            #       '<adtn-evc:evc xmlns:adtn-evc="http://www.adtran.com/ns/yang/adtran-evcs" nc:operation="delete">'
+            #
+            # xml += '<adtn-evc:name>' + name + '</adtn-evc:name>'
+            #
+            # xml += '</adtn-evc:evc></evc></config>'
+            #
+            # print "Deleting EVC %s" % name
+            #
+            # print mgr.mgr.edit_config(target="running",
+            #                           config=xml,
+            #                           default_operation="merge",
+            #                           format="xml")
+
+            self._installed = False
+            _evc_list.pop(self.name)
+            pass
+
+        return not self._installed
+
+    def enable(self):
+        if not self._enabled:
+            raise NotImplemented("TODO: Implement this")
+            self._enabled = False
+
+    def disable(self):
+        if self._enabled:
+            raise NotImplemented("TODO: Implement this")
+            self._enabled = True
+
+    def _decode(self):
+        """
+        Examine flow rules and extract appropriate settings for both this EVC
+        and creates any EVC-Maps required.
+        """
+        from evc_map import EVCMap
+
+        # Determine this flow's type
+
+        status = self._decode_traffic_selector() and self._decode_traffic_treatment()
+
+        if status:
+            ingress_map = EVCMap.createIngressMap(self._flow, self._device)
+            egress_map = EVCMap.createEgressMap(self._flow, self._device)
+
+            status = ingress_map.valid and egress_map.valid
+
+            if status:
+                self._evc_maps.append(ingress_map)
+                self._evc_maps.append(egress_map)
+            else:
+                self._status_message = 'Ingress MAP invalid: {}'.format(ingress_map.status)\
+                    if not ingress_map.valid else 'Egress MAP invalid: {}'.format(egress_map.status)
+
+        return status
+
+    def _is_men_port(self, port):
+        return port in self._handler.northbound_ports(port)
+
+    def _is_uni_port(self, port):
+        return port in self._handler.southbound_ports(port)
+
+    def _is_logical_port(self, port):
+        return not self._is_men_port(port) and not self._is_uni_port(port)
+
+    def _get_port_name(self, port):
+        if self._is_logical_port(port):
+            raise NotImplemented('TODO: Logical ports not yet supported')
+
+        if self._is_men_port(port):
+            return self._handler.northbound_ports[port].name
+
+        return None
+
+    def _decode_traffic_selector(self):
+        """
+        Extract EVC related traffic selection settings
+        """
+        in_port = fd.get_in_port(self._flow)
+        assert in_port is not None
+
+        if self._is_men_port(in_port):
+            log.debug('in_port is a MEN Port', port=in_port)
+            self._men_ports.append(self._get_port_name(in_port))
+        else:
+            pass    # UNI Ports handled in the EVC Maps
+
+        for field in fd.get_ofb_fields(self._flow):
+            log.debug('Found OFB field', field=field)
+            self._status_message = 'Unsupported field.type={}'.format(field.type)
+            return False
+
+        return True
+
+    def _decode_traffic_treatment(self):
+        out_port = fd.get_out_port(self._flow)
+        num_outputs = 0
+
+        if self._is_men_port(out_port):
+            log.debug('out_port is a MEN Port', port=out_port)
+            self._men_ports.append(self._get_port_name(out_port))
+        else:
+            pass  # UNI Ports handled in the EVC Maps
+
+        for action in fd.get_actions(self._flow):
+            if action.type == fd.OUTPUT:
+                num_outputs += 1            # Handled earlier
+                assert num_outputs <= 1     # Only E-LINE supported and no UNI<->UNI
+
+            else:
+                # TODO: May need to modify ce-preservation
+                log.debug('Found action', action=action)
+
+        return True
+
+    # BULK operations
+
+    @staticmethod
+    def enable_all(regex_=EVC_NAME_REGEX):
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def disable_all(regex_=EVC_NAME_REGEX):
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def remove_all(regex_=EVC_NAME_REGEX):
+        """
+        Remove all matching EVCs and associated EVC MAPs from hardware
+
+        :param regex_: (String) Regular expression for name matching
+        """
+        raise NotImplemented("TODO: Implement this")
+
diff --git a/voltha/adapters/adtran_olt/flow/evc_map.py b/voltha/adapters/adtran_olt/flow/evc_map.py
new file mode 100644
index 0000000..1d16daf
--- /dev/null
+++ b/voltha/adapters/adtran_olt/flow/evc_map.py
@@ -0,0 +1,131 @@
+#
+# Copyright 2017-present Adtran, Inc.
+#
+# 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 random
+
+import structlog
+from enum import Enum
+from twisted.internet.defer import inlineCallbacks, returnValue
+
+from voltha.core.logical_device_agent import mac_str_to_tuple
+from voltha.protos.common_pb2 import OperStatus, AdminState
+from voltha.protos.device_pb2 import Port
+from voltha.protos.logical_device_pb2 import LogicalPort
+from voltha.protos.openflow_13_pb2 import OFPPF_100GB_FD, OFPPF_FIBER, OFPPS_LIVE, ofp_port
+
+import voltha.core.flow_decomposer as fd
+
+log = structlog.get_logger()
+
+EVC_MAP_NAME_INGRESS_FORMAT = 'EVCMap-VOLTHA-ingress-{}'
+EVC_MAP_NAME_EGRESS_FORMAT = 'EVCMap-VOLTHA-egress-{}'
+
+EVC_MAP_NAME_INGRESS_REGEX_FORMAT = EVC_MAP_NAME_INGRESS_FORMAT.format('regex here')
+EVC_MAP_NAME_EGRESS_REGEX_FORMAT = EVC_MAP_NAME_EGRESS_FORMAT.format('regex here')
+
+class EVCMap(object):
+    """
+    Class to wrap EVC functionality
+    """
+    class EvcConnection(Enum):
+        NO_EVC_CONNECTION = 0
+        EVC = 1
+        DISCARD = 2
+
+    class Priority_Option(Enum):
+        INHERIT_PRIORITY = 0
+        EXPLICIT_PRIORITY = 1
+
+    def __init__(self, flow, handler, evc, is_ingress_map):
+        self._installed = False
+        self._status_message = None
+        self._flow = flow
+        self._handler = handler
+
+        self._name = None
+        self._enabled = True
+        self._uni_port = None
+        self._evc_connection = EVCMap.EvcConnection.NO_EVC_CONNECTION
+        self._evc_name = None
+
+        self._men_priority = EVCMap.Priority_Option.INHERIT_PRIORITY
+        self._men_pri = 0  # If Explicit Priority
+
+        self._c_tag = -1
+        self._men_ctag_priority = EVCMap.Priority_Option.INHERIT_PRIORITY
+        self._men_ctag_pri = 0  # If Explicit Priority
+
+        self._match_ce_vlan_id = -1
+        self._match_untagged = True
+        self._match_destination_mac_address = None
+        self._match_l2cp = False
+        self._match_broadcast = False
+        self._match_multicast = False
+        self._match_unicast = False
+        self._match_igmp = False
+
+        self._evc = evc
+        self._is_ingress_map = is_ingress_map
+
+        self._valid = self.decode()
+
+    @staticmethod
+    def createIngressMap(flow, device, evc):
+        return EVCMap(flow, device, evc, True)
+
+    @staticmethod
+    def createEgressMap(flow, device, evc):
+        return EVCMap(flow, device, evc, False)
+
+    @property
+    def valid(self):
+        return self._valid
+
+    @property
+    def installed(self):
+        return self._installed
+
+    @property
+    def status(self):
+        return self._status_message
+
+    def install(self):
+        if not self._installed:
+            pass
+
+        return self._installed
+
+    def remove(self):
+        if self._installed:
+            pass
+
+        return not self._installed
+
+    def _decode(self):
+        self._name = 'EVC-MAP-{}-{}'.format('i' if self._is_ingress_map else 'e', self._flow.id)
+
+        return self._decode_traffic_selector() and self._decode_traffic_treatment()
+
+    def _decode_traffic_selector(self):
+        self._status_message('TODO: Not yet implemented')
+        return False
+
+    def _decode_traffic_treatment(self):
+        self._status_message('TODO: Not yet implemented')
+        return False
+
+
+
diff --git a/voltha/adapters/adtran_olt/flow/flow_entry.py b/voltha/adapters/adtran_olt/flow/flow_entry.py
new file mode 100644
index 0000000..b683cab
--- /dev/null
+++ b/voltha/adapters/adtran_olt/flow/flow_entry.py
@@ -0,0 +1,164 @@
+#
+# Copyright 2017-present Adtran, Inc.
+#
+# 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 structlog
+from evc import EVC
+from acl import ACL
+
+import voltha.core.flow_decomposer as fd
+from voltha.protos.openflow_13_pb2 import OFPP_IN_PORT, OFPP_TABLE, OFPP_NORMAL, OFPP_FLOOD, OFPP_ALL
+from voltha.protos.openflow_13_pb2 import OFPP_CONTROLLER, OFPP_LOCAL, OFPP_ANY, OFPP_MAX
+
+log = structlog.get_logger()
+
+
+class FlowEntry(object):
+    """
+    Provide a class that wraps the flow rule and also provides state/status for
+    a FlowEntry.
+    """
+    def __init__(self, flow, handler):
+        self._flow = flow
+        self._handler = handler
+        log.debug('Initializing a new FlowEntry', flow=flow)
+
+    @property
+    def name(self):
+        return 'Flow-{}'.format(self.flow.id)
+
+    @property
+    def flow(self):
+        return self._flow
+
+    @property
+    def handler(self):
+        return self._handler
+
+    @staticmethod
+    def create(flow, handler):
+        """
+        Create the appropriate FlowEntry wrapper for the flow
+
+        :param flow:   (Flow) Flow entry passed to VOLTHA adapter
+        :param handler: (AdtranDeviceHandler) handler for the device
+
+        :return: (FlowEntry) A flow entry of the appropriate type
+        """
+        # Determine the type of flow entry. An ACL type entry is use to send
+        # packets to a reserved port (controller) or to drop them.
+
+        in_port = fd.get_in_port(flow)
+        out_port = fd.get_out_port(flow)
+
+        if in_port or out_port is None:
+            return None
+
+        # Convert all possible physical ports into a single number for matching purposes
+
+        if in_port <= OFPP_MAX:
+            in_port = OFPP_MAX
+
+        if out_port <= OFPP_MAX:
+            in_port = OFPP_MAX
+
+        # Commented out entries below represent future desireable combinations, but not supported
+        # in initial release of this device adapter.
+
+        flow_type = {
+            (OFPP_MAX, OFPP_MAX): EVCFlowEntry,         # Physical port to physical port
+            (OFPP_ANY, OFPP_CONTROLLER): ACLFlowEntry,  # A common SDN/Openflow operation
+            (OFPP_MAX, OFPP_TABLE): EVCFlowEntry,       # Perhaps double-tagging?
+            # (OFPP_MAX, OFPP_LOCAL): ACLFlowEntry,
+            # (OFPP_ANY, OFPP_LOCAL): ACLFlowEntry,
+            # (OFPP_LOCAL, OFPP_MAX): ACLFlowEntry,
+            # (OFPP_MAX, OFPP_IN_PORT): EVCFlowEntry,
+            # (OFPP_ANY, OFPP_IN_PORT): EVCFlowEntry,
+
+        }.get((in_port, out_port), None)
+
+        return None if flow_type is None else flow_type(FlowEntry(flow, handler))
+
+    ######################################################
+    # Bulk operations
+
+    @staticmethod
+    def enable_all():
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def disable_all():
+        raise NotImplemented("TODO: Implement this")
+
+    @staticmethod
+    def remove_all():
+        """
+        Remove all matching EVCs and associated EVC MAPs from hardware
+
+        :param regex_: (String) Regular expression for name matching
+        """
+        raise NotImplemented("TODO: Implement this")
+
+
+class EVCFlowEntry(FlowEntry):
+    def __init__(self, flow, handler):
+        super(FlowEntry, self).__init__(flow, handler)
+        self.evc = EVC.create(flow, handler)
+
+    @property
+    def valid(self):
+        return self.evc.valid
+
+    @property
+    def installed(self):
+        return self.evc.installed
+
+    def install(self):
+        return self.evc.install()
+
+    def remove(self):
+        return self.evc.remove()
+
+    def enable(self):
+        return self.evc.enable()
+
+    def disable(self):
+        return self.evc.disable()
+
+
+class ACLFlowEntry(FlowEntry):
+    def __init__(self, flow, handler):
+        super(FlowEntry, self).__init__(flow, handler)
+        self.acl = ACL.create(flow, handler)
+
+    @property
+    def valid(self):
+        return self.acl.valid
+
+    @property
+    def installed(self):
+        return self.acl.installed
+
+    def install(self):
+        return self.acl.install()
+
+    def remove(self):
+        return self.acl.remove()
+
+    def enable(self):
+        return self.acl.enable()
+
+    def disable(self):
+        return self.evc.disable()
+
diff --git a/voltha/adapters/adtran_olt/net/adtran_netconf.py b/voltha/adapters/adtran_olt/net/adtran_netconf.py
new file mode 100644
index 0000000..f75e115
--- /dev/null
+++ b/voltha/adapters/adtran_olt/net/adtran_netconf.py
@@ -0,0 +1,352 @@
+#
+# Copyright 2017-present Adtran, Inc.
+#
+# 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 structlog
+from lxml import etree
+from ncclient import manager
+from ncclient.operations import RPCError
+from ncclient.transport.errors import SSHError
+from twisted.internet import defer, threads
+from twisted.internet.defer import inlineCallbacks, returnValue
+
+log = structlog.get_logger('ncclient')
+
+ADTRAN_NS = 'http://www.adtran.com/ns/yang'
+
+
+def adtran_module_url(module):
+    return '{}/{}'.format(ADTRAN_NS, module)
+
+
+def phys_entities_rpc():
+    return """
+    <filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+      <physical-entities-state xmlns="{}">
+        <physical-entity/>
+      </physical-entities-state>
+    </filter>
+    """.format(adtran_module_url('adtran-physical-entities'))
+
+
+class AdtranNetconfClient(object):
+    """
+    Performs NETCONF requests
+    """
+
+    def __init__(self, host_ip, port=830, username='', password='', timeout=20):
+        self._ip = host_ip
+        self._port = port
+        self._username = username
+        self._password = password
+        self._timeout = timeout
+        self._session = None
+
+    def __str__(self):
+        return "AdtranNetconfClient {}@{}:{}".format(self._username, self._ip, self._port)
+
+    @property
+    def capabilities(self):
+        """
+        Get the server's NETCONF capabilities
+
+        :return: (ncclient.capabilities.Capabilities) object representing the server's capabilities.
+        """
+        return self._session.server_capabilities if self._session else None
+
+    @property
+    def connected(self):
+        """
+        Is this client connected to a NETCONF server
+        :return: (boolean) True if connected
+        """
+        return self._session is not None and self._session.connected
+
+    def connect(self, connect_timeout=None):
+        """
+        Connect to the NETCONF server
+
+          o To disable attempting publickey authentication altogether, call with
+            allow_agent and look_for_keys as False.
+
+          o hostkey_verify enables hostkey verification from ~/.ssh/known_hosts
+
+        :return: (deferred) Deferred request
+        """
+        timeout = connect_timeout or self._timeout
+
+        return threads.deferToThread(self._do_connect, timeout)
+
+    def _do_connect(self, timeout):
+        try:
+            self._session = manager.connect(host=self._ip,
+                                            port=self._port,
+                                            username=self._username,
+                                            password=self._password,
+                                            allow_agent=False,
+                                            look_for_keys=False,
+                                            hostkey_verify=False,
+                                            timeout=timeout)
+
+            log.debug('Dumping Server Capabilities')
+            for cap in self.capabilities:
+                log.debug('  {}'.format(cap))
+        except SSHError as e:
+            # Log and rethrow exception so any errBack is called
+            log.exception('SSH Error during connect: {}'.format(e.message))
+            raise e
+
+        except Exception as e:
+            # Log and rethrow exception so any errBack is called
+            log.exception('Connect request failed: {}'.format(e.message))
+            raise e
+
+        # If debug logging is enabled, decrease the level, DEBUG is a significant
+        # performance hit during response XML decode
+
+        if log.isEnabledFor('DEBUG'):
+            log.setLevel('INFO')
+
+        # TODO: ncclient also supports RaiseMode:NONE to limit exceptions.  To set use:
+        #
+        #  self._session.raise_mode = RaiseMode:NONE
+        #
+        # and the when you get a response back, you can check   'response.ok' to see if it is 'True'
+        # if it is not, you can enumerate the 'response.errors' list for more information
+
+        return self._session
+
+    def close(self):
+        """
+        Close the connection to the NETCONF server
+        :return:  (deferred) Deferred request
+        """
+        s, self._session = self._session, None
+
+        if s is None or not s.connected:
+            return defer.returnValue(True)
+
+        return threads.deferToThread(self._do_close, s)
+
+    def _do_close(self, old_session):
+        return old_session.close_session()
+
+    def get_config(self, source='running'):
+        """
+        Get the configuration from the specified source
+
+        :param source: (string) Configuration source, 'running', 'candidate', ...
+
+        :return: (deferred) Deferred request that wraps the GetReply class
+        """
+
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        return threads.deferToThread(self._do_get_config, source)
+
+    def _do_get_config(self, source):
+        """
+        Get the configuration from the specified source
+
+        :param source: (string) Configuration source, 'running', 'candidate', ...
+
+        :return: (GetReply) The configuration.
+        """
+        return self._session.get_config(source)
+
+    def get(self, payload):
+        """
+        Get the requested data from the server
+
+        :param payload: Payload/filter
+        :return: (defeered) for GetReply
+        """
+        log.debug('get', filter=payload)
+
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        return threads.deferToThread(self._do_get, payload)
+
+    def _do_get(self, payload):
+        """
+        Get the requested data from the server
+
+        :param payload: Payload/filter
+        :return: (GetReply) response
+        """
+        try:
+            response = self._session.get(payload)
+            # To get XML, use response.xml
+
+        except RPCError as e:
+            log.exception('get Exception: {}'.format(e.message))
+            raise
+
+        return response
+
+    def lock(self, source, lock_timeout):
+        """
+        Lock the configuration system
+        :return: (defeered) for RpcReply
+        """
+        log.debug('lock', source=source, timeout=lock_timeout)
+
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        return threads.deferToThread(self._do_lock, source, lock_timeout)
+
+    def _do_lock(self, source, lock_timeout):
+        """
+        Lock the configuration system
+        """
+        try:
+            response = self._session.lock(source, timeout=lock_timeout)
+            # To get XML, use response.xml
+
+        except RPCError as e:
+            log.exception('lock Exception: {}'.format(e.message))
+            raise
+
+        return response
+
+    def unlock(self, source):
+        """
+        Get the requested data from the server
+        :param rpc_string: RPC request
+
+        :return: (defeered) for RpcReply
+        """
+        log.debug('unlock', source=source)
+
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        return threads.deferToThread(self._do_unlock, source)
+
+    def _do_unlock(self, source):
+        """
+        Lock the configuration system
+        """
+        try:
+            response = self._session.unlock(source)
+            # To get XML, use response.xml
+
+        except RPCError as e:
+            log.exception('unlock Exception: {}'.format(e.message))
+            raise
+
+        return response
+
+    @inlineCallbacks
+    def edit_config(self, config, target='running', default_operation=None,
+                    test_option=None, error_option=None, lock_timeout=-1):
+        """
+        Loads all or part of the specified config to the target configuration datastore with the ability to lock
+        the datastore during the edit.  To change multiple items, use your own calls to lock/unlock instead of
+        using the lock_timeout value
+
+        :param config is the configuration, which must be rooted in the config element. It can be specified
+                      either as a string or an Element.format="xml"
+        :param target is the name of the configuration datastore being edited
+        :param default_operation if specified must be one of { 'merge', 'replace', or 'none' }
+        :param test_option if specified must be one of { 'test_then_set', 'set' }
+        :param error_option if specified must be one of { 'stop-on-error', 'continue-on-error', 'rollback-on-error' }
+                            The 'rollback-on-error' error_option depends on the :rollback-on-error capability.
+        :param lock_timeout if >0, the maximum number of seconds to hold a lock on the datastore while the edit
+                            operation is underway
+
+        :return: (defeered) for RpcReply
+        """
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        rpc_reply = None
+        if lock_timeout > 0:
+            try:
+                request = self._session.lock(target, lock_timeout)
+                rpc_reply = yield request
+
+            except Exception as e:
+                log.exception('edit_config Lock Exception: {}'.format(e.message))
+                raise
+        try:
+            if config[:7] != '<config':
+                config = '<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">' + \
+                         config + '</config>'
+
+            rpc_reply = yield threads.deferToThread(self._do_edit_config, target,
+                                                    config, default_operation,
+                                                    test_option, error_option)
+        except Exception as e:
+            log.exception('edit_config Edit Exception: {}'.format(e.message))
+            raise
+
+        finally:
+            if lock_timeout > 0:
+                try:
+                    yield self._session.lock(target, lock_timeout)
+
+                except Exception as e:
+                    log.exception('edit_config unlock Exception: {}'.format(e.message))
+                    # Note that we just fall through and do not re-raise this exception
+
+        returnValue(rpc_reply)
+
+    def _do_edit_config(self, target, config, default_operation, test_option, error_option):
+        """
+        Lock the configuration system
+        """
+        try:
+            response = self._session.edit_config(target=target, config=config
+                                                 # TODO: Support additional options later
+                                                 # ,default_operation=default_operation,
+                                                 # test_option=test_option,
+                                                 # error_option=error_option
+                                                 )
+            # To get XML, use response.xml
+            # To check status, use response.ok  (boolean)
+
+        except RPCError as e:
+            log.exception('edit_config Exception: {}'.format(e.message))
+            raise
+
+        return response
+
+    def rpc(self, rpc_string):
+        """
+        Custom RPC request
+        :param rpc_string: (string) RPC request
+        :return: (defeered) for GetReply
+        """
+        log.debug('rpc', rpc=rpc_string)
+
+        if not self._session or not self._session.connected:
+            raise NotImplemented('TODO: Support auto-connect if needed')
+
+        return threads.deferToThread(self._do_rpc, rpc_string)
+
+    def _do_rpc(self, rpc_string):
+        try:
+            response = self._session.dispatch(etree.fromstring(rpc_string))
+            # To get XML, use response.xml
+
+        except RPCError as e:
+            log.exception('rpc Exception: {}'.format(e.message))
+            raise
+
+        return response
diff --git a/voltha/adapters/adtran_olt/net/adtran_rest.py b/voltha/adapters/adtran_olt/net/adtran_rest.py
index 456b3c5..aa42c8e 100644
--- a/voltha/adapters/adtran_olt/net/adtran_rest.py
+++ b/voltha/adapters/adtran_olt/net/adtran_rest.py
@@ -23,6 +23,13 @@
 log = structlog.get_logger()
 
 
+class RestInvalidResponseCode(Exception):
+    def __init__(self, message, url, code):
+        super(RestInvalidResponseCode, self).__init__(message)
+        self.url = url
+        self.code = code
+
+
 class AdtranRestClient(object):
     """
     Performs Adtran RESTCONF requests
@@ -70,14 +77,17 @@
         :param password: (string) Password for credentials
         :param timeout: (int) Number of seconds to wait for a response before timing out
         """
-        self.ip = host_ip
-        self.rest_port = port
-        self.username = username
-        self.password = password
-        self.timeout = timeout
+        self._ip = host_ip
+        self._port = port
+        self._username = username
+        self._password = password
+        self._timeout = timeout
+
+    def __str__(self):
+        return "AdtranRestClient {}@{}:{}".format(self._username, self._ip, self._port)
 
     @inlineCallbacks
-    def request(self, method, uri, data=None, name=''):
+    def request(self, method, uri, data=None, name='', timeout=None):
         """
         Send a REST request to the Adtran device
 
@@ -91,31 +101,34 @@
         if method.upper() not in self._valid_methods:
             raise NotImplementedError("REST method '{}' is not supported".format(method))
 
-        url = 'http://{}:{}{}{}'.format(self.ip, self.rest_port,
+        url = 'http://{}:{}{}{}'.format(self._ip, self._port,
                                         '/' if uri[0] != '/' else '',
                                         uri)
+        response = None
+        timeout = timeout or self._timeout
+
         try:
             if method.upper() == 'GET':
                 response = yield treq.get(url,
-                                          auth=(self.username, self.password),
-                                          timeout=self.timeout,
+                                          auth=(self._username, self._password),
+                                          timeout=timeout,
                                           headers=self.REST_GET_REQUEST_HEADER)
             elif method.upper() == 'POST' or method.upper() == 'PUT':
                 response = yield treq.post(url,
                                            data=data,
-                                           auth=(self.username, self.password),
-                                           timeout=self.timeout,
+                                           auth=(self._username, self._password),
+                                           timeout=timeout,
                                            headers=self.REST_POST_REQUEST_HEADER)
             elif method.upper() == 'PATCH':
                 response = yield treq.patch(url,
                                             data=data,
-                                            auth=(self.username, self.password),
-                                            timeout=self.timeout,
+                                            auth=(self._username, self._password),
+                                            timeout=timeout,
                                             headers=self.REST_PATCH_REQUEST_HEADER)
             elif method.upper() == 'DELETE':
                 response = yield treq.delete(url,
-                                             auth=(self.username, self.password),
-                                             timeout=self.timeout,
+                                             auth=(self._username, self._password),
+                                             timeout=timeout,
                                              headers=self.REST_DELETE_REQUEST_HEADER)
             else:
                 raise NotImplementedError("REST method '{}' is not supported".format(method))
@@ -126,7 +139,7 @@
         except ConnectionClosed:
             returnValue(None)
 
-        except Exception, e:
+        except Exception as e:
             log.exception("REST {} '{}' request to '{}' failed: {}".format(method, name, url, str(e)))
             raise
 
@@ -134,7 +147,7 @@
             message = "REST {} '{}' request to '{}' failed with status code {}".format(method, name,
                                                                                        url, response.code)
             log.error(message)
-            raise Exception(message)
+            raise RestInvalidResponseCode(message, url, response.code)
 
         if response.code == self.HTTP_NO_CONTENT:
             returnValue(None)
@@ -154,7 +167,7 @@
             try:
                 result = json.loads(content)
 
-            except Exception, e:
+            except Exception as e:
                 log.exception("REST {} '{}' JSON decode of '{}' failure: {}".format(method, name,
                                                                                     url, str(e)))
                 raise
diff --git a/voltha/adapters/adtran_olt/net/adtran_zmq.py b/voltha/adapters/adtran_olt/net/adtran_zmq.py
index bdfaa45..9cbeae6 100644
--- a/voltha/adapters/adtran_olt/net/adtran_zmq.py
+++ b/voltha/adapters/adtran_olt/net/adtran_zmq.py
@@ -32,8 +32,8 @@
 class AdtranZmqClient(object):
     """
     Adtran ZeroMQ Client for PON Agent packet in/out service
-    
-    PON Agent expects and external PAIR socket with 
+
+    PON Agent expects and external PAIR socket with
     """
 
     def __init__(self, ip_address, rx_callback=None,
@@ -53,6 +53,10 @@
         except Exception as e:
             log.exception(e.message)
 
+    def shutdown(self):
+        self.socket.onReceive = AdtranZmqClient.rx_nop
+        self.socket.shutdown()
+
     @staticmethod
     def rx_nop(message):
         log.debug('Discarding ZMQ message, no receiver specified')
@@ -61,11 +65,11 @@
     def encode_omci_message(msg, pon_index, onu_id):
         """
         Create an OMCI Tx Packet for the specified ONU
-        
-        :param msg: (str) OMCI message to send 
+
+        :param msg: (str) OMCI message to send
         :param pon_index: (unsigned int) PON Port index
         :param onu_id: (unsigned int) ONU ID
-        
+
         :return: (bytes) octet string to send
         """
         assert msg
@@ -79,8 +83,8 @@
     def decode_packet(packet):
         """
         Decode the packet provided by the ZMQ client
-        
-        :param packet: (bytes) Packet 
+
+        :param packet: (bytes) Packet
         :return: (long, long, bytes, boolean) PON Index, ONU ID, Frame Contents (OMCI or Ethernet),\
                                               and a flag indicating if it is OMCI
         """
@@ -96,8 +100,8 @@
     def _decode_omci_message(packet):
         """
         Decode the packet provided by the ZMQ client
-        
-        :param packet: (bytes) Packet 
+
+        :param packet: (bytes) Packet
         :return: (long, long, bytes) PON Index, ONU ID, OMCI Frame Contents
         """
         (pon_index, onu_id) = struct.unpack_from('!II', packet)
diff --git a/voltha/adapters/adtran_olt/nni_port.py b/voltha/adapters/adtran_olt/nni_port.py
index 55160f3..11a676c 100644
--- a/voltha/adapters/adtran_olt/nni_port.py
+++ b/voltha/adapters/adtran_olt/nni_port.py
@@ -17,7 +17,9 @@
 import random
 
 import structlog
-from twisted.internet.defer import inlineCallbacks, returnValue
+from enum import Enum
+from twisted.internet import reactor
+from twisted.internet.defer import inlineCallbacks, returnValue, succeed
 
 from voltha.core.logical_device_agent import mac_str_to_tuple
 from voltha.protos.common_pb2 import OperStatus, AdminState
@@ -25,8 +27,6 @@
 from voltha.protos.logical_device_pb2 import LogicalPort
 from voltha.protos.openflow_13_pb2 import OFPPF_100GB_FD, OFPPF_FIBER, OFPPS_LIVE, ofp_port
 
-log = structlog.get_logger()
-
 
 class NniPort(object):
     """
@@ -36,105 +36,308 @@
           so we do not duplicate fields/properties/methods
     """
 
+    class State(Enum):
+        INITIAL = 0  # Created and initialization in progress
+        RUNNING = 1  # PON port contacted, ONU discovery active
+        STOPPED = 2  # Disabled
+        DELETING = 3  # Cleanup
+
     def __init__(self, parent, **kwargs):
         # TODO: Weed out those properties supported by common 'Port' object
         assert parent
         assert 'port_no' in kwargs
 
-        self.port = None
-        self.logical_port = None
-        self.parent = parent
-        self.port_no = kwargs.get('port_no')
+        self.log = structlog.get_logger(port_no=kwargs.get('port_no'))
 
-        self.startup = None
-        log.info('Creating NNI Port {}'.format(self.port_no))
+        self._port_no = kwargs.get('port_no')
+        self._name = kwargs.get('name', 'nni-{}'.format(self._port_no))
+        self._port = None
+        self._logical_port = None
+        self._parent = parent
+
+        self._deferred = None
+        self._state = NniPort.State.INITIAL
+        self.log.info('Creating NNI Port')
+
+        # Local cache of NNI configuration
+
+        self._enabled = None
 
         # And optional parameters
 
-        self.admin_state = kwargs.pop('admin_state', AdminState.UNKNOWN)
-        self.oper_status = kwargs.pop('oper_status', OperStatus.UNKNOWN)
-        self.label = kwargs.pop('label', 'NNI port {}'.format(self.port_no))
-        self.name = kwargs.pop('name', 'nni-{}'.format(self.port_no))
-        self.mac_address = kwargs.pop('mac_address',
-                                      '08:00:{}{}:{}{}:{}{}:00'.format(random.randint(0, 9),
-                                                                       random.randint(0, 9),
-                                                                       random.randint(0, 9),
-                                                                       random.randint(0, 9),
-                                                                       random.randint(0, 9),
-                                                                       random.randint(0, 9)))
+        self._admin_state = kwargs.pop('admin_state', AdminState.UNKNOWN)
+        self._oper_status = kwargs.pop('oper_status', OperStatus.UNKNOWN)
+        self._label = kwargs.pop('label', 'NNI port {}'.format(self._port_no))
+        self._mac_address = kwargs.pop('mac_address',
+                                       '08:00:{}{}:{}{}:{}{}:00'.format(random.randint(0, 9),
+                                                                        random.randint(0, 9),
+                                                                        random.randint(0, 9),
+                                                                        random.randint(0, 9),
+                                                                        random.randint(0, 9),
+                                                                        random.randint(0, 9)))
 
         # TODO: May need to refine capabilities into current, advertised, and peer
 
-        self.ofp_capabilities = kwargs.pop('ofp_capabilities', OFPPF_100GB_FD | OFPPF_FIBER)
-        self.ofp_state = kwargs.pop('ofp_state', OFPPS_LIVE)
-        self.current_speed = kwargs.pop('current_speed', OFPPF_100GB_FD)
-        self.max_speed = kwargs.pop('max_speed', OFPPF_100GB_FD)
-        self.device_port_no = kwargs.pop('device_port_no', self.port_no)
+        self._ofp_capabilities = kwargs.pop('ofp_capabilities', OFPPF_100GB_FD | OFPPF_FIBER)
+        self._ofp_state = kwargs.pop('ofp_state', OFPPS_LIVE)
+        self._current_speed = kwargs.pop('current_speed', OFPPF_100GB_FD)
+        self._max_speed = kwargs.pop('max_speed', OFPPF_100GB_FD)
+        self._device_port_no = kwargs.pop('device_port_no', self._port_no)
+
+    def __del__(self):
+        self.stop()
 
     def __str__(self):
-        return "NniPort-{}: Admin: {}, Oper: {}, parent: {}".format(self.port_no,
-                                                                    self.admin_state,
-                                                                    self.oper_status,
-                                                                    self.parent)
+        return "NniPort-{}: Admin: {}, Oper: {}, parent: {}".format(self._port_no,
+                                                                    self._admin_state,
+                                                                    self._oper_status,
+                                                                    self._parent)
+
+    @property
+    def port_number(self):
+        return self._port_no
+
+    @property
+    def olt(self):
+        return self._parent
+
+    @property
+    def state(self):
+        return self._state
+
+    @property
+    def adapter_agent(self):
+        return self.olt.adapter_agent
+
+    def _cancel_deferred(self):
+        d, self._deferred = self._deferred, None
+        if d is not None:
+            d.cancel()
+
+    def _update_adapter_agent(self):
+        # TODO: Currently the adapter_agent does not allow 'update' of port status
+        # self.adapter_agent.update_port(self.olt.device_id, self.get_port())
+        pass
 
     def get_port(self):
         """
         Get the VOLTHA PORT object for this port
         :return: VOLTHA Port object
         """
-        if self.port is None:
-            self.port = Port(port_no=self.port_no,
-                             label=self.label,
-                             type=Port.ETHERNET_NNI,
-                             admin_state=self.admin_state,
-                             oper_status=self.oper_status)
-        return self.port
+        if self._port is None:
+            self._port = Port(port_no=self._port_no,
+                              label=self._label,
+                              type=Port.ETHERNET_NNI,
+                              admin_state=self._admin_state,
+                              oper_status=self._oper_status)
+        return self._port
 
     def get_logical_port(self):
         """
         Get the VOLTHA logical port for this port
         :return: VOLTHA logical port or None if not supported
         """
-        if self.logical_port is None:
-            openflow_port = ofp_port(port_no=self.port_no,
-                                     hw_addr=mac_str_to_tuple(self.mac_address),
-                                     name=self.name,
+        if self._logical_port is None:
+            openflow_port = ofp_port(port_no=self._port_no,
+                                     hw_addr=mac_str_to_tuple(self._mac_address),
+                                     name=self._name,
                                      config=0,
-                                     state=self.ofp_state,
-                                     curr=self.ofp_capabilities,
-                                     advertised=self.ofp_capabilities,
-                                     peer=self.ofp_capabilities,
-                                     curr_speed=self.current_speed,
-                                     max_speed=self.max_speed)
+                                     state=self._ofp_state,
+                                     curr=self._ofp_capabilities,
+                                     advertised=self._ofp_capabilities,
+                                     peer=self._ofp_capabilities,
+                                     curr_speed=self._current_speed,
+                                     max_speed=self._max_speed)
 
-            self.logical_port = LogicalPort(id='nni{}'.format(self.port_no),
-                                            ofp_port=openflow_port,
-                                            device_id=self.parent.device_id,
-                                            device_port_no=self.device_port_no,
-                                            root_port=True)
-        return self.logical_port
+            self._logical_port = LogicalPort(id='nni{}'.format(self._port_no),
+                                             ofp_port=openflow_port,
+                                             device_id=self._parent.device_id,
+                                             device_port_no=self._device_port_no,
+                                             root_port=True)
+        return self._logical_port
 
-    @inlineCallbacks
     def start(self):
         """
         Start/enable this NNI
         
         :return: (deferred)
         """
-        log.info('Starting NNI port {}'.format(self.port_no))
+        if self._state == NniPort.State.RUNNING:
+            return succeed('Running')
+
+        self.log.info('Starting NNI port')
 
         # TODO: Start up any watchdog/polling tasks here
 
-        yield returnValue('NNI Port start is a NOP at this time')
+        self._admin_state = AdminState.ENABLED
+        self._oper_status = OperStatus.ACTIVE
+        self._update_adapter_agent()
+
+        # Do the rest of the startup in an async method
+        self._deferred = reactor.callLater(0, self._finish_startup)
+        return self._deferred
+
+    @inlineCallbacks
+    def _finish_startup(self):
+        if self._state != NniPort.State.INITIAL:
+            returnValue('Done')
+
+        returnValue('TODO: Implement startup of each NNI port')
+
+        if self._enabled:
+            self._admin_state = AdminState.ENABLED
+            self._oper_status = OperStatus.ACTIVE  # TODO: is this correct, how do we tell GRPC
+            self._state = NniPort.State.RUNNING
+
+            # TODO: Start status polling of NNI interfaces
+            self._deferred = None  # = reactor.callLater(3, self.do_stuff)
+
+            self._update_adapter_agent()
+            returnValue('Enabled')
+
+        else:
+            # Startup failed. Could be due to object creation with an invalid initial admin_status
+            #                 state.  May want to schedule a start to occur again if this happens
+            self._admin_state = AdminState.DISABLED
+            self._oper_status = OperStatus.UNKNOWN
+            self._state = NniPort.State.STOPPED
+
+            self._update_adapter_agent()
+            returnValue('Disabled')
 
     def stop(self):
-        log.info('Stopping NNI port {}'.format(self.port_no))
-        d, self.startup = self.startup, None
-        if d is not None:
-            d.cancel()
+        if self._state == NniPort.State.STOPPED:
+            return succeed('Stopped')
 
-        self.admin_state = AdminState.DISABLED
-        self.oper_status = OperStatus.UNKNOWN
+        self.log.info('Stopping NNI port')
 
-        yield returnValue('NNI Port stop may need more work')
-        # TODO: How do we reflect this into VOLTHA
+        self._cancel_deferred()
+        # NOTE: Leave all NNI ports active (may have inband management)
+        # TODO: Revisit leaving NNI Ports active on disable
+
+        # Flush config cache
+        self._enabled = None
+
+        self._admin_state = AdminState.DISABLED
+        self._oper_status = OperStatus.UNKNOWN
+        self._update_adapter_agent()
+
+        self._state = NniPort.State.STOPPED
+        return self._deferred
+
+    def delete(self):
+        """
+        Parent device is being deleted. Do not change any config but
+        stop all polling
+        """
+        self.log.info('Deleteing {}'.format(self._label))
+        self._state = NniPort.State.DELETING
+        self._cancel_deferred()
+
+    @inlineCallbacks
+    def reset(self):
+        """
+        Set the NNI Port to a known good state on initial port startup.  Actual
+        NNI 'Start' is done elsewhere
+        """
+        if self._state != NniPort.State.INITIAL:
+            self.log.error('Reset ignored, only valid during initial startup', state=self._state)
+            returnValue('Ignored')
+
+        self.log.info('Reset {}'.format(self._label))
+
+        # Always enable our NNI ports
+
+        try:
+            results = yield self.set_config('enabled', True)
+            self._admin_state = AdminState.ENABLED
+            self._enabled = True
+            returnValue(results)
+
+        except Exception as e:
+            self.log.exception('Reset of NNI to initial state failed', e=e)
+            self._admin_state = AdminState.UNKNOWN
+            raise
+
+    @inlineCallbacks
+    def set_config(self, leaf, value):
+        data = {'leaf': leaf, 'value': value}
+        config = '<interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">' + \
+                 ' <interface>' + \
+                 '  <name>{}</name>'.format(self._name) + \
+                 '  <{d[leaf]}>{d[value]}</{d[leaf]}>'.format(d=data) + \
+                 ' </interface>' + \
+                 '</interfaces>'
+        try:
+            results = yield self._parent.netconf_client.edit_config(config)
+            returnValue(results)
+
+        except Exception as e:
+            self.log.exception('Set Config', leaf=leaf, value=value, e=e)
+            raise
+
+
+class MockNniPort(NniPort):
+    """
+    A class similar to the 'Port' class in the VOLTHA but for a non-existent (virtual OLT)
+
+    TODO: Merge this with the Port class or cleanup where possible
+          so we do not duplicate fields/properties/methods
+    """
+
+    def __init__(self, parent, **kwargs):
+        super(MockNniPort, self).__init__(parent, **kwargs)
+
+    def __str__(self):
+        return "NniPort-mock-{}: Admin: {}, Oper: {}, parent: {}".format(self._port_no,
+                                                                         self._admin_state,
+                                                                         self._oper_status,
+                                                                         self._parent)
+
+    @staticmethod
+    def get_nni_port_state_results():
+        from ncclient.operations.retrieve import GetReply
+        raw = """
+        <?xml version="1.0" encoding="UTF-8"?>
+        <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
+        xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"
+        message-id="urn:uuid:59e71979-01bb-462f-b17a-b3a45e1889ac">
+          <data>
+            <interfaces-state xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
+              <interface><name>hundred-gigabit-ethernet 0/1</name></interface>
+              <interface><name>hundred-gigabit-ethernet 0/2</name></interface>
+              <interface><name>hundred-gigabit-ethernet 0/3</name></interface>
+              <interface><name>hundred-gigabit-ethernet 0/4</name></interface>
+            </interfaces-state>
+          </data>
+        </rpc-reply>
+        """
+        return GetReply(raw)
+
+    @inlineCallbacks
+    def reset(self):
+        """
+        Set the NNI Port to a known good state on initial port startup.  Actual
+        NNI 'Start' is done elsewhere
+        """
+        if self._state != NniPort.State.INITIAL:
+            self.log.error('Reset ignored, only valid during initial startup', state=self._state)
+            returnValue('Ignored')
+
+        self.log.info('Reset {}'.format(self._label))
+
+        # Always enable our NNI ports
+
+        self._enabled = True
+        self._admin_state = AdminState.ENABLED
+        returnValue('Enabled')
+
+    @inlineCallbacks
+    def set_config(self, leaf, value):
+
+        if leaf == 'enabled':
+            self._enabled = value
+        else:
+            raise NotImplemented("Leaf '{}' is not supported".format(leaf))
+
+        returnValue('Success')
diff --git a/voltha/adapters/adtran_olt/onu.py b/voltha/adapters/adtran_olt/onu.py
index 16ebf18..6cba0c8 100644
--- a/voltha/adapters/adtran_olt/onu.py
+++ b/voltha/adapters/adtran_olt/onu.py
@@ -24,6 +24,7 @@
 
 _VSSN_TO_VENDOR = {
     'adtn': 'adtran_onu',
+    'adtr': 'adtran_onu',
     'bcm?': 'broadcom_onu',  # TODO: Get actual VSSN for this vendor
     'dp??': 'dpoe_onu',  # TODO: Get actual VSSN for this vendor
     'pmc?': 'pmcs_onu',  # TODO: Get actual VSSN for this vendor
@@ -75,6 +76,7 @@
                            'enable': enabled})
         uri = AdtranOltHandler.GPON_PON_ONU_CONFIG_URI.format(pon_id)
         name = 'onu-create-{}-{}-{}: {}'.format(pon_id, self.onu_id, self.serial_number, enabled)
+
         return self.parent.parent.rest_client.request('POST', uri, data=data, name=name)
 
     def set_config(self, leaf, value):
diff --git a/voltha/adapters/adtran_olt/pon_port.py b/voltha/adapters/adtran_olt/pon_port.py
index 1eacbaf..896b8aa 100644
--- a/voltha/adapters/adtran_olt/pon_port.py
+++ b/voltha/adapters/adtran_olt/pon_port.py
@@ -19,8 +19,9 @@
 
 import os
 import structlog
+from enum import Enum
 from twisted.internet import reactor
-from twisted.internet.defer import inlineCallbacks, returnValue
+from twisted.internet.defer import inlineCallbacks, returnValue, succeed
 
 from adtran_olt_handler import AdtranOltHandler
 from codec.olt_config import OltConfig
@@ -29,8 +30,6 @@
 from voltha.protos.device_pb2 import Device
 from voltha.protos.device_pb2 import Port
 
-log = structlog.get_logger()
-
 
 class PonPort(object):
     """
@@ -42,46 +41,61 @@
     MAX_ONUS_SUPPORTED = 256
     DEFAULT_ENABLED = False
 
+    class State(Enum):
+        INITIAL = 0  # Created and initialization in progress
+        RUNNING = 1  # PON port contacted, ONU discovery active
+        STOPPED = 2  # Disabled
+        DELETING = 3  # Cleanup
+
     def __init__(self, pon_index, port_no, parent, admin_state=AdminState.UNKNOWN, label=None):
-        # TODO: Weed out those properties supported by common 'Port' object
+        # TODO: Weed out those properties supported by common 'Port' object (future)
         assert admin_state != AdminState.UNKNOWN
-        self.parent = parent
-        self._pon_index = pon_index
+
+        self.log = structlog.get_logger(pon_id=pon_index)
+
+        self._parent = parent
+        self._pon_id = pon_index
         self._port_no = port_no
-        self.label = label or 'PON-{}'.format(pon_index)
-        self.admin_state = admin_state
-        self.oper_status = OperStatus.ACTIVE  # TODO: Need to discover
-        self.startup = None
-        self.onu_discovery = None
-        self.port = None
-        self.no_onu_discover_tick = 5.0  # TODO: Decrease to 1 or 2 later
-        self.discovery_tick = 20.0
-        self.discovered_onus = []  # List of serial numbers
-        self.onus = {}  # serial_number -> ONU  (allowed list)
-        self.next_onu_id = Onu.MIN_ONU_ID
+        self._label = label or 'PON-{}'.format(pon_index)
+        self._port = None
+        self._no_onu_discover_tick = 5.0  # TODO: Decrease to 1 or 2 later
+        self._discovery_tick = 20.0
+        self._discovered_onus = []  # List of serial numbers
+        self._onus = {}  # serial_number -> ONU  (allowed list)
+        self._next_onu_id = Onu.MIN_ONU_ID
+
+        self._admin_state = admin_state
+        self._oper_status = OperStatus.UNKNOWN
+        self._deferred = None
+        self._state = PonPort.State.INITIAL
+
+        # Local cache of PON configuration
+
+        self._enabled = None
+        self._downstream_fec_enable = None
+        self._upstream_fec_enable = None
 
     def __del__(self):
-        # self.stop()
-        pass
+        self.stop()
 
     def __str__(self):
-        return "PonPort-{}: Admin: {}, Oper: {}, parent: {}".format(self.label,
-                                                                    self.admin_state,
-                                                                    self.oper_status,
-                                                                    self.parent)
+        return "PonPort-{}: Admin: {}, Oper: {}, parent: {}".format(self._label,
+                                                                    self._admin_state,
+                                                                    self._oper_status,
+                                                                    self._parent)
 
     def get_port(self):
         """
         Get the VOLTHA PORT object for this port
         :return: VOLTHA Port object
         """
-        if self.port is None:
-            self.port = Port(port_no=self.port_number,
-                             label=self.label,
-                             type=Port.PON_OLT,
-                             admin_state=self.admin_state,
-                             oper_status=self.oper_status)
-        return self.port
+        if self._port is None:
+            self._port = Port(port_no=self._port_no,
+                              label=self._label,
+                              type=Port.PON_OLT,
+                              admin_state=self._admin_state,
+                              oper_status=self._oper_status)
+        return self._port
 
     @property
     def port_number(self):
@@ -89,105 +103,183 @@
 
     @property
     def pon_id(self):
-        return self._pon_index
+        return self._pon_id
+
+    @property
+    def olt(self):
+        return self._parent
+
+    @property
+    def state(self):
+        return self._state
+
+    @property
+    def adapter_agent(self):
+        return self.olt.adapter_agent
 
     def get_logical_port(self):
         """
-        Get the VOLTHA logical port for this port
+        Get the VOLTHA logical port for this port. For PON ports, a logical port
+        is not currently created, so always return None
+
         :return: VOLTHA logical port or None if not supported
         """
         return None
 
-    @inlineCallbacks
+    def _cancel_deferred(self):
+        d, self._deferred = self._deferred, None
+        if d is not None:
+            d.cancel()
+
+    def _update_adapter_agent(self):
+        # TODO: Currently the adapter_agent does not allow 'update' of port status
+        # self.adapter_agent.update_port(self.olt.device_id, self.get_port())
+        pass
+
     def start(self):
         """
         Start/enable this PON and start ONU discover
         :return: (deferred)
         """
-        log.info('Starting {}'.format(self.label))
+        if self._state == PonPort.State.RUNNING:
+            return succeed('Running')
 
+        self.log.info('Starting {}'.format(self._label))
+
+        self._cancel_deferred()
+        self._state = PonPort.State.INITIAL
+
+        # Do the rest of the startup in an async method
+        self._deferred = reactor.callLater(0, self._finish_startup)
+        return self._deferred
+
+    @inlineCallbacks
+    def _finish_startup(self):
         """
-        Here is where I will start to bring up a PON port and discover an ONT
-
-        Note: For some reason, you cannot chain the FEC enables with the pon enable below?
+        Do all startup offline since REST may fail
         """
-        try:
-            self.startup = self.set_pon_config("enabled", True)
-            yield self.startup
+        if self._state != PonPort.State.INITIAL:
+            returnValue('Done')
 
-        except Exception, e:
-            log.exception("enabled failed: {}".format(str(e)))
-            raise
+        if self._enabled is None or self._downstream_fec_enable is None or self._upstream_fec_enable is None:
+            try:
+                self._deferred = self.get_pon_config()
+                results = yield self._deferred
 
-        try:
-            self.startup = self.set_pon_config("downstream-fec-enable", True)
-            yield self.startup
+            except Exception as e:
+                self.log.exception('Initial GET of config failed: {}'.format(e.message))
+                self._deferred = reactor.callLater(3, self._finish_startup)
+                returnValue(self._deferred)
 
-        except Exception, e:
-            log.exception("downstream FEC enable failed: {}".format(str(e)))
-            raise
+            # Load cache
 
-        try:
-            self.startup = self.set_pon_config("upstream-fec-enable", True)
-            results = yield self.startup
+            self._enabled = results.get('enabled', False)
+            self._downstream_fec_enable = results.get('downstream-fec-enable', False)
+            self._upstream_fec_enable = results.get('upstream-fec-enable', False)
 
-        except Exception, e:
-            log.exception("upstream FEC enable failed: {}".format(str(e)))
-            raise
+        if not self._enabled:
+            try:
+                self._deferred = self.set_pon_config("enabled", True)
+                results = yield self._deferred
+                self._enabled = True
 
-        log.debug('ONU Startup complete: results: {}'.
-                  format(pprint.PrettyPrinter().pformat(results)))
+            except Exception as e:
+                self.log.exception('enabled failed: {}'.format(str(e)))
+                self._deferred = reactor.callLater(3, self._finish_startup)
+                returnValue(self._deferred)
 
-        if isinstance(results, dict) and results.get('enabled', False):
-            self.admin_state = AdminState.ENABLED
-            self.oper_status = OperStatus.ACTIVE  # TODO: is this correct, how do we tell GRPC
+        if not self._downstream_fec_enable:
+            try:
+                self._deferred = self.set_pon_config("downstream-fec-enable", True)
+                results = yield self._deferred
+                self._downstream_fec_enable = True
 
-            # Begin to ONU discovery.  Once a second if no ONUs found and once every 20
-            #       seconds after one or more ONUs found on the PON
-            self.onu_discovery = reactor.callLater(3, self.discover_onus)
-            returnValue(self.onu_discovery)
+            except Exception as e:
+                self.log.exception('downstream FEC enable failed: {}'.format(str(e)))
+                self._deferred = reactor.callLater(3, self._finish_startup)
+                returnValue(self._deferred)
+
+        if not self._upstream_fec_enable:
+            try:
+                self._deferred = self.set_pon_config("upstream-fec-enable", True)
+                results = yield self._deferred
+                self._upstream_fec_enable = True
+
+            except Exception as e:
+                self.log.exception('upstream FEC enable failed: {}'.format(str(e)))
+                self._deferred = reactor.callLater(3, self._finish_startup)
+                returnValue(self._deferred)
+
+            self.log.debug('ONU Startup complete: results: {}'.format(pprint.PrettyPrinter().pformat(results)))
+
+        if self._enabled:
+            self._admin_state = AdminState.ENABLED
+            self._oper_status = OperStatus.ACTIVE  # TODO: is this correct, how do we tell GRPC
+            self._state = PonPort.State.RUNNING
+
+            # Begin to ONU discovery. Once a second if no ONUs found and once every 20
+            #                         seconds after one or more ONUs found on the PON
+            self._deferred = reactor.callLater(3, self.discover_onus)
+
+            self._update_adapter_agent()
+            returnValue('Enabled')
 
         else:
             # Startup failed. Could be due to object creation with an invalid initial admin_status
             #                 state.  May want to schedule a start to occur again if this happens
-            self.admin_state = AdminState.DISABLED
-            self.oper_status = OperStatus.UNKNOWN
-            raise NotImplementedError('TODO: Support of PON startup failure not yet supported')
+            self._admin_state = AdminState.DISABLED
+            self._oper_status = OperStatus.UNKNOWN
+            self._state = PonPort.State.STOPPED
 
-    @inlineCallbacks
+            self._update_adapter_agent()
+            returnValue('Disabled')
+
     def stop(self):
-        log.info('Stopping {}'.format(self.label))
-        d, self.startup = self.startup, None
-        if d is not None:
-            d.cancel()
+        if self._state == PonPort.State.STOPPED:
+            return succeed('Stopped')
 
-        d, self.onu_discovery = self.onu_discovery, None
-        if d is not None:
-            d.cancel()
+        self.log.info('Stopping {}'.format(self._label))
 
-        self.reset(False)
-        self.admin_state = AdminState.DISABLED
-        self.oper_status = OperStatus.UNKNOWN
-        # TODO: How do we reflect this into VOLTHA?
+        self._cancel_deferred()
+        self._deferred = self.set_pon_config("enabled", False)
+
+        # Flush config cache
+        self._enabled = None
+        self._downstream_fec_enable = None
+        self._upstream_fec_enable = None
+
+        self._admin_state = AdminState.DISABLED
+        self._oper_status = OperStatus.UNKNOWN
+        self._update_adapter_agent()
+
+        self._state = PonPort.State.STOPPED
+        return self._deferred
 
     @inlineCallbacks
     def reset(self):
-        log.info('Reset {}'.format(self.label))
+        """
+        Set the PON Port to a known good state on initial port startup.  Actual
+        PON 'Start' is done elsewhere
+        """
+        if self._state != PonPort.State.INITIAL:
+            self.log.error('Reset ignored, only valid during initial startup', state=self._state)
+            returnValue('Ignored')
 
-        if self.admin_state != self.parent.initial_port_state:
+        self.log.info('Reset {}'.format(self._label))
+
+        if self._admin_state != self._parent.initial_port_state:
             try:
-                enable = self.parent.initial_port_state == AdminState.ENABLED
+                enable = self._parent.initial_port_state == AdminState.ENABLED
                 yield self.set_pon_config("enabled", enable)
 
                 # TODO: Move to 'set_pon_config' method and also make sure GRPC/Port is ok
-                self.admin_state = AdminState.ENABLED if enable else AdminState.DISABLE
+                self._admin_state = AdminState.ENABLED if enable else AdminState.DISABLE
 
             except Exception as e:
-                log.exception('Reset of PON {} to initial state failed'.
-                              format(self.pon_id), e=e)
+                self.log.exception('Reset of PON to initial state failed', e=e)
                 raise
 
-        if self.admin_state == AdminState.ENABLED and self.parent.initial_onu_state == AdminState.DISABLED:
+        if self._admin_state == AdminState.ENABLED and self._parent.initial_onu_state == AdminState.DISABLED:
             try:
                 # Walk the provisioned ONU list and disable any exiting ONUs
                 results = yield self.get_onu_config()
@@ -199,57 +291,64 @@
                             yield self.delete_onu(onu_id)
 
                         except Exception as e:
-                            log.exception('Delete of ONU {} on PON {} failed'.
-                                          format(onu_id, self.pon_id), e=e)
+                            self.log.exception('Delete of ONU {} on PON failed'.format(onu_id), e=e)
                             pass  # Non-fatal
 
             except Exception as e:
-                log.exception('Failed to get current ONU config for PON {}'.
-                              format(self.pon_id), e=e)
+                self.log.exception('Failed to get current ONU config', e=e)
                 raise
 
+    def delete(self):
+        """
+        Parent device is being deleted. Do not change any config but
+        stop all polling
+        """
+        self.log.info('Deleteing {}'.format(self._label))
+        self._state = PonPort.State.DELETING
+        self._cancel_deferred()
+
     def get_pon_config(self):
-        uri = AdtranOltHandler.GPON_PON_CONFIG_URI.format(self.pon_id)
-        name = 'pon-get-config-{}'.format(self.pon_id)
-        return self.parent.rest_client.request('GET', uri, name=name)
+        uri = AdtranOltHandler.GPON_PON_CONFIG_URI.format(self._pon_id)
+        name = 'pon-get-config-{}'.format(self._pon_id)
+        return self._parent.rest_client.request('GET', uri, name=name)
 
     def get_onu_config(self, onu_id=None):
-        uri = AdtranOltHandler.GPON_PON_ONU_CONFIG_URI.format(self.pon_id)
+        uri = AdtranOltHandler.GPON_PON_ONU_CONFIG_URI.format(self._pon_id)
         if onu_id is not None:
             uri += '={}'.format(onu_id)
-        name = 'pon-get-onu_config-{}-{}'.format(self.pon_id, onu_id)
-        return self.parent.rest_client.request('GET', uri, name=name)
+        name = 'pon-get-onu_config-{}-{}'.format(self._pon_id, onu_id)
+        return self._parent.rest_client.request('GET', uri, name=name)
 
     def set_pon_config(self, leaf, value):
         data = json.dumps({leaf: value})
-        uri = AdtranOltHandler.GPON_PON_CONFIG_URI.format(self.pon_id)
-        name = 'pon-set-config-{}-{}-{}'.format(self.pon_id, leaf, str(value))
-        return self.parent.rest_client.request('PATCH', uri, data=data, name=name)
+        uri = AdtranOltHandler.GPON_PON_CONFIG_URI.format(self._pon_id)
+        name = 'pon-set-config-{}-{}-{}'.format(self._pon_id, leaf, str(value))
+        return self._parent.rest_client.request('PATCH', uri, data=data, name=name)
 
     def discover_onus(self):
-        log.debug("Initiating discover of ONU/ONTs on PON {}".format(self.pon_id))
+        self.log.debug('Initiating discover of ONU/ONTs')
 
-        if self.admin_state == AdminState.ENABLED:
-            data = json.dumps({'pon-id': self.pon_id})
+        if self._admin_state == AdminState.ENABLED:
+            data = json.dumps({'pon-id': self._pon_id})
             uri = AdtranOltHandler.GPON_PON_DISCOVER_ONU
-            name = 'pon-discover-onu-{}'.format(self.pon_id)
-            self.startup = self.parent.rest_client.request('POST', uri, data, name=name)
+            name = 'pon-discover-onu-{}'.format(self._pon_id)
 
-            self.startup.addBoth(self.onu_discovery_init_complete)
+            self._deferred = self._parent.rest_client.request('POST', uri, data, name=name)
+            self._deferred.addBoth(self.onu_discovery_init_complete)
 
     def onu_discovery_init_complete(self, _):
         """
         This method is called after the REST POST to request ONU discovery is
         completed.  The results (body) of the post is always empty / 204 NO CONTENT
         """
-        log.debug('PON {} ONU Discovery requested'.format(self.pon_id))
+        self.log.debug('ONU Discovery requested')
 
         # Reschedule
 
-        delay = self.no_onu_discover_tick if len(self.onus) == 0 else self.discovery_tick
+        delay = self._no_onu_discover_tick if len(self._onus) == 0 else self._discovery_tick
         delay += random.uniform(-delay / 10, delay / 10)
 
-        self.onu_discovery = reactor.callLater(delay, self.discover_onus)
+        self._deferred = reactor.callLater(delay, self.discover_onus)
 
     def process_status_poll(self, status):
         """
@@ -257,10 +356,9 @@
         
         :param status: (OltState.Pon object) results from RESTCONF GET
         """
-        log.debug('process_status_poll: PON {}: {}{}'.format(self.pon_id,
-                                                             os.linesep,
-                                                             status))
-        if self.admin_state != AdminState.ENABLED:
+        self.log.debug('process_status_poll:  {}{}'.format(os.linesep, status))
+
+        if self._admin_state != AdminState.ENABLED:
             return
 
         # Process the ONU list in for this PON, may have previously provisioned ones there
@@ -269,8 +367,9 @@
         new = self._process_status_onu_list(status.onus)
 
         for onu_id in new:
+            import base64
             # self.add_new_onu(serial_number, status)
-            log.info('Found ONU {} in status list'.format(onu_id))
+            self.log.info('Found ONU {}/{} in status list'.format(onu_id, base64.decodestring(onu_id)))
             raise NotImplementedError('TODO: Adding ONUs from existing ONU (status list) not supported')
 
         # Get new/missing from the discovered ONU leaf
@@ -279,7 +378,7 @@
 
         # TODO: Do something useful
         if len(missing):
-            log.info('Missing ONUs are: {}'.format(missing))
+            self.log.info('Missing ONUs are: {}'.format(missing))
 
         for serial_number in new:
             reactor.callLater(0, self.add_onu, serial_number, status)
@@ -296,9 +395,9 @@
 
         :param onus: (dict) Set of known ONUs
         """
-        log.debug('Processing ONU list: {}'.format(onus))
+        self.log.debug('Processing ONU list: {}'.format(onus))
 
-        my_onu_ids = frozenset([o.onu_id for o in self.onus.itervalues()])
+        my_onu_ids = frozenset([o.onu_id for o in self._onus.itervalues()])
         discovered_onus = frozenset(onus.keys())
 
         new_onus_ids = discovered_onus - my_onu_ids
@@ -315,9 +414,9 @@
         
         :param discovered_onus: (frozenset) Set of ONUs currently discovered
         """
-        log.debug('Processing discovered ONU list: {}'.format(discovered_onus))
+        self.log.debug('Processing discovered ONU list: {}'.format(discovered_onus))
 
-        my_onus = frozenset(self.onus.keys())
+        my_onus = frozenset(self._onus.keys())
 
         new_onus = discovered_onus - my_onus
         missing_onus = my_onus - discovered_onus
@@ -326,32 +425,30 @@
 
     @inlineCallbacks
     def add_onu(self, serial_number, status):
-        log.info('Add ONU: {}'.format(serial_number))
+        self.log.info('Add ONU: {}'.format(serial_number))
 
         if serial_number not in status.onus:
             # Newly found and not enabled ONU, enable it now if not at max
 
-            if len(self.onus) < self.MAX_ONUS_SUPPORTED:
+            if len(self._onus) < self.MAX_ONUS_SUPPORTED:
                 # TODO: For now, always allow any ONU
 
-                if serial_number not in self.onus:
+                if serial_number not in self._onus:
                     onu = Onu(serial_number, self)
 
                     try:
                         yield onu.create(True)
 
                         self.on_new_onu_discovered(onu)
-                        self.onus[serial_number] = onu
+                        self._onus[serial_number] = onu
 
                     except Exception as e:
-                        log.exception('Exception during add_onu, pon: {}, onu: {}'.
-                                      format(self.pon_id, onu.onu_id), e=e)
+                        self.log.exception('Exception during add_onu, onu: {}'.format(onu.onu_id), e=e)
                 else:
-                    log.info('TODO: Code this')
+                    self.log.info('TODO: Code this')
 
             else:
-                log.warning('Maximum number of ONUs already provisioned on PON {}'.
-                            format(self.pon_id))
+                self.log.warning('Maximum number of ONUs already provisioned')
         else:
             # ONU has been enabled
             pass
@@ -362,15 +459,15 @@
         :param onu: 
         :return: 
         """
-        olt = self.parent
-        adapter = olt.adapter_agent
+        olt = self.olt
+        adapter = self.adapter_agent
 
         proxy = Device.ProxyAddress(device_id=olt.device_id,
-                                    channel_id=self.port_number,
+                                    channel_id=self._port_no,
                                     onu_id=onu.onu_id)
 
         adapter.child_device_detected(parent_device_id=olt.device_id,
-                                      parent_port_no=self.port_number,
+                                      parent_port_no=self._port_no,
                                       child_device_type=onu.vendor_device,
                                       proxy_address=proxy)
 
@@ -388,10 +485,10 @@
                 return onu_id
 
     def delete_onu(self, onu_id):
-        uri = AdtranOltHandler.GPON_PON_ONU_CONFIG_URI.format(self.pon_id)
+        uri = AdtranOltHandler.GPON_PON_ONU_CONFIG_URI.format(self._pon_id)
         uri += '={}'.format(onu_id)
-        name = 'pon-delete-onu-{}-{}'.format(self.pon_id, onu_id)
+        name = 'pon-delete-onu-{}-{}'.format(self._pon_id, onu_id)
 
         # TODO: Need removal from VOLTHA child_device method
 
-        return self.parent.rest_client.request('DELETE', uri, name=name)
+        return self._parent.rest_client.request('DELETE', uri, name=name)
