diff --git a/voltha/adapters/dpoe_onu/eoam_config.py b/voltha/adapters/dpoe_onu/eoam_config.py
new file mode 100644
index 0000000..b69770b
--- /dev/null
+++ b/voltha/adapters/dpoe_onu/eoam_config.py
@@ -0,0 +1,358 @@
+#!/usr/bin/env python
+#--------------------------------------------------------------------------#
+# Copyright (C) 2015 - 2016 by Tibit Communications, Inc.                  #
+# All rights reserved.                                                     #
+#                                                                          #
+#    _______ ____  _ ______                                                #
+#   /_  __(_) __ )(_)_  __/                                                #
+#    / / / / __  / / / /                                                   #
+#   / / / / /_/ / / / /                                                    #
+#  /_/ /_/_____/_/ /_/                                                     #
+#                                                                          #
+#--------------------------------------------------------------------------#
+""" EOAM protocol implementation in scapy """
+
+TIBIT_VERSION_NUMBER = '1.1.2'
+
+import time
+import logging
+import argparse
+import sys
+import inspect
+
+logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
+from scapy.all import Dot1Q
+from scapy.all import sniff
+from scapy.all import IP, UDP
+from scapy.packet import Packet, bind_layers
+from scapy.fields import StrField
+from scapy.layers.l2 import Ether
+from scapy.main import interact
+from scapy.sendrecv import sendp
+from scapy.sendrecv import srp1
+from scapy.config import conf
+conf.verb = None
+
+import fcntl, socket, struct # for get hw address
+
+# TODO should remove import *
+from EOAM_TLV import *
+
+EOAM_MULTICAST_ADDRESS = '01:80:c2:00:00:02'
+IGMP_MULTICAST_ADDRESS = '01:00:5e:00:00:01'   # for test
+
+class EOAM():
+    """ EOAM frame layer """
+    def __init__(self, ctag=None, dryrun=False, stag=None,
+                 verbose=False, etype='8809',
+                 dst=EOAM_MULTICAST_ADDRESS,
+                 hexdump=False, interface='eth0',
+                 sleep=1.0):
+        self.verbose = verbose
+        self.dst = dst
+        self.dryrun = dryrun
+        self.hexdump = hexdump
+        self.interface = interface
+        self.etype = int(etype, 16)
+        self.stag = stag
+        self.ctag = ctag
+        self.sleep = sleep
+        if (self.verbose == True):
+            print("=== Settings ================")
+            print("ctag      = %s" % self.ctag)
+            print("stag      = %s" % self.stag)
+            print("dst       = %s" % self.dst)
+            print("dryrun    = %s" % self.dryrun)
+            print("hexdump   = %s" % self.hexdump)
+            print("interface = %s" % self.interface)
+            print("etype     = 0x%04x" % self.etype)
+            print("verbose   = %s" % self.verbose)
+            print("=== END Settings ============")
+
+    def send_frame(self, frame_body):
+        PACKET = Ether()
+        PACKET.length = 64
+        PACKET.dst = self.dst
+        PACKET.src = self.getHwAddr(self.interface)
+        if self.stag:
+            # WARNING: September/2016: This should be 0x88a8, but the Intel 10G
+            # hardware I am currently using does not support receiving a TPID of
+            # 0x88a8. So, I send double CTAGs, and I usually set this to 0x8100.
+            # (NOTE: The Intel hardware can send a TPID of 0x88a8)
+            PACKET.type = 0x8100
+            if self.ctag:
+                PACKET/=Dot1Q(type=0x8100,vlan=int(self.stag))
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
+            else:
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.stag))
+        else:
+            if self.ctag:
+                PACKET.type = 0x8100
+                PACKET/=Dot1Q(type=self.etype,vlan=int(self.ctag))
+            else:
+                PACKET.type = self.etype
+#            PACKET/=Dot1Q(type=self.etype, vlan=int(self.ctag))
+        PACKET/=SlowProtocolsSubtype()/FlagsBytes()/OAMPDU()
+        PACKET/=frame_body
+        PACKET/=EndOfPDU()
+        if (self.verbose == True):
+            PACKET.show()
+            print '###[ Frame Length %d (before padding) ]###' % len(PACKET)
+        if (self.hexdump == True):
+            print hexdump(PACKET)
+        if (self.dryrun != True):
+            sendp(PACKET, iface=self.interface, verbose=self.verbose)
+            time.sleep(self.sleep)
+        return PACKET
+
+    def get_request(self, TLV):
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_GetRequest()/TLV)
+
+    def set_request(self, TLV):
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_SetRequest()/TLV)
+
+    def send_multicast_register(self, TLV):
+        '''
+        Note, for mulicast, the standard specifies a register message
+        with ActionFlags of either Register or Deregister
+        '''
+        return self.send_frame(CablelabsOUI()/DPoEOpcode_MulticastRegister()/TLV)
+
+    def set_request_broadcom(self, TLV):
+        return self.send_frame(BroadcomOUI()/DPoEOpcode_SetRequest()/TLV)
+
+    def getHwAddr(self, ifname):
+        if (not self.dryrun):
+            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+            info = fcntl.ioctl(s.fileno(), 0x8927,  struct.pack('256s', ifname[:15]))
+        else:
+            info = range(1, 24)
+            info[18:24] = ['0','1','2','3','4','5']
+
+        return ':'.join(['%02x' % ord(char) for char in info[18:24]])
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-d', '--dst', dest='dst', action='store', default=EOAM_MULTICAST_ADDRESS,
+                        help='MAC destination (default: %s)' % EOAM_MULTICAST_ADDRESS)
+    parser.add_argument('-e', '--etype', dest='etype', action='store', default='8809',
+                        help='EtherType value (default: 0x8809)')
+    parser.add_argument('-i', '--interface', dest='interface', action='store', default='eth0',
+                        help='ETH interface to send (default: eth0)')
+    parser.add_argument('-s', '--stag', dest='stag', action='store', default=None,
+                        help='STAG value (default: None)')
+    parser.add_argument('-c', '--ctag', dest='ctag', action='store', default=None,
+                        help='CTAG value (default: None)')
+    parser.add_argument('-p', '--sleep', dest='sleep', action='store', default='1.0', type=float,
+                        help='SLEEP time after frame (default: 0.5 secs)')
+    parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False,
+                        help='verbose frame print out')
+    parser.add_argument('-x', '--hexdump', dest='hexdump', action='store_true', default=False,
+                        help='Hexdump the frame')
+    parser.add_argument('-y', '--dryrun', dest='dryrun', action='store_true', default=False,
+                        help='Dry run test, dont send - just print')
+
+    parser.add_argument('-t', '--test', dest='test', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-r', '--critical', dest='critical', action='store_true', default=False,
+                        help='Send the critical OAM set of set_request()')
+    parser.add_argument('-ta', '--test_add', dest='test_add', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-td', '--test_del', dest='test_del', action='store_true', default=False,
+                        help='Run commands under test')
+    parser.add_argument('-tc', '--test_clr', dest='test_clr', action='store_true', default=False,
+                        help='Run commands under test')
+
+    args = parser.parse_args()
+
+    if (args.dryrun == True):
+        args.sleep = 0.0
+
+    eoam = EOAM(
+        dryrun=args.dryrun,
+        dst=args.dst,
+        etype=args.etype,
+        hexdump=args.hexdump,
+        interface=args.interface,
+        stag=args.stag,
+        ctag=args.ctag,
+        verbose=args.verbose,
+        )
+
+    if (not args.critical
+        and not args.test
+        and not args.test_add
+        and not args.test_del
+        and not args.test_clr):
+        print 'WARNING: *** No frames sent, please specify \'test\' or \'critical\', etc.  See --help'
+
+    # Critical OAM Messages
+    if (args.critical == True):
+
+        # OAM GET Requests
+        print 'GET DeviceId and MAX Logical Links Message'
+        eoam.get_request(DeviceId()/MaxLogicalLinks())
+
+        print 'SET Report Thresholds Message'
+        eoam.set_request(ReportThresholdsSet())
+
+        print 'SET OAM Frame Rate Message'
+        eoam.set_request(OamFrameRateSet())
+
+        print 'GET multiple - Device and Manufacturing Info'
+        eoam.get_request(DONUObject()/DeviceId()/MaxLogicalLinks()/
+                              FirmwareInfo()/ChipsetInfo()/NumberOfNetworkPorts()/NumberOfS1Interfaces())
+
+        print 'GET - LLID Queue Configuration'
+        eoam.get_request(DONUObject()/LLIDQueueConfiguration())
+
+        print 'GET - ONU Manufacturer Organization Name'
+        eoam.get_request(DONUObject()/OnuManufacturerOrganizationName())
+
+        print 'GET - ONU Firmware Mfg Time Varying Controls'
+        eoam.get_request(DONUObject()/FirmwareMfgTimeVaryingControls())
+
+        print 'GET - ONU Vendor Name'
+        eoam.get_request(DONUObject()/VendorName())
+
+        print 'GET - ONU Model Number'
+        eoam.get_request(DONUObject()/ModelNumber())
+
+        print 'GET - ONU Hardware Version'
+        eoam.get_request(DONUObject()/HardwareVersion())
+
+        print 'SET - Clear Port Ingress Rules -- Network Port Object'
+        eoam.set_request(NetworkPortObject()/ClearPortIngressRules())
+
+        print 'SET - Clear Port Ingress Rules -- User Port Object'
+        eoam.set_request(UserPortObject()/ClearPortIngressRules())
+
+        print 'SET - Broadcom Specific TLVs'
+        eoam.set_request_broadcom(Broadcom07_7F_F1_Set01()/Broadcom07_7F_F1_Set02()/
+                                       Broadcom07_7F_F1_Set03()/Broadcom07_7F_F1_Set04())
+
+        print 'SET - Multicast Register Message 01'
+        eoam.send_multicast_register(MulticastRegisterSetSumitomo01())
+
+        print 'SET - Multicast Register Message 02'
+        eoam.send_multicast_register(MulticastRegisterSetSumitomo02())
+
+        print 'SET - Custom Field EtherType'
+        eoam.set_request(UserPortObject()/CustomFieldEtherType())
+
+        print 'SET - Custom Field Generic L3'
+        eoam.set_request(UserPortObject()/CustomFieldGenericL3())
+
+        print 'SET - MAC Learning MIN/MAX/Age Limit -- User Port Object'
+        eoam.set_request(UserPortObject()/MacLearningMaxAllowedSet()/DynamicAddressAgeLimitSet()/
+                              SourceAddressAdmissionControlSet()/MacLearningMinGuaranteeSet())
+
+        print 'SET - MAC Learning/Flooding/Local Switching -- D-ONU Port Object'
+        eoam.set_request(DONUObject()/MacLearningAggregateLimitSet()/FloodUnknownSet()/LocalSwitchingSet())
+
+        print 'SET - Report Thresholds -- Unicast Logical Link'
+        eoam.set_request(UnicastLogicalLink()/UnicastLogicalLinkReportThresholdsSet())
+
+        print 'SET - Port Ingress Rule -- Network Port Object -- Precedence 12'
+        eoam.set_request(NetworkPortObject()/
+                              PortIngressRuleHeader(precedence=12)/
+                              PortIngressRuleClauseMatchLength01(operator=1)/
+                              PortIngressRuleResultForward()/
+                              PortIngressRuleResultQueue(objecttype=0x0003)/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 13'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=13)/
+                              PortIngressRuleClauseMatchLength00(fieldcode=1, operator=7)/
+                              PortIngressRuleResultQueue(objecttype=0x0002)/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 7 Discard 01'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=7)/
+                              PortIngressRuleClauseMatchLength06(fieldcode=1, operator=1)/
+                              PortIngressRuleResultDiscard()/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+
+        print 'SET - Port Ingress Rule -- User Port Object -- Precedence 7 Discard 02'
+        eoam.set_request(UserPortObject()/
+                              PortIngressRuleHeader(precedence=7)/
+                              PortIngressRuleClauseMatchLength06(fieldcode=1, operator=1, match5=0x02)/
+                              PortIngressRuleClauseMatchLength02(fieldcode=0x19, operator=1, match=0x8889)/
+                              PortIngressRuleClauseMatchLength01(fieldcode=0x1a, operator=1, match=0x03)/
+                              PortIngressRuleResultDiscard()/
+                              PortIngressRuleTerminator()/
+                              AddPortIngressRule())
+
+        print 'GET - D-ONU Object -- Firmware Filename'
+        eoam.set_request(DONUObject()/FirmwareFilename())
+
+        print 'SET - User Port Object 0 -- Broadcom Specific TLVs'
+        eoam.set_request_broadcom(UserPortObject(number=0)/Broadcom07_7F_F6_Set())
+
+        print 'SET - User Port Object 1 -- Broadcom Specific TLVs'
+        eoam.set_request_broadcom(UserPortObject(number=1)/Broadcom07_7F_F6_Set())
+
+        print 'SET - User Port Object 0 -- Clause 30 Attributes -- MAC Enable'
+        eoam.set_request(UserPortObject()/Clause30AttributesMacEnable())
+
+        print 'SET - IPMC Forwarding Rule Configuration'
+        eoam.set_request(IpmcForwardingRuleConfiguration())
+
+        print 'SET - Enable User Traffic -- Unicast Logical Link'
+        eoam.set_request(UnicastLogicalLink()/EnableUserTraffic())
+
+    if (args.test == True):
+        print 'SET - Multicast Register Message 01'
+        eoam.send_multicast_register(MulticastRegisterSet(MulticastLink=0x3ff0, UnicastLink=0x120f))
+
+        #print 'SET - Multicast Deregister Message 02'
+        eoam.send_multicast_register(MulticastRegisterSet(ActionFlags="Deregister",MulticastLink=0x3ff0, UnicastLink=0x120f))
+
+    if (args.test_clr == True):
+        print 'SET Clear Static MAC Table -- User Port Object'
+        eoam.set_request(ClearStaticMacTable())
+
+    elif (args.test_add == True):
+        print 'SET Add Static MAC Address -- User Port Object'
+        eoam.set_request(AddStaticMacAddress(mac=IGMP_MULTICAST_ADDRESS))
+
+    elif (args.test_del == True):
+        print 'SET Delete Static MAC Address -- User Port Object'
+        eoam.set_request(DeleteStaticMacAddress(mac=IGMP_MULTICAST_ADDRESS))
+
+
+
+    # EXTERNAL OAM LIB TESTING
+    #import tboam
+    #tboam.get_request(f.branch, f.leaf)
+    #print 'SET - User Port Object 1 -- Broadcom Specific TLVs'
+    #f = eoam.set_request_broadcom(UserPortObject(number=1)/Broadcom07_7F_F6_Set())
+    #print("=== receive frame ===========")
+    #Now, pretend I just received this frame.
+    #f.show()
+    #tboam.set_request(f.branch, f.leaf)
+
+    # Examples
+    #oam_frame = eoam.get_request(UserPortObject()/LoopbackEnable())
+    #oam_frame = eoam.get_reqeust(UserPortObject()/LoopbackDisable())
+    #oam_frame = eoam.set_request(UserPortObject()/LoopbackEnable())
+    #oam_frame = eoam.set_request(UnicastLogicalLink()/AlarmReportingSet())
+    #oam_frame = eoam.get_request(UserPortObject()/BytesDropped())
+    #oam_frame = eoam.get_request(UserPortObject()/TxBytesUnused())
+    #print 'GET -- User Port Object -- Rx Frame 512-1023'
+    #oam_frame = eoam.get_request(UserPortObject()/RxFrame_512_1023())
+    #print 'GET -- User Port Object -- Tx Frame 512-1023'
+    #oam_frame = eoam.get_request(UserPortObject()/TxFrame_512_1023())
+    #oam_frame = eoam.get_request(NetworkPortObject()/BytesDropped())
+    #oam_frame = eoam.get_request(NetworkPortObject()/TxBytesUnused())
+    #print 'GET -- Network Port Object -- Rx Frame 512-1023'
+    #oam_frame = eoam.get_request(NetworkPortObject()/RxFrame_512_1023())
+    #print 'GET -- Network Port Object -- Tx Frame 512-1023'
+    #oam_frame = eoam.get_request(NetworkPortObject()/TxFrame_512_1023())
