Initial import of Microsemi Driver

Change-Id: I431d5f2c18e0b66a84c36273c3d9f0b84f223841

Added in BUCK files for building driver

Change-Id: I70681327f5b89f67e904c45d5974ab393652d51f

Corrected some syntax errors

Change-Id: I11150cc499c212005f80619e3900e747f1c23d96

Updated pom file to clean build

Change-Id: I6613ddc9e6802aa882e716cf04df210249870835

Added in utility functions for EA1000 Init

Change-Id: I51ffe0cf0daf9ffcea0e2479ee9982fcd1755440

Added YMS code to Microsemi Driver

Change-Id: I6f2a14e454c6909bf9e9f6025321c74c98c13c72

Updated driver to work with YMS and YCH

Change-Id: If7dbe3cd5bd1b6f902d09d6b2dc3895605d70f70

Implemented IetfSystemManager as a service and call on YMS as a service

Change-Id: If1c5e8482b1f53f578a3b0b770accd50024111cf

Moved YMS calls over in to Yang Service implementation

Change-Id: I044aad06f1ef7452bc48e88987787a683666cd72

improved unit test for IetfSystemManager

Change-Id: I48fbf831e7e5ca0e1ef3de8288e56da1b5ebb7a4

Major changes to IetfSystemManager to work in live system

Change-Id: I6e3aa118ba422151f314b9a666860d90905c9929

Added in retry mechanism for DeviceDescription to wait for YCH

Change-Id: If8e0f2c2f315ffd6db15627a11382a00217dd262

Added in implementation of MseaSaFiltering and unit tests

Change-Id: I34bf888e0e732bd4664d1fb8ef5abb679b1506fe

Updated driver with unit tests for MseaSaFiltering

Change-Id: I7ea2407a546622ff55d1ab21610c45697546d632

Modified removeFlowRules of Ea1000FlowRuleProgrammable

Change-Id: Ibb4a555f61887a8e6e42af588bb42f7b70f58efb

Added in manager for MseaUniEvc service with unit tests

Change-Id: Idc5853f46051548973f52a0659f7f88982ff960c

Implemented getFlowEntries() for EVCs from EA1000

Change-Id: Ie85dadfa7760f0b30a9bdf6ccd09cca9f097fff9

Added in translation of FlowRules in to EVC on EA1000

Change-Id: Icfb65171c3300c96b3ca4e18cbd327f0ed2190be

Added in handling of FlowRule deletion including complex ceVlanMaps

Change-Id: I7fd0bb0ef04d1b40e4b7d6a6db7f7ee662329780

Updated Service entries for new onos-yang-tools

Change-Id: I44e655202f3a45073e1e16f83737caed6e01afa8

Revert "Updated Service entries for new onos-yang-tools"

This reverts commit 642b550ef1de12ed59bad2eaa3a2da414d2e5e59.

Improved timeout mechanism for YANG model loading

Change-Id: If744ecd206372e822edf2b736c83226321a12256

Minor edits of EVC creation

Change-Id: Ib0a4763deaf6dce37625ba77f5095b39cd98272d

Added in CustomEvc and supporting classes

Change-Id: Iad60eb1bcd48d2aec55b894b2d419b51852c3b2f

Created CeVlanUtils to resolve loading problem

Change-Id: I0d63931ad2c5ad2725861ebc7dccc4d5fe7b9298

Modified startup check

Change-Id: I6e6bcfa7e615044cb08fe7ee2f8a6c8b89aabb21

Modified handlin of flow rules

Change-Id: I965a79c23298866122aeb94c6d9d584aafee3bd5

Fixed problem with ceVlanMap

Change-Id: If1458c35d0b95b5b25b6636f098292f9e91c06c6

Minor Pom edits

Change-Id: I5cefb18674aa04b1f50bd7e2306260c1c3ad3814

Commented out extension references in YANG files to avoid onos-yang-tools problems

Change-Id: I32fdb34c4f476f495fe28e75d0f410aaf14e2ec1

Corrected error in removing 0 in CeVlanMapUtils

Change-Id: I8cd1fd02788b81c2613364d5639ef6e090057f80

Changes in YMS to accomodate EA1000 driver

Change-Id: I6ae2b9bd2be49eae8d4ad2f929dfe3214c514550
diff --git a/drivers/microsemi/ea1000driver/BUCK.ignore b/drivers/microsemi/ea1000driver/BUCK.ignore
new file mode 100644
index 0000000..bee66fb
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/BUCK.ignore
@@ -0,0 +1,41 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//drivers/utilities:onos-drivers-utilities',
+    '//protocols/netconf/api:onos-protocols-netconf-api',
+    '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
+    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang',
+    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang-gen',
+    '//lib:org.apache.karaf.shell.console',
+    '//cli:onos-cli',
+    '//incubator/api:onos-incubator-api',
+]
+
+TEST_DEPS = [
+    '//lib:TEST_ADAPTERS',
+    '//core/api:onos-api-tests',
+    '//drivers/netconf:onos-drivers-netconf-tests',
+    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang-tests',
+]
+
+BUNDLES = [
+    '//drivers/utilities:onos-drivers-utilities',
+    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang',
+]
+
+osgi_jar_with_tests (
+    deps = COMPILE_DEPS,
+    test_deps = TEST_DEPS,
+    srcs = glob(['src/main/java/**/*.java']),
+    resources_root = 'src/main/resources',
+    resources = glob(['src/main/resources/**']),
+)
+
+onos_app (
+    app_name = 'org.onosproject.drivers.microsemi',
+    title = 'Microsemi device drivers',
+    category = 'Drivers',
+    url = 'http://onosproject.org',
+    description = 'ONOS Microsemi device drivers application.',
+    included_bundles = BUNDLES,
+    required_apps = [ 'org.onosproject.netconf', 'org.onosproject.yms' ],
+)
diff --git a/drivers/microsemi/ea1000driver/README.md b/drivers/microsemi/ea1000driver/README.md
new file mode 100755
index 0000000..4187039
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/README.md
@@ -0,0 +1,363 @@
+#Microsemi Edge Assure 1000 SFP-NID
+This driver allows connection to the Microsemi Edge Assure 1000 SFP-NID
+[EdgeAssure 1000 Product Page](https://www.microsemi.com/existing-parts/parts/137346)
+
+The User Guide for this product is available on request from Microsemi, and gives a full explanation of the theory of operation, functionality and how all functions can be accessed through the NETCONF interface only.<br/>
+
+Currently only a subset of it's functionality is supported through ONOS, but this will expand to full functionality in future releases.
+
+#Compile and Installation
+Currently this driver is **not** built using BUCK (because it depends on an older version of onos-yang-tools, while BUCK points to the newer version of the onos-yang-tools)<br/>
+
+Before this driver can work successfully one problem with the Yang Management System (YMS) App has to be taken in to account. This is that the Yang Codec Handler (YCH) part needs to be built in Maven (when compiled in Buck something is not configured properly).<br/>
+
+To build YMS with Maven:
+1. Change directory to onos/apps/yms/app
+2. Run the command "mvn clean install" (or use the shortcut 'mci')
+3. With onos running, **reinstall** the generated OAR file for YMS on the target machine (could be localhost - replace {bracketed} values with real values)
+    * onos-app {onos-server} reinstall! target/onos-app-yms-{version}.oar
+
+
+Then this Microsemi driver has to be built using Maven and installed. To build it:
+1. Change directory to onos/drivers/microsemi
+2. Run the command "mvn clean install" (or use the shortcut 'mci')
+3. With onos running, install the 2 generated OAR files on the target machine (could be localhost - replace {bracketed} values with real values)
+    * onos-app {onos-server} install ea1000yang/target/onos-drivers-microsemi-ea1000yang-{version}.oar
+    * onos-app {onos-server} install ea1000driver/target/onos-drivers-microsemi-ea1000-{version}.oar
+4. Verify that they are installed by calling **apps -s | grep microsemi** at the onos> prompt
+5. Activate the modules at the onos prompt
+    * onos:app activate org.onosproject.drivers.netconf org.onosproject.drivers.microsemi.yang org.onosproject.drivers.microsemi
+
+#Change NETCONF default connection timeout
+Connection timeouts need to be increased from default values when using EA1000. At ONOS command line run
+
+`onos:cfg set org.onosproject.netconf.ctl.NetconfControllerImpl netconfConnectTimeout 150`<br/>
+`onos:cfg set org.onosproject.netconf.ctl.NetconfControllerImpl netconfReplyTimeout 150`<br/>
+
+#Creating Devices
+EA1000 Devices will not be automatically discovered at present in ONOS. They have to be created through the network/configuration REST interface in ONOS.
+
+* The name must follow the format **netconf:<ipaddr>:<port>**
+* The **ip** and **port** must correspond to the ip and port in the name (above).
+
+`{`<br/>
+`&nbsp;"devices": {`<br/>
+`&nbsp;&nbsp;"netconf:192.168.56.10:830": {`<br/>
+`&nbsp;&nbsp;&nbsp;"netconf": {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"username": "admin",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"password": "admin",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ip": "192.168.56.10",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"port": "830"`<br/>
+`&nbsp;&nbsp;&nbsp;},`<br/>
+`&nbsp;&nbsp;&nbsp;"basic": {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"driver": "microsemi-netconf",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"type": "SWITCH",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"manufacturer": "Microsemi",`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"hwVersion": "EA1000"`<br/>
+`&nbsp;&nbsp;&nbsp;}`<br/>
+`&nbsp;&nbsp;}`<br/>
+`&nbsp;}`<br/>
+`}`<br/>
+
+
+
+#Connected Device
+When the EA1000 is configured and connected is should be visible in ONOS through the **devices** command.
+
+`onos> devices`<br/>
+`id=netconf:192.168.56.10:830, available=true, local-status=connected 33s ago, role=MASTER, type=SWITCH, mfr=Microsemi, hw=EA1000, sw=4.4.0-53-generic, serial=Eagle Simulator., driver=microsemi-netconf, ipaddress=192.168.56.10, latitude=51.8865467, locType=geo, longitude=-8.4040440, name=netconf:192.168.56.10:830, port=830, protocol=NETCONF`
+
+Note how the
+* software version (sw=**4.4.0-53-generic**)
+* serial number (serial=**Eagle Simulator.**)
+* latitude (latitude=**51.8865467**) and
+* longitude (longitude=**-8.4040440**)
+are all retrieved from the device on initial handshake.
+
+In addition the time on the device is checked at this stage, and if it wrong by more than 1 day (it defaults to 1-1-1970 on startup if no NTP server is configured), then the current time is written to it at this stage. This will persist on the device until next reboot.
+
+Also the ports of the device will be visible after connection. There are 2 ports
+* Port 0 - The **Optics** port - this is a single mode 1000LX 1310nm optical connection
+* Port 1 - The **Host** port - this is a 1GB Ethernet Copper connection in to an SFP Port
+
+`onos> ports`<br/>
+`id=netconf:192.168.56.10:830, available=true, local-status=connected 15s ago, role=MASTER, type=SWITCH, mfr=Microsemi, hw=EA1000, sw=4.4.0-53-generic, serial=Eagle Simulator., driver=microsemi-netconf, ipaddress=192.168.56.10, latitude=51.8865467, locType=geo, longitude=-8.4040440, name=netconf:192.168.56.10:830, port=830, protocol=NETCONF`<br/>
+`&nbsp;port=0, state=enabled, type=fiber, speed=1000, portName=Optics`<br/>
+`&nbsp;port=1, state=enabled, type=copper, speed=1000, portName=Host`<br/>
+
+
+#OpenFlow Emulation
+Currently the EA1000 supports only a limited set of OpenFlow rules through the Flows REST API and the Flow Objective API.
+
+##IP Source Address filtering
+A feature of the EA1000 that may be configured through Flow Rules is IP Source Address Filtering. This can only be activated on Port 0 (the optics Port). An example of this kind of flow is
+
+`POST /onos/v1/flows/ HTTP/1.1`<br/>
+`{`<br/>
+`&nbsp;"flows": [`<br/>
+`&nbsp;&nbsp;{`<br/>
+`&nbsp;&nbsp;&nbsp;"priority": 40000,`<br/>
+`&nbsp;&nbsp;&nbsp;"timeout": 0,`<br/>
+`&nbsp;&nbsp;&nbsp;"isPermanent": true,`<br/>
+`&nbsp;&nbsp;&nbsp;"deviceId": "netconf:192.168.56.10:830",`<br/>
+`&nbsp;&nbsp;&nbsp;"tableId": 8,`<br/>
+`&nbsp;&nbsp;&nbsp;"treatment": {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"instructions": [  {"type": "NOACTION"} ],`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"deferred": []`<br/>
+`&nbsp;&nbsp;&nbsp;},`<br/>
+`&nbsp;&nbsp;&nbsp;"selector": {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;"criteria": [  {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type": "IPV4_SRC", "ip": "192.168.8.0/24"`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;},{`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type": "IN_PORT", "port": "0"`<br/>
+`} ] } } ] }`<br/>
+
+## Vlan Tag Manipulation
+**Note: Before Vlan Tag manipulation can be done the mode of the interface on the EA1000 has to be changed to be compatible with the type of tags that are being received. If this is not done, once an EVC is created the packets that have the Vlan tagged on will be treated as untagged by EA1000, and dropped if there is no EVC present corresponding to the interface PVID. See the section below on the "Setting EA1000 Interface Tagging Mode"**
+
+Flows that Push, Pop or Overwrite VLAN tags are implemented in EA1000 and are treated as MEF Carrier Ethernet EVCs. Both CTags and STags can be pushed on to matching Ethernet packets at network Layer 2.
+
+`POST /onos/v1/flows/ HTTP/1.1`<br/>
+`{`<br/>
+`  "flows": [`<br/>
+`    {`<br/>
+`      "priority": 50000,`<br/>
+`      "timeout": 0,`<br/>
+`      "isPermanent": true,`<br/>
+`      "tableId": 6,` --This sets the EVC id  - this first flow is configuring the customer side - UNI-C<br/>
+`      "deviceId": "netconf:192.168.56.10:830",`<br/>
+`      "treatment": {`<br/>
+`        "instructions": [`<br/>
+`          {`<br/>
+`            "type": "L2MODIFICATION",`<br/>
+`            "subtype": "VLAN_PUSH",` --This pushes a VLAN on<br/>
+`            "ethernetType": "0x88a8"`  --The pushed VLAN type is QinQ<br/>
+`          },{`<br/>
+`            "type": "L2MODIFICATION",`<br/>
+`            "subtype": "VLAN_ID",`<br/>
+`            "vlanId": "200"`  --The pushed VLAN id is 200<br/>
+`          }`<br/>
+`        ],`<br/>
+`        "deferred": []`<br/>
+`      },`<br/>
+`      "selector": {`<br/>
+`        "criteria": [`<br/>
+`         {`<br/>
+`          "type": "VLAN_VID",`<br/>
+`          "vlanId": "100"` -- Applies only to packets already tagged with VLAN 100..<br/>
+`         },{`<br/>
+`          "type": "IN_PORT",`<br/>
+`          "port": "1"`  -- ..that are coming in on the Host port<br/>
+`         }`<br/>
+`        ]`<br/>
+`      }`<br/>
+`    },{`<br/>
+`      "priority": 50000,`<br/>
+`      "timeout": 0,`<br/>
+`      "isPermanent": true,`<br/>
+`      "tableId": 6,`  -- The same EVC, but now we are configuring another VLAN<br/>
+`      "deviceId": "netconf:192.168.56.10:830",`<br/>
+`      "treatment": {`<br/>
+`       "instructions": [`<br/>
+`         {`<br/>
+`          "type": "L2MODIFICATION",`<br/>
+`          "subtype": "VLAN_PUSH",`  -- Push again<br/>
+`          "ethernetType": "0x88a8"`  -- QinQ again<br/>
+`         },{`
+`          "type": "L2MODIFICATION",`<br/>
+`          "subtype": "VLAN_ID",`<br/>
+`          "vlanId": "200"`  -- VLAN 200 again<br/>
+`         }`<br/>
+`        ],`<br/>
+`        "deferred": []`<br/>
+`      },`<br/>
+`      "selector": {`<br/>
+`        "criteria": [`<br/>
+`         {`<br/>
+`          "type": "VLAN_VID",`<br/>
+`          "vlanId": "101"`  -- Applies only to packets already tagged with VLAN 101..<br/>
+`         },{`<br/>
+`          "type": "IN_PORT",`<br/>
+`          "port": "1"`  -- ..that are coming in on the Host port<br/>
+`         }`<br/>
+`        ]`<br/>
+`      }`<br/>
+`    },{`<br/>
+`      "priority": 50000,`<br/>
+`      "timeout": 0,`<br/>
+`      "isPermanent": true,`<br/>
+`      "tableId": 6,`  -- The same EVC, but now we are configuring the opposite side<br/>
+`      "deviceId": "netconf:192.168.56.10:830",`<br/>
+`      "treatment": {`<br/>
+`       "instructions": [`<br/>
+`         {`<br/>
+`          "type": "L2MODIFICATION",`<br/>
+`          "subtype": "VLAN_POP"`  -- Here we are popping the top level tag<br/>
+`         }`<br/>
+`       ],`<br/>
+`       "deferred": []`<br/>
+`      },`<br/>
+`      "selector": {`<br/>
+`       "criteria": [`<br/>
+`        {`<br/>
+`         "type": "VLAN_VID",`  -- Applies only to packets tagged with VLAN 200<br/>
+`         "vlanId": "200"`<br/>
+`        },{`<br/>
+`         "type": "IN_PORT",`<br/>
+`         "port": "0"`  -- That are coming in on the Optics Port<br/>
+`        }`<br/>
+`      ] } } ] }`<br/>
+
+##Setting EA1000 Interface Tagging Mode
+The Interface of the EA1000 has an attribute **frame_format** that must be set to either:
+* none (default)
+* ctag
+* stag
+to correspond to the type of tagging that will be applied to packets received at that port.
+
+For instance if Port 0 of an EA1000 is to receive and process S-Tags, the the frame-format of the interface *eth0* should be set to **stag** in advance.
+
+This should be made a permanent setting in the NETCONF *startup* datastore, so that it will be active if the device reboots.
+
+Likewise the opposite port should be set to *ctag*.<br/>
+
+This changes are not made done through the ONOS Driver, and currently only possible to make this change through a NETCONF CLI client such as *yangcli-pro* or *netopeer-cli*;
+
+See the EA1000 User Guide for details on how to use *yangcli-pro* to access the EA1000.
+
+On an EA1000 accessed through *yangcli-pro* the following commands can be used to make these changes:<br/>
+`admin@192.168.2.234> discard-changes`<br/>
+`admin@192.168.2.234> copy-config source=startup target=candidate`<br/>
+`admin@192.168.2.234> merge /interfaces/interface[name='eth0']/frame-format --value='stag'`<br/>
+`admin@192.168.2.234> merge /interfaces/interface[name='eth1']/frame-format --value='ctag'`<br/>
+`admin@192.168.2.234> commit`<br/>
+`admin@192.168.2.234> copy-config source=running target=startup`<br/>
+
+
+#ONOS Carrier Ethernet Application
+The ONOS [Carrier Ethernet](https://wiki.onosproject.org/display/ONOS/Carrier+Ethernet+Application) application allows EVCs to be created between UNIs that are linked together in ONOS. This is translated down to OpenFlow switches by converting the **ce-evc-create** commands in to Flow Rules similar to those shown above.
+
+While EA1000 is not an OpenFlow switch, it's driver can convert these flows in to NETCONF which can be used to configure EVCs on the EA1000. Because EA1000 is just a 2 port device it represents only 1 UNI (conventionally on switches each port represnts a UNI).
+
+When an EA1000 device is configured in ONOS the Carrier Ethernet Application considers both of its ports to be UNIs, as can be seen in the listing below:
+
+`onos> ce-uni-list`<br/>
+`CarrierEthernetUni{id=netconf:192.168.56.10:830/0, cfgId=netconf:192.168.56.10:830/0, role=null, refCount=0, ceVlanIds=[], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[]}`<br/>
+`CarrierEthernetUni{id=netconf:192.168.56.10:830/1, cfgId=netconf:192.168.56.10:830/1, role=null, refCount=0, ceVlanIds=[], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[]}`<br/>
+
+This mismatch is handled in the driver - both side appear to be separate here but they will apply to the same single UNI on the EA1000 in opposite directions.
+
+For an EVC to be created there has to an ONOS 'link' between 2 UNIs for a POINT-TO-POINT connection - an Ethernet Virtual Private Line (**EVPL**). There has to be more than 2 UNIs to create a MULTIPOINT-TO-MULTIPOINT link - an E-Lan.
+
+##Links
+In a simple scenario that has 2 EA1000s (netconf:192.168.56.10:830 and netconf:192.168.56.20:830) configured in ONOS, the two might be linked together through their optics ports (port 0). The following result is expected for a bi-directional link:
+
+`onos> links`<br/>
+`src=netconf:192.168.56.10:830/0, dst=netconf:192.168.56.20:830/0, type=DIRECT, state=ACTIVE, expected=false`<br/>
+`src=netconf:192.168.56.20:830/0, dst=netconf:192.168.56.10:830/0, type=DIRECT, state=ACTIVE, expected=false`<br/>
+
+This will not exist by default since Link Discovery is not yet a feature of the EA1000 driver. These have to be created manually - through the network/configuration REST API.
+
+`POST /onos/v1/network/configuration/ HTTP/1.1`<br/>
+`{`<br/>
+`  "links": {`<br/>
+`  "netconf:192.168.56.10:830/0-netconf:192.168.56.20:830/0" : {`  -- 10 to 20<br/>
+`    "basic" : {`<br/>
+`      "type" : "DIRECT"`<br/>
+`    }`<br/>
+`  },`<br/>
+`  "netconf:192.168.56.20:830/0-netconf:192.168.56.10:830/0" : {`  -- and reverse<br/>
+`    "basic" : {`<br/>
+`      "type" : "DIRECT"`<br/>
+`    } } } }`<br/>
+
+##EVPL Creation
+To create a simple EVPL the following command can be used at the ONOS CLI:<br/>
+
+`onos>ce-evc-create --cevlan 101 evpl1 POINT_TO_POINT netconf:192.168.57.10:830/0 netconf:192.168.57.20:830/0`<br/>
+
+This returns without any message. Tailing through the ONOS logs will reveal any error that might have occurred.<br/>
+
+This EVC can be viewed only through the command line:<br/>
+`onos> ce-evc-list`<br/>
+`  CarrierEthernetVirtualConnection{id=EP-Line-1, cfgId=evpl1, type=POINT_TO_POINT, state=ACTIVE,`<br/>
+`UNIs=[`<br/>
+`CarrierEthernetUni{id=netconf:192.168.56.10:830/0, cfgId=netconf:192.168.56.10:830/0, role=Root, refCount=0, ceVlanIds=[101], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[CarrierEthernetBandwidthProfile{id=FC-1, type=EVC, cir=0.0, cbs=0, eir=0.0, ebs=0}]}, `<br/>
+`CarrierEthernetUni{id=netconf:192.168.56.20:830/0, cfgId=netconf:192.168.56.20:830/0, role=Root, refCount=0, ceVlanIds=[101], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[CarrierEthernetBandwidthProfile{id=FC-1, type=EVC, cir=0.0, cbs=0, eir=0.0, ebs=0}]}], `<br/>
+`FCs=[CarrierEthernetForwardingConstruct{id=FC-1, cfgId=null, type=POINT_TO_POINT, vlanId=1, metroConnectId=null, refCount=1, `<br/>
+`LTPs=[`<br/>
+`CarrierEthernetLogicalTerminationPoint{id=netconf:192.168.56.10:830/0, cfgId=netconf:192.168.56.10:830/0, role=Root, ni=CarrierEthernetUni{id=netconf:192.168.56.10:830/0, cfgId=netconf:192.168.56.10:830/0, role=Root, refCount=0, ceVlanIds=[101], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[CarrierEthernetBandwidthProfile{id=FC-1, type=EVC, cir=0.0, cbs=0, eir=0.0, ebs=0}]}},`   `CarrierEthernetLogicalTerminationPoint{id=netconf:192.168.56.20:830/0, cfgId=netconf:192.168.56.20:830/0, role=Root, ni=CarrierEthernetUni{id=netconf:192.168.56.20:830/0, cfgId=netconf:192.168.56.20:830/0, role=Root, refCount=0, ceVlanIds=[101], capacity=1000000000, usedCapacity=0.0, bandwidthProfiles=[CarrierEthernetBandwidthProfile{id=FC-1, type=EVC, cir=0.0, cbs=0, eir=0.0, ebs=0}]}}]}]}`<br/>
+
+##EVPL flows
+This creates a set of flows in ONOS that are pushed down to the two EA1000s through NETCONF to configure the EVCs
+
+`onos> flows`<br/>
+`deviceId=netconf:192.168.56.10:830, flowRuleCount=2`<br/>
+`    id=71000050d21dd5, state=ADDED, bytes=0, packets=0, duration=0, liveType=UNKNOWN, priority=50000, tableId=1, appId=org.onosproject.ecord.carrierethernet, payLoad=null, selector=[IN_PORT:0, VLAN_VID:1], treatment=DefaultTrafficTreatment{immediate=[VLAN_POP], deferred=[], transition=None, meter=None, cleared=false, metadata=null}`  -- This represents ingress on the Optics port 0 on device A and POPs off the S-Tag<br/>
+`    id=710000b5c1f057, state=ADDED, bytes=0, packets=0, duration=0, liveType=UNKNOWN, priority=50000, tableId=1, appId=org.onosproject.ecord.carrierethernet, payLoad=null, selector=[IN_PORT:1, VLAN_VID:101], treatment=DefaultTrafficTreatment{immediate=[VLAN_PUSH:qinq, VLAN_ID:1], deferred=[], transition=TABLE:0, meter=None, cleared=false, metadata=null}`  -- This represents ingress on the Host port 1 on device A and pushes on the S-Tag 1<br/>
+
+`deviceId=netconf:192.168.56.20:830, flowRuleCount=2`<br/>
+`    id=710000613c8252, state=ADDED, bytes=0, packets=0, duration=0, liveType=UNKNOWN, priority=50000, tableId=1, appId=org.onosproject.ecord.carrierethernet, payLoad=null, selector=[IN_PORT:0, VLAN_VID:1], treatment=DefaultTrafficTreatment{immediate=[VLAN_POP], deferred=[], transition=None, meter=None, cleared=false, metadata=null}`  -- This represents ingress on the Optics port 0 on device B and POPs off the S-Tag 1<br/>
+`    id=7100006ca2573f, state=ADDED, bytes=0, packets=0, duration=0, liveType=UNKNOWN, priority=50000, tableId=1, appId=org.onosproject.ecord.carrierethernet, payLoad=null, selector=[IN_PORT:1, VLAN_VID:101], treatment=DefaultTrafficTreatment{immediate=[VLAN_PUSH:qinq, VLAN_ID:1], deferred=[], transition=TABLE:0, meter=None, cleared=false, metadata=null}`  -- This represents ingress on the Host port 1 on device B and pushes on the S-Tag 1<br/>
+
+Through these flows it's clear that the CE-VLAN on the UNI-C side is 101 and that the S-Tag that is being pushed on is VLAN 1. Packets coming back in on the UNI-N on port 0 have their S-Tag popped off. In this scenario this will create evc-1 on both of the EA1000s.<br/>
+
+On the actual EA1000 itself using a NETCONF CLI Client like yangcli-pro, the result is:
+
+`admin@192.168.56.10> sget-config /mef-services/uni source=running`<br/>
+`rpc-reply {`<br/>
+`&nbsp;data {`<br/>
+`&nbsp;&nbsp;mef-services {`<br/>
+`&nbsp;&nbsp;&nbsp;uni {`  -- There is only one UNI on the EA1000<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;name Uni-on-192.168.56.10:830`  -- Automatically assigned<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;evc  1 {`  -- From the VLAN 1 from CE app<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evc-index 1`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name EVC-1`  -- Automatically assigned<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evc-per-uni {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evc-per-uni-c {`  -- The UNI-C side<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ce-vlan-map 101`  -- Could be a range of values<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow-mapping {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ce-vlan-id 101`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow-id 31243725464268887`  -- For tracking with ONOS<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ingress-bwp-group-index 0`  -- No meters<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag-push {`  -- Push on an a VLAN<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push-tag-type pushStag`  -- Push type is S-TAG<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outer-tag-vlan 1`  -- Push value is 1<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;evc-per-uni-n {`  -- For the UNI-N side<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ce-vlan-map 1`  -- The VLAN to match for egress on this side<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow-mapping {`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ce-vlan-id 1`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow-id 31243723770830293`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ingress-bwp-group-index 0`<br/>
+`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tag-pop {`  -- Pop off the S-TAG<br/>
+`} } } } } } } }`<br/>
+`admin@192.168.56.10>`<br/>
+
+##CIR and EIR as OpenFlow Meters
+** Note: The meters created by Carrier Ethernet are not compatible with Open vSwitch at present.They will disrupt the configuration of the EA1000 if there are Open VSwitch based OpenFlow switches between the UNIs **<br/>
+
+To create limits on how the EVPL can transport data the CIR, EIR and CBS and EBS values can be specified:
+
+`onos> ce-evc-create --cevlan 102 -c 400 -e 200 -cbs 3000 -ebs 2000 evpl2 POINT_TO_POINT netconf:192.168.56.10:830/0 netconf:192.168.56.20:830/0`<br/>
+
+* -c 400 means Commit Information Rate is 400 MB/s
+* -e 200 means Excess information Rate is 200 MB/s
+* -cbs 3000 is Committed Burst Size of 3000 **Bytes**
+* -ebs 2000 is Excess Burst Rate of 2000 **Bytes**
+
+These will be created as meters in Open Flow.
+
+`onos> meters`<br/>
+` DefaultMeter{device=netconf:192.168.56.20:830, id=1, appId=org.onosproject.ecord.carrierethernet, unit=KB_PER_SEC, isBurst=true, state=PENDING_ADD, bands=[DefaultBand{rate=50000, burst-size=3000, type=REMARK, drop-precedence=0}, DefaultBand{rate=75000, burst-size=5000, type=DROP, drop-precedence=null}]}`<br/>
+` DefaultMeter{device=netconf:192.168.56.10:830, id=1, appId=org.onosproject.ecord.carrierethernet, unit=KB_PER_SEC, isBurst=true, state=PENDING_ADD, bands=[DefaultBand{rate=75000, burst-size=5000, type=DROP, drop-precedence=null}, DefaultBand{rate=50000, burst-size=3000, type=REMARK, drop-precedence=0}]}`<br/>
+
+Here the rates is shown as Bands. For each device the Bands are
+*  REMARK for CIR and CBS - the REMARK applies to any packets that exceed the CIR in kB/s (400Mb/s = 50000kB/s) and the burst size 3000 Bytes
+*  DROP for EIR and EBS - the DROP applies to any packets that exceed the sum of CIR and EIR in kB/s (400Mb/s + 200Mb/s = 75000kB/s) and a burst in excess of CBS and EBS (3000 + 2000 = 5000 Bytes)
+
+##EVC Deletion
+EVCs can be deleted individually with **ce-evc-remove <evc-id>** or all together with **ce-evc-remove-all**.
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/pom.xml b/drivers/microsemi/ea1000driver/pom.xml
new file mode 100644
index 0000000..28221a2
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/pom.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ~ Copyright 2016 Open Networking Laboratory ~ ~ 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>onos-drivers-microsemi</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.10.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>onos-drivers-microsemi-ea1000</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>Microsemi EA1000 device drivers for ONOS</description>
+    <url>http://www.microsemi.com</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <onos.version>1.10.0-SNAPSHOT</onos.version>
+        <onos.app.name>org.onosproject.drivers.microsemi</onos.app.name>
+        <onos.app.title>Microsemi Device Drivers</onos.app.title>
+        <onos.app.origin>Microsemi, Inc.</onos.app.origin>
+        <onos.app.category>Drivers</onos.app.category>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.readme>For various Microsemi Devices including EdgeAssure
+            1000 SFP-NID</onos.app.readme>
+        <onos.app.requires>org.onosproject.netconf</onos.app.requires>
+        <onos.app.requires>org.onosproject.drivers.netconf</onos.app.requires>
+        <onos.app.requires>org.onosproject.yms</onos.app.requires>
+        <onos.app.requires>org.onosproject.drivers.microsemi.yang</onos.app.requires>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-incubator-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-microsemi-ea1000yang</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-microsemi-ea1000yang</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms-api</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-netconf</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
new file mode 100644
index 0000000..3c593d6
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
@@ -0,0 +1,942 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.math.BigInteger;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Semaphore;
+import java.util.stream.Collectors;
+
+import org.onlab.packet.EthType;
+import org.onlab.packet.EthType.EtherType;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.VlanId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.drivers.microsemi.yang.UniSide;
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.flow.DefaultFlowEntry;
+import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowEntry.FlowEntryState;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleProgrammable;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.criteria.Criterion.Type;
+import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanHeaderInstruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction;
+import org.onosproject.net.meter.MeterId;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.DefaultSourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.DefaultInterfaceEth0;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.InterfaceEth0;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.DefaultSourceAddressRange;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.FilterAdminStateEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.VlanIdType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.DefaultFlowMapping;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.TagManipulation;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagOverwrite;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPop;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPush;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagOverwrite;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPop;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPush;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.tagpush.tagpush.PushTagTypeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.Profiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.Uni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.CustomEvc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.DefaultEvc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.Evc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.DefaultEvcPerUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.EvcPerUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnin;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnic.EvcPerUnicBuilder;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnin.EvcPerUninBuilder;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
+import org.slf4j.Logger;
+
+/**
+ * An implementation of the FlowRuleProgrammable behaviour for the EA10000 device.
+ *
+ * This device is not a native Open Flow device. It has only a NETCONF interface for configuration
+ * status retrieval and notifications. It supports only a small subset of OpenFlow rules.<br>
+ *
+ * The device supports only:<br>
+ * 1) Open flow rules that blocks certain IP address ranges, but only those incoming on Port 0
+ *    and has a limit of 10 such rules<br>
+ * 2) Open flow rules that PUSH, POP and OVERWRITE VLAN tags on both ports. This can push and overwrite
+ *    both C-TAGs (0x8100) and S-TAGs (0x88a8).
+ */
+public class EA1000FlowRuleProgrammable extends AbstractHandlerBehaviour implements FlowRuleProgrammable {
+
+    protected final Logger log = getLogger(getClass());
+    public static final String MICROSEMI_DRIVERS = "com.microsemi.drivers";
+    public static final int PRIORITY_DEFAULT = 50000;
+    //To protect the NETCONF session from concurrent access across flow addition and removal
+    static Semaphore sessionMutex = new Semaphore(1);
+
+    /**
+     * Get the flow entries that are present on the EA1000.
+     * Since the EA1000 does not have any 'real' flow entries these are retrieved from 2 configuration
+     * areas on the EA1000 NETCONF model - from SA filtering YANG model and from EVC UNI YANG model.<br>
+     * The flow entries must match exactly the FlowRule entries in the ONOS store. If they are not an
+     * exact match the device will be requested to remove those flows and the FlowRule will stay in a
+     * PENDING_ADD state.
+     * @return A collection of Flow Entries
+     */
+    @Override
+    public Collection<FlowEntry> getFlowEntries() {
+        Collection<FlowEntry> flowEntryCollection = new HashSet<FlowEntry>();
+
+        UniSideInterfaceAssignmentEnum portAssignment = UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST;
+        NetconfController controller = checkNotNull(handler().get(NetconfController.class));
+        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        CoreService coreService = checkNotNull(handler().get(CoreService.class));
+        ApplicationId appId = coreService.getAppId(MICROSEMI_DRIVERS);
+        MseaSaFilteringNetconfService mseaSaFilteringService =
+                (MseaSaFilteringNetconfService) checkNotNull(handler().get(MseaSaFilteringNetconfService.class));
+        MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc =
+                (MseaUniEvcServiceNetconfService) checkNotNull(handler().get(MseaUniEvcServiceNetconfService.class));
+        log.debug("getFlowEntries() called on EA1000FlowRuleProgrammable");
+
+        //First get the MseaSaFiltering rules
+        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
+                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
+
+        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
+                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
+        MseaSaFilteringOpParam mseaSaFilteringFilter =
+                (MseaSaFilteringOpParam) opBuilder
+                .sourceIpaddressFiltering(sipBuilder.build())
+                .build();
+        try {
+            MseaSaFiltering saFilteringCurrent =
+                    mseaSaFilteringService.getMseaSaFiltering(mseaSaFilteringFilter, session);
+            if (saFilteringCurrent != null) {
+                flowEntryCollection.addAll(
+                        convertSaFilteringToFlowRules(saFilteringCurrent, appId));
+            }
+        } catch (NetconfException e) {
+            log.warn("Unexpected error on getFlowEntries", e);
+        }
+
+
+        //Then get the EVCs - there will be a flow entry per EVC
+        Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+
+        MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
+        MefServices mefServices = mefBuilder.uni(uniBuilder.build()).build();
+
+        MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+                new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+        MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+                (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+        try {
+            MseaUniEvcService uniEvcCurrent =
+                    mseaUniEvcServiceSvc.getConfigMseaUniEvcService(mseaUniEvcServiceFilter,
+                            session, TargetConfig.RUNNING);
+
+            flowEntryCollection.addAll(
+                    convertEvcUniToFlowRules(uniEvcCurrent, portAssignment));
+
+        } catch (NetconfException e) {
+            log.warn("Unexpected error on getFlowEntries", e);
+        }
+
+
+        return flowEntryCollection;
+    }
+
+    /**
+     * Apply the flow entries to the EA1000.
+     * Since the EA1000 does not have any 'real' flow entries these are converted 2 configuration
+     * areas on the EA1000 NETCONF model - to SA filtering YANG model and to EVC UNI YANG model.<br>
+     * Only a subset of the possible OpenFlow rules are supported. Any rule that's not handled
+     * will not be in the returned set.
+     *
+     * @param rules A collection of Flow Rules to be applied to the EA1000
+     * @return A collection of the Flow Rules that have been added.
+     */
+    @Override
+    public Collection<FlowRule> applyFlowRules(Collection<FlowRule> rules) {
+        Collection<FlowRule> frAdded = new HashSet<FlowRule>();
+        if (rules == null || rules.size() == 0) {
+            return rules;
+        }
+        NetconfController controller = checkNotNull(handler().get(NetconfController.class));
+        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        MseaSaFilteringNetconfService mseaSaFilteringService =
+                (MseaSaFilteringNetconfService) checkNotNull(handler().get(MseaSaFilteringNetconfService.class));
+        MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc =
+                (MseaUniEvcServiceNetconfService) checkNotNull(handler().get(MseaUniEvcServiceNetconfService.class));
+        log.debug("applyFlowRules() called on EA1000FlowRuleProgrammable with {} rules.", rules.size());
+        // FIXME: Change this so it's dynamically driven
+        UniSideInterfaceAssignmentEnum portAssignment = UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST;
+
+        List<SourceAddressRange> saRangeList = new ArrayList<SourceAddressRange>();
+        Map<Integer, Evc> evcMap = new HashMap<>();
+
+        //Retrieve the list of actual EVCs and the CeVlanMaps from device
+        List<Evc> activeEvcs = new ArrayList<>();
+        try {
+            sessionMutex.acquire();
+            MseaUniEvcService evcResponse =
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
+            //There could be zero or more EVCs
+            if (evcResponse != null && evcResponse.mefServices() != null && evcResponse.mefServices().uni() != null) {
+                activeEvcs.addAll(evcResponse.mefServices().uni().evc());
+            }
+        } catch (NetconfException | InterruptedException e1) {
+            log.warn("Unexpected error on applyFlowRules", e1);
+        }
+
+        for (FlowRule fr : rules) {
+
+            // IP SA Filtering can only apply to Port 0 optics
+            if (fr.selector().getCriterion(Type.IPV4_SRC) != null &&
+                    fr.selector().getCriterion(Type.IN_PORT) != null &&
+                    ((PortCriterion) fr.selector().getCriterion(Type.IN_PORT)).port().toLong() == 0) {
+                parseFrForSaRange(frAdded, saRangeList, fr);
+
+            // EVCs will be defined by Flow Rules relating to VIDs
+            } else if (fr.selector().getCriterion(Type.VLAN_VID) != null &&
+                    fr.selector().getCriterion(Type.IN_PORT) != null) {
+                //There could be many Flow Rules for one EVC depending on the ceVlanMap
+                //Cannot build up the EVC until we know the details - the key is the tableID and port
+                parseFrForEvcs(frAdded, evcMap, activeEvcs, portAssignment, fr);
+            } else {
+                log.info("Unexpected Flow Rule type applied: " + fr);
+            }
+        }
+
+        //If there are IPv4 Flow Rules created commit them now through the
+        //MseaSaFiltering service
+        if (saRangeList.size() > 0) {
+            try {
+                mseaSaFilteringService.setMseaSaFiltering(
+                            buildSaFilteringObject(saRangeList), session, TargetConfig.RUNNING);
+            } catch (NetconfException e) {
+                log.error("Error applying Flow Rules to SA Filtering - will try again: " + e.getMessage());
+                sessionMutex.release();
+                return frAdded;
+            }
+        }
+        //If there are EVC flow rules then populate the MseaUniEvc part of EA1000
+        if (evcMap.size() > 0) {
+            List<Evc> evcList = evcMap.entrySet().stream()
+                    .map(x -> x.getValue())
+                    .collect(Collectors.toList());
+            Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+            URI deviceName = handler().data().deviceId().uri();
+            Uni uni = uniBuilder.name(new Identifier45("Uni-on-"
+                    + deviceName.getSchemeSpecificPart())).evc(evcList).build();
+
+            List<BwpGroup> bwpGroupList = new ArrayList<BwpGroup>();
+            BwpGroup.BwpGroupBuilder bwpGrpBuilder = new DefaultBwpGroup.BwpGroupBuilder();
+            bwpGroupList.add(bwpGrpBuilder.groupIndex((short) 0).build());
+            Profiles profiles = (new DefaultProfiles.ProfilesBuilder()).bwpGroup(bwpGroupList).build();
+
+            MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
+            MefServices mefServices = mefBuilder.uni(uni).profiles(profiles).build();
+
+            MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+                    new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+            MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+                    (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+            try {
+                mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+            } catch (NetconfException e) {
+                log.error("Error applying Flow Rules to EVC - will try again: " + e.getMessage());
+                sessionMutex.release();
+                return frAdded;
+            }
+        }
+        sessionMutex.release();
+        return frAdded;
+    }
+
+    /**
+     * Remove flow rules from the EA1000.
+     * Since the EA1000 does not have any 'real' flow entries these are converted 2 configuration
+     * areas on the EA1000 NETCONF model - to SA filtering YANG model and to EVC UNI YANG model.
+     *
+     * @param rulesToRemove A collection of Flow Rules to be removed to the EA1000
+     * @return A collection of the Flow Rules that have been removed.
+     */
+    @Override
+    public Collection<FlowRule> removeFlowRules(Collection<FlowRule> rulesToRemove) {
+        NetconfController controller = checkNotNull(handler().get(NetconfController.class));
+        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        MseaSaFilteringNetconfService mseaSaFilteringService =
+                (MseaSaFilteringNetconfService) checkNotNull(handler().get(MseaSaFilteringNetconfService.class));
+        MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc =
+                (MseaUniEvcServiceNetconfService) checkNotNull(handler().get(MseaUniEvcServiceNetconfService.class));
+        UniSideInterfaceAssignmentEnum portAssignment = UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST;
+        log.debug("removeFlowRules() called on EA1000FlowRuleProgrammable with {} rules.", rulesToRemove.size());
+
+        if (rulesToRemove.size() == 0) {
+            return rulesToRemove;
+        }
+
+        //Retrieve the list of actual EVCs and the CeVlanMaps from device
+        List<Evc> activeEvcs = new ArrayList<>();
+        try {
+            sessionMutex.acquire();
+            MseaUniEvcService evcResponse =
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
+            //There could be zero or more EVCs
+            if (evcResponse != null && evcResponse.mefServices() != null && evcResponse.mefServices().uni() != null) {
+                activeEvcs.addAll(evcResponse.mefServices().uni().evc());
+            }
+        } catch (NetconfException | InterruptedException e1) {
+            log.warn("Error on removeFlowRules.", e1);
+        }
+
+        List<SourceAddressRange> saRangeList = new ArrayList<SourceAddressRange>();
+        Map<Integer, String> ceVlanMapMap = new HashMap<>();
+        Map<Integer, List<Short>> flowIdMap = new HashMap<>();
+
+        Collection<FlowRule> rulesRemoved = new HashSet<FlowRule>();
+        for (FlowRule ruleToRemove : rulesToRemove) {
+            // IP SA Filtering can only apply to Port 0 optics
+            if (ruleToRemove.selector().getCriterion(Type.IPV4_SRC) != null &&
+                    ruleToRemove.selector().getCriterion(Type.IN_PORT) != null &&
+                    ((PortCriterion) ruleToRemove.selector().getCriterion(Type.IN_PORT)).port().toLong() == 0) {
+                SourceAddressRange.SourceAddressRangeBuilder saBuilder =
+                        new DefaultSourceAddressRange.SourceAddressRangeBuilder();
+                SourceAddressRange sar = saBuilder
+                        .rangeId((short) ruleToRemove.tableId())
+                        .yangSourceAddressRangeOpType(org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.
+                                edge.assure.msea.sa.filtering.rev20160412.MseaSaFiltering.OnosYangOpType.DELETE)
+                        .build();
+
+                rulesRemoved.add(ruleToRemove);
+                saRangeList.add(sar);
+
+            } else if (ruleToRemove.selector().getCriterion(Type.VLAN_VID) != null &&
+                    ruleToRemove.selector().getCriterion(Type.IN_PORT) != null) {
+                PortNumber portNumber = ((PortCriterion) ruleToRemove.selector().getCriterion(Type.IN_PORT)).port();
+                VlanId vlanId = ((VlanIdCriterion) ruleToRemove.selector().getCriterion(Type.VLAN_VID)).vlanId();
+                int evcId = ruleToRemove.tableId();
+                int evcKey = (evcId << 2) + (int) portNumber.toLong();
+                String activeCeVlanMap = "";
+                //If this is one of many VLANs belonging to an EVC then we should only remove this VLAN
+                // from the ceVlanMap and not the whole EVC
+                if (!ceVlanMapMap.containsKey(evcKey)) {
+                    for (Evc activeEvc:activeEvcs) {
+                        if (activeEvc.evcIndex() == evcId) {
+                            if (Ea1000Port.fromNum(portNumber.toLong()).nOrC(portAssignment) ==
+                                    UniSide.CUSTOMER) {
+                                activeCeVlanMap = activeEvc.evcPerUni().evcPerUnic().ceVlanMap().string();
+                            } else if (Ea1000Port.fromNum(portNumber.toLong()).nOrC(portAssignment) ==
+                                    UniSide.NETWORK) {
+                                activeCeVlanMap = activeEvc.evcPerUni().evcPerUnin().ceVlanMap().string();
+                            }
+                        }
+                    }
+                }
+
+                ceVlanMapMap.put(evcKey, CeVlanMapUtils.removeFromCeVlanMap(activeCeVlanMap, vlanId.id()));
+                if (!flowIdMap.containsKey(evcKey)) {
+                    flowIdMap.put(evcKey, new ArrayList<>());
+                }
+                flowIdMap.get(evcKey).add(vlanId.id());
+                rulesRemoved.add(ruleToRemove);
+
+            } else {
+                log.info("Unexpected Flow Rule type removal: " + ruleToRemove);
+            }
+        }
+
+        //If there are IPv4 Flow Rules created commit them now through the
+        //MseaSaFiltering service
+        if (saRangeList.size() > 0) {
+            try {
+                mseaSaFilteringService.setMseaSaFiltering(
+                        buildSaFilteringObject(saRangeList), session, TargetConfig.RUNNING);
+            } catch (NetconfException e) {
+                log.warn("Remove FlowRule on MseaSaFilteringService could not delete SARule - "
+                        + "it may already have been deleted: " + e.getMessage());
+            }
+        }
+
+        if (ceVlanMapMap.size() > 0) {
+            try {
+                mseaUniEvcServiceSvc.removeEvcUniFlowEntries(ceVlanMapMap, flowIdMap,
+                        session, TargetConfig.RUNNING, portAssignment);
+            } catch (NetconfException e) {
+                log.warn("Remove FlowRule on MseaUniEvcService could not delete EVC - "
+                        + "it may already have been deleted: " + e.getMessage());
+            }
+        }
+
+        sessionMutex.release();
+        return rulesRemoved;
+    }
+
+    /**
+     * An internal method for extracting one EVC from a list and returning its ceVlanMap.
+     *
+     * @param evcList - the list of known EVCs
+     * @param evcIndex - the index of the EVC we're looking for
+     * @param side - the side of the UNI
+     * @return - the CEVlanMap we're looking for
+     */
+    private String getCeVlanMapForIdxFromEvcList(List<Evc> evcList, long evcIndex, UniSide side) {
+        if (evcList != null && evcList.size() > 0) {
+            for (Evc evc:evcList) {
+                if (evc.evcIndex() == evcIndex && evc.evcPerUni() != null) {
+                    if (side == UniSide.CUSTOMER &&
+                        evc.evcPerUni().evcPerUnic() != null &&
+                        evc.evcPerUni().evcPerUnic().ceVlanMap() != null) {
+                        return evc.evcPerUni().evcPerUnic().ceVlanMap().string();
+                    } else if (side == UniSide.NETWORK &&
+                        evc.evcPerUni().evcPerUnin() != null &&
+                        evc.evcPerUni().evcPerUnin().ceVlanMap() != null) {
+                        return evc.evcPerUni().evcPerUnin().ceVlanMap().string();
+                    }
+                }
+            }
+        }
+
+        return ""; //The EVC required was not in the list
+    }
+
+    /**
+     * An internal method to convert from a FlowRule to SARange.
+     *
+     * @param frList A collection of flow rules
+     * @param saRangeList A list of SARanges
+     * @param fr A flow rule
+     */
+    private void parseFrForSaRange(Collection<FlowRule> frList, List<SourceAddressRange> saRangeList, FlowRule fr) {
+        String ipAddrStr = fr.selector().getCriterion(Type.IPV4_SRC).toString().substring(9);
+        log.debug("Applying IP address to " + ipAddrStr
+                + " (on Port 0) to IP SA Filtering on EA1000 through NETCONF");
+
+        SourceAddressRange.SourceAddressRangeBuilder saBuilder =
+                new DefaultSourceAddressRange.SourceAddressRangeBuilder();
+
+        SourceAddressRange sar = saBuilder
+                .rangeId((short) fr.tableId())
+                .name("Flow:" + fr.id().toString())
+                .ipv4AddressPrefix(ipAddrStr)
+                .build();
+
+        frList.add(fr);
+        saRangeList.add(sar);
+    }
+
+    private void parseFrForEvcs(Collection<FlowRule> frList, Map<Integer, Evc> evcMap,
+            List<Evc> activeEvcs, UniSideInterfaceAssignmentEnum portAssignment, FlowRule fr) {
+        //There could be many Flow Rules for one EVC depending on the ceVlanMap
+        //Cannot build up the EVC until we know the details - the key is the tableID and port
+        Ea1000Port port = Ea1000Port.fromNum(
+                ((PortCriterion) fr.selector().getCriterion(Type.IN_PORT)).port().toLong());
+        Integer evcKey = (fr.tableId() << 2) + port.portNum();
+        VlanId sourceVid = ((VlanIdCriterion) fr.selector().getCriterion(Type.VLAN_VID)).vlanId();
+        FlowMapping.FlowMappingBuilder fmBuilder =
+                DefaultFlowMapping.builder()
+                .ceVlanId(VlanIdType.of(sourceVid.id()))
+                .flowId(BigInteger.valueOf(fr.id().value()));
+        if (evcMap.containsKey(evcKey)) { //Is there an entry already for this EVC and port?
+            //Replace ceVlanMap
+            evcMap.put(evcKey, CustomEvc.builder(evcMap.get(evcKey))
+                    .addToCeVlanMap(new ServiceListType(sourceVid.toString()), port.nOrC(portAssignment))
+                    .addToFlowMapping(fmBuilder.build(), port.nOrC(portAssignment))
+                    .build());
+
+        } else if (evcMap.containsKey((evcKey ^ 1))) { //Is there an entry for this EVC but the opposite port?
+            TagManipulation tm = getTagManipulation(fr);
+            if (port.nOrC(portAssignment) == UniSide.NETWORK) {
+                EvcPerUnin epun = CustomEvcPerUnin.builder(evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin())
+                        .addToCeVlanMap(new ServiceListType(sourceVid.toString()))
+                        .tagManipulation(tm)
+                        .addToFlowMapping(fmBuilder.build())
+                        .ingressBwpGroupIndex(getMeterId(fr.treatment()))
+                        .build();
+                evcMap.put((evcKey ^ 1), CustomEvc.builder(evcMap.get((evcKey ^ 1))).addUniN(epun).build());
+            } else {
+                EvcPerUnic epuc = CustomEvcPerUnic.builder(evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic())
+                        .addToCeVlanMap(new ServiceListType(sourceVid.toString()))
+                        .tagManipulation(tm)
+                        .addToFlowMapping(fmBuilder.build())
+                        .ingressBwpGroupIndex(getMeterId(fr.treatment()))
+                        .build();
+                evcMap.put((evcKey ^ 1), CustomEvc.builder(evcMap.get((evcKey ^ 1))).addUniC(epuc).build());
+            }
+        } else {
+            Evc.EvcBuilder evcBuilder = new DefaultEvc.EvcBuilder();
+            EvcPerUninBuilder epunBuilder = new CustomEvcPerUnin.EvcPerUninBuilder();
+            EvcPerUnicBuilder epucBuilder = new CustomEvcPerUnic.EvcPerUnicBuilder();
+            TagManipulation tm = getTagManipulation(fr);
+
+            UniSide side = port.nOrC(portAssignment);
+            String oldCeVlanMap = getCeVlanMapForIdxFromEvcList(activeEvcs, fr.tableId(), side);
+            String newCeVlanMap =
+                    CeVlanMapUtils.addtoCeVlanMap(oldCeVlanMap, sourceVid.id());
+            String oppositeCeVlanMap =
+                    getCeVlanMapForIdxFromEvcList(activeEvcs, fr.tableId(),
+                            port.opposite().nOrC(portAssignment));
+            oppositeCeVlanMap = oppositeCeVlanMap.isEmpty() ? "0" : oppositeCeVlanMap;
+            if (side == UniSide.NETWORK) {
+                epunBuilder
+                    .ceVlanMap(new ServiceListType(newCeVlanMap))
+                    .tagManipulation(tm)
+                    .addToFlowMapping(fmBuilder.build())
+                    .ingressBwpGroupIndex(getMeterId(fr.treatment()));
+
+                epucBuilder.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+            } else {
+                epucBuilder
+                    .ceVlanMap(new ServiceListType(newCeVlanMap))
+                    .tagManipulation(tm)
+                    .addToFlowMapping(fmBuilder.build())
+                    .ingressBwpGroupIndex(getMeterId(fr.treatment()));
+
+                epunBuilder.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+            }
+
+            evcBuilder
+                    .evcIndex(fr.tableId())
+                    .name(new Identifier45("EVC-" + String.valueOf(fr.tableId())))
+                    .evcPerUni(new DefaultEvcPerUni.EvcPerUniBuilder()
+                            .evcPerUnin(epunBuilder.build())
+                            .evcPerUnic(epucBuilder.build())
+                            .build());
+            evcMap.put(evcKey, evcBuilder.build());
+        }
+
+        frList.add(fr);
+    }
+
+
+    private MseaSaFilteringOpParam buildSaFilteringObject(List<SourceAddressRange> saRangeList) {
+        InterfaceEth0.InterfaceEth0Builder ifBuilder = new DefaultInterfaceEth0.InterfaceEth0Builder();
+        for (SourceAddressRange sa:saRangeList) {
+            ifBuilder = ifBuilder.addToSourceAddressRange(sa);
+        }
+        InterfaceEth0 saIf = ifBuilder.filterAdminState(FilterAdminStateEnum.BLACKLIST).build();
+
+        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder saFilterBuilder =
+                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
+        SourceIpaddressFiltering saFilter = saFilterBuilder.interfaceEth0(saIf).build();
+
+        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
+                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
+        MseaSaFilteringOpParam mseaSaFiltering =
+                (MseaSaFilteringOpParam) opBuilder.sourceIpaddressFiltering(saFilter).build();
+
+        return mseaSaFiltering;
+    }
+
+    private Collection<FlowEntry> convertSaFilteringToFlowRules(
+            MseaSaFiltering saFilteringCurrent, ApplicationId appId) {
+        Collection<FlowEntry> flowEntryCollection = new HashSet<FlowEntry>();
+
+        List<SourceAddressRange> saRangelist =
+                saFilteringCurrent.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
+        Criterion matchInPort = Criteria.matchInPort(PortNumber.portNumber(0));
+        TrafficSelector.Builder tsBuilder = DefaultTrafficSelector.builder();
+
+        for (SourceAddressRange sa:saRangelist) {
+            Criterion matchIpSrc = Criteria.matchIPSrc(IpPrefix.valueOf(sa.ipv4AddressPrefix()));
+
+            TrafficSelector selector = tsBuilder.add(matchIpSrc).add(matchInPort).build();
+
+            TrafficTreatment.Builder trBuilder = DefaultTrafficTreatment.builder();
+            TrafficTreatment treatment = trBuilder.drop().build();
+
+            FlowRule.Builder feBuilder = new DefaultFlowRule.Builder();
+            if (sa.name() != null && sa.name().startsWith("Flow:")) {
+                String[] nameParts = sa.name().split(":");
+                Long cookie = Long.valueOf(nameParts[1], 16);
+                feBuilder = feBuilder.withCookie(cookie);
+            } else {
+                feBuilder = feBuilder.fromApp(appId);
+            }
+
+            FlowRule fr = feBuilder
+                .forDevice(handler().data().deviceId())
+                .withSelector(selector)
+                .withTreatment(treatment)
+                .forTable(sa.rangeId())
+                .makePermanent()
+                .withPriority(PRIORITY_DEFAULT)
+                .build();
+
+            flowEntryCollection.add(new DefaultFlowEntry(fr, FlowEntryState.ADDED, 0, 0, 0));
+        }
+
+        return flowEntryCollection;
+    }
+
+
+    private Collection<FlowEntry> convertEvcUniToFlowRules(
+            MseaUniEvcService uniEvcCurrent, UniSideInterfaceAssignmentEnum portAssignment) {
+        Collection<FlowEntry> flowEntryCollection = new HashSet<FlowEntry>();
+
+        if (uniEvcCurrent == null || uniEvcCurrent.mefServices() == null ||
+                uniEvcCurrent.mefServices().uni() == null || uniEvcCurrent.mefServices().uni().evc() == null) {
+            log.info("No EVC's found when getting flow rules");
+            return flowEntryCollection;
+        }
+
+        for (Evc evc:uniEvcCurrent.mefServices().uni().evc()) {
+            FlowRule.Builder frBuilder = new DefaultFlowRule.Builder();
+            TrafficSelector.Builder tsBuilder = DefaultTrafficSelector.builder();
+
+            TrafficTreatment uniNTreatment = treatmentForUniSde(evc.evcPerUni(), true);
+            //Depending on the ceVlanMap there may be multiple VLans and hence multiple flow entries
+            Short[] vlanIdsUniN =
+                    CeVlanMapUtils.getVlanSet(ceVlanMapForUniSide(evc.evcPerUni(), true));
+            for (Short vlanId:vlanIdsUniN) {
+                if (vlanId == 0) {
+                    continue;
+                }
+                Criterion uniNportCriterion = criterionPortForUniSide(portAssignment, true);
+                TrafficSelector tsUniN = tsBuilder.matchVlanId(VlanId.vlanId(vlanId)).add(uniNportCriterion).build();
+                long flowId = getFlowIdForVlan(evc.evcPerUni().evcPerUnin().flowMapping(), vlanId);
+
+                FlowRule frUniN = frBuilder
+                    .forDevice(handler().data().deviceId())
+                    .withSelector(tsUniN)
+                    .withTreatment(uniNTreatment)
+                    .forTable(new Long(evc.evcIndex()).intValue()) //narrowing to int
+                    .makePermanent()
+                    .withPriority(PRIORITY_DEFAULT)
+                    .withCookie(flowId)
+                    .build();
+                flowEntryCollection.add(new DefaultFlowEntry(frUniN, FlowEntryState.ADDED, 0, 0, 0));
+            }
+
+            TrafficTreatment uniCTreatment = treatmentForUniSde(evc.evcPerUni(), false);
+            //Depending on the ceVlanMap there may be multiple VLans and hence multiple flow entries
+            Short[] vlanIdsUniC =
+                    CeVlanMapUtils.getVlanSet(ceVlanMapForUniSide(evc.evcPerUni(), false));
+            if (vlanIdsUniC != null && vlanIdsUniC.length > 0) {
+                for (Short vlanId:vlanIdsUniC) {
+                    if (vlanId == 0) {
+                        continue;
+                    }
+                    Criterion uniCportCriterion = criterionPortForUniSide(portAssignment, false);
+                    TrafficSelector tsUniC =
+                            tsBuilder.matchVlanId(VlanId.vlanId(vlanId)).add(uniCportCriterion).build();
+                    long flowId = getFlowIdForVlan(evc.evcPerUni().evcPerUnic().flowMapping(), vlanId);
+
+                    FlowRule frUniC = frBuilder
+                            .forDevice(handler().data().deviceId())
+                            .withSelector(tsUniC)
+                            .withTreatment(uniCTreatment)
+                            .forTable(new Long(evc.evcIndex()).intValue()) //narrowing to int
+                            .makePermanent()
+                            .withPriority(PRIORITY_DEFAULT)
+                            .withCookie(flowId)
+                            .build();
+                    flowEntryCollection.add(new DefaultFlowEntry(frUniC, FlowEntryState.ADDED, 0, 0, 0));
+                }
+            }
+        }
+
+        return flowEntryCollection;
+    }
+
+    private long getFlowIdForVlan(List<FlowMapping> fmList, Short vlanId) {
+        if (fmList == null || vlanId == null) {
+            log.warn("Flow Mapping list is null when reading EVCs");
+            return -1L;
+        }
+        for (FlowMapping fm:fmList) {
+            if (fm.ceVlanId().uint16() == vlanId.intValue()) {
+                return fm.flowId().longValue();
+            }
+        }
+        return 0L;
+    }
+
+    private String ceVlanMapForUniSide(
+            EvcPerUni evcPerUni, boolean portN) {
+        if (portN) {
+            return evcPerUni.evcPerUnin().ceVlanMap().string();
+        } else {
+            return evcPerUni.evcPerUnic().ceVlanMap().string();
+        }
+    }
+
+    private Criterion criterionPortForUniSide(
+            UniSideInterfaceAssignmentEnum portAssignment, boolean portN) {
+        boolean cOnOptics = (portAssignment == UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS);
+        int portNum = ((cOnOptics && portN) || (!cOnOptics && !portN)) ? 1 : 0;
+        return Criteria.matchInPort(PortNumber.portNumber(portNum));
+    }
+
+    private TrafficTreatment treatmentForUniSde(
+            EvcPerUni evcPerUni, boolean portN) {
+        TrafficTreatment.Builder trBuilder = DefaultTrafficTreatment.builder();
+
+        TagManipulation tm = null;
+        short meterId = 0;
+        if (portN) {
+            tm = evcPerUni.evcPerUnin().tagManipulation();
+            meterId = (short) evcPerUni.evcPerUnin().ingressBwpGroupIndex();
+        } else {
+            tm = evcPerUni.evcPerUnic().tagManipulation();
+            meterId = (short) evcPerUni.evcPerUnic().ingressBwpGroupIndex();
+        }
+
+        if (meterId > 0L) {
+            trBuilder = trBuilder.meter(MeterId.meterId((long) meterId));
+//            trBuilder = trBuilder.meter(MeterId.meterId(meterId)).transition(0);
+        }
+
+        if (tm == null) {
+            return trBuilder.build(); //no tag manipulation found
+        }
+
+        if (tm.getClass().equals(DefaultTagPush.class)) {
+            VlanId pushVlanNum = VlanId.vlanId((short) ((TagPush) tm).tagPush().outerTagVlan().uint16());
+            PushTagTypeEnum pushTagType = ((TagPush) tm).tagPush().pushTagType();
+            //Note - the order of elements below MUST match the order of the Treatment in the stored FlowRule
+            // to be an exactMatch. See DefaultFlowRule.exactMatch()
+            trBuilder = trBuilder
+                    .pushVlan(pushTagType.equals(PushTagTypeEnum.PUSHCTAG) ?
+                            EtherType.VLAN.ethType() : EtherType.QINQ.ethType())
+                    .setVlanId(pushVlanNum).transition(Integer.valueOf(0));
+
+        } else if (tm.getClass().equals(DefaultTagPop.class)) {
+            trBuilder = trBuilder.popVlan();
+
+        } else if (tm.getClass().equals(DefaultTagOverwrite.class)) {
+            TagOverwrite to = (TagOverwrite) tm;
+            VlanId ovrVlanNum = VlanId
+                    .vlanId((short) (
+                            //There are 2 classes TagOverwrite - the other one is already imported
+                            to
+                            .tagOverwrite()
+                            .outerTagVlan()
+                            .uint16()));
+            trBuilder = trBuilder.setVlanId(ovrVlanNum);
+
+        }
+
+        return trBuilder.build();
+    }
+
+    private static TagManipulation getTagManipulation(FlowRule fr) {
+        boolean isPop = false;
+        boolean isPush = false;
+        VlanId vlanId = null;
+        EthType ethType = EtherType.VLAN.ethType(); //Default
+        for (Instruction inst:fr.treatment().allInstructions()) {
+            if (inst.type() == Instruction.Type.L2MODIFICATION) {
+                L2ModificationInstruction l2Mod = (L2ModificationInstruction) inst;
+                if (l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_POP) {
+                    isPop = true;
+                } else if (l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_PUSH) {
+                    isPush = true;
+                    ethType = ((ModVlanHeaderInstruction) l2Mod).ethernetType();
+                } else if (l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_ID) {
+                    vlanId = ((ModVlanIdInstruction) l2Mod).vlanId();
+                }
+            }
+        }
+
+        if (isPop) {
+            //The should be no vlanId in this case
+            TagPop.TagPopBuilder popBuilder = new DefaultTagPop.TagPopBuilder();
+            org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc
+                .service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation
+                .tagpop.TagPop.TagPopBuilder popInnerBuilder =
+                    new org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea
+                        .uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagpop.DefaultTagPop.TagPopBuilder();
+            return popBuilder
+                    .tagPop(popInnerBuilder.build())
+                    .build();
+
+        } else if (isPush && vlanId != null) {
+            TagPush.TagPushBuilder pushBuilder = new DefaultTagPush.TagPushBuilder();
+            org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc
+                .service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation
+                .tagpush.TagPush.TagPushBuilder pushInnerBuilder =
+                    new org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea
+                        .uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagpush.DefaultTagPush.TagPushBuilder();
+            return pushBuilder
+                .tagPush(pushInnerBuilder
+                        .outerTagVlan(new VlanIdType(vlanId.id()))
+                        .pushTagType(ethType.equals(EtherType.VLAN.ethType()) ?
+                                PushTagTypeEnum.PUSHCTAG : PushTagTypeEnum.PUSHSTAG)
+                        .build())
+                .build();
+
+        } else if (vlanId != null) { //This is overwrite, as it has vlanId, but not push or pop
+            TagOverwrite.TagOverwriteBuilder ovrBuilder = new DefaultTagOverwrite.TagOverwriteBuilder();
+            org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc
+                .service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation
+                .tagoverwrite.TagOverwrite.TagOverwriteBuilder ovrInnerBuilder =
+                    new org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea
+                        .uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagoverwrite.DefaultTagOverwrite.TagOverwriteBuilder();
+            return ovrBuilder.
+                    tagOverwrite(ovrInnerBuilder
+                            .outerTagVlan(new VlanIdType(vlanId.id()))
+                            .build())
+                    .build();
+        }
+
+        return null;
+    }
+
+    private static long getMeterId(TrafficTreatment treatment) {
+        return (treatment.metered() != null && treatment.metered().meterId() != null)
+                ? treatment.metered().meterId().id() : 0L;
+    }
+
+    /**
+     * An enumerated type that characterises the 2 port layout of the EA1000 device.
+     * The device is in an SFP package and has only 2 ports, the HOST port which
+     * plugs in to the chassis (Port 1) and the Optics Port on the rear (Port 0).
+     */
+    public enum Ea1000Port {
+        HOST(1),
+        OPTICS(0);
+
+        private int num = 0;
+        private Ea1000Port(int num) {
+            this.num = num;
+        }
+
+        /**
+         * The numerical assignment of this port.
+         * @return The port number
+         */
+        public int portNum() {
+            return num;
+        }
+
+        /**
+         * Return the enumerated value from a port number.
+         * @param num The port number
+         * @return An enumerated value
+         */
+        public static Ea1000Port fromNum(long num) {
+            for (Ea1000Port a:Ea1000Port.values()) {
+                if (a.num == num) {
+                    return a;
+                }
+            }
+            return HOST;
+        }
+
+        /**
+         * Get the port that the UNI-N is present on.
+         * @param side The assignment of UNI-side to port
+         * @return An enumerated value
+         */
+        public static Ea1000Port uniNNum(UniSideInterfaceAssignmentEnum side) {
+            if (side.equals(UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST)) {
+                return OPTICS;
+            } else {
+                return HOST;
+            }
+        }
+
+        /**
+         * Get the port that the UNI-C is present on.
+         * @param side The assignment of UNI-side to port
+         * @return An enumerated value
+         */
+        public static Ea1000Port uniCNum(UniSideInterfaceAssignmentEnum side) {
+            if (side.equals(UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST)) {
+                return HOST;
+            } else {
+                return OPTICS;
+            }
+        }
+
+        /**
+         * Get the port opposite the current port.
+         * @return An enumerated value for the opposite side
+         */
+        public Ea1000Port opposite() {
+            if (this.equals(HOST)) {
+                return OPTICS;
+            } else {
+                return HOST;
+            }
+        }
+
+        /**
+         * Evaluate which side of the UNI on the EA1000 device this port refers to.
+         * @param side The assignment of UNI-side to port
+         * @return An enumerated value representing the UniSide
+         */
+        public UniSide nOrC(UniSideInterfaceAssignmentEnum side) {
+            if ((this == HOST && side == UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST) ||
+                    (this == OPTICS && side == UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS)) {
+                return UniSide.CUSTOMER;
+            } else {
+                return UniSide.NETWORK;
+            }
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
new file mode 100644
index 0000000..2ecc70f
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.drivers.microsemi;
+
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.core.CoreService;
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.Meter.Unit;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterOperations;
+import org.onosproject.net.meter.MeterProvider;
+import org.onosproject.net.meter.MeterProviderRegistry;
+import org.onosproject.net.meter.MeterProviderService;
+import org.onosproject.net.provider.AbstractProvider;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.CosColorType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.PriorityType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.coscolortype.CosColorTypeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService.OnosYangOpType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles.ProfilesBuilder;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.Cos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultCos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.Bwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.DefaultBwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.DefaultEvcCosTypeEvcColorId;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.DefaultEvcCosTypeAll8PrioTo1EvcColor;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.EvcCosTypeAll8PrioTo1EvcColor;
+import org.slf4j.Logger;
+
+/**
+ * Provider which uses an NETCONF controller to handle meters.
+ */
+@Component(immediate = true, enabled = true)
+public class EA1000MeterProvider extends AbstractProvider implements MeterProvider {
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfController controller;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MeterProviderRegistry providerRegistry;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc;
+
+    private MeterProviderService providerService;
+
+    private static final int COS_INDEX_1 = 1;
+    private static final short DEFAULT_OUTGOING_PRIO = 3;
+
+    /**
+     * Creates a OpenFlow meter provider.
+     */
+    public EA1000MeterProvider() {
+        super(new ProviderId("netconf", "org.onosproject.provider.meter.microsemi"));
+    }
+
+    @Activate
+    public void activate() {
+        providerService = providerRegistry.register(this);
+
+    }
+
+    @Deactivate
+    public void deactivate() {
+        providerRegistry.unregister(this);
+
+        providerService = null;
+    }
+
+    @Override
+    public void performMeterOperation(DeviceId deviceId, MeterOperations meterOps) {
+        log.debug("Adding meterOps to Microsemi Meter Store");
+    }
+
+    @Override
+    public void performMeterOperation(DeviceId deviceId, MeterOperation meterOp) {
+        if (meterOp == null || deviceId == null) {
+            log.warn("Missing argument for performMeterOperation()");
+            return;
+        }
+        log.debug("{} meterOp {} to Microsemi Meter Store", meterOp.type(), meterOp);
+
+        long meterId = meterOp.meter().id().id();
+        String deviceName = deviceId.uri().getSchemeSpecificPart();
+        Unit unit = meterOp.meter().unit();
+
+        ProfilesBuilder profilesBuilder = DefaultProfiles.builder();
+        if (meterOp.type() == MeterOperation.Type.ADD || meterOp.type() == MeterOperation.Type.MODIFY) {
+            Bwp.BwpBuilder bwpBuilder = DefaultBwp.builder()
+                    .cosIndex(COS_INDEX_1)
+                    .name("BWP-" + String.valueOf(meterId) + "-" + deviceName);
+
+            long cirRateKbps = 0L;
+            long cbsRateKbps = 0L;
+            long eirRateKbps = 0L;
+            long ebsRateKbps = 0L;
+            for (Band band:meterOp.meter().bands()) {
+                if (band.type() == Band.Type.REMARK) {
+                    //This relates to CIR/CBS
+                    cirRateKbps = toBitsPerSec(band.rate(), unit);
+                    cbsRateKbps = band.burst(); //Already in kbps
+                } else if (band.type() == Band.Type.DROP) {
+                    //This relates to EIR/EBS
+                    eirRateKbps = toBitsPerSec(band.rate(), unit);
+                    ebsRateKbps = band.burst(); //Already in kbps
+                }
+            }
+            bwpBuilder.committedInformationRate(cirRateKbps).excessInformationRate(eirRateKbps - cirRateKbps);
+            if (meterOp.meter().isBurst()) {
+                bwpBuilder.committedBurstSize(cbsRateKbps).excessBurstSize(ebsRateKbps - cbsRateKbps);
+            }
+
+            BwpGroup.BwpGroupBuilder bwpgBuilder =
+                    DefaultBwpGroup.builder()
+                    .groupIndex((short) meterId)
+                    .addToBwp(bwpBuilder.build());
+
+            //Create cos-1 as referenced above - we only support 1 at the moment
+            Cos.CosBuilder cosBuilder = DefaultCos.builder()
+                    .cosIndex(COS_INDEX_1)
+                    .name("COS-1")
+                    .outgoingCosValue(PriorityType.of(DEFAULT_OUTGOING_PRIO))
+                    .colorAware(true)
+                    .colorForward(true);
+            EvcCosTypeAll8PrioTo1EvcColor ect =
+                    DefaultEvcCosTypeAll8PrioTo1EvcColor.builder()
+                        .evcAll8ColorTo(CosColorType.of(CosColorTypeEnum.GREEN)).build();
+            profilesBuilder
+                    .addToBwpGroup(bwpgBuilder.build())
+                    .addToCos(cosBuilder.cosTypeChoice(
+                                    DefaultEvcCosTypeEvcColorId.builder()
+                                    .evcCosTypeAll8PrioTo1EvcColor(ect).build()).build())
+                    .build();
+        } else if (meterOp.type() == MeterOperation.Type.REMOVE) {
+            BwpGroup.BwpGroupBuilder bwpgBuilder =
+                    DefaultBwpGroup.builder()
+                    .groupIndex((short) meterId)
+                    .yangBwpGroupOpType(OnosYangOpType.DELETE);
+
+            profilesBuilder.addToBwpGroup(bwpgBuilder.build()).build();
+        }
+
+        MefServices mefServices = DefaultMefServices.builder().profiles(profilesBuilder.build()).build();
+
+        MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+                new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+        MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+                (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+        NetconfSession session = controller.getDevicesMap().get(deviceId).getSession();
+        try {
+            mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+        } catch (NetconfException e) {
+            //This can fail if the BWP Group is deleted before the EVC that is dependent on it
+            //The delete of the EVC will be called on a separate thread to that should proceed
+            //within a few seconds after which we should try again
+            AtomicInteger retry = new AtomicInteger(4);
+            if (meterOp.type() == MeterOperation.Type.REMOVE &&
+                    e.getMessage().startsWith("Failed to run edit-config through NETCONF")) {
+                while (retry.getAndDecrement() > 0) {
+                    try {
+                        Thread.sleep(1000L);
+                        log.debug("Retrying deletion of Bandwith Profile Group {}", String.valueOf(meterId));
+                        mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter,
+                                session, TargetConfig.RUNNING);
+                        return; //If it did not throw an exception
+                    } catch (InterruptedException e1) {
+                        // TODO Auto-generated catch block
+                        e1.printStackTrace();
+                    } catch (NetconfException e1) {
+                        log.debug("NETCONF failed to delete profile - trying again in 1 sec");
+                        e1.printStackTrace();
+                    }
+                }
+                log.error("Error deleting BWPGroup {} from {} after 4 tries: {}", meterId, deviceId, e.getMessage());
+            } else {
+                log.error("Error adding BWPGroup {} from {}: {}", meterId, deviceId, e.getMessage());
+                throw new UnsupportedOperationException(e);
+            }
+            e.printStackTrace();
+        }
+    }
+
+    private static long toBitsPerSec(long rate, Unit unit) {
+        if (unit == Unit.KB_PER_SEC) {
+            return rate * 8;
+        } else {
+            return -1;
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java
new file mode 100644
index 0000000..308bdff
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.onlab.osgi.ServiceDirectory;
+import org.onosproject.drivers.microsemi.EA1000FlowRuleProgrammable.Ea1000Port;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.NextGroup;
+import org.onosproject.net.behaviour.Pipeliner;
+import org.onosproject.net.behaviour.PipelinerContext;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.FlowRuleOperations;
+import org.onosproject.net.flow.FlowRuleOperationsContext;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.criteria.Criterion.Type;
+import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction;
+import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction;
+import org.onosproject.net.flowobjective.FilteringObjective;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.flowobjective.NextObjective;
+import org.onosproject.net.flowobjective.Objective;
+import org.onosproject.net.flowobjective.ObjectiveError;
+import org.slf4j.Logger;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.RemovalCause;
+import com.google.common.cache.RemovalNotification;
+
+/**
+ * Support for FlowObjectives in the EA1000.
+ *
+ * Used with the CarrierEthernet App
+ *
+ */
+public class EA1000Pipeliner extends AbstractHandlerBehaviour implements Pipeliner {
+
+    protected final Logger log = getLogger(getClass());
+    protected ServiceDirectory serviceDirectory;
+    protected FlowRuleService flowRuleService;
+    protected DeviceId deviceId;
+    protected Cache<Integer, NextObjective> pendingNext;
+    protected Integer evcIdBase = 1;
+
+    @Override
+    public void init(DeviceId deviceId, PipelinerContext context) {
+        this.serviceDirectory = context.directory();
+        this.deviceId = deviceId;
+
+        flowRuleService = serviceDirectory.get(FlowRuleService.class);
+
+        pendingNext = CacheBuilder.newBuilder()
+                .expireAfterWrite(20, TimeUnit.SECONDS)
+                .removalListener((RemovalNotification<Integer, NextObjective> notification) -> {
+                    if (notification.getCause() == RemovalCause.EXPIRED) {
+                        notification.getValue().context()
+                                .ifPresent(c -> c.onError(notification.getValue(),
+                                        ObjectiveError.FLOWINSTALLATIONFAILED));
+                    }
+                }).build();
+
+        log.debug("Loaded handler behaviour EA1000Pipeliner for " + handler().data().deviceId().uri());
+    }
+
+    @Override
+    public void filter(FilteringObjective filterObjective) {
+        TrafficTreatment.Builder actions;
+        boolean oppositePort = false;
+        int evcId = -1;
+        switch (filterObjective.type()) {
+            case PERMIT:
+                if (filterObjective.meta() == null) {
+                    actions = DefaultTrafficTreatment.builder().add(Instructions.popVlan());
+                } else {
+                    oppositePort = true; //Experimental - push happens on the opposite port
+                    actions = DefaultTrafficTreatment.builder(filterObjective.meta());
+                    if (filterObjective.meta().metered() != null) {
+                        actions.meter(filterObjective.meta().metered().meterId());
+                    }
+                    actions.transition(0);
+                    boolean isPush = false;
+                    int vid = 0;
+                    for (Instruction inst:filterObjective.meta().immediate()) {
+                        if (inst.type() == Instruction.Type.L2MODIFICATION) {
+                            L2ModificationInstruction l2mod = (L2ModificationInstruction) inst;
+                            if (l2mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_PUSH) {
+                                isPush = true;
+                            } else if (l2mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_ID) {
+                                vid = ((ModVlanIdInstruction) l2mod).vlanId().id();
+                            }
+                        }
+                    }
+                    if (isPush && vid > 0) {
+                        evcId = vid;
+                    }
+                }
+                break;
+            case DENY:
+                actions = (filterObjective.meta() == null) ?
+                        DefaultTrafficTreatment.builder() :
+                        DefaultTrafficTreatment.builder(filterObjective.meta());
+                actions.drop();
+                break;
+            default:
+                log.warn("Unknown filter type: {}", filterObjective.type());
+                actions = DefaultTrafficTreatment.builder().drop();
+        }
+
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+
+        for (Criterion c:filterObjective.conditions()) {
+            if (c.type() == Type.VLAN_VID && evcId == -1) {
+                evcId = ((VlanIdCriterion) c).vlanId().id();
+            }
+            selector.add(c);
+        }
+
+        if (filterObjective.key() != null) {
+            if (oppositePort) {
+                //Experimental
+                Ea1000Port port = Ea1000Port.fromNum(((PortCriterion) filterObjective.key()).port().toLong());
+                selector.matchInPort(PortNumber.portNumber(port.opposite().portNum()));
+            } else {
+                selector.add(filterObjective.key());
+            }
+        }
+
+        FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
+                .forDevice(deviceId)
+                .withSelector(selector.build())
+                .withTreatment(actions.build())
+                .fromApp(filterObjective.appId())
+                .forTable(evcId)
+                .withPriority(filterObjective.priority());
+
+        if (filterObjective.permanent()) {
+            ruleBuilder.makePermanent();
+        } else {
+            ruleBuilder.makeTemporary(filterObjective.timeout());
+        }
+
+        installObjective(ruleBuilder, filterObjective);
+
+        log.debug("filter() of EA1000Pipeliner called for "
+                + handler().data().deviceId().uri()
+                + ". Objective: " + filterObjective);
+    }
+
+    @Override
+    public void forward(ForwardingObjective forwardObjective) {
+        TrafficSelector selector = forwardObjective.selector();
+
+        if (forwardObjective.treatment() != null) {
+            List<Instruction> instructions = forwardObjective.treatment().immediate();
+            if (instructions != null && instructions.size() == 1
+                    && instructions.get(0).type() == Instruction.Type.OUTPUT
+                    && ((OutputInstruction) instructions.get(0)).port() == PortNumber.CONTROLLER) {
+                Set<Criterion> criteria = forwardObjective.selector().criteria();
+                log.info("EA1000 does not yet implement forwarding to CONTROLLER for flow objective for: "
+                        + handler().data().deviceId().uri()
+                        + ". "
+                        + forwardObjective);
+                return;
+            } else {
+                FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
+                        .forDevice(deviceId)
+                        .withSelector(selector)
+                        .fromApp(forwardObjective.appId())
+                        .withPriority(forwardObjective.priority())
+                        .withTreatment(forwardObjective.treatment());
+
+                if (forwardObjective.permanent()) {
+                    ruleBuilder.makePermanent();
+                } else {
+                    ruleBuilder.makeTemporary(forwardObjective.timeout());
+                }
+                installObjective(ruleBuilder, forwardObjective);
+            }
+        } else {
+            NextObjective nextObjective = pendingNext.getIfPresent(forwardObjective.nextId());
+            if (nextObjective != null) {
+                pendingNext.invalidate(forwardObjective.nextId());
+                nextObjective.next().forEach(treat -> {
+                    FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
+                            .forDevice(deviceId)
+                            .withSelector(selector)
+                            .fromApp(forwardObjective.appId())
+                            .withPriority(forwardObjective.priority())
+                            .withTreatment(treat);
+
+                    if (forwardObjective.permanent()) {
+                        ruleBuilder.makePermanent();
+                    } else {
+                        ruleBuilder.makeTemporary(forwardObjective.timeout());
+                    }
+                    installObjective(ruleBuilder, forwardObjective);
+                });
+            } else {
+                forwardObjective.context().ifPresent(c -> c.onError(forwardObjective,
+                        ObjectiveError.GROUPMISSING));
+            }
+        }
+        log.debug("EA1000: Unhandled Forwarding Objective for: "
+                + handler().data().deviceId().uri()
+                + ". "
+                + forwardObjective);
+    }
+
+    @Override
+    public void next(NextObjective nextObjective) {
+        pendingNext.put(nextObjective.id(), nextObjective);
+        nextObjective.context().ifPresent(context -> context.onSuccess(nextObjective));
+
+        log.debug("next() of EA1000Pipeliner called for "
+                + handler().data().deviceId().uri()
+                + ". Objective: " + nextObjective);
+    }
+
+    @Override
+    public List<String> getNextMappings(NextGroup nextGroup) {
+        log.debug("getNextMappings() of EA1000Pipeliner called for "
+                + handler().data().deviceId().uri()
+                + ". Objective: " + nextGroup);
+        return new ArrayList<String>();
+    }
+
+    protected void installObjective(FlowRule.Builder ruleBuilder, Objective objective) {
+        FlowRuleOperations.Builder flowBuilder = FlowRuleOperations.builder();
+        switch (objective.op()) {
+
+            case ADD:
+                flowBuilder.add(ruleBuilder.build());
+                break;
+            case REMOVE:
+                flowBuilder.remove(ruleBuilder.build());
+                break;
+            default:
+                log.warn("Unknown operation {}", objective.op());
+        }
+
+        flowRuleService.apply(flowBuilder.build(new FlowRuleOperationsContext() {
+            @Override
+            public void onSuccess(FlowRuleOperations ops) {
+                objective.context().ifPresent(context -> context.onSuccess(objective));
+            }
+
+            @Override
+            public void onError(FlowRuleOperations ops) {
+                objective.context()
+                        .ifPresent(context -> context.onError(objective, ObjectiveError.FLOWINSTALLATIONFAILED));
+            }
+        }));
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
new file mode 100644
index 0000000..ec43833
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onlab.packet.ChassisId;
+import org.onosproject.drivers.microsemi.yang.IetfSystemNetconfService;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DefaultPortDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.system.AugmentedSysSystem;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.systemstate.platform.AugmentedSysPlatform;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DateAndTime;
+import org.slf4j.Logger;
+
+public class Ea1000DeviceDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
+
+    private String serialNumber = "unavailable";
+    private String swVersion = "unavailable";
+    private String longitudeStr = null;
+    private String latitudeStr = null;
+    private final Logger log = getLogger(getClass());
+
+    public Ea1000DeviceDescription() {
+        log.info("Loaded handler behaviour Ea1000DeviceDescription.");
+    }
+
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        log.info("Adding description for EA1000 device");
+
+        NetconfController controller = checkNotNull(handler().get(NetconfController.class));
+        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        IetfSystemNetconfService ietfSystemService =
+                (IetfSystemNetconfService) checkNotNull(handler().get(IetfSystemNetconfService.class));
+
+        try {
+            IetfSystem system = ietfSystemService.getIetfSystemInit(session);
+            if (system != null && system.systemState() != null) {
+                swVersion = system.systemState().platform().osRelease();
+                AugmentedSysPlatform augmentedSysPlatform =
+                        (AugmentedSysPlatform) system.systemState()
+                        .platform().yangAugmentedInfo(AugmentedSysPlatform.class);
+                serialNumber = augmentedSysPlatform.deviceIdentification().serialNumber();
+                DateAndTime deviceDateAndTime = system.systemState().clock().currentDatetime();
+                OffsetDateTime odt =
+                        OffsetDateTime.parse(deviceDateAndTime.string(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+                if (odt.getYear() < OffsetDateTime.now(ZoneId.of("UTC")).getYear()) {
+                    OffsetDateTime nowUtc = OffsetDateTime.now(ZoneId.of("UTC"));
+                    log.warn("Date on device is in the past: {}. Setting it to {}", odt.toString(), nowUtc);
+                    ietfSystemService.setCurrentDatetime(nowUtc, session);
+                }
+            }
+
+            if (system != null && system.system() != null) {
+                AugmentedSysSystem augmentedSystem =
+                        (AugmentedSysSystem) system.system().yangAugmentedInfo(AugmentedSysSystem.class);
+                longitudeStr = augmentedSystem.longitude().toPlainString();
+                latitudeStr = augmentedSystem.latitude().toPlainString();
+            }
+        } catch (NetconfException e) {
+            log.error("Unable to retrieve init data from device: " + handler().data().deviceId().toString()
+                    + " Error: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+        DeviceService deviceService = checkNotNull(handler().get(DeviceService.class));
+        DeviceId deviceId = handler().data().deviceId();
+        Device device = deviceService.getDevice(deviceId);
+        DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder();
+        if (longitudeStr != null && latitudeStr != null) {
+            annotationsBuilder.set(AnnotationKeys.LONGITUDE, longitudeStr)
+                    .set(AnnotationKeys.LATITUDE, latitudeStr).build();
+        } else {
+            log.warn("Longitude and latitude could not be retrieved from device " + deviceId);
+        }
+
+        return new DefaultDeviceDescription(device.id().uri(), Device.Type.OTHER, "Microsemi", "EA1000", swVersion,
+                serialNumber, new ChassisId(), annotationsBuilder.build());
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+
+        List<PortDescription> ports = new ArrayList<PortDescription>();
+
+        DefaultAnnotations annotationOptics = DefaultAnnotations.builder().set(AnnotationKeys.PORT_NAME, "Optics")
+                .build();
+        PortDescription optics = new DefaultPortDescription(PortNumber.portNumber(0), true, Port.Type.FIBER, 1000,
+                annotationOptics);
+        ports.add(optics);
+
+        DefaultAnnotations annotationHost = DefaultAnnotations.builder().set(AnnotationKeys.PORT_NAME, "Host").build();
+        PortDescription host = new DefaultPortDescription(PortNumber.portNumber(1), true, Port.Type.COPPER, 1000,
+                annotationHost);
+        ports.add(host);
+
+        return ports;
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java
new file mode 100644
index 0000000..724792e
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import org.onosproject.net.behaviour.MeterQuery;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+
+/**
+ * Driver which always responds that all Meters are available for the Device.
+ */
+public class FullMetersAvailable extends AbstractHandlerBehaviour implements MeterQuery {
+
+    private static final long MAX_METER = 0x00000FFF;
+
+    @Override
+    public long getMaxMeters() {
+        return MAX_METER;
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
new file mode 100644
index 0000000..b7f0e68
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.net.driver.AbstractDriverLoader;
+
+/**
+ * Loader for Microsemi device drivers.
+ */
+@Component(immediate = true)
+public class MicrosemiDriversLoader extends AbstractDriverLoader {
+
+    public MicrosemiDriversLoader() {
+        super("/microsemi-drivers.xml");
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
new file mode 100644
index 0000000..53151bb
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.drivers.microsemi;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+import java.io.IOException;
+
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.ConfigGetter;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.packet.PacketProcessor;
+import org.onosproject.net.packet.PacketService;
+import org.onosproject.netconf.NetconfController;
+import org.slf4j.Logger;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Used with the onos:device-configuration CLI command.
+ *
+ * This allows the full configuration to be retrieved from the device
+ */
+public class NetconfConfigGetter extends AbstractHandlerBehaviour implements ConfigGetter {
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected PacketService packetService;
+
+    private PacketProcessor testProcessor;
+
+    // FIXME the error string should be universal for all implementations of
+    // ConfigGetter
+    public static final String UNABLE_TO_READ_CONFIG = "config retrieval error";
+
+    @Override
+    public String getConfiguration(String type) {
+        DriverHandler handler = handler();
+        NetconfController controller = handler.get(NetconfController.class);
+
+        DeviceId ofDeviceId = handler.data().deviceId();
+        Preconditions.checkNotNull(controller, "Netconf controller is null");
+        if (type == null ||
+                (!type.equalsIgnoreCase("running")
+                        && !type.equalsIgnoreCase("candidate")
+                        && !type.equalsIgnoreCase("startup"))) {
+            log.error("Configuration type must be either 'running', 'startup' or 'candidate'. '{}' is invalid", type);
+            return UNABLE_TO_READ_CONFIG;
+        }
+        try {
+            return controller.getDevicesMap().get(ofDeviceId).getSession().getConfig(type.replace("cfgType=", ""));
+        } catch (IOException e) {
+            log.error("Configuration could not be retrieved {}", e.getMessage());
+        }
+        return UNABLE_TO_READ_CONFIG;
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java
new file mode 100644
index 0000000..7589ea7
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+public final class RpcResultParser {
+
+    private RpcResultParser() {
+        //Not called
+    }
+
+    public static String parseXml(final String deviceDescriptionResponse, final String keyWord) {
+
+        int end = deviceDescriptionResponse.lastIndexOf(keyWord);
+        end = deviceDescriptionResponse.lastIndexOf('<', end);
+        int start = deviceDescriptionResponse.lastIndexOf('>', end);
+        if (start > 1 && end > start) {
+            return deviceDescriptionResponse.substring(start + 1, end);
+        } else {
+            return null;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/package-info.java b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/package-info.java
new file mode 100644
index 0000000..de883d1
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers.
+ */
+package org.onosproject.drivers.microsemi;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/main/resources/microsemi-drivers.xml b/drivers/microsemi/ea1000driver/src/main/resources/microsemi-drivers.xml
new file mode 100644
index 0000000..988ac9a
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/main/resources/microsemi-drivers.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2017-present Open Networking Laboratory
+  ~
+  ~ 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.
+  -->
+<drivers>
+	<driver name="microsemi-netconf" extends="netconf" manufacturer="Microsemi"
+		hwVersion="EA1000">
+		<behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+			impl="org.onosproject.drivers.microsemi.Ea1000DeviceDescription" />
+		<behaviour api="org.onosproject.net.behaviour.ConfigGetter"
+			impl="org.onosproject.drivers.microsemi.NetconfConfigGetter" />
+		<behaviour api="org.onosproject.net.behaviour.Pipeliner"
+			impl="org.onosproject.drivers.microsemi.EA1000Pipeliner" />
+		<behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
+			impl="org.onosproject.drivers.microsemi.EA1000FlowRuleProgrammable" />
+		<behaviour api="org.onosproject.net.behaviour.MeterQuery"
+			impl="org.onosproject.drivers.microsemi.FullMetersAvailable" />
+<!--         <behaviour api="org.onosproject.incubator.net.l2monitoring.cfm.CfmMepProgrammable" -->
+<!--             impl="org.onosproject.drivers.microsemi.EA1000CfmMepProgrammable"/> -->
+<!--         <behaviour api="org.onosproject.incubator.net.l2monitoring.soam.SoamDmProgrammable" -->
+<!--             impl="org.onosproject.drivers.microsemi.EA1000SoamDmProgrammable"/> -->
+	</driver>
+</drivers>
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
new file mode 100644
index 0000000..24aad06
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.EthType.EtherType;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.VlanId;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultFlowEntry;
+import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowEntry.FlowEntryState;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.criteria.Criterion.Type;
+import org.onosproject.net.flow.criteria.IPCriterion;
+import org.onosproject.net.flow.criteria.PortCriterion;
+import org.onosproject.net.flow.criteria.VlanIdCriterion;
+import org.onosproject.net.flow.instructions.Instruction;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+public class EA1000FlowRuleProgrammableTest {
+    EA1000FlowRuleProgrammable frProgramable;
+
+    @Before
+    public void setUp() throws Exception {
+        frProgramable = new EA1000FlowRuleProgrammable();
+        frProgramable.setHandler(new MockEa1000DriverHandler());
+        assertNotNull(frProgramable.handler().data().deviceId());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetFlowEntries() {
+        //From MockNetconfSession sample of MseaSaFiltering
+        Collection<FlowEntry> flowEntries = frProgramable.getFlowEntries();
+
+        assertNotNull(flowEntries);
+        //There will be 12 flow entries
+        // 2 for IP Src Address filtering
+        // 2 for EVC 7 - one each port
+        // 8 for EVC 8 - one for host port, 7 on optics port because of ceVlanMap 12:14,20:22,25
+        assertEquals(12, flowEntries.size());
+
+        //Test the first Flow Entry
+        Iterator<FlowEntry> feIter = flowEntries.iterator();
+        while (feIter.hasNext()) {
+            FlowEntry fe = feIter.next();
+            assertTrue(fe.isPermanent());
+            assertEquals(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT, fe.priority());
+
+            Set<Criterion> criteria = fe.selector().criteria();
+            IPCriterion ipCr = null;
+            PortNumber port = null;
+            for (Criterion cr:criteria.toArray(new Criterion[criteria.size()])) {
+                if (cr.type() == Criterion.Type.IPV4_SRC) {
+                    ipCr = (IPCriterion) cr;
+                } else if (cr.type() == Criterion.Type.IN_PORT) {
+                    port = ((PortCriterion) cr).port();
+                } else if (cr.type() == Criterion.Type.VLAN_VID) {
+                    VlanId vid = ((VlanIdCriterion) cr).vlanId();
+                } else {
+                    fail("Unexpected Criterion type: " + cr.type().toString());
+                }
+            }
+            if (ipCr != null && (port == null || port.toLong() != 0L)) {
+                fail("Port number not equal 0 when IP Src Address filter is present");
+            }
+
+            List<Instruction> instructions = fe.treatment().allInstructions();
+
+            if (fe.tableId() == 1) {
+                //Note that in MockNetconf session 10.10.10.10/16 was entered
+                //but it has been corrected to the following by the OF implementation
+                assertEquals("10.10.0.0/16", ipCr.ip().toString());
+                assertEquals(FlowEntryState.ADDED, fe.state());
+            } else if (fe.tableId() == 2) {
+                //Likewise 20.30.40.50 has been truncated because of the 18 bit mask
+                assertEquals("20.30.0.0/18", ipCr.ip().toString());
+                assertEquals(FlowEntryState.ADDED, fe.state());
+            } else if (fe.tableId() == 7 || fe.tableId() == 8) {
+                // 7 and 8 are EVC entries - 2 elements - IN_PORT and VLAN_ID
+                assertEquals(2, fe.selector().criteria().size());
+                //In MockNetconfSession we're rigged it so that the last two chars of the
+                //flow id is the same as the VlanId
+                short vlanId = ((VlanIdCriterion) fe.selector().getCriterion(Type.VLAN_VID)).vlanId().toShort();
+                long flowId = fe.id().id();
+                String flowIdStr = String.valueOf(flowId).substring(String.valueOf(flowId).length() - 2);
+                assertEquals(flowIdStr, String.valueOf(vlanId));
+                if (((PortCriterion) fe.selector().getCriterion(Type.IN_PORT)).port().toLong() == 1L) {
+                    assertEquals(Instruction.Type.L2MODIFICATION, instructions.get(0).type());
+                }
+            } else {
+                fail("Unexpected Flow Entry Rule " + fe.tableId());
+            }
+        }
+    }
+
+    @Test
+    public void testSetFlowEntries() {
+        Criterion matchInPort = Criteria.matchInPort(PortNumber.portNumber(0));
+
+        TrafficTreatment treatmentDrop = DefaultTrafficTreatment.builder().drop().build();
+
+        Collection<FlowRule> frAddedList = new HashSet<FlowRule>();
+
+        FlowRule fr4 = new DefaultFlowRule.Builder()
+            .forDevice(frProgramable.handler().data().deviceId())
+            .forTable(4)
+            .withSelector(DefaultTrafficSelector.builder()
+                    .matchIPSrc(IpPrefix.valueOf("192.168.60.0/22"))
+                    .add(matchInPort).build())
+            .withTreatment(treatmentDrop)
+            .fromApp(new DefaultApplicationId(4, "Filter4"))
+            .makePermanent()
+            .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+            .build();
+        frAddedList.add(fr4);
+
+        FlowRule fr5 = new DefaultFlowRule.Builder()
+                .forDevice(frProgramable.handler().data().deviceId())
+                .forTable(5)
+                .withSelector(DefaultTrafficSelector.builder()
+                        .matchIPSrc(IpPrefix.valueOf("192.168.50.0/23"))
+                        .add(matchInPort).build())
+                .withTreatment(treatmentDrop)
+                .withCookie(Long.valueOf("5e0000abaa2772", 16))
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frAddedList.add(fr5);
+
+        //Add in some EVCs - especially with complex ceVlanMaps
+        FlowRule frEvc1Vid19P0 = new DefaultFlowRule.Builder()
+                .forDevice(frProgramable.handler().data().deviceId())
+                .forTable(1)
+                .withSelector(DefaultTrafficSelector.builder()
+                        .matchInPort(PortNumber.portNumber(0L))
+                        .matchVlanId(VlanId.vlanId((short) 19))
+                        .build())
+                .withTreatment(DefaultTrafficTreatment.builder()
+                        .popVlan()
+                        .build())
+                .withCookie(Long.valueOf("1e0000abaa0019", 16))
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frAddedList.add(frEvc1Vid19P0);
+
+        FlowRule frEvc1Vid20P0 = new DefaultFlowRule.Builder()
+                .forDevice(frProgramable.handler().data().deviceId())
+                .forTable(1)
+                .withSelector(DefaultTrafficSelector.builder()
+                        .matchInPort(PortNumber.portNumber(0L))
+                        .matchVlanId(VlanId.vlanId((short) 20))
+                        .build())
+                .withTreatment(DefaultTrafficTreatment.builder()
+                        .popVlan()
+                        .build())
+                .withCookie(Long.valueOf("1e0000abaa0020", 16))
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frAddedList.add(frEvc1Vid20P0);
+
+        FlowRule frEvc1Vid21P1 = new DefaultFlowRule.Builder()
+                .forDevice(frProgramable.handler().data().deviceId())
+                .forTable(1)
+                .withSelector(DefaultTrafficSelector.builder()
+                        .matchInPort(PortNumber.portNumber(1L))
+                        .matchVlanId(VlanId.vlanId((short) 21))
+                        .build())
+                .withTreatment(DefaultTrafficTreatment.builder()
+                        .setVlanId(VlanId.vlanId((short) 250))
+                        .pushVlan(EtherType.QINQ.ethType())
+                        .build())
+                .withCookie(Long.valueOf("1e0000abaa0121", 16))
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frAddedList.add(frEvc1Vid21P1);
+
+        FlowRule frEvc1Vid22P1 = new DefaultFlowRule.Builder()
+                .forDevice(frProgramable.handler().data().deviceId())
+                .forTable(1)
+                .withSelector(DefaultTrafficSelector.builder()
+                        .matchInPort(PortNumber.portNumber(1L))
+                        .matchVlanId(VlanId.vlanId((short) 22))
+                        .build())
+                .withTreatment(DefaultTrafficTreatment.builder()
+                        .setVlanId(VlanId.vlanId((short) 250))
+                        .pushVlan(EtherType.QINQ.ethType())
+                        .build())
+                .withCookie(Long.valueOf("1e0000abaa0122", 16))
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frAddedList.add(frEvc1Vid22P1);
+
+        Collection<FlowRule> returnedFrList = frProgramable.applyFlowRules(frAddedList);
+
+        assertNotNull(returnedFrList);
+        assertEquals(6, returnedFrList.size());
+
+        //Test the scenario like in FlowRuleManager$InternalFlowRuleProviderService.pushFlowMetricsInternal()
+        Map<FlowEntry, FlowEntry> storedRules = Maps.newHashMap();
+        frAddedList.forEach(f -> storedRules.put(new DefaultFlowEntry(f), new DefaultFlowEntry(f)));
+        List<FlowEntry> feList = Lists.newArrayList();
+        returnedFrList.forEach(f -> feList.add(new DefaultFlowEntry(f)));
+
+        for (FlowEntry rule : feList) {
+            FlowEntry fer = storedRules.remove(rule);
+            assertNotNull(fer);
+            assertTrue(fer.exactMatch(rule));
+        }
+
+        for (FlowRule fr:returnedFrList.toArray(new FlowRule[2])) {
+            if (fr.tableId() == 4) {
+                assertEquals("IPV4_SRC:192.168.60.0/22",
+                        ((IPCriterion) fr.selector().getCriterion(Type.IPV4_SRC)).toString());
+            } else if (fr.tableId() == 5) {
+                assertEquals("IPV4_SRC:192.168.50.0/23",
+                        ((IPCriterion) fr.selector().getCriterion(Type.IPV4_SRC)).toString());
+                assertEquals(Long.valueOf("5e0000abaa2772", 16), fr.id().id());
+            } else if (fr.tableId() == 1) {
+                //TODO add in tests
+            } else {
+                fail("Unexpected flow rule " + fr.tableId() + " in test");
+            }
+        }
+    }
+
+    @Test
+    public void testRemoveFlowEntries() {
+        TrafficSelector.Builder tsBuilder = DefaultTrafficSelector.builder();
+        Criterion matchInPort0 = Criteria.matchInPort(PortNumber.portNumber(0));
+        Criterion matchInPort1 = Criteria.matchInPort(PortNumber.portNumber(1));
+
+        TrafficTreatment.Builder trDropBuilder = DefaultTrafficTreatment.builder();
+        TrafficTreatment treatmentDrop = trDropBuilder.drop().build();
+
+        Collection<FlowRule> frRemoveList = new HashSet<FlowRule>();
+        ApplicationId app = new DefaultApplicationId(1, "org.onosproject.rest");
+
+        Criterion matchIpSrc1 = Criteria.matchIPSrc(IpPrefix.valueOf("10.10.10.10/16"));
+        TrafficSelector selector1 = tsBuilder.add(matchIpSrc1).add(matchInPort0).build();
+        FlowRule.Builder frBuilder1 = new DefaultFlowRule.Builder();
+        frBuilder1.forDevice(frProgramable.handler().data().deviceId())
+                .withSelector(selector1)
+                .withTreatment(treatmentDrop)
+                .forTable(2)
+                .fromApp(app)
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT);
+        frRemoveList.add(frBuilder1.build());
+
+        Criterion matchIpSrc2 = Criteria.matchIPSrc(IpPrefix.valueOf("10.30.10.10/16"));
+        TrafficSelector selector2 = tsBuilder.add(matchIpSrc2).add(matchInPort0).build();
+        FlowRule.Builder frBuilder2 = new DefaultFlowRule.Builder();
+        frBuilder2.forDevice(frProgramable.handler().data().deviceId())
+                .withSelector(selector2)
+                .withTreatment(treatmentDrop)
+                .forTable(3)
+                .fromApp(app)
+                .makePermanent()
+                .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+                .build();
+        frRemoveList.add(frBuilder2.build());
+
+
+        TrafficTreatment.Builder trVlanPopBuilder = DefaultTrafficTreatment.builder();
+        TrafficTreatment treatmentVlanPop = trVlanPopBuilder.popVlan().build();
+
+
+        Criterion matchVlan710 = Criteria.matchVlanId(VlanId.vlanId((short) 710));
+        TrafficSelector selector3 = DefaultTrafficSelector.builder().add(matchVlan710).add(matchInPort1).build();
+        FlowRule.Builder frBuilder3 = new DefaultFlowRule.Builder();
+        frBuilder3.forDevice(frProgramable.handler().data().deviceId())
+            .withSelector(selector3)
+            .withTreatment(treatmentVlanPop)
+            .forTable(7)
+            .fromApp(app)
+            .makePermanent()
+            .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+            .build();
+        frRemoveList.add(frBuilder3.build());
+
+
+        Criterion matchVlan101 = Criteria.matchVlanId(VlanId.vlanId((short) 101));
+        TrafficSelector selector4 = DefaultTrafficSelector.builder().add(matchVlan101).add(matchInPort1).build();
+        FlowRule.Builder frBuilder4 = new DefaultFlowRule.Builder();
+        frBuilder4.forDevice(frProgramable.handler().data().deviceId())
+            .withSelector(selector4)
+            .withTreatment(treatmentVlanPop)
+            .forTable(1)
+            .fromApp(app)
+            .makePermanent()
+            .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+            .build();
+        frRemoveList.add(frBuilder4.build());
+
+        Criterion matchVlan102 = Criteria.matchVlanId(VlanId.vlanId((short) 102));
+        TrafficSelector selector5 = DefaultTrafficSelector.builder().add(matchVlan102).add(matchInPort0).build();
+        FlowRule.Builder frBuilder5 = new DefaultFlowRule.Builder();
+        frBuilder5.forDevice(frProgramable.handler().data().deviceId())
+            .withSelector(selector5)
+            .withTreatment(treatmentVlanPop)
+            .forTable(1)
+            .fromApp(app)
+            .makePermanent()
+            .withPriority(EA1000FlowRuleProgrammable.PRIORITY_DEFAULT)
+            .build();
+        frRemoveList.add(frBuilder5.build());
+
+        Collection<FlowRule> removedFrList = frProgramable.removeFlowRules(frRemoveList);
+        assertNotNull(removedFrList);
+        assertEquals(5, removedFrList.size());
+
+        for (FlowRule frRemoved:removedFrList) {
+            assertNotNull(frRemoved);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java
new file mode 100644
index 0000000..b00b321
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import java.util.HashSet;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.drivers.microsemi.yang.MockMseaUniEvcServiceManager;
+import org.onosproject.drivers.microsemi.yang.MockNetconfSessionEa1000;
+import org.onosproject.drivers.netconf.MockNetconfController;
+import org.onosproject.drivers.netconf.MockNetconfDevice;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.meter.Band;
+import org.onosproject.net.meter.DefaultBand;
+import org.onosproject.net.meter.DefaultMeter;
+import org.onosproject.net.meter.Meter;
+import org.onosproject.net.meter.Meter.Unit;
+import org.onosproject.net.meter.MeterId;
+import org.onosproject.net.meter.MeterOperation;
+import org.onosproject.net.meter.MeterOperation.Type;
+import org.onosproject.netconf.NetconfController;
+
+public class EA1000MeterProviderTest {
+
+    private EA1000MeterProvider meterProvider;
+    private NetconfController controller;
+    private DeviceId mockDeviceId;
+    private MockMseaUniEvcServiceManager mseaUniEvcServiceSvc;
+
+    @Before
+    public void setUp() throws Exception {
+        mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+        controller = new MockNetconfController();
+        MockNetconfDevice device = (MockNetconfDevice) controller.connectDevice(mockDeviceId);
+        device.setNcSessionImpl(MockNetconfSessionEa1000.class);
+        mseaUniEvcServiceSvc = new MockMseaUniEvcServiceManager();
+        mseaUniEvcServiceSvc.activate();
+        meterProvider = new TestEA1000MeterProvider(controller, mseaUniEvcServiceSvc);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testPerformMeterOperationDeviceIdMeterAdd() {
+        DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+
+        Band cbsBand = DefaultBand.builder()
+                .ofType(Band.Type.REMARK) //Committed - CIR & CBS
+                .withRate(37500L)
+                .burstSize(2000)
+                .dropPrecedence((short) 0)
+                .build();
+
+        Band ebsBand = DefaultBand.builder()
+                .ofType(Band.Type.DROP) //Excess - EIR & EBS
+                .withRate(50000L) //The rate at which we drop - for EA 1000 subtract CIR to get EIR
+                .burstSize(3000) //The burst rate to drop at
+                .build();
+
+        Meter.Builder mBuilder = DefaultMeter.builder()
+                .forDevice(mockDeviceId)
+                .withId(MeterId.meterId(1))
+                .fromApp(new DefaultApplicationId(101, "unit.test"))
+                .burst()
+                .withUnit(Unit.KB_PER_SEC)
+                .withBands(new HashSet<Band>() { { add(cbsBand); add(ebsBand); } });
+
+        MeterOperation meterOp = new MeterOperation(mBuilder.build(), Type.ADD);
+
+        meterProvider.performMeterOperation(mockDeviceId, meterOp);
+        //The NETCONF XML generated by this matches the pattern
+        // sampleXmlRegexEditConfigBwpGroup1
+        // in MockNetconfSession
+    }
+
+    @Test
+    public void testPerformMeterOperationDeviceIdMeterRemove() {
+        DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+
+        Band cbsBand = DefaultBand.builder()
+                .ofType(Band.Type.REMARK) //Committed - CIR & CBS
+                .withRate(37500L)
+                .burstSize(2000)
+                .dropPrecedence((short) 0)
+                .build();
+
+        Meter.Builder mBuilder = DefaultMeter.builder()
+                .forDevice(mockDeviceId)
+                .withId(MeterId.meterId(1))
+                .fromApp(new DefaultApplicationId(101, "unit.test"))
+                .burst()
+                .withBands(new HashSet<Band>() { { add(cbsBand); } });
+
+        MeterOperation meterOp = new MeterOperation(mBuilder.build(), Type.REMOVE);
+
+        meterProvider.performMeterOperation(mockDeviceId, meterOp);
+        //The NETCONF XML generated by this matches the pattern
+        // sampleXmlRegexEditConfigBwpGroup1
+        // in MockNetconfSession
+    }
+
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java
new file mode 100644
index 0000000..a53c6e3
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import org.junit.Before;
+import org.onosproject.net.driver.AbstractDriverLoaderTest;
+
+
+/**
+ * Microsemi drivers loader test.
+ */
+public class MicrosemiDriversLoaderTest extends AbstractDriverLoaderTest {
+
+    @Before
+    public void setUp() {
+        loader = new MicrosemiDriversLoader();
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
new file mode 100644
index 0000000..78a9d32
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.onosproject.core.CoreService;
+import org.onosproject.drivers.microsemi.yang.MockMseaSaFilteringManager;
+import org.onosproject.drivers.microsemi.yang.MockMseaUniEvcServiceManager;
+import org.onosproject.drivers.microsemi.yang.MockNetconfSessionEa1000;
+import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.drivers.netconf.MockCoreService;
+import org.onosproject.drivers.netconf.MockNetconfController;
+import org.onosproject.drivers.netconf.MockNetconfDevice;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.driver.Behaviour;
+import org.onosproject.net.driver.DefaultDriver;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.flow.FlowRuleProgrammable;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+
+/**
+ * A Mock implementation of the DriverHandler to facilitate unit tests.
+ *
+ * This brings in the implementations of MockMseaSaFilteringManager, MockMseaUniEvcServiceManager,
+ * MockCoreService, MockNetconfDevice and MockNetconfSessionEa1000
+ */
+public class MockEa1000DriverHandler implements DriverHandler {
+
+    private static final String MICROSEMI_DRIVERS = "com.microsemi.drivers";
+
+    private DriverData mockDriverData;
+
+    private NetconfController ncc;
+    private MockMseaSaFilteringManager mseaSaFilteringService;
+    private MockMseaUniEvcServiceManager mseaUniEvcService;
+    private CoreService coreService;
+
+    public MockEa1000DriverHandler() throws NetconfException {
+        Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours =
+                new HashMap<Class<? extends Behaviour>, Class<? extends Behaviour>>();
+        behaviours.put(FlowRuleProgrammable.class, FlowRuleProgrammable.class);
+
+        Map<String, String> properties = new HashMap<String, String>();
+
+        Driver mockDriver =
+                new DefaultDriver("mockDriver", null, "ONOSProject", "1.0.0", "1.0.0", behaviours, properties);
+        DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
+        mockDriverData = new DefaultDriverData(mockDriver, mockDeviceId);
+
+
+        ncc = new MockNetconfController();
+        MockNetconfDevice device = (MockNetconfDevice) ncc.connectDevice(mockDeviceId);
+        device.setNcSessionImpl(MockNetconfSessionEa1000.class);
+
+        mseaSaFilteringService = new MockMseaSaFilteringManager();
+        mseaSaFilteringService.activate();
+
+        mseaUniEvcService = new MockMseaUniEvcServiceManager();
+        mseaUniEvcService.activate();
+
+        coreService = new MockCoreService();
+        coreService.registerApplication(MICROSEMI_DRIVERS);
+    }
+
+    @Override
+    public Driver driver() {
+        return mockDriverData.driver();
+    }
+
+    @Override
+    public DriverData data() {
+        return mockDriverData;
+    }
+
+    @Override
+    public <T extends Behaviour> T behaviour(Class<T> behaviourClass) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public <T> T get(Class<T> serviceClass) {
+        if (serviceClass.equals(NetconfController.class)) {
+            return (T) ncc;
+
+        } else if (serviceClass.equals(MseaSaFilteringNetconfService.class)) {
+            return (T) mseaSaFilteringService;
+
+        } else if (serviceClass.equals(MseaUniEvcServiceNetconfService.class)) {
+            return (T) mseaUniEvcService;
+
+        } else if (serviceClass.equals(CoreService.class)) {
+            return (T) coreService;
+
+        }
+
+        return null;
+    }
+
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java
new file mode 100644
index 0000000..64dd80e
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.junit.Test;
+
+public class RpcResultParserTest {
+
+    private static final String SAMPLE1_XML = "/systemReply-Sample1.xml";
+    private static final String SAMPLE2_XML = "/systemReply-Sample2.xml";
+
+    @Test
+    public void testSerialNumber1() {
+        String serialNumberReply = loadXml(SAMPLE1_XML);
+        String serialNumber = RpcResultParser.parseXml(serialNumberReply, "serial-number");
+        assertEquals("Eagle Simulator.", serialNumber);
+    }
+
+    @Test
+    public void testSerialNumber2() {
+        String serialNumberReply = loadXml(SAMPLE2_XML);
+        String serialNumber = RpcResultParser.parseXml(serialNumberReply, "serial-number");
+        assertEquals(null, serialNumber);
+    }
+
+    @Test
+    public void testOsRelease1() {
+        String osReleaseReply = loadXml(SAMPLE1_XML);
+        String osRelease = RpcResultParser.parseXml(osReleaseReply, "os-release");
+        assertEquals("2.6.33-arm1-MSEA1000--00326-g643be76.x.0.0.212", osRelease);
+    }
+
+    @Test
+    public void testOsRelease2() {
+        String osReleaseReply = loadXml(SAMPLE2_XML);
+        String osRelease = RpcResultParser.parseXml(osReleaseReply, "os-release");
+        assertEquals(null, osRelease);
+    }
+
+    @Test
+    public void testLongitude() {
+        String longitudeReply = loadXml(SAMPLE1_XML);
+        String longitudeStr = RpcResultParser.parseXml(longitudeReply, "longitude");
+        assertEquals("-8.4683990", longitudeStr);
+    }
+
+    @Test
+    public void testLatitude() {
+        String latitudeReply = loadXml(SAMPLE1_XML);
+        String latitudeStr = RpcResultParser.parseXml(latitudeReply, "latitude");
+        assertEquals("51.9036140", latitudeStr);
+    }
+
+
+    private static String loadXml(final String fileName) {
+
+        InputStream inputStream = RpcResultParserTest.class.getResourceAsStream(fileName);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+        StringBuilder result = new StringBuilder();
+        try {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                result.append(line);
+            }
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return result.toString();
+    }
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java
new file mode 100644
index 0000000..e56e121
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi;
+
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.netconf.NetconfController;
+
+public class TestEA1000MeterProvider extends EA1000MeterProvider {
+
+    public TestEA1000MeterProvider(NetconfController controller,
+            MseaUniEvcServiceNetconfService mseaUniEvcServiceSvc) {
+        this.controller = controller;
+        this.mseaUniEvcServiceSvc = mseaUniEvcServiceSvc;
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt b/drivers/microsemi/ea1000driver/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt
new file mode 100644
index 0000000..04db8030
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt
@@ -0,0 +1,85 @@
+onos> ce-evc-list
+CarrierEthernetVirtualConnection{
+    id=EP-Line-1, cfgId=evpl1, type=POINT_TO_POINT, state=ACTIVE,
+    UNIs=[
+        CarrierEthernetUni{
+            id=netconf:192.168.56.10:830/0,
+            cfgId=netconf:192.168.56.10:830/0,
+            role=Root,
+            refCount=0,
+            ceVlanIds=[100],
+            capacity=1000000000,
+            usedCapacity=3.0E8,
+            bandwidthProfiles=[
+                CarrierEthernetBandwidthProfile{
+                    id=FC-1,
+                    type=EVC,
+                    cir=3.0E8,
+                    cbs=2000,
+                    eir=0.0,
+                    ebs=0}]},
+        CarrierEthernetUni{
+            id=netconf:192.168.56.20:830/0,
+            cfgId=netconf:192.168.56.20:830/0,
+            role=Root,
+            refCount=0,
+            ceVlanIds=[100],
+            capacity=1000000000,
+            usedCapacity=3.0E8,
+            bandwidthProfiles=[
+                CarrierEthernetBandwidthProfile{
+                    id=FC-1,
+                    type=EVC,
+                    cir=3.0E8,
+                    cbs=2000,
+                    eir=0.0,
+                    ebs=0}]}],
+    FCs=[
+        CarrierEthernetForwardingConstruct{
+            id=FC-1,
+            cfgId=null,
+            type=POINT_TO_POINT,
+            vlanId=1,
+            metroConnectId=null,
+            refCount=1,
+            LTPs=[
+                CarrierEthernetLogicalTerminationPoint{
+                    id=netconf:192.168.56.10:830/0,
+                    cfgId=netconf:192.168.56.10:830/0,
+                    role=Root,
+                    ni=CarrierEthernetUni{
+                        id=netconf:192.168.56.10:830/0,
+                        cfgId=netconf:192.168.56.10:830/0,
+                        role=Root,
+                        refCount=0,
+                        ceVlanIds=[100],
+                        capacity=1000000000,
+                        usedCapacity=3.0E8,
+                        bandwidthProfiles=[
+                            CarrierEthernetBandwidthProfile{
+                                id=FC-1,
+                                type=EVC,
+                                cir=3.0E8,
+                                cbs=2000,
+                                eir=0.0,
+                                ebs=0}]}},
+                CarrierEthernetLogicalTerminationPoint{
+                    id=netconf:192.168.56.20:830/0,
+                    cfgId=netconf:192.168.56.20:830/0,
+                    role=Root,
+                    ni=CarrierEthernetUni{
+                        id=netconf:192.168.56.20:830/0,
+                        cfgId=netconf:192.168.56.20:830/0,
+                        role=Root,
+                        refCount=0,
+                        ceVlanIds=[100],
+                        capacity=1000000000,
+                        usedCapacity=3.0E8,
+                        bandwidthProfiles=[
+                            CarrierEthernetBandwidthProfile{
+                                id=FC-1,
+                                type=EVC,
+                                cir=3.0E8,
+                                cbs=2000,
+                                eir=0.0,
+                                ebs=0}]}}]}]}
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFiltering.xml b/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFiltering.xml
new file mode 100644
index 0000000..53bfe46
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFiltering.xml
@@ -0,0 +1,11 @@
+<rpc message-id="101"
+     xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+    <get-config>
+        <source>
+            <running/>
+        </source>
+        <filter type="subtree">
+            <source-ipaddress-filtering xmlns="http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering"/>
+        </filter>
+    </get-config>
+</rpc>
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFilteringReply.xml b/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFilteringReply.xml
new file mode 100644
index 0000000..6e1e040
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFilteringReply.xml
@@ -0,0 +1,14 @@
+<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="7">
+    <data>
+        <source-ipaddress-filtering xmlns="http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering">
+            <interface-eth0>
+                <source-address-range>
+                    <range-id>1</range-id>
+                    <ipv4-address-prefix>10.10.10.10/16</ipv4-address-prefix>
+                    <name>Filter1</name>
+                </source-address-range>
+                <filter-admin-state>inactive</filter-admin-state>
+            </interface-eth0>
+        </source-ipaddress-filtering>
+    </data>
+</rpc-reply>
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample1.xml b/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample1.xml
new file mode 100644
index 0000000..206bf45
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample1.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
+    <data>
+        <system xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
+            <longitude xmlns="http://www.microsemi.com/microsemi-edge-assure/msea-system">-8.4683990</longitude>
+            <latitude xmlns="http://www.microsemi.com/microsemi-edge-assure/msea-system">51.9036140</latitude>
+        </system>
+        <system-state xmlns="urn:ietf:params:xml:ns:yang:ietf-system" xmlns:sysms="http://www.microsemi.com/microsemi-edge-assure/msea-system">
+            <platform>
+                <os-release>2.6.33-arm1-MSEA1000--00326-g643be76.x.0.0.212</os-release>
+                <sysms:device-identification>
+                    <sysms:serial-number>Eagle Simulator.</sysms:serial-number>
+                </sysms:device-identification>
+            </platform>
+        </system-state>
+    </data>
+</rpc-reply>
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample2.xml b/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample2.xml
new file mode 100644
index 0000000..9592538
--- /dev/null
+++ b/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample2.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="2">
+  <data>
+    <system-state xmlns="urn:ietf:params:xml:ns:yang:ietf-system">
+      <platform/>
+    </system-state>
+  </data>
+</rpc-reply>
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/BUCK.ignore b/drivers/microsemi/ea1000yang/BUCK.ignore
new file mode 100644
index 0000000..73d20c0
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/BUCK.ignore
@@ -0,0 +1,36 @@
+YANG_DEPS = [
+  '//lib:CORE_DEPS',
+  '//lib:onos-yang-datamodel',
+  '//lib:onos-yang-utils-generator',
+]
+
+COMPILE_DEPS = [
+  '//lib:CORE_DEPS',
+  '//apps/yms/api:onos-apps-yms-api',
+  '//protocols/netconf/api:onos-protocols-netconf-api',
+  '//lib:onos-yang-datamodel',
+  '//lib:onos-yang-utils-generator',
+  '//lib:org.apache.servicemix.bundles.dom4j',
+  '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang-gen',
+]
+
+TEST_DEPS = [
+  '//lib:TEST_ADAPTERS',
+  '//apps/yms/app:onos-apps-yms-app',
+  '//drivers/netconf:onos-drivers-netconf-tests',
+  '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
+]
+
+yang_osgi_jar(
+  deps = YANG_DEPS,
+  name = 'onos-drivers-microsemi-ea1000yang-gen',
+  srcs = glob(['src/main/yang/**/*.yang']),
+  visibility = [ 'PUBLIC' ],
+)
+
+osgi_jar_with_tests(
+  deps = COMPILE_DEPS,
+  test_deps = TEST_DEPS,
+  visibility = [ 'PUBLIC' ],
+  srcs = glob(['src/main/**/*.java'])
+)
diff --git a/drivers/microsemi/ea1000yang/pom.xml b/drivers/microsemi/ea1000yang/pom.xml
new file mode 100644
index 0000000..31beff0
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ~ Copyright 2016 Open Networking Laboratory ~ ~ 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <artifactId>onos-drivers-microsemi</artifactId>
+        <groupId>org.onosproject</groupId>
+        <version>1.10.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>onos-drivers-microsemi-ea1000yang</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>Microsemi YANG model for EA1000</description>
+    <url>http://www.microsemi.com</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <onos.version>1.10.0-SNAPSHOT</onos.version>
+        <onos.app.name>org.onosproject.drivers.microsemi.yang</onos.app.name>
+        <onos.app.title>Microsemi Device Drivers YANG</onos.app.title>
+        <onos.app.origin>Microsemi, Inc.</onos.app.origin>
+        <onos.app.category>Drivers</onos.app.category>
+        <onos.app.url>http://onosproject.org</onos.app.url>
+        <onos.app.readme>For various Microsemi Devices including EdgeAssure
+            1000 SFP-NID</onos.app.readme>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-yang-utils-generator</artifactId>
+            <version>1.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-yang-datamodel</artifactId>
+            <version>1.11</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yms</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-netconf</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-yang-maven-plugin</artifactId>
+                <version>1.11</version>
+                <executions>
+                    <execution>
+                        <configuration>
+                            <classFileDir>target/generated-sources</classFileDir>
+                        </configuration>
+                        <goals>
+                            <goal>yang2java</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Include-Resource>yang/resources/YangMetaData.ser=target/classes/yang/resources/YangMetaData.ser</Include-Resource>
+                    </instructions>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>**/delaymeasurement/*</exclude>
+                        <exclude>**/lossmeasurement/*</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
new file mode 100644
index 0000000..7554350
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.time.OffsetDateTime;
+
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
+
+/**
+ * Extension of ietfSystemService to include NETCONF sessions.
+ *
+ * This is manually extended and should be revised if the ietf-system.yang file changes
+ */
+public interface IetfSystemNetconfService {
+    /**
+     * Returns the attribute ietfSystem.
+     *
+     * @param ietfSystem value of ietfSystem
+     * @param session An active NETCONF session
+     * @return ietfSystem
+     * @throws NetconfException if the session has any error
+     */
+    IetfSystem getIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session) throws NetconfException;
+
+    /**
+     * Returns the result of the init query.
+     *
+     * @param session An active NETCONF session
+     * @return ietfSystem
+     * @throws NetconfException if the session has any error
+     */
+    IetfSystem getIetfSystemInit(NetconfSession session) throws NetconfException;
+
+    /**
+     * Sets the value to attribute ietfSystem.
+     *
+     * @param ietfSystem value of ietfSystem
+     * @param session An active NETCONF session
+     * @param ncDs datastore type running, startup or candidate
+     * @throws NetconfException if the session has any error
+     */
+    void setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session, TargetConfig ncDs)
+            throws NetconfException;
+
+    /**
+     * Service interface of setCurrentDatetime.
+     *
+     * @param date input of service interface setCurrentDatetime
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void setCurrentDatetime(OffsetDateTime date, NetconfSession session) throws NetconfException;
+
+    /**
+     * Service interface of systemRestart.
+     *
+     * @param inputVar input of service interface systemRestart
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void systemRestart(SystemRestartInput inputVar, NetconfSession session) throws NetconfException;
+
+    /**
+     * Service interface of systemShutdown.
+     *
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void systemShutdown(NetconfSession session) throws NetconfException;
+
+    /**
+     * Service interface of doUpgradeAndReboot.
+     *
+     * @param inputVar input of service interface doUpgradeAndReboot
+     * @param session An active NETCONF session
+     * @return doUpgradeAndRebootOutput output of service interface doUpgradeAndReboot
+     * @throws NetconfException if the session has any error
+     */
+    DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
+            throws NetconfException;
+
+    /**
+     * Service interface of pullUpdateTarFromTftp.
+     *
+     * @param inputVar input of service interface pullUpdateTarFromTftp
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
+            throws NetconfException;
+
+    /**
+     * Service interface of readFromSyslog.
+     *
+     * @param inputVar input of service interface readFromSyslog
+     * @param session An active NETCONF session
+     * @return readFromSyslogOutput output of service interface readFromSyslog
+     * @throws NetconfException if the session has any error
+     */
+    ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
+            throws NetconfException;
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
new file mode 100644
index 0000000..cf391fa
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import org.onosproject.event.ListenerService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfmOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.MseaCfmEvent;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.MseaCfmEventListener;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
+
+/**
+ * Extension of mseaCfmService to include NETCONF sessions.
+ *
+ * This is manually extended and should be revised if the msea-cfm.yang,
+ * msea-soam-pm.yang or msea-soam-fm.yang files change
+ */
+public interface MseaCfmNetconfService extends ListenerService<MseaCfmEvent, MseaCfmEventListener> {
+
+    /**
+     * Returns attributes of MEP.
+     *
+     * @param mdName The name of the MD
+     * @param maName The name of the MA
+     * @param mepId The ID of the MEP
+     * @param session An active NETCONF session
+     * @return mseaCfm
+     * @throws NetconfException if the session has any error
+     */
+    MseaCfm getMepEssentials(String mdName, String maName, int mepId,
+            NetconfSession session) throws NetconfException;
+
+
+    /**
+     * Returns attributes of DM.
+     *
+     * @param mdName The name of the MD
+     * @param maName The name of the MA
+     * @param mepId The ID of the MEP
+     * @param dmId The Id of the Delay Measurement
+     * @param session An active NETCONF session
+     * @return mseaCfm
+     * @throws NetconfException if the session has any error
+     */
+    MseaCfm getSoamDm(String mdName, String maName, int mepId,
+            int dmId, NetconfSession session) throws NetconfException;
+
+    /**
+     * Sets the value to attribute mseaCfm.
+     *
+     * @param mseaCfm value of mseaCfm
+     * @param session An active NETCONF session
+     * @param targetDs one of running, candidate or startup
+     * @throws NetconfException if the session has any error
+     */
+    void setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session, TargetConfig targetDs) throws NetconfException;
+
+    /**
+     * Service interface of transmitLoopback.
+     *
+     * @param inputVar input of service interface transmitLoopback
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void transmitLoopback(TransmitLoopbackInput inputVar, NetconfSession session) throws NetconfException;
+
+    /**
+     * Service interface of abortLoopback.
+     *
+     * @param inputVar input of service interface abortLoopback
+     * @param session An active NETCONF session
+     * @throws NetconfException if the session has any error
+     */
+    void abortLoopback(AbortLoopbackInput inputVar, NetconfSession session) throws NetconfException;
+
+    /**
+     * Service interface of transmitLinktrace.
+     *
+     * @param inputVar input of service interface transmitLinktrace
+     * @param session An active NETCONF session
+     * @return transmitLinktraceOutput output of service interface transmitLinktrace
+     * @throws NetconfException if the session has any error
+     */
+    TransmitLinktraceOutput transmitLinktrace(TransmitLinktraceInput inputVar, NetconfSession session)
+            throws NetconfException;
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
new file mode 100644
index 0000000..9e35df0
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.drivers.microsemi.yang;
+
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringOpParam;
+
+/**
+ * Extension of mseaSaFilteringService to include NETCONF sessions.
+ *
+ * This is manually extended and should be revised if the msea-sa-filtering.yang file changes
+ */
+public interface MseaSaFilteringNetconfService {
+    /**
+     * Returns the attribute mseaSaFiltering.
+     *
+     * @param mseaSaFiltering value of mseaSaFiltering
+     * @param session  An active NETCONF session
+     * @return mseaSaFiltering
+     * @throws NetconfException if the session has any error
+     */
+    MseaSaFiltering getMseaSaFiltering(
+            MseaSaFilteringOpParam mseaSaFiltering, final NetconfSession session)
+            throws NetconfException;
+
+    /**
+     * Sets the value to attribute mseaSaFiltering.
+     *
+     * @param mseaSaFiltering value of mseaSaFiltering
+     * @param session An active NETCONF session
+     * @param targetDs The NETCONF datastore to edit
+     * @throws NetconfException if the session has any error
+     */
+    void setMseaSaFiltering(MseaSaFilteringOpParam mseaSaFiltering, NetconfSession session, TargetConfig targetDs)
+            throws NetconfException;
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
new file mode 100644
index 0000000..38ccbf6
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.drivers.microsemi.yang;
+
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+
+/**
+ * Extension of mseaUniEvcServiceService to include NETCONF sessions.
+ *
+ * This is manually extended and should be revised if the msea-uni-evc-service.yang
+ * file changes
+ */
+public interface MseaUniEvcServiceNetconfService {
+    /**
+     * Returns the configuration and state attributes of the running mseaUniEvcService.
+     *
+     * @param mseaUniEvcService value of mseaUniEvcService
+     * @param session The NETCONF session
+     * @return mseaUniEvcService
+     * @throws NetconfException if the session has any error
+     */
+    MseaUniEvcService getMseaUniEvcService(
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session)
+            throws NetconfException;
+
+    /**
+     * Returns the configuration only attributes of mseaUniEvcService.
+     *
+     * @param mseaUniEvcService value of mseaUniEvcService
+     * @param session The NETCONF session
+     * @param targetDs one of running, candidate or startup
+     * @return mseaUniEvcService
+     * @throws NetconfException if the session has any error
+     */
+    MseaUniEvcService getConfigMseaUniEvcService(
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig targetDs)
+            throws NetconfException;
+
+    /**
+     * Sets the value to attribute mseaUniEvcService.
+     *
+     * @param mseaUniEvcService value of mseaUniEvcService
+     * @param session The NETCONF session
+     * @param targetDs one of running, candidate or startup
+     * @throws NetconfException if the session has any error
+     */
+    void setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
+            NetconfSession session, TargetConfig targetDs)
+            throws NetconfException;
+
+    /**
+     * Returns a list of the CeVlanMaps on both sides of the EVC.
+     *
+     * @param session A NETCONF Session
+     * @param ncDs The datastore to affect - running, candidate or startup
+     * @return The Object Model with the VLans
+     * @throws NetconfException if the session has any error
+     */
+    MseaUniEvcService getmseaUniEvcCeVlanMaps(
+            NetconfSession session, TargetConfig ncDs)
+            throws NetconfException;
+
+    /**
+     * Replace ceVlans or delete EVCs from a device.
+     *
+     * It is necessary to have a custom command for this as the YCH cannot
+     * handle the intricacies of putting a replace operation on the
+     * ceVlanMap leaf at present
+     *
+     * @param ceVlanUpdates A Map of CeVlanMap entries to change, as flows are deleted
+     * @param flowVlanIds The IDs of flows that are being removed
+     * @param session A NETCONF Session
+     * @param targetDs The datastore to affect - running, candidate or startup
+     * @param portAssign The port assignment of the device
+     * @throws NetconfException if the session has any error
+     */
+    void removeEvcUniFlowEntries(
+            Map<Integer, String> ceVlanUpdates,
+            Map<Integer, List<Short>> flowVlanIds,
+            NetconfSession session,
+            TargetConfig targetDs,
+            UniSideInterfaceAssignmentEnum portAssign)
+                    throws NetconfException;
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java
new file mode 100644
index 0000000..8ced81c
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+/**
+ * An enumeration to describe the side of a UNI - Customer or Network.
+ * For reference see MEF 6.2
+ */
+public enum UniSide {
+    CUSTOMER,
+    NETWORK
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
new file mode 100644
index 0000000..7b65a75
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
+import static org.onosproject.yms.ydt.YmsOperationType.EDIT_CONFIG_REQUEST;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REPLY;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REQUEST;
+
+import java.util.List;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yms.ych.YangCodecHandler;
+import org.onosproject.yms.ych.YangCompositeEncoding;
+import org.onosproject.yms.ymsm.YmsService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Abstract class that implements some of the core functions of a YANG model service.
+ *
+ */
+@Component(immediate = true)
+@Service
+public abstract class AbstractYangServiceImpl {
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+    protected boolean alreadyLoaded = false;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected YmsService ymsService;
+
+    protected ApplicationId appId;
+
+    // YCH is not a service and is a class variable. Can be lost on deactivate.
+    // Must be recreated on activate
+    protected YangCodecHandler ych;
+
+    @Activate
+    public abstract void activate();
+
+    @Deactivate
+    public void deactivate() {
+        alreadyLoaded = false;
+    }
+
+    /**
+     * Internal method to generically make a NETCONF get query from YANG objects.
+     * @param yangObjectOpParamFilter A YANG object model
+     * @param session A NETCONF session
+     * @return YangObjectModel
+     * @throws NetconfException if the session has any error
+     */
+    protected final Object getNetconfObject(
+            Object yangObjectOpParamFilter, NetconfSession session)
+                throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getNetconfObject()");
+        }
+        if (yangObjectOpParamFilter == null) {
+            throw new NetconfException("Query object cannot be null");
+        }
+        //Convert the param to XML to use as a filter
+        YangCompositeEncoding xmlQuery =
+                ych.encodeCompositeOperation(null, null,
+                        yangObjectOpParamFilter, XML, QUERY_REQUEST);
+
+        String xmlQueryStr = xmlQuery.getResourceInformation().replace("<>", "").replace("</>", "").trim();
+        log.debug("Sending <get> query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        String xmlResult = session.get(xmlQueryStr, null);
+
+        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_REPLY);
+        if (objectList != null && objectList.size() > 0) {
+            Object systemObject = objectList.get(0);
+            return systemObject;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Internal method to generically make a NETCONF get-config query from YANG objects.
+     *
+     * @param yangObjectOpParamFilter A YANG object model
+     * @param session A NETCONF session
+     * @param targetDs - running,candidate or startup
+     * @return YangObjectModel
+     * @throws NetconfException if the session has any error
+     */
+    protected final Object getConfigNetconfObject(
+            Object yangObjectOpParamFilter, NetconfSession session, TargetConfig targetDs)
+                throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getConfigNetconfObject()");
+        }
+
+        if (yangObjectOpParamFilter == null) {
+            throw new NetconfException("Query object cannot be null");
+        }
+        //Convert the param to XML to use as a filter
+        YangCompositeEncoding xmlQuery =
+                ych.encodeCompositeOperation(null, null,
+                        yangObjectOpParamFilter, XML, QUERY_REQUEST);
+
+        String xmlQueryStr = xmlQuery.getResourceInformation().replace("<>", "").replace("</>", "").trim();
+        log.debug("Sending <get-config> for " + targetDs +
+                " query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        String xmlResult = session.getConfig(targetDs, xmlQueryStr);
+
+        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_REPLY);
+        if (objectList != null && objectList.size() > 0) {
+            Object systemObject = objectList.get(0);
+            return systemObject;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Internal method to generically make a NETCONF edit-config call from a set of YANG objects.
+     *
+     * @param yangObjectOpParamFilter A YANG object model
+     * @param session A NETCONF session
+     * @param targetDs - running,candidate or startup
+     * @throws NetconfException if the session has any error
+     */
+    protected final void setNetconfObject(
+            Object yangObjectOpParamFilter, NetconfSession session, TargetConfig targetDs)
+                throws NetconfException {
+        if (yangObjectOpParamFilter == null) {
+            throw new NetconfException("Query object cannot be null");
+        } else if (session == null) {
+            throw new NetconfException("Session is null when calling getMseaSaFiltering()");
+        }
+        //Convert the param to XML to use as a filter
+        YangCompositeEncoding xmlContent =
+                ych.encodeCompositeOperation(null, null,
+                        yangObjectOpParamFilter, XML, EDIT_CONFIG_REQUEST);
+
+        String xmlContentStr = xmlContent.getResourceInformation()
+                .replace("<>", "").replace("</>", "")
+                //FIXME: Necessary for MEP ccmInterval
+                .replaceAll("yangAutoPrefix", "")
+                .trim();
+
+        log.debug("Sending XML <edit-config> on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlContentStr);
+
+        boolean succeeded = session.editConfig(targetDs, null, xmlContentStr);
+        if (succeeded) {
+            log.debug("<edit-config> succeeded through NETCONF");
+        } else {
+            throw new NetconfException("Failed to run edit-config through NETCONF");
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
new file mode 100644
index 0000000..4c61143
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REPLY;
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.drivers.microsemi.yang.IetfSystemNetconfService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.IetfSystemMicrosemiService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
+
+/**
+ * Implementation of the IetfService YANG model service.
+ */
+@Component(immediate = true, inherit = true)
+@Service
+public class IetfSystemManager extends AbstractYangServiceImpl
+    implements IetfSystemNetconfService {
+
+    protected final Pattern regexRemoveSystem =
+            Pattern.compile("(<system).*(</system>)", Pattern.DOTALL);
+    protected final Pattern regexRemoveSystemState =
+            Pattern.compile("(<system-state).*(</system-state>)", Pattern.DOTALL);
+
+    protected static final String IETF_SYSTEM = "org.onosproject.drivers.microsemi.yang.ietfsystem";
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(IETF_SYSTEM);
+        ych = ymsService.getYangCodecHandler();
+        ych.addDeviceSchema(IetfSystemService.class);
+        ych.addDeviceSchema(IetfSystemMicrosemiService.class);
+        log.info("IetfSystemManager Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        super.deactivate();
+        ymsService.unRegisterService(this, IetfSystemService.class);
+        ymsService.unRegisterService(this, IetfSystemMicrosemiService.class);
+        ych = null;
+        log.info("IetfSystemManager Stopped");
+    }
+
+    /**
+     * Get a filtered subset of the model.
+     * This is meant to filter the current live model
+     * against the attribute(s) given in the argument
+     * and return the filtered model.
+     * @throws NetconfException if the session has any error
+     */
+    @Override
+    public IetfSystem getIetfSystem(IetfSystemOpParam ietfSystemFilter, NetconfSession session)
+            throws NetconfException {
+        return (IetfSystem) getNetconfObject(ietfSystemFilter, session);
+    }
+
+    @Override
+    public IetfSystem getIetfSystemInit(NetconfSession session) throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getIetfSystemInit()");
+        }
+
+        String xmlResult = session.get(getInitRequestBuilder(), null);
+
+        //The result will be a <system> followed by <system-state>
+        //YCH can decode only one at a time - split it and send half each time
+        IetfSystem.IetfSystemBuilder iBuilder = new IetfSystemOpParam.IetfSystemBuilder();
+
+        String xmlResultSystem = regexRemoveSystemState.matcher(xmlResult).replaceFirst("");
+        List<Object> objectListState = ych.decode(xmlResultSystem, XML, QUERY_REPLY);
+        if (objectListState != null && objectListState.size() > 0) {
+            IetfSystem system = (IetfSystem) objectListState.get(0);
+            iBuilder.system(system.system());
+        }
+
+        String xmlResultSystemState = regexRemoveSystem.matcher(xmlResult).replaceFirst("");
+        List<Object> objectListSystemState = ych.decode(xmlResultSystemState, XML, QUERY_REPLY);
+        if (objectListSystemState != null && objectListSystemState.size() > 0) {
+            IetfSystem system = (IetfSystem) objectListSystemState.get(0);
+            iBuilder.systemState(system.systemState());
+        }
+
+        return iBuilder.build();
+    }
+
+    /**
+     * Call NETCONF edit-config with a configuration.
+     */
+    @Override
+    public void setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session, TargetConfig ncDs)
+        throws NetconfException {
+        setNetconfObject(ietfSystem, session, ncDs);
+    }
+
+    @Override
+    public void setCurrentDatetime(OffsetDateTime date, NetconfSession session)
+            throws NetconfException {
+        String xmlQueryStr = getSetCurrentDatetimeBuilder(date);
+        log.info("Sending <get> query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        String xmlResult = session.doWrappedRpc(xmlQueryStr);
+        log.info("Result from NETCONF RPC <set-current-datetime>: {}", xmlResult);
+    }
+
+    @Override
+    public void systemRestart(SystemRestartInput inputVar, NetconfSession session) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public void systemShutdown(NetconfSession session) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
+            throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
+            throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
+            throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+
+    /**
+     * Builds a request crafted to get the configuration required to create
+     * details descriptions for the device.
+     *
+     * @return The request string.
+     */
+    private static String getInitRequestBuilder() {
+        StringBuilder rpc = new StringBuilder();
+        rpc.append("<system-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
+        rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
+        rpc.append("<platform>");
+        rpc.append("<os-release/>");
+        rpc.append("<sysms:device-identification>");
+        rpc.append("<sysms:serial-number/>");
+        rpc.append("</sysms:device-identification>");
+        rpc.append("</platform>");
+        rpc.append("<clock>");
+        rpc.append("<current-datetime/>");
+        rpc.append("</clock>");
+        rpc.append("</system-state>");
+        rpc.append("<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\" ");
+        rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
+        rpc.append("<sysms:longitude/>");
+        rpc.append("<sysms:latitude/>");
+        rpc.append("</system>");
+        return rpc.toString();
+    }
+
+    private static String getSetCurrentDatetimeBuilder(OffsetDateTime date) {
+        StringBuilder rpc = new StringBuilder();
+        rpc.append("<set-current-datetime xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">");
+        rpc.append("<current-datetime>");
+        rpc.append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")));
+        rpc.append("</current-datetime>");
+        rpc.append("</set-current-datetime>");
+
+        return rpc.toString();
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
new file mode 100644
index 0000000..c2359ab
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
@@ -0,0 +1,221 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REPLY;
+
+import java.util.List;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfmOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfmService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.MseaCfmEventListener;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.soam.fm.rev20160229.MseaSoamFmService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.soam.pm.rev20160229.MseaSoamPmService;
+
+/**
+ * Implementation of the MseaCfmServiceNetconf YANG model service.
+ */
+@Component(immediate = true, inherit = true)
+@Service
+public class MseaCfmManager extends AbstractYangServiceImpl
+    implements MseaCfmNetconfService {
+
+    public static final String MSEA_CFM = "org.onosproject.drivers.microsemi.yang.mseacfmservice";
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(MSEA_CFM);
+        ych = ymsService.getYangCodecHandler();
+        ych.addDeviceSchema(MseaCfmService.class);
+        ych.addDeviceSchema(MseaSoamFmService.class);
+        ych.addDeviceSchema(MseaSoamPmService.class);
+        log.info("MseaCfmService Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        super.deactivate();
+        ymsService.unRegisterService(this, MseaCfmService.class);
+        ymsService.unRegisterService(this, MseaSoamFmService.class);
+        ymsService.unRegisterService(this, MseaSoamPmService.class);
+        ych = null;
+        log.info("MseaCfmService Stopped");
+    }
+
+    @Override
+    public MseaCfm getMepEssentials(String mdName, String maName, int mepId,
+            NetconfSession session) throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getMepEssentials()");
+        }
+
+        String xmlQueryStr = buildMepQueryString(mdName, maName, mepId);
+        log.debug("Sending <get> for " +
+                " query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        String xmlResult = session.get(xmlQueryStr, null);
+        //FIXME Line is removed because YCH decode does not know how to handle it
+        xmlResult = xmlResult.replaceAll("(<ccm-interval>)(3.3ms|10ms|100ms|1s)(</ccm-interval>)", "");
+        xmlResult = xmlResult.replaceAll("(<active-defects/>)", "");
+
+        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_REPLY);
+        if (objectList != null && objectList.size() > 0) {
+            Object systemObject = objectList.get(0);
+            return (MseaCfm) systemObject;
+        } else {
+            throw new NetconfException("Failure of YCH decode - could not parse as MseaCfm: " + xmlResult);
+        }
+    }
+
+    @Override
+    public MseaCfm getSoamDm(String mdName, String maName, int mepId,
+            int dmId, NetconfSession session) throws NetconfException {
+        String xmlQueryStr = buildDmQueryString(mdName, maName, mepId, dmId);
+        log.debug("Sending <get> for " +
+                " query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        String xmlResult = session.get(xmlQueryStr, null);
+
+        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_REPLY);
+        if (objectList != null && objectList.size() > 0) {
+            Object systemObject = objectList.get(0);
+            return (MseaCfm) systemObject;
+        } else {
+            throw new NetconfException("Failure of YCH decode - could not parse as MseaCfm: " + xmlResult);
+        }
+    }
+
+    @Override
+    public void setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session, TargetConfig targetDs)
+            throws NetconfException {
+        setNetconfObject(mseaCfm, session, targetDs);
+    }
+
+    /**
+     * Call RPCs on the device through NETCONF.
+     */
+    @Override
+    public void transmitLoopback(TransmitLoopbackInput inputVar, NetconfSession session) throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public void abortLoopback(AbortLoopbackInput inputVar, NetconfSession session) throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public TransmitLinktraceOutput transmitLinktrace(TransmitLinktraceInput inputVar, NetconfSession session)
+            throws NetconfException {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public void addListener(MseaCfmEventListener listener) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    @Override
+    public void removeListener(MseaCfmEventListener listener) {
+        throw new UnsupportedOperationException("Not yet implemented");
+    }
+
+    private String buildMepQueryString(String mdName, String maName, int mepId) {
+        StringBuilder rpc = new StringBuilder();
+
+        rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
+        rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
+        rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
+        rpc.append("<maintenance-domain>\n");
+        rpc.append("<id/>\n");
+        rpc.append("<name>" + mdName + "</name>\n");
+        rpc.append("<md-level/>\n");
+        rpc.append("<maintenance-association>\n");
+        rpc.append("<id/>\n");
+        rpc.append("<name>" + maName + "</name>\n");
+//        rpc.append("<ccm-interval>10ms</ccm-interval>\n"); //Have to omit for the moment - YMS problem
+        rpc.append("<remote-meps/>\n");
+        rpc.append("<component-list/>\n");
+        rpc.append("<maintenance-association-end-point>\n");
+        rpc.append("<mep-identifier>" + mepId + "</mep-identifier>\n");
+        rpc.append("<interface/>\n");
+        rpc.append("<primary-vid/>\n");
+        rpc.append("<administrative-state/>\n");
+        rpc.append("<ccm-ltm-priority/>\n");
+        rpc.append("<continuity-check/>\n");
+        rpc.append("<mac-address/>\n");
+        rpc.append("<msea-soam-fm:port-status/>\n");
+        rpc.append("<msea-soam-fm:interface-status/>\n");
+//        rpc.append("<msea-soam-fm:last-defect-sent/>\n");//Have to omit for the moment - YMS problem
+        rpc.append("<msea-soam-fm:rdi-transmit-status/>\n");
+        rpc.append("<loopback/>\n");
+        rpc.append("<remote-mep-database/>\n");
+        rpc.append("<linktrace/>\n");
+        rpc.append("</maintenance-association-end-point>\n");
+        rpc.append("</maintenance-association>\n");
+        rpc.append("</maintenance-domain>\n");
+        rpc.append("</mef-cfm>");
+
+        return rpc.toString();
+    }
+
+
+    private String buildDmQueryString(String mdName, String maName, int mepId, int dmId) {
+        StringBuilder rpc = new StringBuilder();
+
+        rpc.append("<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" ");
+        rpc.append(" xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" ");
+        rpc.append("xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">\n");
+        rpc.append("<maintenance-domain>\n");
+        rpc.append("<id/>\n");
+        rpc.append("<name>" + mdName + "</name>\n");
+        rpc.append("<md-level/>\n");
+        rpc.append("<maintenance-association>\n");
+        rpc.append("<id/>\n");
+        rpc.append("<name>" + maName + "</name>\n");
+//        rpc.append("<ccm-interval>10ms</ccm-interval>\n"); //Have to omit for the moment - YMS problem
+        rpc.append("<maintenance-association-end-point>\n");
+        rpc.append("<mep-identifier>" + mepId + "</mep-identifier>\n");
+        rpc.append("<msea-soam-pm:delay-measurements>");
+        rpc.append("<msea-soam-pm:delay-measurement>");
+        rpc.append("<msea-soam-pm:dm-id>" + dmId + "</msea-soam-pm:dm-id>");
+        rpc.append("</msea-soam-pm:delay-measurement>");
+        rpc.append("</msea-soam-pm:delay-measurements>");
+        rpc.append("</maintenance-association-end-point>\n");
+        rpc.append("</maintenance-association>\n");
+        rpc.append("</maintenance-domain>\n");
+        rpc.append("</mef-cfm>");
+
+        return rpc.toString();
+    }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
new file mode 100644
index 0000000..eeba11e
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringService;
+
+/**
+ * Implementation of the MseaSaFiltering YANG model service.
+ */
+@Component(immediate = true, inherit = true)
+@Service
+public class MseaSaFilteringManager extends AbstractYangServiceImpl
+    implements MseaSaFilteringNetconfService {
+    public static final String MSEA_SA_FILTERING = "org.onosproject.drivers.microsemi.yang.mseasafiltering";
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(MSEA_SA_FILTERING);
+        ych = ymsService.getYangCodecHandler();
+        ych.addDeviceSchema(MseaSaFilteringService.class);
+        log.info("MseaSaFilteringManager Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        super.deactivate();
+        ymsService.unRegisterService(this, MseaSaFilteringService.class);
+        ych = null;
+        log.info("MseaSaFilteringManager Stopped");
+    }
+
+    /**
+     * Get a filtered subset of the model.
+     * This is meant to filter the current live model
+     * against the attribute(s) given in the argument
+     * and return the filtered model.
+     */
+    @Override
+    public MseaSaFiltering getMseaSaFiltering(MseaSaFilteringOpParam mseaSaFilteringFilter, NetconfSession session)
+            throws NetconfException {
+        return (MseaSaFiltering) getNetconfObject(mseaSaFilteringFilter, session);
+    }
+
+    /**
+     * Call NETCONF edit-config with a configuration.
+     */
+    @Override
+    public void setMseaSaFiltering(
+            MseaSaFilteringOpParam mseaSaFiltering, NetconfSession session, TargetConfig ncDs)
+            throws NetconfException {
+        setNetconfObject(mseaSaFiltering, session, ncDs);
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
new file mode 100644
index 0000000..82b6116
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
+
+import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_CONFIG_REPLY;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+
+/**
+ * Implementation of the MseaUniEvcServiceService YANG model service.
+ */
+@Component(immediate = true, inherit = true)
+@Service
+public class MseaUniEvcServiceManager extends AbstractYangServiceImpl
+        implements MseaUniEvcServiceNetconfService {
+    public static final String MSEA_SA_FILTERING = "org.onosproject.drivers.microsemi.yang.mseaunievcservice";
+
+    @Activate
+    public void activate() {
+        appId = coreService.registerApplication(MSEA_SA_FILTERING);
+        ych = ymsService.getYangCodecHandler();
+        ych.addDeviceSchema(MseaUniEvcServiceService.class);
+        log.info("MseaUniEvcServiceManager Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        super.deactivate();
+        ymsService.unRegisterService(this, MseaUniEvcServiceService.class);
+        ych = null;
+        log.info("MseaUniEvcServiceManager Stopped");
+    }
+
+    @Override
+    public MseaUniEvcService getMseaUniEvcService(
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session) throws NetconfException {
+        return (MseaUniEvcService) getNetconfObject(mseaUniEvcService, session);
+    }
+
+    @Override
+    public MseaUniEvcService getConfigMseaUniEvcService(
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig targetDs)
+            throws NetconfException {
+        return (MseaUniEvcService) getConfigNetconfObject(mseaUniEvcService, session, targetDs);
+    }
+
+    /**
+     * Modify the configuration.
+     */
+    @Override
+    public void setMseaUniEvcService(
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig ncDs)
+                    throws NetconfException {
+        setNetconfObject(mseaUniEvcService, session, ncDs);
+    }
+
+    @Override
+    public MseaUniEvcService getmseaUniEvcCeVlanMaps(
+            NetconfSession session, TargetConfig ncDs)
+            throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getMseaSaFiltering()");
+        }
+
+        String xmlResult = session.getConfig(ncDs, evcFilterQuery());
+
+        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_CONFIG_REPLY);
+        if (objectList != null && objectList.size() > 0) {
+            return (MseaUniEvcService) objectList.get(0);
+        }
+
+        return null;
+    }
+
+    @Override
+    public void removeEvcUniFlowEntries(
+            Map<Integer, String> ceVlanUpdates,
+            Map<Integer, List<Short>> flowVlanIds,
+            NetconfSession session, TargetConfig targetDs,
+            UniSideInterfaceAssignmentEnum portAssign) throws NetconfException {
+
+        List<Integer> evcAlreadyHandled = new ArrayList<>();
+        StringBuilder xmlEvcUpdate = new StringBuilder(evcUniOpener());
+        for (Integer evcKey:ceVlanUpdates.keySet()) {
+            int evcId = (evcKey & ((1 << 8) - 100)) >> 2;
+            if (evcAlreadyHandled.contains(new Integer(evcId))) {
+                continue;
+            }
+            evcAlreadyHandled.add(evcId);
+            int port = (evcKey & 3);
+            String ceVlanMapThis = ceVlanUpdates.get(evcKey);
+            String ceVlanMapOpposite = ceVlanUpdates.get(evcKey ^ 1);
+
+            if ((ceVlanMapThis == null || ceVlanMapThis.isEmpty()) &&
+                    (ceVlanMapOpposite == null || ceVlanMapOpposite.isEmpty())) {
+                xmlEvcUpdate.append("<evc nc:operation=\"delete\">\n<evc-index>");
+                xmlEvcUpdate.append(Integer.toString(evcId));
+                xmlEvcUpdate.append("</evc-index>\n</evc>\n");
+            } else {
+                xmlEvcUpdate.append("<evc>\n<evc-index>");
+                xmlEvcUpdate.append(Integer.toString(evcId));
+                xmlEvcUpdate.append("</evc-index>\n<evc-per-uni>\n");
+                if (port == 0 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS ||
+                        port == 1 && portAssign == UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST) {
+                    if (ceVlanMapThis != null) {
+                        xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
+                        xmlEvcUpdate.append(ceVlanMapThis);
+                        xmlEvcUpdate.append("</ce-vlan-map>\n");
+                        xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
+                        xmlEvcUpdate.append("</evc-per-uni-c>\n");
+                    }
+                    if (ceVlanMapOpposite != null) {
+                        xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
+                        xmlEvcUpdate.append(ceVlanMapOpposite);
+                        xmlEvcUpdate.append("</ce-vlan-map>\n");
+                        xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
+                        xmlEvcUpdate.append("</evc-per-uni-n>\n");
+                    }
+                } else {
+                    if (ceVlanMapThis != null) {
+                        xmlEvcUpdate.append("<evc-per-uni-n>\n<ce-vlan-map nc:operation=\"replace\">");
+                        xmlEvcUpdate.append(ceVlanMapThis);
+                        xmlEvcUpdate.append("</ce-vlan-map>\n");
+                        xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey)));
+                        xmlEvcUpdate.append("</evc-per-uni-n>\n");
+                    }
+                    if (ceVlanMapOpposite != null) {
+                        xmlEvcUpdate.append("<evc-per-uni-c>\n<ce-vlan-map nc:operation=\"replace\">");
+                        xmlEvcUpdate.append(ceVlanMapOpposite);
+                        xmlEvcUpdate.append("</ce-vlan-map>\n");
+                        xmlEvcUpdate.append(deleteFlowMapping(flowVlanIds.get(evcKey ^ 1)));
+                        xmlEvcUpdate.append("</evc-per-uni-c>\n");
+                    }
+                }
+
+                xmlEvcUpdate.append("</evc-per-uni>\n</evc>\n");
+            }
+        }
+        xmlEvcUpdate.append("</uni>\n</mef-services>");
+
+        log.info("Sending XML <edit-config> on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlEvcUpdate.toString());
+
+
+        session.editConfig(targetDs, null, xmlEvcUpdate.toString());
+    }
+
+
+    private static String deleteFlowMapping(List<Short> vlanIds) {
+        if (vlanIds == null || vlanIds.size() == 0) {
+            return "";
+        }
+        StringBuilder fmXmlBuilder = new StringBuilder();
+        for (long vlanId:vlanIds) {
+            fmXmlBuilder.append("<flow-mapping nc:operation=\"delete\">\n");
+            fmXmlBuilder.append("<ce-vlan-id>");
+            fmXmlBuilder.append(String.valueOf(vlanId));
+            fmXmlBuilder.append("</ce-vlan-id>\n");
+            fmXmlBuilder.append("</flow-mapping>\n");
+        }
+
+        return fmXmlBuilder.toString();
+    }
+
+    private String evcFilterQuery() {
+        StringBuilder sb = new StringBuilder("<mef-services "
+                + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">");
+        sb.append("<uni>");
+        sb.append("<evc>");
+        sb.append("<evc-index/>");
+        sb.append("<evc-per-uni>");
+        sb.append("<evc-per-uni-c>");
+        sb.append("<ce-vlan-map/>");
+        sb.append("<flow-mapping/>");
+        sb.append("<ingress-bwp-group-index/>");
+        sb.append("</evc-per-uni-c>");
+        sb.append("<evc-per-uni-n>");
+        sb.append("<ce-vlan-map/>");
+        sb.append("<flow-mapping/>");
+        sb.append("<ingress-bwp-group-index/>");
+        sb.append("</evc-per-uni-n>");
+        sb.append("</evc-per-uni>");
+        sb.append("</evc>");
+        sb.append("</uni>");
+        sb.append("</mef-services>");
+
+        return sb.toString();
+    }
+
+    private String evcUniOpener() {
+        StringBuilder sb = new StringBuilder("<mef-services ");
+        sb.append("xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n");
+        sb.append("<uni>\n");
+
+        return sb.toString();
+    }
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java
new file mode 100644
index 0000000..ccf0dd2
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.drivers.microsemi.yang.impl;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java
new file mode 100644
index 0000000..d886c69
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.drivers.microsemi.yang;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java
new file mode 100644
index 0000000..52ede6d
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.utils;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.lang.ArrayUtils;
+
+/**
+ * A set of static utilities that allow a ce-vlan-map to be decomposed.
+ *
+ * This is an implementation specific to Microsemi that encodes ce-vlan-map
+ * in a similar way to Section 7.9 in the MEF 10.2 specification. That specification
+ * suggests comma delimited lists of VIDs - this implementation adds on colons to
+ * specify a contiguous range of IDs
+ */
+public final class CeVlanMapUtils {
+
+    private CeVlanMapUtils() {
+        //Do not allow this utility class to be instantiated
+    }
+
+    /**
+     * Calculate the ceVlanMap in to a Set of values.
+     *
+     * From Yang description
+     *   "This object indicates the CE-VLANs associated with the specific
+     *   EVC on a UNI. CE-VLAN IDs have value of 0 to 4095. The CE-VLAN ID
+     *   list can be a single value or multiple values separated by a delimiter.
+     *   Some valid values are: '100', '1:10', '10,20,30', '1:4095'. In the
+     *   first example only CE-VLAN ID 100 is associated with the VLAN map.
+     *   In the second example the CE-VLAN map includes CE-VLAN IDs 1 through
+     *   10 (range of values). The third example indicates three separate values
+     *   that make up the CE-VLAN map. The last example indicates all CE-VLAN IDs
+     *   are included in the map (range of values). ";
+     *  reference
+     *   "[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
+     * @param ceVlanMap A list of vlan id's in the format described above
+     * @return A set of vlan ids
+     */
+    public static Short[] getVlanSet(String ceVlanMap) {
+        if (ceVlanMap == null || ceVlanMap.isEmpty()) {
+            return new Short[0];
+        }
+        Set<Short> ceVlanSet = new TreeSet<Short>();
+
+        String[] ceVlanMapCommas = ceVlanMap.split(",");
+        for (String ceVlanMapComma:ceVlanMapCommas) {
+            String[] ceVlanMapColon = ceVlanMapComma.split(":");
+            if (ceVlanMapColon.length == 1) {
+                ceVlanSet.add(Short.decode(ceVlanMapColon[0]));
+            } else {
+                short start = Short.decode(ceVlanMapColon[0]);
+                short end = Short.decode(ceVlanMapColon[1]);
+                if ((start < 0 || end > 4095)) {
+                    return null;
+                } else {
+                    for (short i = start; i <= end; i++) {
+                        ceVlanSet.add(i);
+                    }
+                }
+            }
+        }
+
+        return ceVlanSet.toArray(new Short[ceVlanSet.size()]);
+    }
+
+    /**
+     * Convert an array of vlan ids in to a string representation.
+     * @param vlanArray An array of vlan ids
+     * @return A string representation delimited by commas and colons
+     */
+    public static String vlanListAsString(Short[] vlanArray) {
+        boolean colonPending = false;
+        StringBuilder ceVlanMapBuilder = new StringBuilder();
+        if (vlanArray.length == 0) {
+            return "";
+        } else if (vlanArray.length == 1 && vlanArray[0] == 0) {
+            return "0";
+        }
+
+        //To ensure that there are no repeated or out-of-order elements we must convert to TreeSet
+        TreeSet<Short> vlanSet = new TreeSet<>(Arrays.asList(vlanArray));
+
+        if (vlanSet.first() == 0) {
+            vlanSet.remove(vlanSet.first());
+        }
+        short prev = vlanSet.first();
+        for (short s:vlanSet) {
+            if (s == prev) {
+                ceVlanMapBuilder.append(Short.valueOf(s));
+                continue;
+            } else if (prev == (s - 1)) {
+                colonPending = true;
+            } else {
+                if (colonPending) {
+                    ceVlanMapBuilder.append(":" + Short.valueOf(prev));
+                    colonPending = false;
+                }
+                ceVlanMapBuilder.append("," + Short.valueOf(s));
+            }
+            prev = s;
+        }
+        if (colonPending) {
+            ceVlanMapBuilder.append(":" + Short.valueOf(prev));
+        }
+
+        return ceVlanMapBuilder.toString();
+    }
+
+    /**
+     * Add an additional vlan id to an existing string representation.
+     * @param existingMap An array of vlan ids
+     * @param newVlan The new vlan ID to add
+     * @return A string representation delimited by commas and colons
+     */
+    public static String addtoCeVlanMap(String existingMap, Short newVlan) {
+        Short[] vlanArray = getVlanSet(existingMap);
+        TreeSet<Short> vlanSet = new TreeSet<>();
+        for (Short vlan:vlanArray) {
+            vlanSet.add(vlan);
+        }
+
+        vlanSet.add(newVlan);
+
+        return vlanListAsString(vlanSet.toArray(new Short[vlanSet.size()]));
+    }
+
+    /**
+     * If a string representation contains a '0' then remove it.
+     *
+     * Zero is an invalid VLAN id, and is used here as a place holder for null. Null can't
+     * be used in the EA1000 device. Once any other vlan ids are added then the zero should
+     * be removed. It is safe to call this method even if no zero is present - the method will
+     * make no change in that case.
+     *
+     * @param existingMap An string representation of vlan ids, possibly containing a zero
+     * @return A string representation delimited by commas and colons without zero
+     */
+    public static String removeZeroIfPossible(String existingMap) {
+        if (existingMap == null || existingMap.isEmpty()) {
+            return "0";
+        } else if (existingMap == "0") {
+            return existingMap;
+        }
+        return removeFromCeVlanMap(existingMap, (short) 0);
+    }
+
+    /**
+     * Remove a vlan id from an existing string representation.
+     * @param existingMap An array of vlan ids
+     * @param vlanRemove The vlan ID to remove
+     * @return A string representation delimited by commas and colons
+     */
+    public static String removeFromCeVlanMap(String existingMap, Short vlanRemove) {
+        Short[] vlanArray = getVlanSet(existingMap);
+        TreeSet<Short> vlanSet = new TreeSet<>();
+        for (Short vlan:vlanArray) {
+            if (vlan.shortValue() != vlanRemove.shortValue()) {
+                vlanSet.add(vlan);
+            }
+        }
+
+        return vlanListAsString(vlanSet.toArray(new Short[vlanSet.size()]));
+    }
+
+    /**
+     * Combine vlan ids from two existing string representations.
+     *
+     * If there are overlapping elements and ranges, these are consolidated in to one.
+     *
+     * @param set1 A string containing a set of vlan ids
+     * @param set2 A string containing a set of vlan ids
+     * @return A string representation delimited by commas and colons
+     */
+    public static String combineVlanSets(String set1, String set2) {
+        Short[] set1Array = getVlanSet(set1);
+        Short[] set2Array = getVlanSet(set2);
+        return vlanListAsString((Short[]) ArrayUtils.addAll(set1Array, set2Array));
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
new file mode 100644
index 0000000..4b706b6
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.drivers.microsemi.yang.utils;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DateAndTime;
+
+/**
+ * A utility class to change various YANG types to general purpose classes.
+ */
+public final class IetfYangTypesUtils {
+    private IetfYangTypesUtils() {
+        //Hiding the public constructor for this utility class
+    }
+
+    /**
+     * Convert from Date and Time in a ietf-yang-types format to the Java Time API.
+     * @param dateAndTime A date and time from a YANG object
+     * @return A Date and Time with a Time Zone offset
+     */
+    public static OffsetDateTime fromYangDateTime(DateAndTime dateAndTime) {
+        return OffsetDateTime.parse(dateAndTime.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+    }
+
+    /**
+     * Convert a from Date and Time in a ietf-yang-types format to the Java Time API and rezone to a given Time Zone.
+     * @param dateAndTime A date and time from a YANG object
+     * @param zoneId The time zone to rezone the time and date to
+     * @return The rezoned time and date
+     */
+    public static ZonedDateTime fromYangDateTimeZoned(DateAndTime dateAndTime, ZoneId zoneId) {
+        return OffsetDateTime.parse(dateAndTime.toString(),
+                DateTimeFormatter.ISO_OFFSET_DATE_TIME).atZoneSameInstant(zoneId);
+    }
+
+    /**
+     * Convert a from Date and Time in a ietf-yang-types format to the Java Time API rezoned to the local Time Zone.
+     * @param dateAndTime A date and time from a YANG object
+     * @return The date and time in the zone of this local machine
+     */
+    public static LocalDateTime fromYangDateTimeToLocal(DateAndTime dateAndTime) {
+        OffsetDateTime odt = OffsetDateTime.parse(dateAndTime.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+
+        return LocalDateTime.ofInstant(odt.toInstant(), ZoneId.systemDefault());
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java
new file mode 100644
index 0000000..0c03c46
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for general utilities and helpers.
+ */
+package org.onosproject.drivers.microsemi.yang.utils;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/CustomEvc.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/CustomEvc.java
new file mode 100644
index 0000000..722fe78
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/CustomEvc.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni;
+
+import org.onosproject.drivers.microsemi.yang.UniSide;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types
+    .rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.CustomEvcPerUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
+
+/**
+ * A custom implementation of the DefaultEvc - especially its Builder.
+ *
+ * This allows the Evc to be modified after creation. These additions to the
+ * builder are necessary because in the EA1000 YANG model many different Open Flow
+ * flows can be associated with one EVC - each one has its own Ce-Vlan-Id and
+ * Flow Reference
+ */
+public class CustomEvc extends DefaultEvc {
+
+    public static EvcBuilder builder(Evc evc) {
+        return new EvcBuilder(evc);
+    }
+
+    public static class EvcBuilder extends DefaultEvc.EvcBuilder {
+
+        /**
+         * Allow a builder to be constructed from an existing EVC
+         * @param evc An existing EVC
+         */
+        public EvcBuilder(Evc evc) {
+            this.evcPerUni = evc.evcPerUni();
+            this.evcStatus = evc.evcStatus();
+            this.evcIndex = evc.evcIndex();
+            this.mtuSize = evc.mtuSize();
+            this.cevlanCosPreservation = evc.cevlanCosPreservation();
+            this.cevlanIdPreservation = evc.cevlanIdPreservation();
+            this.name = evc.name();
+            this.yangEvcOpType = evc.yangEvcOpType();
+            this.yangAugmentedInfoMap = evc.yangAugmentedInfoMap();
+            this.name = evc.name();
+            this.serviceType = evc.serviceType();
+            this.selectLeafFlags = evc.selectLeafFlags();
+            this.uniEvcId = evc.uniEvcId();
+            this.valueLeafFlags = evc.valueLeafFlags();
+        }
+
+        /**
+         * Method to allow ceVlanMap to be modified.
+         * @param additionalCeVlanMap An addition to the existing ceVlanMap
+         * @param side The Uni Side - Customer or Network
+         * @return The updated builder
+         */
+        public EvcBuilder addToCeVlanMap(ServiceListType additionalCeVlanMap, UniSide side) {
+            evcPerUni = CustomEvcPerUni.builder(evcPerUni).addToCeVlanMap(additionalCeVlanMap, side).build();
+            return this;
+        }
+
+        /**
+         * Method to allow the Flow Mapping list to be modified.
+         * @param fm the flow mapping
+         * @param side The Uni Side - Customer or Network
+         * @return The updated builder
+         */
+        public EvcBuilder addToFlowMapping(FlowMapping fm, UniSide side) {
+            evcPerUni = CustomEvcPerUni.builder(evcPerUni).addToFlowMapping(fm, side).build();
+            return this;
+        }
+
+        /**
+         * Method to allow an EVC side to be added.
+         * @param evcUniN An EVCPerUni object
+         * @return The updated builder
+         */
+        public EvcBuilder addUniN(EvcPerUnin evcUniN) {
+            evcPerUni = CustomEvcPerUni.builder(evcPerUni).addUniN(evcUniN).build();
+            return this;
+        }
+
+        /**
+         * Method to allow an EVC side to be added.
+         * @param evcUniC An EVCPerUni object
+         * @return The updated builder
+         */
+        public EvcBuilder addUniC(EvcPerUnic evcUniC) {
+            evcPerUni = CustomEvcPerUni.builder(evcPerUni).addUniC(evcUniC).build();
+            return this;
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/CustomEvcPerUni.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/CustomEvcPerUni.java
new file mode 100644
index 0000000..ed53593
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/CustomEvcPerUni.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc;
+
+import org.onosproject.drivers.microsemi.yang.UniSide;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types
+    .rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnin;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
+
+/**
+ * A custom implementation of the DefaultEvcPerUni - especially its Builder.
+ *
+ * This allows the EvcPerUni to be modified after creation. These additions to the
+ * builder are necessary because in the EA1000 YANG model the EvcPerUni side can
+ * be added at separate stages
+ */
+public class CustomEvcPerUni extends DefaultEvcPerUni {
+
+    public static EvcPerUniBuilder builder(EvcPerUni evcPerUni) {
+        return new EvcPerUniBuilder(evcPerUni);
+    }
+
+    public static class EvcPerUniBuilder extends DefaultEvcPerUni.EvcPerUniBuilder {
+
+        /**
+         * Allow a builder to be constructed from an existing EvcPerUni
+         * @param evcPerUni An existing EvcPerUni
+         */
+        public EvcPerUniBuilder(EvcPerUni evcPerUni) {
+            this.evcPerUnic = evcPerUni.evcPerUnic();
+            this.evcPerUnin = evcPerUni.evcPerUnin();
+            this.evcUniType = evcPerUni.evcUniType();
+            this.yangEvcPerUniOpType = evcPerUni.yangEvcPerUniOpType();
+            this.valueLeafFlags = evcPerUni.valueLeafFlags();
+            this.selectLeafFlags = evcPerUni.selectLeafFlags();
+            this.yangAugmentedInfoMap = evcPerUni.yangAugmentedInfoMap();
+        }
+
+        /**
+         * Method to allow ceVlanMap to be modified.
+         * @param additionalCeVlanMap An addition to the existing ceVlanMap
+         * @param side The Uni Side - Customer or Network
+         * @return The updated builder
+         */
+        public EvcPerUniBuilder addToCeVlanMap(ServiceListType additionalCeVlanMap, UniSide side) {
+            if (side == UniSide.NETWORK) {
+                evcPerUnin = CustomEvcPerUnin.builder(evcPerUnin).addToCeVlanMap(additionalCeVlanMap).build();
+            } else {
+                evcPerUnic = CustomEvcPerUnic.builder(evcPerUnic).addToCeVlanMap(additionalCeVlanMap).build();
+            }
+
+            return this;
+        }
+
+        /**
+         * Method to allow the Flow Mapping list to be modified.
+         * @param fm the flow mapping
+         * @param side The Uni Side - Customer or Network
+         * @return The updated builder
+         */
+        public EvcPerUniBuilder addToFlowMapping(FlowMapping fm, UniSide side) {
+            if (side == UniSide.NETWORK) {
+                evcPerUnin = CustomEvcPerUnin.builder(evcPerUnin).addToFlowMapping(fm).build();
+            } else {
+                evcPerUnic = CustomEvcPerUnic.builder(evcPerUnic).addToFlowMapping(fm).build();
+            }
+            return this;
+        }
+
+        /**
+         * Method to allow an EVC side to be added.
+         * @param evcUniN An EVCPerUni object
+         * @return The updated builder
+         */
+        public EvcPerUniBuilder addUniN(EvcPerUnin evcUniN) {
+            this.evcPerUnin = evcUniN;
+            return this;
+        }
+
+        /**
+         * Method to allow an EVC side to be added.
+         * @param evcUniC An EVCPerUni object
+         * @return The updated builder
+         */
+        public EvcPerUniBuilder addUniC(EvcPerUnic evcUniC) {
+            this.evcPerUnic = evcUniC;
+            return this;
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnic.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnic.java
new file mode 100644
index 0000000..2e8dfc6
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnic.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni;
+
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types
+    .rev20160229.mseatypes.ServiceListType;
+
+/**
+ * A custom implementation of the DefaultEvcPerUnic - especially its Builder.
+ *
+ * This allows the EvcPerUniC to be modified after creation. These additions to the
+ * builder are necessary because in the EA1000 YANG model the EvcPerUniC can
+ * be added at separate stages
+ */
+public class CustomEvcPerUnic extends DefaultEvcPerUnic {
+    public static EvcPerUnicBuilder builder(EvcPerUnic evcPerUnic) {
+        return new EvcPerUnicBuilder(evcPerUnic);
+    }
+
+    public static EvcPerUnicBuilder builder() {
+        return new EvcPerUnicBuilder();
+    }
+
+    public static class EvcPerUnicBuilder extends DefaultEvcPerUnic.EvcPerUnicBuilder {
+
+        /**
+         * Allow a new builder to be constructed
+         */
+        public EvcPerUnicBuilder() {
+            valueLeafFlags.set(LeafIdentifier.CEVLANMAP.getLeafIndex());
+            this.ceVlanMap = new ServiceListType("0");
+            valueLeafFlags.set(LeafIdentifier.INGRESSBWPGROUPINDEX.getLeafIndex());
+            this.ingressBwpGroupIndex = 0;
+        }
+
+        /**
+         * Allow a builder to be constructed from an existing EvcPerUnic
+         * @param evcPerUnic An existing EvcPerUnic
+         */
+        public EvcPerUnicBuilder(EvcPerUnic evcPerUnic) {
+            this.ceVlanMap = evcPerUnic.ceVlanMap();
+            this.evcPerUniServiceType = evcPerUnic.evcPerUniServiceType();
+            this.ingressBwpGroupIndex = evcPerUnic.ingressBwpGroupIndex();
+            this.tagManipulation = evcPerUnic.tagManipulation();
+            this.flowMapping = evcPerUnic.flowMapping();
+            this.yangEvcPerUnicOpType = evcPerUnic.yangEvcPerUnicOpType();
+            this.yangAugmentedInfoMap = evcPerUnic.yangAugmentedInfoMap();
+            this.selectLeafFlags = evcPerUnic.selectLeafFlags();
+            this.valueLeafFlags = evcPerUnic.valueLeafFlags();
+        }
+
+        /**
+         * Method to allow ceVlanMap to be modified.
+         * @param additionalCeVlanMap An addition to the existing ceVlanMap
+         * @return The updated builder
+         */
+        public EvcPerUnicBuilder addToCeVlanMap(ServiceListType additionalCeVlanMap) {
+            String combinedCeVlanMap =
+                    CeVlanMapUtils.combineVlanSets(ceVlanMap.string(), additionalCeVlanMap.string());
+            //If it contains 0 we should remove it
+            ceVlanMap = new ServiceListType(
+                    CeVlanMapUtils.removeZeroIfPossible(combinedCeVlanMap));
+
+            return this;
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnin.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnin.java
new file mode 100644
index 0000000..47b438e
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/CustomEvcPerUnin.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni;
+
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types
+    .rev20160229.mseatypes.ServiceListType;
+
+/**
+ * A custom implementation of the DefaultEvcPerUnin - especially its Builder.
+ *
+ * This allows the EvcPerUniN to be modified after creation. These additions to the
+ * builder are necessary because in the EA1000 YANG model the EvcPerUniN can
+ * be added at separate stages
+ */
+public class CustomEvcPerUnin extends DefaultEvcPerUnin {
+    public static EvcPerUninBuilder builder(EvcPerUnin evcPerUnin) {
+        return new EvcPerUninBuilder(evcPerUnin);
+    }
+
+    public static EvcPerUninBuilder builder() {
+        return new EvcPerUninBuilder();
+    }
+
+    public static class EvcPerUninBuilder extends DefaultEvcPerUnin.EvcPerUninBuilder {
+
+        /**
+         * Allow a new builder to be constructed
+         */
+        public EvcPerUninBuilder() {
+            valueLeafFlags.set(LeafIdentifier.CEVLANMAP.getLeafIndex());
+            this.ceVlanMap = new ServiceListType("0");
+            valueLeafFlags.set(LeafIdentifier.INGRESSBWPGROUPINDEX.getLeafIndex());
+            this.ingressBwpGroupIndex = 0;
+        }
+
+        /**
+         * Allow a builder to be constructed from an existing EvcPerUnin
+         * @param evcPerUnin An existing EvcPerUnin
+         */
+        public EvcPerUninBuilder(EvcPerUnin evcPerUnin) {
+            this.ceVlanMap = evcPerUnin.ceVlanMap();
+            this.evcPerUniServiceType = evcPerUnin.evcPerUniServiceType();
+            this.ingressBwpGroupIndex = evcPerUnin.ingressBwpGroupIndex();
+            this.tagManipulation = evcPerUnin.tagManipulation();
+            this.flowMapping = evcPerUnin.flowMapping();
+            this.yangEvcPerUninOpType = evcPerUnin.yangEvcPerUninOpType();
+            this.yangAugmentedInfoMap = evcPerUnin.yangAugmentedInfoMap();
+            this.selectLeafFlags = evcPerUnin.selectLeafFlags();
+            this.valueLeafFlags = evcPerUnin.valueLeafFlags();
+        }
+
+        /**
+         * Method to allow ceVlanMap to be modified.
+         * @param additionalCeVlanMap An addition to the existing ceVlanMap
+         * @return The updated builder
+         */
+        public EvcPerUninBuilder addToCeVlanMap(ServiceListType additionalCeVlanMap) {
+            String combinedCeVlanMap =
+                    CeVlanMapUtils.combineVlanSets(ceVlanMap.string(), additionalCeVlanMap.string());
+            //If it contains 0 we should remove it
+            ceVlanMap = new ServiceListType(
+                    CeVlanMapUtils.removeZeroIfPossible(combinedCeVlanMap));
+            return this;
+        }
+    }
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/package-info.java
new file mode 100644
index 0000000..3617d86
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/evcperuni/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/package-info.java
new file mode 100644
index 0000000..7813b61
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/evc/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni.evc;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/package-info.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/package-info.java
new file mode 100644
index 0000000..3bdeda0
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/yang/gen/v1/http/www/microsemi/com/microsemi/edge/assure/msea/uni/evc/service/rev20160317/mseaunievcservice/mefservices/uni/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service
+    .rev20160317.mseaunievcservice.mefservices.uni;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/resources/YangMetaData.ser b/drivers/microsemi/ea1000yang/src/main/resources/YangMetaData.ser
new file mode 100644
index 0000000..581bd77
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/resources/YangMetaData.ser
Binary files differ
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ENTITY-STATE-TC-MIB.yang b/drivers/microsemi/ea1000yang/src/main/yang/ENTITY-STATE-TC-MIB.yang
new file mode 100644
index 0000000..c2d8a59
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ENTITY-STATE-TC-MIB.yang
@@ -0,0 +1,184 @@
+/*
+ * This module has been generated by smidump 0.4.8:
+ *
+ *      smidump -f yang ENTITY-STATE-TC-MIB
+ *
+ * Do not edit. Edit the source file instead!
+ */
+
+module ENTITY-STATE-TC-MIB {
+
+  /*** NAMESPACE / PREFIX DEFINITION ***/
+
+  namespace "urn:ietf:params:xml:ns:yang:smiv2:ENTITY-STATE-TC-MIB";
+  prefix "entity-state";
+
+  /*** LINKAGE (IMPORTS / INCLUDES) ***/
+
+
+  /*** META INFORMATION ***/
+
+  organization
+   "IETF Entity MIB Working Group";
+
+  contact
+   "General Discussion: entmib@ietf.org
+    To Subscribe:
+    http://www.ietf.org/mailman/listinfo/entmib
+
+    http://www.ietf.org/html.charters/entmib-charter.html
+
+    Sharon Chisholm
+    Nortel Networks
+    PO Box 3511 Station C
+    Ottawa, Ont.  K1Y 4H7
+    Canada
+    schishol@nortel.com
+
+    David T. Perkins
+    548 Qualbrook Ct
+    San Jose, CA 95110
+    USA
+    Phone: 408 394-8702
+    dperkins@snmpinfo.com";
+
+  description
+   "This MIB defines state textual conventions.
+
+    Copyright (C) The Internet Society 2005.  This version
+    of this MIB module is part of RFC 4268;  see the RFC
+    itself for full legal notices.";
+
+  revision "2005-11-22" {
+    description
+     "Initial version, published as RFC 4268.";
+  }
+
+  /*** TYPE DEFINITIONS ***/
+
+  typedef EntityAdminState {
+    type enumeration {
+      enum unknown      { value 1; }
+      enum locked       { value 2; }
+      enum shuttingDown { value 3; }
+      enum unlocked     { value 4; }
+    }
+    description
+     " Represents the various possible administrative states.
+
+
+
+
+
+      A value of 'locked' means the resource is administratively
+      prohibited from use.  A value of 'shuttingDown' means that
+      usage is administratively limited to current instances of
+      use.  A value of 'unlocked' means the resource is not
+      administratively prohibited from use.  A value of
+      'unknown' means that this resource is unable to
+      report administrative state.";
+  }
+
+  typedef EntityOperState {
+    type enumeration {
+      enum unknown  { value 1; }
+      enum disabled { value 2; }
+      enum enabled  { value 3; }
+      enum testing  { value 4; }
+    }
+    description
+     " Represents the possible values of operational states.
+
+      A value of 'disabled' means the resource is totally
+      inoperable.  A value of 'enabled' means the resource
+      is partially or fully operable.  A value of 'testing'
+      means the resource is currently being tested
+      and cannot therefore report whether it is operational
+      or not.  A value of 'unknown' means that this
+      resource is unable to report operational state.";
+  }
+
+  typedef EntityUsageState {
+    type enumeration {
+      enum unknown { value 1; }
+      enum idle    { value 2; }
+      enum active  { value 3; }
+      enum busy    { value 4; }
+    }
+    description
+     " Represents the possible values of usage states.
+      A value of 'idle' means the resource is servicing no
+      users.  A value of 'active' means the resource is
+      currently in use and it has sufficient spare capacity
+      to provide for additional users.  A value of 'busy'
+      means the resource is currently in use, but it
+      currently has no spare capacity to provide for
+      additional users.  A value of 'unknown' means
+      that this resource is unable to report usage state.";
+  }
+
+  typedef EntityAlarmStatus {
+    type bits {
+      bit unknown       { position 0; }
+      bit underRepair   { position 1; }
+      bit critical      { position 2; }
+      bit major         { position 3; }
+      bit minor         { position 4; }
+      bit warning       { position 5; }
+      bit indeterminate { position 6; }
+    }
+    description     
+     " Represents the possible values of alarm status.
+      An Alarm [RFC3877] is a persistent indication
+      of an error or warning condition.
+
+      When no bits of this attribute are set, then no active
+      alarms are known against this entity and it is not under
+      repair.
+
+      When the 'value of underRepair' is set, the resource is
+      currently being repaired, which, depending on the
+      implementation, may make the other values in this bit
+      string not meaningful.
+
+      When the value of 'critical' is set, one or more critical
+      alarms are active against the resource.  When the value
+      of 'major' is set, one or more major alarms are active
+      against the resource.  When the value of 'minor' is set,
+      one or more minor alarms are active against the resource.
+      When the value of 'warning' is set, one or more warning
+      alarms are active against the resource.  When the value
+      of 'indeterminate' is set, one or more alarms of whose
+      perceived severity cannot be determined are active
+      against this resource.
+
+      A value of 'unknown' means that this resource is
+      unable to report alarm state.";
+  }
+
+  typedef EntityStandbyStatus {
+    type enumeration {
+      enum unknown          { value 1; }
+      enum hotStandby       { value 2; }
+      enum coldStandby      { value 3; }
+      enum providingService { value 4; }
+    }
+    description     
+     " Represents the possible values of standby status.
+
+      A value of 'hotStandby' means the resource is not
+      providing service, but it will be immediately able to
+      take over the role of the resource to be backed up,
+      without the need for initialization activity, and will
+      contain the same information as the resource to be
+      backed up.  A value of 'coldStandy' means that the
+      resource is to back up another resource, but will not
+      be immediately able to take over the role of a resource
+      to be backed up, and will require some initialization
+      activity.  A value of 'providingService' means the
+      resource is providing service.  A value of
+      'unknown' means that this resource is unable to
+      report standby state.";
+  }
+
+} /* end of module ENTITY-STATE-TC-MIB */
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/fpga-internal.yang b/drivers/microsemi/ea1000yang/src/main/yang/fpga-internal.yang
new file mode 100644
index 0000000..87fabb1
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/fpga-internal.yang
@@ -0,0 +1,266 @@
+module fpga-internal {
+
+	/*** NAMESPACE / PREFIX DEFINITION ***/
+
+	namespace "http://www.microsemi.com/fpga-int";
+	prefix "fpga-int";
+
+	/*** META INFORMATION ***/
+
+	organization
+	"Microsemi Inc., FTD Division";
+
+	contact
+	"Web URL: http://www.microsemi.com/
+	E-mail: info@microsemi.com
+	Postal: Microsemi Corporation Corporate Headquarters
+	One Enterprise Aliso Viejo,
+	CA 92656
+	U.S.A.
+	Phone: +1 949 380 6100
+	Fax: +1 949 215-4996";
+
+	description
+	"This YANG module add internal procedures to access FPAA hardware
+
+	Copyright 2015 Microsemi Inc.
+	All rights reserved.";
+
+	revision "2015-11-30" {
+		description
+		"Initial version - Sean Condon, Microsemi";
+	}
+
+	typedef sixteen-bit-hex {
+		type string {
+			pattern '0x[0-9a-fA-F]{4}';
+		}
+
+		description
+		"A 16-bit address represented as a hexadecimal number";
+	}
+
+	typedef thirtytwo-bit-hex {
+		type string {
+			pattern '0x[0-9a-fA-F]{8}';
+		}
+
+		description
+		"A 32-bit address represented as a hexadecimal number";
+	}
+	
+	typedef thirtytwobit-data {
+		type string {
+			pattern '([0-9a-fA-F]{8}(:[0-9a-fA-F]{8})*)?';
+		}
+
+		description
+		"A set of 32 bit data values represented as colon separated 
+		hex strings e.g. 'A1B2C3D4:B2C3D4F5:C3D4E5F6'";
+	}
+
+	typedef select-ram-enum {
+		type enumeration {
+			enum pkt-store-sel {value 0;}
+			enum probe-store-sel {value 1;}
+			enum xconn-store-sel {value 2;}
+			enum rmep-err-store-sel {value 3;}
+			enum rx-lmep-map-sel {value 4;}
+			enum cpu-sys-capt-fifo-sel {value 5;}
+			enum rmep-ram-sel {value 6;}
+			enum xconn-ram-sel {value 7;}
+			enum rmep-err-ram-sel {value 8;}
+			enum tx-lmep-map-sel {value 9;}
+			enum ext-sram-sel {value 10;}
+			enum car-rmac-sel {value 11;}
+			enum sys-mac-sel {value 12;}
+			enum rx-carr-data-fifo-sel {value 13;}
+			enum line-stats-ram-sel {value 14;}
+			enum cpu-sys-capt-info-fifo-sel {value 15;}
+			enum vlan-info-ram-sel {value 16;}
+			enum lbm-store-sel {value 17;}
+			enum lbr-ram-sel {value 18;}
+			enum mc-lbr-store-sel {value 19;}
+			enum port-mac-ram-sel {value 20;}
+			enum pm-db-ram-sel {value 22;}
+			enum tx-lb-ram-sel {value 24;}
+			enum tlv-ram-sel {value 25;}
+			enum cpu-capt-fifo-sel {value 26;}
+			enum cpu-capt-info-fifo-sel {value 27;}
+			enum policer-cfg-ram-sel {value 28;}
+			enum policer-ctxt-ram-sel {value 29;}
+			enum cpu-sys-tx-ram-sel {value 30;}
+			enum policer-stats-ram-sel {value 31;}
+		}
+	}
+	
+	
+	container fpga-internal {
+		presence "Supports FPGA direct access";
+	}
+	
+	rpc read-registers {
+
+		description "Method to read directly from hardware registers";
+		input {
+			choice hex-or-dec {
+				
+				description "Enter the starting address in either decimal (0-65535) 
+						or hexadecimal (preceeded with 0x)";
+				mandatory true;
+
+				case hex {
+					leaf start-address-hex {
+						type sixteen-bit-hex;
+					}
+				}
+
+				case decimal {
+					leaf start-address-dec {
+						type uint16;
+					}
+				}
+			}
+
+			leaf num-locations {
+				type uint8 {
+					range 1..max;
+				}
+				description "The number of following locations (addresses) to read from";
+				default 1;
+			}
+		}
+
+		output {
+            anyxml data {
+				description "A set of 32 bit data values represented 
+						as colon separated 8 character hexadecimal values";
+			}
+		}
+	}
+	
+
+	rpc write-registers {
+
+		description "Method to write directly to hardware registers.
+				If a number of data values are given then subsequent
+				locations are written to";
+		input {
+			choice hex-or-dec {
+				
+				description "Enter the starting address in either decimal (0-65535) 
+						or hexadecimal (preceeded with 0x)";
+				
+				case hex {
+					leaf start-address-hex {
+						type sixteen-bit-hex;
+					}
+				}
+
+				case decimal {
+					leaf start-address-dec {
+						type uint16;
+					}
+				}
+			}
+
+			leaf value-hex-32 {
+				type thirtytwobit-data;
+				description "A set of 32 bit data values represented 
+						as colon separated 8 character hexadecimal values
+						e.g. ffffffff:ffffffff:ffffffff
+						The number of locations written to will be 
+						determinted by the number of such values given";
+			}
+		}
+	}
+
+	rpc read-ram {
+
+		description "Method to read directly from hardware RAM";
+		input {
+			leaf ram {
+				type select-ram-enum;
+				mandatory true;
+				description "The type of RAM to read from";
+			}
+			
+			choice hex-or-dec {
+				
+				description "Enter the starting address in either decimal (0-65535) 
+						or hexadecimal (preceeded with 0x)";
+				mandatory true;
+
+				case hex {
+					leaf start-address-hex {
+						type thirtytwo-bit-hex;
+					}
+				}
+
+				case decimal {
+					leaf start-address-dec {
+						type uint32;
+					}
+				}
+			}
+			
+			leaf num-locations {
+				type uint8 {
+					range 1..max;
+				}
+				description "The number of following locations (addresses) to read from";
+				default 1;
+			}
+		}
+
+		output {
+            anyxml data {
+				description "A set of 32 bit data values represented 
+						as colon separated 8 character hexadecimal values";
+			}
+		}
+	}
+
+	rpc write-ram {
+
+		description "Method to write directly to RAM registers.
+				If a number of data values are given then subsequent
+				locations are written to";
+		input {
+			leaf ram {
+				type select-ram-enum;
+				mandatory true;
+				description "The type of RAM to read from";
+			}
+
+			choice hex-or-dec {
+				
+				description "Enter the starting address in either decimal (0-65535) 
+						or hexadecimal (preceeded with 0x)";
+				mandatory true;
+				
+				case hex {
+					leaf start-address-hex {
+						type thirtytwo-bit-hex;
+					}
+				}
+
+				case decimal {
+					leaf start-address-dec {
+						type uint32;
+					}
+				}
+			}
+
+			leaf value-hex-32 {
+				type thirtytwobit-data;
+				description "A set of 32 bit data values represented 
+						as colon separated 8 character hexadecimal values
+						e.g. ffffffff:ffffffff:ffffffff
+						The number of locations written to will be 
+						determinted by the number of such values given";
+			}
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/iana-crypt-hash.yang b/drivers/microsemi/ea1000yang/src/main/yang/iana-crypt-hash.yang
new file mode 100644
index 0000000..3a9ef55
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/iana-crypt-hash.yang
@@ -0,0 +1,121 @@
+module iana-crypt-hash {
+  namespace "urn:ietf:params:xml:ns:yang:iana-crypt-hash";
+  prefix ianach;
+
+  organization "IANA";
+  contact
+    "        Internet Assigned Numbers Authority
+
+     Postal: ICANN
+             12025 Waterfront Drive, Suite 300
+             Los Angeles, CA  90094-2536
+             United States
+
+     Tel:    +1 310 301 5800
+     E-Mail: iana@iana.org>";
+  description
+    "This YANG module defines a type for storing passwords
+     using a hash function and features to indicate which hash
+     functions are supported by an implementation.
+
+     The latest revision of this YANG module can be obtained from
+     the IANA web site.
+
+     Requests for new values should be made to IANA via
+     email (iana@iana.org).
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     The initial version of this YANG module is part of RFC 7317;
+     see the RFC itself for full legal notices.";
+
+  revision 2014-08-06 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7317: A YANG Data Model for System Management";
+  }
+
+  typedef crypt-hash {
+    type string {
+      pattern
+        '$0$.*' //Escaped all $ as Java Pattern matcher will interpret them otherwise 
+      + '|$1$[a-zA-Z0-9./]{1,8}$[a-zA-Z0-9./]{22}'
+      + '|$5$(rounds=\d+$)?[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{43}'
+      + '|$6$(rounds=\d+$)?[a-zA-Z0-9./]{1,16}$[a-zA-Z0-9./]{86}';
+    }
+    description
+      "The crypt-hash type is used to store passwords using
+       a hash function.  The algorithms for applying the hash
+       function and encoding the result are implemented in
+       various UNIX systems as the function crypt(3).
+
+       A value of this type matches one of the forms:
+
+         $0$<clear text password>
+         $<id>$<salt>$<password hash>
+         $<id>$<parameter>$<salt>$<password hash>
+
+       The '$0$' prefix signals that the value is clear text.  When
+       such a value is received by the server, a hash value is
+       calculated, and the string '$<id>$<salt>$' or
+       $<id>$<parameter>$<salt>$ is prepended to the result.  This
+       value is stored in the configuration data store.
+
+       If a value starting with '$<id>$', where <id> is not '0', is
+       received, the server knows that the value already represents a
+       hashed value and stores it 'as is' in the data store.
+
+       When a server needs to verify a password given by a user, it
+       finds the stored password hash string for that user, extracts
+       the salt, and calculates the hash with the salt and given
+       password as input.  If the calculated hash value is the same
+       as the stored value, the password given by the client is
+       accepted.
+
+       This type defines the following hash functions:
+
+         id | hash function | feature
+         ---+---------------+-------------------
+          1 | MD5           | crypt-hash-md5
+          5 | SHA-256       | crypt-hash-sha-256
+          6 | SHA-512       | crypt-hash-sha-512
+
+       The server indicates support for the different hash functions
+       by advertising the corresponding feature.";
+    reference
+      "IEEE Std 1003.1-2008 - crypt() function
+       RFC 1321: The MD5 Message-Digest Algorithm
+       FIPS.180-4.2012: Secure Hash Standard (SHS)";
+  }
+
+  feature crypt-hash-md5 {
+    description
+      "Indicates that the device supports the MD5
+       hash function in 'crypt-hash' values.";
+    reference "RFC 1321: The MD5 Message-Digest Algorithm";
+  }
+
+  feature crypt-hash-sha-256 {
+    description
+      "Indicates that the device supports the SHA-256
+       hash function in 'crypt-hash' values.";
+    reference "FIPS.180-4.2012: Secure Hash Standard (SHS)";
+  }
+
+  feature crypt-hash-sha-512 {
+    description
+      "Indicates that the device supports the SHA-512
+       hash function in 'crypt-hash' values.";
+    reference "FIPS.180-4.2012: Secure Hash Standard (SHS)";
+  }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/iana-if-type.yang b/drivers/microsemi/ea1000yang/src/main/yang/iana-if-type.yang
new file mode 100644
index 0000000..fb48b6b
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/iana-if-type.yang
@@ -0,0 +1,1507 @@
+   module iana-if-type {
+     namespace "urn:ietf:params:xml:ns:yang:iana-if-type";
+     prefix ianaift;
+
+     import ietf-interfaces {
+       prefix if;
+     }
+
+     organization "IANA";
+     contact
+       "        Internet Assigned Numbers Authority
+
+        Postal: ICANN
+                4676 Admiralty Way, Suite 330
+                Marina del Rey, CA 90292
+
+        Tel:    +1 310 823 9358
+        <mailto:iana@iana.org>";
+
+     description
+       "This YANG module defines YANG identities for IANA-registered
+        interface types.
+
+        This YANG module is maintained by IANA and reflects the
+        'ifType definitions' registry.
+
+        The latest revision of this YANG module can be obtained from
+        the IANA web site.
+
+        Requests for new values should be made to IANA via
+        email (iana@iana.org).
+
+        Copyright (c) 2014 IETF Trust and the persons identified as
+        authors of the code.  All rights reserved.
+
+        Redistribution and use in source and binary forms, with or
+        without modification, is permitted pursuant to, and subject
+        to the license terms contained in, the Simplified BSD License
+        set forth in Section 4.c of the IETF Trust's Legal Provisions
+        Relating to IETF Documents
+        (http://trustee.ietf.org/license-info).
+
+        The initial version of this YANG module is part of RFC 7224;
+        see the RFC itself for full legal notices.";
+       reference
+         "IANA 'ifType definitions' registry.
+          <http://www.iana.org/assignments/smi-numbers>";
+
+     revision 2014-05-08 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 7224: IANA Interface Type YANG Module";
+     }
+
+     identity iana-interface-type {
+       base if:interface-type;
+       description
+         "This identity is used as a base for all interface types
+          defined in the 'ifType definitions' registry.";
+     }
+     identity other {
+       base iana-interface-type;
+     }
+     identity regular1822 {
+       base iana-interface-type;
+     }
+     identity hdh1822 {
+       base iana-interface-type;
+     }
+     identity ddnX25 {
+       base iana-interface-type;
+     }
+     identity rfc877x25 {
+       base iana-interface-type;
+       reference
+         "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer";
+     }
+     identity ethernetCsmacd {
+       base iana-interface-type;
+       description
+         "For all Ethernet-like interfaces, regardless of speed,
+          as per RFC 3635.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity iso88023Csmacd {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Deprecated via RFC 3635.
+          Use ethernetCsmacd(6) instead.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity iso88024TokenBus {
+       base iana-interface-type;
+     }
+     identity iso88025TokenRing {
+       base iana-interface-type;
+     }
+     identity iso88026Man {
+       base iana-interface-type;
+     }
+     identity starLan {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Deprecated via RFC 3635.
+          Use ethernetCsmacd(6) instead.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity proteon10Mbit {
+       base iana-interface-type;
+     }
+     identity proteon80Mbit {
+       base iana-interface-type;
+     }
+     identity hyperchannel {
+       base iana-interface-type;
+     }
+     identity fddi {
+       base iana-interface-type;
+       reference
+         "RFC 1512 - FDDI Management Information Base";
+     }
+     identity lapb {
+       base iana-interface-type;
+       reference
+         "RFC 1381 - SNMP MIB Extension for X.25 LAPB";
+     }
+     identity sdlc {
+       base iana-interface-type;
+     }
+     identity ds1 {
+       base iana-interface-type;
+       description
+         "DS1-MIB.";
+       reference
+         "RFC 4805 - Definitions of Managed Objects for the
+                     DS1, J1, E1, DS2, and E2 Interface Types";
+     }
+     identity e1 {
+       base iana-interface-type;
+       status obsolete;
+       description
+         "Obsolete; see DS1-MIB.";
+       reference
+         "RFC 4805 - Definitions of Managed Objects for the
+                     DS1, J1, E1, DS2, and E2 Interface Types";
+     }
+     identity basicISDN {
+       base iana-interface-type;
+       description
+         "No longer used.  See also RFC 2127.";
+     }
+     identity primaryISDN {
+       base iana-interface-type;
+       description
+         "No longer used.  See also RFC 2127.";
+     }
+     identity propPointToPointSerial {
+       base iana-interface-type;
+       description
+         "Proprietary serial.";
+     }
+     identity ppp {
+       base iana-interface-type;
+     }
+     identity softwareLoopback {
+       base iana-interface-type;
+     }
+     identity eon {
+       base iana-interface-type;
+       description
+         "CLNP over IP.";
+     }
+     identity ethernet3Mbit {
+       base iana-interface-type;
+     }
+     identity nsip {
+       base iana-interface-type;
+       description
+         "XNS over IP.";
+     }
+     identity slip {
+       base iana-interface-type;
+       description
+         "Generic SLIP.";
+     }
+     identity ultra {
+       base iana-interface-type;
+       description
+         "Ultra Technologies.";
+     }
+     identity ds3 {
+       base iana-interface-type;
+       description
+         "DS3-MIB.";
+       reference
+         "RFC 3896 - Definitions of Managed Objects for the
+                     DS3/E3 Interface Type";
+     }
+     identity sip {
+       base iana-interface-type;
+       description
+         "SMDS, coffee.";
+       reference
+         "RFC 1694 - Definitions of Managed Objects for SMDS
+                     Interfaces using SMIv2";
+     }
+     identity frameRelay {
+       base iana-interface-type;
+       description
+         "DTE only.";
+       reference
+         "RFC 2115 - Management Information Base for Frame Relay
+                     DTEs Using SMIv2";
+     }
+     identity rs232 {
+       base iana-interface-type;
+       reference
+         "RFC 1659 - Definitions of Managed Objects for RS-232-like
+                     Hardware Devices using SMIv2";
+     }
+     identity para {
+       base iana-interface-type;
+       description
+         "Parallel-port.";
+       reference
+         "RFC 1660 - Definitions of Managed Objects for
+                     Parallel-printer-like Hardware Devices using
+                     SMIv2";
+     }
+     identity arcnet {
+       base iana-interface-type;
+       description
+         "ARCnet.";
+     }
+     identity arcnetPlus {
+       base iana-interface-type;
+       description
+         "ARCnet Plus.";
+     }
+     identity atm {
+       base iana-interface-type;
+       description
+         "ATM cells.";
+     }
+     identity miox25 {
+       base iana-interface-type;
+       reference
+         "RFC 1461 - SNMP MIB extension for Multiprotocol
+                     Interconnect over X.25";
+     }
+     identity sonet {
+       base iana-interface-type;
+       description
+         "SONET or SDH.";
+     }
+     identity x25ple {
+       base iana-interface-type;
+       reference
+         "RFC 2127 - ISDN Management Information Base using SMIv2";
+     }
+     identity iso88022llc {
+       base iana-interface-type;
+     }
+     identity localTalk {
+       base iana-interface-type;
+     }
+     identity smdsDxi {
+       base iana-interface-type;
+     }
+     identity frameRelayService {
+       base iana-interface-type;
+       description
+         "FRNETSERV-MIB.";
+       reference
+         "RFC 2954 - Definitions of Managed Objects for Frame
+                     Relay Service";
+     }
+     identity v35 {
+       base iana-interface-type;
+     }
+     identity hssi {
+       base iana-interface-type;
+     }
+     identity hippi {
+       base iana-interface-type;
+     }
+     identity modem {
+       base iana-interface-type;
+       description
+         "Generic modem.";
+     }
+     identity aal5 {
+       base iana-interface-type;
+       description
+         "AAL5 over ATM.";
+     }
+     identity sonetPath {
+       base iana-interface-type;
+     }
+     identity sonetVT {
+       base iana-interface-type;
+     }
+     identity smdsIcip {
+       base iana-interface-type;
+       description
+         "SMDS InterCarrier Interface.";
+     }
+     identity propVirtual {
+       base iana-interface-type;
+       description
+         "Proprietary virtual/internal.";
+       reference
+         "RFC 2863 - The Interfaces Group MIB";
+     }
+     identity propMultiplexor {
+       base iana-interface-type;
+       description
+         "Proprietary multiplexing.";
+       reference
+         "RFC 2863 - The Interfaces Group MIB";
+     }
+     identity ieee80212 {
+       base iana-interface-type;
+       description
+         "100BaseVG.";
+     }
+     identity fibreChannel {
+       base iana-interface-type;
+       description
+         "Fibre Channel.";
+     }
+     identity hippiInterface {
+       base iana-interface-type;
+       description
+         "HIPPI interfaces.";
+     }
+     identity frameRelayInterconnect {
+       base iana-interface-type;
+       status obsolete;
+       description
+         "Obsolete; use either
+          frameRelay(32) or frameRelayService(44).";
+     }
+     identity aflane8023 {
+       base iana-interface-type;
+       description
+         "ATM Emulated LAN for 802.3.";
+     }
+     identity aflane8025 {
+       base iana-interface-type;
+       description
+         "ATM Emulated LAN for 802.5.";
+     }
+     identity cctEmul {
+       base iana-interface-type;
+       description
+         "ATM Emulated circuit.";
+     }
+     identity fastEther {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Obsoleted via RFC 3635.
+          ethernetCsmacd(6) should be used instead.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity isdn {
+       base iana-interface-type;
+       description
+         "ISDN and X.25.";
+       reference
+         "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN
+                     in the Packet Mode";
+     }
+     identity v11 {
+       base iana-interface-type;
+       description
+         "CCITT V.11/X.21.";
+     }
+     identity v36 {
+       base iana-interface-type;
+       description
+         "CCITT V.36.";
+     }
+     identity g703at64k {
+       base iana-interface-type;
+       description
+         "CCITT G703 at 64Kbps.";
+     }
+     identity g703at2mb {
+       base iana-interface-type;
+       status obsolete;
+       description
+         "Obsolete; see DS1-MIB.";
+     }
+     identity qllc {
+       base iana-interface-type;
+       description
+         "SNA QLLC.";
+     }
+     identity fastEtherFX {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Obsoleted via RFC 3635.
+          ethernetCsmacd(6) should be used instead.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity channel {
+       base iana-interface-type;
+       description
+         "Channel.";
+     }
+     identity ieee80211 {
+       base iana-interface-type;
+       description
+         "Radio spread spectrum.";
+     }
+     identity ibm370parChan {
+       base iana-interface-type;
+       description
+         "IBM System 360/370 OEMI Channel.";
+     }
+     identity escon {
+       base iana-interface-type;
+       description
+         "IBM Enterprise Systems Connection.";
+     }
+     identity dlsw {
+       base iana-interface-type;
+       description
+         "Data Link Switching.";
+     }
+     identity isdns {
+       base iana-interface-type;
+       description
+         "ISDN S/T interface.";
+     }
+     identity isdnu {
+       base iana-interface-type;
+       description
+         "ISDN U interface.";
+     }
+     identity lapd {
+       base iana-interface-type;
+       description
+         "Link Access Protocol D.";
+     }
+     identity ipSwitch {
+       base iana-interface-type;
+       description
+         "IP Switching Objects.";
+     }
+     identity rsrb {
+       base iana-interface-type;
+       description
+         "Remote Source Route Bridging.";
+     }
+     identity atmLogical {
+       base iana-interface-type;
+       description
+         "ATM Logical Port.";
+       reference
+         "RFC 3606 - Definitions of Supplemental Managed Objects
+                     for ATM Interface";
+     }
+     identity ds0 {
+       base iana-interface-type;
+       description
+         "Digital Signal Level 0.";
+       reference
+         "RFC 2494 - Definitions of Managed Objects for the DS0
+                     and DS0 Bundle Interface Type";
+     }
+     identity ds0Bundle {
+       base iana-interface-type;
+       description
+         "Group of ds0s on the same ds1.";
+       reference
+         "RFC 2494 - Definitions of Managed Objects for the DS0
+                     and DS0 Bundle Interface Type";
+     }
+     identity bsc {
+       base iana-interface-type;
+       description
+         "Bisynchronous Protocol.";
+     }
+     identity async {
+       base iana-interface-type;
+       description
+         "Asynchronous Protocol.";
+     }
+     identity cnr {
+       base iana-interface-type;
+       description
+         "Combat Net Radio.";
+     }
+     identity iso88025Dtr {
+       base iana-interface-type;
+       description
+         "ISO 802.5r DTR.";
+     }
+     identity eplrs {
+       base iana-interface-type;
+       description
+         "Ext Pos Loc Report Sys.";
+     }
+     identity arap {
+       base iana-interface-type;
+       description
+         "Appletalk Remote Access Protocol.";
+     }
+     identity propCnls {
+       base iana-interface-type;
+       description
+         "Proprietary Connectionless Protocol.";
+     }
+     identity hostPad {
+       base iana-interface-type;
+       description
+         "CCITT-ITU X.29 PAD Protocol.";
+     }
+     identity termPad {
+       base iana-interface-type;
+       description
+         "CCITT-ITU X.3 PAD Facility.";
+     }
+     identity frameRelayMPI {
+       base iana-interface-type;
+       description
+         "Multiproto Interconnect over FR.";
+     }
+     identity x213 {
+       base iana-interface-type;
+       description
+         "CCITT-ITU X213.";
+     }
+     identity adsl {
+       base iana-interface-type;
+       description
+         "Asymmetric Digital Subscriber Loop.";
+     }
+     identity radsl {
+       base iana-interface-type;
+       description
+         "Rate-Adapt. Digital Subscriber Loop.";
+     }
+     identity sdsl {
+       base iana-interface-type;
+       description
+         "Symmetric Digital Subscriber Loop.";
+     }
+     identity vdsl {
+       base iana-interface-type;
+       description
+         "Very H-Speed Digital Subscrib. Loop.";
+     }
+     identity iso88025CRFPInt {
+       base iana-interface-type;
+       description
+         "ISO 802.5 CRFP.";
+     }
+     identity myrinet {
+       base iana-interface-type;
+       description
+         "Myricom Myrinet.";
+     }
+     identity voiceEM {
+       base iana-interface-type;
+       description
+         "Voice recEive and transMit.";
+     }
+     identity voiceFXO {
+       base iana-interface-type;
+       description
+         "Voice Foreign Exchange Office.";
+     }
+     identity voiceFXS {
+       base iana-interface-type;
+       description
+         "Voice Foreign Exchange Station.";
+     }
+     identity voiceEncap {
+       base iana-interface-type;
+       description
+         "Voice encapsulation.";
+     }
+     identity voiceOverIp {
+       base iana-interface-type;
+       description
+         "Voice over IP encapsulation.";
+     }
+     identity atmDxi {
+       base iana-interface-type;
+       description
+         "ATM DXI.";
+     }
+     identity atmFuni {
+       base iana-interface-type;
+       description
+         "ATM FUNI.";
+     }
+     identity atmIma {
+       base iana-interface-type;
+       description
+         "ATM IMA.";
+     }
+     identity pppMultilinkBundle {
+       base iana-interface-type;
+       description
+         "PPP Multilink Bundle.";
+     }
+     identity ipOverCdlc {
+       base iana-interface-type;
+       description
+         "IBM ipOverCdlc.";
+     }
+     identity ipOverClaw {
+       base iana-interface-type;
+       description
+         "IBM Common Link Access to Workstn.";
+     }
+     identity stackToStack {
+       base iana-interface-type;
+       description
+         "IBM stackToStack.";
+     }
+     identity virtualIpAddress {
+       base iana-interface-type;
+       description
+         "IBM VIPA.";
+     }
+     identity mpc {
+       base iana-interface-type;
+       description
+         "IBM multi-protocol channel support.";
+     }
+     identity ipOverAtm {
+       base iana-interface-type;
+       description
+         "IBM ipOverAtm.";
+       reference
+         "RFC 2320 - Definitions of Managed Objects for Classical IP
+                     and ARP Over ATM Using SMIv2 (IPOA-MIB)";
+     }
+     identity iso88025Fiber {
+       base iana-interface-type;
+       description
+         "ISO 802.5j Fiber Token Ring.";
+     }
+     identity tdlc {
+       base iana-interface-type;
+       description
+         "IBM twinaxial data link control.";
+     }
+     identity gigabitEthernet {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Obsoleted via RFC 3635.
+          ethernetCsmacd(6) should be used instead.";
+       reference
+         "RFC 3635 - Definitions of Managed Objects for the
+                     Ethernet-like Interface Types";
+     }
+     identity hdlc {
+       base iana-interface-type;
+       description
+         "HDLC.";
+     }
+     identity lapf {
+       base iana-interface-type;
+       description
+         "LAP F.";
+     }
+     identity v37 {
+       base iana-interface-type;
+       description
+         "V.37.";
+     }
+     identity x25mlp {
+       base iana-interface-type;
+       description
+         "Multi-Link Protocol.";
+     }
+     identity x25huntGroup {
+       base iana-interface-type;
+       description
+         "X25 Hunt Group.";
+     }
+     identity transpHdlc {
+       base iana-interface-type;
+       description
+         "Transp HDLC.";
+     }
+     identity interleave {
+       base iana-interface-type;
+       description
+         "Interleave channel.";
+     }
+     identity fast {
+       base iana-interface-type;
+       description
+         "Fast channel.";
+     }
+     identity ip {
+       base iana-interface-type;
+       description
+         "IP (for APPN HPR in IP networks).";
+     }
+     identity docsCableMaclayer {
+       base iana-interface-type;
+       description
+         "CATV Mac Layer.";
+     }
+     identity docsCableDownstream {
+       base iana-interface-type;
+       description
+         "CATV Downstream interface.";
+     }
+     identity docsCableUpstream {
+       base iana-interface-type;
+       description
+         "CATV Upstream interface.";
+     }
+     identity a12MppSwitch {
+       base iana-interface-type;
+       description
+         "Avalon Parallel Processor.";
+     }
+     identity tunnel {
+       base iana-interface-type;
+       description
+         "Encapsulation interface.";
+     }
+     identity coffee {
+       base iana-interface-type;
+       description
+         "Coffee pot.";
+       reference
+         "RFC 2325 - Coffee MIB";
+     }
+     identity ces {
+       base iana-interface-type;
+       description
+         "Circuit Emulation Service.";
+     }
+     identity atmSubInterface {
+       base iana-interface-type;
+       description
+         "ATM Sub Interface.";
+     }
+     identity l2vlan {
+       base iana-interface-type;
+       description
+         "Layer 2 Virtual LAN using 802.1Q.";
+     }
+     identity l3ipvlan {
+       base iana-interface-type;
+       description
+         "Layer 3 Virtual LAN using IP.";
+     }
+     identity l3ipxvlan {
+       base iana-interface-type;
+       description
+         "Layer 3 Virtual LAN using IPX.";
+     }
+     identity digitalPowerline {
+       base iana-interface-type;
+       description
+         "IP over Power Lines.";
+     }
+     identity mediaMailOverIp {
+       base iana-interface-type;
+       description
+         "Multimedia Mail over IP.";
+     }
+     identity dtm {
+       base iana-interface-type;
+       description
+         "Dynamic synchronous Transfer Mode.";
+     }
+     identity dcn {
+       base iana-interface-type;
+       description
+         "Data Communications Network.";
+     }
+     identity ipForward {
+       base iana-interface-type;
+       description
+         "IP Forwarding Interface.";
+     }
+     identity msdsl {
+       base iana-interface-type;
+       description
+         "Multi-rate Symmetric DSL.";
+     }
+     identity ieee1394 {
+       base iana-interface-type;
+       description
+         "IEEE1394 High Performance Serial Bus.";
+     }
+     identity if-gsn {
+       base iana-interface-type;
+       description
+         "HIPPI-6400.";
+     }
+     identity dvbRccMacLayer {
+       base iana-interface-type;
+       description
+         "DVB-RCC MAC Layer.";
+     }
+     identity dvbRccDownstream {
+       base iana-interface-type;
+       description
+         "DVB-RCC Downstream Channel.";
+     }
+     identity dvbRccUpstream {
+       base iana-interface-type;
+       description
+         "DVB-RCC Upstream Channel.";
+     }
+     identity atmVirtual {
+       base iana-interface-type;
+       description
+         "ATM Virtual Interface.";
+     }
+     identity mplsTunnel {
+       base iana-interface-type;
+       description
+         "MPLS Tunnel Virtual Interface.";
+     }
+     identity srp {
+       base iana-interface-type;
+       description
+         "Spatial Reuse Protocol.";
+     }
+     identity voiceOverAtm {
+       base iana-interface-type;
+       description
+         "Voice over ATM.";
+     }
+     identity voiceOverFrameRelay {
+       base iana-interface-type;
+       description
+         "Voice Over Frame Relay.";
+     }
+     identity idsl {
+       base iana-interface-type;
+       description
+         "Digital Subscriber Loop over ISDN.";
+     }
+     identity compositeLink {
+       base iana-interface-type;
+       description
+         "Avici Composite Link Interface.";
+     }
+     identity ss7SigLink {
+       base iana-interface-type;
+       description
+         "SS7 Signaling Link.";
+     }
+     identity propWirelessP2P {
+       base iana-interface-type;
+       description
+         "Prop. P2P wireless interface.";
+     }
+     identity frForward {
+       base iana-interface-type;
+       description
+         "Frame Forward Interface.";
+     }
+     identity rfc1483 {
+       base iana-interface-type;
+       description
+         "Multiprotocol over ATM AAL5.";
+       reference
+         "RFC 1483 - Multiprotocol Encapsulation over ATM
+                     Adaptation Layer 5";
+     }
+     identity usb {
+       base iana-interface-type;
+       description
+         "USB Interface.";
+     }
+     identity ieee8023adLag {
+       base iana-interface-type;
+       description
+         "IEEE 802.3ad Link Aggregate.";
+     }
+     identity bgppolicyaccounting {
+       base iana-interface-type;
+       description
+         "BGP Policy Accounting.";
+     }
+     identity frf16MfrBundle {
+       base iana-interface-type;
+       description
+         "FRF.16 Multilink Frame Relay.";
+     }
+     identity h323Gatekeeper {
+       base iana-interface-type;
+       description
+         "H323 Gatekeeper.";
+     }
+     identity h323Proxy {
+       base iana-interface-type;
+       description
+         "H323 Voice and Video Proxy.";
+     }
+     identity mpls {
+       base iana-interface-type;
+       description
+         "MPLS.";
+     }
+     identity mfSigLink {
+       base iana-interface-type;
+       description
+         "Multi-frequency signaling link.";
+     }
+     identity hdsl2 {
+       base iana-interface-type;
+       description
+         "High Bit-Rate DSL - 2nd generation.";
+     }
+     identity shdsl {
+       base iana-interface-type;
+       description
+         "Multirate HDSL2.";
+     }
+     identity ds1FDL {
+       base iana-interface-type;
+       description
+         "Facility Data Link (4Kbps) on a DS1.";
+     }
+     identity pos {
+       base iana-interface-type;
+       description
+         "Packet over SONET/SDH Interface.";
+     }
+     identity dvbAsiIn {
+       base iana-interface-type;
+       description
+         "DVB-ASI Input.";
+     }
+     identity dvbAsiOut {
+       base iana-interface-type;
+       description
+         "DVB-ASI Output.";
+     }
+     identity plc {
+       base iana-interface-type;
+       description
+         "Power Line Communications.";
+     }
+     identity nfas {
+       base iana-interface-type;
+       description
+         "Non-Facility Associated Signaling.";
+     }
+     identity tr008 {
+       base iana-interface-type;
+       description
+         "TR008.";
+     }
+     identity gr303RDT {
+       base iana-interface-type;
+       description
+         "Remote Digital Terminal.";
+     }
+     identity gr303IDT {
+       base iana-interface-type;
+       description
+         "Integrated Digital Terminal.";
+     }
+     identity isup {
+       base iana-interface-type;
+       description
+         "ISUP.";
+     }
+     identity propDocsWirelessMaclayer {
+       base iana-interface-type;
+       description
+         "Cisco proprietary Maclayer.";
+     }
+     identity propDocsWirelessDownstream {
+       base iana-interface-type;
+       description
+         "Cisco proprietary Downstream.";
+     }
+     identity propDocsWirelessUpstream {
+       base iana-interface-type;
+       description
+         "Cisco proprietary Upstream.";
+     }
+     identity hiperlan2 {
+       base iana-interface-type;
+       description
+         "HIPERLAN Type 2 Radio Interface.";
+     }
+     identity propBWAp2Mp {
+       base iana-interface-type;
+       description
+         "PropBroadbandWirelessAccesspt2Multipt (use of this value
+          for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f
+          is deprecated, and ieee80216WMAN(237) should be used
+          instead).";
+     }
+     identity sonetOverheadChannel {
+       base iana-interface-type;
+       description
+         "SONET Overhead Channel.";
+     }
+     identity digitalWrapperOverheadChannel {
+       base iana-interface-type;
+       description
+         "Digital Wrapper.";
+     }
+     identity aal2 {
+       base iana-interface-type;
+       description
+         "ATM adaptation layer 2.";
+     }
+     identity radioMAC {
+       base iana-interface-type;
+       description
+         "MAC layer over radio links.";
+     }
+     identity atmRadio {
+       base iana-interface-type;
+       description
+         "ATM over radio links.";
+     }
+     identity imt {
+       base iana-interface-type;
+       description
+         "Inter-Machine Trunks.";
+     }
+     identity mvl {
+       base iana-interface-type;
+       description
+         "Multiple Virtual Lines DSL.";
+     }
+     identity reachDSL {
+       base iana-interface-type;
+       description
+         "Long Reach DSL.";
+     }
+     identity frDlciEndPt {
+       base iana-interface-type;
+       description
+         "Frame Relay DLCI End Point.";
+     }
+     identity atmVciEndPt {
+       base iana-interface-type;
+       description
+         "ATM VCI End Point.";
+     }
+     identity opticalChannel {
+       base iana-interface-type;
+       description
+         "Optical Channel.";
+     }
+     identity opticalTransport {
+       base iana-interface-type;
+       description
+         "Optical Transport.";
+     }
+     identity propAtm {
+       base iana-interface-type;
+       description
+         "Proprietary ATM.";
+     }
+     identity voiceOverCable {
+       base iana-interface-type;
+       description
+         "Voice Over Cable Interface.";
+     }
+     identity infiniband {
+       base iana-interface-type;
+       description
+         "Infiniband.";
+     }
+     identity teLink {
+       base iana-interface-type;
+       description
+         "TE Link.";
+     }
+     identity q2931 {
+       base iana-interface-type;
+       description
+         "Q.2931.";
+     }
+     identity virtualTg {
+       base iana-interface-type;
+       description
+         "Virtual Trunk Group.";
+     }
+     identity sipTg {
+       base iana-interface-type;
+       description
+         "SIP Trunk Group.";
+     }
+     identity sipSig {
+       base iana-interface-type;
+       description
+         "SIP Signaling.";
+     }
+     identity docsCableUpstreamChannel {
+       base iana-interface-type;
+       description
+         "CATV Upstream Channel.";
+     }
+     identity econet {
+       base iana-interface-type;
+       description
+         "Acorn Econet.";
+     }
+     identity pon155 {
+       base iana-interface-type;
+       description
+         "FSAN 155Mb Symetrical PON interface.";
+     }
+     identity pon622 {
+       base iana-interface-type;
+       description
+         "FSAN 622Mb Symetrical PON interface.";
+     }
+     identity bridge {
+       base iana-interface-type;
+       description
+         "Transparent bridge interface.";
+     }
+     identity linegroup {
+       base iana-interface-type;
+       description
+         "Interface common to multiple lines.";
+     }
+     identity voiceEMFGD {
+       base iana-interface-type;
+       description
+         "Voice E&M Feature Group D.";
+     }
+     identity voiceFGDEANA {
+       base iana-interface-type;
+       description
+         "Voice FGD Exchange Access North American.";
+     }
+     identity voiceDID {
+       base iana-interface-type;
+       description
+         "Voice Direct Inward Dialing.";
+     }
+     identity mpegTransport {
+       base iana-interface-type;
+       description
+         "MPEG transport interface.";
+     }
+     identity sixToFour {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "6to4 interface (DEPRECATED).";
+       reference
+         "RFC 4087 - IP Tunnel MIB";
+     }
+     identity gtp {
+       base iana-interface-type;
+       description
+         "GTP (GPRS Tunneling Protocol).";
+     }
+     identity pdnEtherLoop1 {
+       base iana-interface-type;
+       description
+         "Paradyne EtherLoop 1.";
+     }
+     identity pdnEtherLoop2 {
+       base iana-interface-type;
+       description
+         "Paradyne EtherLoop 2.";
+     }
+     identity opticalChannelGroup {
+       base iana-interface-type;
+       description
+         "Optical Channel Group.";
+     }
+     identity homepna {
+       base iana-interface-type;
+       description
+         "HomePNA ITU-T G.989.";
+     }
+     identity gfp {
+       base iana-interface-type;
+       description
+         "Generic Framing Procedure (GFP).";
+     }
+     identity ciscoISLvlan {
+       base iana-interface-type;
+       description
+         "Layer 2 Virtual LAN using Cisco ISL.";
+     }
+     identity actelisMetaLOOP {
+       base iana-interface-type;
+       description
+         "Acteleis proprietary MetaLOOP High Speed Link.";
+     }
+     identity fcipLink {
+       base iana-interface-type;
+       description
+         "FCIP Link.";
+     }
+     identity rpr {
+       base iana-interface-type;
+       description
+         "Resilient Packet Ring Interface Type.";
+     }
+     identity qam {
+       base iana-interface-type;
+       description
+         "RF Qam Interface.";
+     }
+     identity lmp {
+       base iana-interface-type;
+       description
+         "Link Management Protocol.";
+       reference
+         "RFC 4327 - Link Management Protocol (LMP) Management
+                     Information Base (MIB)";
+     }
+     identity cblVectaStar {
+       base iana-interface-type;
+       description
+         "Cambridge Broadband Networks Limited VectaStar.";
+     }
+     identity docsCableMCmtsDownstream {
+       base iana-interface-type;
+       description
+         "CATV Modular CMTS Downstream Interface.";
+     }
+     identity adsl2 {
+       base iana-interface-type;
+       status deprecated;
+       description
+         "Asymmetric Digital Subscriber Loop Version 2
+          (DEPRECATED/OBSOLETED - please use adsl2plus(238)
+          instead).";
+       reference
+         "RFC 4706 - Definitions of Managed Objects for Asymmetric
+                     Digital Subscriber Line 2 (ADSL2)";
+     }
+     identity macSecControlledIF {
+       base iana-interface-type;
+       description
+         "MACSecControlled.";
+     }
+     identity macSecUncontrolledIF {
+       base iana-interface-type;
+       description
+         "MACSecUncontrolled.";
+     }
+     identity aviciOpticalEther {
+       base iana-interface-type;
+       description
+         "Avici Optical Ethernet Aggregate.";
+     }
+     identity atmbond {
+       base iana-interface-type;
+       description
+         "atmbond.";
+     }
+     identity voiceFGDOS {
+       base iana-interface-type;
+       description
+         "Voice FGD Operator Services.";
+     }
+     identity mocaVersion1 {
+       base iana-interface-type;
+       description
+         "MultiMedia over Coax Alliance (MoCA) Interface
+          as documented in information provided privately to IANA.";
+     }
+     identity ieee80216WMAN {
+       base iana-interface-type;
+       description
+         "IEEE 802.16 WMAN interface.";
+     }
+     identity adsl2plus {
+       base iana-interface-type;
+       description
+         "Asymmetric Digital Subscriber Loop Version 2 -
+          Version 2 Plus and all variants.";
+     }
+     identity dvbRcsMacLayer {
+       base iana-interface-type;
+       description
+         "DVB-RCS MAC Layer.";
+       reference
+         "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+     }
+     identity dvbTdm {
+       base iana-interface-type;
+       description
+         "DVB Satellite TDM.";
+       reference
+         "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+     }
+     identity dvbRcsTdma {
+       base iana-interface-type;
+       description
+         "DVB-RCS TDMA.";
+       reference
+         "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+     }
+     identity x86Laps {
+       base iana-interface-type;
+       description
+         "LAPS based on ITU-T X.86/Y.1323.";
+     }
+     identity wwanPP {
+       base iana-interface-type;
+       description
+         "3GPP WWAN.";
+     }
+     identity wwanPP2 {
+       base iana-interface-type;
+       description
+         "3GPP2 WWAN.";
+     }
+     identity voiceEBS {
+       base iana-interface-type;
+       description
+         "Voice P-phone EBS physical interface.";
+     }
+     identity ifPwType {
+       base iana-interface-type;
+       description
+         "Pseudowire interface type.";
+       reference
+         "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)";
+     }
+     identity ilan {
+       base iana-interface-type;
+       description
+         "Internal LAN on a bridge per IEEE 802.1ap.";
+     }
+     identity pip {
+       base iana-interface-type;
+       description
+         "Provider Instance Port on a bridge per IEEE 802.1ah PBB.";
+     }
+     identity aluELP {
+       base iana-interface-type;
+       description
+         "Alcatel-Lucent Ethernet Link Protection.";
+     }
+     identity gpon {
+       base iana-interface-type;
+       description
+         "Gigabit-capable passive optical networks (G-PON) as per
+          ITU-T G.948.";
+     }
+     identity vdsl2 {
+       base iana-interface-type;
+       description
+         "Very high speed digital subscriber line Version 2
+          (as per ITU-T Recommendation G.993.2).";
+       reference
+         "RFC 5650 - Definitions of Managed Objects for Very High
+                     Speed Digital Subscriber Line 2 (VDSL2)";
+     }
+     identity capwapDot11Profile {
+       base iana-interface-type;
+       description
+         "WLAN Profile Interface.";
+       reference
+         "RFC 5834 - Control and Provisioning of Wireless Access
+                     Points (CAPWAP) Protocol Binding MIB for
+                     IEEE 802.11";
+     }
+     identity capwapDot11Bss {
+       base iana-interface-type;
+       description
+         "WLAN BSS Interface.";
+       reference
+         "RFC 5834 - Control and Provisioning of Wireless Access
+                     Points (CAPWAP) Protocol Binding MIB for
+                     IEEE 802.11";
+     }
+     identity capwapWtpVirtualRadio {
+       base iana-interface-type;
+       description
+         "WTP Virtual Radio Interface.";
+       reference
+         "RFC 5833 - Control and Provisioning of Wireless Access
+                     Points (CAPWAP) Protocol Base MIB";
+     }
+     identity bits {
+       base iana-interface-type;
+       description
+         "bitsport.";
+     }
+     identity docsCableUpstreamRfPort {
+       base iana-interface-type;
+       description
+         "DOCSIS CATV Upstream RF Port.";
+     }
+     identity cableDownstreamRfPort {
+       base iana-interface-type;
+       description
+         "CATV downstream RF Port.";
+     }
+     identity vmwareVirtualNic {
+       base iana-interface-type;
+       description
+         "VMware Virtual Network Interface.";
+     }
+     identity ieee802154 {
+       base iana-interface-type;
+       description
+         "IEEE 802.15.4 WPAN interface.";
+       reference
+         "IEEE 802.15.4-2006";
+     }
+     identity otnOdu {
+       base iana-interface-type;
+       description
+         "OTN Optical Data Unit.";
+     }
+     identity otnOtu {
+       base iana-interface-type;
+       description
+         "OTN Optical channel Transport Unit.";
+     }
+     identity ifVfiType {
+       base iana-interface-type;
+       description
+         "VPLS Forwarding Instance Interface Type.";
+     }
+     identity g9981 {
+       base iana-interface-type;
+       description
+         "G.998.1 bonded interface.";
+     }
+     identity g9982 {
+       base iana-interface-type;
+       description
+         "G.998.2 bonded interface.";
+     }
+     identity g9983 {
+       base iana-interface-type;
+       description
+         "G.998.3 bonded interface.";
+     }
+     identity aluEpon {
+       base iana-interface-type;
+       description
+         "Ethernet Passive Optical Networks (E-PON).";
+     }
+     identity aluEponOnu {
+       base iana-interface-type;
+       description
+         "EPON Optical Network Unit.";
+     }
+     identity aluEponPhysicalUni {
+       base iana-interface-type;
+       description
+         "EPON physical User to Network interface.";
+     }
+     identity aluEponLogicalLink {
+       base iana-interface-type;
+       description
+         "The emulation of a point-to-point link over the EPON
+          layer.";
+     }
+     identity aluGponOnu {
+       base iana-interface-type;
+       description
+         "GPON Optical Network Unit.";
+       reference
+         "ITU-T G.984.2";
+     }
+     identity aluGponPhysicalUni {
+       base iana-interface-type;
+       description
+         "GPON physical User to Network interface.";
+       reference
+         "ITU-T G.984.2";
+     }
+     identity vmwareNicTeam {
+       base iana-interface-type;
+       description
+         "VMware NIC Team.";
+     }
+   }
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ieee-types.yang b/drivers/microsemi/ea1000yang/src/main/yang/ieee-types.yang
new file mode 100644
index 0000000..5ff5c1d
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ieee-types.yang
@@ -0,0 +1,79 @@
+   module ieee-types {
+
+       // XXX namespace to be allocated by IANA
+
+       namespace "urn:ietf:params:xml:ns:yang:ieee-types";
+       prefix "ieee";
+
+       import ietf-yang-types {
+           prefix yang;
+       }
+
+       organization
+           "YANG Language Design Team";
+
+       contact
+           "Juergen Schoenwaelder (Editor)
+            <j.schoenwaelder@jacobs-university.de>";
+
+       description
+           "This module contains standard derived YANG types
+            for IEEE 802 addresses and related things.";
+
+       revision 2008-05-22 {
+           description "Initial revision.";
+       }
+
+       /*
+        * collection of IEEE address type definitions
+        */
+
+       typedef mac-address {
+           type yang:phys-address {
+               pattern '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}';
+           }
+           description
+              "The mac-address type represents an 802 MAC address
+               represented in the `canonical' order defined by
+               IEEE 802.1a, i.e., as if it were transmitted least
+               significant bit first, even though 802.5 (in contrast
+               to other 802.x protocols) requires MAC addresses to
+               be transmitted most significant bit first.";
+           reference
+              "RFC 2579 STD 58";
+       }
+
+       /*
+        * collection of IEEE 802 related identifier types
+        */
+
+       typedef bridgeid {
+           type string {
+               pattern '[0-9a-fA-F]{4}:'
+                     + '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}';
+           }
+           description
+              "The bridgeid type represents identifers that uniquely
+               identify a bridge.  Its first four hexadecimal digits
+               contain a priority value followed by a colon. The
+               remaining characters contain the MAC address used to
+               refer to a bridge in a unique fashion (typically, the
+               numerically smallest MAC address of all ports on the
+               bridge).";
+           reference
+              "RFC 4188";
+       }
+
+       typedef vlanid {
+           type uint16 {
+               range "1..4094";
+           }
+           description
+              "The vlanid type uniquely identifies a VLAN. This is
+               the 12-bit VLAN-ID used in the VLAN Tag header. The
+               range is defined by the referenced specification.";
+           reference
+              "IEEE Std 802.1Q 2003 Edition, Virtual Bridged Local
+               Area Networks.";
+       }
+   }
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-inet-types.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-inet-types.yang
new file mode 100644
index 0000000..5388b03
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-inet-types.yang
@@ -0,0 +1,461 @@
+module ietf-inet-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+  prefix "inet";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types for Internet addresses and related things.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - ip-address-no-zone
+      - ipv4-address-no-zone
+      - ipv6-address-no-zone";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of types related to protocol fields ***/
+
+  typedef ip-version {
+    type enumeration {
+      enum unknown {
+        value "0";
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum ipv4 {
+        value "1";
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum ipv6 {
+        value "2";
+        description
+         "The IPv6 protocol as defined in RFC 2460.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetVersion textual convention of the SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+     "The dscp type represents a Differentiated Services Code Point
+      that may be used for marking packets in a traffic stream.
+      In the value set and its semantics, this type is equivalent
+      to the Dscp textual convention of the SMIv2.";
+    reference
+     "RFC 3289: Management Information Base for the Differentiated
+                Services Architecture
+      RFC 2474: Definition of the Differentiated Services Field
+                (DS Field) in the IPv4 and IPv6 Headers
+      RFC 2780: IANA Allocation Guidelines For Values In
+                the Internet Protocol and Related Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+     "The ipv6-flow-label type represents the flow identifier or Flow
+      Label in an IPv6 packet header that may be used to
+      discriminate traffic flows.
+
+      In the value set and its semantics, this type is equivalent
+      to the IPv6FlowLabel textual convention of the SMIv2.";
+    reference
+     "RFC 3595: Textual Conventions for IPv6 Flow Label
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16 {
+      range "0..65535";
+    }
+    description
+     "The port-number type represents a 16-bit port number of an
+      Internet transport-layer protocol such as UDP, TCP, DCCP, or
+      SCTP.  Port numbers are assigned by IANA.  A current list of
+      all assignments is available from <http://www.iana.org/>.
+
+      Note that the port number value zero is reserved by IANA.  In
+      situations where the value zero does not make sense, it can
+      be excluded by subtyping the port-number type.
+      In the value set and its semantics, this type is equivalent
+      to the InetPortNumber textual convention of the SMIv2.";
+    reference
+     "RFC  768: User Datagram Protocol
+      RFC  793: Transmission Control Protocol
+      RFC 4960: Stream Control Transmission Protocol
+      RFC 4340: Datagram Congestion Control Protocol (DCCP)
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  /*** collection of types related to autonomous systems ***/
+
+  typedef as-number {
+    type uint32;
+    description
+     "The as-number type represents autonomous system numbers
+      which identify an Autonomous System (AS).  An AS is a set
+      of routers under a single technical administration, using
+      an interior gateway protocol and common metrics to route
+      packets within the AS, and using an exterior gateway
+      protocol to route packets to other ASes.  IANA maintains
+      the AS number space and has delegated large parts to the
+      regional registries.
+
+      Autonomous system numbers were originally limited to 16
+      bits.  BGP extensions have enlarged the autonomous system
+      number space to 32 bits.  This type therefore uses an uint32
+      base type without a range restriction in order to support
+      a larger autonomous system number space.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetAutonomousSystemNumber textual convention of
+      the SMIv2.";
+    reference
+     "RFC 1930: Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+      RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+      RFC 4001: Textual Conventions for Internet Network Addresses
+      RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+                Number Space";
+  }
+
+  /*** collection of types related to IP addresses and hostnames ***/
+
+  typedef ip-address {
+    type union {
+      type inet:ipv4-address;
+      type inet:ipv6-address;
+    }
+    description
+     "The ip-address type represents an IP address and is IP
+      version neutral.  The format of the textual representation
+      implies the IP version.  This type supports scoped addresses
+      by allowing zone identifiers in the address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+      + '(%[\p{N}\p{L}]+)?';
+    }
+    description
+      "The ipv4-address type represents an IPv4 address in
+       dotted-quad notation.  The IPv4 address may include a zone
+       index, separated by a % sign.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format for the zone index is the numerical
+       format";
+  }
+
+  typedef ipv6-address {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(%[\p{N}\p{L}]+)?';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(%.+)?';
+    }
+    description
+     "The ipv6-address type represents an IPv6 address in full,
+      mixed, shortened, and shortened-mixed notation.  The IPv6
+      address may include a zone index, separated by a % sign.
+
+      The zone index is used to disambiguate identical address
+      values.  For link-local addresses, the zone index will
+      typically be the interface index number or the name of an
+      interface.  If the zone index is not present, the default
+      zone of the device will be used.
+
+
+
+      The canonical format of IPv6 addresses uses the textual
+      representation defined in Section 4 of RFC 5952.  The
+      canonical format for the zone index is the numerical
+      format as described in Section 11.2 of RFC 4007.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-no-zone {
+    type union {
+      type inet:ipv4-address-no-zone;
+      type inet:ipv6-address-no-zone;
+    }
+    description
+     "The ip-address-no-zone type represents an IP address and is
+      IP version neutral.  The format of the textual representation
+      implies the IP version.  This type does not support scoped
+      addresses since it does not allow zone identifiers in the
+      address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address-no-zone {
+    type inet:ipv4-address {
+      pattern '[0-9\.]*';
+    }
+    description
+      "An IPv4 address without a zone index.  This type, derived from
+       ipv4-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+  }
+
+  typedef ipv6-address-no-zone {
+    type inet:ipv6-address {
+      pattern '[0-9a-fA-F:\.]*';
+    }
+    description
+      "An IPv6 address without a zone index.  This type, derived from
+       ipv6-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type inet:ipv4-prefix;
+      type inet:ipv6-prefix;
+    }
+    description
+     "The ip-prefix type represents an IP prefix and is IP
+      version neutral.  The format of the textual representations
+      implies the IP version.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+    }
+    description
+     "The ipv4-prefix type represents an IPv4 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv4 prefix has all bits of
+      the IPv4 address set to zero that are not part of the
+      IPv4 prefix.";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(/.+)';
+    }
+
+
+    description
+     "The ipv6-prefix type represents an IPv6 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The IPv6 address should have all bits that do not belong
+      to the prefix set to zero.
+
+      The canonical format of an IPv6 prefix has all bits of
+      the IPv6 address set to zero that are not part of the
+      IPv6 prefix.  Furthermore, the IPv6 address is represented
+      as defined in Section 4 of RFC 5952.";
+    reference
+     "RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  /*** collection of domain name and URI types ***/
+
+  typedef domain-name {
+    type string {
+      pattern
+        '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+      + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+      + '|\.';
+      length "1..253";
+    }
+    description
+     "The domain-name type represents a DNS domain name.  The
+      name SHOULD be fully qualified whenever possible.
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  It is designed to hold various types of
+      domain names, including names used for A or AAAA records
+      (host names) and other records, such as SRV records.  Note
+      that Internet host names have a stricter syntax (described
+      in RFC 952) than the DNS recommendations in RFCs 1034 and
+      1123, and that systems that want to store host names in
+      schema nodes using the domain-name type are recommended to
+      adhere to this stricter standard to ensure interoperability.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      The description clause of schema nodes using the domain-name
+      type MUST describe when and how these names are resolved to
+      IP addresses.  Note that the resolution of a domain-name value
+      may require to query multiple DNS records (e.g., A for IPv4
+      and AAAA for IPv6).  The order of the resolution process and
+      which DNS record takes precedence can either be defined
+      explicitly or may depend on the configuration of the
+      resolver.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be A-labels as per RFC 5890.";
+    reference
+     "RFC  952: DoD Internet Host Table Specification
+      RFC 1034: Domain Names - Concepts and Facilities
+      RFC 1123: Requirements for Internet Hosts -- Application
+                and Support
+      RFC 2782: A DNS RR for specifying the location of services
+                (DNS SRV)
+      RFC 5890: Internationalized Domain Names in Applications
+                (IDNA): Definitions and Document Framework";
+  }
+
+  typedef host {
+    type union {
+      type inet:ip-address;
+      type inet:domain-name;
+    }
+    description
+     "The host type represents either an IP address or a DNS
+      domain name.";
+  }
+
+  typedef uri {
+    type string;
+    description
+     "The uri type represents a Uniform Resource Identifier
+      (URI) as defined by STD 66.
+
+      Objects using the uri type MUST be in US-ASCII encoding,
+      and MUST be normalized as described by RFC 3986 Sections
+      6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+      percent-encoding is removed, and all case-insensitive
+      characters are set to lowercase except for hexadecimal
+      digits, which are normalized to uppercase as described in
+      Section 6.2.2.1.
+
+      The purpose of this normalization is to help provide
+      unique URIs.  Note that this normalization is not
+      sufficient to provide uniqueness.  Two URIs that are
+      textually distinct after this normalization may still be
+      equivalent.
+
+      Objects using the uri type may restrict the schemes that
+      they permit.  For example, 'data:' and 'urn:' schemes
+      might not be appropriate.
+
+      A zero-length URI is not a valid URI.  This can be used to
+      express 'URI absent' where required.
+
+      In the value set and its semantics, this type is equivalent
+      to the Uri SMIv2 textual convention defined in RFC 5017.";
+    reference
+     "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+      RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+                Group: Uniform Resource Identifiers (URIs), URLs,
+                and Uniform Resource Names (URNs): Clarifications
+                and Recommendations
+      RFC 5017: MIB Textual Conventions for Uniform Resource
+                Identifiers (URIs)";
+  }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-interfaces.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-interfaces.yang
new file mode 100644
index 0000000..b18d5d3
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-interfaces.yang
@@ -0,0 +1,731 @@
+module ietf-interfaces {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+  prefix if;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: Thomas Nadeau
+               <mailto:tnadeau@lucidvision.com>
+
+     WG Chair: Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "This module contains a collection of YANG definitions for
+     managing network interfaces.
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 7223; see
+     the RFC itself for full legal notices.";
+
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7223: A YANG Data Model for Interface Management";
+  }
+
+  /*
+   * Typedefs
+   */
+
+  typedef interface-ref {
+    type leafref {
+      path "/if:interfaces/if:interface/if:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       configured interfaces.";
+  }
+
+  typedef interface-state-ref {
+    type leafref {
+      path "/if:interfaces-state/if:interface/if:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       the operationally present interfaces.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity interface-type {
+    description
+      "Base identity from which specific interface types are
+       derived.";
+  }
+
+  /*
+   * Features
+   */
+
+  feature arbitrary-names {
+    description
+      "This feature indicates that the device allows user-controlled
+       interfaces to be named arbitrarily.";
+  }
+  feature pre-provisioning {
+    description
+      "This feature indicates that the device supports
+       pre-provisioning of interface configuration, i.e., it is
+       possible to configure an interface whose physical interface
+       hardware is not present on the device.";
+  }
+
+  feature if-mib {
+    description
+      "This feature indicates that the device implements
+       the IF-MIB.";
+    reference
+      "RFC 2863: The Interfaces Group MIB";
+  }
+
+  /*
+   * Configuration data nodes
+   */
+
+  container interfaces {
+    description
+      "Interface configuration parameters.";
+
+    list interface {
+      key "name";
+
+      description
+        "The list of configured interfaces on the device.
+
+         The operational state of an interface is available in the
+         /interfaces-state/interface list.  If the configuration of a
+         system-controlled interface cannot be used by the system
+         (e.g., the interface hardware present does not match the
+         interface type), then the configuration is not applied to
+         the system-controlled interface shown in the
+         /interfaces-state/interface list.  If the configuration
+         of a user-controlled interface cannot be used by the system,
+         the configured interface is not instantiated in the
+         /interfaces-state/interface list.";
+
+     leaf name {
+        type yang:yang-identifier;
+        
+        must ".='eth0' or .='eth1' or .='lo'" {
+        	error-app-tag "if-must-1";
+        	error-message "Interface name must only be eth0, eth1 or lo";
+        }
+        
+        description
+          "The name of the interface.
+
+           A device MAY restrict the allowed values for this leaf,
+           possibly depending on the type of the interface.
+           For system-controlled interfaces, this leaf is the
+           device-specific name of the interface.  The 'config false'
+           list /interfaces-state/interface contains the currently
+           existing interfaces on the device.
+
+           If a client tries to create configuration for a
+           system-controlled interface that is not present in the
+           /interfaces-state/interface list, the server MAY reject
+           the request if the implementation does not support
+           pre-provisioning of interfaces or if the name refers to
+           an interface that can never exist in the system.  A
+           NETCONF server MUST reply with an rpc-error with the
+           error-tag 'invalid-value' in this case.
+
+           If the device supports pre-provisioning of interface
+           configuration, the 'pre-provisioning' feature is
+           advertised.
+
+           If the device allows arbitrarily named user-controlled
+           interfaces, the 'arbitrary-names' feature is advertised.
+
+           When a configured user-controlled interface is created by
+           the system, it is instantiated with the same name in the
+           /interface-state/interface list.";
+      }
+
+      leaf description {
+        type string;
+        description
+          "A textual description of the interface.
+
+           A server implementation MAY map this leaf to the ifAlias
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifAlias.  The definition of
+           such a mechanism is outside the scope of this document.
+
+           Since ifAlias is defined to be stored in non-volatile
+           storage, the MIB implementation MUST map ifAlias to the
+           value of 'description' in the persistently stored
+           datastore.
+
+           Specifically, if the device supports ':startup', when
+           ifAlias is read the device MUST return the value of
+           'description' in the 'startup' datastore, and when it is
+           written, it MUST be written to the 'running' and 'startup'
+           datastores.  Note that it is up to the implementation to
+
+           decide whether to modify this single leaf in 'startup' or
+           perform an implicit copy-config from 'running' to
+           'startup'.
+
+           If the device does not support ':startup', ifAlias MUST
+           be mapped to the 'description' leaf in the 'running'
+           datastore.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAlias";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        description
+          "The type of the interface.
+
+           When an interface entry is created, a server MAY
+           initialize the type leaf with a valid value, e.g., if it
+           is possible to derive the type from the name of the
+           interface.
+
+           If a client tries to set the type of an interface to a
+           value that can never be used by the system, e.g., if the
+           type is not supported or if the type does not match the
+           name of the interface, the server MUST reject the request.
+           A NETCONF server MUST reply with an rpc-error with the
+           error-tag 'invalid-value' in this case.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+//      leaf enabled { //Removed as per EAG-32 we never want to disable the whole interface
+//        type boolean;
+//        default "true";
+//        description
+//          "This leaf contains the configured, desired state of the
+//           interface.
+//
+//           Systems that implement the IF-MIB use the value of this
+//           leaf in the 'running' datastore to set
+//           IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+//           has been initialized, as described in RFC 2863.
+//
+//
+//
+//           Changes in this leaf in the 'running' datastore are
+//           reflected in ifAdminStatus, but if ifAdminStatus is
+//           changed over SNMP, this leaf is not affected.";
+//        reference
+//          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+//      }
+
+      leaf link-up-down-trap-enable {
+        if-feature if-mib;
+        type enumeration {
+          enum enabled {
+            value 1;
+          }
+          enum disabled {
+            value 2;
+          }
+        }
+        description
+          "Controls whether linkUp/linkDown SNMP notifications
+           should be generated for this interface.
+
+           If this node is not configured, the value 'enabled' is
+           operationally used by the server for interfaces that do
+           not operate on top of any other interface (i.e., there are
+           no 'lower-layer-if' entries), and 'disabled' otherwise.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifLinkUpDownTrapEnable";
+      }
+    }
+  }
+
+  /*
+   * Operational state data nodes
+   */
+
+  container interfaces-state {
+    config false;
+    description
+      "Data nodes for the operational state of interfaces.";
+
+    list interface {
+      key "name";
+
+
+
+
+
+      description
+        "The list of interfaces on the device.
+
+         System-controlled interfaces created by the system are
+         always present in this list, whether they are configured or
+         not.";
+
+      leaf name {
+        type string;
+        description
+          "The name of the interface.
+
+           A server implementation MAY map this leaf to the ifName
+           MIB object.  Such an implementation needs to use some
+           mechanism to handle the differences in size and characters
+           allowed between this leaf and ifName.  The definition of
+           such a mechanism is outside the scope of this document.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifName";
+      }
+
+      leaf type {
+        type identityref {
+          base interface-type;
+        }
+        mandatory true;
+        description
+          "The type of the interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifType";
+      }
+
+      leaf admin-status {
+        if-feature if-mib;
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "Not ready to pass packets and not in some test mode.";
+          }
+
+
+
+          enum testing {
+            value 3;
+            description
+              "In some test mode.";
+          }
+        }
+        mandatory true;
+        description
+          "The desired state of the interface.
+
+           This leaf has the same read semantics as ifAdminStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+      }
+
+      leaf oper-status {
+        type enumeration {
+          enum up {
+            value 1;
+            description
+              "Ready to pass packets.";
+          }
+          enum down {
+            value 2;
+            description
+              "The interface does not pass any packets.";
+          }
+          enum testing {
+            value 3;
+            description
+              "In some test mode.  No operational packets can
+               be passed.";
+          }
+          enum unknown {
+            value 4;
+            description
+              "Status cannot be determined for some reason.";
+          }
+          enum dormant {
+            value 5;
+            description
+              "Waiting for some external event.";
+          }
+          enum not-present {
+            value 6;
+            description
+              "Some component (typically hardware) is missing.";
+          }
+          enum lower-layer-down {
+            value 7;
+            description
+              "Down due to state of lower-layer interface(s).";
+          }
+        }
+        mandatory true;
+        description
+          "The current operational state of the interface.
+
+           This leaf has the same semantics as ifOperStatus.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+      }
+
+      leaf last-change {
+        type yang:date-and-time;
+        description
+          "The time the interface entered its current operational
+           state.  If the current state was entered prior to the
+           last re-initialization of the local network management
+           subsystem, then this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifLastChange";
+      }
+
+      leaf if-index {
+        if-feature if-mib;
+        type int32 {
+          range "1..2147483647";
+        }
+        mandatory true;
+        description
+          "The ifIndex value for the ifEntry represented by this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifIndex";
+      }
+
+      leaf phys-address {
+        type yang:phys-address;
+        description
+          "The interface's address at its protocol sub-layer.  For
+           example, for an 802.x interface, this object normally
+           contains a Media Access Control (MAC) address.  The
+           interface's media-specific modules must define the bit
+
+
+           and byte ordering and the format of the value of this
+           object.  For interfaces that do not have such an address
+           (e.g., a serial line), this node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+      }
+
+      leaf-list higher-layer-if {
+        type interface-state-ref;
+        description
+          "A list of references to interfaces layered on top of this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf-list lower-layer-if {
+        type interface-state-ref;
+        description
+          "A list of references to interfaces layered underneath this
+           interface.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifStackTable";
+      }
+
+      leaf speed {
+        type yang:gauge64;
+        units "bits/second";
+        description
+            "An estimate of the interface's current bandwidth in bits
+             per second.  For interfaces that do not vary in
+             bandwidth or for those where no accurate estimation can
+             be made, this node should contain the nominal bandwidth.
+             For interfaces that have no concept of bandwidth, this
+             node is not present.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifSpeed, ifHighSpeed";
+      }
+
+
+
+
+
+
+
+
+
+      container statistics {
+        description
+          "A collection of interface-related statistics objects.";
+
+        leaf discontinuity-time {
+          type yang:date-and-time;
+          mandatory true;
+          description
+            "The time on the most recent occasion at which any one or
+             more of this interface's counters suffered a
+             discontinuity.  If no such discontinuities have occurred
+             since the last re-initialization of the local management
+             subsystem, then this node contains the time the local
+             management subsystem re-initialized itself.";
+        }
+
+        leaf in-octets {
+          type yang:counter64;
+          description
+            "The total number of octets received on the interface,
+             including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+        }
+
+        leaf in-unicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were not addressed to a
+             multicast or broadcast address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+        }
+
+
+
+
+        leaf in-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a broadcast
+             address at this sub-layer.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInBroadcastPkts";
+        }
+
+        leaf in-multicast-pkts {
+          type yang:counter64;
+          description
+            "The number of packets, delivered by this sub-layer to a
+             higher (sub-)layer, that were addressed to a multicast
+             address at this sub-layer.  For a MAC-layer protocol,
+             this includes both Group and Functional addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCInMulticastPkts";
+        }
+
+        leaf in-discards {
+          type yang:counter32;
+          description
+            "The number of inbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being deliverable to a higher-layer
+             protocol.  One possible reason for discarding such a
+             packet could be to free up buffer space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+
+
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+        }
+
+        leaf in-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of inbound
+             packets that contained errors preventing them from being
+             deliverable to a higher-layer protocol.  For character-
+             oriented or fixed-length interfaces, the number of
+             inbound transmission units that contained errors
+             preventing them from being deliverable to a higher-layer
+             protocol.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInErrors";
+        }
+
+        leaf in-unknown-protos {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of packets
+             received via the interface that were discarded because
+             of an unknown or unsupported protocol.  For
+             character-oriented or fixed-length interfaces that
+             support protocol multiplexing, the number of
+             transmission units received via the interface that were
+             discarded because of an unknown or unsupported protocol.
+             For any interface that does not support protocol
+             multiplexing, this counter is not present.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+        }
+
+
+
+
+
+        leaf out-octets {
+          type yang:counter64;
+          description
+            "The total number of octets transmitted out of the
+             interface, including framing characters.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+        }
+
+        leaf out-unicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted, and that were not addressed
+             to a multicast or broadcast address at this sub-layer,
+             including those that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+        }
+
+        leaf out-broadcast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted, and that were addressed to a
+             broadcast address at this sub-layer, including those
+             that were discarded or not sent.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutBroadcastPkts";
+        }
+
+
+        leaf out-multicast-pkts {
+          type yang:counter64;
+          description
+            "The total number of packets that higher-level protocols
+             requested be transmitted, and that were addressed to a
+             multicast address at this sub-layer, including those
+             that were discarded or not sent.  For a MAC-layer
+             protocol, this includes both Group and Functional
+             addresses.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB -
+                       ifHCOutMulticastPkts";
+        }
+
+        leaf out-discards {
+          type yang:counter32;
+          description
+            "The number of outbound packets that were chosen to be
+             discarded even though no errors had been detected to
+             prevent their being transmitted.  One possible reason
+             for discarding such a packet could be to free up buffer
+             space.
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+        }
+
+        leaf out-errors {
+          type yang:counter32;
+          description
+            "For packet-oriented interfaces, the number of outbound
+             packets that could not be transmitted because of errors.
+             For character-oriented or fixed-length interfaces, the
+             number of outbound transmission units that could not be
+             transmitted because of errors.
+
+
+
+
+             Discontinuities in the value of this counter can occur
+             at re-initialization of the management system, and at
+             other times as indicated by the value of
+             'discontinuity-time'.";
+          reference
+            "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+        }
+      }
+    }
+  }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-acm.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-acm.yang
new file mode 100644
index 0000000..f0c6fe3
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-acm.yang
@@ -0,0 +1,449 @@
+module ietf-netconf-acm {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm";
+
+  prefix "nacm";
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     WG Chair: Mehmet Ersue
+               <mailto:mehmet.ersue@nsn.com>
+
+     WG Chair: Bert Wijnen
+               <mailto:bertietf@bwijnen.net>
+
+     Editor:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "NETCONF Access Control Model.
+
+     Copyright (c) 2012 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD
+     License set forth in Section 4.c of the IETF Trust's
+     Legal Provisions Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6536; see
+     the RFC itself for full legal notices.";
+
+  revision "2012-02-22" {
+    description
+      "Initial version";
+    reference
+      "RFC 6536: Network Configuration Protocol (NETCONF)
+                 Access Control Model";
+  }
+
+  /*
+   * Extension statements
+   */
+
+  extension default-deny-write {
+    description
+      "Used to indicate that the data model node
+       represents a sensitive security system parameter.
+
+       If present, and the NACM module is enabled (i.e.,
+       /nacm/enable-nacm object equals 'true'), the NETCONF server
+       will only allow the designated 'recovery session' to have
+       write access to the node.  An explicit access control rule is
+       required for all other users.
+
+       The 'default-deny-write' extension MAY appear within a data
+       definition statement.  It is ignored otherwise.";
+  }
+
+  extension default-deny-all {
+    description
+      "Used to indicate that the data model node
+       controls a very sensitive security system parameter.
+
+       If present, and the NACM module is enabled (i.e.,
+       /nacm/enable-nacm object equals 'true'), the NETCONF server
+       will only allow the designated 'recovery session' to have
+       read, write, or execute access to the node.  An explicit
+       access control rule is required for all other users.
+
+       The 'default-deny-all' extension MAY appear within a data
+       definition statement, 'rpc' statement, or 'notification'
+       statement.  It is ignored otherwise.";
+  }
+
+  /*
+   * Derived types
+   */
+
+  typedef user-name-type {
+    type string {
+      length "1..max";
+    }
+    description
+      "General Purpose Username string.";
+  }
+
+  typedef matchall-string-type {
+    type string {
+      pattern "\*";
+    }
+    description
+      "The string containing a single asterisk '*' is used
+       to conceptually represent all possible values
+       for the particular leaf using this data type.";
+  }
+
+  typedef access-operations-type {
+    type bits {
+      bit create {
+        description
+          "Any protocol operation that creates a
+           new data node.";
+      }
+      bit read {
+        description
+          "Any protocol operation or notification that
+           returns the value of a data node.";
+      }
+      bit update {
+        description
+          "Any protocol operation that alters an existing
+           data node.";
+      }
+      bit delete {
+        description
+          "Any protocol operation that removes a data node.";
+      }
+      bit exec {
+        description
+          "Execution access to the specified protocol operation.";
+      }
+    }
+    description
+      "NETCONF Access Operation.";
+  }
+
+  typedef group-name-type {
+    type string {
+      length "1..max";
+      pattern "[^\*].*";
+    }
+    description
+      "Name of administrative group to which
+       users can be assigned.";
+  }
+
+  typedef action-type {
+    type enumeration {
+      enum permit {
+        description
+          "Requested action is permitted.";
+      }
+      enum deny {
+        description
+          "Requested action is denied.";
+      }
+    }
+    description
+      "Action taken by the server when a particular
+       rule matches.";
+  }
+
+  typedef node-instance-identifier {
+    type yang:xpath1.0;
+    description
+      "Path expression used to represent a special
+       data node instance identifier string.
+
+       A node-instance-identifier value is an
+       unrestricted YANG instance-identifier expression.
+       All the same rules as an instance-identifier apply
+       except predicates for keys are optional.  If a key
+       predicate is missing, then the node-instance-identifier
+       represents all possible server instances for that key.
+
+       This XPath expression is evaluated in the following context:
+
+        o  The set of namespace declarations are those in scope on
+           the leaf element where this type is used.
+
+        o  The set of variable bindings contains one variable,
+           'USER', which contains the name of the user of the current
+            session.
+
+        o  The function library is the core function library, but
+           note that due to the syntax restrictions of an
+           instance-identifier, no functions are allowed.
+
+        o  The context node is the root node in the data tree.";
+  }
+
+  /*
+   * Data definition statements
+   */
+
+  container nacm {
+//    nacm:default-deny-all;
+
+    description
+      "Parameters for NETCONF Access Control Model.";
+
+    leaf enable-nacm {
+      type boolean;
+      default true;
+      description
+        "Enables or disables all NETCONF access control
+         enforcement.  If 'true', then enforcement
+         is enabled.  If 'false', then enforcement
+         is disabled.";
+    }
+
+    leaf read-default {
+      type action-type;
+      default "permit";
+      description
+        "Controls whether read access is granted if
+         no appropriate rule is found for a
+         particular read request.";
+    }
+
+    leaf write-default {
+      type action-type;
+      default "deny";
+      description
+        "Controls whether create, update, or delete access
+         is granted if no appropriate rule is found for a
+         particular write request.";
+    }
+
+    leaf exec-default {
+      type action-type;
+      default "permit";
+      description
+        "Controls whether exec access is granted if no appropriate
+         rule is found for a particular protocol operation request.";
+    }
+
+    leaf enable-external-groups {
+      type boolean;
+      default true;
+      description
+        "Controls whether the server uses the groups reported by the
+         NETCONF transport layer when it assigns the user to a set of
+         NACM groups.  If this leaf has the value 'false', any group
+         names reported by the transport layer are ignored by the
+         server.";
+    }
+
+    leaf denied-operations {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that a
+         protocol operation request was denied.";
+    }
+
+    leaf denied-data-writes {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that a
+         protocol operation request to alter
+         a configuration datastore was denied.";
+    }
+
+    leaf denied-notifications {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that
+         a notification was dropped for a subscription because
+         access to the event type was denied.";
+    }
+
+    container groups {
+      description
+        "NETCONF Access Control Groups.";
+
+      list group {
+        key name;
+
+        description
+          "One NACM Group Entry.  This list will only contain
+           configured entries, not any entries learned from
+           any transport protocols.";
+
+        leaf name {
+          type group-name-type;
+          description
+            "Group name associated with this entry.";
+        }
+
+        leaf-list user-name {
+          type user-name-type;
+          description
+            "Each entry identifies the username of
+             a member of the group associated with
+             this entry.";
+        }
+      }
+    }
+
+    list rule-list {
+      key "name";
+      ordered-by user;
+      description
+        "An ordered collection of access control rules.";
+
+      leaf name {
+        type string {
+          length "1..max";
+        }
+        description
+          "Arbitrary name assigned to the rule-list.";
+      }
+      leaf-list group {
+        type union {
+          type matchall-string-type;
+          type group-name-type;
+        }
+        description
+          "List of administrative groups that will be
+           assigned the associated access rights
+           defined by the 'rule' list.
+
+           The string '*' indicates that all groups apply to the
+           entry.";
+      }
+
+      list rule {
+        key "name";
+        ordered-by user;
+        description
+          "One access control rule.
+
+           Rules are processed in user-defined order until a match is
+           found.  A rule matches if 'module-name', 'rule-type', and
+           'access-operations' match the request.  If a rule
+           matches, the 'action' leaf determines if access is granted
+           or not.";
+
+        leaf name {
+          type string {
+            length "1..max";
+          }
+          description
+            "Arbitrary name assigned to the rule.";
+        }
+
+        leaf module-name {
+          type union {
+            type matchall-string-type;
+            type string;
+          }
+          default "*";
+          description
+            "Name of the module associated with this rule.
+
+             This leaf matches if it has the value '*' or if the
+             object being accessed is defined in the module with the
+             specified module name.";
+        }
+        choice rule-type {
+          description
+            "This choice matches if all leafs present in the rule
+             match the request.  If no leafs are present, the
+             choice matches all requests.";
+          case protocol-operation {
+            leaf rpc-name {
+              type union {
+                type matchall-string-type;
+                type string;
+              }
+              description
+                "This leaf matches if it has the value '*' or if
+                 its value equals the requested protocol operation
+                 name.";
+            }
+          }
+          case notification {
+            leaf notification-name {
+              type union {
+                type matchall-string-type;
+                type string;
+              }
+              description
+                "This leaf matches if it has the value '*' or if its
+                 value equals the requested notification name.";
+            }
+          }
+          case data-node {
+            leaf path {
+              type node-instance-identifier;
+              mandatory true;
+              description
+                "Data Node Instance Identifier associated with the
+                 data node controlled by this rule.
+
+                 Configuration data or state data instance
+                 identifiers start with a top-level data node.  A
+                 complete instance identifier is required for this
+                 type of path value.
+
+                 The special value '/' refers to all possible
+                 datastore contents.";
+            }
+          }
+        }
+
+        leaf access-operations {
+          type union {
+            type matchall-string-type;
+            type access-operations-type;
+          }
+          default "*";
+          description
+            "Access operations associated with this rule.
+
+             This leaf matches if it has the value '*' or if the
+             bit corresponding to the requested operation is set.";
+        }
+
+        leaf action {
+          type action-type;
+          mandatory true;
+          description
+            "The access control action associated with the
+             rule.  If a rule is determined to match a
+             particular request, then this object is used
+             to determine whether to permit or deny the
+             request.";
+        }
+
+        leaf comment {
+          type string;
+          description
+            "A textual description of the access rule.";
+        }
+      }
+    }
+  }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-monitoring.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-monitoring.yang
new file mode 100644
index 0000000..8130bfd
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-monitoring.yang
@@ -0,0 +1,559 @@
+
+module ietf-netconf-monitoring {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring";
+  prefix "ncm";
+
+  import ietf-yang-types { prefix yang; }
+  import ietf-inet-types { prefix inet; }
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     WG Chair: Mehmet Ersue
+               <mailto:mehmet.ersue@nsn.com>
+
+     WG Chair: Bert Wijnen
+               <mailto:bertietf@bwijnen.net>
+
+     Editor:   Mark Scott
+               <mailto:mark.scott@ericsson.com>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "NETCONF Monitoring Module.
+     All elements in this module are read-only.
+
+     Copyright (c) 2010 IETF Trust and the persons identified as
+     authors of the code. All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD
+     License set forth in Section 4.c of the IETF Trust's
+     Legal Provisions Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6022; see
+     the RFC itself for full legal notices.";
+
+  revision 2010-10-04 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 6022: YANG Module for NETCONF Monitoring";
+  }
+
+  typedef netconf-datastore-type {
+    type enumeration {
+      enum running;
+      enum candidate;
+      enum startup;
+    }
+    description
+      "Enumeration of possible NETCONF datastore types.";
+    reference
+      "RFC 4741: NETCONF Configuration Protocol";
+  }
+
+  identity transport {
+    description
+      "Base identity for NETCONF transport types.";
+  }
+
+  identity netconf-ssh {
+    base transport;
+    description
+      "NETCONF over Secure Shell (SSH).";
+    reference
+      "RFC 4742: Using the NETCONF Configuration Protocol
+                 over Secure SHell (SSH)";
+  }
+
+  identity netconf-soap-over-beep {
+    base transport;
+    description
+      "NETCONF over Simple Object Access Protocol (SOAP) over
+       Blocks Extensible Exchange Protocol (BEEP).";
+    reference
+      "RFC 4743: Using NETCONF over the Simple Object
+                 Access Protocol (SOAP)";
+  }
+
+  identity netconf-soap-over-https {
+    base transport;
+    description
+      "NETCONF over Simple Object Access Protocol (SOAP)
+      over Hypertext Transfer Protocol Secure (HTTPS).";
+    reference
+      "RFC 4743: Using NETCONF over the Simple Object
+                 Access Protocol (SOAP)";
+  }
+
+  identity netconf-beep {
+    base transport;
+    description
+      "NETCONF over Blocks Extensible Exchange Protocol (BEEP).";
+    reference
+      "RFC 4744: Using the NETCONF Protocol over the
+                 Blocks Extensible Exchange Protocol (BEEP)";
+  }
+
+  identity netconf-tls {
+    base transport;
+    description
+      "NETCONF over Transport Layer Security (TLS).";
+    reference
+      "RFC 5539: NETCONF over Transport Layer Security (TLS)";
+  }
+
+  identity schema-format {
+    description
+      "Base identity for data model schema languages.";
+  }
+
+  identity xsd {
+    base schema-format;
+    description
+      "W3C XML Schema Definition.";
+    reference
+      "W3C REC REC-xmlschema-1-20041028:
+         XML Schema Part 1: Structures";
+  }
+
+  identity yang {
+    base schema-format;
+    description
+      "The YANG data modeling language for NETCONF.";
+    reference
+      "RFC 6020:  YANG - A Data Modeling Language for the
+                  Network Configuration Protocol (NETCONF)";
+  }
+
+  identity yin {
+    base schema-format;
+    description
+      "The YIN syntax for YANG.";
+    reference
+      "RFC 6020:  YANG - A Data Modeling Language for the
+                  Network Configuration Protocol (NETCONF)";
+  }
+
+  identity rng {
+    base schema-format;
+    description
+      "Regular Language for XML Next Generation (RELAX NG).";
+    reference
+      "ISO/IEC 19757-2:2008: RELAX NG";
+  }
+
+  identity rnc {
+    base schema-format;
+    description
+      "Relax NG Compact Syntax";
+    reference
+      "ISO/IEC 19757-2:2008: RELAX NG";
+  }
+
+  grouping common-counters {
+    description
+      "Counters that exist both per session, and also globally,
+       accumulated from all sessions.";
+
+    leaf in-rpcs {
+      type yang:zero-based-counter32;
+      description
+        "Number of correct <rpc> messages received.";
+    }
+    leaf in-bad-rpcs {
+      type yang:zero-based-counter32;
+      description
+        "Number of messages received when an <rpc> message was expected,
+         that were not correct <rpc> messages.  This includes XML parse
+         errors and errors on the rpc layer.";
+    }
+    leaf out-rpc-errors {
+      type yang:zero-based-counter32;
+      description
+        "Number of <rpc-reply> messages sent that contained an
+         <rpc-error> element.";
+    }
+    leaf out-notifications {
+      type yang:zero-based-counter32;
+      description
+        "Number of <notification> messages sent.";
+    }
+  }
+
+  container netconf-state {
+    config false;
+    description
+      "The netconf-state container is the root of the monitoring
+       data model.";
+
+    container capabilities {
+      description
+        "Contains the list of NETCONF capabilities supported by the
+         server.";
+
+      leaf-list capability {
+        type inet:uri;
+        description
+          "List of NETCONF capabilities supported by the server.";
+      }
+    }
+
+    container datastores {
+      description
+        "Contains the list of NETCONF configuration datastores.";
+
+      list datastore {
+        key name;
+        description
+          "List of NETCONF configuration datastores supported by
+           the NETCONF server and related information.";
+
+        leaf name {
+          type netconf-datastore-type;
+          description
+            "Name of the datastore associated with this list entry.";
+        }
+        container locks {
+          presence
+            "This container is present only if the datastore
+             is locked.";
+          description
+            "The NETCONF <lock> and <partial-lock> operations allow
+             a client to lock specific resources in a datastore.  The
+             NETCONF server will prevent changes to the locked
+             resources by all sessions except the one that acquired
+             the lock(s).
+
+             Monitoring information is provided for each datastore
+             entry including details such as the session that acquired
+             the lock, the type of lock (global or partial) and the
+             list of locked resources.  Multiple locks per datastore
+             are supported.";
+
+          grouping lock-info {
+            description
+              "Lock related parameters, common to both global and
+               partial locks.";
+
+            leaf locked-by-session {
+              type uint32;
+              mandatory true;
+              description
+                "The session ID of the session that has locked
+                 this resource.  Both a global lock and a partial
+                 lock MUST contain the NETCONF session-id.
+
+                 If the lock is held by a session that is not managed
+                 by the NETCONF server (e.g., a CLI session), a session
+                 id of 0 (zero) is reported.";
+              reference
+                "RFC 4741: NETCONF Configuration Protocol";
+            }
+            leaf locked-time {
+              type yang:date-and-time;
+              mandatory true;
+              description
+                "The date and time of when the resource was
+                 locked.";
+            }
+          }
+
+          choice lock-type {
+            description
+              "Indicates if a global lock or a set of partial locks
+               are set.";
+
+            container global-lock {
+              description
+                "Present if the global lock is set.";
+              uses lock-info;
+            }
+
+            list partial-lock {
+              key lock-id;
+              description
+                "List of partial locks.";
+              reference
+                "RFC 5717: Partial Lock Remote Procedure Call (RPC) for
+                           NETCONF";
+
+              leaf lock-id {
+                type uint32;
+                description
+                  "This is the lock id returned in the <partial-lock>
+                   response.";
+              }
+              uses lock-info;
+              leaf-list select {
+                type yang:xpath1.0;
+                min-elements 1;
+                description
+                  "The xpath expression that was used to request
+                   the lock.  The select expression indicates the
+                   original intended scope of the lock.";
+              }
+              leaf-list locked-node {
+                type instance-identifier;
+                description
+                  "The list of instance-identifiers (i.e., the
+                   locked nodes).
+
+                   The scope of the partial lock is defined by the list
+                   of locked nodes.";
+              }
+            }
+          }
+        }
+      }
+    }
+
+    container schemas {
+      description
+        "Contains the list of data model schemas supported by the
+         server.";
+
+      list schema {
+        key "identifier version format";
+
+        description
+          "List of data model schemas supported by the server.";
+
+        leaf identifier {
+          type string;
+          description
+            "Identifier to uniquely reference the schema.  The
+             identifier is used in the <get-schema> operation and may
+             be used for other purposes such as file retrieval.
+
+             For modeling languages that support or require a data
+             model name (e.g., YANG module name) the identifier MUST
+             match that name.  For YANG data models, the identifier is
+             the name of the module or submodule.  In other cases, an
+             identifier such as a filename MAY be used instead.";
+        }
+        leaf version {
+          type string;
+          description
+            "Version of the schema supported.  Multiple versions MAY be
+             supported simultaneously by a NETCONF server.  Each
+             version MUST be reported individually in the schema list,
+             i.e., with same identifier, possibly different location,
+             but different version.
+
+             For YANG data models, version is the value of the most
+             recent YANG 'revision' statement in the module or
+             submodule, or the empty string if no 'revision' statement
+             is present.";
+        }
+        leaf format {
+          type identityref {
+            base schema-format;
+          }
+          description
+            "The data modeling language the schema is written
+             in (currently xsd, yang, yin, rng, or rnc).
+             For YANG data models, 'yang' format MUST be supported and
+             'yin' format MAY also be provided.";
+        }
+        leaf namespace {
+          type inet:uri;
+          mandatory true;
+          description
+            "The XML namespace defined by the data model.
+
+             For YANG data models, this is the module's namespace.
+             If the list entry describes a submodule, this field
+             contains the namespace of the module to which the
+             submodule belongs.";
+        }
+        leaf-list location {
+          type union {
+            type enumeration {
+              enum "NETCONF";
+            }
+            type inet:uri;
+          }
+          description
+            "One or more locations from which the schema can be
+             retrieved.  This list SHOULD contain at least one
+             entry per schema.
+
+             A schema entry may be located on a remote file system
+             (e.g., reference to file system for ftp retrieval) or
+             retrieved directly from a server supporting the
+             <get-schema> operation (denoted by the value 'NETCONF').";
+        }
+      }
+    }
+
+    container sessions {
+      description
+        "The sessions container includes session-specific data for
+         NETCONF management sessions.  The session list MUST include
+         all currently active NETCONF sessions.";
+
+      list session {
+        key session-id;
+        description
+          "All NETCONF sessions managed by the NETCONF server
+           MUST be reported in this list.";
+
+        leaf session-id {
+          type uint32 {
+            range "1..max";
+          }
+          description
+            "Unique identifier for the session.  This value is the
+             NETCONF session identifier, as defined in RFC 4741.";
+          reference
+            "RFC 4741: NETCONF Configuration Protocol";
+        }
+        leaf transport {
+          type identityref {
+            base transport;
+          }
+          mandatory true;
+          description
+            "Identifies the transport for each session, e.g.,
+            'netconf-ssh', 'netconf-soap', etc.";
+        }
+        leaf username  {
+          type string;
+          mandatory true;
+          description
+            "The username is the client identity that was authenticated
+            by the NETCONF transport protocol.  The algorithm used to
+            derive the username is NETCONF transport protocol specific
+            and in addition specific to the authentication mechanism
+            used by the NETCONF transport protocol.";
+        }
+        leaf source-host {
+          type inet:host;
+          description
+            "Host identifier of the NETCONF client.  The value
+             returned is implementation specific (e.g., hostname,
+             IPv4 address, IPv6 address)";
+        }
+        leaf login-time {
+          type yang:date-and-time;
+          mandatory true;
+          description
+            "Time at the server at which the session was established.";
+        }
+        uses common-counters {
+          description
+            "Per-session counters.  Zero based with following reset
+             behaviour:
+               - at start of a session
+               - when max value is reached";
+        }
+      }
+    }
+
+    container statistics {
+      description
+        "Statistical data pertaining to the NETCONF server.";
+
+      leaf netconf-start-time {
+        type yang:date-and-time;
+        description
+          "Date and time at which the management subsystem was
+           started.";
+      }
+      leaf in-bad-hellos {
+        type yang:zero-based-counter32;
+        description
+          "Number of sessions silently dropped because an
+          invalid <hello> message was received.  This includes <hello>
+          messages with a 'session-id' attribute, bad namespace, and
+          bad capability declarations.";
+      }
+      leaf in-sessions {
+        type yang:zero-based-counter32;
+        description
+          "Number of sessions started.  This counter is incremented
+           when a <hello> message with a <session-id> is sent.
+
+          'in-sessions' - 'in-bad-hellos' =
+              'number of correctly started netconf sessions'";
+      }
+      leaf dropped-sessions {
+        type yang:zero-based-counter32;
+        description
+          "Number of sessions that were abnormally terminated, e.g.,
+           due to idle timeout or transport close.  This counter is not
+           incremented when a session is properly closed by a
+           <close-session> operation, or killed by a <kill-session>
+           operation.";
+      }
+      uses common-counters {
+        description
+          "Global counters, accumulated from all sessions.
+           Zero based with following reset behaviour:
+             - re-initialization of NETCONF server
+             - when max value is reached";
+      }
+    }
+  }
+
+  rpc get-schema {
+    description
+      "This operation is used to retrieve a schema from the
+       NETCONF server.
+
+       Positive Response:
+         The NETCONF server returns the requested schema.
+
+       Negative Response:
+         If requested schema does not exist, the <error-tag> is
+         'invalid-value'.
+
+         If more than one schema matches the requested parameters, the
+         <error-tag> is 'operation-failed', and <error-app-tag> is
+         'data-not-unique'.";
+
+    input {
+      leaf identifier {
+        type string;
+        mandatory true;
+        description
+          "Identifier for the schema list entry.";
+      }
+      leaf version {
+        type string;
+        description
+          "Version of the schema requested.  If this parameter is not
+           present, and more than one version of the schema exists on
+           the server, a 'data-not-unique' error is returned, as
+           described above.";
+      }
+      leaf format {
+        type identityref {
+          base schema-format;
+        }
+        description
+           "The data modeling language of the schema.  If this
+            parameter is not present, and more than one formats of
+            the schema exists on the server, a 'data-not-unique' error
+            is returned, as described above.";
+      }
+    }
+    output {
+        anyxml data {
+          description
+            "Contains the schema content.";
+      }
+    }
+  }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-notifications.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-notifications.yang
new file mode 100644
index 0000000..4ec1dea
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-notifications.yang
@@ -0,0 +1,337 @@
+module ietf-netconf-notifications {
+
+   namespace
+     "urn:ietf:params:xml:ns:yang:ietf-netconf-notifications";
+
+   prefix ncn;
+
+   import ietf-inet-types { prefix inet; }
+   import ietf-netconf { prefix nc; }
+
+   organization
+    "IETF NETCONF (Network Configuration Protocol) Working Group";
+
+   contact
+    "WG Web:   <http://tools.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     WG Chair: Bert Wijnen
+               <mailto:bertietf@bwijnen.net>
+
+     WG Chair: Mehmet Ersue
+               <mailto:mehmet.ersue@nsn.com>
+
+     Editor: Andy Bierman
+             <mailto:andy@netconfcentral.org>";
+
+   description
+    "This module defines a YANG data model for use with the
+     NETCONF protocol that allows the NETCONF client to
+     receive common NETCONF base event notifications.
+
+	 Copyright (c) 2012 IETF Trust and the persons identified as
+     the document authors.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6470; see
+     the RFC itself for full legal notices.";
+
+   revision "2012-02-06" {
+     description
+       "Initial version.";
+     reference
+      "RFC 6470: NETCONF Base Notifications";
+   }
+
+  grouping common-session-parms {
+    description
+      "Common session parameters to identify a
+       management session.";
+
+    leaf username {
+      type string;
+      mandatory true;
+      description
+        "Name of the user for the session.";
+    }
+
+    leaf session-id {
+      type nc:session-id-or-zero-type;
+      mandatory true;
+      description
+        "Identifier of the session.
+         A NETCONF session MUST be identified by a non-zero value.
+         A non-NETCONF session MAY be identified by the value zero.";
+    }
+
+    leaf source-host {
+      type inet:ip-address;
+      description
+        "Address of the remote host for the session.";
+    }
+  }
+
+  grouping changed-by-parms {
+    description
+      "Common parameters to identify the source
+       of a change event, such as a configuration
+       or capability change.";
+
+	container changed-by {
+      description
+        "Indicates the source of the change.
+         If caused by internal action, then the
+         empty leaf 'server' will be present.
+         If caused by a management session, then
+         the name, remote host address, and session ID
+         of the session that made the change will be reported.";
+      choice server-or-user {
+        mandatory true;
+        leaf server {
+          type empty;
+          description
+            "If present, the change was caused
+             by the server.";
+        }
+
+        case by-user {
+          uses common-session-parms;
+        }
+      } // choice server-or-user
+    } // container changed-by-parms
+  }
+
+
+  notification netconf-config-change {
+    description
+      "Generated when the NETCONF server detects that the
+       <running> or <startup> configuration datastore
+       has been changed by a management session.
+       The notification summarizes the edits that
+       have been detected.
+
+       The server MAY choose to also generate this
+       notification while loading a datastore during the
+       boot process for the device.";
+
+    uses changed-by-parms;
+
+    leaf datastore {
+      type enumeration {
+        enum running {
+          description "The <running> datastore has changed.";
+        }
+        enum startup {
+          description "The <startup> datastore has changed";
+        }
+      }
+      default "running";
+      description
+        "Indicates which configuration datastore has changed.";
+      }
+
+    list edit {
+      description
+        "An edit record SHOULD be present for each distinct
+         edit operation that the server has detected on
+         the target datastore.  This list MAY be omitted
+         if the detailed edit operations are not known.
+         The server MAY report entries in this list for
+         changes not made by a NETCONF session (e.g., CLI).";
+
+      leaf target {
+        type instance-identifier;
+        description
+          "Topmost node associated with the configuration change.
+           A server SHOULD set this object to the node within
+           the datastore that is being altered.  A server MAY
+           set this object to one of the ancestors of the actual
+           node that was changed, or omit this object, if the
+           exact node is not known.";
+      }
+
+      leaf operation {
+        type nc:edit-operation-type;
+        description
+          "Type of edit operation performed.
+           A server MUST set this object to the NETCONF edit
+           operation performed on the target datastore.";
+      }
+    } // list edit
+  } // notification netconf-config-change
+
+  notification netconf-capability-change {
+    description
+      "Generated when the NETCONF server detects that
+       the server capabilities have changed.
+       Indicates which capabilities have been added, deleted,
+       and/or modified.  The manner in which a server
+       capability is changed is outside the scope of this
+       document.";
+
+    uses changed-by-parms;
+
+    leaf-list added-capability {
+      type inet:uri;
+      description
+        "List of capabilities that have just been added.";
+    }
+
+    leaf-list deleted-capability {
+      type inet:uri;
+      description
+        "List of capabilities that have just been deleted.";
+    }
+
+    leaf-list modified-capability {
+      type inet:uri;
+      description
+        "List of capabilities that have just been modified.
+         A capability is considered to be modified if the
+         base URI for the capability has not changed, but
+         one or more of the parameters encoded at the end of
+         the capability URI have changed.
+         The new modified value of the complete URI is returned.";
+    }
+  } // notification netconf-capability-change
+
+
+  notification netconf-session-start {
+    description
+      "Generated when a NETCONF server detects that a
+       NETCONF session has started.  A server MAY generate
+       this event for non-NETCONF management sessions.
+       Indicates the identity of the user that started
+       the session.";
+    uses common-session-parms;
+  } // notification netconf-session-start
+
+  notification netconf-session-end {
+    description
+      "Generated when a NETCONF server detects that a
+       NETCONF session has terminated.
+       A server MAY optionally generate this event for
+       non-NETCONF management sessions.  Indicates the
+       identity of the user that owned the session,
+       and why the session was terminated.";
+
+    uses common-session-parms;
+
+    leaf killed-by {
+      when "../termination-reason = 'killed'";
+      type nc:session-id-type;
+      description
+        "The ID of the session that directly caused this session
+         to be abnormally terminated.  If this session was abnormally
+         terminated by a non-NETCONF session unknown to the server,
+         then this leaf will not be present.";
+    }
+
+    leaf termination-reason {
+      type enumeration {
+        enum "closed" {
+          description
+            "The session was terminated by the client in normal
+             fashion, e.g., by the NETCONF <close-session>
+             protocol operation.";
+        }
+        enum "killed" {
+          description
+            "The session was terminated in abnormal
+             fashion, e.g., by the NETCONF <kill-session>
+             protocol operation.";
+        }
+        enum "dropped" {
+          description
+            "The session was terminated because the transport layer
+             connection was unexpectedly closed.";
+        }
+        enum "timeout" {
+          description
+            "The session was terminated because of inactivity,
+             e.g., waiting for the <hello> message or <rpc>
+             messages.";
+        }
+        enum "bad-hello" {
+          description
+            "The client's <hello> message was invalid.";
+        }
+        enum "other" {
+          description
+            "The session was terminated for some other reason.";
+        }
+      }
+      mandatory true;
+      description
+        "Reason the session was terminated.";
+     }
+  } // notification netconf-session-end
+
+
+  notification netconf-confirmed-commit {
+    description
+      "Generated when a NETCONF server detects that a
+       confirmed-commit event has occurred.  Indicates the event
+       and the current state of the confirmed-commit procedure
+       in progress.";
+    reference
+      "RFC 6241, Section 8.4";
+
+    uses common-session-parms {
+      when "../confirm-event != 'timeout'";
+    }
+
+    leaf confirm-event {
+      type enumeration {
+        enum "start" {
+          description
+            "The confirmed-commit procedure has started.";
+        }
+        enum "cancel" {
+          description
+            "The confirmed-commit procedure has been canceled,
+             e.g., due to the session being terminated, or an
+             explicit <cancel-commit> operation.";
+        }
+        enum "timeout" {
+          description
+            "The confirmed-commit procedure has been canceled
+             due to the confirm-timeout interval expiring.
+             The common session parameters will not be present
+             in this sub-mode.";
+        }
+        enum "extend" {
+          description
+            "The confirmed-commit timeout has been extended,
+             e.g., by a new <confirmed-commit> operation.";
+        }
+        enum "complete" {
+          description
+            "The confirmed-commit procedure has been completed.";
+        }
+      }
+      mandatory true;
+      description
+        "Indicates the event that caused the notification.";
+    }
+
+    leaf timeout {
+      when
+       "../confirm-event = 'start' or ../confirm-event = 'extend'";
+      type uint32;
+      units "seconds";
+      description
+        "The configured timeout value if the event type
+         is 'start' or 'extend'.  This value represents
+         the approximate number of seconds from the event
+         time when the 'timeout' event might occur.";
+    }
+  } // notification netconf-confirmed-commit
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-with-defaults.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-with-defaults.yang
new file mode 100644
index 0000000..1c569a2
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-with-defaults.yang
@@ -0,0 +1,165 @@
+ module ietf-netconf-with-defaults {
+
+    namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults";
+
+    prefix ncwd;
+
+    import ietf-netconf { prefix nc; }
+
+    organization
+     "IETF NETCONF (Network Configuration Protocol) Working Group";
+
+    contact
+     "WG Web:   <http://tools.ietf.org/wg/netconf/>
+      WG List:  <mailto:netconf@ietf.org>
+
+      WG Chair: Bert Wijnen
+                <mailto:bertietf@bwijnen.net>
+
+      WG Chair: Mehmet Ersue
+                <mailto:mehmet.ersue@nsn.com>
+
+      Editor: Andy Bierman
+              <mailto:andy.bierman@brocade.com>
+
+      Editor: Balazs Lengyel
+              <mailto:balazs.lengyel@ericsson.com>";
+
+    description
+     "This module defines an extension to the NETCONF protocol
+      that allows the NETCONF client to control how default
+      values are handled by the server in particular NETCONF operations.
+
+      Copyright (c) 2010 IETF Trust and the persons identified as
+      the document authors.  All rights reserved.
+
+      Redistribution and use in source and binary forms, with or
+      without modification, is permitted pursuant to, and subject
+      to the license terms contained in, the Simplified BSD License
+      set forth in Section 4.c of the IETF Trust's Legal Provisions
+      Relating to IETF Documents
+      (http://trustee.ietf.org/license-info).
+
+      This version of this YANG module is part of RFC XXXX; see
+      the RFC itself for full legal notices.";
+    // RFC Ed.: replace XXXX with actual RFC number and remove this note
+
+    // RFC Ed.: remove this note
+    // Note: extracted from draft-ietf-netmod-with-defaults-10.txt
+
+    revision 2010-06-09 {
+      description
+        "Initial version.";
+      reference
+       "RFC XXXX: With-defaults capability for NETCONF";
+    }
+    // RFC Ed.: replace XXXX with actual
+    // RFC number and remove this note
+
+    typedef with-defaults-mode {
+       description
+         "Possible modes to report default data.";
+       reference
+          "RFC XXXX; section 3.";
+          // RFC Ed.: replace XXXX with actual
+          // RFC number and remove this note
+
+       type enumeration {
+          enum report-all {
+              description
+                "All default data is reported.";
+              reference
+                "RFC XXXX; section 3.1";
+                // RFC Ed.: replace XXXX with actual
+                // RFC number and remove this note
+
+          }
+          enum report-all-tagged {
+              description
+                "All default data is reported.
+                 Any nodes considered to be default data
+                 will contain a 'wd:default' XML attribute,
+                 set to 'true'.";
+              reference
+                "RFC XXXX; section 3.4";
+                // RFC Ed.: replace XXXX with actual
+                // RFC number and remove this note
+          }
+          enum trim {
+              description
+                "Values are not reported if they contain the default.";
+              reference
+                "RFC XXXX; section 3.2";
+                // RFC Ed.: replace XXXX with actual
+                // RFC number and remove this note
+
+          }
+          enum explicit {
+              description
+                "Report values that contain the definition of
+                 explicitly set data.";
+              reference
+                "RFC XXXX; section 3.3";
+                // RFC Ed.: replace XXXX with actual
+                // RFC number and remove this note
+          }
+      }
+    }
+
+    grouping with-defaults-parameters {
+      description
+        "Contains the <with-defaults> parameter for control
+         of defaults in NETCONF retrieval operations.";
+
+      leaf with-defaults {
+        description
+          "The explicit defaults processing mode requested.";
+        reference
+          "RFC XXXX; section 4.6.1";
+          // RFC Ed.: replace XXXX with actual
+          // RFC number and remove this note
+
+        type with-defaults-mode;
+      }
+    }
+
+    // extending the get-config operation
+    augment /nc:get-config/nc:input {
+        description
+          "Adds the <with-defaults> parameter to the
+           input of the NETCONF <get-config> operation.";
+        reference
+          "RFC XXXX; section 4.6.1";
+          // RFC Ed.: replace XXXX with actual
+          // RFC number and remove this note
+
+        uses with-defaults-parameters;
+    }
+
+    // extending the get operation
+    augment /nc:get/nc:input {
+        description
+          "Adds the <with-defaults> parameter to
+           the input of the NETCONF <get> operation.";
+        reference
+          "RFC XXXX; section 4.6.1";
+          // RFC Ed.: replace XXXX with actual
+          // RFC number and remove this note
+
+        uses with-defaults-parameters;
+    }
+
+    // extending the copy-config operation
+    augment /nc:copy-config/nc:input {
+        description
+          "Adds the <with-defaults> parameter to
+           the input of the NETCONF <copy-config> operation.";
+        reference
+          "RFC XXXX; section 4.6.1";
+          // RFC Ed.: replace XXXX with actual
+          // RFC number and remove this note
+
+        uses with-defaults-parameters;
+    }
+
+ }
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf.yang
new file mode 100644
index 0000000..2595a12
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf.yang
@@ -0,0 +1,980 @@
+module ietf-netconf {
+
+  // the namespace for NETCONF XML definitions is unchanged
+  // from RFC 4741, which this document replaces
+  namespace "urn:ietf:params:xml:ns:netconf:base:1.0";
+
+  prefix nc;
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netconf/>
+     WG List:  <netconf@ietf.org>
+
+     WG Chair: Bert Wijnen
+               <bertietf@bwijnen.net>
+
+     WG Chair: Mehmet Ersue
+               <mehmet.ersue@nsn.com>
+
+     Editor:   Martin Bjorklund
+               <mbj@tail-f.com>
+
+     Editor:   Juergen Schoenwaelder
+               <j.schoenwaelder@jacobs-university.de>
+
+     Editor:   Andy Bierman
+               <andy.bierman@brocade.com>";
+  description
+    "NETCONF Protocol Data Types and Protocol Operations.
+
+     Copyright (c) 2011 IETF Trust and the persons identified as
+     the document authors.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 6241; see
+     the RFC itself for full legal notices.";
+
+  revision 2011-06-01 {
+    description
+      "Initial revision;";
+    reference
+      "RFC 6241: Network Configuration Protocol";
+  }
+
+  extension get-filter-element-attributes {
+    description
+      "If this extension is present within an 'anyxml'
+       statement named 'filter', which must be conceptually
+       defined within the RPC input section for the <get>
+       and <get-config> protocol operations, then the
+       following unqualified XML attribute is supported
+       within the <filter> element, within a <get> or
+       <get-config> protocol operation:
+
+         type : optional attribute with allowed
+                value strings 'subtree' and 'xpath'.
+                If missing, the default value is 'subtree'.
+
+       If the 'xpath' feature is supported, then the
+       following unqualified XML attribute is
+       also supported:
+
+         select: optional attribute containing a
+                 string representing an XPath expression.
+                 The 'type' attribute must be equal to 'xpath'
+                 if this attribute is present.";
+  }
+
+  // NETCONF capabilities defined as features
+  feature writable-running {
+    description
+      "NETCONF :writable-running capability;
+       If the server advertises the :writable-running
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.2";
+  }
+
+  feature candidate {
+    description
+      "NETCONF :candidate capability;
+       If the server advertises the :candidate
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.3";
+  }
+
+  feature confirmed-commit {
+    if-feature candidate;
+    description
+      "NETCONF :confirmed-commit:1.1 capability;
+       If the server advertises the :confirmed-commit:1.1
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+
+    reference "RFC 6241, Section 8.4";
+  }
+
+  feature rollback-on-error {
+    description
+      "NETCONF :rollback-on-error capability;
+       If the server advertises the :rollback-on-error
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.5";
+  }
+
+  feature validate {
+    description
+      "NETCONF :validate:1.1 capability;
+       If the server advertises the :validate:1.1
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.6";
+  }
+
+  feature startup {
+    description
+      "NETCONF :startup capability;
+       If the server advertises the :startup
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.7";
+  }
+
+  feature url {
+    description
+      "NETCONF :url capability;
+       If the server advertises the :url
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.8";
+  }
+
+  feature xpath {
+    description
+      "NETCONF :xpath capability;
+       If the server advertises the :xpath
+       capability for a session, then this feature must
+       also be enabled for that session.  Otherwise,
+       this feature must not be enabled.";
+    reference "RFC 6241, Section 8.9";
+  }
+
+  // NETCONF Simple Types
+
+  typedef session-id-type {
+    type uint32 {
+      range "1..max";
+    }
+    description
+      "NETCONF Session Id";
+  }
+
+  typedef session-id-or-zero-type {
+    type uint32;
+    description
+      "NETCONF Session Id or Zero to indicate none";
+  }
+  typedef error-tag-type {
+    type enumeration {
+       enum in-use {
+         description
+           "The request requires a resource that
+            already is in use.";
+       }
+       enum invalid-value {
+         description
+           "The request specifies an unacceptable value for one
+            or more parameters.";
+       }
+       enum too-big {
+         description
+           "The request or response (that would be generated) is
+            too large for the implementation to handle.";
+       }
+       enum missing-attribute {
+         description
+           "An expected attribute is missing.";
+       }
+       enum bad-attribute {
+         description
+           "An attribute value is not correct; e.g., wrong type,
+            out of range, pattern mismatch.";
+       }
+       enum unknown-attribute {
+         description
+           "An unexpected attribute is present.";
+       }
+       enum missing-element {
+         description
+           "An expected element is missing.";
+       }
+       enum bad-element {
+         description
+           "An element value is not correct; e.g., wrong type,
+            out of range, pattern mismatch.";
+       }
+       enum unknown-element {
+         description
+           "An unexpected element is present.";
+       }
+       enum unknown-namespace {
+         description
+           "An unexpected namespace is present.";
+       }
+       enum access-denied {
+         description
+           "Access to the requested protocol operation or
+            data model is denied because authorization failed.";
+       }
+       enum lock-denied {
+         description
+           "Access to the requested lock is denied because the
+            lock is currently held by another entity.";
+       }
+       enum resource-denied {
+         description
+           "Request could not be completed because of
+            insufficient resources.";
+       }
+       enum rollback-failed {
+         description
+           "Request to roll back some configuration change (via
+            rollback-on-error or <discard-changes> operations)
+            was not completed for some reason.";
+
+       }
+       enum data-exists {
+         description
+           "Request could not be completed because the relevant
+            data model content already exists.  For example,
+            a 'create' operation was attempted on data that
+            already exists.";
+       }
+       enum data-missing {
+         description
+           "Request could not be completed because the relevant
+            data model content does not exist.  For example,
+            a 'delete' operation was attempted on
+            data that does not exist.";
+       }
+       enum operation-not-supported {
+         description
+           "Request could not be completed because the requested
+            operation is not supported by this implementation.";
+       }
+       enum operation-failed {
+         description
+           "Request could not be completed because the requested
+            operation failed for some reason not covered by
+            any other error condition.";
+       }
+       enum partial-operation {
+         description
+           "This error-tag is obsolete, and SHOULD NOT be sent
+            by servers conforming to this document.";
+       }
+       enum malformed-message {
+         description
+           "A message could not be handled because it failed to
+            be parsed correctly.  For example, the message is not
+            well-formed XML or it uses an invalid character set.";
+       }
+     }
+     description "NETCONF Error Tag";
+     reference "RFC 6241, Appendix A";
+  }
+
+  typedef error-severity-type {
+    type enumeration {
+      enum error {
+        description "Error severity";
+      }
+      enum warning {
+        description "Warning severity";
+      }
+    }
+    description "NETCONF Error Severity";
+    reference "RFC 6241, Section 4.3";
+  }
+
+  typedef edit-operation-type {
+    type enumeration {
+      enum merge {
+        description
+          "The configuration data identified by the
+           element containing this attribute is merged
+           with the configuration at the corresponding
+           level in the configuration datastore identified
+           by the target parameter.";
+      }
+      enum replace {
+        description
+          "The configuration data identified by the element
+           containing this attribute replaces any related
+           configuration in the configuration datastore
+           identified by the target parameter.  If no such
+           configuration data exists in the configuration
+           datastore, it is created.  Unlike a
+           <copy-config> operation, which replaces the
+           entire target configuration, only the configuration
+           actually present in the config parameter is affected.";
+      }
+      enum create {
+        description
+          "The configuration data identified by the element
+           containing this attribute is added to the
+           configuration if and only if the configuration
+           data does not already exist in the configuration
+           datastore.  If the configuration data exists, an
+           <rpc-error> element is returned with an
+           <error-tag> value of 'data-exists'.";
+      }
+      enum delete {
+        description
+          "The configuration data identified by the element
+           containing this attribute is deleted from the
+           configuration if and only if the configuration
+           data currently exists in the configuration
+           datastore.  If the configuration data does not
+           exist, an <rpc-error> element is returned with
+           an <error-tag> value of 'data-missing'.";
+      }
+      enum remove {
+        description
+          "The configuration data identified by the element
+           containing this attribute is deleted from the
+           configuration if the configuration
+           data currently exists in the configuration
+           datastore.  If the configuration data does not
+           exist, the 'remove' operation is silently ignored
+           by the server.";
+      }
+    }
+    default "merge";
+    description "NETCONF 'operation' attribute values";
+    reference "RFC 6241, Section 7.2";
+  }
+
+  // NETCONF Standard Protocol Operations
+
+  rpc get-config {
+    description
+      "Retrieve all or part of a specified configuration.";
+
+    reference "RFC 6241, Section 7.1";
+
+    input {
+      container source {
+        description
+          "Particular configuration to retrieve.";
+
+        choice config-source {
+          mandatory true;
+          description
+            "The configuration to retrieve.";
+          case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config source.";
+          }
+          }
+          case running {
+          leaf running {
+            type empty;
+            description
+              "The running configuration is the config source.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config source.
+               This is optional-to-implement on the server because
+               not all servers will support filtering for this
+               datastore.";
+          }
+          }
+        }
+      }
+
+      anyxml filter {
+        description
+          "Subtree or XPath filter to use.";
+//        nc:get-filter-element-attributes;
+      }
+    }
+
+    output {
+      anyxml data {
+        description
+          "Copy of the source datastore subset that matched
+           the filter criteria (if any).  An empty data container
+           indicates that the request did not produce any results.";
+      }
+    }
+  }
+
+  rpc edit-config {
+    description
+      "The <edit-config> operation loads all or part of a specified
+       configuration to the specified target configuration.";
+
+    reference "RFC 6241, Section 7.2";
+
+    input {
+      container target {
+        description
+          "Particular configuration to edit.";
+
+        choice config-target {
+          mandatory true;
+          description
+            "The configuration target.";
+          case candidate {
+            leaf candidate {
+              if-feature candidate;
+              type empty;
+              description
+                "The candidate configuration is the config target.";
+            }
+          }
+          case running {
+            leaf running {
+              if-feature writable-running;
+              type empty;
+              description
+                "The running configuration is the config source.";
+            }
+          }
+        }
+      }
+
+      leaf default-operation {
+        type enumeration {
+          enum merge {
+            description
+              "The default operation is merge.";
+          }
+          enum replace {
+            description
+              "The default operation is replace.";
+          }
+          enum none {
+            description
+              "There is no default operation.";
+          }
+        }
+        default "merge";
+        description
+          "The default operation to use.";
+      }
+
+      leaf test-option {
+        if-feature validate;
+        type enumeration {
+          enum test-then-set {
+            description
+              "The server will test and then set if no errors.";
+          }
+          enum set {
+            description
+              "The server will set without a test first.";
+          }
+
+          enum test-only {
+            description
+              "The server will only test and not set, even
+               if there are no errors.";
+          }
+        }
+        default "test-then-set";
+        description
+          "The test option to use.";
+      }
+
+      leaf error-option {
+        type enumeration {
+          enum stop-on-error {
+            description
+              "The server will stop on errors.";
+          }
+          enum continue-on-error {
+            description
+              "The server may continue on errors.";
+          }
+          enum rollback-on-error {
+            description
+              "The server will roll back on errors.
+               This value can only be used if the 'rollback-on-error'
+               feature is supported.";
+          }
+        }
+        default "stop-on-error";
+        description
+          "The error option to use.";
+      }
+
+      choice edit-content {
+        mandatory true;
+        description
+          "The content for the edit operation.";
+		case config {
+        anyxml config {
+          description
+            "Inline Config content.";
+        }
+        }
+        case url {
+        leaf url {
+          if-feature url;
+          type inet:uri;
+          description
+            "URL-based config content.";
+        }
+        }
+      }
+    }
+  }
+
+  rpc copy-config {
+    description
+      "Create or replace an entire configuration datastore with the
+       contents of another complete configuration datastore.";
+
+    reference "RFC 6241, Section 7.3";
+
+    input {
+      container target {
+        description
+          "Particular configuration to copy to.";
+
+        choice config-target {
+          mandatory true;
+          description
+            "The configuration target of the copy operation.";
+		  case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config target.";
+          }
+          }
+          case running {
+          leaf running {
+            if-feature writable-running;
+            type empty;
+            description
+              "The running configuration is the config target.
+               This is optional-to-implement on the server.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config target.";
+          }
+          }
+          case url {
+          leaf url {
+            if-feature url;
+            type inet:uri;
+            description
+              "The URL-based configuration is the config target.";
+          }
+          }
+        }
+      }
+
+      container source {
+        description
+          "Particular configuration to copy from.";
+
+        choice config-source {
+          mandatory true;
+          description
+            "The configuration source for the copy operation.";
+
+		  case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config source.";
+          }
+          }
+          case running {
+          leaf running {
+            type empty;
+            description
+              "The running configuration is the config source.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config source.";
+          }
+          }
+          case url {
+          leaf url {
+            if-feature url;
+            type inet:uri;
+            description
+              "The URL-based configuration is the config source.";
+          }
+          }
+          case config {
+          anyxml config {
+            description
+              "Inline Config content: <config> element.  Represents
+               an entire configuration datastore, not
+               a subset of the running datastore.";
+          }
+          }
+        }
+      }
+    }
+  }
+
+  rpc delete-config {
+    description
+      "Delete a configuration datastore.";
+
+    reference "RFC 6241, Section 7.4";
+
+    input {
+      container target {
+        description
+          "Particular configuration to delete.";
+
+        choice config-target {
+          mandatory true;
+          description
+            "The configuration target to delete.";
+		  case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config target.";
+          }
+          }
+          case url {
+          leaf url {
+            if-feature url;
+            type inet:uri;
+            description
+              "The URL-based configuration is the config target.";
+          }
+          }
+        }
+      }
+    }
+  }
+
+  rpc lock {
+    description
+      "The lock operation allows the client to lock the configuration
+       system of a device.";
+
+    reference "RFC 6241, Section 7.5";
+
+    input {
+      container target {
+        description
+          "Particular configuration to lock.";
+
+        choice config-target {
+          mandatory true;
+          description
+            "The configuration target to lock.";
+		  case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config target.";
+          }
+          }
+          case running {
+          leaf running {
+            type empty;
+            description
+              "The running configuration is the config target.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config target.";
+          }
+          }
+        }
+      }
+    }
+  }
+
+  rpc unlock {
+    description
+      "The unlock operation is used to release a configuration lock,
+       previously obtained with the 'lock' operation.";
+
+    reference "RFC 6241, Section 7.6";
+
+    input {
+      container target {
+        description
+          "Particular configuration to unlock.";
+
+        choice config-target {
+          mandatory true;
+          description
+            "The configuration target to unlock.";
+		  case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config target.";
+          }
+          }
+          case running {
+          leaf running {
+            type empty;
+            description
+              "The running configuration is the config target.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config target.";
+          }
+          }
+        }
+      }
+    }
+  }
+
+  rpc get {
+    description
+      "Retrieve running configuration and device state information.";
+
+    reference "RFC 6241, Section 7.7";
+
+    input {
+      anyxml filter {
+        description
+          "This parameter specifies the portion of the system
+           configuration and state data to retrieve.";
+//        nc:get-filter-element-attributes;
+      }
+    }
+
+    output {
+      anyxml data {
+        description
+          "Copy of the running datastore subset and/or state
+           data that matched the filter criteria (if any).
+           An empty data container indicates that the request did not
+           produce any results.";
+      }
+    }
+  }
+
+  rpc close-session {
+    description
+      "Request graceful termination of a NETCONF session.";
+
+    reference "RFC 6241, Section 7.8";
+  }
+
+  rpc kill-session {
+    description
+      "Force the termination of a NETCONF session.";
+
+    reference "RFC 6241, Section 7.9";
+
+    input {
+      leaf session-id {
+        type session-id-type;
+        mandatory true;
+        description
+          "Particular session to kill.";
+      }
+    }
+  }
+
+  rpc commit {
+    if-feature candidate;
+
+    description
+      "Commit the candidate configuration as the device's new
+       current configuration.";
+
+    reference "RFC 6241, Section 8.3.4.1";
+
+    input {
+      leaf confirmed {
+        if-feature confirmed-commit;
+        type empty;
+        description
+          "Requests a confirmed commit.";
+        reference "RFC 6241, Section 8.3.4.1";
+      }
+
+      leaf confirm-timeout {
+        if-feature confirmed-commit;
+        type uint32 {
+          range "1..max";
+        }
+        units "seconds";
+        default "600";   // 10 minutes
+        description
+          "The timeout interval for a confirmed commit.";
+        reference "RFC 6241, Section 8.3.4.1";
+      }
+
+      leaf persist {
+        if-feature confirmed-commit;
+        type string;
+        description
+          "This parameter is used to make a confirmed commit
+           persistent.  A persistent confirmed commit is not aborted
+           if the NETCONF session terminates.  The only way to abort
+           a persistent confirmed commit is to let the timer expire,
+           or to use the <cancel-commit> operation.
+
+           The value of this parameter is a token that must be given
+           in the 'persist-id' parameter of <commit> or
+           <cancel-commit> operations in order to confirm or cancel
+           the persistent confirmed commit.
+
+           The token should be a random string.";
+        reference "RFC 6241, Section 8.3.4.1";
+      }
+
+      leaf persist-id {
+        if-feature confirmed-commit;
+        type string;
+        description
+          "This parameter is given in order to commit a persistent
+           confirmed commit.  The value must be equal to the value
+           given in the 'persist' parameter to the <commit> operation.
+           If it does not match, the operation fails with an
+          'invalid-value' error.";
+        reference "RFC 6241, Section 8.3.4.1";
+      }
+
+    }
+  }
+
+  rpc discard-changes {
+    if-feature candidate;
+
+    description
+      "Revert the candidate configuration to the current
+       running configuration.";
+    reference "RFC 6241, Section 8.3.4.2";
+  }
+
+  rpc cancel-commit {
+    if-feature confirmed-commit;
+    description
+      "This operation is used to cancel an ongoing confirmed commit.
+       If the confirmed commit is persistent, the parameter
+       'persist-id' must be given, and it must match the value of the
+       'persist' parameter.";
+    reference "RFC 6241, Section 8.4.4.1";
+
+    input {
+      leaf persist-id {
+        type string;
+        description
+          "This parameter is given in order to cancel a persistent
+           confirmed commit.  The value must be equal to the value
+           given in the 'persist' parameter to the <commit> operation.
+           If it does not match, the operation fails with an
+          'invalid-value' error.";
+      }
+    }
+  }
+
+  rpc validate {
+    if-feature validate;
+
+    description
+      "Validates the contents of the specified configuration.";
+
+    reference "RFC 6241, Section 8.6.4.1";
+
+    input {
+      container source {
+        description
+          "Particular configuration to validate.";
+
+        choice config-source {
+          mandatory true;
+          description
+            "The configuration source to validate.";
+
+		  case candidate {
+          leaf candidate {
+            if-feature candidate;
+            type empty;
+            description
+              "The candidate configuration is the config source.";
+          }
+          }
+          case running {
+          leaf running {
+            type empty;
+            description
+              "The running configuration is the config source.";
+          }
+          }
+          case startup {
+          leaf startup {
+            if-feature startup;
+            type empty;
+            description
+              "The startup configuration is the config source.";
+          }
+          }
+          case url {
+          leaf url {
+            if-feature url;
+            type inet:uri;
+            description
+              "The URL-based configuration is the config source.";
+          }
+          }
+          case config {
+          anyxml config {
+            description
+              "Inline Config content: <config> element.  Represents
+               an entire configuration datastore, not
+               a subset of the running datastore.";
+          }
+          }
+        }
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-microsemi.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-microsemi.yang
new file mode 100644
index 0000000..b88ba26
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-microsemi.yang
@@ -0,0 +1,527 @@
+module ietf-system-microsemi {
+
+    namespace "http://www.microsemi.com/microsemi-edge-assure/msea-system";
+    prefix "sys-ms";
+
+    import ietf-yang-types {
+        prefix yang;
+        revision-date 2013-07-15;
+    }
+
+    import ietf-inet-types {
+        prefix inet;
+        revision-date 2013-07-15;
+    }
+
+    import msea-types {
+        prefix msea;
+        revision-date 2016-02-29;
+    }
+
+    import ietf-system {
+        prefix sys;
+        revision-date 2014-08-06;
+    }
+
+    import ietf-netconf-acm {
+        prefix nacm;
+        revision-date 2012-02-22;
+    }
+
+    /*** META INFORMATION ***/
+
+    organization
+    "Microsemi Inc., FTD Division";
+
+    contact
+    "Web URL: http://www.microsemi.com/
+    E-mail: info@microsemi.com
+    Postal: Microsemi Corporation Corporate Headquarters
+    One Enterprise Aliso Viejo,
+    CA 92656
+    U.S.A.
+    Phone: +1 949 380 6100
+    Fax: +1 949 215-4996";
+
+    description
+    "This YANG module extends the IETF System objects with some extra configuration attributes
+
+    Copyright 2015 Microsemi Inc.
+    All rights reserved.";
+
+    reference "RFC 7317: A YANG Data Model for System Management";
+
+    revision "2016-05-05" {
+        description
+        "Updated for ZTP support - Sean Condon, Microsemi";
+    }
+
+    revision "2015-10-01" {
+        description
+        "Initial version to augment IETF-SYSTEM YANG module - Sean Condon, Microsemi";
+    }
+
+    typedef identifier {
+        type string {
+            length "1..255";
+            pattern "[a-zA-Z0-9\-._]*";
+        }
+        description
+        "A simple string with only alphabetic or numeric and dash, dot and underscore";
+    }
+
+    grouping upgrade-file-attributes {
+        leaf file-name {
+            type string;
+            description "The name of the update TAR file as found on the device";
+        }
+
+        leaf file-date {
+            type yang:date-and-time;
+            description "The date of the update TAR file as found on the device";
+        }
+
+        leaf file-size {
+            type uint32;
+            description "The size of the update TAR file as found on the device";
+        }
+    }
+
+
+    grouping upgrade-attributes {
+        description "Attributes from the /update.tar file";
+
+        leaf version {
+            type uint32;
+            description "The version of this portion of the /update.tar";
+        }
+
+        leaf crc32 {
+            type uint32;
+            description "The CRC32 value of this portion of the /update.tar";
+        }
+
+        leaf length {
+            type uint32;
+            description "The length of this portion of the /update.tar";
+        }
+    }
+
+    grouping ddm-attributes {
+
+        leaf high-alarm-thresh {
+            description "The high alarm threshold value";
+            type decimal64 {
+                fraction-digits 6;
+            }
+        }
+
+        leaf high-warn-thresh {
+            description "The high warn threshold value";
+            type decimal64 {
+                fraction-digits 6;
+            }
+        }
+
+        leaf low-warn-thresh {
+            description "The low warn threshold value";
+            type decimal64 {
+                fraction-digits 6;
+            }
+        }
+
+        leaf low-alarm-thresh {
+            description "The low alarm threshold value";
+            type decimal64 {
+                fraction-digits 6;
+            }
+        }
+    }
+
+    feature serial-number {
+        description "Set of readonly attributes that identify the hardware";
+    }
+
+    feature remote-upgrade {
+        description
+        "Indicates that the device supports upgrade of fabric, linux and fabric header.
+        This expects a file /update.tar on the device -
+        put there through SFTP or some other file transfer method";
+    }
+
+
+    augment "/sys:system" {
+        description
+        "Extends the SYSTEM with some extra configuration attributes required for setup.";
+
+        leaf asset-tag { //Microsemi specific configuration attribute
+            type identifier;
+            description
+            "An asset tag field for the device.";
+        }
+
+        leaf description { //Microsemi specific configuration attribute
+            type string {
+                length "0..256";
+                pattern "[a-zA-Z0-9\\-_. ,]*";
+            }
+            description "A description for the device.";
+        }
+
+        leaf longitude { //Microsemi specific configuration attribute
+            type decimal64 {
+                fraction-digits 7;
+                range "-180..180";
+            }
+            description
+            "Longitude for the device expressed in decimal degrees.
+            Positive values represent East and negative values represent West";
+        }
+
+        leaf latitude { //Microsemi specific configuration attribute
+            type decimal64 {
+                fraction-digits 7;
+                range "-90..90";
+            }
+            description
+            "Latitude for the device expressed in decimal degrees
+            Positive values represent North and negative values represent South";
+        }
+    }
+
+
+    augment "/sys:system-state" {
+        description
+        "Extends the SYSTEM-STATE with some extra configuration attributes required for setup.
+
+        All attributes are automatically config=false because they extend system-state";
+
+        container remote-upgrade {
+            description "Details of the /update.tar file present on the system.
+                    These are all read-only because they are under system-state";
+
+            choice file-present-choice {
+                case not-present {
+                    leaf file-not-found {
+                        type string;
+                        description "Gives the name of the expected file. Usually /update.tar";
+                    }
+                }
+
+                case file-present {
+                    uses upgrade-file-attributes;
+
+                    leaf file-validity {
+                        type string;
+                        description "Gives an indication if the file is valid, or if not, the reason why";
+                    }
+
+                    container fabric-image {
+                        uses upgrade-attributes;
+                    }
+
+                    container linux-image {
+                        uses upgrade-attributes;
+                    }
+                }
+            }
+        }
+
+        leaf hostname {
+            type string;
+            description "The hostname of the system. When DHCP or ZTP
+                  is active the hostname will not be configured through NETCONF";
+        }
+
+        container ntp {
+          if-feature sys:ntp;
+          description "The list of NTP servers active on the system. When DHCP or ZTP
+                  is active the NTP servers will not be configured through NETCONF";
+
+          leaf-list server {
+              type string;
+              description "An NTP server active on the system";
+          }
+        }
+
+        container dns-resolver {
+          description "The list of DNS servers active on the system. When DHCP or ZTP
+                  is active the DNS servers will not be configured through NETCONF";
+
+          leaf-list server {
+              type string;
+              description "A DNS server active on the system";
+          }
+
+          leaf-list search {
+              type string;
+              description "A DNS search domain active on the system";
+          }
+
+        }
+
+        container diagnostic-monitoring {
+
+            container temperature {
+                description "The temperature and thresholds of the device";
+
+                leaf measured {
+                    description "The measured transceiver temperature at the current time";
+                    type decimal64 {
+                        fraction-digits 6;
+                    }
+                    units "°C";
+                    reference
+                    "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical 
+                    Transceivers Rev 12.1 September 12, 2014 Section 9.1";
+                }
+
+                uses ddm-attributes;
+            }
+
+            container voltage {
+                description "The core voltage and thresholds of the device";
+
+                leaf measured {
+                    description "The measured voltage at the current time";
+                    type decimal64 {
+                        fraction-digits 6;
+                    }
+                    units "V";
+                    reference
+                    "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical 
+                    Transceivers Rev 12.1 September 12, 2014 Section 9.1";
+                }
+                
+                uses ddm-attributes;
+            }
+
+            container tx-bias {
+                description "The transmit (Tx) bias and thresholds of the device";
+
+                leaf measured {
+                    description "The measured transmit (Tx) bias at the current time";
+                    type decimal64 {
+                        fraction-digits 6;
+                    }
+                    units "mA";
+                    reference
+                    "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical 
+                    Transceivers Rev 12.1 September 12, 2014 Section 9.1";
+                }
+
+                uses ddm-attributes;
+            }
+
+            container tx-power {
+                description "The transmit (Tx) power and thresholds of the device";
+
+                leaf measured {
+                    description "The measured transmit (Tx) power at the current time";
+                    type decimal64 {
+                        fraction-digits 6;
+                    }
+                    units "mV";
+                    reference
+                    "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical 
+                    Transceivers Rev 12.1 September 12, 2014 Section 9.1";
+                }
+
+                uses ddm-attributes;
+            }
+            
+            container rx-power {
+                description "The receive (Rx) power and thresholds of the device";
+
+                leaf measured {
+                    description "The measured receive (Rx) power at the current time";
+                    type decimal64 {
+                        fraction-digits 6;
+                    }
+                    units "mV";
+                    reference
+                    "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical 
+                    Transceivers Rev 12.1 September 12, 2014 Section 9.1";
+                }
+
+                uses ddm-attributes;
+            }
+        }
+    }
+
+    augment "/sys:system-state/sys:platform" {
+        description
+        "Extends the SYSTEM-STATE with some extra configuration attributes required for setup.
+
+        All attributes are automatically config=false because they extend system-state";
+
+        container device-identification {
+            if-feature serial-number;
+            config false;
+
+            leaf vendor-name {
+                type string;
+                description
+                "Device Vendor Name";
+                reference
+                "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical
+                Transceivers Rev 12.1 September 12, 2014 Table 4-1 Address A0H Bytes 20-35";
+            }
+
+            leaf vendor-part-number {
+                type string;
+                description
+                "Device Vendor Part Number";
+                reference
+                "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical
+                Transceivers Rev 12.1 September 12, 2014 Table 4-1 Address A0H Bytes 40-55";
+            }
+
+            leaf vendor-revision {
+                type string;
+                description
+                "Device Vendor Revision";
+                reference
+                "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical
+                Transceivers Rev 12.1 September 12, 2014 Table 4-1 Address A0H Bytes 56-59";
+            }
+
+            leaf serial-number {
+                type string;
+                description
+                "Device Serial Number";
+                reference
+                "SFF-8472 Specification for Diagnostic Monitoring Interface for Optical
+                Transceivers Rev 12.1 September 12, 2014 Table 4-1 Address A0H Bytes 68-83";
+            }
+
+            container processor {
+                description "Details of the processor hardware in the device";
+
+                leaf serialnumber {
+                    type yang:hex-string;
+                    description "The serial number of the processor";
+                }
+
+                leaf x509-device-certificate-pem {
+                    type string;
+                    description "X509 Device certificate in PEM (Base 64 format)";
+                }
+            }
+        }
+    }
+
+    rpc do-upgrade-and-reboot {
+//        nacm:default-deny-all;
+        if-feature remote-upgrade;
+
+        description "Method to perform an upgrade of the device. This
+        expects a file /update.tar to have be present on the device.
+        The system-state/remote-upgrade attributes can be used to
+        verify the contents of the file before calling this action.
+        If there is a problem performing the upgrade
+        these will be described in any error thrown";
+
+        input {
+            leaf reset-option {
+                type enumeration {
+                    enum nuclear {
+                        description "Erases all configuration and resets the device to
+                                factory defaults.";
+                    }
+                    enum allnetconf {
+                        description "Reset all NETCONF data - leaves only logs and SSH keys.
+                            If a lesser reset is required use system-restart with a
+                            suitable reset-option";
+                    }
+                }
+                description "Optionally specify a parameter that can be
+                    used to reset the device to factory defaults";
+            }
+        }
+
+        output {
+            anyxml data {
+                description "A message describing the result.
+                    The result might not be seen as it schedules a reboot of the device";
+            }
+        }
+    }
+
+
+    rpc pull-update-tar-from-tftp {
+//        nacm:default-deny-all;
+        if-feature remote-upgrade;
+
+        description "Pulls a specified file from the specifed host and copies it
+                to the local device (usually at /update.tar
+                It also expects the file to be signed with GnuPG and the signature
+                file to exist on the TFTP server at <tftp-file>.asc";
+
+        input {
+            leaf tftp-file {
+                type msea:file-name;
+                mandatory true;
+                description "The name of a file to pull from the TFTP server at the host name specified";
+            }
+
+            leaf tftp-host {
+                type inet:host;
+                mandatory true;
+                description "The hostname of a TFTP server where an update TAR file can be pulled from";
+            }
+        }
+    }
+
+    rpc read-from-syslog {
+        description "A method of reading the entries from syslog. If no
+                argument is given will read the last 100 lines";
+
+        input {
+            leaf start-line {
+                type int16 {
+                    range -10000..-1;
+                }
+                default -100;
+                description "The number of lines to read from the end of syslog.";
+            }
+        }
+
+        output {
+            anyxml data {
+                description "Syslog entries represented as XML";
+            }
+        }
+    }
+
+//    notification upgrade-notification {
+//        description
+//            "Generated when a remote upgrade is in progress.";
+//
+//        leaf upgrade-stage {
+//            type enumeration {
+//                enum "check" {
+//                    description
+//                    "Checking the upgrade file is valid";
+//                }
+//                enum "erase" {
+//                    description    "Erasing old image";
+//                }
+//                enum "write" {
+//                    description "Writing new image";
+//                }
+//                enum "complete" {
+//                    description "Upgrade complete";
+//                }
+//            }
+//            mandatory true;
+//        }
+//
+//        leaf upgrade-detail {
+//            description "Textual description of the stage of upgrade";
+//            type string {
+//                length 0..100;
+//            }
+//        }
+//    } // upgrade-notification
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-tls-auth.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-tls-auth.yang
new file mode 100644
index 0000000..c1cbf4c
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-tls-auth.yang
@@ -0,0 +1,215 @@
+module ietf-system-tls-auth {
+
+    yang-version 1;
+
+    namespace
+      "urn:ietf:params:xml:ns:yang:ietf-system-tls-auth";
+
+    prefix system-tls-auth;
+
+    import ietf-system {
+      prefix sys;
+    }
+    import ietf-netconf-acm {
+      prefix nacm;
+    }
+    import ietf-yang-types {
+      prefix yang;
+    }
+    import ietf-x509-cert-to-name {
+      prefix x509c2n;
+    }
+
+    organization
+      "IETF NETCONF (Network Configuration) Working Group";
+
+    contact
+      "WG Web:   <http://tools.ietf.org/wg/netconf/>
+    WG List:  <mailto:netconf@ietf.org>
+
+    WG Chair: Mehmet Ersue
+              <mailto:mehmet.ersue@nsn.com>
+
+    WG Chair: Bert Wijnen
+              <mailto:bertietf@bwijnen.net>
+
+    Editor:   Kent Watsen
+              <mailto:kwatsen@juniper.net>
+
+              Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+    description
+      "This module augments the ietf-system module in order to
+    add TLS authentication configuration nodes to the
+    'authentication' container.
+
+    Copyright (c) 2014 IETF Trust and the persons identified as
+    authors of the code. All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD
+    License set forth in Section 4.c of the IETF Trust's
+    Legal Provisions Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC XXXX; see
+    the RFC itself for full legal notices.";
+
+    revision "2014-05-24" {
+      description "Initial version";
+      reference
+        "RFC XXXX: NETCONF Server Configuration Model";
+
+    }
+
+
+    feature tls-map-certificates {
+      description
+        "The tls-map-certificates feature indicates that the
+      NETCONF server implements mapping X.509 certificates to NETCONF
+      usernames.";
+    }
+
+    feature tls-map-pre-shared-keys {
+      description
+        "The tls-map-pre-shared-keys feature indicates that the
+      NETCONF server implements mapping TLS pre-shared keys to NETCONF
+      usernames.";
+    }
+
+    grouping tls-global-config {
+      container trusted-ca-certs {
+        description
+          "A list of Certificate Authority (CA) certificates that a
+         NETCONF server can use to authenticate a NETCONF client's
+         certificate.  A client's certificate is authenticated if
+         its Issuer matches one of the configured trusted CA
+         certificates.";
+        leaf-list trusted-ca-cert {
+          type binary;
+          description
+            "The binary certificate structure, as
+           specified by RFC 5246, Section 7.4.6, i.e.,:
+
+             opaque ASN.1Cert<1..2^24>;
+
+          ";
+          reference
+            "RFC 5246: The Transport Layer Security (TLS)
+            	  Protocol Version 1.2";
+
+        }
+      }  // container trusted-ca-certs
+
+      container trusted-client-certs {
+        description
+          "A list of client certificates that a NETCONF server can
+         use to authenticate a NETCONF client's certificate.  A
+         client's certificate is authenticated if it is an exact
+         match to one of the configured trusted client certificates.";
+        leaf-list trusted-client-cert {
+          type binary;
+          description
+            "The binary certificate structure, as
+           specified by RFC 5246, Section 7.4.6, i.e.,:
+
+             opaque ASN.1Cert<1..2^24>;
+
+          ";
+          reference
+            "RFC 5246: The Transport Layer Security (TLS)
+            	  Protocol Version 1.2";
+
+        }
+      }  // container trusted-client-certs
+
+      container cert-maps {
+        if-feature tls-map-certificates;
+        description
+          "The cert-maps container is used by a NETCONF server to
+        map the NETCONF client's presented X.509 certificate to
+        a NETCONF username.
+
+        If no matching and valid cert-to-name list entry can be
+        found, then the NETCONF server MUST close the connection,
+        and MUST NOT accept NETCONF messages over it.";
+        uses x509c2n:cert-to-name;
+      }  // container cert-maps
+
+      container psk-maps {
+        if-feature tls-map-pre-shared-keys;
+        description
+          "During the TLS Handshake, the client indicates which
+         key to use by including a PSK identity in the TLS
+         ClientKeyExchange message. On the NETCONF server side,
+         this PSK identity is used to look up an entry in the psk-map
+         list. If such an entry is found, and the pre-shared keys
+         match, then the client is authenticated. The NETCONF
+         server uses the value from the user-name leaf in the
+         psk-map list as the NETCONF username.  If the NETCONF
+         server cannot find an entry in the psk-map list, or if
+         the pre-shared keys do not match, then the NETCONF
+         server terminates the connection.";
+        reference
+          "RFC 4279: Pre-Shared Key Ciphersuites for Transport Layer
+          	  Security (TLS)";
+
+        list psk-map {
+          key "psk-identity";
+          leaf psk-identity {
+            type string;
+            description
+              "The PSK identity encoded as a UTF-8 string. For
+             details how certain common PSK identity formats can
+             be encoded in UTF-8, see section 5.1. of RFC 4279.";
+            reference
+              "RFC 4279: Pre-Shared Key Ciphersuites for Transport
+              Layer Security (TLS)";
+
+          }
+
+          leaf user-name {
+            type nacm:user-name-type;
+            mandatory true;
+            description
+              "The NETCONF username associated with this PSK
+             identity.";
+          }
+
+          leaf not-valid-before {
+            type yang:date-and-time;
+            description
+              "This PSK identity is not valid before the given date
+             and time.";
+          }
+
+          leaf not-valid-after {
+            type yang:date-and-time;
+            description
+              "This PSK identity is not valid after the given date
+             and time.";
+          }
+
+          leaf key {
+//            nacm:default-deny-all;
+            type yang:hex-string;
+            mandatory true;
+            description
+              "The key associated with the PSK identity";
+            reference
+              "RFC 4279: Pre-Shared Key Ciphersuites for Transport
+              Layer Security (TLS)";
+
+          }
+        }  // list psk-map
+      }  // container psk-maps
+    }  // grouping tls-global-config
+
+    augment /sys:system/sys:authentication {
+      container tls {
+        uses tls-global-config;
+      }  // container tls
+    }
+  }  // module ietf-system-tls-auth
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system.yang
new file mode 100644
index 0000000..12e6a9f
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-system.yang
@@ -0,0 +1,832 @@
+module ietf-system {
+  namespace "urn:ietf:params:xml:ns:yang:ietf-system";
+  prefix "sys";
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  import ietf-inet-types {
+    prefix inet;
+  }
+
+  import ietf-netconf-acm {
+    prefix nacm;
+  }
+
+  import iana-crypt-hash {
+    prefix ianach;
+  }
+
+  import msea-types {
+    prefix msea;
+    revision-date 2016-02-29;
+  }
+
+  organization
+    "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: Thomas Nadeau
+               <mailto:tnadeau@lucidvision.com>
+
+     WG Chair: Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>
+
+     Editor:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "This module contains a collection of YANG definitions for the
+     configuration and identification of some common system
+     properties within a device containing a NETCONF server.  This
+     includes data node definitions for system identification,
+     time-of-day management, user management, DNS resolver
+     configuration, and some protocol operations for system
+     management.
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 7317; see
+     the RFC itself for full legal notices.";
+
+  revision 2014-08-06 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7317: A YANG Data Model for System Management";
+  }
+
+ /*
+  * Typedefs
+  */
+
+  typedef timezone-name {
+    type string;
+    description
+      "A time zone name as used by the Time Zone Database,
+       sometimes referred to as the 'Olson Database'.
+
+       The exact set of valid values is an implementation-specific
+       matter.  Client discovery of the exact set of time zone names
+       for a particular server is out of scope.";
+    reference
+      "RFC 6557: Procedures for Maintaining the Time Zone Database";
+   }
+
+  /*
+   * Features
+   */
+
+  feature radius {
+    description
+      "Indicates that the device can be configured as a RADIUS
+       client.";
+    reference
+      "RFC 2865: Remote Authentication Dial In User Service (RADIUS)";
+  }
+
+  feature authentication {
+    description
+      "Indicates that the device supports configuration of
+       user authentication.";
+  }
+
+  feature local-users {
+    if-feature authentication;
+    description
+      "Indicates that the device supports configuration of
+       local user authentication.";
+  }
+
+  feature radius-authentication {
+    if-feature radius;
+    if-feature authentication;
+    description
+      "Indicates that the device supports configuration of user
+       authentication over RADIUS.";
+    reference
+      "RFC 2865: Remote Authentication Dial In User Service (RADIUS)
+       RFC 5607: Remote Authentication Dial-In User Service (RADIUS)
+                 Authorization for Network Access Server (NAS)
+                 Management";
+  }
+
+  feature ntp {
+    description
+      "Indicates that the device can be configured to use one or
+       more NTP servers to set the system date and time.";
+  }
+
+  feature ntp-udp-port {
+    if-feature ntp;
+    description
+      "Indicates that the device supports the configuration of
+       the UDP port for NTP servers.
+
+       This is a 'feature', since many implementations do not support
+       any port other than the default port.";
+  }
+
+  feature timezone-name {
+    description
+      "Indicates that the local time zone on the device
+       can be configured to use the TZ database
+       to set the time zone and manage daylight saving time.";
+    reference
+      "RFC 6557: Procedures for Maintaining the Time Zone Database";
+  }
+
+  feature dns-udp-tcp-port {
+    description
+      "Indicates that the device supports the configuration of
+       the UDP and TCP port for DNS servers.
+
+       This is a 'feature', since many implementations do not support
+       any port other than the default port.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity authentication-method {
+    description
+      "Base identity for user authentication methods.";
+  }
+
+  identity radius {
+    base authentication-method;
+    description
+      "Indicates user authentication using RADIUS.";
+    reference
+      "RFC 2865: Remote Authentication Dial In User Service (RADIUS)
+       RFC 5607: Remote Authentication Dial-In User Service (RADIUS)
+                 Authorization for Network Access Server (NAS)
+                 Management";
+  }
+
+  identity local-users {
+    base authentication-method;
+    description
+      "Indicates password-based authentication of locally
+       configured users.";
+  }
+
+  identity radius-authentication-type {
+    description
+      "Base identity for RADIUS authentication types.";
+  }
+
+  identity radius-pap {
+    base radius-authentication-type;
+    description
+      "The device requests Password Authentication Protocol (PAP)
+       authentication from the RADIUS server.";
+    reference
+      "RFC 2865: Remote Authentication Dial In User Service (RADIUS)";
+  }
+
+  identity radius-chap {
+    base radius-authentication-type;
+    description
+      "The device requests Challenge Handshake Authentication
+       Protocol (CHAP) authentication from the RADIUS server.";
+    reference
+      "RFC 2865: Remote Authentication Dial In User Service (RADIUS)";
+  }
+
+  /*
+   * Configuration data nodes
+   */
+
+  container system {
+    description
+      "System group configuration.";
+
+    leaf contact {
+      type string;
+      description
+        "The administrator contact information for the system.
+
+         A server implementation MAY map this leaf to the sysContact
+         MIB object.  Such an implementation needs to use some
+         mechanism to handle the differences in size and characters
+         allowed between this leaf and sysContact.  The definition of
+         such a mechanism is outside the scope of this document.";
+      reference
+        "RFC 3418: Management Information Base (MIB) for the
+                   Simple Network Management Protocol (SNMP)
+                   SNMPv2-MIB.sysContact";
+    }
+
+    leaf hostname {
+      type inet:domain-name;
+     description
+       "The name of the host.  This name can be a single domain
+        label or the fully qualified domain name of the host.";
+
+    }
+
+    leaf location {
+      type string;
+      description
+        "The system location.
+
+         A server implementation MAY map this leaf to the sysLocation
+         MIB object.  Such an implementation needs to use some
+         mechanism to handle the differences in size and characters
+         allowed between this leaf and sysLocation.  The definition
+         of such a mechanism is outside the scope of this document.";
+
+      reference
+        "RFC 3418: Management Information Base (MIB) for the
+                   Simple Network Management Protocol (SNMP)
+                   SNMPv2-MIB.sysLocation";
+    }
+
+    container clock {
+      description
+        "Configuration of the system date and time properties.";
+
+      choice timezone {
+        description
+          "The system time zone information.";
+
+        case timezone-name {
+          if-feature timezone-name;
+          leaf timezone-name {
+            type timezone-name;
+            description
+              "The TZ database name to use for the system, such
+               as 'Europe/Stockholm'.";
+          }
+        }
+        case timezone-utc-offset {
+          leaf timezone-utc-offset {
+            type int16 {
+              range "-1500 .. 1500";
+            }
+            units "minutes";
+            description
+              "The number of minutes to add to UTC time to
+               identify the time zone for this system.  For example,
+               'UTC - 8:00 hours' would be represented as '-480'.
+               Note that automatic daylight saving time adjustment
+               is not provided if this object is used.";
+          }
+        }
+      }
+    }
+
+    container ntp {
+      if-feature ntp;
+      presence
+        "Enables the NTP client unless the 'enabled' leaf
+         (which defaults to 'true') is set to 'false'";
+      description
+        "Configuration of the NTP client.";
+
+      leaf enabled {
+        type boolean;
+        default true;
+        description
+          "Indicates that the system should attempt to
+           synchronize the system clock with an NTP server
+           from the 'ntp/server' list.";
+      }
+      list server {
+        key name;
+        max-elements 3;
+        description
+          "List of NTP servers to use for system clock
+           synchronization.  If '/system/ntp/enabled'
+           is 'true', then the system will attempt to
+           contact and utilize the specified NTP servers.
+           If DHCP retrieves NTP servers then these values
+           are used in addition to those";
+
+        leaf name {
+          type string;
+          description
+            "An arbitrary name for the NTP server.";
+        }
+        choice transport {
+          mandatory true;
+          description
+            "The transport-protocol-specific parameters for this
+             server.";
+
+          case udp {
+            container udp {
+              description
+                "Contains UDP-specific configuration parameters
+                 for NTP.";
+              leaf address {
+                type inet:host;
+                mandatory true;
+                description
+                  "The address of the NTP server.";
+              }
+//              leaf port {
+//                if-feature ntp-udp-port;
+//                type inet:port-number;
+//                default 123;
+//                description
+//                  "The port number of the NTP server.";
+//              }
+            }
+          }
+        }
+
+//        leaf association-type { //These elements are omitted because MSEA1000 does not support these options
+//          type enumeration {
+//            enum server {
+//              description
+//                "Use client association mode.  This device
+//                 will not provide synchronization to the
+//                 configured NTP server.";
+//            }
+//            enum peer {
+//              description
+//                "Use symmetric active association mode.
+//                 This device may provide synchronization
+//                 to the configured NTP server.";
+//            }
+//            enum pool {
+//              description
+//                "Use client association mode with one or
+//                 more of the NTP servers found by DNS
+//                 resolution of the domain name given by
+//                 the 'address' leaf.  This device will not
+//                 provide synchronization to the servers.";
+//            }
+//          }
+//          default server;
+//          description
+//            "The desired association type for this NTP server.";
+//        }
+//        leaf iburst {
+//          type boolean;
+//          default false;
+//          description
+//            "Indicates whether this server should enable burst
+//             synchronization or not.";
+//        }
+//        leaf prefer {
+//          type boolean;
+//          default false;
+//          description
+//            "Indicates whether this server should be preferred
+//             or not.";
+//        }
+      }
+    }
+
+    container dns-resolver {
+      presence "If defined enables the DNS servers to be configured.";
+
+      description
+        "Configuration of the DNS resolver. If DHCP retrieves DNS
+         servers or search domains then these values are used in
+         addition to those";
+
+      leaf-list search {
+        type inet:domain-name;
+        max-elements 3;
+        ordered-by user;
+        description
+          "An ordered list of domains to search when resolving
+           a host name.";
+      }
+      list server {
+        key name;
+        max-elements 3;
+        ordered-by user;
+        description
+          "List of the DNS servers that the resolver should query.
+
+           When the resolver is invoked by a calling application, it
+           sends the query to the first name server in this list.  If
+           no response has been received within 'timeout' seconds,
+           the resolver continues with the next server in the list.
+           If no response is received from any server, the resolver
+           continues with the first server again.  When the resolver
+           has traversed the list 'attempts' times without receiving
+           any response, it gives up and returns an error to the
+           calling application.
+
+           Implementations MAY limit the number of entries in this
+           list.";
+
+        leaf name {
+          type string;
+          description
+            "An arbitrary name for the DNS server.";
+        }
+        choice transport {
+          mandatory true;
+          description
+            "The transport-protocol-specific parameters for this
+             server.";
+
+          case udp-and-tcp {
+            container udp-and-tcp {
+              description
+                "Contains UDP- and TCP-specific configuration
+                 parameters for DNS.";
+              reference
+                "RFC 1035: Domain Names - Implementation and
+                           Specification
+                 RFC 5966: DNS Transport over TCP - Implementation
+                           Requirements";
+
+              leaf address {
+                type inet:ip-address;
+                mandatory true;
+                description
+                  "The address of the DNS server.";
+              }
+//              leaf port {
+//                if-feature dns-udp-tcp-port;
+//                type inet:port-number;
+//                default 53;
+//                description
+//                  "The UDP and TCP port number of the DNS server.";
+//              }
+            }
+          }
+        }
+      }
+//      container options { //These elements are omitted because MSEA1000 does not support these options
+//        description
+//          "Resolver options.  The set of available options has been
+//           limited to those that are generally available across
+//           different resolver implementations and generally useful.";
+//        leaf timeout {
+//          type uint8 {
+//            range "1..max";
+//          }
+//          units "seconds";
+//          default "5";
+//          description
+//            "The amount of time the resolver will wait for a
+//             response from each remote name server before
+//             retrying the query via a different name server.";
+//        }
+//        leaf attempts {
+//          type uint8 {
+//            range "1..max";
+//          }
+//          default "2";
+//          description
+//            "The number of times the resolver will send a query to
+//             all of its name servers before giving up and returning
+//             an error to the calling application.";
+//        }
+//      }
+    }
+
+    container radius {
+      if-feature radius;
+
+      description
+        "Configuration of the RADIUS client.";
+
+      list server {
+        key name;
+        ordered-by user;
+        description
+          "List of RADIUS servers used by the device.
+
+           When the RADIUS client is invoked by a calling
+           application, it sends the query to the first server in
+           this list.  If no response has been received within
+           'timeout' seconds, the client continues with the next
+           server in the list.  If no response is received from any
+           server, the client continues with the first server again.
+           When the client has traversed the list 'attempts' times
+           without receiving any response, it gives up and returns an
+           error to the calling application.";
+
+        leaf name {
+          type string;
+          description
+            "An arbitrary name for the RADIUS server.";
+        }
+        choice transport {
+          mandatory true;
+          description
+            "The transport-protocol-specific parameters for this
+             server.";
+
+          case udp {
+            container udp {
+              description
+                "Contains UDP-specific configuration parameters
+                 for RADIUS.";
+              leaf address {
+                type inet:host;
+                mandatory true;
+                description
+                  "The address of the RADIUS server.";
+              }
+
+              leaf authentication-port {
+                type inet:port-number;
+                default "1812";
+                description
+                  "The port number of the RADIUS server.";
+              }
+              leaf shared-secret {
+                type string;
+                mandatory true;
+//                nacm:default-deny-all;
+                description
+                  "The shared secret, which is known to both the
+                   RADIUS client and server.";
+                reference
+                  "RFC 2865: Remote Authentication Dial In User
+                             Service (RADIUS)";
+              }
+            }
+          }
+        }
+        leaf authentication-type {
+          type identityref {
+            base radius-authentication-type;
+          }
+          default radius-pap;
+          description
+            "The authentication type requested from the RADIUS
+             server.";
+        }
+      }
+      container options {
+        description
+          "RADIUS client options.";
+
+        leaf timeout {
+          type uint8 {
+            range "1..max";
+          }
+          units "seconds";
+          default "5";
+          description
+            "The number of seconds the device will wait for a
+             response from each RADIUS server before trying with a
+             different server.";
+        }
+
+        leaf attempts {
+          type uint8 {
+            range "1..max";
+          }
+          default "2";
+          description
+            "The number of times the device will send a query to
+             all of its RADIUS servers before giving up.";
+        }
+      }
+    }
+
+    container authentication {
+//      nacm:default-deny-write;
+      if-feature authentication;
+
+       description
+         "The authentication configuration subtree.";
+
+       leaf-list user-authentication-order {
+         type identityref {
+           base authentication-method;
+         }
+         must '(. != "sys:radius" or ../../radius/server)' {
+           error-message
+             "When 'radius' is used, a RADIUS server"
+           + " must be configured.";
+           description
+             "When 'radius' is used as an authentication method,
+              a RADIUS server must be configured.";
+         }
+         ordered-by user;
+
+         description
+           "When the device authenticates a user with a password,
+            it tries the authentication methods in this leaf-list in
+            order.  If authentication with one method fails, the next
+            method is used.  If no method succeeds, the user is
+            denied access.
+
+            An empty user-authentication-order leaf-list still allows
+            authentication of users using mechanisms that do not
+            involve a password.
+
+            If the 'radius-authentication' feature is advertised by
+            the NETCONF server, the 'radius' identity can be added to
+            this list.
+
+            If the 'local-users' feature is advertised by the
+            NETCONF server, the 'local-users' identity can be
+            added to this list.";
+       }
+
+       list user {
+         if-feature local-users;
+         key name;
+         description
+           "The list of local users configured on this device.";
+
+         leaf name {
+           type string;
+           description
+            "The user name string identifying this entry.";
+
+           must ".='netconf' or .='admin' or .='readonly'" {
+               error-message "The set of users is not changeable on this device. Must have admin, netconf and readonly";
+               error-app-tag "msea-sys-must-01";
+           }
+         }
+         leaf password {
+           type ianach:crypt-hash;
+           description
+             "The password for this entry.";
+         }
+         list authorized-key {
+           key name;
+           description
+             "A list of public SSH keys for this user.  These keys
+              are allowed for SSH authentication, as described in
+              RFC 4253.";
+           reference
+             "RFC 4253: The Secure Shell (SSH) Transport Layer
+                        Protocol";
+
+           leaf name {
+             type string;
+             description
+               "An arbitrary name for the SSH key.";
+           }
+
+           leaf algorithm {
+             type string;
+             mandatory true;
+             description
+               "The public key algorithm name for this SSH key.
+
+                Valid values are the values in the IANA 'Secure Shell
+                (SSH) Protocol Parameters' registry, Public Key
+                Algorithm Names.";
+             reference
+               "IANA 'Secure Shell (SSH) Protocol Parameters'
+                registry, Public Key Algorithm Names";
+           }
+           leaf key-data {
+             type binary;
+             mandatory true;
+             description
+               "The binary public key data for this SSH key, as
+                specified by RFC 4253, Section 6.6, i.e.:
+
+                  string    certificate or public key format
+                            identifier
+                  byte[n]   key/certificate data.";
+             reference
+               "RFC 4253: The Secure Shell (SSH) Transport Layer
+                          Protocol";
+           }
+         }
+       }
+     }
+  }
+
+  /*
+   * Operational state data nodes
+   */
+
+  container system-state {
+    config false;
+    description
+      "System group operational state.";
+
+    container platform {
+      description
+        "Contains vendor-specific information for
+         identifying the system platform and operating system.";
+      reference
+        "IEEE Std 1003.1-2008 - sys/utsname.h";
+
+      leaf os-name {
+        type string;
+        description
+          "The name of the operating system in use -
+           for example, 'Linux'.";
+        reference
+          "IEEE Std 1003.1-2008 - utsname.sysname";
+      }
+      leaf os-release {
+        type string;
+        description
+          "The current release level of the operating
+           system in use.  This string MAY indicate
+           the OS source code revision.";
+        reference
+          "IEEE Std 1003.1-2008 - utsname.release";
+      }
+      leaf os-version {
+        type string;
+        description
+          "The current version level of the operating
+           system in use.  This string MAY indicate
+           the specific OS build date and target variant
+           information.";
+        reference
+          "IEEE Std 1003.1-2008 - utsname.version";
+      }
+      leaf machine {
+        type string;
+        description
+          "A vendor-specific identifier string representing
+           the hardware in use.";
+        reference
+          "IEEE Std 1003.1-2008 - utsname.machine";
+      }
+    }
+
+    container clock {
+      description
+        "Monitoring of the system date and time properties.";
+
+      leaf current-datetime {
+        type yang:date-and-time;
+        description
+          "The current system date and time.";
+      }
+
+      leaf boot-datetime {
+        type yang:date-and-time;
+        description
+          "The system date and time when the system last restarted.";
+      }
+    }
+  }
+
+  rpc set-current-datetime {
+//    nacm:default-deny-all;
+    description
+      "Set the /system-state/clock/current-datetime leaf
+       to the specified value.
+
+       If the system is using NTP (i.e., /system/ntp/enabled
+       is set to 'true'), then this operation will fail with
+       error-tag 'operation-failed' and error-app-tag value of
+       'ntp-active'.";
+    input {
+      leaf current-datetime {
+        type yang:date-and-time;
+        mandatory true;
+        description
+          "The current system date and time.";
+      }
+    }
+  }
+
+  rpc system-restart {
+//    nacm:default-deny-all;
+    description
+      "Request that the entire system be restarted immediately.
+       A server SHOULD send an rpc reply to the client before
+       restarting the system.";
+    input {
+        leaf reset-option {
+            type msea:reset-config-options;
+            description "Optionally specify a parameter that can be
+                used to reset the configuration on the device or
+                reset it to factory defaults";
+        }
+    }
+  }
+
+  rpc system-shutdown {
+//    nacm:default-deny-all;
+    description
+      "Request that the entire system be shut down immediately.
+       A server SHOULD send an rpc reply to the client before
+       shutting down the system.";
+  }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-x509-cert-to-name.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-x509-cert-to-name.yang
new file mode 100644
index 0000000..2996954
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-x509-cert-to-name.yang
@@ -0,0 +1,248 @@
+module ietf-x509-cert-to-name {
+  namespace "urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name";
+  prefix x509c2n;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     WG Chair: David Kessens
+               <mailto:david.kessens@nsn.com>
+
+     WG Chair: Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>
+
+     Editor:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>
+
+     Editor:   Juergen Schoenwaelder
+               <mailto:j.schoenwaelder@jacobs-university.de>";
+  description
+    "This module contains a collection of YANG definitions for
+     extracting a name from a X.509 certificate.
+
+     The algorithm used to extract a name from a X.509 certificate
+     was first defined in RFC 6353.
+
+     Copyright (c) 2013 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX; see
+     the RFC itself for full legal notices.";
+  reference
+    "RFC6353: Transport Layer Security (TLS) Transport Model for
+              the Simple Network Management Protocol (SNMP)";
+
+  revision 2013-03-26 {
+    description
+      "Initial revision.";
+    reference "RFC XXXX: A YANG Data Model for SNMP Configuration";
+  }
+
+  typedef tls-fingerprint {
+    type yang:hex-string {
+      pattern "([0-9a-fA-F]){2}(:([0-9a-fA-F]){2}){0,254}";
+    }
+    description
+      "A fingerprint value that can be used to uniquely reference
+       other data of potentially arbitrary length.
+
+       An tls-fingerprint value is composed of a 1-octet hashing
+       algorithm identifier followed by the fingerprint value.  The
+       first octet value identifying the hashing algorithm is taken
+       from the IANA TLS HashAlgorithm Registry (RFC 5246).  The
+       remaining octets are filled using the results of the hashing
+       algorithm.";
+    reference "SNMP-TLS-TM-MIB.SnmpTLSFingerprint";
+  }
+
+  identity cert-to-name {
+    description
+      "Base identity for algorithms to derive a name from a
+       certificate.";
+  }
+
+  identity specified {
+    base cert-to-name;
+    description
+      "Directly specifies the name to be used for the certificate.
+       The value of the leaf 'name' in 'cert-to-name' list is used.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertSpecified";
+  }
+
+  identity san-rfc822-name {
+    base cert-to-name;
+    description
+      "Maps a subjectAltName's rfc822Name to a name.  The local part
+       of the rfc822Name is passed unaltered but the host-part of the
+       name must be passed in lowercase.  This mapping results in a
+       1:1 correspondence between equivalent subjectAltName
+       rfc822Name values and name values except that the host-part
+       of the name MUST be passed in lowercase. For example, the
+       rfc822Name field FooBar@Example.COM is mapped to name
+       FooBar@example.com.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertSANRFC822Name";
+  }
+
+  identity san-dns-name {
+    base cert-to-name;
+    description
+      "Maps a subjectAltName's dNSName to a name after first
+       converting it to all lowercase (RFC 5280 does not specify
+       converting to lowercase so this involves an extra step).
+       This mapping results in a 1:1 correspondence between
+       subjectAltName dNSName values and the name values.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertSANDNSName";
+  }
+
+  identity san-ip-address {
+    base cert-to-name;
+    description
+      "Maps a subjectAltName's iPAddress to a name by
+       transforming the binary encoded address as follows:
+
+         1) for IPv4, the value is converted into a
+            decimal-dotted quad address (e.g., '192.0.2.1').
+
+         2) for IPv6 addresses, the value is converted into a
+            32-character all lowercase hexadecimal string
+            without any colon separators.
+
+       This mapping results in a 1:1 correspondence between
+       subjectAltName iPAddress values and the name values.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertSANIpAddress";
+  }
+
+  identity san-any {
+    base cert-to-name;
+    description
+      "Maps any of the following fields using the corresponding
+       mapping algorithms:
+
+         +------------+-----------------+
+         | Type       | Algorithm       |
+         |------------+-----------------|
+         | rfc822Name | san-rfc822-name |
+         | dNSName    | san-dns-name    |
+         | iPAddress  | san-ip-address  |
+         +------------+-----------------+
+
+       The first matching subjectAltName value found in the
+       certificate of the above types MUST be used when deriving
+       the name.  The mapping algorithm specified in the
+       'Algorithm' column MUST be used to derive the name.
+
+       This mapping results in a 1:1 correspondence between
+       subjectAltName values and name values.  The three sub-mapping
+       algorithms produced by this combined algorithm cannot produce
+       conflicting results between themselves.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertSANAny";
+  }
+
+  identity common-name {
+    base cert-to-name;
+    description
+      "Maps a certificate's CommonName to a name after converting
+       it to a UTF-8 encoding.  The usage of CommonNames is
+       deprecated and users are encouraged to use subjectAltName
+       mapping methods instead.  This mapping results in a 1:1
+       correspondence between certificate CommonName values and name
+       values.";
+    reference "SNMP-TLS-TM-MIB.snmpTlstmCertCommonName";
+  }
+
+  grouping cert-to-name {
+    description
+      "Defines nodes for mapping certificates to names.  Modules
+       that uses this grouping should describe how the resulting
+       name is used.";
+    list cert-to-name {
+      key "id";
+      description
+        "This list defines how certificates are mapped to names.
+         The name is derived by considering each cert-to-name
+         list entry in order. The cert-to-name entry's fingerprint
+         determines whether the list entry is a match:
+
+         1) If the cert-to-name list entry's fingerprint value
+            matches that of the presented certificate, then consider
+            the list entry as a successful match.
+
+         2) If the cert-to-name list entry's fingerprint value
+            matches that of a locally held copy of a trusted CA
+            certificate, and that CA certificate was part of the CA
+            certificate chain to the presented certificate, then
+            consider the list entry as a successful match.
+
+         Once a matching cert-to-name list entry has been found, the
+         map-type is used to determine how the name associated with
+         the certificate should be determined.  See the map-type
+         leaf's description for details on determining the name value.
+         If it is impossible to determine a name from the cert-to-name
+         list entry's data combined with the data presented in the
+         certificate, then additional cert-to-name list entries MUST
+         be searched looking for another potential match.
+
+         Security administrators are encouraged to make use of
+         certificates with subjectAltName fields that can be mapped to
+         names so that a single root CA certificate can allow all
+         child certificate's subjectAltName to map directly to a name
+         via a 1:1 transformation.";
+      reference "SNMP-TLS-TM-MIB.snmpTlstmCertToTSNEntry";
+      leaf id {
+        type uint32;
+        description
+          "The id specifies the order in which the entries in the
+           cert-to-name list are searched.  Entries with lower
+           numbers are searched first.";
+        reference "SNMP-TLS-TM-MIB.snmpTlstmCertToTSNID";
+      }
+      leaf fingerprint {
+        type x509c2n:tls-fingerprint;
+        mandatory true;
+        description
+          "Specifies a value with which the fingerprint of the
+           certificate presented by the peer is compared.  If the
+           fingerprint of the certificate presented by the peer does
+           not match the fingerprint configured, then the entry is
+           skipped and the search for a match continues.";
+        reference "SNMP-TLS-TM-MIB.snmpTlstmCertToTSNFingerprint";
+      }
+      leaf map-type {
+        type identityref {
+          base cert-to-name;
+        }
+        mandatory true;
+        description
+          "Specifies the algorithm used to map the certificate
+           presented by the peer to a name.
+
+           Mappings that need additional configuration objects should
+           use the 'when' statement to make them conditional based on
+           the 'map-type'.";
+        reference "SNMP-TLS-TM-MIB.snmpTlstmCertToTSNMapType";
+      }
+      leaf name {
+        when "../map-type = 'x509c2n:specified'";
+        type string;
+        mandatory true;
+        description
+          "Directly specifies the NETCONF username when the
+           'map-type' is 'specified'.";
+        reference "SNMP-TLS-TM-MIB.snmpTlstmCertToTSNData";
+      }
+    }
+  }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/ietf-yang-types.yang b/drivers/microsemi/ea1000yang/src/main/yang/ietf-yang-types.yang
new file mode 100644
index 0000000..371a091
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/ietf-yang-types.yang
@@ -0,0 +1,480 @@
+module ietf-yang-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+  prefix "yang";
+
+  organization
+   "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+  contact
+   "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - yang-identifier
+      - hex-string
+      - uuid
+      - dotted-quad";
+    reference
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of counter and gauge types ***/
+
+  typedef counter32 {
+    type uint32;
+    description
+     "The counter32 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter32 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter32 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter32.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter32 {
+    type yang:counter32;
+    default "0";
+    description
+     "The zero-based-counter32 type represents a counter32
+      that has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter32 textual convention of the SMIv2.";
+    reference
+      "RFC 4502: Remote Network Monitoring Management Information
+                 Base Version 2";
+  }
+
+  typedef counter64 {
+    type uint64;
+    description
+     "The counter64 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter64 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter64 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter64.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter64 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef zero-based-counter64 {
+    type yang:counter64;
+    default "0";
+    description
+     "The zero-based-counter64 type represents a counter64 that
+      has the defined 'initial' value zero.
+
+
+
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter64 textual convention of the SMIv2.";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  typedef gauge32 {
+    type uint32;
+    description
+     "The gauge32 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^32-1 (4294967295 decimal), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge32 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge32 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the Gauge32 type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef gauge64 {
+    type uint64;
+    description
+     "The gauge64 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^64-1 (18446744073709551615), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge64 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge64 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the CounterBasedGauge64 SMIv2 textual convention defined
+      in RFC 2856";
+    reference
+     "RFC 2856: Textual Conventions for Additional High Capacity
+                Data Types";
+  }
+
+  /*** collection of identifier-related types ***/
+
+  typedef object-identifier {
+    type string {
+      pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+            + '(\.(0|([1-9]\d*)))*';
+    }
+    description
+     "The object-identifier type represents administratively
+      assigned names in a registration-hierarchical-name tree.
+
+      Values of this type are denoted as a sequence of numerical
+      non-negative sub-identifier values.  Each sub-identifier
+      value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+      are separated by single dots and without any intermediate
+      whitespace.
+
+      The ASN.1 standard restricts the value space of the first
+      sub-identifier to 0, 1, or 2.  Furthermore, the value space
+      of the second sub-identifier is restricted to the range
+      0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+      the ASN.1 standard requires that an object identifier
+      has always at least two sub-identifiers.  The pattern
+      captures these restrictions.
+
+      Although the number of sub-identifiers is not limited,
+      module designers should realize that there may be
+      implementations that stick with the SMIv2 limit of 128
+      sub-identifiers.
+
+      This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+      since it is not restricted to 128 sub-identifiers.  Hence,
+      this type SHOULD NOT be used to represent the SMIv2 OBJECT
+      IDENTIFIER type; the object-identifier-128 type SHOULD be
+      used instead.";
+    reference
+     "ISO9834-1: Information technology -- Open Systems
+      Interconnection -- Procedures for the operation of OSI
+      Registration Authorities: General procedures and top
+      arcs of the ASN.1 Object Identifier tree";
+  }
+
+  typedef object-identifier-128 {
+    type object-identifier {
+      pattern '\d*(\.\d*){1,127}';
+    }
+    description
+     "This type represents object-identifiers restricted to 128
+      sub-identifiers.
+
+      In the value set and its semantics, this type is equivalent
+      to the OBJECT IDENTIFIER type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef yang-identifier {
+    type string {
+      length "1..max";
+      pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+      pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+    }
+    description
+      "A YANG identifier string as defined by the 'identifier'
+       rule in Section 12 of RFC 6020.  An identifier must
+       start with an alphabetic character or an underscore
+       followed by an arbitrary sequence of alphabetic or
+       numeric characters, underscores, hyphens, or dots.
+
+       A YANG identifier MUST NOT start with any possible
+       combination of the lowercase or uppercase character
+       sequence 'xml'.";
+    reference
+      "RFC 6020: YANG - A Data Modeling Language for the Network
+                 Configuration Protocol (NETCONF)";
+  }
+
+  /*** collection of types related to date and time***/
+
+  typedef date-and-time {
+    type string {
+      pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+            + '(Z|[\+\-]\d{2}:\d{2})';
+    }
+    description
+     "The date-and-time type is a profile of the ISO 8601
+      standard for representation of dates and times using the
+      Gregorian calendar.  The profile is defined by the
+      date-time production in Section 5.6 of RFC 3339.
+
+      The date-and-time type is compatible with the dateTime XML
+      schema type with the following notable exceptions:
+
+      (a) The date-and-time type does not allow negative years.
+
+      (b) The date-and-time time-offset -00:00 indicates an unknown
+          time zone (see RFC 3339) while -00:00 and +00:00 and Z
+          all represent the same time zone in dateTime.
+
+      (c) The canonical format (see below) of data-and-time values
+          differs from the canonical format used by the dateTime XML
+          schema type, which requires all times to be in UTC using
+          the time-offset 'Z'.
+
+      This type is not equivalent to the DateAndTime textual
+      convention of the SMIv2 since RFC 3339 uses a different
+      separator between full-date and full-time and provides
+      higher resolution of time-secfrac.
+
+      The canonical format for date-and-time values with a known time
+      zone uses a numeric time zone offset that is calculated using
+      the device's configured known offset to UTC time.  A change of
+      the device's offset to UTC time will cause date-and-time values
+      to change accordingly.  Such changes might happen periodically
+      in case a server follows automatically daylight saving time
+      (DST) time zone offset changes.  The canonical format for
+      date-and-time values with an unknown time zone (usually
+      referring to the notion of local time) uses the time-offset
+      -00:00.";
+    reference
+     "RFC 3339: Date and Time on the Internet: Timestamps
+      RFC 2579: Textual Conventions for SMIv2
+      XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+  }
+
+  typedef timeticks {
+    type uint32;
+    description
+     "The timeticks type represents a non-negative integer that
+      represents the time, modulo 2^32 (4294967296 decimal), in
+      hundredths of a second between two epochs.  When a schema
+      node is defined that uses this type, the description of
+      the schema node identifies both of the reference epochs.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeTicks type of the SMIv2.";
+    reference
+     "RFC 2578: Structure of Management Information Version 2
+                (SMIv2)";
+  }
+
+  typedef timestamp {
+    type yang:timeticks;
+    description
+     "The timestamp type represents the value of an associated
+      timeticks schema node at which a specific occurrence
+      happened.  The specific occurrence must be defined in the
+      description of any schema node defined using this type.  When
+      the specific occurrence occurred prior to the last time the
+      associated timeticks attribute was zero, then the timestamp
+      value is zero.  Note that this requires all timestamp values
+      to be reset to zero when the value of the associated timeticks
+      attribute reaches 497+ days and wraps around to zero.
+
+      The associated timeticks schema node must be specified
+      in the description of any schema node using this type.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeStamp textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of generic address types ***/
+
+  typedef phys-address {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+
+
+
+
+    description
+     "Represents media- or physical-level addresses represented
+      as a sequence octets, each octet represented by two hexadecimal
+      numbers.  Octets are separated by colons.  The canonical
+      representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the PhysAddress textual convention of the SMIv2.";
+    reference
+     "RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  typedef mac-address {
+    type string {
+      pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+    }
+    description
+     "The mac-address type represents an IEEE 802 MAC address.
+      The canonical representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the MacAddress textual convention of the SMIv2.";
+    reference
+     "IEEE 802: IEEE Standard for Local and Metropolitan Area
+                Networks: Overview and Architecture
+      RFC 2579: Textual Conventions for SMIv2";
+  }
+
+  /*** collection of XML-specific types ***/
+
+  typedef xpath1.0 {
+    type string;
+    description
+     "This type represents an XPATH 1.0 expression.
+
+      When a schema node is defined that uses this type, the
+      description of the schema node MUST specify the XPath
+      context in which the XPath expression is evaluated.";
+    reference
+     "XPATH: XML Path Language (XPath) Version 1.0";
+  }
+
+  /*** collection of string types ***/
+
+  typedef hex-string {
+    type string {
+      pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+    }
+    description
+     "A hexadecimal string with octets represented as hex digits
+      separated by colons.  The canonical representation uses
+      lowercase characters.";
+  }
+
+  typedef uuid {
+    type string {
+      pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+            + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+    }
+    description
+     "A Universally Unique IDentifier in the string representation
+      defined in RFC 4122.  The canonical representation uses
+      lowercase characters.
+
+      The following is an example of a UUID in string representation:
+      f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+      ";
+    reference
+     "RFC 4122: A Universally Unique IDentifier (UUID) URN
+                Namespace";
+  }
+
+  typedef dotted-quad {
+    type string {
+      pattern
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+    }
+    description
+      "An unsigned 32-bit number expressed in the dotted-quad
+       notation, i.e., four octets written as decimal numbers
+       and separated with the '.' (full stop) character.";
+  }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-cfm.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-cfm.yang
new file mode 100644
index 0000000..1049008
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/main/yang/msea-cfm.yang
@@ -0,0 +1,2065 @@
+module msea-cfm {

+

+    namespace "http://www.microsemi.com/microsemi-edge-assure/msea-cfm";

+    prefix "msea-cfm"; //MicroSemi EdgeAssure (msea)

+

+    import ietf-yang-types {

+        prefix yang;

+        revision-date 2013-07-15;

+    }

+    import ietf-inet-types {

+        prefix inet;

+        revision-date 2013-07-15;

+    }

+    import msea-types {

+        prefix msea;

+        revision-date 2016-02-29;