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 cc9e9a3..0000000
--- a/drivers/microsemi/ea1000driver/pom.xml
+++ /dev/null
@@ -1,116 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-drivers-microsemi</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.10.5-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>
-                <configuration>
-                </configuration>
-            </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 b881f40..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 Foundation
- *
- * 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 87dcb52..0000000
--- a/drivers/microsemi/ea1000yang/pom.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-drivers-microsemi</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.10.5-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>
-    </properties>
-
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-netconf-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-yang-utils-generator</artifactId>
-            <version>1.11</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-yang-datamodel</artifactId>
-            <version>1.11</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-yms-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-yms</artifactId>
-            <version>${project.version}</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-drivers-netconf</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.onosproject</groupId>
-                <artifactId>onos-yang-maven-plugin</artifactId>
-                <version>1.11</version>
-                <executions>
-                    <execution>
-                        <configuration>
-                            <classFileDir>target/generated-sources</classFileDir>
-                        </configuration>
-                        <goals>
-                            <goal>yang2java</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Include-Resource>yang/resources/YangMetaData.ser=target/classes/yang/resources/YangMetaData.ser</Include-Resource>
-                    </instructions>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.jacoco</groupId>
-                <artifactId>jacoco-maven-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>**/delaymeasurement/*</exclude>
-                        <exclude>**/lossmeasurement/*</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java b/drivers/microsemi/ea1000yang/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
deleted file mode 100644
index a55daa8..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 Foundation
- *
- * 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 6276741..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 Foundation
- *
- * 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 732539a..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 Foundation
- *
- * 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 1fc08c4..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 Foundation
- *
- * 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 fd58ab6..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 Foundation
- *
- * 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 ea5c1712..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 Foundation
- *
- * 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 29d6091..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 Foundation
- *
- * 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 c5087b7..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 Foundation
- *
- * 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 fc87e98..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 Foundation
- *
- * 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 40f7d76..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 Foundation
- *
- * 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 c44f887..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 Foundation
- *
- * 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 a245d53..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 Foundation
- *
- * 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 f45f81f..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 Foundation
- *
- * 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 924ac14..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 Foundation
- *
- * 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 be1fd9c..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 Foundation
- *
- * 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 3d2431b..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 Foundation
- *
- * 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 f986ab7..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 Foundation
- *
- * 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/ysr/MockYangSchemaRegistry.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java
deleted file mode 100644
index d62afe1..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 Foundation
- *
- * 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/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
deleted file mode 100644
index 97013b5..0000000
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * 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.ysr;
\ No newline at end of file
diff --git a/drivers/microsemi/pom.xml b/drivers/microsemi/pom.xml
deleted file mode 100644
index aad3c1f..0000000
--- a/drivers/microsemi/pom.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Foundation
-  ~
-  ~ 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.10.5-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 0988170..d6dcc24 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..9b28d1d
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/EA1000MeterProvider.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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 524ca0d..43c76f1 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 d8f6ca8..32e77b1 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..a075d83
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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 54b62d4..d10b750 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..e845e59
--- /dev/null
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringNetconfService.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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 287cc8c..1501dfb 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..cb0e4bd
--- /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 Foundation
+ *
+ * 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..a2932d2
--- /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 Foundation
+ *
+ * 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/yab/package-info.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
similarity index 92%
rename from drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
rename to drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
index 05f8fcb..2f2a91c 100644
--- a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/custom/package-info.java
@@ -17,4 +17,4 @@
 /**
  * Package for Microsemi device drivers support for NETCONF for EA1000.
  */
-package org.onosproject.yms.app.yab;
\ No newline at end of file
+package org.onosproject.drivers.microsemi.yang.custom;
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..8339501
--- /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 Foundation
+ *
+ * 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 44533ac..0e8f4bd 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 23400ba..817c484 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..f9ed7a1
--- /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 Foundation
+ *
+ * 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 63%
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 c59d0f2..d63e26d 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,126 @@
 @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()) {
+
+            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, String.valueOf(bwpGrp.groupIndex()));
+
+            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 de2c181..ab51e75 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 601ba0b..22112b3 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..4cbb88a
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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..2576c78
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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..31fe61a
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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..3cf3a42
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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 6402032..dc9bbb7 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);
 
@@ -189,10 +194,8 @@
             Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
                     + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
                     + "(<mef-services).*(<profiles>).*"
-                    + "(<bwp-group>).*(<group-index>).*(</group-index>).*(</bwp-group>).*"
                     + "(<bwp-group>).*(<group-index>).*(</group-index>).*"
                     + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
-                    + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
                     + "(</bwp-group>).*"
                     + "(</profiles>).*(</mef-services>).*"
                     + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
@@ -300,9 +303,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 +332,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 +345,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 +820,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 +849,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 +890,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 +908,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 b1c6fba..2908d53 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..1a3e779
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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..2865b5b
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
@@ -0,0 +1,496 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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 2e1cec3..7508511 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..45dd5c1
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/MockYangRuntimeManager.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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..e9106a8
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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
diff --git a/drivers/pom.xml b/drivers/pom.xml
index 86716eb..6e954c9 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -48,7 +48,6 @@
         <module>juniper</module>
         <module>lisp</module>
         <module>flowspec</module>
-        <module>microsemi</module>
         <module>oplink</module>
         <module>huawei</module>
         <module>hp</module>
