diff --git a/drivers/microsemi/ea1000driver/BUCK.ignore b/drivers/microsemi/BUCK
similarity index 60%
rename from drivers/microsemi/ea1000driver/BUCK.ignore
rename to drivers/microsemi/BUCK
index bee66fb..2787032 100644
--- a/drivers/microsemi/ea1000driver/BUCK.ignore
+++ b/drivers/microsemi/BUCK
@@ -3,29 +3,31 @@
     '//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',
+    '//models/microsemi:onos-models-microsemi',
     '//lib:org.apache.karaf.shell.console',
-    '//cli:onos-cli',
     '//incubator/api:onos-incubator-api',
-]
+] + YANG_TOOLS
 
 TEST_DEPS = [
     '//lib:TEST_ADAPTERS',
     '//core/api:onos-api-tests',
     '//drivers/netconf:onos-drivers-netconf-tests',
-    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang-tests',
+    '//utils/osgi:onlab-osgi-tests'
 ]
 
-BUNDLES = [
-    '//drivers/utilities:onos-drivers-utilities',
-    '//drivers/microsemi/ea1000yang:onos-drivers-microsemi-ea1000yang',
+APPS = [
+    'org.onosproject.yang',
+#     'org.onosproject.yang-gui',
+    'org.onosproject.config',
+    'org.onosproject.netconf',
+    'org.onosproject.netconfsb',
+    'org.onosproject.drivers.netconf',
+    'org.onosproject.models.microsemi'
 ]
 
 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/**']),
 )
@@ -36,6 +38,5 @@
     category = 'Drivers',
     url = 'http://onosproject.org',
     description = 'ONOS Microsemi device drivers application.',
-    included_bundles = BUNDLES,
-    required_apps = [ 'org.onosproject.netconf', 'org.onosproject.yms' ],
+    required_apps = APPS,
 )
diff --git a/drivers/microsemi/ea1000driver/README.md b/drivers/microsemi/README.md
similarity index 78%
rename from drivers/microsemi/ea1000driver/README.md
rename to drivers/microsemi/README.md
index 4187039..1737b08 100755
--- a/drivers/microsemi/ea1000driver/README.md
+++ b/drivers/microsemi/README.md
@@ -7,60 +7,45 @@
 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/>
+Currently this driver is built using BUCK and uses version 2.1 of 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
+All that is required to activate the driver is to run the following at the ONOS CLI<br/>
+**`onos:app activate org.onosproject.drivers.microsemi`**<br/>
+This will load any dependent apps also. To verify the driver has been loaded run the command<br/>
+**onos:apps -a -s**
 
 #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/>
+`onos:cfg set org.onosproject.netconf.ctl.impl.NetconfControllerImpl netconfConnectTimeout 50`<br/>
+`onos:cfg set org.onosproject.netconf.ctl.impl.NetconfControllerImpl netconfReplyTimeout 50`<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 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/>
+&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.
 
@@ -94,22 +79,22 @@
 
 `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/>
+&nbsp;`"flows": [`<br/>
+&nbsp;&nbsp;`{`<br/>
+&nbsp;&nbsp;&nbsp;`"priority": 50000,`<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
@@ -306,34 +291,34 @@
 
 `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/>
+&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/>
 
diff --git a/drivers/microsemi/ea1000driver/pom.xml b/drivers/microsemi/ea1000driver/pom.xml
deleted file mode 100644
index 3ba11e8..0000000
--- a/drivers/microsemi/ea1000driver/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?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.11.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>${project.version}</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>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
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
deleted file mode 100644
index 2ecc70f..0000000
--- a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * 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/ea1000yang/BUCK.ignore b/drivers/microsemi/ea1000yang/BUCK.ignore
deleted file mode 100644
index 73d20c0..0000000
--- a/drivers/microsemi/ea1000yang/BUCK.ignore
+++ /dev/null
@@ -1,36 +0,0 @@
-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
deleted file mode 100644
index edf21d6..0000000
--- a/drivers/microsemi/ea1000yang/pom.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-<?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.11.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>${project.version}</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>
-        <onos.yang.version>1.11</onos.yang.version>
-    </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>${onos.yang.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-yang-datamodel</artifactId>
-            <version>${onos.yang.version}</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>${onos.yang.version}</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.apache.maven.plugins</groupId>
-                <artifactId>maven-clean-plugin</artifactId>
-                <version>3.0.0</version>
-                <executions>
-                    <execution>
-                        <id>onos-yang-plugin-workaround</id>
-                        <!-- yang plugin cannot handle non-clean compilation -->
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>clean</goal>
-                        </goals>
-                        <configuration>
-                            <excludeDefaultDirectories>true</excludeDefaultDirectories>
-                            <filesets>
-                                <fileset>
-                                    <directory>target/generated-sources</directory>
-                                </fileset>
-                            </filesets>
-                        </configuration>
-                    </execution>
-                </executions>
-            </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/MseaSaFilteringNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
deleted file mode 100644
index 9e35df0..0000000
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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/impl/AbstractYangServiceImpl.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
deleted file mode 100644
index 7b65a75..0000000
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * 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/MseaSaFilteringManager.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
deleted file mode 100644
index eeba11e..0000000
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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/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
deleted file mode 100644
index 722fe78..0000000
--- 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
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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
deleted file mode 100644
index ed53593..0000000
--- 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
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 2e8dfc6..0000000
--- 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
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 47b438e..0000000
--- 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
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 3617d86..0000000
--- 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
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 7813b61..0000000
--- 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
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 3bdeda0..0000000
--- 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
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 581bd77..0000000
--- a/drivers/microsemi/ea1000yang/src/main/resources/YangMetaData.ser
+++ /dev/null
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
deleted file mode 100644
index c2d8a59..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ENTITY-STATE-TC-MIB.yang
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 87fabb1..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/fpga-internal.yang
+++ /dev/null
@@ -1,266 +0,0 @@
-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
deleted file mode 100644
index 3a9ef55..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/iana-crypt-hash.yang
+++ /dev/null
@@ -1,121 +0,0 @@
-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
deleted file mode 100644
index fb48b6b..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/iana-if-type.yang
+++ /dev/null
@@ -1,1507 +0,0 @@
-   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
deleted file mode 100644
index 5ff5c1d..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ieee-types.yang
+++ /dev/null
@@ -1,79 +0,0 @@
-   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
deleted file mode 100644
index 5388b03..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-inet-types.yang
+++ /dev/null
@@ -1,461 +0,0 @@
-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
deleted file mode 100644
index b18d5d3..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-interfaces.yang
+++ /dev/null
@@ -1,731 +0,0 @@
-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
deleted file mode 100644
index f0c6fe3..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-acm.yang
+++ /dev/null
@@ -1,449 +0,0 @@
-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
deleted file mode 100644
index 8130bfd..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-monitoring.yang
+++ /dev/null
@@ -1,559 +0,0 @@
-
-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
deleted file mode 100644
index 4ec1dea..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-notifications.yang
+++ /dev/null
@@ -1,337 +0,0 @@
-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
deleted file mode 100644
index 1c569a2..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf-with-defaults.yang
+++ /dev/null
@@ -1,165 +0,0 @@
- 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
deleted file mode 100644
index 2595a12..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-netconf.yang
+++ /dev/null
@@ -1,980 +0,0 @@
-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
deleted file mode 100644
index b88ba26..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-microsemi.yang
+++ /dev/null
@@ -1,527 +0,0 @@
-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
deleted file mode 100644
index c1cbf4c..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system-tls-auth.yang
+++ /dev/null
@@ -1,215 +0,0 @@
-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
deleted file mode 100644
index 12e6a9f..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-system.yang
+++ /dev/null
@@ -1,832 +0,0 @@
-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
deleted file mode 100644
index 2996954..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-x509-cert-to-name.yang
+++ /dev/null
@@ -1,248 +0,0 @@
-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
deleted file mode 100644
index 371a091..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/ietf-yang-types.yang
+++ /dev/null
@@ -1,480 +0,0 @@
-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
deleted file mode 100644
index 1049008..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-cfm.yang
+++ /dev/null
@@ -1,2065 +0,0 @@
-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;
-    }
-
-    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 is a fork of the original mef-cfm YANG Module defined in MEF 38
-    This fork is done specifically to suit the EdgeAssure SFP which has some extra
-    constraints that are not handled by the original YANG.
-
-    Consideration was given to using 'deviations' in a separate YANG file as an
-    alternative to forking, but due to lack of full support for deviations in
-    Cisco/Tail-f NSO 4.1.1 (Jan 2016) this was not feasible.
-
-    This YANG is meant to mirror exactly the initial behaviour of the EdgeAssure
-    and present that to Client systems at the interface level (the alternative
-    being to raise exceptions when a constraint is broken). This is mostly
-    implemented through 'must' statements.
-
-    Copyright 2016 Microsemi Inc.
-    All rights reserved.";
-
-    revision "2016-02-29" {
-        description
-        "Initial EdgeAssure version forked from mef-cfm 2012-04-16 - Sean Condon, Microsemi";
-        reference
-        "Service OAM Fault Management YANG Modules (MEF 38), April 2012";
-    }
-
-    //
-    // Type definitions related to CFM
-    //
-
-    typedef lbm-transaction-id-type {
-        type uint32;
-
-        description
-        "A loopback transaction identifier";
-        reference
-        "[802.1q] 21.7.3";
-    }
-
-    typedef fault-alarm-defect-type {
-        type enumeration {
-            enum remote-rdi {
-                description "Indicates the aggregate health of the remote MEPs.";
-            }
-            enum remote-mac-error {
-                description "Indicates that one or more of the remote MEPs is
-                reporting a failure in its Port Status TLV or
-                Interface Status TLV.";
-            }
-            enum remote-invalid-ccm {
-                description "Indicates that at least one of the Remote MEP
-                state machines is not receiving valid CCMs
-                from its remote MEP.";
-            }
-            enum invalid-ccm {
-                description "Indicates that one or more invalid CCMs has been
-                received and that 3.5 times that CCMs transmission
-                interval has not yet expired.";
-            }
-            enum cross-connect-ccm {
-                description "Indicates that one or more cross connect CCMs has been
-                received and that 3.5 times of at least one of those
-                CCMs transmission interval has not yet expired.";
-            }
-            enum none {
-                description "Indicates that all defects of all types should
-                        be ignored.";
-            }
-        }
-
-        description
-        "An enumerated value indicating the highest priority defect.";
-        reference
-        "[802.1q] 20.33.9";
-    }
-
-    typedef fault-alarm-defect-bits-type {
-        type bits {
-            bit remote-rdi {
-                description "Indicates that at least one of the Remote MEP state machines is
-                receiving valid CCMs from its remote MEP that has the RDI bit set.";
-            }
-            bit remote-mac-error {
-                description "One or more of the remote MEPs is reporting a failure
-                in its Port Status TLV or Interface Status";
-            }
-            bit remote-invalid-ccm {
-                description "At least one of the Remote MEP state machines is not
-                receiving valid CCMs from its remote MEP";
-            }
-            bit invalid-ccm {
-                description "One or more invalid CCMs has been received";
-            }
-            bit cross-connect-ccm {
-                description "One or more cross connect CCMs has been received";
-            }
-        }
-
-        description
-        "A set of bits indicating the the current defects";
-        reference
-        "[802.1q] 20.33.9";
-    }
-
-    typedef remote-mep-state-type {
-        type enumeration {
-            enum idle {
-                description
-                "Indicates momentary state during reset.";
-            }
-            enum start {
-                description
-                "Indicates the timer has not expired since the state machine was
-                reset, and no valid CCM has yet been received.";
-            }
-            enum failed {
-                description
-                "Indicates The timer has expired, both since the state machine
-                was reset, and since a valid CCM was received.";
-            }
-            enum ok {
-                description
-                "Indicates The timer has not expired since a valid CCM was
-                received.";
-            }
-        }
-        description
-        "An enumerated value indicating the operational state of a Remote
-        MEP state machine for a remote MEP.";
-        reference
-        "[802.1q] 12.14.7.6.3:b
-        IEEE8021-CFM-MIB.Dot1agCfmRemoteMepState";
-    }
-
-    typedef ltm-transaction-id-type {
-        type uint32;
-
-        description
-        "A linktrace transaction identifier";
-        reference
-        "[802.1q] 21.8.3";
-    }
-
-    //
-    // Groupings related to CFM
-    //
-
-    grouping target-address-group {
-        description
-        "An indication of a destination MEP, either:
-        1) The MEPID of a MEP; or
-        2) An Individual destination MAC address";
-
-        reference "[802.1q] 12.14.7.3.2:b";
-
-        choice address-type {
-            description "Either a mac address or a MEP id for the target";
-            case mac-address {
-                leaf mac-address {
-                    type yang:mac-address;
-                    description
-                    "Target MAC address";
-                }
-            }
-            case mep-id {
-                leaf mep-id {
-                    type msea:mep-id-type;
-                    description
-                    "Target MEP ID";
-                }
-            }
-        }
-    }
-
-    grouping maintenance-domain-reference {
-        description
-        "This grouping uniquely identifies a maintenance domain.";
-
-        leaf maintenance-domain {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:id";
-            }
-            description
-            "A reference to a specific Maintenance Domain.";
-        }
-    }
-
-    grouping maintenance-association-reference {
-        description
-        "This grouping uniquely identifies a maintenance association. It consists
-        of a maintence-domain-reference and a maintenance-association leafref";
-
-        uses maintenance-domain-reference;
-
-        leaf maintenance-association {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id=current()/../maintenance-domain]/msea-cfm:maintenance-association/msea-cfm:id";
-            }
-            description
-            "A reference to a specific Maintenance Association.";
-        }
-    }
-
-    grouping maintenance-association-end-point-reference {
-        description
-        "This grouping uniquely identifies a maintenance association. It consists
-        of a maintence-association-reference and a maintenance-association-end-point
-        leafref";
-
-        uses maintenance-association-reference;
-
-        leaf maintenance-association-end-point {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id=current()/../maintenance-domain]/msea-cfm:maintenance-association[msea-cfm:id=current()/../maintenance-association]/msea-cfm:maintenance-association-end-point/msea-cfm:mep-identifier";
-            }
-            description
-            "A reference to a specific Maintenance association End Point.";
-        }
-    }
-
-    grouping mep-notification-reference {
-
-        description "A simple MEP reference that can be used in notifications";
-        leaf maintenance-domain {
-            type uint8;
-            description
-            "A reference to a specific Maintenance Domain.";
-        }
-
-        leaf maintenance-association {
-            type uint8;
-            description
-            "A reference to a specific Maintenance Association.";
-        }
-
-        leaf maintenance-association-end-point {
-            type msea:mep-id-type;
-            description
-            "A reference to a specific Maintenance association End Point.";
-        }
-
-    }
-
-    grouping linktrace-parameters-group {
-        description
-        "This is the group of parameters associated with linktrace sessions. It is
-        used for linktrace RPC input as well as linktrace database entries.";
-
-        container target-address {
-            description
-            "Target MAC address or MEP ID for the Linktrace session.";
-            uses target-address-group;
-        }
-
-        leaf transmit-ltm-flags {
-            type bits {
-                bit use-fdb-only {
-                    description
-                    "If set, indicates that only MAC addresses learned in a
-                    Bridge’s FDB, and not information saved in the MIP CCM
-                    Database, is to be used to determine the Egress Port.";
-                    reference "[802.1q] 21.8.1";
-                }
-            }
-
-            description
-            "The Flags field for LTMs transmitted by the MEP";
-            reference
-            "[802.1q] 12.14.7.4.2:b";
-        }
-
-        leaf default-ttl {
-            type uint8;
-            default 64;
-
-            description
-            "An initial value for the LTM TTL field";
-            reference
-            "[802.1q] 12.14.7.4.2:d";
-        }
-    } //End of linktrace-parameters-group
-
-
-    grouping port-id-tlv-group {
-        description
-        "Data definitions associated with the Port ID TLV";
-
-        reference
-        "[802.1AB] 9.5.3";
-
-        choice port-id-subtype {
-            leaf interface-alias {
-                type string {
-                    length "0..64";
-                }
-                description
-                "The ifAlias field from the Interfaces Group MIB";
-                reference
-                "[RFC2863]";
-            }
-
-            leaf port-component {
-                type string {
-                    length "0..32";
-                }
-                description
-                "EntPhysicalAlias when entPhysClass has a value of port(10) or
-                backplane(4)";
-                reference
-                "[RFC2737]";
-            }
-            leaf mac-address {
-                type yang:mac-address;
-                description
-                "A MAC address";
-            }
-            leaf network-address {
-                type string;
-                description
-                "network-address is an octet string that identifies a particular network
-                address family and an associated network address that are
-                encoded in network octet order. An IP address, for example,
-                would be encoded with the first octet containing the IANA
-                Address Family Numbers enumeration value for the specific
-                address type and octets 2 through n containing the address
-                value";
-                reference
-                "[802.1AB] Table 9.2";
-            }
-
-            leaf interface-name {
-                type string {
-                    length "0..64";
-                }
-                description
-                "The ifName field from the Interfaces Group MIB";
-                reference
-                "[RFC2863]";
-            }
-            leaf agent-circuit-id {
-                type string;
-                description
-                "Agent circuit ID";
-                reference
-                "[RFC3046]";
-            }
-            leaf local {
-                type string;
-                description
-                "A locally defined identifier";
-                reference
-                "[802.1AB] Table 9.3";
-            }
-        }
-    }  //End of port-id-tlv-group
-
-
-    grouping sender-id-tlv-group {
-        description
-        "Data definitions associated with the Sender ID TLV";
-
-        reference
-        "[802.1q] 21.5.3";
-
-        choice chassis-id-subtype {
-            description
-            "The chassis-id-subtype contains the chassis ID entity that is listed in
-            the chassis ID field. This is a combination of the 'Chassis ID Subtype'
-            and 'chsssis ID' fields";
-
-            reference
-            "[802.1AB] 9.5.2.2";
-
-            leaf chassis-component {
-                type string {
-                    length "0..32";
-                }
-                description
-                "This leaf contains the content of EntPhysicalAlias when entPhysClass has
-                a value of chassis(3)'";
-                reference
-                "[RFC2737]";
-            }
-
-            leaf interface-alias {
-                type string {
-                    length "0..64";
-                }
-                description
-                "The IfAlias field from the Interfaces Group MIB";
-                reference
-                "[RFC2863]";
-            }
-
-            leaf port-component {
-                type string {
-                    length "0..32";
-                }
-                description
-                "The EntPhysicalAlias from the Interfaces Group MIB when entPhysClass has
-                a value of port(10) or backplane(4)";
-                reference
-                "[RFC2737]";
-            }
-
-            leaf mac-address-type {
-                type yang:mac-address;
-
-                description
-                "An IEEE 802-2001 Ethernet MAC Address";
-                reference
-                "[802-2001]";
-            }
-
-            leaf network-address {
-                type string;
-                description
-                "network-address is an octet string that identifies a particular network
-                address family and an associated network address that are encoded in
-                network octet order. An IP address, for example, would be encoded with
-                the first octet containing the IANA Address Family Numbers enumeration
-                value for the specific address type and octets 2 through n containing
-                the address value";
-                reference
-                "[802.1AB] Table 9.2";
-            }
-
-            leaf interface-name {
-                type string {
-                    length "0..64";
-                }
-                description
-                "IfName";
-                reference
-                "[RFC2863]";
-            }
-
-            leaf local {
-                type string;
-                description
-                "A locally assigned alpha-numeric string.";
-                reference
-                "[802.1AB] Table 9.2";
-            }
-        }
-
-        container management-address {
-            description
-            "Data definitions related to the management address fields defined
-            in a Sender ID TLV";
-            reference
-            "[802.1Q] Section 21.5.3";
-            choice management-address-choice {
-                case udp-ipv4 {
-                    description
-                    "Represents an IPv4 UDP transport address consisting of an IPv4 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainUdpIpv4";
-                    leaf udp-ipv4-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf udp-ipv4-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case udp-ipv6 {
-                    description
-                    "Represents an IPv6 UDP transport address consisting of an IPv6 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainUdpIpv6";
-                    leaf udp-ipv6-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf udp-ipv6-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case udp-ipv4z {
-                    description
-                    "Represents a UDP transport address consisting of an IPv4 address, a zone
-                    index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainUdpIpv4z";
-                    leaf udp-ipv4z-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf udp-ipv4z-index {
-                        type uint32;
-                    }
-                    leaf udp-ipv4z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case udp-ipv6z {
-                    description
-                    "Represents a UDP transport address consisting of an IPv6 address, a zone
-                    index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainUdpIpv6z";
-                    leaf udp-ipv6z-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf udp-ipv6z-index {
-                        type uint32;
-                    }
-                    leaf udp-ipv6z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case tcp-ipv4 {
-                    description
-                    "Represents an IPv4 TCP transport address consisting of an IPv4 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainTcpIpv4";
-                    leaf tcp-ipv4-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf tcp-ipv4-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case tcp-ipv6 {
-                    description
-                    "Represents an IPv6 TCP transport address consisting of an IPv6 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainTcpIpv6";
-                    leaf tcp-ipv6-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf tcp-ipv6-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case tcp-ipv4z {
-                    description
-                    "Represents a TCP IPv4 transport address consisting of an IPv4 address, a
-                    zone index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainTcpIpv4z";
-                    leaf tcp-ipv4z-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf tcp-ipv4z-index {
-                        type uint32;
-                    }
-                    leaf tcp-ipv4z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case tcp-ipv6z {
-                    description
-                    "Represents a TCP IPv6 transport address consisting of an IPv6 address,
-                    a zone index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainTcpIpv6z";
-                    leaf tcp-ipv6z-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf tcp-ipv6z-index {
-                        type uint32;
-                    }
-                    leaf tcp-ipv6z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case sctp-ipv4 {
-                    description
-                    "Represents an IPv4 SCTP transport address consisting of an IPv4 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainSctpIpv4";
-                    leaf sctp-ipv4-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf sctp-ipv4-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case sctp-ipv6 {
-                    description
-                    "Represents an IPv6 SCTP transport address consisting of an IPv6 address,
-                    and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainSctpIpv6";
-                    leaf sctp-ipv6-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf sctp-ipv6-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case sctp-ipv4z {
-                    description
-                    "Represents an SCTP IPv4 transport address consisting of an IPv4
-                    address, a zone index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainSctpIpv4z";
-                    leaf sctp-ipv4z-address {
-                        type inet:ipv4-address;
-                    }
-                    leaf sctp-ipv4z-index {
-                        type uint32;
-                    }
-                    leaf sctp-ipv4z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case sctp-ipv6z {
-                    description
-                    "Represents an SCTP IPv6 transport address consisting of an IPv6
-                    address, a zone index and a port number.";
-                    reference
-                    "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainSctpIpv6z";
-                    leaf sctp-ipv6z-address {
-                        type inet:ipv6-address;
-                    }
-                    leaf sctp-ipv6z-index {
-                        type uint32;
-                    }
-                    leaf sctp-ipv6z-port {
-                        type inet:port-number;
-                    }
-                }
-
-                case local {
-                    leaf local-address {
-                        type string {
-                            length "1..255";
-                        }
-                        description
-                        "Represents a POSIX Local IPC transport address.";
-                    }
-                }
-
-                case udp-dns {
-                    leaf udp-dns-address {
-                        type string {
-                            length "1..255";
-                        }
-                        description
-                        "The UDP transport domain using fully qualified domain names. Represents
-                        a DNS domain name followed by a colon ':' (ASCII character
-                        0x3A) and a port number in ASCII. The name SHOULD be fully
-                        qualified whenever possible.";
-                        reference
-                        "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainUdpDns";
-                    }
-                }
-                case tcp-dns {
-                    leaf tcp-dns-address {
-                        type string {
-                            length "1..255";
-                        }
-                        description
-                        "The TCP transport domain using fully qualified domain names. Represents
-                        a DNS domain name followed by a colon ':' (ASCII character
-                        0x3A) and a port number in ASCII. The name SHOULD be fully
-                        qualified whenever possible.";
-                        reference
-                        "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainTcpDns";
-                    }
-                }
-                case sctp-dns {
-                    leaf sctp-dns-address {
-                        type string {
-                            length "1..255";
-                        }
-                        description
-                        "The SCTP transport domain using fully qualified domain names.
-                        Represents a DNS domain name followed by a colon ':' (ASCII
-                        character 0x3A) and a port number in ASCII. The name SHOULD be
-                        fully qualified whenever possible.";
-                        reference
-                        "[RFC3419] TRANSPORT-ADDRESS-MIB.transportDomainSctpDns";
-                    }
-                }
-                case unidentified {
-                    leaf management-domain-binary {
-                        type binary;
-                        description "The management address domain found in the
-                            Sender ID TLV encoded to base 64";
-                        reference
-                        "[802.1Q] Section 21.5.3";
-                    }
-
-                    leaf management-address-binary {
-                        type binary;
-                        description "The management address found in the
-                            Sender ID TLV encoded to base 64";
-                        reference
-                        "[802.1Q] Section 21.5.3";
-                    }
-                }
-            }
-        }
-    } //End of sender-id-tlv-group
-
-
-    grouping linktrace-reply-grouping {
-
-        description
-        "The attributes of a Linktrace reply.";
-
-        leaf transaction-id {
-            type ltm-transaction-id-type;
-
-            description
-            "The LTM Transaction Identifier to which the LTR entries will be
-            attached";
-            reference
-            "[802.1q] 12.14.7.5.2:b";
-        }
-
-        uses linktrace-parameters-group;
-
-        list reply {
-            key reply-order;
-
-            description
-            "The list of LTRs associated with a specific Linktrace
-            transaction.";
-            leaf reply-order {
-                type uint32;
-
-                description
-                "An index to distinguish among multiple LTRs with the same LTR
-                transaction-id field value. reply-order are
-                assigned sequentially from 1, in the order that the
-                Linktrace Initiator received the LTR";
-                reference "[802.1q] 12.14.7.5.2:c";
-            }
-
-            leaf reply-ttl {
-                type uint32;
-
-                description
-                "The integer Reply TTL field value returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:b";
-            }
-
-            leaf forwarded {
-                type boolean;
-
-                description
-                "A Boolean value stating whether an LTM was forwarded by
-                the responding MP.";
-                reference
-                "[802.1q] 12.14.7.5.3:c";
-            }
-
-            leaf terminal-mep {
-                type boolean;
-
-                description
-                "A Boolean value stating whether the forwarded LTM reached
-                a MEP for its MA.";
-                reference
-                "[802.1q] 12.14.7.5.3:d";
-            }
-
-            leaf last-egress-identifier {
-                type binary {
-                    length 8;
-                }
-
-                description
-                "An octet string holding the Last Egress Identifier field
-                returned in the LTR Egress Identifier TLV of the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:e";
-            }
-
-            leaf next-egress-identifier {
-                type binary {
-                    length 8;
-                }
-
-                description
-                "An octet string holding the Next Egress Identifier field
-                returned in the LTR Egress Identifier TLV of the LTR";
-                reference
-                "[802.1q] 12.14.7.5.3:f";
-            }
-
-            leaf ltr-relay {
-                type enumeration {
-                    enum hit {
-                        description "Indicates the LTM reached an MP whose MAC
-                        address matches the target MAC address.";
-                    }
-                    enum filtering-database {
-                        description "Indicates the Egress Port was determined by
-                        consulting the Filtering Database.";
-                    }
-                    enum mip-ccm-database {
-                        description "Indicates the Egress Port was determined by
-                        consulting the MIP CCM Database.";
-                    }
-                }
-
-                description
-                "An enumerated value indicating the value returned in the
-                Relay Action field.";
-                reference
-                "[802.1q] 12.14.7.5.3:g, Table 21-27
-                IEEE8021-CFM-MIB.Dot1agCfmRelayActionFieldValue";
-            }
-
-            uses sender-id-tlv-group;
-
-            leaf ingress-action {
-                type enumeration {
-                    enum ok {
-                        description "Indicates the target data frame would be
-                        passed through to the MAC Relay Entity.";
-                    }
-                    enum down {
-                        description "Indicates the Bridge Ports MAC Operational
-                        parameter is false.";
-                    }
-                    enum blocked {
-                        description "Indicates the target data frame would not
-                        be forwarded if received on this Port due
-                        to active topology enforement.";
-                    }
-                    enum vid {
-                        description "Indicates the ingress port is not in the
-                        member set of the LTMs VID, and ingress
-                        filtering is enabled, so the target data
-                        frame would be filtered by ingress filtering.";
-                    }
-                }
-
-                description
-                "An enumerated value indicating the value returned in the
-                Ingress Action field. This leaf is not present if no value
-                is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:k, Table 21-30
-                IEEE8021-CFM-MIB.Dot1agCfmIngressActionFieldValue";
-            }
-
-            leaf ingress-mac {
-                type yang:mac-address;
-
-                description
-                "The MAC address returned in the Ingress MAC Address field.
-                This leaf is not present if no value is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:l";
-            }
-
-            container ingress-port-id {
-                uses port-id-tlv-group;
-
-                description
-                "The Ingress Port ID field and the corresponding port ID value.
-                This leaf is not present if no value is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:m";
-            }
-
-            leaf egress-action {
-                type enumeration {
-                    enum ok {
-                        description "Indicates the targeted data frame would be
-                        forwarded.";
-                    }
-                    enum down {
-                        description "Indicates the Egress Port can be identified,
-                        but that Bridge Ports MAC Operational
-                        parameter is false.";
-                    }
-                    enum blocked {
-                        description "Indicates the Egress Port can be identified,
-                        but the data frame would not pass through the
-                        the Egress Port due to active topology
-                        management, i.e., the Bridge Port is not in the
-                        Forwarding state.";
-                    }
-                    enum vid {
-                        description "Indicates the Egress Port can be identified,
-                        but the Bridge Port is not in the LTMs VIDs
-                        member set, so would be filtered by egress
-                        filtering.";
-                    }
-                }
-
-                description
-                "An enumerated value indicating the value returned in the
-                Egress Action field. This leaf is not present if no value
-                is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:o, Table 21-32
-                IEEE8021-CFM-MIB.Dot1agCfmIngressActionFieldValue";
-            }
-
-            leaf egress-mac {
-                type yang:mac-address;
-
-                description
-                "The MAC address returned in the Egress MAC Address field.
-                This leaf is not present if no value is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:p";
-            }
-
-            container egress-port-id {
-                uses port-id-tlv-group;
-
-                description
-                "The Egress Port ID field and the corresponding port ID value.
-                This leaf is not present if no value is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:p, 12.14.7.5.3:q";
-            }
-
-            leaf organization-specific-tlv {
-                type binary {
-                    length "0|4 .. 1500";
-                }
-                description
-                "The OUI and contents of any Organization-Specific TLVs. This
-                leaf is not present if no value is returned in the LTR.";
-                reference
-                "[802.1q] 12.14.7.5.3:s";
-            }
-        }
-    }    //End of linktrace-reply-grouping
-
-
-    //
-    // Data definitions related to CFM
-    //
-
-    container mef-cfm {
-        description "The top level container to group the  
-        maintenance-domain(s)";
-
-        reference "RFC 6087 Section 4.9 ";
-
-        must "not(contains('/y1564:y1564-test/y1564:service-config/y1564:mep-config/y1564:maintenance-domain | /y1564:y1564-test/y1564:service-config/y1564:mep-config/y1564:maintenance-association | /y1564:y1564-test/y1564:service-config/y1564:mep-config/y1564:maintenance-association-end-point | /y1564:y1564-test/y1564:service-config/y1564:mep-config/y1564:remote-mep-id','msea-internal-optional'))" {
-            error-app-tag "msea-cfm-must-01";
-            error-message "A MEP cannot be deleted while it is still referenced from a Y1564 service config";
-//            msea:xref-module "y-1564";
-        }
-
-        must "not(contains('/rfc2544:rfc2544-test/rfc2544:mep-config/rfc2544:maintenance-domain | /rfc2544:rfc2544-test/rfc2544:mep-config/rfc2544:maintenance-association | /rfc2544:rfc2544-test/rfc2544:mep-config/rfc2544:maintenance-association-end-point | /rfc2544:rfc2544-test/rfc2544:mep-config/rfc2544:remote-mep-id','msea-internal-optional'))" {
-            error-app-tag "msea-cfm-must-02";
-            error-message "A MEP cannot be deleted while it is still referenced from an RFC2544 config";
-//            msea:xref-module "rfc-2544";
-        }
-
-        container pm-global {
-//            presence "Global level attributes for PM related measurements can be specified if present";
-            description "A placeholder for global level Performance Measurement PM related attributes";
-        }
-
-        container cfm-role {
-            presence "When present defines the role of this device in a Maintenance Domain";
-            description "Optional attributes that help to describe this devices role in a CFM configuration";
-
-            leaf role { //Microsemi specific configuration attribute
-                description "The role that this device will play in a Maitenance Domain";
-                type enumeration {
-                    enum customer {
-                        description "The customer role";
-                    }
-                    enum provider{
-                        description "The provider role";
-                    }
-                    enum operator {
-                        description "The operator role";
-                    }
-                    enum physical {
-                        description "The physical role";
-                    }
-                }
-                mandatory true;
-                reference "IEEE 802.1Q-2014 Clause 18";
-            }
-
-            leaf side { //Microsemi specific configuration attribute
-                description "An optional attribute to indicate which end of the Maintenance Domain ";
-                type enumeration {
-                    enum left {
-                        description "The device plays its role on the left side of the Maintenance Domain";
-                    }
-                    enum right {
-                        description "The device plays its role on the right side of the Maintenance Domain";
-                    }
-                }
-                default left;
-                reference "IEEE 802.1Q-2014 Clause 18";
-            }
-
-            leaf name { //Microsemi specific configuration attribute
-                description "An identifier relating to the cfm-role that device plays in CFM.
-                        This could be the name of a customer or an operator for example";
-                type string {
-                    length "1..40";
-                    pattern "[a-zA-Z0-9\\-_. ,]*";
-                }
-                mandatory true;
-                reference "IEEE 802.1Q-2014 Clause 18";
-            }
-        }
-
-
-        list maintenance-domain {
-            key id;
-
-            max-elements 64;
-
-            description
-            "A Maintenance Domain managed object is required in order to create an MA
-            with a MAID that includes that Maintenance Domain's Name. From
-            this Maintenance Domain managed object, all Maintenance
-            Association managed objects associated with that Maintenance
-            Domain managed object can be accessed, and thus controlled.";
-            reference
-            "[802.1q] 12.14.5";
-
-            leaf id {
-                type uint8 {
-                    range 1..64;
-                }
-                description
-                "A unique identifier of a Maintenance Domain. Changed to uint8 from string";
-                reference
-                "[802.1q] 12.14.5";
-            }
-
-            choice md-name-and-type-combo {
-                description
-                "The value Maintenance Domain Name depends on name-type.
-                Since the name-type defines the format for name they are
-                combined together here";
-
-                mandatory true;
-
-                case name-none {
-                    leaf name-type-none {
-                        type empty;
-                        description "Indicates that name-type is none.
-                            When name-type is 'none' then the
-                            MA name can be up to 45 chars, because len
-                            of MD is not used";
-                        reference
-                        "[802.1q] 21.6.5.1 (Table 21-19), 12.14.5.3.2:a";
-//                        msea:not-changeable;
-                    }
-                }
-
-
-                case name-character-string {
-                    leaf name { //Keep the old name
-                        type msea:identifier45 {length 1..43;}
-
-                        description
-                        "When the name-type is 'character-string' then the name must be of
-                        type string (restricted to 43 chars - 48 bytes are allowed overall
-                        for the MD+MA incl 1 byte for type and 1 byte for len on each.
-                        Leaving 1 char for MA name, the max MD name is 43 chars)";
-                        reference
-                        "[802.1q] 21.6.5.1 (Table 21-19), 12.14.5.3.2:a";
-
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:name = current()]) <= 1" { 
-                            error-message "The MD 'name' (if specified) must be unique across all character string names of MDs on the device";
-                            error-app-tag "msea-cfm-must-05";
-                        }
-
-//                        msea:not-changeable;
-                    }
-                }
-
-                case name-domain-name {
-                    leaf name-domain-name {
-                        type union {
-                          type inet:ip-address;
-                          type inet:domain-name { length 1..43;    }
-                        }
-
-                        description "When the name-type is 'domain-name' then the name
-                                must be of type inet:host";
-                        reference
-                        "[802.1q] 21.6.5.1 (Table 21-19), 12.14.5.3.2:a";
-
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:name-domain-name = current()]) <= 1" { 
-                            error-message "The MD 'name-domain-name' (if specified) must be unique across all name-domain-names of MDs on the device";
-                            error-app-tag "msea-cfm-must-06";
-                        }
-//                        msea:not-changeable;
-                    }
-                }
-
-                case mac-address-and-uint {
-                    leaf name-mac-address-and-uint {
-                        type msea:mac-address-and-uint-str;
-                        description "When the name-type is 'mac-address-and-uint'
-                                then the name must be a colon separated mac
-                                address followed by a number between 0 and 65536
-                                e.g. AA:BB:CC:DD:EE:FF:65536
-                                The effective length when encoded is 8 bytes";
-                        reference
-                        "[802.1q] 21.6.5.1 (Table 21-19), 12.14.5.3.2:a";
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:name-mac-address-and-uint = current()]) <= 1" { 
-                            error-message "The MD 'name-mac-address-and-uint' (if specified) must be unique across all name-mac-address-and-uints of MDs on the device";
-                            error-app-tag "msea-cfm-must-07";
-                        }
-//                        msea:not-changeable;
-                    }
-                }
-            }
-
-            leaf md-level {
-                type msea:md-level-type;
-                mandatory true;
-
-//                msea:not-changeable;
-
-                description
-                "Integer identifying the Maintenance Domain Level (MD Level).  Higher
-                numbers correspond to higher Maintenance Domains, those with the
-                greatest physical reach, with the highest values for customers'
-                CFM PDUs. Lower numbers correspond to lower Maintenance
-                Domains, those with more limited physical reach, with the lowest
-                values for CFM PDUs protecting single bridges or physical links.
-                Changed to mandatory";
-
-                reference
-                "[802.1q] 12.14.5.1.3:b";
-            }
-
-            list maintenance-association {
-                key id;
-                max-elements 64;
-
-                description
-                "This list represents Maintenance Entity Groups (Y.1731) or
-                Maintenance Associations (802.1ag). MEGs/MAs are sets of
-                MEPs, each configured to the same service inside a common
-                OAM domain.";
-
-                leaf id {
-                    type uint8 {
-                        range 1..64;
-                    }
-                    description
-                    "A unique identifier of a Maintenance Association. Changed to uint8 from string";
-                    reference
-                    "[802.1q] 12.14.6";
-                }
-
-                choice ma-name-and-type-combo {
-                    description
-                    "The value Maintenance Association Name depends on name-type.
-                    Since the name-type defines the format for name, they are
-                    combined together here";
-
-                    mandatory true;
-
-                    case name-character-string {
-                        leaf name {
-                            type msea:identifier45;
-
-                            must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:name = current()]) <= 1" { 
-                                error-message "The MA 'name' (if specified) must be unique across all MAs within this MD";
-                                error-app-tag "msea-cfm-must-10";
-                            }
-
-                            must "string-length(current()/../../msea-cfm:name) + string-length(current()/../../msea-cfm:name-domain-name) + 8 * boolean(current()/../../msea-cfm:name-mac-address-and-uint) -1 * boolean(current()/../../msea-cfm:name-type-none) + string-length(current()) <= 44" {
-                                error-message "The MA 'name' and MD 'name' length together must not exceed 44 chars when MD is not name-type-none or 45 chars for MA name when MD is name-type-none";
-                                error-app-tag "msea-cfm-must-11";
-                            }
-
-//                            msea:not-changeable;
-
-                            description
-                            "When the name-type is 'character-string' then the name must be of
-                            type string. Length can be 45 when MD name-type is none (as 1 byte
-                            is used on each for type, and 1 byte used on MA for len out of an 
-                            allowed 48 bytes). When MD name-type is not 'none' then the 
-                            combined length of both is 44 chars)";
-                            reference
-                            "[802.1q] 12.14.5.3.2:b, 21.6.5.4 Table 21-20";
-                        }
-                    }
-
-                    case name-primary-vid {
-                        leaf name-primary-vid {
-                            type union {
-                                type enumeration {
-                                    enum 0 {description "0 to use the MA's VID";}
-                                }
-                                type msea:vlan-id-type;
-                            }
-//                            msea:not-changeable;
-
-                            must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:name-primary-vid = current()]) <= 1" {
-                                error-message "The MA 'name-primary-vid' (if specified) must be unique across all MAs within this MD";
-                                error-app-tag "msea-cfm-must-12";
-                            }
-
-                            must "string-length(current()/../../msea-cfm:name) + string-length(current()/../../msea-cfm:name-domain-name) + 2 <= 44" {
-                                error-message "The MA 'primary-vid' (2 octets) and MD 'name' length together must not exceed 44 bytes.";
-                                error-app-tag "msea-cfm-must-13";
-                            }
-
-                            description
-                            "When the name-type is 'primary-vid' then the name must be of type
-                            vlan-id-type";
-                            reference
-                            "[802.1q] 12.14.5.3.2:b, 21.6.5.4 Table 21-20";
-                        }
-                    }
-
-                    case name-uint16 {
-                        leaf name-uint16 {
-                            type uint16;
-//                            msea:not-changeable;
-
-                            must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:name-uint16 = current()]) <= 1" {
-                                error-message "The MA 'name-uint16' (if specified) must be unique across all MAs within this MD";
-                                error-app-tag "msea-cfm-must-14";
-                            }
-
-                            must "string-length(current()/../../msea-cfm:name) + string-length(current()/../../msea-cfm:name-domain-name) + 2 <= 44" {
-                                error-message "The MA 'name-uint16' (2 octets) and MD 'name' or 'name'domain-name' length together must not exceed 44 bytes";
-                                error-app-tag "msea-cfm-must-15";
-                            }
-
-                            description
-                            "When the name-type is 'uint16' then the name must be 0-65535";
-                            reference
-                            "[802.1q] 12.14.5.3.2:b, 21.6.5.4 Table 21-20";
-                        }
-                    }
-
-                    case name-rfc2685-vpn-id {
-                        leaf name-rfc2685-vpn-id {
-                            type binary {
-                                length 7;
-                            }
-//                            msea:not-changeable;
-
-                            must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:name-rfc2685-vpn-id = current()]) <= 1" { 
-                                error-message "The MA 'name-rfc2685-vpn-id' (if specified) must be unique across all MAs within this MD";
-                                error-app-tag "msea-cfm-must-16";
-                            }
-
-                            must "string-length(current()/../../msea-cfm:name) + string-length(current()/../../msea-cfm:name-domain-name) + 7 <= 44" {
-                                error-message "The MA 'name-rfc2685-vpn-id' (7 octets) and MD 'name' or 'name'domain-name' length together must not exceed 44 bytes";
-                                error-app-tag "msea-cfm-must-17";
-                            }
-
-
-                            description
-                            "When the name-type is 'rfc2685-vpn-id' then the name 
-                            must be of 7 bytes encoded as base64";
-                            reference
-                            "[802.1q] 12.14.5.3.2:b, 21.6.5.4 Table 21-20";
-                        }
-                    }
-
-                    case name-y1731-icc {
-                        leaf name-y1731-icc {
-                            type yang:yang-identifier {
-                                length 8..13;
-                            }
-
-//                            msea:not-changeable;
-
-                            must "boolean(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association/msea-cfm:y1731-compliant)" {
-                                error-message "The MA 'name-y1731-icc' can only be specified if y1731-compliant is present";
-                                error-app-tag "msea-cfm-must-18";
-                            }
-
-                            must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:name-y1731-icc = current()]) <= 1" {
-                                error-message "The MA 'name-y1731-icc' (if specified) must be unique across all MAs within this MD";
-                                error-app-tag "msea-cfm-must-19";
-                            }
-
-                            must "boolean(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:name-type-none)" {
-                                error-message "name-y1731-icc can only be specified when MD name type is name-type-none";
-                                error-app-tag "msea-cfm-must-20";
-                            }
-
-                            description
-                            "ICC-based MEG ID Format, thirteen octet field. It consists of two
-                            subfields: the ITU Carrier Code (ICC) followed by a unique MEG
-                            ID code (UMC). The ITU Carrier Code consists of 1-6
-                            left-justified characters, alphabetic, or leading alphabetic
-                            with trailing numeric. The UMC code immediately follows the ICC
-                            and shall consist of 7-12 characters, with trailing NULLs,
-                            completing the 13-character MEG ID Value. Changed type to yang-identifier";
-                            reference
-                            "[Y.1731] Annex A";
-                        }
-                    }
-
-                }
-
-                container y1731-compliant {
-                  presence "When present indicates compliance with Y-1731";
-//                  msea:not-changeable;
-
-                  must "boolean(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:name-type-none)" {
-                      error-message "Parent MD must have a name-type-none when y1731-compilant is present";
-                      error-app-tag "msea-cfm-must-21";
-                  }
-
-                  description
-                    "A boolean flag to indicate whether the MEG ID/MAID for this MEG operates
-                     in conformance with 802.1q (if false) or Y.1731 (if true).
-                     When set to false:
-                      - The format of the MAID (Maintenance Association ID) is controlled
-                        by the name-type and name in the maintenance-association instance,
-                        and the name-type and name in the maintenance-domain instance.
-                      - The meg-id-format and meg-level leafs are ignored.
-                      - The level is controlled by the md-level leaf.
-                     When set to true:
-                      - The MEG shall be in a maintenance-domain where name-type has the value
-                        none(1).
-                      - The format of the MEG ID is as defined by meg-id-format.
-                      - The name-type in the maintenance-association is ignored.
-                      - The name leaf contains the MEG ID value unless the meg-id-format
-                        is set to 'icc-based' in which case it contains the value of the
-                        'icc-name-value' leaf
-                      - The md-level leaf is ignored, and the level is controlled
-                        by the meg-level leaf.";
-                  reference
-                    "[MEF31], MEF-SOAM-FM-MIB.mefSoamNetCfgY1731Compliant";
-                }
-
-                container component-list {
-
-                    description
-                    "A list of components each of which can be managed in a manner
-                    essentially equivalent to an 802.1Q bridge.
-                    Only one is allowed for Edge Assure, so changed to a container";
-                    reference
-                    "[802.1q] IEEE8021-CFM-V2-MIB.ieee8021CfmMaCompTable";
-
-                    leaf-list vid {
-                        type msea:vlan-id-type;
-//                        msea:not-changeable;
-
-                        must "current()/../tag-type != 'vlan-none'" {
-                            error-message "No VID should be specified when Tag Type is 'vlan-none'";
-                            error-app-tag "msea-cfm-must-25";
-                        }
-
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../../id]/msea-cfm:maintenance-association/msea-cfm:component-list[msea-cfm:vid = current()]) <= 1" {
-                            error-message "The 'vid' (VLan ID) in a Maintenance Association must be unique in a Maintenance Domain";
-                            error-app-tag "msea-cfm-must-26";
-                        }
-
-                        max-elements 1;
-                        ordered-by user;
-
-                        description
-                        "The VID(s) monitored by this MA, or 0, if the MA is not attached to any
-                        VID. The first VID returned is the MA's Primary VID";
-                        reference
-                        "[802.1q] 12.14.5.3.2:b";
-                    }
-
-                    leaf tag-type {
-                        type enumeration {
-                            enum vlan-none {
-                                description "No tag applied";
-                            }
-                            enum vlan-ctag {
-                                description "Ctags applied";
-                            }
-                            enum vlan-stag {
-                                description "Stags applied";
-                            }
-                        }
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:component-list[msea-cfm:tag-type = 'vlan-none']) <= 1" {
-                            error-message "A maximum of 1 MA with tag-type = vlan_none can be specified across all MAs in the device";
-                            error-app-tag "msea-cfm-must-27";
-                        }
-
-                        must "(current() != 'vlan-none' and count(current()/../vid) = 1) or (current() = 'vlan-none' and count(current()/../vid) = 0)" {
-                            error-message "A 'vid' must exist when tag-type is vlan-ctag or vlan-stag and must not exist when tag-type is vlan-none";
-                            error-app-tag "msea-cfm-must-28";
-                        }
-
-                        mandatory true;
-//                        msea:not-changeable;
-                        description "The type of tag to apply to packets in this VLAN";
-                    }
-
-                } // end of component-list
-
-                leaf ccm-interval {
-                    type enumeration {
-                        enum 3.3ms {
-                            description "CCMs are sent every 3 1/3 milliseconds (300Hz).";
-                        }
-                        enum 10ms {
-                            description "CCMs are sent every 10 milliseconds.";
-                        }
-                        enum 100ms {
-                            description "CCMs are sent every 100 milliseconds.";
-                        }
-                        enum 1s {
-                            description "CCMs are sent every 1 second.";
-                        }
-                    }
-                    mandatory true;
-
-                    description
-                    "The interval between CCM transmissions to be used by all MEPs in the MA";
-                    reference
-                    "[802.1q] 12.14.6.1.3:e
-                    IEEE8021-CFM-MIB.Dot1agCfmCcmInterval";
-                }
-
-                leaf-list remote-meps {
-                    type msea:mep-id-type;
-                    max-elements 9; //The local MEP and up to 8 remote meps
-
-                    must "(count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:remote-meps) - count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association)) <= 64" {
-                        error-message "The maximum number of remote MEPs on the device across all MDs and MAs must not exceed 64";
-                        error-app-tag "msea-cfm-must-29";
-                    }
-
-                    description
-                    "A list of the MEPIDs of the MEPs in the MA. The list
-                        consists of the ids of the local MEP (defined below)
-                        and up to 8 remote meps. A maximum of 64 remote MEPs
-                        can be configured on all MAs on the device";
-                    reference
-                    "[802.1q] 12.14.6.1.3:g";
-                }
-
-                list maintenance-association-end-point {
-                    must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point) <= 64" {
-                        error-message "The maximum number of MEPs on the whole device must not exceed 64";
-                        error-app-tag "msea-cfm-must-30";
-                    }
-
-                    key "mep-identifier";
-
-                    max-elements 1; //Only one local MEP is allowed per MA
-
-                    description
-                    "The list of Maintenance association End Points in a specific Maintance Association.";
-
-                    leaf mep-identifier {
-                        type msea:mep-id-type;
-
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:remote-meps[text() = current()]) = 1" {
-                            error-message "The MEP ID must be listed in the 'remote-meps' list for this MA";
-                            error-app-tag "msea-cfm-must-31";
-                        }
-
-                        description
-                        "Integer that is unique among all the MEPs in the same MA. Other
-                        definition is: a small integer, unique over a given
-                        Maintenance Association, identifying a specific Maintenance
-                        association End Point.";
-                        reference
-                        "[802.1q] 12.14.6.3.2:b";
-                    }
-
-                    leaf interface {
-                        type enumeration {
-                            enum eth0 {
-                                description "Optics/eth0/WAN - commonly the Carrier port.";
-                            }
-                            enum eth1 {
-                                description "Host/eth1/LAN  - commonly the System port.";
-                            }
-                        }
-
-                        must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:md-level = current()/../../../md-level]/msea-cfm:maintenance-association[msea-cfm:component-list/msea-cfm:vid = current()/../../component-list/vid]/msea-cfm:maintenance-association-end-point[msea-cfm:interface = current()]) <= 1" {
-                            error-message "The combination of 'md-level', 'vid', 'direction' and 'interface' must be unique for all MEPs on the system";
-                            error-app-tag "msea-cfm-must-32";
-                            description "Check that this interface is unique for all MEPs in this Maintenance Association. 
-                            The Maintanance Association already checks that the VID is unique for the Maintenance Domain.";
-                        }
-
-                        mandatory true;
-//                        msea:not-changeable;
-
-                        description
-                        "An interface, either a Bridge Port or an aggregated IEEE 802.3 port
-                        within a Bridge Port, to which the MEP is attached. Each interface in
-                        the system is uniquely identified by an interface-name. The structure
-                        and content of the name is outside the scope of this specification.
-
-                        Added restriction for Edge Assure that the interface name can only be eth0 or eth1";
-                        reference
-                        "[802.1q] 12.14.7.1.3:b";
-                    }
-
-                    leaf direction {
-                        type enumeration {
-                            enum down {
-                                description "Indicates when CFM frames are transmitted towards and 
-                                received from the wire.";
-                            }
-                        }
-                        default down;
-//                        msea:not-changeable;
-
-                        description
-                        "A value indicating the direction in which the MEP faces on the 
-                        interface. For EdgeAssure can only be 'down' Changed from
-                        mandatory to default = down";
-
-                        reference
-                        "[802.1q] 12.14.7.1.3:c";
-                    }
-
-                    leaf primary-vid {
-                        type union {
-                            type enumeration {
-                                enum 0 {description "0 to use the MA's VID";}
-                            }
-                            type msea:vlan-id-type;
-                        }
-
-                        must "current() = 0 or count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../../id]/msea-cfm:maintenance-association[msea-cfm:id = current()/../../id]/msea-cfm:component-list/msea-cfm:vid[text() = current()]) = 1" {
-                            error-message "PrimaryVID of MEP must be either 0 or from the range of VIDs in component-list of the MA";
-                            error-app-tag "msea-cfm-must-33";
-                        }
-
-                        default 0;
-
-                        description
-                        "The Primary VID of the MEP. The value 0 indicates that either the
-                        Primary VID is that of the MEP's MA or that the MEP's MA is
-                        associated with no VID. Must be either 0 or from the range of VIDs in the
-                        component-list of this MA. Changed to default=0 from mandatory";
-                        reference
-                        "[802.1q] 12.14.7.1.3:d";
-                    }
-
-                    leaf administrative-state {
-                        type boolean;
-                        mandatory true;
-
-                        description
-                        "The administrative state of the MEP";
-                        reference
-                        "[802.1q] 12.14.7.1.3:e";
-                    }
-
-                    leaf mac-address {
-                        type yang:mac-address;
-                        config false;
-
-                        description
-                        "The MAC address of the MEP";
-                        reference
-                        "[802.1q] 12.14.7.1.3:i";
-                    }
-
-                    leaf ccm-ltm-priority {
-                        type msea:priority-type;
-                        mandatory true;
-
-                        description
-                        "The priority parameter for CCMs and LTMs transmitted by the MEP.";
-                        reference
-                        "[802.1q] 12.14.7.1.3:h";
-                    }
-
-                    container continuity-check {
-                        description
-                        "Data definitions related to the Continuity Check function.";
-
-                        leaf cci-enabled {
-                            type boolean;
-                            default false;
-
-                            description
-                            "Configuration of whether the MEP is or is not to generate CCMs";
-                            reference
-                            "[802.1q] 12.14.7.1.3:g";
-                        }
-
-                        leaf fng-state {
-                            type enumeration {
-                                enum reset {
-                                    description "No defect has been present since the
-                                    fng-reset-time timer expired, or since
-                                    the state machine was last reset.";
-                                }
-                                enum defect {
-                                    description "A defect is present, but not for a long enough 
-                                    time to be reported (fng-alarm-time).";
-                                }
-                                enum report-defect {
-                                    description "A momentary state during which the defect is 
-                                    reported by sending a fault-alarm notification,
-                                    if that action is enabled.";
-                                }
-                                enum defect-reported {
-                                    description "A defect is present, and some defect has been 
-                                    reported.";
-                                }
-                                enum defect-clearing {
-                                    description "No defect is present, but the fng-reset-time timer has
-                                    not yet expired.";
-                                }
-                            }
-                            default reset;
-                            config false;
-
-                            description
-                            "A value indicating the current state of the MEP Fault Notification
-                            Generator state machine";
-                            reference
-                            "[802.1q] 12.14.7.1.3:f, 20.35
-                            IEEE8021-CFM-MIB.Dot1agCfmFngState";
-                        }
-
-                        leaf lowest-fault-priority-defect {
-                            type fault-alarm-defect-type;
-
-                            description
-                            "The lowest priority defect that is allowed to generate a Fault
-                            Alarm.";
-
-                            default remote-mac-error;
-
-                            reference
-                            "[802.1q] 12.14.7.1.3:k";
-                        }
-
-                        leaf highest-priority-defect-found {
-                            type fault-alarm-defect-type;
-                            config false;
-
-                            description
-                            "Value indicating the highest-priority defect that has been 
-                            present since the MEP Fault Notification Generator state machine
-                            was last in the FNG_RESET state The non-existence of this
-                            leaf represents that no defect has been present since the
-                            last FNG_RESET state";
-                            reference
-                            "[802.1q] 12.14.7.1.3:n";
-                        }
-
-                        leaf fng-alarm-time {
-                            type yang:timeticks {
-                                range 250..1000;
-                            }
-                            default 250;
-
-                            description
-                            "The time that defects must be present before a Fault Alarm is 
-                            issued in hundredths of seconds";
-                            reference
-                            "[802.1q] 12.14.7.1.3:l, 20.33.3";
-                        }
-
-                        leaf fng-reset-time {
-                            type yang:timeticks {
-                                range 250..1000;
-                            }
-                            default 1000;
-
-                            description
-                            "The time that defects must be absent before resetting a Fault Alarm 
-                            in hundredths of seconds";
-                            reference
-                            "[802.1q] 12.14.7.1.3:m, 20.33.4";
-                        }
-
-                        leaf active-defects {
-                            type fault-alarm-defect-bits-type;
-                            config false;
-
-                            description
-                            "A bit field of potential active defects. The values are the same as the
-                            content of the fault-alarm-defect-type (except if it is 'none' then 
-                            nothing will be listed).";
-                            reference
-                            "[802.1q] 12.14.7.1.3:o, p, q, r, s";
-                        }
-
-                        leaf last-error-ccm {
-                            type binary {
-                                length "1..1522";
-                            }
-                            config false;
-
-                            description
-                            "The last-received CCM that triggered an invalid-ccm fault";
-                            reference
-                            "[802.1q] 12.14.7.1.3:t";
-                        }
-
-                        leaf last-cross-connect-ccm {
-                            type binary {
-                                length "1..1522";
-                            }
-                            config false;
-
-                            description
-                            "The last-received CCM that triggered a cross-connect-ccm fault";
-                            reference
-                            "[802.1q] 12.14.7.1.3:u";
-                        }
-
-                        leaf ccm-sequence-error-count {
-                            type yang:counter32;
-                            config false;
-                            mandatory true;
-
-                            description
-                            "The total number of out-of-sequence CCMs received from all remote
-                            MEPs.";
-                            reference
-                            "[802.1q] 12.14.7.1.3:v";
-                        }
-
-                        leaf sent-ccms {
-                            type yang:counter32;
-                            config false;
-                            mandatory true;
-
-                            description
-                            "The total number of CCMs transmitted.";
-                            reference
-                            "[802.1q] 12.14.7.1.3:w";
-                        }
-                    }
-
-                    container loopback {
-                        description
-                        "Data definitions related to the Loopback function.";
-
-                        //config false; Commented out to let config attribs on mef-soam-pm work 08Dec15 SC Microsemi 
-
-                        leaf replies-received {
-                            type yang:counter32;
-                            config false;
-                            mandatory true;
-
-                            description
-                            "The total number of valid, in-order LBRs received.";
-                            reference
-                            "[802.1q] 12.14.7.1.3:y";
-                        }
-
-                        leaf replies-transmitted {
-                            type yang:counter32;
-                            config false;
-                            mandatory true;
-
-                            description
-                            "The total number of LBRs transmitted.";
-                            reference
-                            "[802.1q] 12.14.7.1.3:ad";
-                        }
-                    } //End of loopback
-
-                    container remote-mep-database {
-                        config false;
-                        description
-                        "The MEP CCM database";
-
-                        list remote-mep {
-                            key remote-mep-id;
-                            description
-                            "The list of remote MEPs in the MEP CCM database";
-                            reference
-                            "[802.1q] 12.14.7.6";
-
-                            leaf remote-mep-id {
-                                type msea:mep-id-type;
-
-                                description
-                                "The MEPID of a remote MEP";
-                                reference
-                                "[802.1q] 12.14.7.6.2";
-                            }
-
-                            leaf remote-mep-state {
-                                type remote-mep-state-type;
-
-                                description
-                                "An enumerated value indicating the operational state of the 
-                                Remote MEP state machine for this remote MEP.";
-                                reference
-                                "[802.1q] 12.14.7.6.3:b
-                                IEEE8021-CFM-MIB.Dot1agCfmRemoteMepState";
-                            }
-
-                            leaf failed-ok-time {
-                                type yang:timeticks;
-
-                                description
-                                "The time (SysUpTime, IETF RFC 3418) at which the Remote MEP state
-                                machine last entered either the RMEP_FAILED or RMEP_OK
-                                state, or 0 if it has not yet entered either of those
-                                states";
-                                reference
-                                "[802.1q] 12.14.7.6.3:c";
-                            }
-
-                            leaf mac-address {
-                                type yang:mac-address;
-
-                                description
-                                "The MAC address of the remote MEP.";
-                                reference
-                                "[802.1q] 12.14.7.6.3:d";
-                            }
-
-                            leaf rdi {
-                                type boolean;
-
-                                description
-                                "An indication of the state of the RDI bit in the last received CCM,
-                                true for RDI = 1, or false for RDI = 0 or if none has been
-                                received.";
-                                reference
-                                "[802.1q] 12.14.7.6.3:e";
-                            }
-
-                            leaf port-status-tlv {
-                                type msea:port-status-type;
-
-                                description
-                                "The enumerated value from the Port Status TLV from the last 
-                                CCM received from the remote MEP.";
-                                reference
-                                "[802.1q] 12.14.7.6.3:f";
-                            }
-
-                            leaf interface-status-tlv {
-                                type msea:interface-status-type;
-
-                                description
-                                "The enumerated value from the Interface Status TLV from the 
-                                last CCM received from the remote MEP";
-                                reference
-                                "[802.1q] 12.14.7.6.3:g";
-                            }
-                        }
-                    } //end remote-mep-database
-
-
-                    container linktrace {
-                        config false;
-                        description
-                        "Data definitions related to the Linktrace function.";
-
-                        leaf unexpected-replies-received {
-                            type yang:counter32;
-
-                            description
-                            "The total number of unexpected LTRs received.";
-                            reference
-                            "[802.1q] 12.14.7.1.3:ac";
-                        }
-
-                        container linktrace-database {
-                            description
-                            "Data definitions related to the Linktrace database for a specific MEP";
-
-                            list linktrace {
-                                key "transaction-id";
-
-                                description
-                                "The list of entries in a Linktrace database.";
-
-                                uses linktrace-reply-grouping;
-                            }
-                        }
-                    } //End linktrace
-                }
-            }
-        }
-    }
-    //
-    // RPCs related to CFM
-    //
-
-    rpc transmit-loopback {
-        description
-        "Start a loopback session on a specific MEP
-
-        The counters in the loopback container of the associated MEP will be updated
-        with the result of the loopback session until the configured number of messages
-        have been sent.";
-//    reference --Removed as Tail-f NSO 4.1 can't handle references on RPCs. Also cannot remove using a deviate statement since reference is not a valid deviate sub-statement
-//      "[802.1q] 12.14.7.3";
-
-        input {
-            uses maintenance-association-end-point-reference; //Added 08Dec15 SC Microsemi
-
-            container target-address {
-                description
-                "Target MAC address or MEP ID for the Loopback session.";
-                uses target-address-group;
-            }
-
-            leaf number-of-messages {
-                type uint32 {
-                    range "1..1024";
-                }
-                default 1;
-
-                description
-                "The number of LBM transmissions in a session.";
-                reference
-                "[802.1q] 12.14.7.3.2:c, [MEF30] R39";
-            }
-
-            leaf data-tlv {
-                type binary;
-
-                description
-                "An arbitrary amount of data to be included in a Data TLV.";
-                reference
-                "[802.1q] 12.14.7.3.d, IEEE8021-CFM-MIB.dot1agCfmMepTransmitLbmDataTlv";
-            }
-
-            leaf vlan-priority {
-                type msea:priority-type;
-
-                description
-                "The priority parameter to be used in the transmitted LBMs";
-                reference
-                "[802.1q] 12.14.7.3.2:e";
-            }
-
-            leaf vlan-drop-eligible {
-                type boolean;
-                default true;
-
-                description
-                "The drop eligible parameter to be used in the transmitted LBMs";
-                reference
-                "[802.1q] 12.14.7.3.2:e";
-            }
-        }
-    }
-
-    rpc abort-loopback {
-        description
-        "Administratively abort a loopback session in progress on a specific MEP";
-//    reference --Removed as Tail-f NSO 4.1 can't handle references on RPCs. Also cannot remove using a deviate statement since reference is not a valid deviate sub-statement
-//      "[MEF30] 8.2, R28";
-
-        input {
-            uses maintenance-association-end-point-reference; //Added 08Dec15 SC Microsemi
-
-        }
-    }
-
-    rpc transmit-linktrace {
-        description
-        "Start a linktrace session on a specific remote MEP associated
-        with a local MEP.
-
-        This RPC will wait 6 seconds for the linktrace replies to be
-        gathered from remote MEP and any intermediate MIPs and will
-        display them in line. The information about the last linktrace
-        transaction will also be visible in the state data beneath the
-        local MEP until the next linktrace is run. Only one
-        instance of linktrace can be run at a time";
-        // reference
-        //      "[802.1q] 12.14.7.4";
-
-        input {
-            uses maintenance-association-end-point-reference; //Added 08Dec15 SC Microsemi
-
-            uses linktrace-parameters-group;
-        }
-
-        output {
-            anyxml data {
-                description "The complete response from the Linktrace
-                including the individual replies from remote MEPs
-                and any intermediate MIPs";
-            }
-        }
-    }
-
-
-    //
-    // Notifications related to CFM
-    //
-
-    notification fault-alarm {
-        description
-        "A notification that a specific MEP has a persistent defect condition.";
-        reference
-        "[802.1q] 12.14.7.7";
-
-        container alarm {
-            description
-            "Data definitions related to a persistent defect on a specific MEP.";
-
-            uses mep-notification-reference;
-
-            leaf remote-mep {
-                type msea:mep-id-type;
-                description "Remote MEP identifier";
-            }
-
-            leaf highest-defect {
-                type fault-alarm-defect-type;
-                description "The highest priority defect currently asserted when the alarm occurs on the MEP.";
-            }
-        }
-    }
-}
-
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-sa-filtering.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-sa-filtering.yang
deleted file mode 100644
index 72534a9..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-sa-filtering.yang
+++ /dev/null
@@ -1,149 +0,0 @@
-module msea-sa-filtering {
-
-    /*** NAMESPACE / PREFIX DEFINITION ***/
-
-    namespace "http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering";
-    prefix "msea-saf";
-
-    import ietf-inet-types {
-        prefix inet;
-        revision-date 2013-07-15;
-    }
-
-    import msea-types {
-        prefix msea;
-        revision-date 2016-02-29;
-    }
-
-    /*** 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 Source Address Filtering for IPv4 packets to
-    the Optics(eth0) port (only) of the Edge Assure device.
-
-    Copyright 2016 Microsemi Inc.
-    All rights reserved.";
-
-    revision "2016-04-12" {
-        description
-        "Initial version - Sean Condon, Microsemi";
-    }
-
-
-    container source-ipaddress-filtering {
-        presence "Supports IPv4 Source Address Filtering";
-
-        container interface-eth0 {
-
-            leaf filter-admin-state {
-                type enumeration {
-                    enum inactive {
-                        description "Source address filtering is inactive";
-                    }
-                    enum whitelist {
-                        description "Only IPv4 packets from the source
-                        address ranges are allowed in to the device on the
-                        Optics(eth0) port. All non IPv4 packets are not
-                        filtered by this whitelist";
-                    }
-                    enum blacklist {
-                        description "All IPv4 packets from the source 
-                        address ranges are blocked from entering the device 
-                        on the Optics(eth0) port. All other packets are not
-                        filtered by this blacklist";
-                    }
-                }
-                default inactive;
-                description "This attribute sets the address range to be used as
-                either a whitelist or a blacklist of IPv4 packets.
-                When activating the filter the user should be careful not to
-                block or exclude the management IP address of the manager";
-            }
-
-            list source-address-range {
-                key range-id;
-                max-elements 10;
-                unique ipv4-address-prefix;
-                unique name;
-
-                leaf range-id {
-                    type uint8 {
-                        range "1..10";
-                    }
-                }
-
-                leaf name {
-                    type string{
-                        length "1..45";
-                    }
-                    description "An optional name for the filter range";
-                }
-
-                leaf ipv4-address-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])'
-                       + '/(([1-9])|(1[0-9])|(2[0-7]))';
-                    }
-
-                    mandatory true;
-//                    msea:not-changeable;
-
-                    description
-                     "The ipv4-address-prefix type represents an IPv4 address prefix
-                      in CIDR notation format. e.g. a.b.c.d/n
-
-                      It consists of an address part and a mask length part.
-                      The address part is only used up to the number of bits
-                      specified in the length (1-27, given after the slash).
-
-                      For example the value 10.10.159.211/20 will mean an
-                      effective range from 10.10.144.0 - 10.10.159.255 and
-                      a count of 2^12 = 4096. The last 12 bits (32-20=12)
-                      of the address is ignored because it is not within the
-                      mask length.";
-                }
-
-
-                container effective-address-range {
-                    config false;
-
-                    leaf start-of-range {
-                        type inet:ipv4-address-no-zone;
-                        description "The calculated start of the address range";
-                    }
-
-                    leaf end-of-range {
-                        type inet:ipv4-address-no-zone;
-                        description "The calculated end of the address range";
-                    }
-
-                    leaf count {
-                        type uint32;
-                        description "The number of IPv4 addresses that match the filter";
-                    }
-
-                    description "The effective start and end addresses calculated
-                    from the ipv4-address-prefix";
-                }
-
-                description "A set of address ranges to be either blacklisted or
-                whitelisted on ingress to the eth0(Optics) port of the device";
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-fm.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-fm.yang
deleted file mode 100644
index 35a95c9..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-fm.yang
+++ /dev/null
@@ -1,545 +0,0 @@
-module msea-soam-fm {
-    
-  namespace "http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm";
-  prefix "msea-soam-fm"; //MicroSemi EdgeAssure (msea)
-  
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  
-  import msea-cfm {
-    prefix msea-cfm;
-  }
-  
-  import msea-types {
-    prefix msea;
-  }
-
-  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 is a fork of the original mef-soam-fm YANG Module defined in MEF 38
-    for the management of Ethernet Services Operations, Administration and
-    Maintenance for Fault Management and extends the Connectivity Fault
-    Management (CFM) YANG modules.
-    This fork is done specifically to suit the EdgeAssure which has some extra
-    constraints that are not handled by the original YANG.
-    
-    Copyright 2016 Microsemi Inc.
-    All rights reserved.";
-
-  revision "2016-02-29" {
-    description     
-     "Initial EdgeAssure version forked from mef-soam-fm@2012-04-16 - Sean Condon, Microsemi";
-    reference
-      "Service OAM Fault Management YANG Modules (MEF 38), April 2012";
-  }
-    
-  //
-  // Type definitions related to MEF SOAM FM
-  //
-
-  typedef operational-state-type {
-    type enumeration {
-      enum enabled {
-        description
-          "The MEP is able to provide OAM capabilities and has been set to
-           active via the 'administrative-state' leaf.";
-      }
-      enum disabled {
-        description
-          "The MEP is not able to provide OAM capabilities, for example
-           because it has been disabled via the administrative-state leaf,
-           has detected an operational failure condition, or has failed an
-           internal test.";
-      }
-      enum testing {
-        description
-          "The MEP has been placed into a test mode, either a troubleshooting
-           mode or ETH-Test 'Out-of-service' mode.";
-      }
-      enum unknown {
-        description
-          "The MEP is unable to report the operational state.";
-      }
-    }
-    description
-      "This attribute indicates the operational state (current capability) of
-       a MEP.";
-    reference
-      "[MEF7.1] 9.2.5";
-  }
-
- 
-
-  //
-  // Augments into CFM related to MEF SOAM FM
-  //
-  augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association" {
-    description
-      "This set of data definitions represents the Maintenance Entity Group (Y.1731) 
-       configuration that is unique from the Maintenance Association.";
-
-    leaf meg-level {
-      type msea:md-level-type;
-      
-//      msea:not-changeable;
-      
-      must "../msea-cfm:y1731-compliant" {
-    	  error-message "meg-level can only be set when y1731-compliant is present";
-		  error-app-tag "msea-soam-fm-must-04";
-      }
-      
-      must "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../msea-cfm:id]/msea-cfm:md-level = current()" {
-    	  error-message "meg-level must be the same as its parent MD md-level";
-		  error-app-tag "msea-soam-fm-must-05";
-      }
-      
-      description
-        "This attribute indicates the MEG Level of the MEG. It has to be the same as the
-        MDs level, which is a way of ensuring that all MEG under this MD have the same level";
-      
-      reference
-        "[MEF31] MEF-SOAM-FM-MIB.mefSoamNetCfgMegLevel";      
-    }
-  }
-  
-  
-  
-  
-
-  augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:component-list" {
-    description
-      "This set of data definitions extends the component list of the Maintenance
-       Entity Group (as defined in Y.1731) or Maintenance Association (as defined
-       in 802.1q)";
-    reference
-      "[MEF7.1] 9.2.2";
-
-    leaf mep-port-status-tlv-included {
-      type boolean;
-      default true;
-
-      description
-        "Indicates whether a Port Status TLV is included in CCM frame
-         transmission. A value of 'true' indicates that the Port Status
-         TLV is to be included. A value of 'false' indicates that the
-         Port Status TLV is not to be included.";
-      reference
-        "[MEF7.1] 9.2.2";
-    }
-
-    leaf mep-interface-status-tlv-included {
-      type boolean;
-      default true;
-
-      description
-        "Indicates whether a Interface Status TLV is included in CCM frame
-         transmission. A value of 'true' indicates that the Interface Status TLV
-         is to be included. A value of 'false' indicates that the Interface
-         Status TLV is not to be included.";
-      reference
-        "[MEF7.1] 9.2.2";
-    }
-  }
-  
-  
-  
-
-  augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point" {
-    description
-      "This set of data definitions extends the MEG End Point (as described in
-       Y.1731) or Maintenance association End Point (as described in 802.1q)
-       defined in the MEF CFM module (MEF-CFM)";
-    reference
-      "[MEF7.1] 9.2.2";
-
-    leaf operational-state {
-      type operational-state-type;
-
-      config false;
-
-      description
-        "This attribute indicates the operational state (current capability) of
-         the MEP.";
-      reference
-        "[MEF7.1] 9.2.5";
-    }
-
-    leaf connectivity-status {
-      type enumeration {
-        enum active {
-        description
-          "Refers to the ability to exchange SOAM PDU frames among all the UNIs 
-           of an EVC.";
-        }
-        enum partially-active {
-        description
-          "Refers to the ability to exchange SOAM PDU frames among some but not
-           all the UNIs of an EVC.";
-        }
-        enum inactive {
-        description
-          "Refers to the ability to exchange SOAM PDU frames among any of the UNIs
-           of an EVC.";
-        }
-      }
-      config false;
-
-      description
-        "This attribute indicates the connectivity status for a MEP in an EVC
-         MEs. An 'active' MEP Connectivity Status refers to the ability
-         to exchange SOAM PDU frames among all the UNIs of an EVC. A
-         'partially-active' MEP Connectivity Status refers to the
-         ability to exchange SOAM PDU frames among some but not all the
-         UNIs of an EVC. An 'inactive' MEP Connectivity Status refers to
-         the inability to exchange SOAM PDU frames among any of the UNIs
-         of an EVC.";
-      reference
-        "[MEF7.1] 9.2.5";
-    }
-
-    leaf port-status {
-      type msea:port-status-type;
-      config false;
-
-      description
-        "An enumerated value of the Port status TLV sent in the last CCM from the
-         local MEP or the default value psNoPortStateTLV indicating no
-         CCM has been sent or no Port Status TLV has been sent.";
-      reference
-        "[802.1q] 17.5";
-    }
-
-    leaf interface-status {
-      type msea:interface-status-type;
-      config false;
-
-      description
-        "An enumerated value of the Interface status TLV sent in the last CCM
-         from the local MEP or the default value no-status-tlv
-         indicating no CCM has been sent or no Interface Status TLV has
-         been sent.";
-      reference
-        "[802.1q] 17.5";
-    }
-
-    leaf last-defect-sent {
-      type msea-cfm:fault-alarm-defect-bits-type;
-      config false;
-
-      description
-        "This attribute indicates the state of the previous MEP defects,
-         that was sent with the previous
-         mep-defect-alarm notification. It is always some *previous*
-         value of cfm:active-defects. Once an mep-defect-alarm is sent
-         the mep-defect-alarm that was sent in the notification
-         updates the contents of this leaf.
-
-         If no mep-defect-alarm notification has been sent the value of
-         this leaf is '0'.";
-      reference
-        "[MEF31] MEF-SOAM-FM-MIB.mefSoamMepStatusLastDefectSentStatus";
-    }
-
-    leaf rdi-transmit-status {
-      type boolean;
-      config false;
-
-      description
-        "Indicates whether the local MEP is generating a RDI bit in the CCM that
-         it transmits. A value of 'true' indicates that a RDI bit was
-         set in the last CCM that the MEP transmitted. A value of
-         'false' indicates that the last CCM transmitted by the MEP did
-         not set the RDI bit or that a CCM has never been transmitted by
-         the MEP.";
-      reference
-        "[MEF7.1] 9.2.2";
-    }
-
-  } //end of MEP augmentation
-
-
-  augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-cfm:loopback" {
-    description
-      "This set of data definitions extends on-demand Ethernet OAM Fault
-       Management Loopback function (ETH-LB) as defined in Y.1731 and
-       802.1q and defined in MEF-CFM";
-    reference
-      "[MEF7.1] 9.3.2";
-
-    leaf multicast-enabled {
-      type boolean;
-      default false;
-
-      description
-        "This attribute specifies whether a MEP uses unicast or multicast
-         to send the ETH-LB messages (LBM). The 802.1ag standard only allows
-         unicast LBM. ITU-T Y.1731 allows LBM to be multicast. This attribute
-         allows the MEP to send either multicast or unicast LBM on a per MEP
-         basis.
-
-         The value 'true' indicates multicast is enabled.
-
-         The value 'false' indicates unicast is enabled.";
-      reference
-        "[MEF7.1] 9.3.2.1";
-    }
-
-    leaf interval {
-      type uint16 {
-        range "0..2096";
-      }
-      units milliseconds;
-      default 1000;
-
-      description
-        "This attribute specifies the period between LBM transmissions in an LB
-         Session. For an LB Session, the period for LBM transmission
-         is configurable in the range 0 and 2096 milliseconds . Granularity is 1 ms.
-         The transmission of the next LBM is not dependent upon the
-         reception the first LBR. The next LBM is sent out based upon
-         the interval count.
-
-         An interval count of '0' indicates that the subsequent LBM is sent
-         out with the minimum possible delay.";
-      reference
-        "[MEF7.1] 9.3.2.1";
-    }
-
-    leaf frame-size {
-      type uint16 {
-        range "64..9600";
-      }
-      units "bytes";
-
-      description
-        "This attribute specifies the LBM frame size. For an LB Session, the size
-         of the LBM frame is configurable to any Ethernet frame size
-         between 64 Bytes and the maximum transmission unit of the EVC.
-
-         The range of frame sizes from 64 through 2000 octets, in 4 octet increments,
-         MUST be supported, and the range of frame sizes from 2004 through 9600
-         octets, in 4 octet increments, SHOULD be supported.
-
-         The adjustment to the frame size of the standard LBM PDU size is accomplished
-         by the addition of a Data TLV or a Test TLV.";
-      reference
-        "[MEF7.1] 9.3.2.1";
-    }
-
-
-    leaf timeout {
-      type yang:gauge32 {
-        range "5000";
-      }
-      default 5000;
-
-      description
-        "This attribute specifies the maximum amount of time to receive an LBR in
-         response to a LBM. If a LBR is not received within the timeout
-         value it is considered lost.";
-      reference
-        "[MEF31] MEF-SOAM-FM-MIB.mefSoamLbCfgTimeout";
-    }
-
-    list responses {
-      key "receive-order";
-      config false;
-
-      description
-        "A list of responses from a Multicast Loopback Message. This are shown only when multicast is enabled";
-      reference
-        "[MEF31] MEF-SOAM-FM-MIB.mefSoamLbrMulticastTable";
-
-      leaf receive-order {
-        type int8;
-
-        description
-          "Loopback transaction identifier returned by a previous loopback message
-           command, indicating which loopback request is returned.";
-        reference
-          "[MEF31] MEF-SOAM-FM-MIB.mefSoamLbrMulticastTransId";
-      }
-      
-      leaf multicast-reply-mac {
-        type yang:mac-address;
-          
-        description
-          "Source MAC address returned in the LBR Ethernet frame";
-        reference
-          "[802.1q] 21.7, [Y.1731] 7.2,
-           [MEF31] MEF-SOAM-FM-MIB.mefSoamLbrMulticastReplyMac";
-      }
-    }
-  }
-  
-  
-  
-  augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-cfm:linktrace" {
-		description
-		"Augments to support the enhanced CFM Linktrace functionality";
-		reference
-		"[MEF30] 8.4";
-
-		leaf ltm-msgs-transmitted {
-			type yang:zero-based-counter32;
-			config false;
-
-			description
-			"This attribute contains the count of the total number of LTM messages
-			transmitted by the MEP";
-			reference
-			"[MEF31] MEF-SOAM-FM-MIB.mefSoamLtLtmTransmitted";
-		}
-
-		leaf ltr-msgs-received {
-			type yang:zero-based-counter32;
-			config false;
-
-			description
-			"This attribute contains the count of the total number of LTR messages
-			received by the MEP";
-			reference
-			"[MEF31] MEF-SOAM-FM-MIB.mefSoamLtLtrReceived";
-		}
-
-		leaf ltm-msgs-received {
-			type yang:zero-based-counter32;
-			config false;
-
-			description
-			"This attribute contains the count of the total number of LTM messages
-			received by the MEP";
-			reference
-			"[MEF31] MEF-SOAM-FM-MIB.mefSoamLtLtmReceived";
-		}
-
-		leaf ltr-msgs-transmitted {
-			type yang:zero-based-counter32;
-			config false;
-
-			description
-			"This attribute contains the count of the total number of LTR messages
-			transmitted by the MEP";
-			reference
-			"[MEF31] MEF-SOAM-FM-MIB.mefSoamLtLtrTransmitted";
-		}
-	}
-
-
-  //
-  // Data definitions related to MEF SOAM FM
-  //
-  augment "/msea-cfm:mef-cfm" {
-	description 
-      "A set of data definitions related to FM event notifications.";
-    reference
-      "[MEF31] MEF-SOAM-FM-MIB.mefSoamFmNotificationCfg";
-	  
-	  container notification-configuration {
-		description
-		  "A set of data definitions related to FM event notifications.";
-		reference
-		  "[MEF31] MEF-SOAM-FM-MIB.mefSoamFmNotificationCfg";
-		
-		leaf active-alarms {
-			type bits {
-			  bit fault-alarm { 
-				  description "Send notifications when a specific MEP has a persistent defect condition";
-			  }
-
-			  bit mep-defect-alarm { 
-				  description "Send notifications when the value of mep-defects changes";
-			  }
-			  
-			  bit mep-operational-state-changed { 
-				  description "Send notifications when the value of a MEP's operational-state changes";
-			  }
-			}
-			description "Configure the fault notification generator to enable the alarms given in 
-				the bitmask list.";
-		}
-	  }
-  }
-
-  //
-  // Notifications related to MEF SOAM FM
-  //
-
-  notification mep-defect-alarm {
-    description
-      "A mep-defect-alarm notification is generated when the value of
-       mep-defects changes. It indicates a persistent defect in
-       the MEP. This notification is sent whenever the
-       cfm:active-defects of the MEP changes, regardless of the
-       cfm:highest-priority-defect-found leaf.
-
-       The inclusion of the cfm:remote-mep-state leaf is
-       optional. It shall not be included if the defect is not based
-       upon a specific MEP instance, e.g.. bDefErrorCCM.";
-
-    reference
-      "[MEF31] MEF-SOAM-FM-MIB.mefSoamMepDefectAlarm";
-
-	uses msea-cfm:mep-notification-reference;
-	
-	leaf remote-mep {
-		type msea:mep-id-type;
-		description "Remote MEP identifier";
-	}
-
-    leaf last-defect-sent {
-      type msea-cfm:fault-alarm-defect-type;
-
-      description
-        "The last defect sent on the specific MEP";
-    }
-    leaf active-defects {
-      type msea-cfm:fault-alarm-defect-bits-type;
-      description
-        "The currently active defects on the specific MEP.";
-    }
-    
-    leaf remote-mep-state {
-      type msea-cfm:remote-mep-state-type;
-
-      description
-        "The value of the remote MEP state on a specific MEP";      
-      reference
-        "[802.1q] 12.14.7.6.3:b";
-    }
-  }
-  
-  notification mep-operational-state-changed {
-    description
-      "A mep-operational-state-changed notification is sent when the value of a
-       MEP's operational-state changes. It indicates an operational
-       state change in the MEP. This notification is sent whenever the
-       operational status of the MEP changes.";
-    reference
-      "[MEF31] MEF-SOAM-FM-MIB.mefSoamMepOperStatusAlarm";
-
-	uses msea-cfm:mep-notification-reference;
-
-    leaf operational-state {
-      type operational-state-type;
-
-      description
-        "The operational-state leaf of the affected MEP";
-    }
-  }
-}
-
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-pm.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-pm.yang
deleted file mode 100644
index 21c05a6..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-soam-pm.yang
+++ /dev/null
@@ -1,1479 +0,0 @@
-module msea-soam-pm {
-
-	namespace "http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm";
-	prefix "msea-soam-pm"; //MicroSemi EdgeAssure (msea)
-
-	import ietf-yang-types {
-		prefix yang;
-		revision-date 2013-07-15;
-	}
-
-	import msea-cfm {
-		prefix msea-cfm;
-	}
-
-	import msea-types {
-		prefix msea;
-	}
-
-	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 is a fork of the original mef-soam-pm YANG Module defined in MEF 39
-	for the management of Ethernet Services Operations, Administration and
-	Maintenance for Performance Monitoring and extends the Connectivity Fault
-	Management (CFM) YANG modules.
-	This fork is done specifically to suit the EdgeAssure which has some extra
-	constraints that are not handled by the original YANG.
-
-	Copyright 2016 Microsemi Inc.
-	All rights reserved.";
-
-	revision "2016-02-29" {
-		description
-		"Initial EdgeAssure version forked from mef-soam-pm@2012-04-16 - Sean Condon, Microsemi";
-		reference
-		"Service OAM Fault Management YANG Modules (MEF 39), April 2012";
-	}
-
-	//
-	// Type definitions related to MEF SOAM PM
-	//
-
-	typedef suspect-status-type {
-		type boolean;
-		description
-		"This boolean data type indicates whether the measurement interval
-		has been marked as suspect.
-
-		The object is set to false at the start of a measurement
-		interval. It is set to true when there is a discontinuity in the
-		performance measurements during the measurement interval.
-		Conditions for a discontinuity include, but are not limited to
-		the following:
-
-		1 - The local time-of-day clock is adjusted by at least 10
-		seconds
-		2 - The conducting of a performance measurement is halted before
-		the current measurement interval is completed
-		3 - A local test, failure, or reconfiguration that disrupts
-		service";
-		reference
-		"[MEF SOAM PM IA] R39, R40, 41 and R42";
-	}
-
-	typedef performance-monitoring-interval-type {
-		type uint32 {
-			range "3..3600000";
-		}
-		units ms;
-		description
-		"This integer data type indicates the transmission time between the
-		SOAM PM frames for session, in ms.";
-	}
-
-
-	typedef session-status-type {
-		type enumeration {
-			enum active {
-				description
-				"Indicates the measurement instance is active.";
-			}
-			enum not-active {
-				description
-				"Indicates the measurement instance is not active.";
-			}
-		}
-
-		description
-		"This enumeration data type defines the status of PM session of a MEP.";
-		reference
-		"MEF-SOAM-TC-MIB.MefSoamTcStatusType";
-	}
-
-
-	typedef measurement-bin-type {
-		type enumeration {
-			enum two-way-frame-delay {
-				description
-				"Indicates a measurement bin for two-way Frame Delay.";
-			}
-
-			enum two-way-inter-frame-delay-variation {
-				description
-				"Indicates a measurement bin for two-way Inter-frame Delay
-				Variation.";
-			}
-		}
-
-		description
-		"This enumeration data type indicates whether the bin number is for Frame
-		Delay and Inter-Frame Delay Variation.";
-		reference
-		"MEF-SOAM-TC-MIB.MefSoamTcDelayMeasurementBinType";
-	}
-
-	//
-	// Groupings related to MEF SOAM PM
-	//
-
-	grouping remote-mep-group {
-		description
-		"This grouping includes objects which identify a remote MEP.";
-		choice remote-mep {
-			mandatory true;
-			description
-			"The remote MEP can be identified by either a MAC address or a MEP ID";
-
-			case mac-address {
-				leaf mac-address {
-					type yang:mac-address;
-//					msea:not-changeable;
-
-					description
-					"The Target MAC Address Field to be transmitted: A unicast
-					destination MAC address.
-
-					This object is only valid for the entity transmitting the
-					SOAM Loss and Delay Measurement frames and is ignored by
-					the entity receiving SOAM Loss and Delay Measurement
-					frames.";
-				}
-			}
-			case mep-id {
-				leaf mep-id {
-					type leafref {
-						path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:remote-meps";
-					}
-//					msea:not-changeable;
-					
-					description
-					"The Maintenance Association End Point Identifier of another MEP in
-					the same Maintenance Association to which the SOAM Loss or Delay
-					Measurement frame is to be sent.
-
-					This object is only valid for the entity transmitting the
-					SOAM Loss Measurement or Delay Measurement frames and is
-					ignored by the entity receiving SOAM Loss Measurement or
-					Delay Measurement frames.";
-				}
-			}
-		}
-	}
-
-	grouping measurement-timing-group {
-		description
-		"This grouping includes objects used for proactive and on-demand
-		scheduling of PM measurement sessions.";
-
-		container start-time {
-			description
-			"This container defines the session start time";
-
-			choice start-time {
-				default immediate;
-				description
-				"Measurement session start time can be immediate, relative or
-				absolute.";
-
-				container immediate {
-					presence "Start the measurement session immediately.";
-
-					description
-					"This object specifies the start time to be immediately at the time
-					of session creation.";
-				}
-			}
-		}
-
-		container stop-time {
-			description
-			"This container defines the session stop time";
-
-			choice stop-time {
-				default none;
-				description
-				"Measurement session stop time can be none, relative or
-				absolute.";
-
-				container none {
-					presence "Never end the measurement session.";
-
-					description
-					"This object specifies the measurement session to never end.";
-				}
-			}
-		}
-	}
-
-	grouping loss-measurement-stats-group {
-		description
-		"This grouping includes statistics objects for a SOAM Loss Measurement
-		session.";
-
-		leaf suspect-status {
-			type suspect-status-type;
-
-			description
-			"Whether the Measurement Interval has been marked as suspect.
-
-			The object is set to false at the start of a measurement
-			interval. It is set to true when there is a discontinuity in
-			the performance measurements during the Measurement Interval.
-			Conditions for a discontinuity include, but are not limited to
-			the following:
-
-			1 - The local time-of-day clock is adjusted by at least 10 seconds
-			2 - The conducting of a performance measurement is halted before the
-			current Measurement Interval is completed
-			3 - A local test, failure, or reconfiguration that disrupts service";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsSuspect";
-		}
-
-		leaf forward-transmitted-frames {
-			type yang:gauge32;
-			mandatory true;
-
-			description
-			"This object contains the number of frames transmitted in the forward
-			direction by this MEP.
-
-			For a PM Session of types lmm or ccm this includes Ethernet
-			Service Frames and SOAM PDUs that are in a higher MEG level
-			only.
-
-			For a PM Session of type slm this includes the count of SOAM
-			ETH-SLM frames only.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsForwardTransmittedFrames";
-		}
-
-		leaf forward-received-frames {
-			type yang:gauge32;
-			mandatory true;
-
-			description
-			"This object contains the number of frames received in the forward
-			direction by this MEP.
-
-			For a PM Session of types lmm or ccm this includes Ethernet
-			Service Frames and SOAM PDUs that are in a higher MEG level only.
-
-			For a PM Session of type slm this includes the count of SOAM
-			ETH-SLM frames only.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsForwardReceivedFrames";
-		}
-
-		leaf forward-average-frame-loss-ratio {
-			type uint32 {
-				range "0..100000";
-			}
-			units milli-percent;
-
-			description
-			"This object contains the average one-way frame loss ratio in the
-			forward direction calculated by this MEP for this Measurement
-			Interval. The FLR value is a ratio that is expressed as a
-			percent with a value of 0 (ratio 0.00) through 100000 (ratio
-					1.00).
-
-			Units are in milli-percent, where 1 indicates 0.001 percent.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsForwardAvgFlr";
-		}
-
-		leaf backward-transmitted-frames {
-			type yang:gauge32;
-			mandatory true;
-
-			description
-			"This object contains the number of frames transmitted in the backward
-			direction by this MEP.
-
-			For a PM Session of type lmm or ccm this includes Ethernet
-			Service Frames and SOAM PDUs that are in a higher MEG level
-			only.
-
-			For a PM Session of type slm this includes the count of SOAM
-			ETH-SLM frames only.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsBackwardTransmittedFrames";
-		}
-
-		leaf backward-received-frames {
-			type yang:gauge32;
-			mandatory true;
-
-			description
-			"This object contains the number of frames received in the backward
-			direction by this MEP.
-
-			For a PM Session of type lmm this includes Ethernet Service
-			Frames and SOAM PDUs that are in a higher MEG level only.
-
-			For a PM Session of type slm this includes the count of SOAM
-			ETH-SLM frames only.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsBackwardReceivedFrames";
-		}
-
-		leaf backward-average-frame-loss-ratio {
-			type uint32 {
-				range "0..100000";
-			}
-			units milli-percent;
-
-			description
-			"This object contains the average one-way frame loss ratio in the
-			backward direction calculated by this MEP for this Measurement
-			Interval. The FLR value is a ratio that is expressed as a
-			percent with a value of 0 (ratio 0.00) through 100000 (ratio
-					1.00).
-
-			Units are in milli-percent, where 1 indicates 0.001 percent.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsBackwardAvgFlr";
-		}
-
-		leaf soam-pdus-sent {
-			type yang:gauge32;
-			description
-			"This object contains the count of the number of SOAM PDUs sent during
-			this Measurement Interval.
-
-			This object applies when type is lmm, slm or ccm. It indicates
-			the number of LMM, CCM, or SLM SOAM frames transmitted.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsSoamPdusSent";
-		}
-
-		leaf soam-pdus-received {
-			type yang:gauge32;
-
-			description
-			"This object contains the count of the number of SOAM PDUs PDUs received
-			in this Measurement Interval.
-
-			This object applies when type is lmm, slm, or ccm. This object
-			indicates the number of LMR, CCM, or SLR SOAM frames received.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamLmCurrentStatsSoamPdusReceived";
-		}
-	}
-
-	grouping delay-measurement-stats-group {
-		description
-		"This grouping includes statistics objects for a SOAM Delay Measurement
-		session.";
-
-		leaf suspect-status {
-			type suspect-status-type;
-			description
-			"Whether the Measurement Interval has been marked as suspect.
-
-			The object is to be set to false at the start of a measurement
-			interval. It is set to true when there is a discontinuity in
-			the performance measurements during the Measurement Interval.
-			Conditions for a discontinuity include, but are not limited to
-			the following:
-
-			1 - The local time-of-day clock is adjusted by at least 10 seconds
-			2 - The conducting of a performance measurement is halted before the
-			current Measurement Interval is completed
-			3 - A local test, failure, or reconfiguration that disrupts service";
-		}
-
-		leaf frame-delay-two-way-min {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the minimum two-way frame delay calculated by this
-			MEP for this Measurement Interval.
-
-			This object is undefined if measurement-type is dm1-transmitted
-			or dm1-received.";
-		}
-
-		leaf frame-delay-two-way-max {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the maximum two-way frame delay calculated by this
-			MEP for this Measurement Interval.
-
-			This object is undefined if measurement-type is dm1DmTx or
-			dm1-received.";
-		}
-
-		leaf frame-delay-two-way-average {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the average two-way frame delay calculated by this
-			MEP for this Measurement Interval.
-
-			This object is undefined if measurement-type is dm1-transmitted or
-			dm1-received.";
-		}
-
-		leaf inter-frame-delay-variation-two-way-min {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the minimum two-way inter-frame delay interval
-			calculated by this MEP for this Measurement Interval.
-
-			The value of this object is undefined when measurement-type is
-			dm1-transmitted or dm1-received.";
-		}
-
-		leaf inter-frame-delay-variation-two-way-max {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the maximum two-way inter-frame delay interval
-			calculated by this MEP for this Measurement Interval.
-
-			The value of this object is undefined when measurement-type is
-			dm1-transmitted or dm1-received.";
-		}
-
-		leaf inter-frame-delay-variation-two-way-average {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object contains the average two-way inter-frame delay interval
-			calculated by this MEP for this Measurement Interval.
-
-			The value of this object is undefined when measurement-type is
-			dm1-transmitted or dm1-received.";
-		}
-
-		leaf soam-pdus-received {
-			type yang:gauge32;
-			description
-			"This object contains the count of the number of SOAM PDUs received in
-			this Measurement Interval.
-
-			This object indicates the number of DMR and 1DM SOAM frames
-			received. This object applies when measurement-type is dmm or
-			dm1-received and is undefined if measurement-type is
-			dm1-transmitted.";
-		}
-	}
-
-	grouping delay-measurement-bins-content-group {
-		description
-		"This grouping contains result measurement bin objects for a SOAM Delay
-		Measurement session.";
-
-		leaf type {
-			type measurement-bin-type;
-
-			description
-			"This object specifies whether the bin number is for Frame Delay and
-			Inter-Frame Delay Variation.";
-		}
-
-		leaf number {
-			type uint8 {
-				range "1..4";
-			}
-
-			description
-			"This object specifies the bin number for the configured boundary.  The
-			first bin has bin number 1.";
-		}
-
-		leaf lower-bound {
-			type yang:gauge32;
-			units "μs";
-
-			description
-			"This object specifies the lower boundary for a measurement bin. The
-			upper boundary is defined by the next bin value or infinite for
-			the last bin defined. The measurement boundary for each
-			measurement bin is to be larger than the measurement boundary
-			of the preceding measurement bin. By default, the next bin is
-			set to 5000us larger than the lower bin boundary.
-
-			The values in a bin boundary object represents the time range
-			used to segregate delay data into the appropriate statistical
-			data bin. For five bins with default values, each bin has the
-			following time range:
-
-			bin 1 = 0, range is 0us
-			bin 2 = 5000, range is 5,000us
-			bin 3 = 10000, range is 10,000us
-			bin 4 = 15000, range is 15,000us
-			bin 5 = 20000, range is 20,000us
-
-			The first bin boundary (number set to 1) always contains the
-			value of 0. Attempting to write a non-zero value to this bin
-			will result in an error.";
-		}
-
-		leaf counter {
-			type yang:gauge32;
-			config false;
-
-			description
-			"This object contains the count of the number of completed measurements
-			initiated in this Measurement Interval whose value falls within
-			the range specified for this bin (that is, greater than or
-					equal to the measurement boundary for the bin, and (unless the
-							bin is the last bin) less than the measurement boundary for the
-					following bin.";
-			reference
-			"MEF-SOAM-PM-MIB.mefSoamDmCurrentStatsBinsCounter";
-		}
-	}
-
-	grouping delay-measurement-bins-group {
-		description
-		"This grouping contains the top-level structure for the three types of
-		measurements (frame delay and inter frame delay variation)";
-
-		container bins {
-			description
-			"This container defines the bins content for FD, IFDR, and FDR
-			sessions.";
-
-			list frame-delay {
-				key "type number";
-				uses delay-measurement-bins-content-group;
-
-				description
-				"Data definitions related to frame delay bins content.";
-			}
-
-			list inter-frame-delay-variation {
-				key "type number";
-				uses delay-measurement-bins-content-group;
-
-				description
-				"Data definitions related to inter frame delay bins content.";
-			}
-
-		}
-	}
-	
-	
-	grouping bin-lower-limit-override-attribs {
-		
-		description 
-		"Bin 1 of each type will always be 0.
-		The upper limit of each bin will be defined by the lower
-		limit of the next bin. The upper limit of the last bin 
-		is unbounded.";
-		
-		leaf bin2-lower-limit {
-			type uint32 {
-				range "10..max";
-			}
-			units "μs";
-			must "current() < ../bin3-lower-limit" {
-				error-message "Bin 2 must be between 0 and bin 3 lower limit";
-				error-app-tag "msea-soampm-must-01";
-			}
-			description "The lower limit of the bin 2 in microseconds";
-		}
-
-		leaf bin3-lower-limit {
-			type uint32 {
-				range "10..max";
-			}
-			units "μs";
-			must "current() > ../bin2-lower-limit and current() < ../bin4-lower-limit" {
-				error-message "Bin 3 must be between bin 2 and bin 4 lower limits";
-				error-app-tag "msea-soampm-must-02";
-			}
-			description "The lower limit of the bin 3 in microseconds";
-		}
-
-		leaf bin4-lower-limit {
-			type uint32 {
-				range "10..max";
-			}
-			units "μs";
-			must "current() > ../bin3-lower-limit" {
-				error-message "Bin 4 must be greater than 3 lower limit";
-				error-app-tag "msea-soampm-must-03";
-			}
-			description "The lower limit of the bin 4 in microseconds";
-		}
-	}
-
-	//
-	// Augments into CFM related to MEF SOAM PM
-	//
-	
-	augment "/msea-cfm:mef-cfm/msea-cfm:pm-global" {
-		
-		description "High level attributes that apply to the whole device generally
-				or that apply equally across all instances of a child entity.
-				Delay measurement services should be stopped before changing 
-				these values, including the limit overrides";
-		
-		leaf dm-bins-per-fd-interval {
-			type uint16 {
-				range "4";
-			}
-			default 4;
-
-			description
-			"This object specifies the number of measurement bins per Measurement
-			Interval for Frame Delay measurements.
-
-			Fixed at 4.";
-		}
-
-		leaf dm-bins-per-ifdv-interval {
-			type uint16 {
-				range "4";
-			}
-			default 4;
-
-			description
-			"This object specifies the number of measurement bins per Measurement
-			Interval for Inter-Frame Delay Variation measurements.
-
-			Fixed at 4.";
-		}
-		
-			
-		container bin-lower-limit-override-two-way-frame-delay {
-
-			uses bin-lower-limit-override-attribs {
-				refine bin2-lower-limit {
-					default 10000;
-				}
-				refine bin3-lower-limit {
-					default 20000;
-				}
-				refine bin4-lower-limit {
-					default 37000;
-				}
-			}
-
-			description "Override of the default Measurement Bin default 
-					lower limits for Two Way Frame Delay.";
-
-		}
-
-		container bin-lower-limit-override-two-way-ifdv {
-
-			uses bin-lower-limit-override-attribs {
-				refine bin2-lower-limit {
-					default 3000;
-				}
-				refine bin3-lower-limit {
-					default 8000;
-				}
-				refine bin4-lower-limit {
-					default 100000;
-				}
-			}
-
-			description "Override of the default Measurement Bin default 
-					lower limits for Two Way Interframe Delay Variation.";
-		}
-	}
-	
-
-	augment "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association" +
-	"/msea-cfm:maintenance-association-end-point" {
-		description
-		"This set of data definitions extends the MEG End Point (as described
-		Y.1731) or Maintenance End Point (as described in 802.1q) defined
-		in the MEF CFM module (MEF-CFM), specifically with regards to
-		Loss Measurement and Delay Measurement.";
-
-		container loss-measurements {
-			description
-			"This container contains a collection of data definitions related to
-			Loss Measurements.";
-
-			list loss-measurement {
-				key lm-id;
-				max-elements 16;
-
-				description
-				"A list of Loss Measurement PM Sessions where each instance is uniquely
-				identified by an id attribute.
-				This grouping includes configuration objects for the Frame Loss
-				Measurement function defined in [Y.1731] and [MEF SOAM PM IA].";
-				reference
-				"MEF-SOAM-PM-MIB.mefSoamLmCfgTable, [Y.1731] and [MEF SOAM PM IA]";
-
-				leaf lm-id {
-					type uint8 {
-						range 1..16;
-					}
-
-					description
-					"This object uniquely identifies a scheduled loss measurement.";
-				}
-				
-				must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-soam-pm:loss-measurement) <= 128" {
-					error-message "The maximum number of LMs on the whole device must not exceed 128";
-					error-app-tag "msea-soampm-must-04";
-				}
-
-				uses remote-mep-group;
-				uses measurement-timing-group;
-				
-				leaf administrative-state {
-					type boolean;
-					default false;
-
-					description
-					"The administrative state of the MEP. Setting to true starts this Loss Measurement";
-				}
-
-				leaf measurement-type {
-					type enumeration {
-						enum slm {
-							description
-							"SLM SOAM PDU generated and received SLR responses tracked.";
-						}
-					}
-					default slm;
-
-					description
-					"This object specifies what type of Loss Measurement will be
-					performed.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgType";
-				}
-
-				leaf version {
-					type enumeration {
-						enum Y.1731-2008 {
-							description
-							"Indicates the PDU formats defined in Y.1731-2008";
-						}
-					}
-					default Y.1731-2008;
-
-					description
-					"This object indicates the version of the PDUs used to perform Loss
-					Measurement.
-					The exact PDUs to use are specified by this object in
-					combination with measurement-type.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgVersion";
-				}
-
-				leaf enabled-counters {
-					type bits {
-						bit forward-transmitted-frames {description "Count the number of frames transmitted in the forward direction by this MEP";}
-						bit forward-received-frames {description "Count the number of frames received in the forward direction by this MEP";}
-						bit forward-average-flr {description "Calculate the average one-way frame loss ratio in the forward direction calculated by this MEP";}
-						bit backward-transmitted-frames {description "Count the number of frames transmitted in the backward direction by this MEP";}
-						bit backward-received-frames {description "Count the number of frames received in the backward direction by this MEP";}
-						bit backward-average-flr {description "Calculate the average one-way frame loss ratio in the backward direction calculated by this MEP";}
-						bit soam-pdus-sent {description "Count of the number of SOAM PDUs sent during this Measurement Interval";}
-						bit soam-pdus-received {description "Count of the number of SOAM PDUs received during this Measurement Interval";}
-				        bit measured-stats-forward-measured-flr {description "Measure the Frame Loss Ratio in the forward direction calculated by this MEP from the last received SOAM PDU";}
-				        bit measured-stats-backward-measured-flr {description "Measure the Frame Loss Ratio in the backward direction calculated by this MEP from the last received SOAM PDU";}
-
-					}
-					default "";
-
-//					msea:not-changeable;
-					
-					description
-					"A vector of bits that indicates the type of SOAM LM counters found in
-					the current-stats and history-stats that are enabled.
-
-					A present bit enables the specific SOAM LM counter. A not present
-					bit disables the SOAM LM counter.
-
-					If a particular SOAM LM counter is not supported the BIT value
-					is not present.
-
-					Not all SOAM LM counters are supported for all SOAM LM types. ";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgMeasurementEnable";
-				}
-
-				leaf message-period {
-					type enumeration {
-						enum 1000ms {
-							description "The default 1000ms message period for LM";
-						}
-						enum 100ms {
-							description "100ms message period for LM";
-						}
-						enum 10ms {
-							description "10ms message period for LM";
-						}
-						enum 3ms {
-							description "3ms message period for LM";
-						}
-					}
-					default 1000ms;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the interval between Loss Measurement OAM message
-					transmission. For Loss Measurement monitoring applications the
-					default value is 1 sec.
-
-					This object is not applicable if measurement-type is set to
-					'ccm' and is ignored for that Loss Measurement Type.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgMessagePeriod";
-				}
-
-				leaf priority {
-					type msea:priority-type;
-					mandatory true;
-//					msea:not-changeable;
-
-					must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id = current()/../../../../../msea-cfm:id]/msea-cfm:maintenance-association[msea-cfm:id = current()/../../../../msea-cfm:id]/msea-cfm:maintenance-association-end-point[msea-cfm:mep-identifier=current()/../../../msea-cfm:mep-identifier]/msea-soam-pm:loss-measurements/msea-soam-pm:loss-measurement[msea-soam-pm:priority=current()]) <= 1" {
-						error-message "The priority of a Loss Measurement must be unique within its MEP";
-						error-app-tag "msea-soampm-must-05";
-					}
-
-					description
-					"This object specifies the priority of frames with Performance
-					Monitoring OAM message information.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgPriority";
-				}
-
-				leaf frame-size {
-					type uint32 {
-						range "64 .. 9600";
-					}
-					units bytes;
-					default 64;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the Loss Measurement frame size between 64 bytes
-					and the maximum transmission unit of the EVC.
-
-					The range of frame sizes from 64 through 2000 octets need to be
-					supported, and the range of frame sizes from 2001 through 9600
-					octets is suggested be supported.
-
-					The adjustment to the frame size of the standard frame size is
-					accomplished by the addition of a Data or Test TLV. A Data or
-					Test TLV is only added to the frame if the frame size is greater
-					than 64 bytes.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgFrameSize";
-				}
-
-				leaf measurement-interval {
-					type uint32 {
-						range "1..525600";
-					}
-					units minutes;
-					default 15;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the Measurement Interval for FLR statistics, in
-					minutes.
-
-					A Measurement Interval of 15 minutes needs to be supported,
-					other intervals may be supported.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmCfgMeasurementInterval";
-				}
-				
-			    leaf number-intervals-stored {
-			      type uint32 {
-			        range "32";
-			      }
-			      default 32;
-			      
-			      description 
-			        "This object specifies the number of completed measurement intervals to
-			         store in the history statistic table.
-			                 
-			         At least 32 completed measurement intervals are to be
-			         stored.";
-			      reference
-			        "MEF-SOAM-PM-MIB.mefSoamLmCfgNumIntervalsStored";
-			    }
-
-				leaf number-intervals-returned {
-					type uint32 {
-						range "2..32";
-					}
-					default 32;
-
-					description
-					"This object specifies the number of completed measurement intervals to
-					return from the history statistic table.
-					The number stored on the device is fixed at 32";
-				}
-
-				leaf session-status {
-					type session-status-type;
-					config false;
-
-					description
-					"This object indicates the current status of the LM session. A value
-					of 'active' indicates the current LM session is active,
-					i.e. the current time lies between the start time and the
-					stop time, and enabled is true. A value of 'not-active'
-					indicates the current LM session is not active, i.e. it has
-					not started yet, has stopped upon reaching the stop time,
-					or is disabled.";
-				}
-
-				leaf measured-forward-flr {
-					type yang:gauge32 {
-						range "0..100000";
-					}
-					units milli-percent;
-					config false;
-
-					description
-					"This object contains the Frame Loss Ratio in the forward direction
-					calculated by this MEP from the last received SOAM PDU. The
-					FLR value is a ratio that is expressed as a percent with a
-					value of 0 (ratio 0.00) through 100000 (ratio 1.00).
-
-					Units are in milli-percent, where 1 indicates 0.001
-					per-cent.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmMeasuredStatsForwardFlr";
-				}
-
-				leaf measured-backward-flr {
-					type yang:gauge32 {
-						range "0..100000";
-					}
-					units milli-percent;
-					config false;
-
-					description
-					"This object contains the Frame Loss Ratio in the backward direction
-					calculated by this MEP from the last received SOAM PDU. The
-					FLR value is a ratio that is expressed as a percent with a
-					value of 0 (ratio 0.00) through 100000 (ratio 1.00).
-
-					Units are in milli-percent, where 1 indicates 0.001
-					percent.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamLmMeasuredStatsBackwardFlr";
-				}
-
-				container current-measurement-stats {
-					config false;
-
-					description
-					"This container contains the results for the current Measurement
-					Interval in a SOAM Loss Measurement session gathered during
-					the interval indicated by measurement-interval.";
-
-					leaf id {
-						type uint32;
-
-						description
-						"The index for the current Measurement Interval for this PM
-						session. This value will become the value for id of the
-						history-measurement-stats list once the Measurement
-						Interval is completed.";
-					}
-
-					leaf start-time {
-						type yang:date-and-time;
-						mandatory true;
-
-						description
-						"The time that the current Measurement Interval started.";
-					}
-
-					leaf elapsed-time {
-						type uint32 {
-							range "0..2147483647";
-						}
-						units "0.01s";
-						mandatory true;
-
-						description
-						"The time that the current Measurement Interval has been running,
-						in 0.01 seconds.";
-					}
-
-					uses loss-measurement-stats-group;
-				}
-
-				list history-measurement-stats {
-					key id;
-					config false;
-					description
-					"This list contains the results for history Measurement
-					Intervals in a SOAM Loss Measurement session.";
-
-					leaf id {
-						type uint32;
-
-						description
-						"The index for the Measurement Interval within this
-						PM session.";
-					}
-
-					leaf end-time {
-						type yang:date-and-time;
-						mandatory true;
-
-						description
-						"The time that the Measurement Interval ended.";
-					}
-
-					leaf elapsed-time {
-						type uint32 {
-							range "0..2147483647";
-						}
-						mandatory true;
-
-						description
-						"The length of time that the Measurement Interval ran for,
-						in 0.01 seconds.";
-					}
-
-					uses loss-measurement-stats-group;
-				}
-			}
-		}
-
-		container delay-measurements {
-			description
-			"This container contains a collection of data definitions related to
-			Delay Measurements. The measurements are persisted as config data
-			with results being retrieved from the device as needed";
-
-			list delay-measurement {
-				key dm-id;
-				max-elements 16;
-
-				description
-				"A list of Delay Measurements where each instance is
-				uniquely identified by an id attribute.
-				This includes configuration objects for the Delay Measurement
-				function defined in [Y.1731] and [MEF SOAM PM IA].";
-				reference
-				"MEF-SOAM-PM-MIB.mefSoamDmCfgTable, [Y.1731], and [MEF SOAM PM IA].";
-
-				leaf dm-id {
-					type uint8 {
-						range 1..16;
-					}
-
-					description
-					"This object uniquely identifies a scheduled delay measurement.";
-				}
-				
-				must "count(/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-soam-pm:delay-measurement) <= 128" {
-					error-message "The maximum number of DMs on the whole device must not exceed 128";
-					error-app-tag "msea-soampm-must-06";
-				}
-
-				uses remote-mep-group;
-				uses measurement-timing-group;
-
-				leaf administrative-state {
-					type boolean;
-					default false;
-
-					description
-					"The administrative state of the MEP. Setting to true starts this Delay Measurement";
-				}
-
-				leaf measurement-type {
-					type enumeration {
-						enum dmm {
-							description
-							"DMM SOAM PDU generated, DMR responses received (one-way or two-way
-							measurements).";
-						}
-					}
-					default dmm;
-
-					description
-					"This object indicates what type of Delay Measurement is to be
-					performed.
-
-					The exact PDUs to use are specified by this object in
-					combination with version.";
-				}
-
-				leaf version {
-					type enumeration {
-						enum Y.1731-2011 {
-							description
-							"Indicates the PDU formats defined in Y.1731-2011.";
-						}
-					}
-					default Y.1731-2011;
-
-					description
-					"This object indicates the version of the PDUs used to perform Delay
-					Measurement.
-
-					The exact PDUs to use are specified by this object in
-					combination with measurement-type.";
-					reference
-					"[Y.1731]";
-				}
-
-				leaf measurement-enable {
-					type bits {
-						bit soam-pdus-received {description "Count of the number of SOAM PDUs received";}
-						bit frame-delay-two-way-bins {description "Capture the two-way frame delay in bins";}
-						bit frame-delay-two-way-min {description "Capture the minimum two-way frame delay";}
-						bit frame-delay-two-way-max {description "Capture the maximum two-way frame delay";}
-						bit frame-delay-two-way-average {description "Calculate the average two-way frame delay";}
-						bit inter-frame-delay-variation-two-way-bins {description "Capture the two-way inter-frame-delay-variation in bins";}
-						bit inter-frame-delay-variation-two-way-min {description "Capture the minimum inter-frame-delay-variation frame delay";}
-						bit inter-frame-delay-variation-two-way-max {description "Capture the maximum inter-frame-delay-variation frame delay";}
-						bit inter-frame-delay-variation-two-way-average {description "Calculate the average inter-frame-delay-variation frame delay";}
-					}
-					default "";
-//					msea:not-changeable;
-
-					description
-					"A vector of bits that indicates the type of SOAM DM counters that
-					are enabled.
-
-					A present bit enables the specific SOAM DM counter.
-
-					A not present bit disables the SOAM DM counter.
-
-					If a particular SOAM DM counter is not supported the BIT value
-					is not present.
-
-					Not all SOAM DM counters are supported for all SOAM DM types.";
-				}
-
-				leaf message-period {
-					type enumeration {
-						enum 1000ms {
-							description "1000ms message period for DM";
-						}
-						enum 100ms {
-							description "100ms message period for DM";
-						}
-						enum 10ms {
-							description "10ms message period for DM";
-						}
-						enum 3ms {
-							description "3ms message period for DM";
-						}
-					}
-					default 100ms;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the interval between Delay Measurement OAM
-					message transmission. For Delay Measurement monitoring applications,
-					the default value is 100ms.";
-				}
-
-				leaf priority {
-					type msea:priority-type;
-					mandatory true;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the priority of frames with Performance
-					Monitoring OAM message information.";
-				}
-
-				leaf frame-size {
-					type uint32 {
-						range "64 .. 9600";
-					}
-					default 64;
-//					msea:not-changeable;
-
-					description
-					"This object specifies the Delay Measurement frame size between 64 bytes
-					and the maximum transmission unit of the EVC.
-
-					The range of frame sizes from 64 through 2000 octets need to be
-					supported, and the range of frame sizes from 2001 through 9600
-					octets is suggested to be supported.
-
-					The adjustment to the frame size of the standard frame size is
-					accomplished by the addition of a Data or Test TLV. A Data or
-					Test TLV is only added to the frame if the frame size is
-					greater than 64 bytes.";
-				}
-
-				leaf measurement-interval {
-					type uint32 {
-						range "1..1440";
-					}
-					units minutes;
-					default 15;
-//					msea:not-changeable;
-
-					description
-					"This object specifies a Measurement Interval in minutes.
-
-					A Measurement Interval 15 minutes needs to be supported, other
-					intervals may be supported.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamDmCfgMeasurementInterval";
-				}
-
-			    leaf number-intervals-stored {
-			      type uint32 {
-			        range "32";
-			      }
-			      default 32;
-			      description 
-			        "This object specifies the number of completed measurement intervals to
-			         store in the history statistic table.
-			                 
-			         At least 32 completed measurement intervals are to be
-			         stored.";
-			      reference
-			        "MEF-SOAM-PM-MIB.mefSoamLmCfgNumIntervalsStored";
-			    }
-
-				leaf number-intervals-returned {
-					type uint32 {
-						range "2..32";
-					}
-					default 32;
-
-					description
-					"This object specifies the number of completed measurement intervals to
-					return from the history statistic table.
-					The number of intervals stored is fixed at 32 on the device";
-
-				}
-
-				leaf session-status {
-					type session-status-type;
-					config false;
-
-					description
-					"This object indicates the current status of the DM session. A value
-					of 'active' indicates the current DM session is active,
-					i.e. the current time lies between the start time and the
-					stop time, and enabled is true. A value of 'not-active'
-					indicates the current DM session is not active, i.e. it has
-					not started yet, has stopped upon reaching the stop time,
-					or is disabled.";
-				}
-
-				leaf frame-delay-two-way {
-					type yang:gauge32;
-					units microseconds;
-					config false;
-
-					description
-					"This object contains the two-way frame delay calculated by this MEP
-					from the last received SOAM PDU.
-
-					This object is undefined is measurement-type is
-					dm1-transmitted or dm1-received.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamDmMeasuredStatsFrameDelayTwoWay";
-				}
-
-				leaf inter-frame-delay-variation-two-way {
-					type yang:gauge32;
-					units microseconds;
-					config false;
-
-					description
-					"This object contains the last two-way inter-frame delay interval
-					calculated by this MEP.
-
-					The value of this object is undefined when measurement-type
-					is dm1-transmitted or dm1-received.";
-					reference
-					"MEF-SOAM-PM-MIB.mefSoamDmMeasuredStatsIfdvTwoWay";
-				}
-
-				container current-stats {
-					config false;
-
-					description
-					"This container contains the results for the current Measurement
-					Interval in a SOAM Delay Measurement session gathered
-					during the interval indicated by measurement-interval.";
-
-					leaf id {
-						type uint32;
-
-						description
-						"The index for the current Measurement Interval for this PM
-						session. This value will become the value for id of the
-						history-measurement-stats list once the Measurement
-						Interval is completed.";
-					}
-					
-					leaf start-time {
-						type yang:date-and-time;
-						mandatory true;
-
-						description
-						"The time that the current Measurement Interval started.";
-					}
-
-					leaf elapsed-time {
-						type uint32 {
-							range "0..2147483647";
-						}
-						mandatory true;
-
-						description
-						"The time that the current Measurement Interval has been running,
-						in 0.01 seconds.";
-					}
-
-					uses delay-measurement-stats-group;
-					uses delay-measurement-bins-group;
-				}
-
-				list history-stats {
-					key id;
-					config false;
-					description
-					"This list contains the results for history Measurement Intervals in
-					a SOAM Delay Measurement session.";
-
-					leaf id {
-						type uint32;
-
-						description
-						"The identifier for the Measurement Interval within this
-						PM session.";
-					}
-
-					leaf end-time {
-						type yang:date-and-time;
-						mandatory true;
-
-						description
-						"The time that the Measurement Interval ended.";
-					}
-
-					leaf elapsed-time {
-						type uint32 {
-							range "0..2147483647";
-						}
-						mandatory true;
-
-						description
-						"The length of time that the Measurement Interval ran for, in 0.01
-						seconds.";
-					}
-
-					uses delay-measurement-stats-group;
-					uses delay-measurement-bins-group;
-				}
-			}
-		}
-	}
-
-	//
-	// RPCs related to MEF SOAM PM
-	//
-	
-  rpc clear-loss-history-stats {
-	description 
-	  "Clear the Loss Measurement history list (history-availability-stats and
-	   history-measurement-stats) for a specific session. All instance
-	   data is deleted.";
-
-	input {
-	  uses msea-cfm:maintenance-association-end-point-reference {
-		  refine maintenance-domain { 
-			  mandatory true; 
-		  }
-		  refine maintenance-association { 
-			  mandatory true; 
-		  }
-		  refine maintenance-association-end-point { 
-			  mandatory true; 
-		  }
-	  }
-
-	  leaf lm-id {
-		type leafref {
-			path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-soam-pm:loss-measurements/msea-soam-pm:loss-measurement/msea-soam-pm:lm-id";
-		}
-		mandatory true;
-
-		description
-		  "The LM ID of the loss measurement session of which the loss
-		   measurement history should be cleared";
-	  }
-	}
-  }
-
-	
-	
-	
-  rpc clear-delay-history-stats {
-	description 
-	  "Clear the Delay Measurement history list (history-stats) for a specific
-	   session. All instance data is deleted.";
-
-	input {
-		uses msea-cfm:maintenance-association-end-point-reference { //Added to specify the MEP SC 10-Dec-15
-		  refine maintenance-domain { 
-			  mandatory true; 
-		  }
-		  refine maintenance-association { 
-			  mandatory true; 
-		  }
-		  refine maintenance-association-end-point { 
-			  mandatory true; 
-		  }
-		}
-
-
-	  leaf dm-id {
-		type leafref {
-			path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:maintenance-association/msea-cfm:maintenance-association-end-point/msea-soam-pm:delay-measurements/msea-soam-pm:delay-measurement/msea-soam-pm:dm-id";
-		}
-		mandatory true;
-
-		description
-		  "The DM ID of the loss measurement session of which the loss
-		   measurement history should be cleared";
-	  }
-	}
-  }
-
-	//
-	// Notifications related to MEF SOAM PM
-	//
-
-}
-
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-types.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-types.yang
deleted file mode 100644
index 8b05aac..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-types.yang
+++ /dev/null
@@ -1,385 +0,0 @@
-module msea-types {
-    
-  namespace "http://www.microsemi.com/microsemi-edge-assure/msea-types";
-  prefix "msea-types"; //MicroSemi EdgeAssure (msea)
-
-  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 module contains a collection of generally useful derived
-    YANG data types for VLans and Meps and such.
-	
-    Copyright 2016 Microsemi Inc.
-    All rights reserved.";
-
-  revision "2016-02-29" {
-    description     
-     "Initial version - Sean Condon, Microsemi";
-    reference
-	 "Eagle EANTC Tail-f Inter-operation Summary Revision 1.0 16th Feb 2016";
-  }
-
-  //
-  // Extensions related to Edge Assure
-  //
-  extension not-changeable {
-	description
-	  "Marks the leaf as being settable at creation time 
-	   only and not writable thereafter";
-  }
-  
-  extension xref-module {
-	description
-	  "For leaf items that have type leafref, this attribute defines
-	  the netopeer module that supports that reference if it is outside
-	  the current module";
-	argument module-name;
-  }
-  
-  extension deprecated {
-	  description 
-	  "For leaf items that have become obsolete. This should generate a 
-	  warning to the user that they are using a deprected attribute";
-  }
-    
-  //
-  // Type definitions related to Edge Assure
-  //
-  typedef mep-id-type {
-    type uint16 {
-      range "1..8191";
-    }
-
-    description
-      "Maintenance association End Point Identifier (MEPID): A small integer,
-       unique over a given Maintenance Association, identifying a
-       specific MEP.";
-    reference
-      "[802.1q] 3.19 and 19.2.1";
-  }
-
-  typedef vlan-id-type {
-    type uint16 {
-      range "1..4094";
-    }
-
-    description
-      "The VLAN-ID that uniquely identifies a VLAN.  This is the 12-bit VLAN-ID
-       used in the VLAN Tag header.";
-
-    reference
-      "[802.1q] 9.6";
-  }
-
-  typedef port-status-type {
-    type enumeration {
-      enum no-status-tlv {
-          description "Indicates either that no CCM has been received or that 
-                       no port status TLV was present in the last CCM received.";
-      }
-      enum blocked {
-          description "Ordinary data cannot pass freely through the port on 
-                       which the remote MEP resides. Value of enableRmepDefect 
-                       is equal to false.";
-      }
-      enum up {
-          description "Ordinary data can pass freely through the port on which
-                       the remote MEP resides. Value of enableRmepDefect is 
-                       equal to true.";
-      }
-    }    
-
-    description
-      "The set of values available from the Port Status TLV in CCM PDUs
-       including the default no-status-tlv";
-
-    reference
-      "[802.1q] 20.19.3, 12.14.7.6.3:f
-       IEEE8021-CFM-MIB.Dot1agCfmPortStatus";
-  }
-
-  typedef interface-status-type {
-    type enumeration {
-      enum no-status-tlv {
-          description "Indicates either that no CCM has been received or that
-                       no interface status TLV was present in the last CCM received.";
-      }
-      enum up {
-          description "The interface is ready to pass packets.";
-      }
-      enum down {
-          description "The interface cannot pass packets.";
-      }
-      enum testing {
-          description "The interface is in some test mode.";
-      }
-      enum unknown {
-          description "The interface status cannot be determined for some reason.";
-      }
-      enum dormant {
-          description "The interface is not in a state to pass		  	  packets but is in a pending state, waiting			  for some external event.";
-      }
-      enum not-present {
-          description "Some component of the interface is missing.";
-      }
-      enum lower-layer-down {
-          description "The interface is down due to state of the lower layer 
-                       interfaces.";
-      }
-    }
-
-    description
-      "The set of values available from the Interface Status TLV in CCM PDUs
-       including the default no-status-tlv";
-    reference
-      "[802.1q] 20.19.4, 12.14.7.6.3:g
-       IEEE8021-CFM-MIB.Dot1agCfmInterfaceStatus";
-  }
-  
-  typedef mac-address-and-uint-type {
-    type binary {
-      length "8";
-    } 
-    description
-      "A MAC address and a two-octet unsigned integer";
-    reference
-      "[802.1q] IEEE8021-CFM-MIB.Dot1agCfmMaintDomainNameType";
-  }
-  
-  typedef mac-address-and-uint-str {
-    type string {
-      pattern '([0-9a-fA-F]{2}[:-]){6}([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[0-2][0-9]|6553[0-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";
-  }
-  
-
-  typedef md-level-type {
-    type uint8 {
-      range "0..7";
-    }
-
-    description
-      "Maintenance Domain Level (MD Level) identifier.  Higher numbers
-       correspond to higher Maintenance Domains, those with the greatest
-       physical reach, with the highest values for customers' CFM PDUs.
-       Lower numbers correspond to lower Maintenance Domains, those with
-       more limited physical reach, with the lowest values for CFM PDUs
-       protecting single bridges or physical links.";
-
-    reference
-      "[802.1q] 18.3, 21.4.1, IEEE8021-CFM-MIB.Dot1agCfmMDLevel";
-  }
-
-  typedef priority-type {
-    type uint8 {
-      range "0..7";
-    }
-
-    description
-      "A 3 bit priority value to be used in the VLAN tag, if present
-       in the transmitted frame.";
-    reference
-      "[802.1q] 12.14.7.3.2:e";
-  }
-  
-  typedef cos-color-type {
-    type enumeration {
-      enum "green" {
-    	  description "Change color to green";
-      }
-      enum "yellow" {
-    	  description "Change color to yellow";
-      }
-      enum "drop" {
-    	  description "Delete color information";
-      }
-    }
-    description
-      "TBD";
-    reference "[MEF23.1].";
-  }
-  
-  typedef service-list-type {
-    type string {
-      length "0..255";
-      pattern "\d*([,:]\d*)*";
-    }
-    description     
-     "An octet string containing a list of item values.
-      
-      An item value is an arbitrary string of octets from
-      ASCII character 0x30 - 0x39, but may not contain 
-      a delimiter character. Delimiter characters are 
-      defined to be one of the following:
-      
-          -  An ASCII comma character (0x2C)
-          -  An ASCII colon character (0x3A)
-      
-      Delimiter characters are used to separate item values
-      in a item list.  Only a single delimiter character may
-      occur between two item values.  A item value may not
-      have a zero length.  These constraints imply certain
-      restrictions on the contents of this object:
-      
-          - There cannot be a leading or trailing delimiter
-            character.
-      
-          - There cannot be multiple adjacent delimiter
-            characters.
-      
-      The 'comma' delimiter separates individual items or a
-      sequence of items. The 'colon' delimiter indicates a range
-      of items from the first item before the colon through the
-      last item after the colon. Individual ranges in the same
-      item list need to be separated by a 'comma'.
-      
-      Some examples of valid item lists are:
-      
-          - ''            -- an empty list
-          - '1234'        -- list of one item
-          - '10,11,12'    -- list of several items
-          - '10:20'       -- a list containing all the valid values from
-                             10 through 20
-      
-      Note that although an item value may not have a length of
-      zero, an empty string is still valid.  This indicates
-      an empty list (i.e. there are no tag values in the list).
-      
-      The use of the item list is to select one or more items at
-      one time with a single object instead of having separate row
-      entries in a table for each individual item.";
-  }
-  
-  
-  typedef service-preservation-type {
-    type enumeration {
-      enum preserve   { 
-		description "The type of service is preserved, either CE-VLAN ID or 
-			CE-VLAN CoS as indicated by the specific object";
-		}
-      enum noPreserve { 
-		description "The type of service is not preserved, either CE-VLAN ID
-			or CE-VLAN CoS as indicated by the specific object.";
-		}
-    }
-    description     
-     "Configures the EVC preservation attributes.";
-    reference       
-     "[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-  }
-
-  typedef service-delivery-type {
-    type enumeration {
-      enum discard { 
-	description "Service Frames are discarded";
-	}
-      enum unconditional { 
-	description "Service Frames are unconditionally delivered no matter the 
-		content of the Service Frame. An example of this is a 
-		Point-to-Point EVC";
-	}
-      enum conditional { 
-	description "Service Frame are conditionally delivered to the 
-		destination UNI. The condition is specified, for example via a
-		bandwidth profile or unicast MAC address learning.";
-	}
-    }
-    description    
-     "A MEF service can have one of three different delivery types.";
-    reference       
-     "[MEF 6.1] 6.0";
-  }
-
-  
-  typedef identifier45 {
-    type string {
-      length "min..45";
-    }
-    description
-      "This type definition accepts any visible ASCII character " +
-      "plus the <space> character.The string must be RFC 2579 " +
-      "Display " +
-      "String but not contain the characters 0.00 through 0.1f " +
-      "It does not accept the <delete> character despite the " +
-      "current MEF specification.";
-    reference "MEF 10.3 [R8], [R9]";
-  }
-  
-  typedef file-name {
-    type string {
-      length "1..45";
-      pattern '[a-zA-Z0-9\-_.]*';
-    }
-    description "Valid file names only";
-  }
-  
-  typedef reset-config-options {
-	  type enumeration {
-		  enum operational {
-			  description "Reset any operational data on the device. Configuration 
-					  for CFM, Y-1564, RFC-2544 and UNI";
-		  }
-		  enum safiltering {
-			  description "Reset only safiltering data on the device.";
-		  }
-		  enum permissions {
-			  description "Reset only permissions data on the device.";
-		  }
-		  enum allnetconf {
-			  description "Reset all NETCONF data - leaves only logs and SSH keys.";
-		  }
-		  enum nuclear {
-			  description "Remove all configuration and history on the device.
-					  Deletes SSH keys. Resets device to factory defaults";
-		  }
-	  }
-  }
-  
-  	grouping mep-config-attribs-noref {
-		description 
-		"Attributes related to the configuration of a MEP";
-	
-		leaf maintenance-domain {
-                type uint8 {
-                   range 1..64;
-                }
-		  description
-		  "A reference to a specific Maintenance Domain.";
-		}
-		
-		leaf maintenance-association {
-                type uint8 {
-                   range 1..64;
-                }
-			description
-			"A reference to a specific Maintenance Association.";
-		}
-		
-		leaf maintenance-association-end-point {
-			type mep-id-type;
-			description
-			"A reference to a specific Maintenance association End Point.";
-		}
-	}
-}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-interface.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-interface.yang
deleted file mode 100644
index c63acea..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-interface.yang
+++ /dev/null
@@ -1,1208 +0,0 @@
-module msea-uni-evc-interface {
-
-	namespace "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-interface";
-	prefix "msea-if"; //MicroSemi EdgeAssure (msea)
-
-	import ietf-yang-types {
-		prefix yang;
-		revision-date 2013-07-15;
-	}
-
-	import msea-types {
-		prefix msea;
-		revision-date 2016-02-29;
-	}
-
-	import ietf-interfaces {
-		prefix "if";
-	}
-
-	import ietf-inet-types {
-		prefix inet;
-	}
-
-	import iana-if-type {
-		prefix "ianaift";
-	}
-	
-	import ietf-netconf-acm {
-		prefix nacm;
-	}
-
-	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 is based on the MEF 40 SNMP model, for the management 
-	objects for the management of User Network Interfaces (UNIs).
-	It has been converted to YANG and modified slightly to suit the
-	EdgeAssure SFP which has some extra constraints that are not handled by
-	the original model
-
-	Copyright 2016 Microsemi Inc.
-	All rights reserved.";
-
-	reference
-	"***************************************************************************
-	Reference Overview
-
-	A number of base documents have been used to create this MIB. The following
-	are the abbreviations for the baseline documents:
-	[MEF 40] refers to SNMP MIB
-	[MEF6.1] refers to MEF 6.1 'Ethernet Services Definitions - Phase 2',
-	April 2008
-	[MEF 6.1.1] refers to MEF 6.1.1 'Layer 2 Control Protocol Handling Amendment
-	to MEF 6.1', January 2012
-	[MEF 7.2] refers to MEF 7.2 'Carrier Ethernet Management Information Model',
-	January 2013
-	[MEF 10.2] refers to MEF 10.2 'Ethernet Services Attributes Phase 2',
-	October 2009
-	[MEF 26.1] refers to MEF 26.1 'External Network Network Interface (ENNI) -
-	Phase 2', January 2012
-	[Q.840.1] refers to 'ITU-T Requirements and analysis for NMS-EMS
-	management interface of Ethernet over Transport and Metro Ethernet
-	Network (EoT/MEN)', March 2007
-	****************************************************************************";
-
-	revision "2016-03-17" {
-		description
-		"Initial Version. Sean Condon - Microsemi";
-		reference "MEF 6.2";
-	}
-
-	typedef MefServiceInterfaceType {
-		type bits {
-//      bit bUni1d1;
-//      bit bUni1d2;
-			bit bUni2d1 {description "Only bUni2d1 is supported by EdgeAssure 1000";}
-//      bit bUni2d2;
-//      bit bEnni;
-//      bit bEnniVuni;
-		}
-
-		default "bUni2d1";
-		description
-		"A MEF Interface can be one of several types:
-
-		bUni1d1 UNI Type 1.1 See MEF 13. Non-multiplexed UNI for services such as EPL,
-		bUni1d2 UNI Type 1.2 See MEF 13. Multiplexed UNI for services such as EVPL,
-		bUni2d1 UNI Type 2.1 See MEF 20 section 7
-		bUni2d2 UNI Type 2.2 See MEF 20 section 7
-		bEnni ENNI
-		bEnniVuni VUNI on an ENNI";
-		reference
-		"[MEF 6.1] 6.0";
-	}
-
-	typedef l2cp-dest-mac-address {
-		type string {
-			pattern '01-80-[cC]2-(00-){2}[02][0-9a-fA-F]|01:80:[cC]2:(00:){2}[02][0-9a-fA-F]';
-		}
-		description
-		"The L2CP Destination MAC address for CoS 
-		Identifier type of 'l2cp' and is ignored for other types.
-
-		Valid values are 01-80-C2-00-00-00 through 01-80-C2-00-00-0F and
-		01-80-C2-00-00-20 through 01-80-C2-00-00-2F
-
-		Values can be upper or lower case and can be separated by hyphen or colon (but not both)";
-	}
-
-	typedef l2cp-destination-address {
-		type enumeration {
-			enum destinationAddressOnly {
-				description "L2CP selection is determined by
-				MAC Destination Address only";
-			}
-
-//						enum daPlusProtocol {
-//							description "L2CP selection is determined by
-//								MAC Destination Address plus
-//								Ethernet protocol";
-//						}
-//						
-//						enum daPlusProtocolPlusSubtype {
-//							description "L2CP selection is determined by
-//							MAC Destination Address plus
-//							Ethernet protocol plus subtype";
-//						}
-		}
-	}
-	
-    typedef ip-address-origin {
-      type enumeration {
-        enum "other" {
-          value 0;
-          description
-            "None of the following.";
-        }
-        enum "static" {
-          value 1;
-          description
-            "Indicates that the address has been statically
-          configured - for example, using NETCONF or a Command Line
-          Interface.";
-        }
-        enum "dhcp" {
-          value 2;
-          description
-            "Indicates an address that has been assigned to this
-          system by a DHCP server.";
-        }
-        enum "link-layer" {
-          value 3;
-          description
-            "Indicates an address created by IPv6 stateless
-          autoconfiguration that embeds a link-layer address in its
-          interface identifier.";
-        }
-        enum "random" {
-          value 4;
-          description
-            "Indicates an address chosen by the system at
-
-          random, e.g., an IPv4 address within 169.254/16, an
-          RFC 4941 temporary address, or an RFC 7217 semantically
-          opaque address.";
-          reference
-            "RFC 4941: Privacy Extensions for Stateless Address
-            	  Autoconfiguration in IPv6
-             RFC 7217: A Method for Generating Semantically Opaque
-            	  Interface Identifiers with IPv6 Stateless
-            	  Address Autoconfiguration (SLAAC)";
-
-        }
-      }
-      description
-        "The origin of an address.";
-    }
-
-    typedef neighbor-origin {
-      type enumeration {
-        enum "other" {
-          value 0;
-          description
-            "None of the following.";
-        }
-        enum "static" {
-          value 1;
-          description
-            "Indicates that the mapping has been statically
-          configured - for example, using NETCONF or a Command Line
-          Interface.";
-        }
-        enum "dynamic" {
-          value 2;
-          description
-            "Indicates that the mapping has been dynamically resolved
-          using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
-          protocol.";
-        }
-      }
-      description
-        "The origin of a neighbor entry.";
-    }
-	
-    feature ipv4-non-contiguous-netmasks {
-      description
-        "Indicates support for configuring non-contiguous
-      subnet masks.";
-    }
-
-	/*** OBJECT DEFINITIONS ***/
-	augment "/if:interfaces" {
-		leaf l2cp-group-index { //aka mefServiceInterfaceCfgL2cpGrpIndex
-			type leafref {
-				path "/if:interfaces/msea-if:interface-profiles/msea-if:l2cp-group/msea-if:group-index";
-			}
-			description
-			"This object is the index of the L2CP profile group
-			(mefServiceL2cpGrpCfgIndex) associated with the current interface. A
-			value of 0 indicates that no interface L2CP profile group is associated
-			with the interface. The L2CP group must be the same for both interfaces";
-			reference
-			"[MEF 6.1] 6.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";
-
-//        must "count(//if:interfaces/if:interface[msea-if:l2cp-group-index = current()]) = 2" {
-//        	  error-app-tag "msea-if-must-01";
-//        	  error-message "The same L2CP Group must be used on both interfaces of this device";
-//          }
-		}
-
-		leaf mef-service-type { //aka mefServiceInterfaceCfgType
-			type MefServiceInterfaceType;
-			description
-			"This object indicates the configured interface type. One
-			bit in the vector can be set at one time based upon the
-			possible values indicated by mefServiceInterfaceStatusType.";
-			//default bUni1d1; --These defaults break the validation - not using them in Eagle
-			reference
-			"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.1, 6.2.1.2, 6.2.1.3";
-		}
-
-		leaf dhcp-timeout {
-			type uint16 {range 0..max;}
-			units seconds;
-			default 0;
-			description "The DHCP timeout in seconds, after which it will use fixed IP addreses
-			A zero value specifies it should never timeout"; 
-		}
-
-		container zero-touch-provisioning {
-			presence "When present sets this device to be configured through Zero Touch Provisioning";
-
-			description "Setting Zero Touch Provisioning (ZTP) configures the setting up 
-			of the management interface through an LLDP server
-			When ZTP is active any DHCP or fixed IP address settings must not be specified.
-			
-			If this attribute is set during a NETCONF session it will have no effect until the
-			next time the device is rebooted.";
-
-			must "count(/if:interfaces/if:interface/msea-if:ipv4/msea-if:address) = 0" {
-				error-app-tag "msea-if-must-01";
-				error-message "When ZTP is specified there must not be a manually specified IP address for either interface";
-			}
-
-			must "not(/if:interfaces/if:interface[msea-if:dhcp-addressing = 'true']) " {
-				error-app-tag "msea-if-must-02";
-				error-message "When ZTP is specified there must not be a DHCP Specification for either interface";
-			}
-
-		}
-
-		container interface-profiles {
-
-			list interface-bwp-group { //aka mefServiceBwpGrpCfgEntry
-
-				key "group-index";
-				max-elements 64;
-				description
-				"Bandwidth profile group settings table entry.";
-
-				leaf group-index { //aka mefServiceBwpGrpCfgIndex
-					type uint8;
-					description
-					"Bandwidth profile group index number";
-				}
-
-				list interface-bwp { //aka mefServiceBwpCfgEntry
-					key "cos-index";//Changed to cos-index (from bwp-index) based on MEP 40 6.4.2 
-					unique name;
-					max-elements 64;
-
-					description
-					"Bandwidth profile. This maps 1:1 with a COS instance. This object is 
-					maintained here to keep the traditional layout of BWPGroup-BWP-COS, but does
-					not have any other purpose in the current implementation";
-
-					leaf cos-index { //aka mefServiceBwpCfgCosIndex
-						type leafref {
-							path "/if:interfaces/msea-if:interface-profiles/msea-if:interface-cos/msea-if:cos-index";
-						}
-						description
-						"This object is the index number of the CoS ID profile
-						associated with the current bandwidth profile. A value of 0 indicates
-						that no CoS ID profile is associated with the bandwidth profile and the
-						bandwidth profile applies to all CoS IDs.
-
-						This index indicates a specific CoS ID profile previously configured via
-						mefServiceCosCfgTable as indicated by the mefServiceCosCfgIndex object.";
-						reference
-						"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-
-						must "current()/../../msea-if:group-index > 0" {
-							error-app-tag "msea-if-must-10";
-							error-message "No BWP's can be added to the Bandwidth Profile Group 0, as this index represents a special case";
-						}
-					}
-
-					leaf name { //mefServiceBwpCfgIdentifier
-						type string {
-							length "1..45";
-						}
-						mandatory true;
-						description
-						"This object indicates the bandwidth profile identifier for the
-						associated bandwidth profile index and is an arbitrary
-						text string that is used to identify a bandwidth profile. Unique
-						string values are chosen to uniquely identify the bandwidth
-						profile.
-
-						Octet values of 0x00 through 0x1f are illegal.
-
-						MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-						reference
-						"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-					}
-
-
-				} //End bwp
-
-			} //End bwp-group
-
-			list interface-cos { //aka mefServiceCosCfgEntry
-				key "cos-index";
-				unique name;
-				max-elements 64;
-				description
-				"Class of Service Identifier settings table entry.";
-
-				leaf cos-index { //aka mefServiceCosCfgIndex
-					type uint32 {
-						range 1..max;
-					}
-					description
-					"Class of Service Identifier profile index number.";
-				}
-
-				leaf name { //aka mefServiceCosCfgIdentifier
-					type string {
-						length 1..45;
-					}
-
-					description
-					"This object indicates the Class of Service Name for the
-					associated CoS profile index and is an arbitrary text string that is
-					used to identify a CoS ID profile. Unique string values are chosen to
-					uniquely identify the profile.
-
-					Octet values of 0x00 through 0x1f are illegal.
-
-					MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				container dscp-cos-type {
-					description "Indicates that the CoS profile is associated
-					with the incoming frame's DSCP field if it is an IP frame.
-					If it is not an IP frame no action is taken on it";
-
-					choice dscp-id-choice {
-						case dscp-bits-list {
-							leaf dscp-group-bit-list {
-								type bits {
-									bit dscp-0-7 {
-										description "The set of DSCP identifiers from 0-7";
-									}
-									bit dscp-8-15 {
-										description "The set of DSCP identifiers from 8-15";
-									}
-									bit dscp-16-23 {
-										description "The set of DSCP identifiers from 16-23";
-									}
-									bit dscp-24-31 {
-										description "The set of DSCP identifiers from 24-31";
-									}
-									bit dscp-32-39 {
-										description "The set of DSCP identifiers from 32-39";
-									}
-									bit dscp-40-47 {
-										description "The set of DSCP identifiers from 40-47";
-									}
-									bit dscp-48-55 {
-										description "The set of DSCP identifiers from 48-55";
-									}
-									bit dscp-56-63 {
-										description "The set of DSCP identifiers from 56-63";
-									}
-								}
-							}
-						}
-
-						case dscp-0-63 {
-							container dscp-0-63 {
-								presence "The full set of DSCP identifiers from 0-63";
-							}
-						}
-
-						case specific-values {
-							leaf-list dscp-id {
-								type uint16 {
-									range 0..64;
-								}
-								ordered-by system;
-								description "The set of DSCP identifiers handled by this COS";
-							}
-						}
-						mandatory true;
-//						msea:not-changeable;
-					}
-
-					choice color-specification {
-						case all-green {
-							container color-all-green {
-								presence "Color for all specified DSCPs mapped to green";
-							}
-						}
-						case all-yellow {
-							container color-all-yellow {
-								presence "Color for all specified DSCPs mapped to yellow";
-							}
-						}
-						case all-dropped {
-							container color-all-dropped {
-								presence "Color for all specified DSCPs mapped to dropped";
-							}
-						}
-
-						case dscp-to-color-map {
-							list dscp-color {
-								key dscp-id;
-								ordered-by system;
-								description "A list of DSCP values that apply to this COS.
-								When the COS type is DSCP a subset of the values can
-								be specified. Other DSCP values can be specified in
-								additional COS profiles. In total the same priority
-								cannot be repeated in a BWP Group";
-
-								leaf dscp-id {
-									type uint16 {
-										range 0..64;
-									}
-								}
-
-								leaf color {
-									description "Color to apply to incoming IP frames
-									with this DSCP id";
-
-									type msea:cos-color-type;
-								}
-							}
-						}
-						default all-green;
-//						msea:not-changeable;
-					}
-				}
-
-				leaf outgoing-cos-value {
-					type msea:priority-type;
-					mandatory true;
-//					msea:not-changeable;
-
-					description
-					"Used to set the egress COS to use for all ingress COS explicitly listed";
-					reference
-					"Edge Assure internal API";
-				}
-			}
-
-			list l2cp-group { //aka mefServiceL2cpGrpCfgEntry
-				key "group-index";
-				max-elements 64;
-				description
-				"L2CP profile group settings table entry on an interface.";
-
-				leaf group-index { //aka mefServiceL2cpGrpCfgIndex
-					type uint32;
-					description
-					"L2CP profile group index number, indicating the specific L2CP profile 
-					group";
-				}
-
-				list l2cp { //aka mefServiceL2cpCfgEntry
-					key "index";
-					max-elements 64;
-					description
-					"L2CP settings table entry on an interface or a service.";
-
-					leaf index { //aka mefServiceL2cpCfgIndex
-						type uint32;
-						description
-						"This object configures the L2CP index number on an interface or a 
-						Service and is used to create/access a L2CP profile within a L2CP
-						group.";
-
-						must "current()/../../msea-if:group-index > 0" {
-							error-app-tag "msea-if-must-11";
-							error-message "No L2CP's can be added to the L2CP Group 0, as this index represents a special case";
-						}
-					}
-
-					leaf handling { //aka mefServiceL2cpCfgType
-						type enumeration {
-							enum discard {description "The indicated L2CP is discarded";}
-
-							enum tunnel {description "The indicated L2CP is tunneled (passed)";}
-
-							enum peer {description "The indicated L2CP is peered with the NE";}
-
-							//						enum passToEvc {description "the indicated L2CP is passed to the EVC for
-							//							EVC processing of the L2CP. Final L2CP
-							//							disposition is based the L2CP profile for
-							//							the EVC to be tunneled, discarded, or peered.
-							//							This value is not valid for EVC based L2CP";
-							//						}
-						}
-						default tunnel;
-//						msea:not-changeable;
-
-						description
-						"This object configures the handling of matching L2CP frames.";
-						reference
-						"[MEF 6.1] 6.0, 8.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";
-					}
-
-					leaf match-scope { //aka mefServiceL2cpCfgMatchScope
-						type l2cp-destination-address;
-						default destinationAddressOnly;
-//						msea:not-changeable;
-
-						description
-						"This object configures the L2CP selection matching scope.";
-						reference
-						"[MEF 6.1] 6.0, 8.0; [MEF 6.1.1] 8.0; [MEF 7.2] 6.2.1.2";
-
-					}
-
-					leaf mac-address { //aka mefServiceL2cpCfgMacAddress
-						type l2cp-dest-mac-address;
-						mandatory true;
-//						msea:not-changeable;
-
-						description
-						"This object configures the L2CP Destination MAC address.
-
-						Valid values are 01-80-C2-00-00-00 through 01-80-C2-00-00-0F and
-						01-80-C2-00-00-20 through 01-80-C2-00-00-2F";
-
-						must "count(current()/../../msea-if:l2cp[msea-if:mac-address = current()]) <= 1" {
-							error-app-tag "msea-if-must-12";
-							error-message "A destination address can only appear once in an L2CP Group";
-						}
-					}
-				} //End l2cp
-
-			} //End l2cp-group
-
-		} //End profiles
-	} //end augment interfaces
-
-	//
-	// Augments ietf-interfaces (only of type ethernetCsmacd) with MEF Services
-	//
-	augment "/if:interfaces/if:interface" {
-		
-		//Copied IPV4 over from ietf-ip because 
-		//  i) We do not want to have to include IPv6
-		// ii) libnetconf only supports augmenting any container 
-		//      from one file (i.e. cannot augment interface here and 
-		//		also in ietf-ip.yang
-		
-		
-	      container ipv4 {
-	        presence
-	          "Enables IPv4 unless the 'enabled' leaf
-	        (which defaults to 'true') is set to 'false'";
-	        description
-	          "Parameters for the IPv4 address family.";
-	        
-	        leaf enabled {
-	          type boolean;
-	          default true;
-
-	          description
-	            "Controls whether IPv4 is enabled or disabled on this
-	             interface.  When IPv4 is enabled, this interface is
-	             connected to an IPv4 stack, and the interface can send
-	             and receive IPv4 packets. When ZTP is configured it
-				 will treat both interfaces as enabled and will ignore
-				 what this value is set to";
-
-				must "count(/if:interfaces/if:interface[if:name='eth0' or if:name='eth1']/msea-if:ipv4[msea-if:enabled = 'true']) >= 1" {
-					error-app-tag "msea-if-must-20";
-					error-message "At least one of the interfaces eth0 and eth1 must be enabled";
-				}
-	        }
-
-	        leaf forwarding {
-	          type boolean;
-	          default false;
-	          description
-	            "Controls IPv4 packet forwarding of datagrams received by,
-	          but not addressed to, this interface.  IPv4 routers
-	          forward datagrams.  IPv4 hosts do not (except those
-	          source-routed via the host).";
-	        }
-
-	        leaf mtu {
-	          type uint16 {
-	            range "68..max";
-	          }
-	          units "octets";
-	          description
-	            "The size, in octets, of the largest IPv4 packet that the
-	          interface will send and receive.
-
-	          The server may restrict the allowed values for this leaf,
-	          depending on the interface's type.
-
-	          If this leaf is not configured, the operationally used MTU
-	          depends on the interface's type.";
-	          reference
-	            "RFC 791: Internet Protocol";
-
-	        }
-
-	        container address { 
-	          when "not (../../msea-if:dhcp-addressing = 'true')";
-	          presence "This address being present indicates the interface has been configured";
-	        
-	          description
-	            "The configured IPv4 addresses on the interface.";
-	          leaf ip {
-	            type inet:ipv4-address-no-zone;
-	            description
-	              "The IPv4 address on the interface.";
-	          }
-
-	          choice subnet {
-	            mandatory true;
-	            description
-	              "The subnet can be specified as a prefix-length, or,
-	            if the server supports non-contiguous netmasks, as
-	            a netmask.";
-	            leaf prefix-length {
-	              type uint8 {
-	                range "0..32";
-	              }
-	              description
-	                "The length of the subnet prefix.";
-	            }
-	            leaf netmask {
-	              if-feature ipv4-non-contiguous-netmasks;
-	              type yang:dotted-quad;
-	              description
-	                "The subnet specified as a netmask.";
-	            }
-	          }  // choice subnet
-	          
-	          leaf gateway {
-				type inet:ipv4-address-no-zone;
-
-				description "This will be ignored if ZTP or DHCP are configured 
-				for management addressing. If unspecified then 0.0.0.0 will be used.";
-
-	          }
-	        }  // container address
-	      }  // container ipv4
-
-		
-
-		leaf frame-format { //aka mefServiceInterfaceCfgFrameFormat
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type enumeration {
-				enum noTag {
-					description "Indicates that all data on the interface 
-					is regarded as untagged, regardless of it ingress type";
-				}
-				enum ctag {
-					description "Ingress frames with CTAG(vlan>0) will be 
-					regared as 'VLAN tagged'; with CTAG(vlan=0) as Priority; otherwise untagged";
-				}
-				enum stag {
-					description "Ingress frames with STAG(vlan>0) will be 
-					regared as 'VLAN tagged'; with STAG(vlan=0) as Priority; otherwise untagged";
-				}
-//          enum stagCtag { description "Indicates that service traffic identified 
-//				with both an S-TAG (outer tag) and a C-TAG 
-//				(inner tag)"; }
-				//default noTag; --These defaults break the validation - not using them in Eagle
-			}
-			description
-			"This object indicates the interface frame format type that the
-			interface can recognize. Default is noTag";
-			reference
-			"[MEF 6.1] 6.0";
-		} //end frame-format
-
-		leaf interface-ingress-bwp-group-index { //aka mefServiceInterfaceCfgIngressBwpGrpIndex
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type leafref {
-				path "/if:interfaces/msea-if:interface-profiles/msea-if:interface-bwp-group/msea-if:group-index";
-			}
-			description
-			"This object is the index number of the ingress bandwidth profile group
-			associated with the current interface. A value of 0 indicates that no
-			interface ingress bandwidth profile group is associated with the
-			interface.
-
-			This index indicates the specific bandwidth profile group previously
-			configured via mefServiceBwpGrpCfgTable and mefServiceBwpCfgTable
-			using this value for mefServiceBwpGrpCfgIndex. There may be multiple
-			entries in mefServiceBwpCfgTable using this index, each containing
-			bandwidth parameters for a different Class of Service Identifier.";
-			reference
-			"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.2";
-		}
-
-		leaf ce-vid-untagged { //aka mefServiceUniCfgCeVidUntagged
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type msea:vlan-id-type;
-
-//			mandatory true;
-			description
-			"Configures the CE VLAN ID associated with untagged and priority
-			Service Frames. It allows the identification of untagged and
-			priority tagged traffic with a specific CE-VLAN ID. This object
-			is ignored for all to one bundling at the UNI.
-			This attribute has been placed on the interface (rather than the UNI)
-			as it can be defined regardless of whether a UNI exists or not";
-			reference
-			"[MEF 6.1] 6.0, [MEF 7.2] 6.2.1.2";
-		}
-
-		leaf ce-priority-untagged { //aka mefServiceUniCfgCePriorityUntagged
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type msea:priority-type;
-//			mandatory true;
-
-			description
-			"Configures the CE VLAN Priority associated with untagged Service
-			Frames. It allows the assignment of a specific VLAN priority to
-			untagged traffic. This object is ignored for all to one bundling
-			at the UNI.
-			This attribute has been placed on the interface (rather than the UNI)
-			as it can be defined regardless of whether a UNI exists or not";
-			reference
-			"[MEF 7.2] 6.2.1.2";
-		}
-
-		leaf admittance-criteria {
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type enumeration {
-				enum admitAll {
-					description "Admit all frames";
-				}
-//					enum admitPrioUntaggedOnly {description "Admit only frames that are not Priority tagged";}
-//					enum admitVlanOnly {description "Admit only frames that are VLAN tagged";}
-			}
-
-//				default admitAll; 
-
-			description "Criteria for admitting packets to this interface. 
-			The Frame Format attribute to determintes how frames are tagged";
-		}
-		
-		leaf color-aware {
-		  type boolean;
-		  default true;
-
-		  description
-		    "Defines whether the interface should handle color mappings. 
-		    If true the color is extracted from the packet tag (DEI bit) 
-		  	or for IPv4 packets, the DSCP field.
-			If false the packet is always assumed to be green.";
-	      reference   
-			 "Edge Assure internal API";
-		}
-		
-		leaf color-forward {
-		  type boolean;
-		  default true;
-
-		  description
-		    "Defines whether the interface should handle color mappings. 
-		    If true color mappings defined in the interface-cos
-			associated with the active interface-ingress-bwp-group will be applied";
-	      reference   
-			 "Edge Assure internal API";
-		}
-		
-		leaf dhcp-addressing {
-			when "../if:type='ianaift:ethernetCsmacd' and (../if:name='eth0' or ../if:name='eth1')";
-			type boolean;
-
-			description "This element can only be specified when ZTP 
-			is not specified.
-
-			If this element is not present and ZTP is not
-			present then the fixed IP addresses specified at
-			/if:interfaces/if:interface/msea-if:ipv4
-			will be used
-
-			This element is specified per interface";
-			
-			must "(not(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4/msea-if:address) and not(/if:interfaces/msea-if:zero-touch-provisioning) and current() = 'true') or ((boolean(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4/msea-if:address) or boolean(/if:interfaces/if:interface[if:name = current()/../if:name]/msea-if:ipv4[msea-if:enabled='false']) or (/if:interfaces/msea-if:zero-touch-provisioning)) and current() = 'false')" {
-				error-app-tag "msea-if-must-21";
-				error-message "When DHCP is 'true' there must be neither a fixed IP address for that interface NOR a ZTP node. When DHCP is 'false' there must be either a fixed IP address for that interface, a disabled interface OR a ZTP node";
-			}
-
-		}
-	} //End augment "/if:interfaces/if:interface
-
-		augment "/if:interfaces-state" {
-			leaf mef-service-type-options { //aka mefServiceInterfaceStatusType
-				type MefServiceInterfaceType;
-				description
-				"This object is a vector of bits that indicates the possible
-				interface types that an interface can be configured to. An interface,
-				for instance, can be configured to be a UNI type 1 or 2, or an ENNI.
-
-				All the possible capabilities of an interface are indicated, one bit
-				per possible type. At least one bit must be set for MEF compliant NEs.";
-				reference
-				"[MEF 6.1] 6.0";
-			}
-
-			leaf zero-touch-provisioning-state {
-				type enumeration {
-					enum complete {
-						description "The device was configured through ZTP at last reboot";
-					}
-					enum incomplete {
-						description "The device was configured through ZTP at last reboot but is not yet complete";
-					}
-					enum dhcp-failed {
-						description "Communication with DHCP server found through ZTP failed 
-								and default values were used instead.";
-					}
-					enum needs-reboot {
-						description "ZTP was added to the configuration since last reboot";
-					}
-				}
-				description "A read only set of attributes indicating the status of
-				Zero Touch Provisioning. This only appears when ZTP is configured";
-			}
-		} //End augment "/if:interfaces-state
-
-		
-		augment "/if:interfaces-state/if:interface" {
-			
-		  container ipv4 {
-			presence
-			  "Present if IPv4 is enabled on this interface";
-			config false;
-			description
-			  "Interface-specific parameters for the IPv4 address family.";
-			leaf forwarding {
-			  type boolean;
-			  description
-				"Indicates whether IPv4 packet forwarding is enabled or
-			  disabled on this interface.";
-			}
-
-			leaf mtu {
-			  type uint16 {
-				range "68..max";
-			  }
-			  units "octets";
-			  description
-				"The size, in octets, of the largest IPv4 packet that the
-			  interface will send and receive.";
-			  reference
-				"RFC 791: Internet Protocol";
-
-			}
-
-			container address {
-			  description
-				"The list of IPv4 addresses on the interface.";
-			  leaf ip {
-				type inet:ipv4-address-no-zone;
-				description
-				  "The IPv4 address on the interface.";
-			  }
-
-			  choice subnet {
-				description
-				  "The subnet can be specified as a prefix-length, or,
-				if the server supports non-contiguous netmasks, as
-				a netmask.";
-				leaf prefix-length {
-				  type uint8 {
-					range "0..32";
-				  }
-				  description
-					"The length of the subnet prefix.";
-				}
-				leaf netmask {
-				  if-feature ipv4-non-contiguous-netmasks;
-				  type yang:dotted-quad;
-				  description
-					"The subnet specified as a netmask.";
-				}
-			  }  // choice subnet
-
-			  leaf origin {
-				type ip-address-origin;
-				description
-				  "The origin of this address.";
-			  }
-			}  // list address
-
-			leaf gateway {
-				type inet:ipv4-address;
-				description "The gateway IP address assigned through ZTP";
-			}
-
-			list neighbor {
-			  key "ip";
-			  description
-				"A list of mappings from IPv4 addresses to
-			  link-layer addresses.
-
-			  This list represents the ARP Cache.";
-			  reference
-				"RFC 826: An Ethernet Address Resolution Protocol";
-
-			  leaf ip {
-				type inet:ipv4-address-no-zone;
-				description
-				  "The IPv4 address of the neighbor node.";
-			  }
-
-			  leaf link-layer-address {
-				type yang:phys-address;
-				description
-				  "The link-layer address of the neighbor node.";
-			  }
-
-			  leaf origin {
-				type neighbor-origin;
-				description
-				  "The origin of this neighbor entry.";
-			  }
-			}  // list neighbor
-		  }  // container ipv4
-		      
-			leaf max-vc { //aka mefServiceInterfaceStatusMaxVc
-				type uint32 {
-					range "1..4095";
-				}
-				description
-				"This object indicates the maximum number of EVCs that the
-				interface can support.";
-				reference
-				"[MEF 6.1] 6.0; [MEF 7.2] 6.2.1.2";
-			}
-
-			  leaf configured-by {
-				type enumeration {
-					enum zero-touch-provisioning {
-						description "ZTP is active and has configured this interface";
-					}
-					enum dhcp {
-						description "Interface has been configured by a DHCP server without ZTP";
-					}
-					enum fixed-ipv4 {
-						description "Interface has been configured manually";
-					}
-				}
-			  }
-		} //End augment "/if:interfaces-state/if:interface"
-
-
-		augment "/if:interfaces-state/if:interface/if:statistics" {
-
-			leaf ingress-undersized { //aka mefServiceInterfaceStatisticsIngressUndersized
-				type yang:counter32;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each frame received
-				on a NE interface that was smaller than 64 octets.
-
-				This object defaults to '0'. ";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-oversized { //aka mefServiceInterfaceStatisticsIngressOversized
-				type yang:counter32;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each frame received
-				on a NE interface that was larger than the maximum MTU size.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-fragments { //aka mefServiceInterfaceStatisticsIngressFragments
-				type yang:counter32;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each frame received
-				on a NE interface that was less than 64 octets in length
-				(excluding framing bits but including FCS octets) and had
-				either a bad Frame Check Sequence (FCS) with an integral
-				number of octets (FCS Error) or a bad FCS with a non-integral
-				number of octets (Alignment Error).
-
-				Note that it is entirely normal for this counter to
-				increment. This is because it counts both runts (which are
-						normal occurrences due to collisions) and noise hits.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-crc-alignment { //aka mefServiceInterfaceStatisticsIngressCrcAlignment
-				type yang:counter32;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each frame received
-				on a NE interface that was from 64 octets to the maximum MTU
-				size in length, but had either a bad Frame Check Sequence (FCS)
-				with an integral number of octets (FCS Error) or a bad FCS with
-				a non-integral number of octets (Alignment Error).
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-invalid-vid { //aka mefServiceInterfaceStatisticsIngressInvalidVid
-				type yang:counter32;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each frame received
-				on a NE interface with an invalid VLAN ID.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-octets { //aka mefServiceInterfaceStatisticsIngressOctets
-				type yang:counter64;
-				units "octets";
-				description
-				"This object is incremented by the number of octets in a
-				valid frame received on a NE interface.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-unicast { //aka mefServiceInterfaceStatisticsIngressUnicast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each valid unicast frame received
-				on a NE interface.
-
-				NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-multicast { //aka mefServiceInterfaceStatisticsIngressMulticast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each valid multicast frame received
-				on a NE interface.
-
-				ME-NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf ingress-broadcast { //aka mefServiceInterfaceStatisticsIngressBroadcast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each valid broadcast frame received
-				on a NE interface.
-
-				ME-NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf egress-octets { //aka mefServiceInterfaceStatisticsEgressOctets
-				type yang:counter64;
-				units "octets";
-				description
-				"This object is incremented by the number of octets in a frame 
-				transmitted on a NE interface.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf egress-unicast { //aka mefServiceInterfaceStatisticsEgressUnicast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each unicast frame transmitted on a
-				NE interface.
-
-				ME-NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf egress-multicast { //aka mefServiceInterfaceStatisticsEgressMulticast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each multicast frame transmitted on a
-				NE interface.
-
-				ME-NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-
-			leaf egress-broadcast { //aka mefServiceInterfaceStatisticsEgressBroadcast
-				type yang:counter64;
-				units "Ethernet frames";
-				description
-				"This object is incremented for each broadcast frame transmitted on a
-				NE interface.
-
-				ME-NEs that do not support 64 bit counters can return the
-				upper half of the counter as all zeros.
-
-				This object defaults to '0'.";
-				reference
-				"[MEF 15] 8.2; [Q.840.1] 6.2.4";
-			}
-		} //End augment "/if:interfaces-state/if:interface/if:statistics
-
-
-		
-		rpc ztp-reset-and-reboot {
-//			nacm:default-deny-all;
-			description
-			"Request that the ZTP system should be reset and the system rebooted. 
-			This can only be run when the zero-touch-provisioning element 
-			already exists on the interfaces element
-			
-			If the zero-touch-provisioning element has been added since the last
-			reboot then the reset will be pending already and will be brought
-			in to effect by this reboot.";
-		}
-		
-	} /* end of module msea-uni-evc-interface */
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-service.yang b/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-service.yang
deleted file mode 100644
index 5075ffb..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/msea-uni-evc-service.yang
+++ /dev/null
@@ -1,1070 +0,0 @@
-module msea-uni-evc-service {
-
-	namespace "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service";
-	prefix "msea-svcs"; //MicroSemi EdgeAssure (msea)
-
-
-	import msea-types {
-		prefix msea;
-		revision-date 2016-02-29;
-	}
-
-//	import ietf-interfaces { prefix if; }
-//	import mef-uni-evc-interface { prefix mef-interface; }
-	import ENTITY-STATE-TC-MIB {prefix "entity-state";}
-
-	/*** 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 is based on the MEF 40 SNMP model, for the management 
-	objects for the management of User Network Interfaces (UNIs) and Ethernet
-	Virtual Connections (EVCs). It has been converted to YANG and modified
-	slightly to suit the EdgeAssure SFP which has some extra
-	constraints that are not handled by the original model
-
-	Copyright 2016 Microsemi Inc.
-	All rights reserved.";
-
-	reference
-	"***************************************************************************
-	Reference Overview
-
-	A number of base documents have been used to create this MIB. The following
-	are the abbreviations for the baseline documents:
-	[MEF 40] refers to SNMP MIB
-	[MEF6.1] refers to MEF 6.1 'Ethernet Services Definitions - Phase 2',
-	April 2008
-	[MEF 6.1.1] refers to MEF 6.1.1 'Layer 2 Control Protocol Handling Amendment
-	to MEF 6.1', January 2012
-	[MEF 7.2] refers to MEF 7.2 'Carrier Ethernet Management Information Model',
-	January 2013
-	[MEF 10.2] refers to MEF 10.2 'Ethernet Services Attributes Phase 2',
-	October 2009
-	[MEF 26.1] refers to MEF 26.1 'External Network Network Interface (ENNI) -
-	Phase 2', January 2012
-	[Q.840.1] refers to 'ITU-T Requirements and analysis for NMS-EMS
-	management interface of Ethernet over Transport and Metro Ethernet
-	Network (EoT/MEN)', March 2007
-	****************************************************************************";
-
-	revision "2016-03-17" {
-		description
-		"Initial Version. Sean Condon - Microsemi";
-		reference "MEF 6.2";
-	}
-
-	
-
-    
-    grouping uni-attributes {
-    	
-    	description "Common UNI attributes";
-
-		leaf bundling-multiplex { //aka mefServiceUniCfgBundlingMultiplex
-			type enumeration {
-				enum allToOne {
-					description 
-					"All to One Bundling, used for Private services: 
-						EPL, EP-LAN, and EP-Tree";
-				}
-				
-				enum bundling {
-					description 
-						"Bundling, indicates one or more 
-						CE-VLANS per service, used for virtual private CE-VLAN
-						preservation services: EVPL, EVP-LAN, EVP-Tree";
-				}
-						
-				enum multiplex {
-					description 
-						"Service Multiplexing, indicates 
-						one or more EVCs per UNI, used for virtual private
-						CE-VLAN preservation or non-preservation services:
-						EVPL, EVP-LAN, EVP-Tree";
-				}
-				
-				enum bundlingMultiplex {
-					description 
-					"Service Multiplexing plus 
-					Bundling, indicates one or more EVCs per UNI that are
-					composed of one or more CE-VLANs, used for virtual
-					CE-VLAN preservation services: EVPL, EVP-LAN, EVP-Tree";
-				}
-			}
-			
-			default allToOne;
-//			msea:not-changeable;
-
-			description
-				"Configures bundling and multiplexing options for the UNI. This object
-				is an enumerated list of possible multiplexing and bundling options
-				on a UNI that is unambiguous and provides only the legal possibilities.";
-
-			reference
-				"[MEF 6.1] 6.0, [MEF 7.2] 6.2.1.2";
-		}
-
-    }
-    
-	
-	grouping evc-per-uni-extension-attributes {
-		description "EVC attributes that are configured depending on
-				the UNI side.";
-
-		leaf ce-vlan-map { //aka mefServiceEvcPerUniCfgCeVlanMap
-			type msea:service-list-type;
-			
-			mandatory true;
-			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";
-		}
-
-		
-		leaf ingress-bwp-group-index { //aka mefServiceEvcPerUniCfgIngressBwpGrpIndex
-			type leafref {
-				path "/msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group/msea-svcs:group-index";
-			}
-			
-			mandatory true;
-	
-			description
-			"This object is the index number of the ingress bandwidth profile group
-			associated with the current EVC on a UNI. A value of 0 indicates that
-			no ingress bandwidth profile group is associated with the EVC on a UNI.
-	
-			This index indicates the specific bandwidth profile group previously
-			configured via mefServiceBwpGrpCfgTable and mefServiceBwpCfgTable
-			using this value for mefServiceBwpGrpCfgIndex. There may be multiple
-			entries in mefServiceBwpCfgTable using this index, each containing
-			bandwidth parameters for a different Class of Service Identifier.";
-			reference
-			"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-		}
-		
-
-        choice tag-manipulation {
-          description "Tag Action to take for an EVC. 
-		  	  If no case is specified then the default noAction will apply";
-          //case noAction - if not specified then noAction will be taken
-          case tagPop {
-          	container tag-pop {
-          		description "Pop the tag.";
-          		presence "Tag pop.";
-          	}
-          }
-          
-          case tagPush {
-          	container tag-push {
-          		description "Push the tag.";
-          		
-        		leaf push-tag-type { //Microsemi Eagle specific configuration attribute
-        			type enumeration {
-        			  enum pushCtag  { description "Use Ctag type on push"; }
-        			  enum pushStag    { description "Use Stag type on push"; }
-        			}
-        			default pushCtag;
-
-        			description 
-        			  "Specify what tag type should be used is if tagAction is 'push'.";
-        			reference   
-        			 "Edge Assure internal API";
-        		}
-        		
-    			leaf outer-tag-vlan { //Microsemi Eagle specific configuration attribute
-    				type msea:vlan-id-type;
-    				mandatory true;
-    				description 
-    				  "The VLan value to use as the outer tag's vlan.";
-    				reference   
-    				 "Edge Assure internal API";
-    			}
-          	}
-          }
-          
-          case tagOverwrite {
-        	  container tag-overwrite {
-        		  description "Overwrite the tag";
-        		  
-        			leaf outer-tag-vlan { //Microsemi Eagle specific configuration attribute
-        				type msea:vlan-id-type;
-        				mandatory true;
-        				description 
-        				  "The VLan value to use as the outer tag's vlan.";
-        				reference   
-        				 "Edge Assure internal API";
-        			}
-        	  }
-          }
-		}
-        
-		leaf evc-per-uni-service-type { //aka mefServiceEvcPerUniCfgServiceType
-			type enumeration {
-				enum epl {
-					description "Ethernet Private Line Service (EPL)
-					Point-to-Point EVC, all to one bundling";
-				}
-				
-				enum evpl {
-					description "Ethernet Virtual Private Line (EVPL)
-					Point-to-Point EVC, bundling and/or multiplexing";
-				}
-				
-				enum eplan {
-					description "Ethernet Private LAN Service (EP-LAN)
-					Multipoint-to-Multipoint EVC, all to one bundling";
-				}
-				
-				enum evplan {
-					description "Ethernet Virtual Private LAN Service (EVP-LAN)
-					Multipoint-to-Multipoint EVC, bundling and/or multiplexing"; 
-				}
-				
-				enum eptree {
-					description "Ethernet Private Tree Service (EP-Tree)
-					Rooted-Multipoint EVC, all to one bundling";
-				}
-				
-				enum evptree {
-					description "Ethernet Virtual Private Tree Service (EVP-Tree)
-					Rooted-Multipoint EVC, bundling and/or multiplexing";
-				}
-			}
-			config false;
-				
-			description
-			"This object indicates the specific Ethernet service type. The value is 
-			derived from the EVC object 'mefServiceEvcCfgType' and the UNI object
-			'mefServiceUniCfgBundlingMultiplex'.";
-	
-			reference
-			"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-		}
-		
-		list flow-mapping {
-			description "A list to track the VLANs relationship to a Flow";
-			key ce-vlan-id;
-			leaf ce-vlan-id {
-				type msea:vlan-id-type;
-				description "A VLan Id";
-			}
-			leaf flow-id {
-				type uint64;
-				description "An identifier for a Flow Rule related to this VLan Id";
-			}
-		}
-	}
-	
-	
-	grouping pcp-color-map-grouping {
-		description "The PCP identifiers for the COS";
-		leaf pcp-id {
-			description "The priority level";
-			type msea:priority-type;
-		}
-		
-		leaf pcp-color {
-			description "The color to apply to this Priority";
-			type msea:cos-color-type;
-//			msea:not-changeable;
-		}
-	}
-	
-	container mef-services {
-		description
-		"This acts as a container of the MEF (6.2) Services configuration.";
-
-		container uni {
-//			must "count(/if:interfaces/if:interface/[mef-interface:mef-service-type = 'bUni2d1']) = 2" {
-//				error-message "The interfaces must be configured as a UNI";
-//				error-app-tag "msea-uni-must-01";
-//			} //Unenforceable as the interface resides in a different module - may have to be implemented in the TransAPI
-
-			presence "If present this device acts as a UNI";
-
-			description "This Edge Assure device support only one UNI.
-				This device supports only one UNI even though it has two interfaces. 
-				One of the interfaces corresponds to the UNI-N side of the UNI, 
-				while the other interface corresponds to the UNI-C side of the interface.
-				Each side performs the mapping to and from the EVC on the ingress
-				of packets to the device.";
-
-		    	
-			leaf name { //aka mefServiceUniCfgIdentifier
-				type msea:identifier45;
-				mandatory true;
-				description
-				"This object indicates the UNI identifier. 
-				MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-				reference
-				"[MEF 6.1] 6.0, [MEF 7.2] 6.2.1.2";
-			}
-			
-			leaf uni-side-interface-assignment {
-				type enumeration {
-					enum uni-c-on-host {
-						description "Uni-C (Customer) is the Host/eth1/LAN  - commonly the System port. 
-							Uni-N (Network) is the Optics/eth0/WAN - commonly the Carrier port";
-					}
-					enum uni-c-on-optics {
-						description "Uni-C (Customer) is the Optics/eth0/WAN - commonly the Carrier port.
-							Uni-N (Network) is the Host/eth1/LAN  - commonly the System port";
-					}
-				}
-				
-				default uni-c-on-host;
-//				msea:not-changeable;
-
-
-				description "An attribute to configure the assignment of UNI-C (Customer) and 
-						UNI-N (Network) to the interfaces.
-						This Edge Assure supports only one UNI over its two interfaces. 
-						One of the interfaces corresponds to the UNI-N side of the UNI, 
-						while the other interface corresponds to the UNI-C side of the interface.
-						Each side acts on packets only on ingress at each interface";
-			}
-			
-			container uni-c { //aka mefServiceUniCfgEntry
-				presence "If present this configures the UNI-C";
-
-				uses uni-attributes;
-				
-				must "//msea-svcs:mef-services/msea-svcs:uni/msea-svcs:uni-n" {
-					error-app-tag "msea-svcs-must-00";
-					error-message "Both UNI-C and UNI-N must be specified";
-				}
-
-				description "The configuration of the UNI-C side of the UNI.
-						UNI-C refers to eth1 by default but can be changed through the 
-						uni-side-interface-assignment attribute.
-						The interface used must have been configured as a UNI";
-			}
-
-			container uni-n { //aka mefServiceUniCfgEntry
-				presence "If present this configures the UNI-N";
-
-				uses uni-attributes;
-
-				must "//msea-svcs:mef-services/msea-svcs:uni/msea-svcs:uni-c" {
-					error-app-tag "msea-svcs-must-01";
-					error-message "Both UNI-C and UNI-N must be specified";
-				}
-
-				description "The configuration of the UNI-C side of the UNI.
-						UNI-N refers to eth0 by default but can be changed through the 
-						uni-side-interface-assignment attribute.
-						The interface used must have been configured as a UNI";
-			}
-
-			list evc { //aka mefServiceEvcPerUniCfgEntry
-				key evc-index;
-				max-elements 32;
-				description "The UNI can support one or more EVCs";
-				
-				
-				leaf evc-index { //aka mefServiceEvcCfgIndex
-					type uint32 {
-						range 1..max;
-					}
-					description
-					"The specific instance of an EVC number.";
-				}
-		
-				leaf name { //aka mefServiceEvcCfgIdentifier
-					type msea:identifier45;
-					mandatory true;
-					
-					description
-					"This object indicates the EVC identifier. The identifier is
-					an arbitrary text string that is used to identify an EVC.
-					Unique string values are chosen to uniquely identify the EVC.
-		
-					Octet values of 0x00 through 0x1f are illegal.
-		
-					MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-				}
-
-				
-				leaf uni-evc-id { //aka mefServiceEvcCfgIdentifier
-					type msea:identifier45;
-					config false;
-					description
-					"The UNI EVC ID is a string formed by the concatenation of 
-					the UNI ID (Section 9.1) and the EVC ID (Section 8.2) that
-					is used to identify an EVC at the UNI. It is intended for 
-					management and control purposes.";
-					reference
-					"[MEF 10.3] 10.1";
-				}
-				
-				leaf service-type { //aka mefServiceEvcCfgServiceType
-					type enumeration {
-						enum pointToPoint {
-							description "EVC Point-to-Point service,
-							used for EPL and EVPL services"; 
-						}
-						
-						enum multipointToMultipoint {
-							description "EVC Multipoint-to-Multipoint 
-							Service, used for EP-LAN and EVP-LAN
-							services"; 
-						}
-						
-						enum rootedMultipoint {
-							description "EVC Rooted-Multipoint Service,
-							used for EP-Tree and EVP-Tree services"; 
-						}
-						
-					}
-					default pointToPoint;
-//					msea:not-changeable;
-
-					description
-					"This object configures the EVC service type for the ME-NE.";
-
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-				}
-
-				leaf mtu-size { //aka mefServiceEvcCfgMtuSize
-					type uint32 {
-						range "9600";
-					}
-					units "octets";
-					default 9600;
-					description
-					"This object indicates the configured EVC maximum service frame format
-					size. It must be less than or equal to the
-					mefServiceEvcStatusMaxMtuSize.";
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-				}
-
-				leaf cevlan-id-preservation { //aka mefServiceEvcCfgCevlanIdPreservation
-					type msea:service-preservation-type;
-					default preserve;
-//					msea:not-changeable;
-					
-					description
-					"This object configures the EVC CE-VLAN ID preservation.
-
-					preserve(1) The CE-VLAN ID is preserved. The ingress CE-VLAN
-					is the CE-VLAN ID at the egress UNI
-					noPreserve(2) The CE-VLAN ID is not preserved. The ingress
-					CE-VLAN ID may not be the CE-VLAN ID at the egress
-					UNI";
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-				}
-
-				leaf cevlan-cos-preservation { //aka mefServiceEvcCfgCevlanCosPreservation
-					type msea:service-preservation-type;
-					default preserve;
-//					msea:not-changeable;
-
-					description
-					"This object configures EVC CE-VLAN CoS preservation.
-
-					preserve(1) The CE-VLAN CoS is preserved. The ingress CE-VLAN
-					CoS is the CE-VLAN CoS at the egress UNI
-					noPreserve(2) The CE-VLAN CoS is not preserved. The ingress
-					CE-VLAN CoS may not be the CE-VLAN CoS at the
-					egress UNI";
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-				}
-
-				container evc-status { //aka mefServiceEvcStatusEntry
-					config false;
-					description
-					"The conceptual row of mefServiceEvcStatusTable.";
-
-					leaf max-mtu-size { //aka mefServiceEvcStatusMaxMtuSize
-						type uint32 {
-							range "1522..16384";
-						}
-						units "octets";
-						description
-						"This object indicates the EVC maximum configurable service
-						frame format size. The actual configured size is set via the
-						mefServiceEvcCfgMtuSize object.";
-						reference
-						"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-					}
-
-					leaf max-num-uni { //aka mefServiceEvcStatusMaxNumUni
-						type uint32 {
-							range "2..16384";
-						}
-						description
-						"This object indicates the maximum number of UNIs in an EVC. For
-						a Point-to-Point EVC this value is '2'. For a Multipoint EVC the
-						value can be '2' or greater.";
-						reference
-						"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-					}
-
-					leaf operational-state { //aka mefServiceEvcStatusOperationalState
-						type entity-state:EntityOperState;
-						description
-						"This object indicates the operational state (current
-						capability) of the EVC.
-
-						If the value is 'enabled', the EVC is able to ingress and
-						egress service frames and has been set to active.
-
-						If the value is 'disabled' the EVC is not able to ingress and
-						egress service frames, has detected an operational failure
-						condition, or has failed an internal test.
-
-						If the value is 'testing' the EVC has been placed into a test mode,
-						either a troubleshooting mode or a test mode.
-
-						If the value is 'unknown' the EVC is unable to report the operational
-						state.";
-						reference
-						"[MEF 7.2] 6.2.1.3";
-					}
-				} //End evc-status
-
-				container evc-per-uni {
-					leaf evc-uni-type { //aka mefServiceEvcUniCfgType
-						type enumeration {
-							enum root {
-								description "Valid setting for all service types. A UNI set
-								to this value may send frames to UNIs configured
-								as 'root' or 'leaf'";
-							}
-						}						
-						default root;
-						description
-						"This object configures UNI type on an EVC.";
-						reference
-						"[MEF 10.2]";
-	
-					}
-					
-					container evc-per-uni-c { //aka mefServiceUniCfgEntry
-	
-						description "The configuration of the UNI-C side of the EVC-per-UNI.";
-						
-						uses evc-per-uni-extension-attributes;
-							
-					} //End evc-per-uni-c
-					
-					
-					container evc-per-uni-n { //aka mefServiceUniCfgEntry
-	
-						description "The configuration of the UNI-N side of the EVC-per-UNI";
-			
-						uses evc-per-uni-extension-attributes;
-							
-					} //End evc-per-uni-n
-				}
-			} //End evc
-		} //end of uni
-		
-		
-	container profiles {
-
-		list bwp-group { //aka mefServiceBwpGrpCfgEntry
-
-			key "group-index";
-			max-elements 64;
-			description
-			"Bandwidth profile group settings table entry.";
-
-			leaf group-index { //aka mefServiceBwpGrpCfgIndex
-				type uint8;
-				description
-				"Bandwidth profile group index number";
-			}
-
-			list bwp { //aka mefServiceBwpCfgEntry
-				key "cos-index";//Changed to cos-index (from bwp-index) based on MEP 40 6.4.2 
-				unique name;
-				max-elements 64;
-				
-				description
-				"Bandwidth profile settings table entry.";
-
-				leaf cos-index { //aka mefServiceBwpCfgCosIndex
-					type leafref {
-						path "/msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos/msea-svcs:cos-index";
-					}
-					description
-					"This object is the index number of the CoS ID profile
-					associated with the current bandwidth profile. A value of 0 indicates
-					that no CoS ID profile is associated with the bandwidth profile and the
-					bandwidth profile applies to all CoS IDs.
-
-					This index indicates a specific CoS ID profile previously configured via
-					mefServiceCosCfgTable as indicated by the mefServiceCosCfgIndex object.";
-					reference
-					"[MEF 6.1] 6.1; [MEF 7.2] 6.2.1.3";
-					
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='0']) <= 1" {
-						error-app-tag "msea-svcs-must-02";
-						error-message "Priority 0 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='1']) <= 1" {
-						error-app-tag "msea-svcs-must-03";
-						error-message "Priority 1 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='2']) <= 1" {
-						error-app-tag "msea-svcs-must-04";
-						error-message "Priority 2 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='3']) <= 1" {
-						error-app-tag "msea-svcs-must-05";
-						error-message "Priority 3 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='4']) <= 1" {
-						error-app-tag "msea-svcs-must-06";
-						error-message "Priority 4 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='5']) <= 1" {
-						error-app-tag "msea-svcs-must-07";
-						error-message "Priority 5 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='6']) <= 1" {
-						error-app-tag "msea-svcs-must-08";
-						error-message "Priority 6 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:*/priority[.='7']) <= 1" {
-						error-app-tag "msea-svcs-must-09";
-						error-message "Priority 7 can be specified only once in the COS's related to a BWP Group";
-					}
-
-					
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:evc-cos-type-all-8-prio-to-1-evc-color) <= 1" {
-						error-app-tag "msea-svcs-must-10";
-						error-message "Only one COS can be specified in a Bandwidth Profile Group when the cos-type is 'evc-cos-type-all-8-prio-to-1-evc-color' ";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:evc-cos-type-all-8-prio-to-1-pcp-color) <= 1" {
-						error-app-tag "msea-svcs-must-11";
-						error-message "Only one COS can be specified in a Bandwidth Profile Group when the cos-type is 'evc-cos-type-all-8-prio-to-1-pcp-color' ";
-					}
-
-					must "count(//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:cos[msea-svcs:cos-index=//msea-svcs:mef-services/msea-svcs:profiles/msea-svcs:bwp-group[msea-svcs:group-index=current()/../../msea-svcs:group-index]/msea-svcs:bwp/msea-svcs:cos-index]/msea-svcs:evc-cos-type-all-8-prio-to-1-dei-color) <= 1" {
-						error-app-tag "msea-svcs-must-12";
-						error-message "Only one COS can be specified in a Bandwidth Profile Group when the cos-type is 'evc-cos-type-all-8-prio-to-1-dei-color' ";
-					}
-
-					must "current()/../../msea-svcs:group-index > 0" {
-						error-app-tag "msea-svcs-must-15";
-						error-message "No BWP's can be added to the Bandwidth Profile Group 0, as this index represents a special case";
-					}
-				}
-
-				leaf name { //mefServiceBwpCfgIdentifier
-					type string {
-						length "1..45";
-					}
-					mandatory true;
-					description
-					"This object indicates the bandwidth profile identifier for the
-					associated bandwidth profile index and is an arbitrary
-					text string that is used to identify a bandwidth profile. Unique
-					string values are chosen to uniquely identify the bandwidth
-					profile.
-
-					Octet values of 0x00 through 0x1f are illegal.
-
-					MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				leaf committed-information-rate { //aka mefServiceBwpCfgCir
-					type uint32 {
-						range "0..10000000";
-					}
-					units "kbits/s";
-					default 1000000;
-//					msea:not-changeable;
-					
-					description
-					"This object indicates the Committed Information Rate (CIR) in kbits/s
-					and defines the average rate in kbits/sec up to which
-					the network delivers Service Frames. Service Frames that meet
-					the CIR are said to be in profile or in conformance to performance
-					objectives. These frames are generally identified as 'Green' 
-					Service Frames.";
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				leaf committed-burst-size { //aka mefServiceBwpCfgCbs
-					type uint32 {
-						range "0..10000000";
-					}
-					units "bytes";
-					default 12;
-//					msea:not-changeable;
-
-					description
-					"This object indicates the Committed Burst Size (CBS) in bytes. It limits
-					the maximum number of bytes available for a burst of Service Frames sent
-					at interface speed to remain CIR-conformant.";
-					reference
-					"[MEF 10.2]";
-				}
-
-				leaf excess-information-rate { //aka mefServiceBwpCfgEir
-					type uint32 {
-						range "0..10000000";
-					}
-					units "kbits/s";
-//					msea:not-changeable;
-
-					description
-					"This object indicates the Excess Information Rate (EIR) in kbits/s
-					and defines the average rate in kbits/sec of Service Frames up to
-					which the network may deliver Service Frames but without performance
-					objectives. Service Frames that meet the EIR as set to be in out-of-
-					profile or not in conformance to performance objectives. These
-					frames are not guaranteed to be delivered and are generally identified
-					as 'Yellow' service frames.";
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				leaf excess-burst-size { //aka mefServiceBwpCfgEbs
-					type uint32 {
-						range "0..10000000";
-					}
-					units "bytes";
-//					msea:not-changeable;
-
-					description
-					"This object indicates the Excess Burst Size (EBS) in bytes. It limits
-					the maximum number of bytes available for a burst of Service Frames
-					sent at the interface speed to remain EIR-conformant.";
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				leaf color-mode { //aka mefServiceBwpCfgCm
-					type enumeration {
-						enum colorBlind {description "A bandwidth profile property where ingress 
-							Service Frames are not pre-colored for either
-							green or yellow, and if present, is ignored when
-							determining the level of compliance for each
-							Service Frame";
-						}
-						
-						enum colorAware {
-							description "A bandwidth profile property were a pre-determined
-							level of Bandwidth Profile compliance for each
-							Service Frame is taken into account when determining
-							the level of compliance for each Service Frame.
-							Each service frame can be colored red (discarded),
-							yellow (conditional delivery), or green (unconditional
-							delivery.";
-						}
-					}
-					default colorBlind;
-//					msea:not-changeable;
-
-					description
-					"This object configures the bandwidth profile color mode.";
-
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-				leaf coupling-flag { //aka mefServiceBwpCfgCf
-					type enumeration {
-						enum couplingYellowEirOnly {
-							description "The long term average bit rate of Service
-							Frames that are declared Yellow is bounded by EIR."; 
-						}
-
-						enum couplingYellowEirPlusCir {
-							description "The long term average bit rate of Service
-							Frames that are declared Yellow is bounded
-							by CIR + EIR depending on the volume of
-							the offered Service Frames that are
-							declared Green.";
-						}
-					}
-					
-					default couplingYellowEirOnly;
-//					msea:not-changeable;
-
-					description
-					"This object configures the bandwidth profile coupling flag and has
-					the effect of controlling the volume of the Service Frames that are
-					declared Yellow.";
-
-					reference
-					"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-				}
-
-			} //End bwp
-
-		} //End bwp-group
-
-		list cos { //aka mefServiceCosCfgEntry
-			key "cos-index";
-			unique name;
-			max-elements 64;
-			description
-			"Class of Service Identifier settings table entry.";
-
-			leaf cos-index { //aka mefServiceCosCfgIndex
-				type uint32 {
-					range 1..max;
-				}
-				description
-				"Class of Service Identifier profile index number.";
-			}
-
-			leaf name { //aka mefServiceCosCfgIdentifier
-				type string {
-					length 1..45;
-				}
-				
-				description
-				"This object indicates the Class of Service Name for the
-				associated CoS profile index and is an arbitrary text string that is
-				used to identify a CoS ID profile. Unique string values are chosen to
-				uniquely identify the profile.
-
-				Octet values of 0x00 through 0x1f are illegal.
-
-				MEF 26.1 restricts the maximum size identifiers to 45 octets.";
-				reference
-				"[MEF 6.1] 6.0, 6.1, 6.2, 6.3; [MEF 7.2] 6.2.1.2, 6.2.1.3";
-			}
-			
-			choice cos-type-choice {
-				description "CoS configuration alternatives.";
-				//We have 6 choices in a single tier choice structure which is easier for client
-				//tools to represent automatically rather than a two tier choice structure
-				
-				case evc-cos-type-evc-color-id {
-					container evc-cos-type-all-8-prio-to-1-evc-color {
-						description "Indicates that the CoS profile is associated
-						with the virtual channel, i.e. EVC or OVC. All 8 priorities
-						are mapped to the outgoing-cos-value - therefore there can 
-						only be one of this type of COS specified in any BWP Group";
-								
-						leaf evc-all-8-color-to {
-							description "The color to be applied regardless of priority";
-							mandatory true;
-							type msea:cos-color-type;
-						}
-					}							
-				}
-				
-				case evc-cos-type-pcp-color-id {
-				
-					container evc-cos-type-all-8-prio-to-1-pcp-color {
-						description "Indicates that the CoS profile is associated
-						with the virtual channel, i.e. EVC or OVC. All 8 priorities
-						are mapped to the outgoing-cos-value - therefore there can 
-						only be one of this type of COS specified in any BWP Group";
-
-						list pcp-color-per-prio {
-							key pcp-id;
-							description "The PCP value of the incoming frame is 
-							used to lookup the following table to determine the 
-							frame's color";
-
-							min-elements 8;
-							max-elements 8;
-							uses pcp-color-map-grouping;
-						}
-					}
-				}
-							
-				case evc-cos-type-dei-color-id {
-					container evc-cos-type-all-8-prio-to-1-dei-color {
-						presence "Cos type EVC and Color Mapping DEI";
-						
-						description "Indicates that the CoS profile is associated
-						with the virtual channel, i.e. EVC or OVC. All 8 priorities
-						are mapped to the outgoing-cos-value - therefore there can 
-						only be one of this type of COS specified in any BWP Group
-						The source of the color is DEI of the
-						incoming frame. False (0) in the DEI field will set 
-						the color to Green and True (1) will set to Yellow";
-
-					}
-				}
-					
-				case pcp-cos-type-evc-color-id {
-					container pcp-cos-type-n-prio-to-1-evc-color {
-						description "Indicates that the CoS profile is associated
-							with the incoming frame's Priority Code Point (priority bits).";
-							
-						leaf-list priority {
-							type msea:priority-type;
-							ordered-by system;
-							
-							description "A list of priorities that apply to this COS.
-							When the COS type is PCP a subset of the priorities can 
-							be specified. Other priorities can be specified in 
-							additional COS profiles. In total the same priority
-							cannot be repeated in a BWP Group";
-
-							min-elements 1;
-							max-elements 8;
-						}
-						
-						leaf evc-all-8-colors-to {
-							description "The color to be applied regardless 
-							of priority. If multiple instances of this cos
-							type have different values then the color-type
-							of the last one will apply";
-
-							type msea:cos-color-type;
-							mandatory true;
-						}
-					}
-				}
-							
-				case pcp-cos-type-pcp-color-id {
-					container pcp-cos-type-n-prio-to-1-pcp-color {
-						description "Indicates that the CoS profile is associated
-							with the incoming frame's Priority Code Point (priority bits). 
-							The PCP value of the incoming frame is used to lookup the 
-							follwing table to determine the frame's color";
-							
-						leaf-list priority {
-							type msea:priority-type;
-							min-elements 1;
-							max-elements 8;
-							ordered-by system;
-
-							description "A list of priorities that apply to this COS.
-							When the COS type is PCP a subset of the priorities can 
-							be specified. Other priorities can be specified in 
-							additional COS profiles. In total the same priority
-							cannot be repeated in a BWP Group";
-						}
-						
-						list pcp-color-for-prio {
-							key pcp-id;
-							description "Each priority specified above must
-							have a corresponding color otherwise the default 
-							(green) will apply";
-
-							min-elements 1;
-							ordered-by system;
-
-							uses pcp-color-map-grouping {
-								refine pcp-id {
-									must "count(current()/../../msea-svcs:priority[.=current()]) = 1" {
-										error-message "Each element must already exist in the priority list";
-									}
-								}
-							}
-						}
-					}
-				}
-							
-
-				case pcp-cos-type-dei-color-id {
-					container pcp-cos-type-n-prio-to-1-dei-color {
-						description "Indicates that the CoS profile is associated
-							with the incoming frame's Priority Code Point (priority bits). 
-							The DEI value of the incoming frame is used to determine 
-							the frame's color. False (0) in the DEI field of the frame 
-							will set the color to Green and True (1) will set to Yellow";
-							
-						leaf-list priority {
-							type msea:priority-type;
-							min-elements 1;
-							max-elements 8;
-							ordered-by system;
-							
-							description "A list of priorities that apply to this COS.
-							When the COS type is PCP a subset of the priorities can 
-							be specified. Other priorities can be specified in 
-							additional COS profiles. In total the same priority
-							cannot be repeated in a BWP Group";
-						}
-					}
-				}
-				
-				mandatory true;
-//				msea:not-changeable;
-			}
-		    
-			leaf outgoing-cos-value {
-			  type msea:priority-type;
-			  mandatory true;
-//			  msea:not-changeable;
-
-		      description
-		        "Used to set the egress COS to use for all ingress COS explicitly listed";
-		      reference   
-				 "Edge Assure internal API";
-		    }
-
-			leaf color-aware {
-			  type boolean;
-			  mandatory true;
-//			  msea:not-changeable;
-
-			  description
-			    "Set if the profile should be treated as colour aware (true) or not (false)";
-		      reference   
-				 "Edge Assure internal API";
-			}
-			
-			leaf color-forward {
-			  type boolean;
-			  mandatory true;
-//			  msea:not-changeable;
-
-			  description
-			    "Used to override the colour mapping of the profile. If true the ingress colour is forwarded";
-		      reference   
-				 "Edge Assure internal API";
-			}
-
-		} //End cos
-		
-	      
-    } //End of profiles
-
-	} //End of mef-services
-
-} /* end of module msea-uni-evc-service */
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/nc-notifications.yang b/drivers/microsemi/ea1000yang/src/main/yang/nc-notifications.yang
deleted file mode 100644
index 5636aeb..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/nc-notifications.yang
+++ /dev/null
@@ -1,95 +0,0 @@
-module nc-notifications {
-
-    namespace "urn:ietf:params:xml:ns:netmod:notification";
-    prefix "manageEvent";
-
-    import ietf-yang-types{ prefix yang; }
-    import notifications { prefix ncEvent; }
-
-    organization
-      "IETF NETCONF WG";
-
-    contact
-      "netconf@ietf.org";
-
-    description
-      "Conversion of the 'manageEvent' XSD in the NETCONF
-       Notifications RFC.";
-
-    reference
-      "RFC 5277";
-
-    revision 2008-07-14 {
-      description "RFC 5277 version.";
-    }
-
-    container netconf {
-      description "Top-level element in the notification namespace";
-
-      config false;
-
-      container streams {
-        description 
-          "The list of event streams supported by the system. When
-           a query is issued, the returned set of streams is 
-           determined based on user privileges.";
-
-        list stream {
-          description 
-            "Stream name, description and other information.";
-          key name;
-          min-elements 1;
-
-          leaf name {
-            description
-              "The name of the event stream. If this is the default
-               NETCONF stream, this must have the value 'NETCONF'.";
-            type ncEvent:streamNameType;
-          }
-
-          leaf description {
-            description
-              "A description of the event stream, including such
-               information as the type of events that are sent over
-               this stream.";
-            type string;
-            mandatory true;
-          }
-
-          leaf replaySupport {
-            description
-              "A description of the event stream, including such
-               information as the type of events that are sent over
-               this stream.";
-            type boolean;
-            mandatory true;
-          }
-
-          leaf replayLogCreationTime {
-            description
-              "The timestamp of the creation of the log used to support
-               the replay function on this stream. Note that this might
-               be earlier then the earliest available notification in
-               the log. This object is updated if the log resets for 
-               some reason.  This object MUST be present if replay is
-               supported.";
-            type yang:date-and-time;   // xsd:dateTime is wrong!
-          }
-        }
-      }
-    }
-
-    notification replayComplete {
-      description
-        "This notification is sent to signal the end of a replay
-         portion of a subscription.";
-    }
-
-    notification notificationComplete {
-      description
-        "This notification is sent to signal the end of a notification
-         subscription. It is sent in the case that stopTime was
-         specified during the creation of the subscription..";
-    }
-
-}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/netopeer-cfgnetopeer.yang b/drivers/microsemi/ea1000yang/src/main/yang/netopeer-cfgnetopeer.yang
deleted file mode 100644
index 79f1566..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/netopeer-cfgnetopeer.yang
+++ /dev/null
@@ -1,72 +0,0 @@
-module netopeer-cfgnetopeer {
-  namespace "urn:cesnet:tmc:netopeer:1.0";
-  prefix cfgnetopeer;
-
-  organization "CESNET, z.s.p.o.";
-  contact
-    "dkupka@cesnet.cz";
-  description
-    "Module specifying Netopeer module data model and RPC operation.";
-
-  revision 2013-02-14 {
-    description
-      "Modules are now configurable. Except implemented-rpcs which depends on module data model.";
-  }
-  revision 2012-11-13 {
-    description
-      "Removed parts implemented by library (RFC6022).";
-  }
-  revision 2011-10-20 {
-    description
-      "Initial revision";
-  }
-
-  container netopeer {
-    container modules {
-      list module {
-        key "name";
-        leaf name {
-          type string;
-          description
-            "Name of module";
-        }
-        leaf enabled {
-          type boolean;
-          default false;
-          description
-            "Specify whether or not the module is allowed to be managed over server.";
-        }
-      }
-    }
-  }
-  rpc netopeer-reboot {
-    description
-      "Operation allowing privileged user to restart netopeer-server.";
-    input {
-      leaf type {
-        type enumeration {
-          enum "soft";
-          enum "hard";
-        }
-        default "soft";
-        description
-          "Soft restart only unplugs all device modules and reloads configuration.
-           Hard restart also abort all connections and reload the binary.";
-      }
-    }
-  }
-  rpc reload-module {
-    description
-      "Unload and load any loaded module." ;
-    input {
-      leaf module {
-        type leafref {
-          path "/netopeer/modules/module/name";
-        }
-        mandatory true;
-        description
-          "Name of module to reload.";
-      }
-    }
-  }
-}
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/notifications.yang b/drivers/microsemi/ea1000yang/src/main/yang/notifications.yang
deleted file mode 100644
index 1ae9cc2..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/notifications.yang
+++ /dev/null
@@ -1,95 +0,0 @@
-module notifications {
-
-    namespace "urn:ietf:params:xml:ns:netconf:notification:1.0";
-    prefix "ncEvent";
-
-    import ietf-yang-types { prefix yang; }
-
-    organization
-      "IETF NETCONF WG";
-
-    contact
-      "netconf@ops.ietf.org";
-
-    description
-      "Conversion of the 'ncEvent' XSD in the 
-       NETCONF Notifications RFC.";
-         
-    reference
-      "RFC 5277.";
-
-    revision 2008-07-14 {
-      description "RFC 5277 version.";
-    }
-
-    typedef streamNameType {
-      description
-        "The name of an event stream.";
-      type string;
-    }
-
-    rpc create-subscription {
-      description
-        "The command to create a notification subscription. It
-         takes as argument the name of the notification stream
-         and filter. Both of those options limit the content of
-         the subscription. In addition, there are two time-related
-         parameters, startTime and stopTime, which can be used to 
-         select the time interval of interest to the notification
-         replay feature.";
-
-      input {
-        leaf stream {
-          description
-            "An optional parameter that indicates which stream of events
-             is of interest. If not present, then events in the default
-             NETCONF stream will be sent.";
-          type streamNameType;
-          default "NETCONF";
-        }
-
-        anyxml filter {
-          description
-            "An optional parameter that indicates which subset of all
-             possible events is of interest. The format of this
-             parameter is the same as that of the filter parameter
-             in the NETCONF protocol operations. If not present,
-             all events not precluded by other parameters will 
-             be sent.";
-        }
-
-        leaf startTime {
-          description
-            "A parameter used to trigger the replay feature and
-             indicates that the replay should start at the time
-             specified. If start time is not present, this is not a
-             replay subscription.";
-          type yang:date-and-time;
-        }
-
-        leaf stopTime {
-          // must ". >= ../startTime";
-          description
-            "An optional parameter used with the optional replay
-             feature to indicate the newest notifications of
-             interest. If stop time is not present, the notifications
-             will continue until the subscription is terminated.
-             Must be used with startTime.";
-          type yang:date-and-time;
-        }
-      }
-    }
-
-   container notification {
-      description "internal struct to start a notification";
-      config false;
-
-      leaf eventTime {
-         mandatory true;
-         type yang:date-and-time;
-      }
-
-      // eventType and any data content goes here
-   }  
-}
-
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/rfc-2544.yang b/drivers/microsemi/ea1000yang/src/main/yang/rfc-2544.yang
deleted file mode 100644
index fb1a7c0..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/rfc-2544.yang
+++ /dev/null
@@ -1,509 +0,0 @@
-module rfc-2544 {
-
-    /*** NAMESPACE / PREFIX DEFINITION ***/
-
-    namespace "http://www.microsemi.com/rfc2544";
-    prefix "rfc2544";
-
-    import svc-activation-types {
-        prefix sa;
-    }
-
-    import msea-types {
-        prefix msea;
-        revision-date 2016-02-29;
-    }
-
-    /*** 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 defines the interface for RFC 2544 Benchmarking Methodology for Network Interconnect Devices
-
-    Copyright 2015 Microsemi Inc.
-    All rights reserved.";
-
-    revision "2015-10-20" {
-        description
-        "Initial version - Sean Condon, Microsemi";
-    }
-
-    /*
-     * Typedefs
-     */
-
-
-    /*
-     * Groupings
-     */
-    grouping frame-size-group {
-
-        description "Frame sizes to use in the test";
-
-        leaf-list frame-size {
-            type sa:frame-size-type;
-            max-elements 8;
-            units "byte";
-            ordered-by user;
-            description "A range of frame sizes to use. 512 bytes will be used if nothing is specified";
-        }
-
-        reference "RFC 2544 Section 9 
-            All of the described tests SHOULD be performed at a number of frame
-            sizes. Specifically, the sizes SHOULD include the maximum and minimum
-            legitimate sizes for the protocol under test on the media under test
-            and enough sizes in between to be able to get a full characterization
-            of the DUT performance. Except where noted, at least five frame
-            sizes SHOULD be tested for each test condition.";
-    }
-
-    grouping throughput-group {
-        description
-        "Configuration parameters for throughput test.";
-
-        leaf step-size {
-            type uint8 {
-                range 1..10|20|25|30|40|50|100;
-            }
-            must "current() <= ((../max-rate) - (../min-rate))" {
-                error-app-tag "msea-2544-must-1";
-                error-message "step-size must be less than or equal to the difference between min- and max-rate";
-            }
-            units "Mb/s";
-            default 10;
-            description "The throughput rate step size from 1Mb/s to 1,000Mb/s (1 Gbps)";
-        }
-
-        leaf min-rate {
-            type uint16 {
-                range 1..999;
-            }
-            must "current() < ../max-rate" {
-                error-app-tag "msea-2544-must-2";
-                error-message "min-rate must not equal or exceed max-rate";
-            }
-            units "Mb/s";
-            default 10;
-            description "The minimum throughput rate from 1Mb/s to 1,000Mb/s (1Gbps)
-                    The test starts at the max-rate and reduces by step-size on each
-                    iteration until it drops below min-rate. For example with 
-                    max-rate=10, step-size=2 and min-rate=1, tests will be
-                    performed at 10,8,6,4 and 2 Mb/s";
-        }
-
-        leaf max-rate {
-            type uint16 {
-                range 2..1000;
-            }
-            units "Mb/s";
-            default 1000;
-            description "The maximum throughput rate from 1Mb/s to 1,000Mb/s (1Gbps)";
-        }
-
-        leaf trial-duration {
-            type uint32 {
-                range 1..max;
-            }
-            default 60;
-            units "s";
-            description "Trial duration";
-            reference "RFC 2544 Section 24 
-            The duration of the test portion of each trial SHOULD be
-            at least 60 seconds.";
-        }
-    }
-
-    grouping afl-group {
-        description
-        "Extra configuration parameters for throughput and latency test.";
-
-        leaf accepted-frame-loss {
-            type uint32 {
-                range min..100000;
-            }
-            units "m%";
-            default 0;
-            description "The acceptable Frame Loss ratio in units of 0.001%";
-        }
-    }
-
-    grouping result-common-group {
-        description
-        "Common attributes of by-frame-size result set.";
-        
-        leaf test-status {
-            type sa:test-status;
-            mandatory true;
-            description "The current status of the subset of tests";
-        }
-
-        leaf frame-size {
-            type sa:frame-size-type;
-            units "bytes";
-            description "The frame size used";
-        }
-
-        leaf elapsed-time {
-            type uint16;
-            units "s";
-            description "The number of seconds the test has been running";
-        }
-    }
-
-    /*
-     * Features
-     */
-    feature throughput {
-        description
-        "This feature indicates that the device supports throughput tests";
-        reference
-        "RFC 2544: Section 26.1";
-    }
-
-    feature latency {
-        description
-        "This feature indicates that the device supports Latency tests";
-        reference
-        "RFC 2544: Section 26.2";
-    }
-
-    feature frame-loss-rate {
-        description
-        "This feature indicates that the device supports Frame Loss Rate tests";
-        reference
-        "RFC 2544: Section 26.3";
-    }
-
-    feature back-to-back {
-        description
-        "This feature indicates that the device supports Back-to-Back (burst mode) tests";
-        reference
-        "RFC 2544: Section 26.4";
-    }
-
-    container rfc2544-test {
-        description
-        "A configured set of parameters for an RFC 2544 test";
-
-        container mep-config {
-            presence "Presence indicates that a MEP has been configured";
-
-            uses msea:mep-config-attribs-noref;
-
-            leaf remote-mep-id {
-                      type msea:mep-id-type;    
-                must "current()/../maintenance-association-end-point != current()" {
-                    error-message "Remote MEP Id must not be the same as Local MEP Id";
-                    error-app-tag "msea-svc-must-01";
-                }
-
-                //mandatory true; //Should not be mandatory in a top level container 
-                description "The Id of the remote MEP";
-            }
-
-            container overwrite-pcp {
-                presence "Enables PCP Overwrite";
-                description "If present allows attributes to be
-                    specified for the PCP overwrite";
-
-                    uses sa:overwrite-pcp-attribs;
-                    
-                    leaf overwrite-drop-eligible {
-                        type boolean;
-                        default false;
-                        description 
-                        "The Drop Eligible flag in the MEP's TAG is replaced 
-                        with this value if overwrite-pcp is present.";
-                    }
-            }
-        }
-
-        leaf binary-search-step-duration {
-            type uint16 {
-                range 1..10;
-            }
-            default 2;
-            units "s";
-            description
-                "The time in seconds for each step in the Throughput binary search. Range 1 to 10, default 2.";
-            reference "RFC 2544 Section 24";
-        }
-
-
-        container throughput {
-            if-feature throughput;
-            description "Configuration parameters for the Throughput part of the test";
-
-            uses throughput-group;
-            uses frame-size-group;
-            uses afl-group;
-        }
-
-        container latency {
-            if-feature latency;
-            description "Configuration parameters for the Latency part of the test";
-
-            uses throughput-group {
-                refine trial-duration {
-                    default 120;
-                }
-            }
-            uses frame-size-group;
-            uses afl-group;
-        }
-
-        container frame-loss {
-            if-feature frame-loss-rate;
-            description "Configuration parameters for the Frame Loss part of the test";
-
-            uses throughput-group;
-            uses frame-size-group;
-        }
-
-        container back-to-back {
-            if-feature back-to-back;
-            description "Configuration parameters for the Back-to-Back part of the test";
-
-            leaf trial-duration {
-                type uint32 {
-                    range 1..10000;
-                }
-                units "ms";
-                default 2000;
-                description "The duration of the Back-to-Back test in milliseconds";
-            }
-            
-            leaf iterations {
-                type uint16 {
-                    range 1..max;
-                }
-                default 50;
-                description "The number of times to run the test";
-            }
-            
-            uses frame-size-group;
-        }
-    }
-
-    container rfc2544-result {
-        config false;
-
-        description "A collection of the results from the RFC 2544 tests";
-
-        container throughput {
-            if-feature throughput;
-
-            description "Results for the Throughput test";
-
-            uses sa:results-header-group;
-
-            list result-item {
-                key frame-size;
-
-                description "The list of results by frame size";
-
-                reference "RFC 2544: Section 26.1";
-
-                uses result-common-group;
-
-                leaf frame-rate {
-                    type uint32;
-                    units "Mb/s";
-                    description "The throughput rate achieved for this packet size";
-                }
-            }
-        }
-
-        container latency {
-            if-feature latency;
-
-            description "Results for the Latency test";
-
-            uses sa:results-header-group;
-
-            list result-item {
-                key frame-size;
-
-                uses result-common-group;
-
-                leaf frame-rate {
-                    type uint32;
-                    units "Mb/s";
-                    description "The throughput rate achieved for this frame size";
-                }
-
-                leaf frame-delay-min {
-                    type uint32;
-                    units "μs";
-                    description "The Minimum Frame Delay measured at the throughput rate";
-                }
-
-                leaf frame-delay-max {
-                    type uint32;
-                    units "μs";
-                    description "The Maximum Frame Delay measured at the throughput rate";
-                }
-
-                leaf frame-delay-avg {
-                    type uint32;
-                    units "μs";
-                    description "The Average Frame Delay measured at the throughput rate";
-                }
-
-                leaf frame-delay-var-min {
-                    type uint32;
-                    units "μs";
-                    description "The Minimum Frame Delay Variation measured at the throughput rate";
-                }
-
-                leaf frame-delay-var-max {
-                    type uint32;
-                    units "μs";
-                    description "The Maximum Frame Delay Variation measured at the throughput rate";
-                }
-
-                leaf frame-delay-var-avg {
-                    type uint32;
-                    units "μs";
-                    description "The Average Frame Delay Variation measured at the throughput rate";
-                }
-            }
-        }
-
-        container frame-loss {
-            if-feature frame-loss-rate;
-
-            description "Results for the Frame Loss test";
-            reference "RFC-2544 Section 26.3";
-
-            uses sa:results-header-group;
-
-            list result-item {
-                key frame-size;
-
-                description "The frame-loss result set for this frame-size";
-
-                uses result-common-group;
-
-                leaf frame-steps {
-                    type uint8;
-                    description "The number of steps recorded during Frame Loss test. Maximum is 8";
-                }
-
-                list frame-rate {
-                    key rate;
-                    description "A list of the losses at each rate step. This shows up to the 8 most recent steps";
-
-                    leaf rate {
-                        type uint32;
-                        units "Mb/s";
-                        description "The test rate used for this step";
-                    }
-
-                    leaf frame-loss {
-                        type uint32;
-                        units "m%";
-                        description "The percentage frames lost for this rate step (in 0.001% units)";
-                    }
-                }
-            }
-        }
-
-        container back-to-back {
-            if-feature back-to-back;
-
-            description "Results for the Back-to-Back (burst mode) test";
-
-            uses sa:results-header-group;
-
-            list result-item {
-                key frame-size;
-
-                leaf test-status {
-                    type sa:test-status;
-                    mandatory true;
-                    description "The current status of the subset of tests";
-                }
-
-                leaf frame-size {
-                    type sa:frame-size-type;
-                    units "bytes";
-                    description "The frame size used";
-                }
-
-                leaf burst-duration {
-                    type uint16;
-                    units "ms";
-                    description "The duration of the burst in milliseconds";
-                }
-
-                leaf average-burst-frame-count {
-                    type uint32;
-                    description "An average of the count of received frames for the test for this frame size";
-                }
-            }
-
-        }
-
-    }
-
-
-
-    rpc run-rfc2544-test {
-
-        description
-        "Run the configured RFC 2544 test";
-
-        input {
-            leaf tests-enabled {
-                type bits {
-                    bit throughput;
-                    bit latency;
-                    bit frameLoss;
-                    bit backToBack;
-                }
-                default "throughput latency frameLoss backToBack";
-                description "Choose the test components to run - by default all are selected";
-            }
-            
-
-            leaf send-subtest-event {
-                type boolean;
-                default true;
-                description "If true then send events for all of the state changes of tests at the 'frame size' level.
-                        If false events are sent only for state changes in the top level tests e.g. throughput";
-            }
-        }
-    }
-
-    rpc stop-rfc2544-test {
-        description
-        "Stop the running RFC 2544 test";
-    }
-
-    notification rfc2544-test-updated {
-        description 
-          "A rfc2544-test-updated notification is sent when the state of a test changes.";
-
-        uses sa:notification-group;
-
-        leaf frame-size {
-            type sa:frame-size-type;
-            units "bytes";
-            description "The frame size that is being tested. If not present then 
-                    the notification pertains to the overall test type";
-        }
-    }
-}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/svc-activation-types.yang b/drivers/microsemi/ea1000yang/src/main/yang/svc-activation-types.yang
deleted file mode 100644
index f82227b..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/svc-activation-types.yang
+++ /dev/null
@@ -1,190 +0,0 @@
-module svc-activation-types {
-
-    /*** NAMESPACE / PREFIX DEFINITION ***/
-
-    namespace "http://www.microsemi.com/svc-activation-types";
-    prefix "sa";
-
-    import ietf-yang-types {
-        prefix yang;
-        revision-date 2013-07-15;
-    }
-
-    import msea-types {
-        prefix msea;
-        revision-date 2016-02-29;
-    }
-
-    import msea-cfm {
-        prefix msea-cfm;
-        revision-date 2016-02-29;
-    }
-    /*** 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 defines common types that 
-    are used in both RFC 2544 and ITU-T Y.1564
-
-    Copyright 2015 Microsemi Inc.
-    All rights reserved.";
-
-    revision "2015-10-27" {
-        description
-        "Initial version - Sean Condon, Microsemi";
-        reference "Initial revision";
-    }
-
-    /*
-     * Typedefs
-     */
-    typedef test-status {
-        type enumeration {
-            enum disabled {
-                value 0;
-                description "Test is disabled";
-            }
-            enum running {
-                value 1;
-                description "Test is running";
-            }
-            enum pending {
-                value 2;
-                description "Test is pending";
-            }
-            enum stopped {
-                value 3;
-                description "Test is stopped";
-            }
-            enum completed {
-                value 4;
-                description "Test is completed";
-            }
-            enum failed {
-                value 5;
-                description "Test is failed";
-            }
-        }
-        description "Enumerated values for the status of a test";
-    }
-
-    typedef frame-size-type {
-        type uint16 {
-            range 64..9600;
-        }
-        description "Frame size in bytes data type";
-    }
-
-    grouping mep-config-attribs {
-        description 
-        "Attributes related to the configuration of a MEP";
-
-        leaf maintenance-domain {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain/msea-cfm:id";
-//                msea:xref-module "msea-cfm";
-            }
-            description
-            "A reference to a specific Maintenance Domain.";
-        }
-
-        leaf maintenance-association {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id=current()/../maintenance-domain]/msea-cfm:maintenance-association/msea-cfm:id";
-//                msea:xref-module "msea-cfm";
-            }
-            description
-            "A reference to a specific Maintenance Association.";
-        }
-
-        leaf maintenance-association-end-point {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id=current()/../maintenance-domain]/msea-cfm:maintenance-association[msea-cfm:id=current()/../maintenance-association]/msea-cfm:maintenance-association-end-point/msea-cfm:mep-identifier";
-//                msea:xref-module "msea-cfm";
-            }
-            description
-            "A reference to a specific Maintenance association End Point.";
-        }
-
-
-        leaf remote-mep-id {
-            type leafref {
-                path "/msea-cfm:mef-cfm/msea-cfm:maintenance-domain[msea-cfm:id=current()/../maintenance-domain]/msea-cfm:maintenance-association[msea-cfm:id=current()/../maintenance-association]/msea-cfm:remote-meps";
-//                msea:xref-module "msea-cfm";
-            }
-
-            must "current()/../maintenance-association-end-point != current()" {
-                error-message "Remote MEP Id must not be the same as Local MEP Id";
-                error-app-tag "msea-svc-must-01";
-            }
-
-            //mandatory true; //Should not be mandatory in a top level container 
-            description "The Id of the remote MEP";
-        }
-    }
-
-    grouping overwrite-pcp-attribs {
-        leaf overwrite-priority {
-            type msea:priority-type;
-            default 0;
-            description 
-            "The priority in the MEP's TAG is replaced 
-            with this priority if overwrite-pcp is present";
-        }
-    }
-
-    grouping results-header-group {
-        description
-        "Common attributes of a result set.";
-
-        leaf start-time {
-            type yang:date-and-time;
-            mandatory true;
-            description "Time at which the test was started.";
-        }
-
-        leaf end-time {
-            type yang:date-and-time;
-            description "Time at which the test ended. 
-                Not specified if test has ended.";
-        }
-
-        leaf test-status {
-            type test-status;
-            mandatory true;
-            description "The status of the test";
-        }
-    }
-
-    grouping notification-group {
-        description "Attributes related to notifications";
-        leaf new-status {
-          type sa:test-status;
-          mandatory true;
-          description "The new status of the test";
-        }
-        
-        leaf old-status {
-          type sa:test-status;
-          description "The old status of the test";
-        }
-
-        leaf test-type {
-            type string;
-            mandatory true;
-            description "Name of the test currently being performed";
-        }
-    }
-}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/main/yang/y-1564.yang b/drivers/microsemi/ea1000yang/src/main/yang/y-1564.yang
deleted file mode 100644
index 9f40ba8..0000000
--- a/drivers/microsemi/ea1000yang/src/main/yang/y-1564.yang
+++ /dev/null
@@ -1,667 +0,0 @@
-module y-1564 {
-
-    /*** NAMESPACE / PREFIX DEFINITION ***/
-
-    namespace "http://www.microsemi.com/y1564";
-    prefix "y1564";
-
-    import svc-activation-types {
-        prefix sa;
-    }
-
-    import msea-types {
-        prefix msea;
-        revision-date 2016-02-29;
-    }
-
-    /*** 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 defines the interface for Rec. ITU-T Y.1564
-    (03/2011) Ethernet service activation test methodology
-
-    Copyright 2015 Microsemi Inc.
-    All rights reserved.";
-
-    revision "2015-10-29" {
-        description
-        "Initial version - Sean Condon, Microsemi
-        This version does not cover frame reordering (Section 7.2.5)";
-        reference "Initial implementation";
-    }
-
-    /*
-     * Typedefs
-     */
-
-    /*
-     * Groupings
-     */
-    grouping service-attributes-group {
-        description
-        "Attributes for service definition";
-        leaf service-id {
-            type uint8 {
-                range 1..8;
-            }
-            mandatory true;
-            description "The unique ID of the Service";
-        }
-    }
-    grouping result-attributes-group {
-        description "Common attributes in result";
-
-        leaf status {
-            type sa:test-status;
-            mandatory true;
-            description "Status of the test - Values are disabled,
-                    running, pending, stopped, completed or failed";
-        }
-
-    }
-
-
-    grouping pass-fail-group {
-        leaf passed {
-            type boolean;
-            description
-            "Flag that indicates whether the test component
-            sucessfully met the test criteria.";
-        }
-
-        leaf fail-reason {
-            type enumeration {
-                enum notFailed {
-                    value 0;
-                    description "Test did not fail";
-                }
-                enum zeroTxCount {
-                    value 1;
-                    description "The test resulted in no transmitted packets";
-                }
-                enum zeroRxCount {
-                    value 2;
-                    description "No packets were received";
-                }
-                enum exceedFdvThreshold {
-                    value 3;
-                    description "The measured maximum Frame Delay Variation value exceeded the allowable threshold";
-                }
-                enum exceedFtdThreshold {
-                    value 4;
-                    description "The measured maximum Frame Transfer Delay value exceeded the allowable threshold";
-                }
-                enum exceedLossThreshold {
-                    value 5;
-                    description "The measured Frame Loss value exceeded the allowable threshold";
-                }
-                enum exceedAvailThreshold {
-                    value 6;
-                    description "The measured maximum Availability value exceeded the allowable threshold";
-                }
-                enum irAvgTooHigh {
-                    value 7;
-                    description "The measured Information Rate is above the maximum allowable rate";
-                }
-                enum irAvgTooLow {
-                    value 8;
-                    description "The measured Information Rate is below the maximum allowable rate";
-                }
-                enum targetUnknown {
-                    value 9;
-                    description "The MAC address of the target MEP was not known";
-                }
-            }
-        }
-    }
-
-    grouping y1564-test-result-group {
-        description "Common attributes in test result";
-        leaf tf {
-            type uint64;
-            description
-            "Count of the frames transmitted during the test period.";
-        }
-
-        leaf rf {
-            type uint64;
-            description
-            "Count of the frames received during the test period.";
-        }
-
-        leaf fl {
-            type uint64;
-            description
-            "Count of the frames lost during the test period.";
-        }
-
-        leaf flr {
-            type uint32;
-            units "m%";
-            description "The Frame Loss Ratio achieved. Units are 0.001%";
-        }
-
-        leaf elapsed {
-            type uint16;
-            units "s";
-            description
-            "The number of number of seconds the test has been running";
-        }
-
-        leaf fs {
-            type uint16;
-            units byte;
-            description "The Frame Size for which these results apply";
-        }
-
-        leaf ulr-min {
-            type uint32;
-            units "bit/s";
-            description "The minimum Utilised Line Rate achieved";
-        }
-
-        leaf ulr-max {
-            type uint32;
-            units "bit/s";
-            description "The maximum Utilised Line Rate achieved";
-        }
-
-        leaf ulr-avg {
-            type uint32;
-            units "bit/s";
-            description "The average Utilised Line Rate achieved";
-        }
-
-        leaf ulr-meas {
-            type uint32;
-            units "bit/s";
-            description
-            "The instantaneous Utilised Line Rate measured 
-            at the time of this result set";
-        }
-
-        leaf ftd-min {
-            type uint32;
-            units "μs";
-            description "The minimum Frame Transfer Delay achieved";
-        }
-
-        leaf ftd-max {
-            type uint32;
-            units "μs";
-            description "The maximum Frame Transfer Delay achieved";
-        }
-
-        leaf ftd-avg {
-            type uint32;
-            units "μs";
-            description "The average Frame Transfer Delay achieved";
-        }
-
-        leaf ftd-meas {
-            type uint32;
-            units "μs";
-            description
-            "The instantaneous Frame Transfer Delay
-            measured at the time of this result set";
-        }
-
-        leaf fdv-min {
-            type uint32;
-            units "μs";
-            description "The minimum Frame Delay Variation achieved";
-        }
-
-        leaf fdv-max {
-            type uint32;
-            units "μs";
-            description "The maximum Frame Delay Variation achieved";
-        }
-
-        leaf fdv-avg {
-            type uint32;
-            units "μs";
-            description "The average Frame Delay Variation achieved";
-        }
-
-        leaf fdv-meas {
-            type uint32;
-            units "μs";
-            description
-            "The instantaneous Frame Delay Variation measured
-            at the time of this result set";
-        }
-    }
-
-
-
-    /*
-     * Features
-     */
-    feature emix {
-        description
-        "This feature indicates that the device supports
-        EMIX style of repeating frame rates patterns";
-        reference
-        "Rec. ITU-T Y.1564 (03/2011) Section 8.1.1";
-    }
-
-    /*
-     * Configuration
-     */
-    container y1564-test {
-        description "The overall configuration of the Y.1564
-                tests are done through the 'service' entities";
-
-        leaf config-step-duration {
-            type uint16 {
-                range 1..60;
-            }
-            units second;
-            default 60;
-            description "The duration of each step when
-                    performing Configuration tests";
-            reference "Rec. ITU-T Y.1564 (03/2011) Section 8.3";
-        }
-
-        choice performance-duration-choice {
-            description
-            "Duration can be chosen from enumerated values or
-            specified as a duration in minutes";
-            reference "Rec. ITU-T Y.1564 (03/2011) Section 8.2.1";
-
-            case fixed-durations-renamed {
-                leaf performance-duration-fixed {
-                    type enumeration {
-                        enum Test15m {
-                            value 15;
-                            description "15 minute test duration";
-                        }
-                        enum Test2h {
-                            value 120;
-                            description "2 hour test duration";
-                        }
-                        enum Test24h {
-                            value 1440;
-                            description "24 hour test duration";
-                        }
-                        enum Unbounded {
-                            description "Unbounded test duration";
-                        }
-                    }
-                    default Test15m;
-                    description "Fixed durations set";
-                }
-            }
-
-
-            case test-duration-minutes {
-                leaf performance-duration {
-                    type uint16 {
-                        range 1..max;
-                    }
-                    units min;
-                    description
-                    "The duration of Performance tests specified in minutes";
-                    reference "Rec. ITU-T Y.1564 (03/2011) Section 8.2.1";
-                }
-            }
-        }
-
-        leaf performance-frame-size {
-            type sa:frame-size-type;
-            units octet;
-            default 512;
-            description
-            "The frame size used for the performance test.
-            Frame sizes for configuration are configured at a
-            the service level. This is a constant value per service (
-            frame size repeating emix values are not supported)";
-            reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.1";
-        }
-
-        list service-config {
-            key service-id;
-            description "The services can be configured on this device";
-
-            uses service-attributes-group;
-
-            leaf enabled {
-                type boolean;
-                default true;
-                description "Toggles whether the service is enabled in tests";
-            }
-
-
-            container mep-config {
-                presence "Presence indicates that a MEP has been configured";
-
-                uses msea:mep-config-attribs-noref;
-
-                leaf remote-mep-id {
-                          type msea:mep-id-type;    
-                    must "current()/../maintenance-association-end-point != current()" {
-                        error-message "Remote MEP Id must not be the same as Local MEP Id";
-                        error-app-tag "msea-svc-must-01";
-                    }
-
-                    //mandatory true; //Should not be mandatory in a top level container 
-                    description "The Id of the remote MEP";
-                }
-
-                container overwrite-pcp {
-                    presence "Enables PCP Overwrite";
-                    description "If present allows attributes to be
-                        specified for the PCP overwrite";
-
-                        uses sa:overwrite-pcp-attribs;
-
-                }
-            }
-
-            leaf config-frame-size {
-                type sa:frame-size-type;
-                units octet;
-                default 512;
-                description
-                "The frame size used for the service configuration test.
-                Frame sizes for performance test is configured at a
-                higher level. This is a constant value per service (
-                frame size repeating emix values are not supported)";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.1";
-            }
-
-            leaf cir {
-                type uint16 {
-                    range min..1000;
-                }
-                units "Mb/s";
-                default 1;
-                description "Committed Information Rate. If 0 then will return zeros";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1";
-            }
-
-            leaf eir {
-                type uint16 {
-                    range min..1000;
-                }
-                units "Mb/s";
-                description "Excess Information Rate. If 0 then this test is disabled";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1";
-            }
-
-            leaf colour-aware {
-                type boolean;
-                default true;
-                description "Indicates if the service is colour aware or not";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 6.2.1";
-            }
-
-            leaf m-factor {
-                type uint16;
-                units "kb/s";
-                description "The M factor is added to allow for the effect of 
-                the traffic policer's CBS and EBS settings, and test time.
-                Experience will determine the values for M.
-                Additional guidance on M is for further study.";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.2 C.2";
-            }
-
-            container enable-step-test {
-                presence "Enables step test";
-                description "If this item is present then a step load test of
-                CIR will be performed.
-                Otherwise simple validation of CIR will be performed.";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.2";
-
-                leaf step-load-size-override {
-                    type uint16 {
-                        range 1..1000;
-                    }
-                    units "Mb/s";
-                    description "A manually specified Step Load size in Mb/s.
-                    A maximum of 4 steps will be taken. If not specified
-                    the default behaviour means the CIR rate divided by
-                    4 rounded up to nearest Mb/s. When CIR rate is below 4Mb/s
-                    then a corresponding nuumber of steps will be used";
-                    reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1";
-                }
-            }
-
-            container enable-policing-test {
-                presence "Enables Policing test";
-                description "If this item is present then a Policing
-                test will be performed.
-                Otherwise no Policing will be performed.";
-                reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.2";
-            }
-
-            container service-acceptance-criteria {
-                description "Attributes that tune the Service Acceptance
-                Criteria per service.";
-
-                leaf accepted-flr {
-                    type uint32 {
-                        range min..100000;
-                    }
-                    units "m%";
-                    description "A measured Frame Loss Ratio greater than
-                    or equal to this value will result in test fail.
-                    Units are 0.001%. Default is 0";
-                    reference "Rec. ITU-T Y.1564 (03/2011) Section 8.3";
-                }
-
-                leaf accepted-ftd {
-                    type uint32;
-                    units "μs";
-                    mandatory true;
-                    description "A measured Frame Transfer Delay greater than
-                    or equal to this value will result in test fail.";
-                    reference "Rec. ITU-T Y.1564 (03/2011) Section 8.3";
-                }
-
-                leaf accepted-fdv {
-                    type uint32;
-                    units "μs";
-                    mandatory true;
-                    description "A measured Frame Delay Variation greater than
-                    or equal to this value will result in test fail.";
-                    reference "Rec. ITU-T Y.1564 (03/2011) Section 8.3";
-                }
-                
-                leaf accepted-availability {
-                    type uint32 {
-                        range min..100000;
-                    }
-                    units "m%";
-                    default 100000;
-                    description "A measured Availability for a performance
-                    test must meet or exceed this value. Values are in
-                    milli-percent. Default is 100%";
-                }
-            }
-        }
-    }
-
-    container y1564-results {
-        config false;
-        description "Top level container for results from the tests";
-        container configuration {
-            description
-            "The results of the Y.1564 Configuration tests on each
-            service which was enabled when the test was run";
-            reference "Rec. ITU-T Y.1564 (03/2011) Section 8.1.3";
-
-            list service {
-                key service-id;
-                description "The results for the services configured on this device";
-
-                uses service-attributes-group;
-
-                uses sa:results-header-group;
-
-                container cir-results {
-                    description "Results for Committed Information Rate 
-                            part of the test";
-
-                    leaf steps {
-                        type uint8;
-                        description "Indicates the number if steps taken so far.";
-                    }
-
-                    list step {
-                        key step-id;
-
-                        description "A list of results for each of the steps for
-                                the CIR test";
-
-                        leaf step-id {
-                            type uint8;
-                            mandatory true;
-                            description "The index of the step";
-                        }
-
-                        uses result-attributes-group;
-                        uses pass-fail-group;
-
-                        container green-frames {
-                            uses y1564-test-result-group;
-                            description "The details of frames marked green during 
-                                    the step of the CIR test";
-                        }
-                    }
-
-                }
-
-                container eir-results {
-                    description "Results for Excess Information Rate 
-                            part of the test";
-                    uses result-attributes-group;
-                    uses pass-fail-group;
-
-                    container green-frames {
-                        uses y1564-test-result-group;
-                        description
-                        "The details of frames marked green of the EIR test";
-                    }
-
-                    container yellow-frames {
-                        uses y1564-test-result-group;
-                        description
-                        "The details of frames marked yellow of the EIR test";
-                    }
-                }
-
-                container policer-results {
-                    presence "Can be omitted if policer test is
-                            not enabled on this service";
-                    description "Container for the policer results";
-                    uses result-attributes-group;
-                    uses pass-fail-group;
-                    
-                    container green-frames {
-                        uses y1564-test-result-group;
-                        description
-                        "The details of frames marked green of the Policer test";
-                    }
-
-                    container yellow-frames {
-                        uses y1564-test-result-group;
-                        description
-                        "The details of frames marked yellow of the Policer test";
-                    }
-                }
-
-            }
-        }
-
-        container performance {
-            description
-            "The results of the Y.1564 Performance tests on each 
-            service was 'enabled'";
-            reference "Rec. ITU-T Y.1564 (03/2011) Section 8.2.2";
-
-            uses sa:results-header-group;
-
-            list service {
-                key service-id;
-                description "The services can be configured on this device";
-
-                uses service-attributes-group;
-
-                uses pass-fail-group;
-
-                uses y1564-test-result-group;
-
-                leaf avail-sec {
-                    type uint32;
-                    units "s";
-                    description
-                    "The count of seconds during the test period for which
-                    service was Available";
-                }
-            }
-        }
-    }
-
-    /*
-     * RPCs
-     */
-    rpc run-y1564-test {
-        description
-        "Run the configured Y.1564 test on each service 
-        that has been marked 'enabled'";
-
-        input {
-            leaf tests-enabled {
-                type bits {
-                    bit configuration {
-                        description "Runs the configuration tests";
-                    }
-                    bit performance {
-                        description "Runs the performance tests";
-                    }
-                }
-                default "configuration performance";
-                description
-                "Bit mask to define which parts of the test are run.
-                Specify as a set of space separated string values";
-            }
-        }
-    }
-
-    rpc stop-y1564-test {
-        description
-        "Stop the running Y.1564 test on all services";
-    }
-
-    /*
-     * Notifications
-     */
-    notification y1564-test-updated {
-        description 
-          "A y1564-test-updated notification is sent
-          when the state of a test changes.";
-
-        uses sa:notification-group;
-
-        leaf service-id {
-            type uint16;
-            mandatory true;
-            description "The ID of the Service that is being tested";
-        }
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
deleted file mode 100644
index 49723f0..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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.io.IOException;
-import java.io.UncheckedIOException;
-
-import org.onosproject.drivers.microsemi.yang.impl.IetfSystemManager;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.IetfSystemMicrosemiService;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemService;
-import org.onosproject.yms.app.yab.MockYmsManager;
-
-public class MockIetfSystemManager extends IetfSystemManager {
-
-    @Override
-    public void activate() {
-        try {
-            ymsService = new MockYmsManager();
-            ych = ymsService.getYangCodecHandler();
-            ych.addDeviceSchema(IetfSystemService.class);
-            ych.addDeviceSchema(IetfSystemMicrosemiService.class);
-        } catch (InstantiationException | IllegalAccessException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            e.printStackTrace();
-        } catch (IOException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            throw new UncheckedIOException(e);
-        }
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
deleted file mode 100644
index af34a02..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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.io.IOException;
-import java.io.UncheckedIOException;
-
-import org.onosproject.drivers.microsemi.yang.impl.MseaCfmManager;
-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.soam.fm.rev20160229.MseaSoamFmService;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.soam.pm.rev20160229.MseaSoamPmService;
-import org.onosproject.yms.app.yab.MockYmsManager;
-
-public class MockMseaCfmManager extends MseaCfmManager {
-
-    @Override
-    public void activate() {
-        try {
-            ymsService = new MockYmsManager();
-            ych = ymsService.getYangCodecHandler();
-            ych.addDeviceSchema(MseaCfmService.class);
-            ych.addDeviceSchema(MseaSoamFmService.class);
-            ych.addDeviceSchema(MseaSoamPmService.class);
-        } catch (InstantiationException | IllegalAccessException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            e.printStackTrace();
-        } catch (IOException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            throw new UncheckedIOException(e);
-        }
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
deleted file mode 100644
index 60aae90..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.io.IOException;
-import java.io.UncheckedIOException;
-
-import org.onosproject.drivers.microsemi.yang.impl.MseaSaFilteringManager;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringService;
-import org.onosproject.yms.app.yab.MockYmsManager;
-
-public class MockMseaSaFilteringManager extends MseaSaFilteringManager {
-
-    @Override
-    public void activate() {
-        try {
-            ymsService = new MockYmsManager();
-            ych = ymsService.getYangCodecHandler();
-            ych.addDeviceSchema(MseaSaFilteringService.class);
-        } catch (InstantiationException | IllegalAccessException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            e.printStackTrace();
-        } catch (IOException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            throw new UncheckedIOException(e);
-        }
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
deleted file mode 100644
index c715e78..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.io.IOException;
-import java.io.UncheckedIOException;
-
-import org.onosproject.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceService;
-import org.onosproject.yms.app.yab.MockYmsManager;
-
-public class MockMseaUniEvcServiceManager extends MseaUniEvcServiceManager {
-    @Override
-    public void activate() {
-        try {
-            ymsService = new MockYmsManager();
-            ych = ymsService.getYangCodecHandler();
-            ych.addDeviceSchema(MseaUniEvcServiceService.class);
-        } catch (InstantiationException | IllegalAccessException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            e.printStackTrace();
-        } catch (IOException e) {
-            log.error("Failed to load YMS Manager: " + e.getMessage());
-            throw new UncheckedIOException(e);
-        }
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
deleted file mode 100644
index b663554..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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 static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.io.UncheckedIOException;
-import java.util.List;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.Ip4Address;
-import org.onosproject.drivers.microsemi.yang.impl.MseaSaFilteringManager;
-import org.onosproject.netconf.NetconfDeviceInfo;
-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.SourceAddressRange;
-import org.onosproject.yms.ymsm.YmsService;
-
-public class MseaSaFilteringManagerTest {
-
-    MseaSaFilteringManager mseaSaSvc;
-    YmsService ymsService;
-    NetconfSession session;
-
-    @Before
-    public void setUp() throws Exception {
-        try {
-            mseaSaSvc = new MockMseaSaFilteringManager();
-            mseaSaSvc.activate();
-        } catch (UncheckedIOException e) {
-            fail(e.getMessage());
-        }
-        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
-        session = new MockNetconfSessionEa1000(deviceInfo);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void testGetMseaSaFilteringMseaSaFilteringOpParamNetconfSession() throws NetconfException {
-        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
-                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
-
-        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
-                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
-        MseaSaFilteringOpParam mseaSaFilteringFilter =
-                (MseaSaFilteringOpParam) opBuilder
-                .sourceIpaddressFiltering(sipBuilder.build())
-                .build();
-
-        MseaSaFiltering result = mseaSaSvc.getMseaSaFiltering(mseaSaFilteringFilter, session);
-
-        //Results come from MockNetconfSession SAMPLE_MSEASAFILTERING_REPLY_INIT
-        assertNotNull(result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange());
-        List<SourceAddressRange> ranges = result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
-        assertEquals(2, ranges.size());
-
-        for (SourceAddressRange sa:ranges) {
-            if (sa.rangeId() == 1) {
-                assertEquals("10.10.10.10/16", sa.ipv4AddressPrefix());
-
-            } else if (sa.rangeId() == 2) {
-                assertEquals("20.30.40.50/18", sa.ipv4AddressPrefix());
-            }
-        }
-    }
-
-    @Test
-    public void testSetMseaSaFilteringMseaSaFilteringOpParamNetconfSessionNcDsType() {
-
-        MseaSaFilteringOpParam mseaSaFilteringConfig = createConfigForEdit("192.168.60.10/27", (short) 3, "Filter3");
-
-        //Calling on the edit-config just makes the change and hopefully does not throw a Netconf Exception
-        try {
-            mseaSaSvc.setMseaSaFiltering(mseaSaFilteringConfig, session, TargetConfig.RUNNING);
-        } catch (NetconfException e) {
-            e.printStackTrace();
-            fail("NETCONF Exception: " + e.getMessage());
-        }
-    }
-
-    /**
-     * This is also called from the test case EA1000FlowRuleProgrammableTest().
-     * In the ea1000driver project
-     * @return
-     */
-    public static MseaSaFilteringOpParam createConfigForEdit(String ipAddrPrefix, short rangeId, String rangeName) {
-        SourceAddressRange.SourceAddressRangeBuilder sarBuilder =
-                new DefaultSourceAddressRange.SourceAddressRangeBuilder();
-        SourceAddressRange saRange =
-                sarBuilder
-                .ipv4AddressPrefix(ipAddrPrefix)
-                .rangeId(rangeId)
-                .name(rangeName)
-                .build();
-
-        InterfaceEth0.InterfaceEth0Builder eth0Builder =
-                new DefaultInterfaceEth0.InterfaceEth0Builder();
-        InterfaceEth0 eth0 = eth0Builder.addToSourceAddressRange(saRange).build();
-
-        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
-                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
-
-        SourceIpaddressFiltering sip = sipBuilder.interfaceEth0(eth0).build();
-
-        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
-                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
-        MseaSaFilteringOpParam mseaSaFilteringConfig =
-                (MseaSaFilteringOpParam) opBuilder
-                .sourceIpaddressFiltering(sipBuilder.build())
-                .build();
-
-        return mseaSaFilteringConfig;
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
deleted file mode 100644
index 79e3435..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * 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 static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-
-import java.io.UncheckedIOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.Ip4Address;
-import org.onosproject.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
-import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
-import org.onosproject.netconf.NetconfDeviceInfo;
-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.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.EvcPerUniServiceTypeEnum;
-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.evcperuniextensionattributes.tagmanipulation.DefaultTagPush;
-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.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.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.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.bwpgroup.bwp.ColorModeEnum;
-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;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnin;
-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.onosproject.yms.ymsm.YmsService;
-
-public class MseaUniEvcServiceManagerTest {
-
-    MseaUniEvcServiceManager mseaUniEvcServiceSvc;
-    YmsService ymsService;
-    NetconfSession session;
-
-    @Before
-    public void setUp() throws Exception {
-        try {
-            mseaUniEvcServiceSvc = new MockMseaUniEvcServiceManager();
-            mseaUniEvcServiceSvc.activate();
-        } catch (UncheckedIOException e) {
-            fail(e.getMessage());
-        }
-        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
-        session = new MockNetconfSessionEa1000(deviceInfo);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void testGetMseaUniEvcServiceMseaUniEvcServiceOpParamNetconfSession() {
-        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();
-        MseaUniEvcService result = null;
-        try {
-            result =
-                    mseaUniEvcServiceSvc.getConfigMseaUniEvcService(
-                            mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
-        } catch (NetconfException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            fail("Error: " + e.getMessage());
-        }
-
-        assertNotNull(result);
-    }
-
-    @Test
-    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamEvcs() {
-      TagPush.TagPushBuilder tpBuilder1 = 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 tpInnerBuilder1 =
-              new org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea
-                  .uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes
-                  .tagmanipulation.tagpush.DefaultTagPush.TagPushBuilder();
-      TagPush tp1 = tpBuilder1
-          .tagPush(tpInnerBuilder1
-                  .outerTagVlan(new VlanIdType(3))
-                  .pushTagType(PushTagTypeEnum.PUSHSTAG)
-                  .build())
-          .build();
-
-      EvcPerUnin.EvcPerUninBuilder epunBuilder1 = new DefaultEvcPerUnin.EvcPerUninBuilder();
-      EvcPerUnin epun1 = epunBuilder1
-              .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
-              .ceVlanMap(ServiceListType.fromString("10"))
-              .ingressBwpGroupIndex("0")
-              .tagManipulation(tp1)
-              .build();
-
-      EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
-      EvcPerUnic epuc1 = epucBuilder1
-              .ceVlanMap(new ServiceListType("11"))
-              .ingressBwpGroupIndex("0")
-              .build();
-
-      EvcPerUni.EvcPerUniBuilder epuBuilder = new DefaultEvcPerUni.EvcPerUniBuilder();
-
-      List<Evc> evcList = new ArrayList<Evc>();
-      Evc.EvcBuilder evcBuilder1 = new DefaultEvc.EvcBuilder();
-      evcList.add(evcBuilder1
-              .evcIndex(1)
-              .name(new Identifier45("evc-1"))
-              .evcPerUni(epuBuilder.evcPerUnin(epun1).evcPerUnic(epuc1).build())
-              .build());
-
-
-      EvcPerUnin.EvcPerUninBuilder epunBuilder2 = new DefaultEvcPerUnin.EvcPerUninBuilder();
-      EvcPerUnin epun2 = epunBuilder2
-              .ceVlanMap(ServiceListType.fromString("13"))
-              .ingressBwpGroupIndex("0")
-              .build();
-
-      EvcPerUnic.EvcPerUnicBuilder epucBuilder2 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
-      EvcPerUnic epuc2 = epucBuilder2
-              .ceVlanMap(new ServiceListType("12"))
-              .ingressBwpGroupIndex("0")
-              .build();
-
-      Evc.EvcBuilder evcBuilder2 = new DefaultEvc.EvcBuilder();
-      evcList.add(evcBuilder2
-              .evcIndex(2)
-              .name(new Identifier45("evc-2"))
-              .evcPerUni(epuBuilder.evcPerUnin(epun2).evcPerUnic(epuc2).build())
-              .build());
-
-      Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
-      Uni uni = uniBuilder.name(new Identifier45("testUni")).evc(evcList).build();
-
-      MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
-      MefServices mefServices = mefBuilder.uni(uni).build();
-
-      MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
-              new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
-
-      MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
-              (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
-      try {
-          mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
-      } catch (NetconfException e) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-          fail("Error: " + e.getMessage());
-      }
-    }
-
-    @Test
-    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamProfiles() {
-      List<Cos> cosList = new ArrayList<Cos>();
-      Cos.CosBuilder cosBuilder0 = new DefaultCos.CosBuilder();
-      cosList.add(cosBuilder0.cosIndex(0).name("cos0").build());
-      Cos.CosBuilder cosBuilder1 = new DefaultCos.CosBuilder();
-      cosList.add(cosBuilder1.cosIndex(1).name("cos1").build());
-
-      List<BwpGroup> bwpGroupList = new ArrayList<BwpGroup>();
-      BwpGroup.BwpGroupBuilder bwpGrpBuilder = new DefaultBwpGroup.BwpGroupBuilder();
-      bwpGroupList.add(bwpGrpBuilder.groupIndex((short) 0).build());
-
-      List<Bwp> bwpList = new ArrayList<Bwp>();
-      Bwp.BwpBuilder bwpBuilder1 = new DefaultBwp.BwpBuilder();
-      bwpList.add(bwpBuilder1.cosIndex(0).colorMode(ColorModeEnum.COLORAWARE).build());
-      Bwp.BwpBuilder bwpBuilder2 = new DefaultBwp.BwpBuilder();
-      bwpList.add(bwpBuilder2.cosIndex(1).colorMode(ColorModeEnum.COLORBLIND).build());
-
-      BwpGroup.BwpGroupBuilder bwpGrpBuilder1 = new DefaultBwpGroup.BwpGroupBuilder();
-      bwpGroupList.add(bwpGrpBuilder1.groupIndex((short) 1).bwp(bwpList).build());
-
-      Profiles.ProfilesBuilder profilesBuilder = new DefaultProfiles.ProfilesBuilder();
-      Profiles profiles = profilesBuilder.bwpGroup(bwpGroupList).build();
-
-      MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
-      MefServices mefServices = mefBuilder.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) {
-          // TODO Auto-generated catch block
-          e.printStackTrace();
-          fail("Error: " + e.getMessage());
-      }
-    }
-
-    @Test
-    public void testGetMseaUniEvcCeVlanMaps() {
-
-        try {
-            MseaUniEvcService ceVlanMapsResult7 =
-                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
-
-            assertNotNull(ceVlanMapsResult7.mefServices().uni().evc());
-
-            List<Evc> evcList = ceVlanMapsResult7.mefServices().uni().evc();
-            assertEquals(3, evcList.size());
-            for (Evc evc : evcList) {
-               assertNotNull(evc.evcPerUni().evcPerUnic().ceVlanMap());
-               assertNotNull(evc.evcPerUni().evcPerUnin().ceVlanMap());
-
-               if (evc.evcIndex() == 7) {
-                   assertEquals("700,710,720", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
-                   assertEquals("701:703", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
-               }
-            }
-
-        } catch (NetconfException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            fail("Error: " + e.getMessage());
-        }
-    }
-
-    @Test
-    public void testChangeEvcCeVlanMap() {
-        EvcPerUnin.EvcPerUninBuilder epunBuilder1 = new DefaultEvcPerUnin.EvcPerUninBuilder();
-        EvcPerUnin epun1 = epunBuilder1
-                .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
-                .ceVlanMap(ServiceListType.fromString("10"))
-                .ingressBwpGroupIndex("0")
-                .build();
-
-        EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
-        EvcPerUnic epuc1 = epucBuilder1
-                .ceVlanMap(new ServiceListType("11"))
-                .ingressBwpGroupIndex("0")
-                .build();
-
-        EvcPerUni.EvcPerUniBuilder epuBuilder = DefaultEvcPerUni.builder().evcPerUnic(epuc1).evcPerUnin(epun1);
-
-        Evc evc = CustomEvc.builder().evcPerUni(epuBuilder.build()).build();
-
-        assertEquals("10", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
-        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
-
-        evc = CustomEvc.builder(evc).addToCeVlanMap(new ServiceListType("12,13"), UniSide.NETWORK).build();
-
-        assertEquals("10,12:13", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
-        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
-
-    }
-
-    @Test
-    public void testChangeEvcCeVlanMapNoValues() {
-        EvcPerUnin.EvcPerUninBuilder epunBuilder1 = CustomEvcPerUnin.builder();
-        EvcPerUnin epun1 = epunBuilder1
-                .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
-                .ingressBwpGroupIndex("0")
-                .build();
-
-        EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = CustomEvcPerUnic.builder();
-        EvcPerUnic epuc1 = epucBuilder1
-                .ingressBwpGroupIndex("0")
-                .build();
-
-        EvcPerUni.EvcPerUniBuilder epuBuilder = DefaultEvcPerUni.builder().evcPerUnic(epuc1).evcPerUnin(epun1);
-
-        Evc evc = CustomEvc.builder().evcPerUni(epuBuilder.build()).build();
-
-        assertEquals("0", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
-        assertEquals("0", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
-    }
-
-    @Test
-    public void testRemoveEvcUniFlowEntries() {
-
-        Map<Integer, String> ceVlanUpdates = new TreeMap<>();
-        ceVlanUpdates.put((1 << 2), "");
-        ceVlanUpdates.put((1 << 2) + 1, "");
-        ceVlanUpdates.put((2 << 2), "");
-        ceVlanUpdates.put((2 << 2) + 1, "");
-
-        ceVlanUpdates.put((7 << 2), "700,710,720");
-        ceVlanUpdates.put((7 << 2) + 1, "701:703");
-        ceVlanUpdates.put((8 << 2), "800,810,820");
-        ceVlanUpdates.put((8 << 2) + 1, "801,802,803");
-
-        Map<Integer, List<Short>> flowVlanIdMap = new HashMap<>();
-        //These should get ignored because whole EVC is being deleted
-        flowVlanIdMap.put(1 << 2, new ArrayList<Short>());
-        flowVlanIdMap.get(1 << 2).add((short) 11);
-
-        flowVlanIdMap.put((1 << 2) + 1, new ArrayList<Short>());
-        flowVlanIdMap.get((1 << 2) + 1).add((short) 12L);
-
-        //These are the EVCs being removed
-        flowVlanIdMap.put(7 << 2, new ArrayList<Short>());
-        flowVlanIdMap.get(7 << 2).add((short) 730L);
-        flowVlanIdMap.get(7 << 2).add((short) 740L);
-
-        flowVlanIdMap.put((7 << 2) + 1, new ArrayList<Short>());
-        flowVlanIdMap.get((7 << 2) + 1).add((short) 705L);
-        flowVlanIdMap.get((7 << 2) + 1).add((short) 706L);
-
-        flowVlanIdMap.put(8 << 2, new ArrayList<Short>());
-        flowVlanIdMap.get(8 << 2).add((short) 830L);
-        flowVlanIdMap.get(8 << 2).add((short) 840L);
-
-        flowVlanIdMap.put((8 << 2) + 1, new ArrayList<Short>());
-        flowVlanIdMap.get((8 << 2) + 1).add((short) 805L);
-        flowVlanIdMap.get((8 << 2) + 1).add((short) 806L);
-
-        try {
-            mseaUniEvcServiceSvc.removeEvcUniFlowEntries(
-                    ceVlanUpdates, flowVlanIdMap, session, TargetConfig.RUNNING,
-                    UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS);
-        } catch (NetconfException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-            fail("Error: " + e.getMessage());
-        }
-    }
-
-    @Test
-    public void testGetVlanSet1() {
-        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10");
-        assertEquals(1, vlanIds.length);
-    }
-
-    @Test
-    public void testGetVlanSet2() {
-        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20");
-        assertEquals(11, vlanIds.length);
-        assertEquals(10, vlanIds[0].shortValue());
-        assertEquals(20, vlanIds[10].shortValue());
-    }
-
-    @Test
-    public void testGetVlanSet3() {
-        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20,30:40");
-        assertEquals(22, vlanIds.length);
-        assertEquals(10, vlanIds[0].shortValue());
-        assertEquals(40, vlanIds[21].shortValue());
-    }
-
-    @Test
-    public void testGetVlanSet4() {
-        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10,20,30");
-        assertEquals(3, vlanIds.length);
-        assertEquals(10, vlanIds[0].shortValue());
-        assertEquals(30, vlanIds[2].shortValue());
-    }
-
-    @Test
-    public void testVlanListAsString() {
-        assertEquals("20:22", CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22}));
-
-        assertEquals("20:22,24:25",
-                CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22, 24, 25}));
-
-        assertEquals("30,33,36:40",
-                CeVlanMapUtils.vlanListAsString(new Short[]{30, 33, 36, 37, 38, 39, 40}));
-
-        assertEquals("20", CeVlanMapUtils.vlanListAsString(new Short[]{20}));
-
-        assertEquals("20,22,24,26,28",
-                CeVlanMapUtils.vlanListAsString(new Short[]{20, 22, 24, 26, 28}));
-    }
-
-    @Test
-    public void testAddtoCeVlanMap() {
-        assertEquals("20,22:24,26,28",
-                CeVlanMapUtils.addtoCeVlanMap("20,22,24,26,28", (short) 23));
-
-        assertEquals("20:26,28",
-                CeVlanMapUtils.addtoCeVlanMap("20,21,22,24,25,26,28", (short) 23));
-
-        assertEquals("20,23",
-                CeVlanMapUtils.addtoCeVlanMap("20", (short) 23));
-
-        assertEquals("20,22:23",
-                CeVlanMapUtils.addtoCeVlanMap("20,22", (short) 23));
-    }
-
-    @Test
-    public void testCombineVlanSets() {
-        assertEquals("10:11,13:14", CeVlanMapUtils.combineVlanSets("10:11", "13:14"));
-
-        assertEquals("10:14", CeVlanMapUtils.combineVlanSets("10:11", "12:14"));
-
-        assertEquals("10:11,14", CeVlanMapUtils.combineVlanSets("10:11", "14"));
-
-        assertEquals("10:12", CeVlanMapUtils.combineVlanSets("10:11", "11:12"));
-    }
-
-    @Test
-    public void testRemoveZeroIfPossible() {
-        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible(""));
-
-        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible("0"));
-
-        assertEquals("1,3", CeVlanMapUtils.removeZeroIfPossible("0:1,3"));
-
-        assertEquals("1:2", CeVlanMapUtils.removeZeroIfPossible("0:2"));
-
-        assertEquals("10:12", CeVlanMapUtils.removeZeroIfPossible("0,10:12"));
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
deleted file mode 100644
index 7645a32..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.yms.app.yab;
-
-import static java.lang.String.valueOf;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.core.CoreService;
-import org.onosproject.core.IdGenerator;
-import org.onosproject.drivers.netconf.MockCoreService;
-import org.onosproject.yms.app.ych.DefaultYangCodecHandler;
-import org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry;
-import org.onosproject.yms.app.ydt.YangRequestWorkBench;
-import org.onosproject.yms.app.ysr.DefaultYangModuleLibrary;
-import org.onosproject.yms.app.ysr.MockYangSchemaRegistry;
-import org.onosproject.yms.app.ysr.YangSchemaRegistry;
-import org.onosproject.yms.ych.YangCodecHandler;
-import org.onosproject.yms.ych.YangDataTreeCodec;
-import org.onosproject.yms.ych.YangProtocolEncodingFormat;
-import org.onosproject.yms.ydt.YdtBuilder;
-import org.onosproject.yms.ydt.YdtResponse;
-import org.onosproject.yms.ydt.YdtWalker;
-import org.onosproject.yms.ydt.YmsOperationType;
-import org.onosproject.yms.ymsm.YmsService;
-import org.onosproject.yms.ynh.YangNotificationService;
-import org.onosproject.yms.ysr.YangModuleIdentifier;
-import org.onosproject.yms.ysr.YangModuleLibrary;
-
-/**
- * Represents implementation of YANG application management system manager.
- */
-public class MockYmsManager
-        implements YmsService {
-    private static final String MODULE_ID = "module-id";
-
-    YangSchemaRegistry schemaRegistry;
-    private YangModuleLibrary library;
-    private IdGenerator moduleIdGenerator;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    public MockYmsManager()
-            throws InstantiationException, IllegalAccessException, IOException {
-        coreService = new MockCoreService();
-        moduleIdGenerator = coreService.getIdGenerator(MODULE_ID);
-        library = new DefaultYangModuleLibrary(getNewModuleId());
-        YangCodecRegistry.initializeDefaultCodec();
-    }
-
-    @Override
-    public YdtBuilder getYdtBuilder(String logicalRootName,
-                                    String rootNamespace,
-                                    YmsOperationType operationType) {
-        return new YangRequestWorkBench(logicalRootName, rootNamespace,
-                                        operationType, schemaRegistry, false);
-    }
-
-    @Override
-    public YdtBuilder getYdtBuilder(String logicalRootName,
-                                    String rootNamespace,
-                                    YmsOperationType operationType,
-                                    Object schemaRegistryForYdt) {
-        return null;
-    }
-
-    @Override
-    public YdtWalker getYdtWalker() {
-        return null;
-    }
-
-    @Override
-    public YdtResponse executeOperation(YdtBuilder operationRequest) {
-        YangApplicationBroker requestBroker =
-                new YangApplicationBroker(schemaRegistry);
-        switch (operationRequest.getYmsOperationType()) {
-            case EDIT_CONFIG_REQUEST:
-                try {
-                    return requestBroker.processEdit(operationRequest);
-                } catch (CloneNotSupportedException e) {
-                }
-                break;
-            case QUERY_CONFIG_REQUEST:
-            case QUERY_REQUEST:
-                return requestBroker.processQuery(operationRequest);
-            case RPC_REQUEST:
-                return requestBroker.processOperation(operationRequest);
-            default:
-        }
-        return null;
-    }
-
-    @Override
-    public YangNotificationService getYangNotificationService() {
-        return null;
-    }
-
-    @Override
-    public void registerService(Object appManager, Class<?> yangService,
-                                List<String> supportedFeatureList) {
-    }
-
-    @Override
-    public void unRegisterService(Object appManager, Class<?> yangService) {
-
-    }
-
-    @Override
-    public YangModuleLibrary getYangModuleLibrary() {
-        return library;
-    }
-
-    @Override
-    public String getYangFile(YangModuleIdentifier moduleIdentifier) {
-        return null;
-    }
-
-    @Override
-    public void registerDefaultCodec(YangDataTreeCodec defaultCodec,
-                                     YangProtocolEncodingFormat dataFormat) {
-    }
-
-    @Override
-    public YangCodecHandler getYangCodecHandler() {
-        YangSchemaRegistry registry = new MockYangSchemaRegistry();
-        DefaultYangCodecHandler handler = new DefaultYangCodecHandler(registry);
-        handler.setLibrary(new DefaultYangModuleLibrary(getNewModuleId()));
-        return handler;
-    }
-
-    private String getNewModuleId() {
-        return valueOf(moduleIdGenerator.getNewId());
-    }
-}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
deleted file mode 100644
index a8a971c..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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 support for NETCONF for EA1000.
- */
-package org.onosproject.yms.app.yab;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java
deleted file mode 100644
index 5de56fd..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java
+++ /dev/null
@@ -1,767 +0,0 @@
-/*
- * 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.yms.app.ysr;
-
-import org.onosproject.yangutils.datamodel.YangInclude;
-import org.onosproject.yangutils.datamodel.YangModule;
-import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.datamodel.YangSchemaNode;
-import org.onosproject.yangutils.datamodel.YangSubModule;
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yms.ysr.YangModuleIdentifier;
-import org.onosproject.yms.ysr.YangModuleInformation;
-import org.onosproject.yms.ysr.YangModuleLibrary;
-import org.slf4j.Logger;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.UncheckedIOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.regex.Pattern;
-
-import static java.util.Collections.sort;
-import static org.apache.commons.io.FileUtils.deleteDirectory;
-import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yangutils.utils.UtilConstants.EVENT_STRING;
-import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
-import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
-import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
-import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
-import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
-import static org.slf4j.LoggerFactory.getLogger;
-
-
-/**
- * Representation of default YANG schema registry. Yang schema registry
- * provides interface to an application to register its YANG schema
- * with YMS. It provides YANG schema nodes to YDT, YNB and YSB.
- */
-public class MockYangSchemaRegistry implements YangSchemaRegistry {
-
-    private static final String SYSTEM = SLASH + "system" + SLASH;
-    private static final String MAVEN = "mvn:";
-    private static final String JAR = ".jar";
-    private static final String USER_DIRECTORY = "user.dir";
-    private static final String AT = "@";
-    private static final String DATE_FORMAT = "yyyy-mm-dd";
-    private static final String ONOS = "org.onosproject";
-    private static final Logger log = getLogger(MockYangSchemaRegistry.class);
-
-    private static final String FS = File.separator;
-    private static final String USER_DIR = System.getProperty("user.dir").replaceAll("ea1000driver", "ea1000yang");
-//    private static final String BUCK_OUT_DIR = "/buck-out/gen/drivers/microsemi/ea1000yang/";
-    private static final String BUCK_OUT_BIN_LOC =
-            "/buck-out/bin/drivers/microsemi/ea1000yang/"
-            + "lib__onos-drivers-microsemi-ea1000yang__classes/YangMetaData.ser";
-    private static final String PATH = FS + "target" + FS + "classes" + FS;
-    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
-            FS + "YangMetaData.ser";
-    private static final String RESOURCE = "src/test/resources";
-
-
-    /*
-     * Map for storing app objects.
-     */
-    private final ConcurrentMap<String, Object> appObjectStore;
-
-    /*
-     * Map for storing YANG schema nodes.
-     */
-    private final ConcurrentMap<String, ConcurrentMap<String, YangSchemaNode>>
-            yangSchemaStore;
-
-    /*
-     * Map for storing YANG schema nodes with respect to root's generated
-     * interface file name.
-     */
-    private final ConcurrentMap<String, YangSchemaNode> interfaceNameKeyStore;
-
-    /*
-     * Map for storing YANG schema nodes root's generated op param file name.
-     */
-    private final ConcurrentMap<String, YangSchemaNode> opParamNameKeyStore;
-
-    /*
-     * Map for storing YANG schema nodes with respect to notifications.
-     */
-    private final ConcurrentMap<String, YangSchemaNode> eventNameKeyStore;
-
-    /*
-     * Map for storing YANG schema nodes with respect to app name.
-     */
-    private final ConcurrentMap<String, YangSchemaNode> appNameKeyStore;
-
-    /*
-     * Map for storing registered classes.
-     */
-    private final ConcurrentMap<String, Class<?>> registerClassStore;
-
-    /*
-     * Map for storing YANG file details.
-     */
-    private final ConcurrentMap<YangModuleIdentifier, String> yangFileStore;
-
-    /**
-     * Map for storing schema nodes with respect to namespace.
-     */
-    private final ConcurrentMap<String, YangSchemaNode> nameSpaceSchemaStore;
-
-    private final ConcurrentMap<Object, Boolean> ynhRegistrationStore;
-    private final ConcurrentMap<String, String> jarPathStore;
-
-    /**
-     * Creates an instance of default YANG schema registry.
-     */
-    public MockYangSchemaRegistry() {
-        appObjectStore = new ConcurrentHashMap<>();
-        yangSchemaStore = new ConcurrentHashMap<>();
-        interfaceNameKeyStore = new ConcurrentHashMap<>();
-        opParamNameKeyStore = new ConcurrentHashMap<>();
-        eventNameKeyStore = new ConcurrentHashMap<>();
-        registerClassStore = new ConcurrentHashMap<>();
-        yangFileStore = new ConcurrentHashMap<>();
-        appNameKeyStore = new ConcurrentHashMap<>();
-        ynhRegistrationStore = new ConcurrentHashMap<>();
-        jarPathStore = new ConcurrentHashMap<>();
-        nameSpaceSchemaStore = new ConcurrentHashMap<>();
-    }
-
-
-    /**
-     * This is overridden for Maven and Buck.
-     *
-     * Because they don't have a Bundle Context, and the JAR file doesn't exist
-     * when this is called, we have to work with the .ser file
-     */
-    @Override
-    public void registerApplication(Object appObject, Class<?> serviceClass) {
-        synchronized (MockYangSchemaRegistry.class) {
-            doPreProcessing(serviceClass, appObject);
-            if (!verifyIfApplicationAlreadyRegistered(serviceClass)) {
-
-                List<YangNode> curNodes = new ArrayList<>();
-                Path serFile = Paths.get(USER_DIR, PATH, SER_FILE_PATH);
-                if (USER_DIR.contains("ea1000yang")) {
-                    serFile = Paths.get(USER_DIR, PATH, SER_FILE_PATH);
-                } else {
-                    serFile = Paths.get(USER_DIR, BUCK_OUT_BIN_LOC);
-                }
-
-                if (Files.notExists(serFile)) {
-                    throw new UncheckedIOException(
-                            new IOException("File " + serFile.toString() + " does not exist!"));
-                }
-
-                try {
-                    curNodes.addAll(deSerializeDataModel(serFile.toString()));
-                } catch (IOException e) {
-                    throw new UncheckedIOException(e);
-                }
-
-                // process application registration.
-                if (curNodes != null && !curNodes.isEmpty()) {
-                    jarPathStore.put(serviceClass.getName(), serFile.toString());
-                    processRegistration(serviceClass, serFile.toString(),
-                                        curNodes, appObject, false);
-                } else {
-                    throw new UncheckedIOException(
-                            new IOException("Unable to find Yang Nodes in serFile: " + serFile.toString()));
-                }
-            }
-        }
-    }
-
-    @Override
-    public void unRegisterApplication(Object managerObject,
-                                      Class<?> serviceClass) {
-        synchronized (MockYangSchemaRegistry.class) {
-            YangSchemaNode curNode;
-            String serviceName = serviceClass.getName();
-
-            //Check if service should be unregistered?
-            if (managerObject != null) {
-                verifyApplicationRegistration(managerObject, serviceClass);
-            }
-            //Remove registered class from store.
-            registerClassStore.remove(serviceName);
-            //check if service is in app store.
-            curNode = appNameKeyStore.get(serviceName);
-            if (curNode == null) {
-                curNode = interfaceNameKeyStore.get(serviceName);
-            }
-
-            if (curNode != null) {
-                removeSchemaNode(curNode);
-                eventNameKeyStore.remove(getEventClassName(curNode));
-                appObjectStore.remove(serviceName);
-                interfaceNameKeyStore.remove(getInterfaceClassName(curNode));
-                opParamNameKeyStore.remove(getOpParamClassName(curNode));
-                yangFileStore.remove(getModuleIdentifier(curNode));
-                appNameKeyStore.remove(serviceName);
-                nameSpaceSchemaStore.remove(curNode.getNameSpace()
-                                                    .getModuleNamespace());
-                removeYsrGeneratedTemporaryResources(jarPathStore.get(serviceName),
-                                                     serviceName);
-                log.info(" service {} is unregistered.",
-                         serviceClass.getSimpleName());
-            } else {
-                throw new RuntimeException(serviceClass.getSimpleName() +
-                                                   " service was not registered.");
-            }
-        }
-    }
-
-    @Override
-    public Object getRegisteredApplication(YangSchemaNode schemaNode) {
-        Object obj = null;
-        if (schemaNode != null) {
-            String name = getServiceName(schemaNode);
-            obj = appObjectStore.get(name);
-            if (obj == null) {
-                log.error("{} not found.", name);
-            }
-        }
-        return obj;
-    }
-
-    @Override
-    public YangSchemaNode getYangSchemaNodeUsingSchemaName(String schemaName) {
-        return getSchemaNodeUsingSchemaNameWithRev(schemaName);
-    }
-
-    @Override
-    public YangSchemaNode getYangSchemaNodeUsingAppName(String appName) {
-        YangSchemaNode node = appNameKeyStore.get(appName);
-        if (node == null) {
-            log.error("{} not found.", appName);
-        }
-        return node;
-    }
-
-    @Override
-    public YangSchemaNode
-    getYangSchemaNodeUsingGeneratedRootNodeInterfaceFileName(String name) {
-        YangSchemaNode node = interfaceNameKeyStore.get(name);
-        if (node == null) {
-            log.error("{} not found.", name);
-        }
-        return node;
-    }
-
-    @Override
-    public YangSchemaNode getYangSchemaNodeUsingGeneratedRootNodeOpPramFileName(
-            String name) {
-        YangSchemaNode node = opParamNameKeyStore.get(name);
-        if (node == null) {
-            log.error("{} not found.", name);
-        }
-        return node;
-    }
-
-    @Override
-    public YangSchemaNode getRootYangSchemaNodeForNotification(String name) {
-        YangSchemaNode node = eventNameKeyStore.get(name);
-        if (node == null) {
-            log.error("{} not found.", name);
-        }
-        return node;
-    }
-
-    @Override
-    public Class<?> getRegisteredClass(YangSchemaNode schemaNode) {
-        String interfaceName = getInterfaceClassName(schemaNode);
-        String serviceName = getServiceName(schemaNode);
-        Class<?> regClass = registerClassStore.get(serviceName);
-        if (regClass == null) {
-            regClass = registerClassStore.get(interfaceName);
-        }
-        return regClass;
-    }
-
-    @Override
-    public YangSchemaNode getSchemaWrtNameSpace(String nameSpace) {
-
-        YangSchemaNode node = nameSpaceSchemaStore.get(nameSpace);
-        if (node == null) {
-            log.error("node with {} namespace not found.", nameSpace);
-        }
-        return node;
-    }
-
-    @Override
-    public String getYangFile(YangModuleIdentifier moduleIdentifier) {
-        String file = yangFileStore.get(moduleIdentifier);
-        if (file == null) {
-            log.error("YANG files for corresponding module identifier {} not " +
-                              "found", moduleIdentifier);
-        }
-        return file;
-    }
-
-    @Override
-    public boolean verifyNotificationObject(Object appObj, Class<?> service) {
-        synchronized (MockYangSchemaRegistry.class) {
-            YangSchemaNode node = appNameKeyStore.get(service.getName());
-            if (node == null) {
-                log.error("application is not registered with YMS {}",
-                          service.getName());
-                return false;
-            }
-            try {
-                if (node.isNotificationPresent()) {
-                    if (appObj != null) {
-                        Boolean ifPresent = ynhRegistrationStore.get(appObj);
-                        if (ifPresent == null) {
-                            ynhRegistrationStore.put(appObj, true);
-                            return true;
-                        }
-                    }
-                }
-            } catch (DataModelException e) {
-                log.error("notification registration error: {} {}", e
-                        .getLocalizedMessage(), e);
-            }
-            return false;
-        }
-    }
-
-    @Override
-    public void flushYsrData() {
-        appObjectStore.clear();
-        yangSchemaStore.clear();
-        eventNameKeyStore.clear();
-        opParamNameKeyStore.clear();
-        interfaceNameKeyStore.clear();
-        registerClassStore.clear();
-        yangFileStore.clear();
-        nameSpaceSchemaStore.clear();
-    }
-
-    @Override
-    public void processModuleLibrary(String serviceName,
-                                     YangModuleLibrary library) {
-        synchronized (MockYangSchemaRegistry.class) {
-            YangSchemaNode node = appNameKeyStore.get(serviceName);
-            if (node != null) {
-                YangModuleInformation moduleInformation =
-                        new DefaultYangModuleInformation(getModuleIdentifier(node),
-                                                         node.getNameSpace());
-                addSubModuleIdentifier(node, (
-                        DefaultYangModuleInformation) moduleInformation);
-                //TODO: add feature list to module information.
-                ((DefaultYangModuleLibrary) library)
-                        .addModuleInformation(moduleInformation);
-            }
-        }
-    }
-
-    /**
-     * Process service class.
-     *
-     * @param serviceClass service class
-     * @param appObject    application object
-     */
-
-    void doPreProcessing(Class<?> serviceClass, Object appObject) {
-
-        //Check if service should be registered?
-        if (appObject != null) {
-            verifyApplicationRegistration(appObject, serviceClass);
-        }
-        String name = serviceClass.getName();
-        //Add app class to registered service store.
-        if (!registerClassStore.containsKey(name)) {
-            registerClassStore.put(name, serviceClass);
-        }
-    }
-
-    void updateServiceClass(Class<?> service) {
-        registerClassStore.put(service.getName(), service);
-    }
-
-    /**
-     * Process application registration.
-     *
-     * @param service  service class
-     * @param jarPath  jar path
-     * @param nodes    YANG nodes
-     * @param appObj   application object
-     * @param isFromUt if registration is being called form unit test
-     */
-    void processRegistration(Class<?> service, String jarPath,
-                             List<YangNode> nodes,
-                             Object appObj, boolean isFromUt) {
-
-        // process storing operations.
-        YangNode schemaNode = findNodeWhichShouldBeReg(service.getName(), nodes);
-        if (schemaNode != null) {
-            if (appObj != null) {
-                appObjectStore.put(service.getName(), appObj);
-            }
-            //Process application context for registrations.
-            processApplicationContext(schemaNode, service.getName(), isFromUt);
-            //Update YANG file store.
-            updateYangFileStore(schemaNode, jarPath);
-        }
-    }
-
-    /**
-     * Returns the node for which corresponding class is generated.
-     *
-     * @param name  generated class name
-     * @param nodes list of yang nodes
-     * @return node for which corresponding class is generated
-     */
-    private YangNode findNodeWhichShouldBeReg(String name, List<YangNode> nodes) {
-        for (YangNode node : nodes) {
-            if (name.equals(getServiceName(node)) ||
-                    name.equals(getInterfaceClassName(node))) {
-                return node;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Verifies if service class should be registered or not.
-     *
-     * @param appObject application object
-     * @param appClass  application class
-     */
-    private void verifyApplicationRegistration(Object appObject,
-                                               Class<?> appClass) {
-        Class<?> managerClass = appObject.getClass();
-        Class<?>[] services = managerClass.getInterfaces();
-        List<Class<?>> classes = new ArrayList<>();
-        Collections.addAll(classes, services);
-        if (!classes.contains(appClass)) {
-            throw new RuntimeException("service class " + appClass.getName() +
-                                               "is not being implemented by " +
-                                               managerClass.getName());
-        }
-    }
-
-    /**
-     * Verifies if application is already registered with YMS.
-     *
-     * @param appClass application class
-     * @return true if application already registered
-     */
-    private boolean verifyIfApplicationAlreadyRegistered(Class<?> appClass) {
-        String appName = appClass.getName();
-        return appObjectStore.containsKey(appName) ||
-                interfaceNameKeyStore.containsKey(appName);
-    }
-
-    /**
-     * Updates yang file store for YANG node.
-     *
-     * @param node    YANG node
-     * @param jarPath jar file path
-     */
-    private void updateYangFileStore(YangNode node, String jarPath) {
-        yangFileStore.put(getModuleIdentifier(node),
-                          getYangFilePath(jarPath, node.getFileName()));
-    }
-
-    /**
-     * Returns yang file path.
-     *
-     * @param jarPath          jar path
-     * @param metaDataFileName name of yang file from metadata
-     * @return yang file path
-     */
-    private String getYangFilePath(String jarPath, String metaDataFileName) {
-        String[] metaData = metaDataFileName.split(SLASH);
-        return jarPath + SLASH + metaData[metaData.length - 1];
-    }
-
-
-    /**
-     * Process an application an updates the maps for YANG schema registry.
-     *
-     * @param appNode  application YANG schema nodes
-     * @param name     class name
-     * @param isFormUt if method is being called from unit tests
-     */
-    private void processApplicationContext(YangSchemaNode appNode, String name,
-                                           boolean isFormUt) {
-
-        //Update map for which registrations is being called.
-        appNameKeyStore.put(name, appNode);
-
-        // Updates schema store.
-        addToSchemaStore(appNode);
-        // update interface store.
-        interfaceNameKeyStore.put(getInterfaceClassName(appNode), appNode);
-
-        //update op param store.
-        opParamNameKeyStore.put(getOpParamClassName(appNode), appNode);
-
-        //update namespaceSchema store.
-        nameSpaceSchemaStore.put(appNode.getNameSpace().getModuleNamespace(), appNode);
-
-        //Checks if notification is present then update notification store map.
-        String eventSubject = null;
-        try {
-            if (appNode.isNotificationPresent()) {
-                eventSubject = getEventClassName(appNode);
-            }
-        } catch (DataModelException e) {
-            log.error("failed to search notification from schema map : {}",
-                      e.getLocalizedMessage());
-        }
-        if (eventSubject != null) {
-            eventNameKeyStore.put(eventSubject, appNode);
-        }
-        if (!isFormUt) {
-            log.info("successfully registered this application {}", name);
-        }
-    }
-
-    /**
-     * Returns jar path from bundle mvnLocationPath.
-     *
-     * @param mvnLocationPath mvnLocationPath of bundle
-     * @return path of jar
-     */
-    private String getJarPathFromBundleLocation(String mvnLocationPath,
-                                                String currentDirectory) {
-        String path = currentDirectory + SYSTEM;
-        if (mvnLocationPath.contains(MAVEN)) {
-            String[] strArray = mvnLocationPath.split(MAVEN);
-            if (strArray[1].contains(File.separator)) {
-                String[] split = strArray[1].split(File.separator);
-                if (split[0].contains(PERIOD)) {
-                    String[] groupId = split[0].split(Pattern.quote(PERIOD));
-                    return path + groupId[0] + SLASH + groupId[1] + SLASH + split[1] +
-                            SLASH + split[2] + SLASH + split[1] + HYPHEN + split[2];
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Returns schema node based on the revision.
-     *
-     * @param name name of the schema node
-     * @return schema node based on the revision
-     */
-    private YangSchemaNode getSchemaNodeUsingSchemaNameWithRev(String name) {
-        ConcurrentMap<String, YangSchemaNode> revMap;
-        YangSchemaNode schemaNode;
-        if (name.contains(AT)) {
-            String[] revArray = name.split(AT);
-            revMap = yangSchemaStore.get(revArray[0]);
-            schemaNode = revMap.get(name);
-            if (schemaNode == null) {
-                log.error("{} not found.", name);
-            }
-            return schemaNode;
-        }
-        if (yangSchemaStore.containsKey(name)) {
-            revMap = yangSchemaStore.get(name);
-            if (revMap != null && !revMap.isEmpty()) {
-                YangSchemaNode node = revMap.get(name);
-                if (node != null) {
-                    return node;
-                }
-                String revName = getLatestVersion(revMap);
-                return revMap.get(revName);
-            }
-        }
-        log.error("{} not found.", name);
-        return null;
-    }
-
-    private String getLatestVersion(ConcurrentMap<String, YangSchemaNode> revMap) {
-        List<String> keys = new ArrayList<>();
-        for (Map.Entry<String, YangSchemaNode> entry : revMap.entrySet()) {
-            keys.add(entry.getKey());
-        }
-        sort(keys);
-        return keys.get(keys.size() - 1);
-    }
-
-    /**
-     * Adds schema node when different revision of node has received.
-     *
-     * @param schemaNode schema node
-     */
-    private void addToSchemaStore(YangSchemaNode schemaNode) {
-
-        String date = getDateInStringFormat(schemaNode);
-        String name = schemaNode.getName();
-        String revName = name;
-        if (date != null) {
-            revName = name + AT + date;
-        }
-        //check if already present.
-        if (!yangSchemaStore.containsKey(name)) {
-            ConcurrentMap<String, YangSchemaNode> revStore =
-                    new ConcurrentHashMap<>();
-            revStore.put(revName, schemaNode);
-            yangSchemaStore.put(name, revStore);
-        } else {
-            yangSchemaStore.get(name).put(revName, schemaNode);
-        }
-    }
-
-    /**
-     * Returns date in string format.
-     *
-     * @param schemaNode schema node
-     * @return date in string format
-     */
-    String getDateInStringFormat(YangSchemaNode schemaNode) {
-        if (schemaNode != null) {
-            if (((YangNode) schemaNode).getRevision() != null) {
-                return new SimpleDateFormat(DATE_FORMAT)
-                        .format(((YangNode) schemaNode).getRevision()
-                                        .getRevDate());
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Removes schema node from schema map.
-     *
-     * @param removableNode schema node which needs to be removed
-     */
-    private void removeSchemaNode(YangSchemaNode removableNode) {
-        String name = removableNode.getName();
-        String revName = name;
-        String date = getDateInStringFormat(removableNode);
-        if (date != null) {
-            revName = name + AT + date;
-        }
-        ConcurrentMap<String, YangSchemaNode> revMap = yangSchemaStore.get(name);
-        if (revMap != null && !revMap.isEmpty() && revMap.size() != 1) {
-            revMap.remove(revName);
-        } else {
-            yangSchemaStore.remove(removableNode.getName());
-        }
-    }
-
-    /**
-     * Adds sub module identifier.
-     *
-     * @param node        schema node
-     * @param information module information
-     */
-    private void addSubModuleIdentifier(
-            YangSchemaNode node, DefaultYangModuleInformation information) {
-        List<YangInclude> includeList = new ArrayList<>();
-        if (node instanceof YangModule) {
-            includeList = ((YangModule) node).getIncludeList();
-        } else if (node instanceof YangSubModule) {
-            includeList = ((YangSubModule) node).getIncludeList();
-        }
-        for (YangInclude include : includeList) {
-            information.addSubModuleIdentifiers(getModuleIdentifier(
-                    include.getIncludedNode()));
-        }
-    }
-
-    /**
-     * Returns module identifier for schema node.
-     *
-     * @param schemaNode schema node
-     * @return module identifier for schema node
-     */
-    private YangModuleIdentifier getModuleIdentifier(
-            YangSchemaNode schemaNode) {
-        return new DefaultYangModuleIdentifier(
-                schemaNode.getName(), getDateInStringFormat(schemaNode));
-    }
-
-    /**
-     * Returns schema node's generated interface class name.
-     *
-     * @param schemaNode schema node
-     * @return schema node's generated interface class name
-     */
-    String getInterfaceClassName(YangSchemaNode schemaNode) {
-        return schemaNode.getJavaPackage() + PERIOD +
-                getCapitalCase(schemaNode.getJavaClassNameOrBuiltInType());
-    }
-
-    /**
-     * Returns schema node's generated op param class name.
-     *
-     * @param schemaNode schema node
-     * @return schema node's generated op param class name
-     */
-    private String getOpParamClassName(YangSchemaNode schemaNode) {
-        return getInterfaceClassName(schemaNode) + OP_PARAM;
-    }
-
-    /**
-     * Returns schema node's generated event class name.
-     *
-     * @param schemaNode schema node
-     * @return schema node's generated event class name
-     */
-    private String getEventClassName(YangSchemaNode schemaNode) {
-        return getInterfaceClassName(schemaNode).toLowerCase() + PERIOD +
-                getCapitalCase(schemaNode.getJavaClassNameOrBuiltInType()) +
-                EVENT_STRING;
-    }
-
-    /**
-     * Returns schema node's generated service class name.
-     *
-     * @param schemaNode schema node
-     * @return schema node's generated service class name
-     */
-    String getServiceName(YangSchemaNode schemaNode) {
-        return getInterfaceClassName(schemaNode) + SERVICE;
-    }
-
-    /**
-     * Removes YSR generated temporary resources.
-     *
-     * @param rscPath resource path
-     * @param appName application name
-     */
-    private void removeYsrGeneratedTemporaryResources(String rscPath,
-                                                      String appName) {
-        if (rscPath != null) {
-            File jarPath = new File(rscPath);
-            if (jarPath.exists()) {
-                try {
-                    deleteDirectory(jarPath);
-                } catch (IOException e) {
-                    log.error("failed to delete ysr resources for {} : {}",
-                              appName, e.getLocalizedMessage());
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/drivers/microsemi/pom.xml b/drivers/microsemi/pom.xml
deleted file mode 100644
index c404100..0000000
--- a/drivers/microsemi/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<!-- ~ 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. -->
-<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>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-drivers-general</artifactId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-drivers-microsemi</artifactId>
-    <packaging>pom</packaging>
-
-    <properties>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <modules>
-        <module>ea1000yang</module>
-        <module>ea1000driver</module>
-    </modules>
-
-    <!-- FIXME this can be removed if/when buck-api is released -->
-    <repositories>
-        <repository>
-            <id>snapshots</id>
-            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
-            <snapshots>
-                <enabled>true</enabled>
-                <updatePolicy>daily</updatePolicy>
-                <checksumPolicy>fail</checksumPolicy>
-            </snapshots>
-        </repository>
-    </repositories>
-
-    <dependencies>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-all</artifactId>
-            <version>1.3</version>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-</project>
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
similarity index 64%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
index 3c593d6..4df22ec 100644
--- a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammable.java
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 
 import org.onlab.packet.EthType;
@@ -38,6 +39,8 @@
 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.custom.CustomEvcPerUnic;
+import org.onosproject.drivers.microsemi.yang.custom.CustomEvcPerUnin;
 import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
@@ -61,54 +64,50 @@
 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.DatastoreId;
 import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
 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.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.DefaultSourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.DefaultInterfaceEth0;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.InterfaceEth0;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.DefaultSourceAddressRange;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.FilterAdminStateEnum;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.VlanIdType;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.DefaultFlowMapping;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.TagManipulation;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagOverwrite;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPop;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPush;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagOverwrite;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPop;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPush;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.tagpush.tagpush.PushTagTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.DefaultUni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.Profiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.Uni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.DefaultEvc;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.Evc;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.DefaultEvcPerUni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.EvcPerUni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
 import org.slf4j.Logger;
 
 /**
@@ -146,7 +145,14 @@
 
         UniSideInterfaceAssignmentEnum portAssignment = UniSideInterfaceAssignmentEnum.UNI_C_ON_HOST;
         NetconfController controller = checkNotNull(handler().get(NetconfController.class));
-        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        NetconfDevice ncDevice = controller.getDevicesMap().get(handler().data().deviceId());
+        if (ncDevice == null) {
+            log.error("Internal ONOS Error. Device has been marked as reachable, " +
+                            "but deviceID {} is not in Devices Map. Continuing with empty description",
+                    handler().data().deviceId());
+            return flowEntryCollection;
+        }
+        NetconfSession session = ncDevice.getSession();
         CoreService coreService = checkNotNull(handler().get(CoreService.class));
         ApplicationId appId = coreService.getAppId(MICROSEMI_DRIVERS);
         MseaSaFilteringNetconfService mseaSaFilteringService =
@@ -156,51 +162,58 @@
         log.debug("getFlowEntries() called on EA1000FlowRuleProgrammable");
 
         //First get the MseaSaFiltering rules
-        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
-                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
+        SourceIpaddressFiltering sip =
+                new DefaultSourceIpaddressFiltering();
 
-        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
-                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
-        MseaSaFilteringOpParam mseaSaFilteringFilter =
-                (MseaSaFilteringOpParam) opBuilder
-                .sourceIpaddressFiltering(sipBuilder.build())
-                .build();
+        MseaSaFilteringOpParam op =
+                new MseaSaFilteringOpParam();
+        op.sourceIpaddressFiltering(sip);
+
         try {
             MseaSaFiltering saFilteringCurrent =
-                    mseaSaFilteringService.getMseaSaFiltering(mseaSaFilteringFilter, session);
-            if (saFilteringCurrent != null) {
+                    mseaSaFilteringService.getMseaSaFiltering(op, session);
+            if (saFilteringCurrent != null &&
+                    saFilteringCurrent.sourceIpaddressFiltering() != null) {
                 flowEntryCollection.addAll(
                         convertSaFilteringToFlowRules(saFilteringCurrent, appId));
             }
         } catch (NetconfException e) {
-            log.warn("Unexpected error on getFlowEntries", e);
+            if (e.getCause() instanceof TimeoutException) {
+                log.warn("Timeout exception getting SA Filt Flow Entries from {}",
+                        handler().data().deviceId());
+                return flowEntryCollection;
+            } else {
+                log.error("Unexpected error on SA Filt getFlowEntries on {}",
+                        handler().data().deviceId(), e);
+            }
         }
 
 
         //Then get the EVCs - there will be a flow entry per EVC
-        Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+        MefServices mefServices = new DefaultMefServices();
+        mefServices.uni(new DefaultUni());
 
-        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();
+        MseaUniEvcServiceOpParam mseaUniEvcServiceFilter = new MseaUniEvcServiceOpParam();
+        mseaUniEvcServiceFilter.mefServices(mefServices);
         try {
             MseaUniEvcService uniEvcCurrent =
                     mseaUniEvcServiceSvc.getConfigMseaUniEvcService(mseaUniEvcServiceFilter,
-                            session, TargetConfig.RUNNING);
+                            session, DatastoreId.RUNNING);
 
             flowEntryCollection.addAll(
                     convertEvcUniToFlowRules(uniEvcCurrent, portAssignment));
 
         } catch (NetconfException e) {
-            log.warn("Unexpected error on getFlowEntries", e);
+            if (e.getCause() instanceof TimeoutException) {
+                log.warn("Timeout exception getting EVC Flow Entries from {}",
+                        handler().data().deviceId());
+                return flowEntryCollection;
+            } else {
+                log.error("Unexpected error on EVC getFlowEntries on {}",
+                        handler().data().deviceId(), e);
+            }
         }
 
-
         return flowEntryCollection;
     }
 
@@ -238,7 +251,7 @@
         try {
             sessionMutex.acquire();
             MseaUniEvcService evcResponse =
-                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, DatastoreId.RUNNING);
             //There could be zero or more EVCs
             if (evcResponse != null && evcResponse.mefServices() != null && evcResponse.mefServices().uni() != null) {
                 activeEvcs.addAll(evcResponse.mefServices().uni().evc());
@@ -271,7 +284,7 @@
         if (saRangeList.size() > 0) {
             try {
                 mseaSaFilteringService.setMseaSaFiltering(
-                            buildSaFilteringObject(saRangeList), session, TargetConfig.RUNNING);
+                            buildSaFilteringObject(saRangeList), session, DatastoreId.RUNNING);
             } catch (NetconfException e) {
                 log.error("Error applying Flow Rules to SA Filtering - will try again: " + e.getMessage());
                 sessionMutex.release();
@@ -283,26 +296,27 @@
             List<Evc> evcList = evcMap.entrySet().stream()
                     .map(x -> x.getValue())
                     .collect(Collectors.toList());
-            Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+            Uni uni = new DefaultUni();
             URI deviceName = handler().data().deviceId().uri();
-            Uni uni = uniBuilder.name(new Identifier45("Uni-on-"
-                    + deviceName.getSchemeSpecificPart())).evc(evcList).build();
+            uni.name(new Identifier45("Uni-on-"
+                    + deviceName.getSchemeSpecificPart()));
+            uni.evc(evcList);
 
             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();
+            BwpGroup bwpGrp = new DefaultBwpGroup();
+            bwpGrp.groupIndex((short) 0);
+            bwpGroupList.add(bwpGrp);
+            Profiles profiles = new DefaultProfiles();
+            profiles.bwpGroup(bwpGroupList);
 
-            MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
-            MefServices mefServices = mefBuilder.uni(uni).profiles(profiles).build();
+            MefServices mefServices = new DefaultMefServices();
+            mefServices.uni(uni);
+            mefServices.profiles(profiles);
 
-            MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
-                    new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
-
-            MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
-                    (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+            MseaUniEvcServiceOpParam mseaUniEvcServiceFilter = new MseaUniEvcServiceOpParam();
+            mseaUniEvcServiceFilter.mefServices(mefServices);
             try {
-                mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+                mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, DatastoreId.RUNNING);
             } catch (NetconfException e) {
                 log.error("Error applying Flow Rules to EVC - will try again: " + e.getMessage());
                 sessionMutex.release();
@@ -338,14 +352,18 @@
 
         //Retrieve the list of actual EVCs and the CeVlanMaps from device
         List<Evc> activeEvcs = new ArrayList<>();
+        List<Short> acvtiveFiltRanges = new ArrayList<>();
         try {
             sessionMutex.acquire();
             MseaUniEvcService evcResponse =
-                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, DatastoreId.RUNNING);
             //There could be zero or more EVCs
             if (evcResponse != null && evcResponse.mefServices() != null && evcResponse.mefServices().uni() != null) {
                 activeEvcs.addAll(evcResponse.mefServices().uni().evc());
             }
+            mseaSaFilteringService.getConfigMseaSaFilterIds(session).forEach(
+                    r -> acvtiveFiltRanges.add(r.rangeId()));
+
         } catch (NetconfException | InterruptedException e1) {
             log.warn("Error on removeFlowRules.", e1);
         }
@@ -360,14 +378,9 @@
             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();
-
+                SourceAddressRange sar = new DefaultSourceAddressRange();
+                sar.rangeId((short) ruleToRemove.tableId());
+                acvtiveFiltRanges.remove(Short.valueOf((short) ruleToRemove.tableId()));
                 rulesRemoved.add(ruleToRemove);
                 saRangeList.add(sar);
 
@@ -408,10 +421,23 @@
 
         //If there are IPv4 Flow Rules created commit them now through the
         //MseaSaFiltering service
-        if (saRangeList.size() > 0) {
+        if (saRangeList.size() > 0 && acvtiveFiltRanges.size() == 0) {
             try {
-                mseaSaFilteringService.setMseaSaFiltering(
-                        buildSaFilteringObject(saRangeList), session, TargetConfig.RUNNING);
+                SourceIpaddressFiltering saFilter =
+                        new DefaultSourceIpaddressFiltering();
+                MseaSaFilteringOpParam mseaSaFiltering = new MseaSaFilteringOpParam();
+                mseaSaFiltering.sourceIpaddressFiltering(saFilter);
+
+                mseaSaFilteringService.deleteMseaSaFilteringRange(
+                        mseaSaFiltering, session, DatastoreId.RUNNING);
+            } catch (NetconfException e) {
+                log.warn("Remove FlowRule on MseaSaFilteringService could not delete all SARules - "
+                        + "they may already have been deleted: " + e.getMessage());
+            }
+        } else if (saRangeList.size() > 0) {
+            try {
+                mseaSaFilteringService.deleteMseaSaFilteringRange(
+                        buildSaFilteringObject(saRangeList), session, DatastoreId.RUNNING);
             } catch (NetconfException e) {
                 log.warn("Remove FlowRule on MseaSaFilteringService could not delete SARule - "
                         + "it may already have been deleted: " + e.getMessage());
@@ -421,7 +447,7 @@
         if (ceVlanMapMap.size() > 0) {
             try {
                 mseaUniEvcServiceSvc.removeEvcUniFlowEntries(ceVlanMapMap, flowIdMap,
-                        session, TargetConfig.RUNNING, portAssignment);
+                        session, DatastoreId.RUNNING, portAssignment);
             } catch (NetconfException e) {
                 log.warn("Remove FlowRule on MseaUniEvcService could not delete EVC - "
                         + "it may already have been deleted: " + e.getMessage());
@@ -472,14 +498,12 @@
         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 =
+                new DefaultSourceAddressRange();
 
-        SourceAddressRange sar = saBuilder
-                .rangeId((short) fr.tableId())
-                .name("Flow:" + fr.id().toString())
-                .ipv4AddressPrefix(ipAddrStr)
-                .build();
+        sar.rangeId((short) fr.tableId());
+        sar.name("Flow:" + fr.id().toString());
+        sar.ipv4AddressPrefix(ipAddrStr);
 
         frList.add(fr);
         saRangeList.add(sar);
@@ -493,40 +517,52 @@
                 ((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()));
+        FlowMapping fm = new DefaultFlowMapping();
+        fm.ceVlanId(VlanIdType.of(sourceVid.id()));
+        fm.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());
-
+            if (port.nOrC(portAssignment) == UniSide.CUSTOMER) {
+                evcMap.get(evcKey).evcPerUni().evcPerUnic().addToFlowMapping(fm);
+                ServiceListType newCeVlanMap = new ServiceListType(
+                        CeVlanMapUtils.addtoCeVlanMap(
+                                evcMap.get(evcKey).evcPerUni().evcPerUnic().ceVlanMap().toString(),
+                                sourceVid.toShort()));
+                evcMap.get(evcKey).evcPerUni().evcPerUnic().ceVlanMap(newCeVlanMap);
+            } else {
+                evcMap.get(evcKey).evcPerUni().evcPerUnin().addToFlowMapping(fm);
+                ServiceListType newCeVlanMap = new ServiceListType(
+                        CeVlanMapUtils.addtoCeVlanMap(
+                                evcMap.get(evcKey).evcPerUni().evcPerUnin().ceVlanMap().toString(),
+                                sourceVid.toShort()));
+                evcMap.get(evcKey).evcPerUni().evcPerUnin().ceVlanMap(newCeVlanMap);
+            }
         } 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());
+                ServiceListType newCeVlanMap = new ServiceListType(
+                        CeVlanMapUtils.addtoCeVlanMap(
+                                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin().ceVlanMap().toString(),
+                                sourceVid.toShort()));
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin().ceVlanMap(newCeVlanMap);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin().tagManipulation(tm);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin().addToFlowMapping(fm);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnin().ingressBwpGroupIndex(getMeterId(fr.treatment()));
             } 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());
+                ServiceListType newCeVlanMap = new ServiceListType(
+                        CeVlanMapUtils.addtoCeVlanMap(
+                                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic().ceVlanMap().toString(),
+                                sourceVid.toShort()));
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic().ceVlanMap(newCeVlanMap);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic().tagManipulation(tm);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic().addToFlowMapping(fm);
+                evcMap.get(evcKey ^ 1).evcPerUni().evcPerUnic().ingressBwpGroupIndex(getMeterId(fr.treatment()));
             }
         } else {
-            Evc.EvcBuilder evcBuilder = new DefaultEvc.EvcBuilder();
-            EvcPerUninBuilder epunBuilder = new CustomEvcPerUnin.EvcPerUninBuilder();
-            EvcPerUnicBuilder epucBuilder = new CustomEvcPerUnic.EvcPerUnicBuilder();
+            Evc evc = new DefaultEvc();
+            EvcPerUnin epun = new CustomEvcPerUnin();
+            EvcPerUnic epuc = new CustomEvcPerUnic();
             TagManipulation tm = getTagManipulation(fr);
 
             UniSide side = port.nOrC(portAssignment);
@@ -538,31 +574,32 @@
                             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()));
+                epun.ceVlanMap(new ServiceListType(newCeVlanMap));
+                epun.tagManipulation(tm);
+                epun.addToFlowMapping(fm);
+                epun.ingressBwpGroupIndex(getMeterId(fr.treatment()));
 
-                epucBuilder.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+                epuc.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+                epuc.ingressBwpGroupIndex(new Long(0));
             } else {
-                epucBuilder
-                    .ceVlanMap(new ServiceListType(newCeVlanMap))
-                    .tagManipulation(tm)
-                    .addToFlowMapping(fmBuilder.build())
-                    .ingressBwpGroupIndex(getMeterId(fr.treatment()));
+                epuc.ceVlanMap(new ServiceListType(newCeVlanMap));
+                epuc.tagManipulation(tm);
+                epuc.addToFlowMapping(fm);
+                epuc.ingressBwpGroupIndex(getMeterId(fr.treatment()));
 
-                epunBuilder.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+                epun.ceVlanMap(new ServiceListType(oppositeCeVlanMap));
+                epun.ingressBwpGroupIndex(new Long(0));
             }
 
-            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());
+            evc.evcIndex(fr.tableId());
+            evc.name(new Identifier45("EVC-" + String.valueOf(fr.tableId())));
+
+            DefaultEvcPerUni epu = new DefaultEvcPerUni();
+            epu.evcPerUnin(epun);
+            epu.evcPerUnic(epuc);
+            evc.evcPerUni(epu);
+
+            evcMap.put(evcKey, evc);
         }
 
         frList.add(fr);
@@ -570,20 +607,18 @@
 
 
     private MseaSaFilteringOpParam buildSaFilteringObject(List<SourceAddressRange> saRangeList) {
-        InterfaceEth0.InterfaceEth0Builder ifBuilder = new DefaultInterfaceEth0.InterfaceEth0Builder();
+        InterfaceEth0 saIf = new DefaultInterfaceEth0();
         for (SourceAddressRange sa:saRangeList) {
-            ifBuilder = ifBuilder.addToSourceAddressRange(sa);
+            saIf.addToSourceAddressRange(sa);
         }
-        InterfaceEth0 saIf = ifBuilder.filterAdminState(FilterAdminStateEnum.BLACKLIST).build();
+        saIf.filterAdminState(FilterAdminStateEnum.BLACKLIST);
 
-        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder saFilterBuilder =
-                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
-        SourceIpaddressFiltering saFilter = saFilterBuilder.interfaceEth0(saIf).build();
+        SourceIpaddressFiltering saFilter =
+                new DefaultSourceIpaddressFiltering();
+        saFilter.interfaceEth0(saIf);
 
-        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
-                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
-        MseaSaFilteringOpParam mseaSaFiltering =
-                (MseaSaFilteringOpParam) opBuilder.sourceIpaddressFiltering(saFilter).build();
+        MseaSaFilteringOpParam mseaSaFiltering = new MseaSaFilteringOpParam();
+        mseaSaFiltering.sourceIpaddressFiltering(saFilter);
 
         return mseaSaFiltering;
     }
@@ -597,35 +632,37 @@
         Criterion matchInPort = Criteria.matchInPort(PortNumber.portNumber(0));
         TrafficSelector.Builder tsBuilder = DefaultTrafficSelector.builder();
 
-        for (SourceAddressRange sa:saRangelist) {
-            Criterion matchIpSrc = Criteria.matchIPSrc(IpPrefix.valueOf(sa.ipv4AddressPrefix()));
+        if (saRangelist != null) {
+            for (SourceAddressRange sa : saRangelist) {
+                Criterion matchIpSrc = Criteria.matchIPSrc(IpPrefix.valueOf(sa.ipv4AddressPrefix()));
 
-            TrafficSelector selector = tsBuilder.add(matchIpSrc).add(matchInPort).build();
+                TrafficSelector selector = tsBuilder.add(matchIpSrc).add(matchInPort).build();
 
-            TrafficTreatment.Builder trBuilder = DefaultTrafficTreatment.builder();
-            TrafficTreatment treatment = trBuilder.drop().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.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));
             }
-
-            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;
     }
 
@@ -801,46 +838,41 @@
 
         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();
+            TagPop pop = new DefaultTagPop();
+            org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice
+                .evcperuniextensionattributes.tagmanipulation
+                .tagpop.TagPop popInner =
+                    new org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317
+                        .mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagpop.DefaultTagPop();
+            pop.tagPop(popInner);
+            return pop;
 
         } 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();
+            TagPush push = new DefaultTagPush();
+            org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice
+                .evcperuniextensionattributes.tagmanipulation
+                .tagpush.TagPush pushInner =
+                    new org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317
+                        .mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagpush.DefaultTagPush();
+            pushInner.outerTagVlan(new VlanIdType(vlanId.id()));
+            pushInner.pushTagType(ethType.equals(EtherType.VLAN.ethType()) ?
+                                PushTagTypeEnum.PUSHCTAG : PushTagTypeEnum.PUSHSTAG);
+            push.tagPush(pushInner);
+            return push;
 
         } 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();
+            TagOverwrite ovr = new DefaultTagOverwrite();
+            org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice
+                .evcperuniextensionattributes.tagmanipulation
+                .tagoverwrite.TagOverwrite ovrInner =
+                    new org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317
+                        .mseaunievcservice.evcperuniextensionattributes
+                        .tagmanipulation.tagoverwrite.DefaultTagOverwrite();
+            ovrInner.outerTagVlan(new VlanIdType(vlanId.id()));
+            ovr.tagOverwrite(ovrInner);
+            return ovr;
         }
 
         return null;
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
new file mode 100644
index 0000000..226ad2f
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
@@ -0,0 +1,240 @@
+/*
+ * 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.DatastoreId;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.CosColorType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.PriorityType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.coscolortype.CosColorTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.Profiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.Cos;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.DefaultCos;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.Bwp;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.DefaultBwp;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.DefaultEvcCosTypeEvcColorId;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.EvcCosTypeEvcColorId;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.DefaultEvcCosTypeAll8PrioTo1EvcColor;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.cos.costypechoice.evccostypeevccolorid.EvcCosTypeAll8PrioTo1EvcColor;
+import org.slf4j.Logger;
+
+/**
+ * Provider which uses an NETCONF controller to handle meters.
+ *
+ * TODO: move this to an architecture similar to FlowRuleDriverProvider in order
+ * to use a behavior to discover 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();
+
+        Profiles profiles = new DefaultProfiles();
+        if (meterOp.type() == MeterOperation.Type.ADD || meterOp.type() == MeterOperation.Type.MODIFY) {
+            Bwp bwp = new DefaultBwp();
+            bwp.cosIndex(COS_INDEX_1);
+            bwp.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
+                }
+            }
+            bwp.committedInformationRate(cirRateKbps);
+            bwp.excessInformationRate(eirRateKbps - cirRateKbps);
+            if (meterOp.meter().isBurst()) {
+                bwp.committedBurstSize(cbsRateKbps);
+                bwp.excessBurstSize(ebsRateKbps - cbsRateKbps);
+            }
+
+            BwpGroup bwpg = new DefaultBwpGroup();
+            bwpg.groupIndex((short) meterId);
+            bwpg.addToBwp(bwp);
+
+            //Create cos-1 as referenced above - we only support 1 at the moment
+            Cos cos = new DefaultCos();
+            cos.cosIndex(COS_INDEX_1);
+            cos.name("COS-1");
+            cos.outgoingCosValue(PriorityType.of(DEFAULT_OUTGOING_PRIO));
+            cos.colorAware(true);
+            cos.colorForward(true);
+
+            EvcCosTypeAll8PrioTo1EvcColor ect =
+                    new DefaultEvcCosTypeAll8PrioTo1EvcColor();
+            ect.evcAll8ColorTo(CosColorType.of(CosColorTypeEnum.GREEN));
+            profiles.addToBwpGroup(bwpg);
+
+            EvcCosTypeEvcColorId cid = new DefaultEvcCosTypeEvcColorId();
+            cid.evcCosTypeAll8PrioTo1EvcColor(ect);
+            cos.cosTypeChoice(cid);
+            profiles.addToCos(cos);
+        } else if (meterOp.type() == MeterOperation.Type.REMOVE) {
+            BwpGroup bwpg = new DefaultBwpGroup();
+            bwpg.groupIndex((short) meterId);
+
+            profiles.addToBwpGroup(bwpg);
+        }
+
+        MefServices mefServices = new DefaultMefServices();
+        mefServices.profiles(profiles);
+
+        MseaUniEvcServiceOpParam mseaUniEvcServiceFilter = new MseaUniEvcServiceOpParam();
+        mseaUniEvcServiceFilter.mefServices(mefServices);
+
+        NetconfSession session = controller.getDevicesMap().get(deviceId).getSession();
+        try {
+            if (meterOp.type() == MeterOperation.Type.REMOVE) {
+                mseaUniEvcServiceSvc.deleteMseaUniEvcService(mseaUniEvcServiceFilter,
+                        session, DatastoreId.RUNNING);
+            } else {
+                mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter,
+                        session, DatastoreId.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, DatastoreId.RUNNING);
+                        return; //If it did not throw an exception
+                    } catch (InterruptedException e1) {
+                        log.debug("Error when deleting BWP profile on EA1000" +
+                                " - trying again in 1 sec", e1);
+                    } catch (NetconfException e1) {
+                        log.debug("NETCONF failed to delete profile - trying again in 1 sec", e1);
+                    }
+                }
+                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);
+            }
+        }
+    }
+
+    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/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000Pipeliner.java
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
similarity index 81%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
index ec43833..dfb8480 100644
--- a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
@@ -40,12 +40,15 @@
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
 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.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.system.AugmentedSysSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.system.DefaultAugmentedSysSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.systemstate.platform.AugmentedSysPlatform;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.systemstate.platform.DefaultAugmentedSysPlatform;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.DateAndTime;
 import org.slf4j.Logger;
 
 public class Ea1000DeviceDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
@@ -65,7 +68,14 @@
         log.info("Adding description for EA1000 device");
 
         NetconfController controller = checkNotNull(handler().get(NetconfController.class));
-        NetconfSession session = controller.getDevicesMap().get(handler().data().deviceId()).getSession();
+        NetconfDevice ncDevice = controller.getDevicesMap().get(handler().data().deviceId());
+        if (ncDevice == null) {
+            log.error("Internal ONOS Error. Device has been marked as reachable, " +
+                    "but deviceID {} is not in Devices Map. Continuing with empty description",
+                    handler().data().deviceId());
+            return null;
+        }
+        NetconfSession session = ncDevice.getSession();
         IetfSystemNetconfService ietfSystemService =
                 (IetfSystemNetconfService) checkNotNull(handler().get(IetfSystemNetconfService.class));
 
@@ -75,7 +85,7 @@
                 swVersion = system.systemState().platform().osRelease();
                 AugmentedSysPlatform augmentedSysPlatform =
                         (AugmentedSysPlatform) system.systemState()
-                        .platform().yangAugmentedInfo(AugmentedSysPlatform.class);
+                        .platform().augmentation(DefaultAugmentedSysPlatform.class);
                 serialNumber = augmentedSysPlatform.deviceIdentification().serialNumber();
                 DateAndTime deviceDateAndTime = system.systemState().clock().currentDatetime();
                 OffsetDateTime odt =
@@ -89,7 +99,7 @@
 
             if (system != null && system.system() != null) {
                 AugmentedSysSystem augmentedSystem =
-                        (AugmentedSysSystem) system.system().yangAugmentedInfo(AugmentedSysSystem.class);
+                        (AugmentedSysSystem) system.system().augmentation(DefaultAugmentedSysSystem.class);
                 longitudeStr = augmentedSystem.longitude().toPlainString();
                 latitudeStr = augmentedSystem.latitude().toPlainString();
             }
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/FullMetersAvailable.java
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoader.java
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/NetconfConfigGetter.java
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/RpcResultParser.java
diff --git a/drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/package-info.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/java/org/onosproject/drivers/microsemi/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/package-info.java
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
similarity index 75%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
index 7554350..44c62f6 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
@@ -17,17 +17,17 @@
 
 import java.time.OffsetDateTime;
 
+import org.onosproject.netconf.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
 
 /**
  * Extension of ietfSystemService to include NETCONF sessions.
@@ -60,10 +60,11 @@
      * @param ietfSystem value of ietfSystem
      * @param session An active NETCONF session
      * @param ncDs datastore type running, startup or candidate
+     * @return Boolean to indicate success or failure
      * @throws NetconfException if the session has any error
      */
-    void setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session, TargetConfig ncDs)
-            throws NetconfException;
+    boolean setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session,
+          DatastoreId ncDs) throws NetconfException;
 
     /**
      * Service interface of setCurrentDatetime.
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java
new file mode 100644
index 0000000..6cf8031
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java
@@ -0,0 +1,135 @@
+/*
+ * 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 com.google.common.collect.ImmutableMap;
+import org.apache.felix.scr.annotations.Component;
+import org.onosproject.yang.AbstractYangModelRegistrator;
+import org.onosproject.yang.gen.v1.entitystatetcmib.rev20051122.EntityStateTcMib;
+import org.onosproject.yang.gen.v1.fpgainternal.rev20151130.FpgaInternal;
+import org.onosproject.yang.gen.v1.ianacrypthash.rev20140806.IanaCryptHash;
+import org.onosproject.yang.gen.v1.ianaiftype.rev20140508.IanaIfType;
+import org.onosproject.yang.gen.v1.ieeetypes.rev20080522.IeeeTypes;
+import org.onosproject.yang.gen.v1.ietfinettypes.rev20130715.IetfInetTypes;
+import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.IetfInterfaces;
+import org.onosproject.yang.gen.v1.ietfnetconf.rev20110601.IetfNetconf;
+import org.onosproject.yang.gen.v1.ietfnetconfacm.rev20120222.IetfNetconfAcm;
+import org.onosproject.yang.gen.v1.ietfnetconfmonitoring.rev20101004.IetfNetconfMonitoring;
+import org.onosproject.yang.gen.v1.ietfnetconfnotifications.rev20120206.IetfNetconfNotifications;
+import org.onosproject.yang.gen.v1.ietfnetconfwithdefaults.rev20100609.IetfNetconfWithDefaults;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.IetfSystemMicrosemi;
+import org.onosproject.yang.gen.v1.ietfsystemtlsauth.rev20140524.IetfSystemTlsAuth;
+import org.onosproject.yang.gen.v1.ietfx509certtoname.rev20130326.IetfX509CertToName;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.IetfYangTypes;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasoamfm.rev20160229.MseaSoamFm;
+import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.MseaSoamPm;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.MseaTypes;
+import org.onosproject.yang.gen.v1.mseaunievcinterface.rev20160317.MseaUniEvcInterface;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.ncnotifications.rev20080714.NcNotifications;
+import org.onosproject.yang.gen.v1.netopeercfgnetopeer.rev20130214.NetopeerCfgnetopeer;
+import org.onosproject.yang.gen.v1.notifications.rev20080714.Notifications;
+import org.onosproject.yang.gen.v1.rfc2544.rev20151020.Rfc2544;
+import org.onosproject.yang.gen.v1.svcactivationtypes.rev20151027.SvcActivationTypes;
+import org.onosproject.yang.gen.v1.y1564.rev20151029.Y1564;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.AppModuleInfo;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of Microsemi model registrator which registers Microsemi device
+ * models.
+ */
+@Component(immediate = true)
+public class MicrosemiModelRegistrator extends AbstractYangModelRegistrator {
+
+    public MicrosemiModelRegistrator() {
+        super(IetfSystem.class, getAppInfo());
+    }
+
+    private static Map<YangModuleId, AppModuleInfo> getAppInfo() {
+        Map<YangModuleId, AppModuleInfo> appInfo = new HashMap<>();
+
+        appInfo.put(new DefaultYangModuleId("fpga-internal", "2015-11-30"),
+                new DefaultAppModuleInfo(FpgaInternal.class, null));
+        appInfo.put(new DefaultYangModuleId("iana-if-type", "2014-05-08"),
+                new DefaultAppModuleInfo(IanaIfType.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-yang-types", "2013-07-15"),
+                new DefaultAppModuleInfo(IetfYangTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-sa-filtering", "2016-04-12"),
+                new DefaultAppModuleInfo(MseaSaFiltering.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-x509-cert-to-name", "2013-03-26"),
+                new DefaultAppModuleInfo(IetfX509CertToName.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-system", "2014-08-06"),
+                new DefaultAppModuleInfo(IetfSystem.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-types", "2016-02-29"),
+                new DefaultAppModuleInfo(MseaTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-inet-types", "2013-07-15"),
+                new DefaultAppModuleInfo(IetfInetTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-netconf-with-defaults", "2010-06-09"),
+                new DefaultAppModuleInfo(IetfNetconfWithDefaults.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-uni-evc-service", "2016-03-17"),
+                new DefaultAppModuleInfo(MseaUniEvcService.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-netconf-monitoring", "2010-10-04"),
+                new DefaultAppModuleInfo(IetfNetconfMonitoring.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-netconf-acm", "2012-02-22"),
+                new DefaultAppModuleInfo(IetfNetconfAcm.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-system-tls-auth", "2014-05-24"),
+                new DefaultAppModuleInfo(IetfSystemTlsAuth.class, null));
+        appInfo.put(new DefaultYangModuleId("rfc-2544", "2015-10-20"),
+                new DefaultAppModuleInfo(Rfc2544.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-cfm", "2016-02-29"),
+                new DefaultAppModuleInfo(MseaCfm.class, null));
+        appInfo.put(new DefaultYangModuleId("netopeer-cfgnetopeer", "2013-02-14"),
+                new DefaultAppModuleInfo(NetopeerCfgnetopeer.class, null));
+        appInfo.put(new DefaultYangModuleId("ENTITY-STATE-TC-MIB", "2005-11-22"),
+                new DefaultAppModuleInfo(EntityStateTcMib.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-soam-fm", "2016-02-29"),
+                new DefaultAppModuleInfo(MseaSoamFm.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-netconf-notifications", "2012-02-06"),
+                new DefaultAppModuleInfo(IetfNetconfNotifications.class, null));
+        appInfo.put(new DefaultYangModuleId("nc-notifications", "2008-07-14"),
+                new DefaultAppModuleInfo(NcNotifications.class, null));
+        appInfo.put(new DefaultYangModuleId("iana-crypt-hash", "2014-08-06"),
+                new DefaultAppModuleInfo(IanaCryptHash.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-uni-evc-interface", "2016-03-17"),
+                new DefaultAppModuleInfo(MseaUniEvcInterface.class, null));
+        appInfo.put(new DefaultYangModuleId("msea-soam-pm", "2016-02-29"),
+                new DefaultAppModuleInfo(MseaSoamPm.class, null));
+        appInfo.put(new DefaultYangModuleId("ieee-types", "2008-05-22"),
+                new DefaultAppModuleInfo(IeeeTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("svc-activation-types", "2015-10-27"),
+                new DefaultAppModuleInfo(SvcActivationTypes.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-netconf", "2011-06-01"),
+                new DefaultAppModuleInfo(IetfNetconf.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-system-microsemi", "2016-05-05"),
+                new DefaultAppModuleInfo(IetfSystemMicrosemi.class, null));
+        appInfo.put(new DefaultYangModuleId("notifications", "2008-07-14"),
+                new DefaultAppModuleInfo(Notifications.class, null));
+        appInfo.put(new DefaultYangModuleId("y-1564", "2015-10-29"),
+                new DefaultAppModuleInfo(Y1564.class, null));
+        appInfo.put(new DefaultYangModuleId("ietf-interfaces", "2014-05-08"),
+                new DefaultAppModuleInfo(IetfInterfaces.class, null));
+        return ImmutableMap.copyOf(appInfo);
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
similarity index 64%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
index cf391fa..cdd3700 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaCfmNetconfService.java
@@ -15,18 +15,15 @@
  */
 package org.onosproject.drivers.microsemi.yang;
 
-import org.onosproject.event.ListenerService;
+import org.onosproject.netconf.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
 
 /**
  * Extension of mseaCfmService to include NETCONF sessions.
@@ -34,7 +31,7 @@
  * 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> {
+public interface MseaCfmNetconfService {
 
     /**
      * Returns attributes of MEP.
@@ -70,9 +67,11 @@
      * @param mseaCfm value of mseaCfm
      * @param session An active NETCONF session
      * @param targetDs one of running, candidate or startup
+     * @return Boolean to indicate success or failure
      * @throws NetconfException if the session has any error
      */
-    void setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session, TargetConfig targetDs) throws NetconfException;
+    boolean setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session,
+                       DatastoreId targetDs) throws NetconfException;
 
     /**
      * Service interface of transmitLoopback.
@@ -81,7 +80,8 @@
      * @param session An active NETCONF session
      * @throws NetconfException if the session has any error
      */
-    void transmitLoopback(TransmitLoopbackInput inputVar, NetconfSession session) throws NetconfException;
+    void transmitLoopback(TransmitLoopbackInput inputVar,
+                          NetconfSession session) throws NetconfException;
 
     /**
      * Service interface of abortLoopback.
@@ -90,7 +90,8 @@
      * @param session An active NETCONF session
      * @throws NetconfException if the session has any error
      */
-    void abortLoopback(AbortLoopbackInput inputVar, NetconfSession session) throws NetconfException;
+    void abortLoopback(AbortLoopbackInput inputVar,
+                       NetconfSession session) throws NetconfException;
 
     /**
      * Service interface of transmitLinktrace.
@@ -100,6 +101,6 @@
      * @return transmitLinktraceOutput output of service interface transmitLinktrace
      * @throws NetconfException if the session has any error
      */
-    TransmitLinktraceOutput transmitLinktrace(TransmitLinktraceInput inputVar, NetconfSession session)
-            throws NetconfException;
+    TransmitLinktraceOutput transmitLinktrace(TransmitLinktraceInput inputVar,
+              NetconfSession session) throws NetconfException;
 }
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
new file mode 100644
index 0000000..f9788f3
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
@@ -0,0 +1,80 @@
+/*
+ * 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.DatastoreId;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+
+import java.util.List;
+
+/**
+ * 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;
+
+    /**
+     * Get a filtered subset of the config model.
+     *
+     * @param session  An active NETCONF session
+     * @return mseaSaFiltering
+     * @throws NetconfException if the session has any error
+     */
+    public List<SourceAddressRange> getConfigMseaSaFilterIds(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
+     * @return Boolean to indicate success or failure
+     * @throws NetconfException if the session has any error
+     */
+    boolean setMseaSaFiltering(MseaSaFilteringOpParam mseaSaFiltering,
+            NetconfSession session, DatastoreId targetDs) throws NetconfException;
+
+    /**
+     * Deletes the value to attribute mseaSaFiltering.
+     *
+     * @param mseaSaFiltering value of mseaSaFiltering
+     * @param session An active NETCONF session
+     * @param targetDs The NETCONF datastore to edit
+     * @return Boolean to indicate success or failure
+     * @throws NetconfException if the session has any error
+     */
+    boolean deleteMseaSaFilteringRange(MseaSaFilteringOpParam mseaSaFiltering,
+              NetconfSession session, DatastoreId targetDs) throws NetconfException;
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
similarity index 74%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
index 38ccbf6..a7f85bf 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceNetconfService.java
@@ -19,12 +19,12 @@
 import java.util.List;
 import java.util.Map;
 
+import org.onosproject.netconf.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
 
 /**
  * Extension of mseaUniEvcServiceService to include NETCONF sessions.
@@ -55,8 +55,8 @@
      * @throws NetconfException if the session has any error
      */
     MseaUniEvcService getConfigMseaUniEvcService(
-            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig targetDs)
-            throws NetconfException;
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session,
+            DatastoreId targetDs) throws NetconfException;
 
     /**
      * Sets the value to attribute mseaUniEvcService.
@@ -64,13 +64,26 @@
      * @param mseaUniEvcService value of mseaUniEvcService
      * @param session The NETCONF session
      * @param targetDs one of running, candidate or startup
+     * @return Boolean to indicate success or failure
      * @throws NetconfException if the session has any error
      */
-    void setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
-            NetconfSession session, TargetConfig targetDs)
+    boolean setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
+            NetconfSession session, DatastoreId targetDs)
             throws NetconfException;
 
     /**
+     * Deletes the objects in mseaUniEvcService.
+     *
+     * @param mseaUniEvcService value of mseaUniEvcService
+     * @param session The NETCONF session
+     * @param targetDs one of running, candidate or startup
+     * @return Boolean to indicate success or failure
+     * @throws NetconfException if the session has any error
+     */
+    boolean deleteMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
+             NetconfSession session, DatastoreId targetDs) throws NetconfException;
+
+    /**
      * Returns a list of the CeVlanMaps on both sides of the EVC.
      *
      * @param session A NETCONF Session
@@ -79,7 +92,7 @@
      * @throws NetconfException if the session has any error
      */
     MseaUniEvcService getmseaUniEvcCeVlanMaps(
-            NetconfSession session, TargetConfig ncDs)
+            NetconfSession session, DatastoreId ncDs)
             throws NetconfException;
 
     /**
@@ -100,7 +113,7 @@
             Map<Integer, String> ceVlanUpdates,
             Map<Integer, List<Short>> flowVlanIds,
             NetconfSession session,
-            TargetConfig targetDs,
+            DatastoreId targetDs,
             UniSideInterfaceAssignmentEnum portAssign)
                     throws NetconfException;
 
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/UniSide.java
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnic.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnic.java
new file mode 100644
index 0000000..fbf89be
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnic.java
@@ -0,0 +1,56 @@
+/*
+ * 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.custom;
+
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.EvcPerUniServiceTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.TagManipulation;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnic;
+
+import java.util.List;
+
+/**
+ * Extend the DefaultEvcPerUnic so that the ceVlanMap can always be initialized at 0.
+ */
+public class CustomEvcPerUnic extends DefaultEvcPerUnic {
+    @Override
+    public ServiceListType ceVlanMap() {
+        if (ceVlanMap == null) {
+            return new ServiceListType("0");
+        }
+        return ceVlanMap;
+    }
+    @Override
+    public Object ingressBwpGroupIndex() {
+        return ingressBwpGroupIndex;
+    }
+
+    @Override
+    public EvcPerUniServiceTypeEnum evcPerUniServiceType() {
+        return evcPerUniServiceType;
+    }
+
+    @Override
+    public TagManipulation tagManipulation() {
+        return tagManipulation;
+    }
+
+    @Override
+    public List<FlowMapping> flowMapping() {
+        return flowMapping;
+    }
+}
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnin.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnin.java
new file mode 100644
index 0000000..d8712dc
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/CustomEvcPerUnin.java
@@ -0,0 +1,57 @@
+/*
+ * 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.custom;
+
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.EvcPerUniServiceTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.FlowMapping;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.TagManipulation;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnin;
+
+import java.util.List;
+
+/**
+ * Extend the DefaultEvcPerUnin so that the ceVlanMap can always be initialized at 0.
+ */
+public class CustomEvcPerUnin extends DefaultEvcPerUnin {
+    @Override
+    public ServiceListType ceVlanMap() {
+        if (ceVlanMap == null) {
+            return new ServiceListType("0");
+        }
+        return ceVlanMap;
+    }
+    @Override
+    public Object ingressBwpGroupIndex() {
+        return ingressBwpGroupIndex;
+    }
+
+    @Override
+    public EvcPerUniServiceTypeEnum evcPerUniServiceType() {
+        return evcPerUniServiceType;
+    }
+
+    @Override
+    public TagManipulation tagManipulation() {
+        return tagManipulation;
+    }
+
+    @Override
+    public List<FlowMapping> flowMapping() {
+        return flowMapping;
+    }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
similarity index 85%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
index 6e7ab5c..1a7a471 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
@@ -17,4 +17,4 @@
 /**
  * Package for Microsemi device drivers support for NETCONF for EA1000.
  */
-package org.onosproject.yms.app.ysr;
\ No newline at end of file
+package org.onosproject.drivers.microsemi.yang.custom;
\ No newline at end of file
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
new file mode 100644
index 0000000..3867a2f
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/AbstractYangServiceImpl.java
@@ -0,0 +1,245 @@
+/*
+ * 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 java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.ByteSource;
+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.DatastoreId;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaContextProvider;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.CompositeStream;
+import org.onosproject.yang.runtime.DefaultCompositeData;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
+import org.onosproject.yang.runtime.DefaultYangSerializerContext;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.onosproject.yang.runtime.YangSerializer;
+import org.onosproject.yang.runtime.YangSerializerContext;
+import org.onosproject.yang.runtime.YangSerializerRegistry;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+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 {
+    public static final String NC_OPERATION = "nc:operation";
+    public static final String OP_DELETE = "delete";
+
+    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 YangModelRegistry yangModelRegistry;
+
+//    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+//    protected SchemaContextProvider schemaContextProvider;
+
+    protected ApplicationId appId;
+
+    // xSer is not a service and is a class variable. Can be lost on deactivate.
+    // Must be recreated on activate
+    protected XmlSerializer xSer;
+    protected YangSerializerContext yCtx;
+
+    protected static final Pattern REGEX_XML_HEADER =
+            Pattern.compile("(<\\?xml).*(\\?>)", Pattern.DOTALL);
+    protected static final Pattern REGEX_RPC_REPLY =
+            Pattern.compile("(<rpc-reply)[ ]*" +
+                    "(xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\")[ ]*" +
+                    "(message-id=\")[0-9]*(\">)", Pattern.DOTALL);
+    protected static final Pattern REGEX_RPC_REPLY_DATA_NS =
+            Pattern.compile("(<data)[ ]*(xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)");
+    protected static final Pattern REGEX_RPC_REPLY_DATA =
+            Pattern.compile("(<data>)");
+    protected static final Pattern REGEX_RPC_REPLY_DATA_CLOSE =
+            Pattern.compile("(</data>)");
+    protected static final Pattern REGEX_RPC_REPLY_DATA_EMPTY =
+            Pattern.compile("(<data/>)");
+    protected static final Pattern REGEX_RPC_REPLY_CLOSE =
+            Pattern.compile("(</rpc-reply>)");
+
+    @Activate
+    public void activate() {
+        Set<YangSerializer> yangSer = ((YangSerializerRegistry) yangModelRegistry).getSerializers();
+        yangSer.forEach(ser -> {
+            if (ser instanceof XmlSerializer) {
+                xSer = (XmlSerializer) ser;
+            }
+        });
+        SchemaContext context = ((SchemaContextProvider) yangModelRegistry)
+                .getSchemaContext(ResourceId.builder().addBranchPointSchema("/", null).build());
+
+        yCtx = new DefaultYangSerializerContext(context, null);
+    };
+
+    @Deactivate
+    public void deactivate() {
+        alreadyLoaded = false;
+    }
+
+    /**
+     * Internal method to generically make a NETCONF get query from YANG objects.
+     * @param moFilter A YANG object model
+     * @param session A NETCONF session
+     * @return YangObjectModel
+     * @throws NetconfException if the session has any error
+     */
+    protected final ModelObjectData getNetconfObject(
+            ModelObjectData moFilter, NetconfSession session)
+                throws NetconfException {
+
+        return getConfigNetconfObject(moFilter, session, null);
+    }
+
+    /**
+     * Internal method to generically make a NETCONF get-config query from YANG objects.
+     *
+     * @param moFilter 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 ModelObjectData getConfigNetconfObject(
+            ModelObjectData moFilter, NetconfSession session, DatastoreId targetDs)
+                throws NetconfException {
+        if (session == null) {
+            throw new NetconfException("Session is null when calling getConfigNetconfObject()");
+        }
+
+        if (moFilter == null) {
+            throw new NetconfException("Query object cannot be null");
+        }
+
+        String xmlQueryStr = encodeMoToXmlStr(moFilter, null);
+
+        log.debug("Sending <get-(config)> query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+        String xmlResult;
+        if (targetDs == null) {
+            xmlResult = session.get(xmlQueryStr, null);
+        } else {
+            xmlResult = session.getConfig(targetDs, xmlQueryStr);
+        }
+        xmlResult = removeRpcReplyData(xmlResult);
+
+        DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+                null, new ByteArrayInputStream(xmlResult.getBytes()));
+        CompositeData compositeData = xSer.decode(resultDcs, yCtx);
+
+        return ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+    }
+
+    /**
+     * Internal method to generically make a NETCONF edit-config call from a set of YANG objects.
+     *
+     * @param moConfig A YANG object model
+     * @param session A NETCONF session
+     * @param targetDs - running,candidate or startup
+     * @param annotations A list of AnnotatedNodeInfos to be added to the DataNodes
+     * @return Boolean value indicating success or failure of command
+     * @throws NetconfException if the session has any error
+     */
+    protected final boolean setNetconfObject(
+            ModelObjectData moConfig, NetconfSession session, DatastoreId targetDs,
+            List<AnnotatedNodeInfo> annotations) throws NetconfException {
+        if (moConfig == null) {
+            throw new NetconfException("Query object cannot be null");
+        } else if (session == null) {
+            throw new NetconfException("Session is null when calling getMseaSaFiltering()");
+        } else if (targetDs == null) {
+            throw new NetconfException("TargetDs is null when calling getMseaSaFiltering()");
+        }
+
+        String xmlQueryStr = encodeMoToXmlStr(moConfig, annotations);
+        log.debug("Sending <edit-config> query on NETCONF session " + session.getSessionId() +
+                ":\n" + xmlQueryStr);
+
+        return session.editConfig(targetDs, null, xmlQueryStr);
+    }
+
+    protected final String encodeMoToXmlStr(ModelObjectData yangObjectOpParamFilter,
+                                            List<AnnotatedNodeInfo> annotations)
+            throws NetconfException {
+        //Convert the param to XML to use as a filter
+        ResourceData rd = ((ModelConverter) yangModelRegistry).createDataNode(yangObjectOpParamFilter);
+
+        DefaultCompositeData.Builder cdBuilder =
+                        DefaultCompositeData.builder().resourceData(rd);
+        if (annotations != null) {
+            for (AnnotatedNodeInfo ani : annotations) {
+                cdBuilder.addAnnotatedNodeInfo(ani);
+            }
+        }
+        CompositeStream cs = xSer.encode(cdBuilder.build(), yCtx);
+        //Convert the param to XML to use as a filter
+
+        try {
+            ByteSource byteSource = new ByteSource() {
+                @Override
+                public InputStream openStream() throws IOException {
+                    return cs.resourceData();
+                }
+            };
+
+            return byteSource.asCharSource(Charsets.UTF_8).read();
+        } catch (IOException e) {
+            throw new NetconfException("Error decoding CompositeStream to String", e);
+        }
+    }
+
+    protected static final String removeRpcReplyData(String rpcReplyXml) {
+        rpcReplyXml = REGEX_XML_HEADER.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY_DATA_NS.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY_DATA.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY_DATA_CLOSE.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY_DATA_EMPTY.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_RPC_REPLY_CLOSE.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = rpcReplyXml.replace("\t", "");
+        return rpcReplyXml;
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
similarity index 62%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
index 4c61143..3673594 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/IetfSystemManager.java
@@ -15,32 +15,34 @@
  */
 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.io.ByteArrayInputStream;
 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.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.DefaultSystem;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.DefaultSystemState;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.doupgradeandreboot.DoUpgradeAndRebootOutput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.pullupdatetarfromtftp.PullUpdateTarFromTftpInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogInput;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.readfromsyslog.ReadFromSyslogOutput;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.systemrestart.SystemRestartInput;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
 
 /**
  * Implementation of the IetfService YANG model service.
@@ -50,28 +52,18 @@
 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() {
+        super.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");
     }
 
@@ -85,7 +77,23 @@
     @Override
     public IetfSystem getIetfSystem(IetfSystemOpParam ietfSystemFilter, NetconfSession session)
             throws NetconfException {
-        return (IetfSystem) getNetconfObject(ietfSystemFilter, session);
+
+        ModelObjectData moQuery = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) ietfSystemFilter.system())
+                .build();
+
+        ModelObjectData moReply = getNetconfObject(moQuery, session);
+
+        IetfSystemOpParam ietfSystem = new IetfSystemOpParam();
+        for (ModelObject mo:moReply.modelObjects()) {
+            if (mo instanceof DefaultSystem) {
+                ietfSystem.system((DefaultSystem) mo);
+            } else if (mo instanceof DefaultSystemState) {
+                ietfSystem.systemState((DefaultSystemState) mo);
+            }
+        }
+
+        return ietfSystem;
     }
 
     @Override
@@ -96,34 +104,34 @@
 
         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();
+        xmlResult = removeRpcReplyData(xmlResult);
+        DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+                null, new ByteArrayInputStream(xmlResult.getBytes()));
+        CompositeData compositeData = xSer.decode(resultDcs, yCtx);
 
-        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());
+        ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+
+        IetfSystemOpParam ietfSystem = new IetfSystemOpParam();
+        for (ModelObject mo:mod.modelObjects()) {
+            if (mo instanceof DefaultSystem) {
+                ietfSystem.system((DefaultSystem) mo);
+            } else if (mo instanceof DefaultSystemState) {
+                ietfSystem.systemState((DefaultSystemState) mo);
+            }
         }
 
-        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();
+        return ietfSystem;
     }
 
     /**
      * Call NETCONF edit-config with a configuration.
      */
     @Override
-    public void setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session, TargetConfig ncDs)
-        throws NetconfException {
-        setNetconfObject(ietfSystem, session, ncDs);
+    public boolean setIetfSystem(IetfSystemOpParam ietfSystem, NetconfSession session,
+                              DatastoreId ncDs) throws NetconfException {
+        ModelObjectData mo = DefaultModelObjectData.builder()
+                                .addModelObject(ietfSystem).build();
+        return setNetconfObject(mo, session, ncDs, null);
     }
 
     @Override
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
similarity index 62%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
index c2359ab..36f48c4 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaCfmManager.java
@@ -15,29 +15,29 @@
  */
 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.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfmOpParam;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
+
+import java.io.ByteArrayInputStream;
 
 /**
  * Implementation of the MseaCfmServiceNetconf YANG model service.
@@ -51,21 +51,14 @@
 
     @Activate
     public void activate() {
+        super.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");
     }
 
@@ -82,42 +75,38 @@
                 ":\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);
+        xmlResult = removeRpcReplyData(xmlResult);
+        DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+                null, new ByteArrayInputStream(xmlResult.getBytes()));
+        CompositeData compositeData = xSer.decode(resultDcs, yCtx);
+
+        ModelObjectData mod = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+
+        MseaCfmOpParam mseaCfm = new MseaCfmOpParam();
+        for (ModelObject mo:mod.modelObjects()) {
+            if (mo instanceof DefaultMefCfm) {
+                mseaCfm.mefCfm((DefaultMefCfm) mo);
+            }
         }
+
+        return mseaCfm;
     }
 
     @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);
-        }
+        throw new UnsupportedOperationException("Not yet implemented");
     }
 
     @Override
-    public void setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session, TargetConfig targetDs)
-            throws NetconfException {
-        setNetconfObject(mseaCfm, session, targetDs);
+    public boolean setMseaCfm(MseaCfmOpParam mseaCfm, NetconfSession session,
+              DatastoreId targetDs) throws NetconfException {
+        ModelObjectData moEdit = DefaultModelObjectData.builder()
+                .addModelObject(mseaCfm).build();
+
+        return setNetconfObject(moEdit, session, targetDs, null);
     }
 
     /**
@@ -139,16 +128,6 @@
         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();
 
@@ -162,7 +141,7 @@
         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("<ccm-interval>10ms</ccm-interval>\n");
         rpc.append("<remote-meps/>\n");
         rpc.append("<component-list/>\n");
         rpc.append("<maintenance-association-end-point>\n");
@@ -175,7 +154,7 @@
         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:last-defect-sent/>\n");
         rpc.append("<msea-soam-fm:rdi-transmit-status/>\n");
         rpc.append("<loopback/>\n");
         rpc.append("<remote-mep-database/>\n");
@@ -202,7 +181,7 @@
         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("<ccm-interval>10ms</ccm-interval>\n");
         rpc.append("<maintenance-association-end-point>\n");
         rpc.append("<mep-identifier>" + mepId + "</mep-identifier>\n");
         rpc.append("<msea-soam-pm:delay-measurements>");
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
new file mode 100644
index 0000000..01af138
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaSaFilteringManager.java
@@ -0,0 +1,202 @@
+/*
+ * 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.DatastoreId;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 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";
+    public static final String MSEA_SA_FILTERING_NS =
+            "http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering";
+
+    @Activate
+    public void activate() {
+        super.activate();
+        appId = coreService.registerApplication(MSEA_SA_FILTERING);
+        log.info("MseaSaFilteringManager Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        super.deactivate();
+        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 {
+        ModelObjectData moQuery = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaSaFilteringFilter
+                        .sourceIpaddressFiltering())
+                .build();
+
+
+        ModelObjectData moReply = getNetconfObject(moQuery, session);
+
+        MseaSaFiltering reply = new MseaSaFilteringOpParam();
+        for (ModelObject mo:moReply.modelObjects()) {
+            if (mo instanceof SourceIpaddressFiltering) {
+                reply.sourceIpaddressFiltering((SourceIpaddressFiltering) mo);
+            }
+        }
+        return reply;
+    }
+
+    /**
+     * Get a filtered subset of the config model (from running)
+     * This is meant to filter the current live model
+     * against the attribute(s) given in the argument
+     * and return the filtered model.
+     */
+    @Override
+    public List<SourceAddressRange> getConfigMseaSaFilterIds(NetconfSession session)
+            throws NetconfException {
+
+        String xmlResult = session.getConfig(DatastoreId.RUNNING, saFilterQuery());
+        xmlResult = removeRpcReplyData(xmlResult);
+
+        DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+                null, new ByteArrayInputStream(xmlResult.getBytes()));
+        CompositeData compositeData = xSer.decode(resultDcs, yCtx);
+
+        ModelObjectData moReply = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+
+        MseaSaFiltering reply = new MseaSaFilteringOpParam();
+        for (ModelObject mo:moReply.modelObjects()) {
+            if (mo instanceof SourceIpaddressFiltering) {
+                reply.sourceIpaddressFiltering((SourceIpaddressFiltering) mo);
+            }
+        }
+        if (reply != null && reply.sourceIpaddressFiltering() != null &&
+                reply.sourceIpaddressFiltering().interfaceEth0() != null) {
+            return reply.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
+        } else {
+            return new ArrayList<SourceAddressRange>();
+        }
+    }
+
+    /**
+     * Call NETCONF edit-config with a configuration.
+     */
+    @Override
+    public boolean setMseaSaFiltering(MseaSaFilteringOpParam mseaSaFiltering,
+           NetconfSession session, DatastoreId ncDs) throws NetconfException {
+
+        ModelObjectData moQuery = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaSaFiltering
+                        .sourceIpaddressFiltering()).build();
+
+        return setNetconfObject(moQuery, session, ncDs, null);
+    }
+
+    @Override
+    public boolean deleteMseaSaFilteringRange(MseaSaFilteringOpParam mseaSaFiltering,
+                                      NetconfSession session, DatastoreId ncDs) throws NetconfException {
+
+        ModelObjectData moQuery = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaSaFiltering
+                        .sourceIpaddressFiltering()).build();
+
+        ArrayList anis = new ArrayList<AnnotatedNodeInfo>();
+        if (mseaSaFiltering.sourceIpaddressFiltering().interfaceEth0() != null &&
+                mseaSaFiltering.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange() != null) {
+
+            for (SourceAddressRange sar:mseaSaFiltering.sourceIpaddressFiltering()
+                    .interfaceEth0().sourceAddressRange()) {
+                String sarRangeIdStr = String.valueOf(sar.rangeId());
+
+                ResourceId.Builder ridBuilder = ResourceId.builder()
+                        .addBranchPointSchema("/", null)
+                        .addBranchPointSchema("source-ipaddress-filtering", MSEA_SA_FILTERING_NS)
+                        .addBranchPointSchema("interface-eth0", MSEA_SA_FILTERING_NS)
+                        .addBranchPointSchema("source-address-range", MSEA_SA_FILTERING_NS)
+                        .addKeyLeaf("range-id", MSEA_SA_FILTERING_NS, sarRangeIdStr);
+
+                AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
+                        .resourceId(ridBuilder.build())
+                        .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
+                        .build();
+
+                anis.add(ani);
+            }
+        } else {
+            //Delete all
+            ResourceId.Builder ridBuilder = ResourceId.builder()
+                    .addBranchPointSchema("/", null)
+                    .addBranchPointSchema("source-ipaddress-filtering", MSEA_SA_FILTERING_NS);
+            AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
+                    .resourceId(ridBuilder.build())
+                    .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
+                    .build();
+            anis.add(ani);
+        }
+
+        return setNetconfObject(moQuery, session, ncDs, anis);
+    }
+
+
+    private static String saFilterQuery() {
+        StringBuilder sb = new StringBuilder("<source-ipaddress-filtering " +
+                "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">");
+        sb.append("<interface-eth0>");
+        sb.append("<filter-admin-state>blacklist</filter-admin-state>");
+        sb.append("<source-address-range>");
+        sb.append("<range-id/>");
+        sb.append("</source-address-range>");
+        sb.append("</interface-eth0>");
+        sb.append("</source-ipaddress-filtering>");
+        return sb.toString();
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
similarity index 62%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
index 82b6116..f965541 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/MseaUniEvcServiceManager.java
@@ -15,9 +15,7 @@
  */
 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.io.ByteArrayInputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -27,13 +25,24 @@
 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.DatastoreId;
 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;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.onosproject.yang.runtime.DefaultCompositeStream;
 
 /**
  * Implementation of the MseaUniEvcServiceService YANG model service.
@@ -42,70 +51,127 @@
 @Service
 public class MseaUniEvcServiceManager extends AbstractYangServiceImpl
         implements MseaUniEvcServiceNetconfService {
-    public static final String MSEA_SA_FILTERING = "org.onosproject.drivers.microsemi.yang.mseaunievcservice";
+    public static final String MSEA_UNI_EVC_SVC =
+            "org.onosproject.drivers.microsemi.yang.mseaunievcservice";
+    public static final String MSEA_UNI_EVC_SVC_NS =
+            "http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service";
 
     @Activate
     public void activate() {
-        appId = coreService.registerApplication(MSEA_SA_FILTERING);
-        ych = ymsService.getYangCodecHandler();
-        ych.addDeviceSchema(MseaUniEvcServiceService.class);
+        super.activate();
+        appId = coreService.registerApplication(MSEA_UNI_EVC_SVC);
         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);
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session)
+            throws NetconfException {
+
+        return getConfigMseaUniEvcService(mseaUniEvcService, session, null);
     }
 
     @Override
     public MseaUniEvcService getConfigMseaUniEvcService(
-            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig targetDs)
-            throws NetconfException {
-        return (MseaUniEvcService) getConfigNetconfObject(mseaUniEvcService, session, targetDs);
+            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session,
+            DatastoreId targetDs) throws NetconfException {
+
+        ModelObjectData moFilter = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
+
+        ModelObjectData moReply = getConfigNetconfObject(moFilter, session, targetDs);
+
+        MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
+        for (ModelObject mo:moReply.modelObjects()) {
+            if (mo instanceof MefServices) {
+                reply.mefServices((MefServices) mo);
+            }
+        }
+        return reply;
     }
 
     /**
      * Modify the configuration.
      */
     @Override
-    public void setMseaUniEvcService(
-            MseaUniEvcServiceOpParam mseaUniEvcService, NetconfSession session, TargetConfig ncDs)
-                    throws NetconfException {
-        setNetconfObject(mseaUniEvcService, session, ncDs);
+    public boolean setMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
+                 NetconfSession session, DatastoreId ncDs) throws NetconfException {
+        ModelObjectData moEdit = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
+
+        return setNetconfObject(moEdit, session, ncDs, null);
     }
 
+    /**
+     * Delete the configuration.
+     */
+    @Override
+    public boolean deleteMseaUniEvcService(MseaUniEvcServiceOpParam mseaUniEvcService,
+                NetconfSession session, DatastoreId ncDs) throws NetconfException {
+        ModelObjectData moEdit = DefaultModelObjectData.builder()
+                .addModelObject((ModelObject) mseaUniEvcService.mefServices()).build();
+
+        ArrayList anis = new ArrayList<AnnotatedNodeInfo>();
+        for (BwpGroup bwpGrp:mseaUniEvcService.mefServices().profiles().bwpGroup()) {
+            String bwpGroupIndex = String.valueOf(bwpGrp.groupIndex());
+
+            ResourceId.Builder ridBuilder = ResourceId.builder()
+                    .addBranchPointSchema("/", null)
+                    .addBranchPointSchema("mef-services", MSEA_UNI_EVC_SVC_NS)
+                    .addBranchPointSchema("profiles", MSEA_UNI_EVC_SVC_NS)
+                    .addBranchPointSchema("bwp-group", MSEA_UNI_EVC_SVC_NS)
+                    .addKeyLeaf("group-index", MSEA_UNI_EVC_SVC_NS, bwpGroupIndex);
+
+            AnnotatedNodeInfo ani = DefaultAnnotatedNodeInfo.builder()
+                    .resourceId(ridBuilder.build())
+                    .addAnnotation(new DefaultAnnotation(NC_OPERATION, OP_DELETE))
+                    .build();
+
+            anis.add(ani);
+        }
+
+
+        return setNetconfObject(moEdit, session, ncDs, anis);
+    }
+
+
     @Override
     public MseaUniEvcService getmseaUniEvcCeVlanMaps(
-            NetconfSession session, TargetConfig ncDs)
+            NetconfSession session, DatastoreId ncDs)
             throws NetconfException {
         if (session == null) {
             throw new NetconfException("Session is null when calling getMseaSaFiltering()");
         }
 
         String xmlResult = session.getConfig(ncDs, evcFilterQuery());
+        xmlResult = removeRpcReplyData(xmlResult);
 
-        List<Object> objectList = ych.decode(xmlResult, XML, QUERY_CONFIG_REPLY);
-        if (objectList != null && objectList.size() > 0) {
-            return (MseaUniEvcService) objectList.get(0);
+        DefaultCompositeStream resultDcs = new DefaultCompositeStream(
+                null, new ByteArrayInputStream(xmlResult.getBytes()));
+        CompositeData compositeData = xSer.decode(resultDcs, yCtx);
+
+        ModelObjectData moReply = ((ModelConverter) yangModelRegistry).createModel(compositeData.resourceData());
+
+        MseaUniEvcService reply = new MseaUniEvcServiceOpParam();
+        for (ModelObject mo:moReply.modelObjects()) {
+            if (mo instanceof MefServices) {
+                reply.mefServices((MefServices) mo);
+            }
         }
-
-        return null;
+        return reply;
     }
 
     @Override
     public void removeEvcUniFlowEntries(
             Map<Integer, String> ceVlanUpdates,
             Map<Integer, List<Short>> flowVlanIds,
-            NetconfSession session, TargetConfig targetDs,
+            NetconfSession session, DatastoreId targetDs,
             UniSideInterfaceAssignmentEnum portAssign) throws NetconfException {
 
         List<Integer> evcAlreadyHandled = new ArrayList<>();
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/impl/package-info.java
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/package-info.java
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/CeVlanMapUtils.java
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
similarity index 95%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
index 4b706b6..275dc25 100644
--- a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtils.java
@@ -21,7 +21,7 @@
 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;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.DateAndTime;
 
 /**
  * A utility class to change various YANG types to general purpose classes.
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/utils/package-info.java
diff --git a/drivers/microsemi/ea1000driver/src/main/resources/microsemi-drivers.xml b/drivers/microsemi/src/main/resources/microsemi-drivers.xml
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/main/resources/microsemi-drivers.xml
rename to drivers/microsemi/src/main/resources/microsemi-drivers.xml
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000MeterProviderTest.java
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MicrosemiDriversLoaderTest.java
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/RpcResultParserTest.java
diff --git a/drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/TestEA1000MeterProvider.java
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
similarity index 65%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
index c792b91..098ecdd 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
@@ -31,21 +31,20 @@
 import org.onosproject.netconf.NetconfDeviceInfo;
 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.system.rev20140806.IetfSystemOpParam;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.DefaultSystem;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.System;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.Clock;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.DefaultClock;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.clock.timezone.DefaultTimezoneName;
-import org.onosproject.yms.ymsm.YmsService;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.system.AugmentedSysSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.system.DefaultAugmentedSysSystem;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.systemstate.platform.AugmentedSysPlatform;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.DefaultSystem;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.System;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.system.DefaultClock;
+import org.onosproject.yang.gen.v1.ietfsystem.rev20140806.ietfsystem.system.clock.timezone.DefaultTimezoneName;
+import org.onosproject.yang.gen.v1.ietfsystemmicrosemi.rev20160505.ietfsystemmicrosemi.systemstate.platform.DefaultAugmentedSysPlatform;
 
 public class IetfSystemManagerTest {
 
     IetfSystemManager sysSvc = null;
-    YmsService ymsService;
     NetconfSession session;
 
     @Before
@@ -67,14 +66,11 @@
 
     @Test
     public void testGetIetfSystemSession() throws NetconfException {
-        Clock.ClockBuilder cBuilder = new DefaultClock.ClockBuilder();
-        Clock clock = cBuilder.build();
+        System system = new DefaultSystem();
+        system.clock(new DefaultClock());
 
-        System.SystemBuilder sBuilder = new DefaultSystem.SystemBuilder();
-        System system = sBuilder.clock(clock).build();
-
-        IetfSystemOpParam.IetfSystemBuilder builder = new IetfSystemOpParam.IetfSystemBuilder();
-        IetfSystemOpParam sampleSystem = (IetfSystemOpParam) builder.system(system).build();
+        IetfSystemOpParam sampleSystem = new IetfSystemOpParam();
+        sampleSystem.system(system);
 
         IetfSystem sys = sysSvc.getIetfSystem(sampleSystem, session);
         assertNotNull(sys);
@@ -91,14 +87,14 @@
         assertNotNull(sys);
         assertNotNull(sys.system());
 
-        AugmentedSysSystem sysSystem = (AugmentedSysSystem) sys.system().yangAugmentedInfo(AugmentedSysSystem.class);
+        AugmentedSysSystem sysSystem = (AugmentedSysSystem) sys.system().augmentation(DefaultAugmentedSysSystem.class);
 
         assertEquals("-8.4683990", sysSystem.longitude().toPlainString());
         assertEquals("51.9036140", sysSystem.latitude().toPlainString());
         assertEquals("4.4.0-53-generic", sys.systemState().platform().osRelease());
 
         AugmentedSysPlatform sysSystemState =
-                (AugmentedSysPlatform) sys.systemState().platform().yangAugmentedInfo(AugmentedSysPlatform.class);
+                (AugmentedSysPlatform) sys.systemState().platform().augmentation(DefaultAugmentedSysPlatform.class);
 
         assertEquals("Eagle Simulator.", sysSystemState.deviceIdentification().serialNumber());
     }
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
new file mode 100644
index 0000000..f035c70
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
@@ -0,0 +1,36 @@
+/*
+ * 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.drivers.microsemi.yang.impl.IetfSystemManager;
+import org.onosproject.yang.MockYangRuntimeManager;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+import org.onosproject.yang.serializers.xml.MockYangSerializerContext;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+
+public class MockIetfSystemManager extends IetfSystemManager {
+
+    @Override
+    public void activate() {
+        yCtx = new MockYangSerializerContext();
+        xSer = new XmlSerializer();
+        yangModelRegistry = new MockYangRuntimeManager();
+        ((MockYangRuntimeManager) yangModelRegistry).setModelRegistry(
+                (DefaultYangModelRegistry) yCtx.getContext());
+        ((MockYangRuntimeManager) yangModelRegistry).activate();
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
new file mode 100644
index 0000000..fb20697
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
@@ -0,0 +1,35 @@
+/*
+ * 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.drivers.microsemi.yang.impl.MseaCfmManager;
+import org.onosproject.yang.MockYangRuntimeManager;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+import org.onosproject.yang.serializers.xml.MockYangSerializerContext;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+
+public class MockMseaCfmManager extends MseaCfmManager {
+
+    @Override
+    public void activate() {
+        yCtx = new MockYangSerializerContext();
+        xSer = new XmlSerializer();
+        yangModelRegistry = new MockYangRuntimeManager();
+        ((MockYangRuntimeManager) yangModelRegistry).setModelRegistry(
+                (DefaultYangModelRegistry) yCtx.getContext());
+        ((MockYangRuntimeManager) yangModelRegistry).activate();
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
new file mode 100644
index 0000000..a2de180
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
@@ -0,0 +1,35 @@
+/*
+ * 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.drivers.microsemi.yang.impl.MseaSaFilteringManager;
+import org.onosproject.yang.MockYangRuntimeManager;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+import org.onosproject.yang.serializers.xml.MockYangSerializerContext;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+
+public class MockMseaSaFilteringManager extends MseaSaFilteringManager {
+
+    @Override
+    public void activate() {
+        yCtx = new MockYangSerializerContext();
+        xSer = new XmlSerializer();
+        yangModelRegistry = new MockYangRuntimeManager();
+        ((MockYangRuntimeManager) yangModelRegistry).setModelRegistry(
+                (DefaultYangModelRegistry) yCtx.getContext());
+        ((MockYangRuntimeManager) yangModelRegistry).activate();
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
new file mode 100644
index 0000000..e7921c2
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
@@ -0,0 +1,34 @@
+/*
+ * 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.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
+import org.onosproject.yang.MockYangRuntimeManager;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+import org.onosproject.yang.serializers.xml.MockYangSerializerContext;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+
+public class MockMseaUniEvcServiceManager extends MseaUniEvcServiceManager {
+    @Override
+    public void activate() {
+        yCtx = new MockYangSerializerContext();
+        xSer = new XmlSerializer();
+        yangModelRegistry = new MockYangRuntimeManager();
+        ((MockYangRuntimeManager) yangModelRegistry).setModelRegistry(
+                (DefaultYangModelRegistry) yCtx.getContext());
+        ((MockYangRuntimeManager) yangModelRegistry).activate();
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
similarity index 92%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
index 19a291e..fc6da58 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
@@ -20,6 +20,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
 
+import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfDeviceOutputEventListener;
 import org.onosproject.netconf.NetconfException;
@@ -88,17 +89,21 @@
                     + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
 
     private Pattern sampleXmlRegexEditDeleteSaFilt =
-            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
-                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target><running/></target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                     + "(<source-ipaddress-filtering "
-                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">).*"
-                    + "(<interface-eth0>).*"
-                    + "(<source-address-range nc:operation=\"delete\">).*(<range-id>).*(</range-id>).*"
-                    + "(</source-address-range>).*"
-                    + "(<source-address-range nc:operation=\"delete\">).*(<range-id>).*(</range-id>).*"
-                    + "(</source-address-range>).*"
-                    + "(</interface-eth0>).*(</source-ipaddress-filtering>).*"
-                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">)\\R?"
+                    + "(<interface-eth0>)\\R?"
+                    + "((<source-address-range nc:operation=\"delete\">)\\R?"
+                    + "(<range-id>)[0-9]*(</range-id>)\\R?"
+                    + "((<name>)[a-zA-Z0-9]*(</name>))?\\R?"
+                    + "((<ipv4-address-prefix>)[0-9\\\\./]*(</ipv4-address-prefix>))?\\R?"
+                    + "(</source-address-range>))++\\R?"
+                    + "(</interface-eth0>)\\R?"
+                    + "(</source-ipaddress-filtering>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>).*(]]>){2}", Pattern.DOTALL);
 
     private Pattern sampleXmlRegexUniEvc =
             Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
@@ -126,18 +131,18 @@
                     + "(<evc>)\\R?(<evc-index>).*(</evc-index>)\\R?(<name>).*(</name>)\\R?"
                     + "(<evc-per-uni>)\\R?"
                     + "(<evc-per-uni-c>)\\R?"
-                    + "(<ce-vlan-map>).*(</ce-vlan-map>)\\R?"
-                    + "(<ingress-bwp-group-index>).*(</ingress-bwp-group-index>)\\R?"
-                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?(<outer-tag-vlan>).*"
-                    + "(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
+                    + "(<ce-vlan-map>)[0-9]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
+                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?"
+                    + "(<outer-tag-vlan>)[0-9]*(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
                     + "((<flow-mapping>)\\R?"
                     + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
                     + "(<flow-id>)[0-9]*(</flow-id>)\\R?"
                     + "(</flow-mapping>)\\R?)*"
                     + "(</evc-per-uni-c>)\\R?"
                     + "(<evc-per-uni-n>)\\R?"
-                    + "(<ce-vlan-map>).*(</ce-vlan-map>)\\R?"
-                    + "(<ingress-bwp-group-index>).*(</ingress-bwp-group-index>)\\R?"
+                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                     + "(<tag-pop).*"
                     + "((<flow-mapping>)\\R?"
                     + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
@@ -146,7 +151,7 @@
                     + "(</evc-per-uni-n>)\\R?"
                     + "(</evc-per-uni>)\\R?"
                     + "(</evc>)\\R?"
-                    + "(</uni>).*"
+                    + "(</uni>)\\R?"
                     + "(</mef-services>)\\R?"
                     + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
 
@@ -300,9 +305,10 @@
             + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
             + "(<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
             + "(<profiles>)\\R?"
-            + "(<bwp-group nc:operation=\"delete\">)\\R?"
+            + "((<bwp-group nc:operation=\"delete\">)\\R?"
             + "(<group-index>)[0-9]*(</group-index>)\\R?"
-            + "(</bwp-group>)\\R?"
+            + "(<bwp>.*</bwp>)?"
+            + "(</bwp-group>))++\\R?"
             + "(</profiles>)\\R?"
             + "(</mef-services>)\\R?"
             + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
@@ -328,7 +334,7 @@
                     + "(<maintenance-association>)\\R?"
                     + "(<id/>)\\R?"
                     + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
-                    // rpc.append("<ccm-interval>10ms</ccm-interval>\n"); //Have to omit for the moment - YMS problem
+                    + "(<ccm-interval>)[0-9]{1,3}(ms</ccm-interval>)\\R?"
                     + "(<remote-meps/>)\\R?"
                     + "(<component-list/>)\\R?"
                     + "(<maintenance-association-end-point>)\\R?"
@@ -341,7 +347,7 @@
                     + "(<mac-address/>)\\R?"
                     + "(<msea-soam-fm:port-status/>)\\R?"
                     + "(<msea-soam-fm:interface-status/>)\\R?"
-                    // rpc.append("<msea-soam-fm:last-defect-sent/>\n");//Have to omit for the moment - YMS problem
+                    + "(<msea-soam-fm:last-defect-sent/>)\\R?"
                     + "(<msea-soam-fm:rdi-transmit-status/>)\\R?"
                     + "(<loopback/>)\\R?"
                     + "(<remote-mep-database/>)\\R?"
@@ -816,23 +822,9 @@
         return reply;
     }
 
-    @Override
-    public String getConfig(String targetConfiguration) throws NetconfException {
-        return getConfig(TargetConfig.valueOf(targetConfiguration), null);
-    }
 
     @Override
-    public String getConfig(String targetConfiguration, String configurationSchema) throws NetconfException {
-        return getConfig(TargetConfig.valueOf(targetConfiguration), null);
-    }
-
-    @Override
-    public String getConfig(TargetConfig targetConfiguration) throws NetconfException {
-        return getConfig(targetConfiguration, null);
-    }
-
-    @Override
-    public String getConfig(TargetConfig targetConfiguration, String configurationSchema) throws NetconfException {
+    public String getConfig(DatastoreId targetConfiguration, String configurationSchema) throws NetconfException {
         StringBuilder rpc = new StringBuilder(XML_HEADER);
         rpc.append("<rpc ");
         rpc.append(MESSAGE_ID_STRING);
@@ -859,16 +851,11 @@
 
     @Override
     public boolean editConfig(String newConfiguration) throws NetconfException {
-        return editConfig(TargetConfig.RUNNING, null, newConfiguration);
+        return editConfig(DatastoreId.RUNNING, null, newConfiguration);
     }
 
     @Override
-    public boolean editConfig(String targetConfiguration, String mode, String newConfiguration)
-            throws NetconfException {
-        return editConfig(TargetConfig.valueOf(targetConfiguration), mode, newConfiguration);
-    }
-    @Override
-    public boolean editConfig(TargetConfig targetConfiguration, String mode, String newConfiguration)
+    public boolean editConfig(DatastoreId targetConfiguration, String mode, String newConfiguration)
             throws NetconfException {
         newConfiguration = newConfiguration.trim();
         StringBuilder rpc = new StringBuilder(XML_HEADER);
@@ -905,23 +892,6 @@
     }
 
     @Override
-    public boolean copyConfig(TargetConfig targetConfiguration, String newConfiguration) throws NetconfException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean deleteConfig(String targetConfiguration) throws NetconfException {
-        return deleteConfig(TargetConfig.valueOf(targetConfiguration));
-    }
-
-    @Override
-    public boolean deleteConfig(TargetConfig targetConfiguration) throws NetconfException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
     public void startSubscription() throws NetconfException {
         // TODO Auto-generated method stub
 
@@ -940,18 +910,6 @@
     }
 
     @Override
-    public boolean lock(String configType) throws NetconfException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean unlock(String configType) throws NetconfException {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
     public boolean lock() throws NetconfException {
         // TODO Auto-generated method stub
         return false;
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
similarity index 69%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
index 7ec6288..e3a81bc 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -30,20 +30,18 @@
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
-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.mseacfm.DefaultMefCfm;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.MefCfm;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.DefaultMaintenanceDomain;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameCharacterString;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
-import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.Identifier45;
-import org.onosproject.yms.ymsm.YmsService;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.DefaultMefCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.MefCfm;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.DefaultMaintenanceDomain;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameCharacterString;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.Identifier45;
 
 public class MseaCfmManagerTest {
 
     MseaCfmManager mseaCfmService;
-    YmsService ymsService;
     NetconfSession session;
 
     @Before
@@ -78,14 +76,15 @@
      */
     @Test
     public void testSetMseaCfm() throws NetconfException {
-        NameCharacterString mdName = DefaultNameCharacterString.builder().name(Identifier45.fromString("md-1")).build();
+        NameCharacterString mdName = new DefaultNameCharacterString();
+        mdName.name(Identifier45.fromString("md-1"));
 
-        MaintenanceDomain yangMd = DefaultMaintenanceDomain.builder()
-                .id((short) 1)
-                .mdNameAndTypeCombo(mdName)
-                .build();
+        MaintenanceDomain yangMd = new DefaultMaintenanceDomain();
+        yangMd.id((short) 1);
+        yangMd.mdNameAndTypeCombo(mdName);
 
-        MefCfm mefCfm = DefaultMefCfm.builder().addToMaintenanceDomain(yangMd).build();
+        MefCfm mefCfm = new DefaultMefCfm();
+        mefCfm.addToMaintenanceDomain(yangMd);
       //FIXME implement this
 //        MseaCfmOpParam mseaCfmOpParam = (MseaCfmOpParam) MseaCfmOpParam.builder().mefCfm(mefCfm).build();
 //        mseaCfmService.setMseaCfm(mseaCfmOpParam, session, NcDsType.running);
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
new file mode 100644
index 0000000..acb6ae6
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
@@ -0,0 +1,148 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.MseaSaFilteringManager;
+import org.onosproject.netconf.DatastoreId;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.DefaultSourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.DefaultInterfaceEth0;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.InterfaceEth0;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.DefaultSourceAddressRange;
+import org.onosproject.yang.gen.v1.mseasafiltering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+
+public class MseaSaFilteringManagerTest {
+
+    MseaSaFilteringManager mseaSaSvc;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            mseaSaSvc = new MockMseaSaFilteringManager();
+            mseaSaSvc.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetMseaSaFilteringMseaSaFilteringOpParamNetconfSession() throws NetconfException {
+        SourceIpaddressFiltering sip = new DefaultSourceIpaddressFiltering();
+
+        MseaSaFilteringOpParam op = new MseaSaFilteringOpParam();
+        op.sourceIpaddressFiltering(sip);
+
+        MseaSaFiltering result = mseaSaSvc.getMseaSaFiltering(op, session);
+
+        //Results come from MockNetconfSession SAMPLE_MSEASAFILTERING_REPLY_INIT
+        assertNotNull(result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange());
+        List<SourceAddressRange> ranges = result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
+        assertEquals(2, ranges.size());
+
+        for (SourceAddressRange sa:ranges) {
+            if (sa.rangeId() == 1) {
+                assertEquals("10.10.10.10/16", sa.ipv4AddressPrefix());
+
+            } else if (sa.rangeId() == 2) {
+                assertEquals("20.30.40.50/18", sa.ipv4AddressPrefix());
+            }
+        }
+    }
+
+    @Test
+    public void testSetMseaSaFilteringMseaSaFilteringOpParamNetconfSessionNcDsType() {
+
+        MseaSaFilteringOpParam mseaSaFilteringConfig =
+                createConfigForEdit("192.168.60.10/27", (short) 3, "Filter3");
+
+        //Calling on the edit-config just makes the change and hopefully does not throw a Netconf Exception
+        try {
+            mseaSaSvc.setMseaSaFiltering(mseaSaFilteringConfig, session, DatastoreId.RUNNING);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF Exception: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testDeleteMseaSaFilteringMseaSaFilteringOpParamNetconfSessionNcDsType() {
+
+        MseaSaFilteringOpParam mseaSaFilteringConfig =
+                createConfigForEdit("192.168.60.10/27", (short) 3, "Filter3");
+
+        SourceAddressRange sar2 = new DefaultSourceAddressRange();
+        sar2.ipv4AddressPrefix("10.205.86.10/27");
+        sar2.rangeId((short) 4);
+        sar2.name("Filter4");
+
+        mseaSaFilteringConfig.sourceIpaddressFiltering().interfaceEth0()
+                .addToSourceAddressRange(sar2);
+
+        //Calling on the edit-config just makes the change and hopefully does not throw a Netconf Exception
+        try {
+            mseaSaSvc.deleteMseaSaFilteringRange(mseaSaFilteringConfig, session, DatastoreId.RUNNING);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF Exception: " + e.getMessage());
+        }
+    }
+
+    /**
+     * This is also called from the test case EA1000FlowRuleProgrammableTest().
+     * In the ea1000driver project
+     * @return
+     */
+    public static MseaSaFilteringOpParam createConfigForEdit(String ipAddrPrefix, short rangeId, String rangeName) {
+        SourceAddressRange sar = new DefaultSourceAddressRange();
+        sar.ipv4AddressPrefix(ipAddrPrefix);
+        sar.rangeId(rangeId);
+        sar.name(rangeName);
+
+        InterfaceEth0 eth0 = new DefaultInterfaceEth0();
+        eth0.addToSourceAddressRange(sar);
+
+        SourceIpaddressFiltering sip = new DefaultSourceIpaddressFiltering();
+        sip.interfaceEth0(eth0);
+
+        MseaSaFilteringOpParam op = new MseaSaFilteringOpParam();
+        op.sourceIpaddressFiltering(sip);
+
+        return op;
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
new file mode 100644
index 0000000..8d8b2bd
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
@@ -0,0 +1,496 @@
+/*
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+import org.onosproject.netconf.DatastoreId;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.VlanIdType;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.EvcPerUniServiceTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPush;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.tagpush.tagpush.PushTagTypeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPush;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.Profiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.DefaultUni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.Uni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.Cos;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.DefaultCos;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.Bwp;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.DefaultBwp;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.bwp.ColorModeEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.DefaultEvc;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.Evc;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.DefaultEvcPerUni;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.EvcPerUni;
+import org.onosproject.drivers.microsemi.yang.custom.CustomEvcPerUnic;
+import org.onosproject.drivers.microsemi.yang.custom.CustomEvcPerUnin;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
+
+public class MseaUniEvcServiceManagerTest {
+
+    MseaUniEvcServiceManager mseaUniEvcServiceSvc;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            mseaUniEvcServiceSvc = new MockMseaUniEvcServiceManager();
+            mseaUniEvcServiceSvc.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetMseaUniEvcServiceMseaUniEvcServiceOpParamNetconfSession() {
+        MefServices mefServices = new DefaultMefServices();
+        mefServices.uni(new DefaultUni());
+
+        MseaUniEvcServiceOpParam evcUni = new MseaUniEvcServiceOpParam();
+        evcUni.mefServices(mefServices);
+
+        MseaUniEvcService result = null;
+        try {
+            result =
+                    mseaUniEvcServiceSvc.getConfigMseaUniEvcService(
+                            evcUni, session, DatastoreId.RUNNING);
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+
+        assertNotNull(result);
+    }
+
+    @Test
+    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamEvcs() {
+      TagPush tp1 = new DefaultTagPush();
+      org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317.mseaunievcservice
+              .evcperuniextensionattributes.tagmanipulation
+          .tagpush.TagPush tpInner1 =
+              new org.onosproject.yang.gen.v1.mseaunievcservice.rev20160317
+                      .mseaunievcservice.evcperuniextensionattributes
+                  .tagmanipulation.tagpush.DefaultTagPush();
+      tpInner1.outerTagVlan(new VlanIdType(3));
+      tpInner1.pushTagType(PushTagTypeEnum.PUSHSTAG);
+      tp1.tagPush(tpInner1);
+
+      EvcPerUnin epun1 = new CustomEvcPerUnin();
+      epun1.evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL);
+      epun1.ceVlanMap(ServiceListType.fromString("10"));
+      epun1.ingressBwpGroupIndex("0");
+      epun1.tagManipulation(tp1);
+
+      EvcPerUnic epuc1 = new CustomEvcPerUnic();
+      epuc1.ceVlanMap(new ServiceListType("11"));
+      epuc1.ingressBwpGroupIndex("0");
+
+      EvcPerUni epu1 = new DefaultEvcPerUni();
+      epu1.evcPerUnic(epuc1);
+      epu1.evcPerUnin(epun1);
+
+      List<Evc> evcList = new ArrayList<Evc>();
+      Evc evc1 = new DefaultEvc();
+      evc1.evcIndex(1);
+      evc1.name(new Identifier45("evc-1"));
+      evc1.evcPerUni(epu1);
+
+      evcList.add(evc1);
+
+
+      EvcPerUnin epun2 = new CustomEvcPerUnin();
+      epun2.ceVlanMap(ServiceListType.fromString("13"));
+      epun2.ingressBwpGroupIndex("0");
+
+      EvcPerUnic epuc2 = new CustomEvcPerUnic();
+      epuc2.ceVlanMap(new ServiceListType("12"));
+      epuc2.ingressBwpGroupIndex("0");
+
+      EvcPerUni epu2 = new DefaultEvcPerUni();
+      epu2.evcPerUnic(epuc2);
+      epu2.evcPerUnin(epun2);
+
+      Evc evc2 = new DefaultEvc();
+      evc2.evcIndex(2);
+      evc2.name(new Identifier45("evc-2"));
+      evc2.evcPerUni(epu2);
+
+      evcList.add(evc2);
+
+      Uni uni = new DefaultUni();
+      uni.name(new Identifier45("testUni"));
+      uni.evc(evcList);
+
+      MefServices mefServices = new DefaultMefServices();
+      mefServices.uni(uni);
+
+      MseaUniEvcServiceOpParam evcUni = new MseaUniEvcServiceOpParam();
+      evcUni.mefServices(mefServices);
+      try {
+          mseaUniEvcServiceSvc.setMseaUniEvcService(evcUni, session, DatastoreId.RUNNING);
+      } catch (NetconfException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+          fail("Error: " + e.getMessage());
+      }
+    }
+
+    @Test
+    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamProfiles() {
+      List<Cos> cosList = new ArrayList<Cos>();
+      Cos cos0 = new DefaultCos();
+      cos0.cosIndex(0);
+      cos0.name("cos0");
+      cosList.add(cos0);
+
+      Cos cos1 = new DefaultCos();
+      cos1.cosIndex(1);
+      cos1.name("cos1");
+      cosList.add(cos1);
+
+      List<BwpGroup> bwpGroupList = new ArrayList<BwpGroup>();
+      BwpGroup bwpGrp = new DefaultBwpGroup();
+      bwpGrp.groupIndex((short) 0);
+      bwpGroupList.add(bwpGrp);
+
+      List<Bwp> bwpList = new ArrayList<Bwp>();
+      Bwp bwp1 = new DefaultBwp();
+      bwp1.cosIndex(0);
+      bwp1.colorMode(ColorModeEnum.COLORAWARE);
+      bwpList.add(bwp1);
+
+      Bwp bwp2 = new DefaultBwp();
+      bwp2.cosIndex(1);
+      bwp2.colorMode(ColorModeEnum.COLORBLIND);
+      bwpList.add(bwp2);
+
+      BwpGroup bwpGrp1 = new DefaultBwpGroup();
+      bwpGrp1.groupIndex((short) 1);
+      bwpGrp1.bwp(bwpList);
+      bwpGroupList.add(bwpGrp1);
+
+      Profiles profiles = new DefaultProfiles();
+      profiles.bwpGroup(bwpGroupList);
+
+      MefServices mefServices = new DefaultMefServices();
+      mefServices.profiles(profiles);
+
+      MseaUniEvcServiceOpParam evcUni = new MseaUniEvcServiceOpParam();
+      evcUni.mefServices(mefServices);
+      try {
+          mseaUniEvcServiceSvc.setMseaUniEvcService(evcUni, session, DatastoreId.RUNNING);
+      } catch (NetconfException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+          fail("Error: " + e.getMessage());
+      }
+    }
+
+    @Test
+    public void testDeleteMseaUniEvcServiceMseaUniEvcServiceOpParamProfiles() {
+        List<Cos> cosList = new ArrayList<Cos>();
+        Cos cos0 = new DefaultCos();
+        cos0.cosIndex(0);
+        cos0.name("cos0");
+        cosList.add(cos0);
+
+        Cos cos1 = new DefaultCos();
+        cos1.cosIndex(1);
+        cos1.name("cos1");
+        cosList.add(cos1);
+
+        List<BwpGroup> bwpGroupList = new ArrayList<BwpGroup>();
+        BwpGroup bwpGrp = new DefaultBwpGroup();
+        bwpGrp.groupIndex((short) 0);
+        bwpGroupList.add(bwpGrp);
+
+        List<Bwp> bwpList = new ArrayList<Bwp>();
+        Bwp bwp1 = new DefaultBwp();
+        bwp1.cosIndex(0);
+        bwp1.colorMode(ColorModeEnum.COLORAWARE);
+        bwpList.add(bwp1);
+
+        Bwp bwp2 = new DefaultBwp();
+        bwp2.cosIndex(1);
+        bwp2.colorMode(ColorModeEnum.COLORBLIND);
+        bwpList.add(bwp2);
+
+        BwpGroup bwpGrp1 = new DefaultBwpGroup();
+        bwpGrp1.groupIndex((short) 1);
+        bwpGrp1.bwp(bwpList);
+        bwpGroupList.add(bwpGrp1);
+
+        Profiles profiles = new DefaultProfiles();
+        profiles.bwpGroup(bwpGroupList);
+
+        MefServices mefServices = new DefaultMefServices();
+        mefServices.profiles(profiles);
+
+        MseaUniEvcServiceOpParam evcUni = new MseaUniEvcServiceOpParam();
+        evcUni.mefServices(mefServices);
+        try {
+            mseaUniEvcServiceSvc.deleteMseaUniEvcService(evcUni, session, DatastoreId.RUNNING);
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testGetMseaUniEvcCeVlanMaps() {
+
+        try {
+            MseaUniEvcService ceVlanMapsResult7 =
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, DatastoreId.RUNNING);
+
+            assertNotNull(ceVlanMapsResult7.mefServices().uni().evc());
+
+            List<Evc> evcList = ceVlanMapsResult7.mefServices().uni().evc();
+            assertEquals(3, evcList.size());
+            for (Evc evc : evcList) {
+               assertNotNull(evc.evcPerUni().evcPerUnic().ceVlanMap());
+               assertNotNull(evc.evcPerUni().evcPerUnin().ceVlanMap());
+
+               if (evc.evcIndex() == 7) {
+                   assertEquals("700,710,720", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+                   assertEquals("701:703", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+               }
+            }
+
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testChangeEvcCeVlanMap() {
+        EvcPerUnin epun1 = new CustomEvcPerUnin();
+        epun1.evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL);
+        epun1.ceVlanMap(ServiceListType.fromString("10"));
+        epun1.ingressBwpGroupIndex("0");
+
+        EvcPerUnic epuc1 = new CustomEvcPerUnic();
+        epuc1.ceVlanMap(new ServiceListType("11"));
+        epuc1.ingressBwpGroupIndex("0");
+
+        EvcPerUni epu = new DefaultEvcPerUni();
+        epu.evcPerUnic(epuc1);
+        epu.evcPerUnin(epun1);
+
+        Evc evc = new DefaultEvc();
+        evc.evcPerUni(epu);
+
+        assertEquals("10", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+
+        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+    }
+
+    @Test
+    public void testChangeEvcCeVlanMapNoValues() {
+        EvcPerUnin epun1 = new CustomEvcPerUnin();
+        epun1.evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL);
+        epun1.ingressBwpGroupIndex("0");
+
+        EvcPerUnic epuc1 = new CustomEvcPerUnic();
+        epuc1.ingressBwpGroupIndex("0");
+
+        EvcPerUni epu = new DefaultEvcPerUni();
+        epu.evcPerUnic(epuc1);
+        epu.evcPerUnin(epun1);
+
+        Evc evc = new DefaultEvc();
+        evc.evcIndex(1);
+        evc.evcPerUni(epu);
+
+        assertEquals("0", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+        assertEquals("0", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+    }
+
+    @Test
+    public void testRemoveEvcUniFlowEntries() {
+
+        Map<Integer, String> ceVlanUpdates = new TreeMap<>();
+        ceVlanUpdates.put((1 << 2), "");
+        ceVlanUpdates.put((1 << 2) + 1, "");
+        ceVlanUpdates.put((2 << 2), "");
+        ceVlanUpdates.put((2 << 2) + 1, "");
+
+        ceVlanUpdates.put((7 << 2), "700,710,720");
+        ceVlanUpdates.put((7 << 2) + 1, "701:703");
+        ceVlanUpdates.put((8 << 2), "800,810,820");
+        ceVlanUpdates.put((8 << 2) + 1, "801,802,803");
+
+        Map<Integer, List<Short>> flowVlanIdMap = new HashMap<>();
+        //These should get ignored because whole EVC is being deleted
+        flowVlanIdMap.put(1 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(1 << 2).add((short) 11);
+
+        flowVlanIdMap.put((1 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((1 << 2) + 1).add((short) 12L);
+
+        //These are the EVCs being removed
+        flowVlanIdMap.put(7 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(7 << 2).add((short) 730L);
+        flowVlanIdMap.get(7 << 2).add((short) 740L);
+
+        flowVlanIdMap.put((7 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((7 << 2) + 1).add((short) 705L);
+        flowVlanIdMap.get((7 << 2) + 1).add((short) 706L);
+
+        flowVlanIdMap.put(8 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(8 << 2).add((short) 830L);
+        flowVlanIdMap.get(8 << 2).add((short) 840L);
+
+        flowVlanIdMap.put((8 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((8 << 2) + 1).add((short) 805L);
+        flowVlanIdMap.get((8 << 2) + 1).add((short) 806L);
+
+        try {
+            mseaUniEvcServiceSvc.removeEvcUniFlowEntries(
+                    ceVlanUpdates, flowVlanIdMap, session, DatastoreId.RUNNING,
+                    UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS);
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testGetVlanSet1() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10");
+        assertEquals(1, vlanIds.length);
+    }
+
+    @Test
+    public void testGetVlanSet2() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20");
+        assertEquals(11, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(20, vlanIds[10].shortValue());
+    }
+
+    @Test
+    public void testGetVlanSet3() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20,30:40");
+        assertEquals(22, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(40, vlanIds[21].shortValue());
+    }
+
+    @Test
+    public void testGetVlanSet4() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10,20,30");
+        assertEquals(3, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(30, vlanIds[2].shortValue());
+    }
+
+    @Test
+    public void testVlanListAsString() {
+        assertEquals("20:22", CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22}));
+
+        assertEquals("20:22,24:25",
+                CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22, 24, 25}));
+
+        assertEquals("30,33,36:40",
+                CeVlanMapUtils.vlanListAsString(new Short[]{30, 33, 36, 37, 38, 39, 40}));
+
+        assertEquals("20", CeVlanMapUtils.vlanListAsString(new Short[]{20}));
+
+        assertEquals("20,22,24,26,28",
+                CeVlanMapUtils.vlanListAsString(new Short[]{20, 22, 24, 26, 28}));
+    }
+
+    @Test
+    public void testAddtoCeVlanMap() {
+        assertEquals("20,22:24,26,28",
+                CeVlanMapUtils.addtoCeVlanMap("20,22,24,26,28", (short) 23));
+
+        assertEquals("20:26,28",
+                CeVlanMapUtils.addtoCeVlanMap("20,21,22,24,25,26,28", (short) 23));
+
+        assertEquals("20,23",
+                CeVlanMapUtils.addtoCeVlanMap("20", (short) 23));
+
+        assertEquals("20,22:23",
+                CeVlanMapUtils.addtoCeVlanMap("20,22", (short) 23));
+    }
+
+    @Test
+    public void testCombineVlanSets() {
+        assertEquals("10:11,13:14", CeVlanMapUtils.combineVlanSets("10:11", "13:14"));
+
+        assertEquals("10:14", CeVlanMapUtils.combineVlanSets("10:11", "12:14"));
+
+        assertEquals("10:11,14", CeVlanMapUtils.combineVlanSets("10:11", "14"));
+
+        assertEquals("10:12", CeVlanMapUtils.combineVlanSets("10:11", "11:12"));
+    }
+
+    @Test
+    public void testRemoveZeroIfPossible() {
+        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible(""));
+
+        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible("0"));
+
+        assertEquals("1,3", CeVlanMapUtils.removeZeroIfPossible("0:1,3"));
+
+        assertEquals("1:2", CeVlanMapUtils.removeZeroIfPossible("0:2"));
+
+        assertEquals("10:12", CeVlanMapUtils.removeZeroIfPossible("0,10:12"));
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java
similarity index 100%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
similarity index 94%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
rename to drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
index 4e62beb..da0954f 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
@@ -26,7 +26,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DateAndTime;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.DateAndTime;
 
 public class IetfYangTypesUtilsTest {
 
diff --git a/drivers/microsemi/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java b/drivers/microsemi/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
new file mode 100644
index 0000000..e2f4389
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
@@ -0,0 +1,152 @@
+/*
+ * 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;
+
+import org.apache.felix.scr.annotations.Activate;
+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.netconf.MockCoreService;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaContextProvider;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.runtime.CompositeData;
+import org.onosproject.yang.runtime.CompositeStream;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+import org.onosproject.yang.runtime.RuntimeContext;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.onosproject.yang.runtime.YangRuntimeService;
+import org.onosproject.yang.runtime.YangSerializer;
+import org.onosproject.yang.runtime.YangSerializerRegistry;
+import org.onosproject.yang.runtime.impl.DefaultModelConverter;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+import org.onosproject.yang.runtime.impl.DefaultYangRuntimeHandler;
+import org.onosproject.yang.runtime.impl.DefaultYangSerializerRegistry;
+import org.onosproject.yang.serializers.json.JsonSerializer;
+import org.onosproject.yang.serializers.xml.XmlSerializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public class MockYangRuntimeManager implements YangModelRegistry,
+            YangSerializerRegistry, YangRuntimeService, ModelConverter,
+            SchemaContextProvider {
+
+        private static final String APP_ID = "org.onosproject.yang";
+        private final Logger log = LoggerFactory.getLogger(getClass());
+
+        @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+        protected CoreService coreService;
+
+        private DefaultYangModelRegistry modelRegistry;
+        private DefaultYangSerializerRegistry serializerRegistry;
+        private DefaultYangRuntimeHandler runtimeService;
+        private DefaultModelConverter modelConverter;
+
+        public void setModelRegistry(DefaultYangModelRegistry yReg) {
+            this.modelRegistry = yReg;
+        }
+
+        @Activate
+        public void activate() {
+            coreService = new MockCoreService();
+            coreService.registerApplication(APP_ID);
+            serializerRegistry = new DefaultYangSerializerRegistry();
+            runtimeService =
+                    new DefaultYangRuntimeHandler(serializerRegistry, modelRegistry);
+            serializerRegistry.registerSerializer(new JsonSerializer());
+            serializerRegistry.registerSerializer(new XmlSerializer());
+            modelConverter = new DefaultModelConverter(modelRegistry);
+            log.info("Started");
+        }
+
+        @Deactivate
+        public void deactivate() {
+            log.info("Stopped");
+        }
+
+
+        @Override
+        public void registerModel(ModelRegistrationParam p) {
+            modelRegistry.registerModel(p);
+        }
+
+        @Override
+        public void unregisterModel(ModelRegistrationParam p) {
+            modelRegistry.unregisterModel(p);
+        }
+
+        @Override
+        public Set<YangModel> getModels() {
+            return modelRegistry.getModels();
+        }
+
+        @Override
+        public void registerSerializer(YangSerializer ys) {
+            serializerRegistry.registerSerializer(ys);
+        }
+
+        @Override
+        public void unregisterSerializer(YangSerializer ys) {
+            serializerRegistry.unregisterSerializer(ys);
+        }
+
+        @Override
+        public Set<YangSerializer> getSerializers() {
+            return serializerRegistry.getSerializers();
+        }
+
+        @Override
+        public CompositeData decode(CompositeStream cs, RuntimeContext rc) {
+            return runtimeService.decode(cs, rc);
+        }
+
+        @Override
+        public CompositeStream encode(CompositeData cd, RuntimeContext rc) {
+            return runtimeService.encode(cd, rc);
+        }
+
+        @Override
+        public ModelObjectData createModel(ResourceData resourceData) {
+            return modelConverter.createModel(resourceData);
+        }
+
+        @Override
+        public ResourceData createDataNode(ModelObjectData modelObjectData) {
+            return modelConverter.createDataNode(modelObjectData);
+        }
+
+        @Override
+        public SchemaContext getSchemaContext(ResourceId resourceId) {
+            checkNotNull(resourceId, " resource id can't be null.");
+            NodeKey key = resourceId.nodeKeys().get(0);
+            if (resourceId.nodeKeys().size() == 1 &&
+                    "/".equals(key.schemaId().name())) {
+                return modelRegistry;
+            }
+            log.info("To be implemented.");
+            return null;
+        }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java b/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
new file mode 100644
index 0000000..dab269d
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
@@ -0,0 +1,138 @@
+/*
+ * 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.serializers.xml;
+
+
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.runtime.AppModuleInfo;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.onosproject.yang.compiler.datamodel.utils.DataModelUtils;
+import org.onosproject.yang.compiler.utils.UtilConstants;
+import org.onosproject.yang.compiler.utils.io.impl.YangIoUtils;
+import org.onosproject.yang.runtime.helperutils.YangApacheUtils;
+import org.onosproject.yang.runtime.RuntimeHelper;
+
+public class MockYangSchemaNodeProvider {
+
+    private static final String FS = File.separator;
+    private static final String PATH = System.getProperty("user.dir") +
+            FS + "buck-out" + FS + "gen" +
+            FS + "models" + FS + "microsemi" + FS + "onos-models-microsemi-schema" + FS;
+    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
+            FS + "YangMetaData.ser";
+    private static final String META_PATH =
+            PATH.replace("drivers/microsemi", "")
+            + SER_FILE_PATH;
+    private static final String TEMP_FOLDER_PATH = PATH + UtilConstants.TEMP;
+    private YangModelRegistry reg = new DefaultYangModelRegistry();
+    private List<YangNode> nodes = new ArrayList<>();
+
+    /**
+     * Creates an instance of mock bundle context.
+     */
+    public MockYangSchemaNodeProvider() {
+    }
+
+    /**
+     * Process YANG schema node for a application.
+     */
+    public void processSchemaRegistry() {
+        try {
+            //Need to deserialize generated meta data file for unit tests.
+            Set<YangNode> appNode = DataModelUtils.deSerializeDataModel(META_PATH);
+            RuntimeHelper.addLinkerAndJavaInfo(appNode);
+            nodes.addAll(appNode);
+            reg.registerModel(prepareParam(nodes));
+            YangIoUtils.deleteDirectory(TEMP_FOLDER_PATH);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("YangMetaData.ser could not " +
+                    "be loaded from " + META_PATH, e);
+        }
+    }
+
+    /**
+     * Unregister given nodes from runtime service.
+     *
+     * @param nodes list of nodes
+     */
+    public void unRegister(List<YangNode> nodes) {
+        reg.unregisterModel(prepareParam(nodes));
+    }
+
+    /**
+     * Prepares model registration parameter.
+     *
+     * @param nodes list of nodes
+     * @return model registration parameter
+     */
+    private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
+        //Process loading class file.
+        String appName;
+        ClassLoader classLoader = getClass().getClassLoader();
+
+        //Create model registration param.
+        ModelRegistrationParam.Builder b =
+                DefaultModelRegistrationParam.builder();
+
+        //create a new YANG model
+        YangModel model = YangApacheUtils.processYangModel(META_PATH, nodes);
+        //set YANG model
+        b.setYangModel(model);
+
+        Iterator<YangNode> it = nodes.iterator();
+        while (it.hasNext()) {
+            YangSchemaNode node = it.next();
+
+            //If service class is not generated then use
+            // interface file to load this class.
+            appName = RuntimeHelper.getInterfaceClassName(node);
+            Class<?> cls;
+            try {
+                cls = classLoader.loadClass(appName);
+            } catch (ClassNotFoundException e) {
+                continue;
+            }
+
+            //generate app info.
+            AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
+            b.addAppModuleInfo(YangApacheUtils.processModuleId((YangNode) node), info);
+        }
+        return b.build();
+    }
+
+    /**
+     * Returns schema registry.
+     *
+     * @return schema registry
+     */
+    public DefaultYangModelRegistry registry() {
+        return (DefaultYangModelRegistry) reg;
+    }
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java b/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
new file mode 100644
index 0000000..cfe7b9b
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
@@ -0,0 +1,50 @@
+/*
+ * 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.serializers.xml;
+
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.runtime.Annotation;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.onosproject.yang.runtime.YangSerializerContext;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class MockYangSerializerContext implements YangSerializerContext {
+
+    private static MockYangSchemaNodeProvider schemaProvider =
+            new MockYangSchemaNodeProvider();
+    private static final String NETCONF_NS =
+            "urn:ietf:params:xml:ns:netconf:base:1.0";
+    private static final String XMNLS_NC = "xmlns:xc";
+
+
+    @Override
+    public SchemaContext getContext() {
+        schemaProvider.processSchemaRegistry();
+        DefaultYangModelRegistry registry = schemaProvider.registry();
+        return registry;
+    }
+
+    @Override
+    public List<Annotation> getProtocolAnnotations() {
+        Annotation annotation = new DefaultAnnotation(XMNLS_NC, NETCONF_NS);
+        List<Annotation> protocolAnnotation = new LinkedList<>();
+        protocolAnnotation.add(annotation);
+        return protocolAnnotation;
+    }
+}
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt b/drivers/microsemi/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt
rename to drivers/microsemi/src/test/resources/CarrierEthernetFeature-sampleEvcConfig1.txt
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFiltering.xml b/drivers/microsemi/src/test/resources/getConfigSaFiltering.xml
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFiltering.xml
rename to drivers/microsemi/src/test/resources/getConfigSaFiltering.xml
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFilteringReply.xml b/drivers/microsemi/src/test/resources/getConfigSaFilteringReply.xml
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/resources/getConfigSaFilteringReply.xml
rename to drivers/microsemi/src/test/resources/getConfigSaFilteringReply.xml
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample1.xml b/drivers/microsemi/src/test/resources/systemReply-Sample1.xml
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample1.xml
rename to drivers/microsemi/src/test/resources/systemReply-Sample1.xml
diff --git a/drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample2.xml b/drivers/microsemi/src/test/resources/systemReply-Sample2.xml
similarity index 100%
rename from drivers/microsemi/ea1000driver/src/test/resources/systemReply-Sample2.xml
rename to drivers/microsemi/src/test/resources/systemReply-Sample2.xml
