Cleaning up unused code in Microsemi driver

Change-Id: If7e9790d9141324dff084e41d040ba0132141de8
diff --git a/drivers/microsemi/BUCK b/drivers/microsemi/BUCK
index 398fff7..80ef2c8 100644
--- a/drivers/microsemi/BUCK
+++ b/drivers/microsemi/BUCK
@@ -4,6 +4,7 @@
     '//drivers/utilities:onos-drivers-utilities',
     '//protocols/netconf/api:onos-protocols-netconf-api',
     '//protocols/netconf/ctl:onos-protocols-netconf-ctl',
+    '//models/common:onos-models-common',
     '//models/microsemi:onos-models-microsemi',
     '//lib:org.apache.karaf.shell.console',
     '//incubator/api:onos-incubator-api',
@@ -24,6 +25,7 @@
     'org.onosproject.netconf',
     'org.onosproject.netconfsb',
     'org.onosproject.drivers.netconf',
+    'org.onosproject.models.common',
     'org.onosproject.models.microsemi'
 ]
 
diff --git a/drivers/microsemi/README.md b/drivers/microsemi/README.md
index 36f5416..e821fcd 100644
--- a/drivers/microsemi/README.md
+++ b/drivers/microsemi/README.md
@@ -28,7 +28,7 @@
 * The name must follow the format **netconf:ipaddr:port**
 * The **ip** and **port** must correspond to the ip and port in the name (above).
 
-```json
+```js
 {
   "devices": {
     "netconf:192.168.56.10:830": {
@@ -36,7 +36,10 @@
         "username": "admin",
         "password": "admin",
         "ip": "192.168.56.10",
-        "port": "830"
+        "port": 830,
+        "connect-timeout": 50,
+        "reply-timeout": 50,
+        "idle-timeout": 40 
       },
       "basic": {
         "driver": "microsemi-netconf",
@@ -85,7 +88,7 @@
 A feature of the EA1000 that may be configured through Flow Rules is IP Source Address Filtering. This can only be activated on Port 0 (the optics Port). An example of this kind of flow is
 
 `POST /onos/v1/flows/ HTTP/1.1`<br/>
-```json
+```js
 {
   "flows": [
     {
@@ -96,8 +99,8 @@
       "tableId": 8,
       "treatment": {
         "instructions": [ {"type": "NOACTION"} ],
-        "deferred": []
-       },
+        "deferred": []
+      },
       "selector": {
         "criteria": [
           {"type": "IPV4_SRC", "ip": "192.168.8.0/24"},
@@ -115,7 +118,7 @@
 Flows that Push, Pop or Overwrite VLAN tags are implemented in EA1000 and are treated as MEF Carrier Ethernet EVCs. Both CTags and STags can be pushed on to matching Ethernet packets at network Layer 2.
 
 `POST /onos/v1/flows/ HTTP/1.1`<br/>
-```json
+```js
 {
   "flows": [
     {
@@ -268,7 +271,7 @@
 This will not exist by default since Link Discovery is not yet a feature of the EA1000 driver. These have to be created manually - through the network/configuration REST API.
 
 `POST /onos/v1/network/configuration/ HTTP/1.1`<br/>
-```json
+```js
 {
   "links": {
     "netconf:192.168.56.10:830/0-netconf:192.168.56.20:830/0": { // 10 to 20
@@ -388,4 +391,105 @@
 ```
 
 ## EVC Deletion
-EVCs can be deleted individually with **ce-evc-remove <evc-id>** or all together with **ce-evc-remove-all**.
\ No newline at end of file
+EVCs can be deleted individually with **ce-evc-remove <evc-id>** or all together with **ce-evc-remove-all**.
+
+# Support for Layer 2 Monitoring
+EA1000 supports both Connectivity Fault Management (CFM) and MEF Services OAM. This is achieved through the EA1000 driver supporting the ONOS behaviors CfmMepProgrammable and SoamDmProgrammable described in [Layer 2 Monitoring with CFM and Services OAM](https://wiki.onosproject.org/display/ONOS/Layer+2+Monitoring+with+CFM+and+Services+OAM).
+
+With EA1000 the CFM entities (Maintenance Association Endpoints or MEPs) are created in parallel with the EVC services that they are designed to test, and related loosely to each other only through VLAN ID.
+For instance an EVC might be created with a VLAN of 101, and separately a Maintenance Association would be created with the same VLAN ID, and MEPs created under this for monitoring that VLAN (and by inference that EVC).
+
+The CFM interface to ONOS is exposed through a REST API at /onos/cfm
+In ONOS Maintenance Domains and Maintenance Associations beneath them are created and persisted in a distributed datastore. These are logical entities that can span across an ONOS cluster and are not directly related to devices.
+
+The Maintenance Association Endpoint - MEP (the child of the Maintenance Association, and grandchild of the Maintenance Domain) is also a logical entity but has a hard many:1 association to a device that supports the CfmMepProgrammable behaviour. EA1000 is one such device, and so one to many MEPs can be associated with an EA1000 device.
+
+For example to create an Maintenance Domain in ONOS the following might be POSTed to 
+`POST http://localhost:8181/onos/cfm/md HTTP/1.1`</br>
+```js
+{"md": {
+    "mdName": "Microsemi",
+    "mdNameType": "CHARACTERSTRING",
+    "mdLevel": "LEVEL3",
+    "mdNumericId": 1
+   }
+}
+```
+
+To create a Maintenance Association under this
+`POST http://localhost:8181/onos/cfm/md/Microsemi/ma HTTP/1.1`</br>
+```js
+{
+  "ma": {
+    "maName": "ma-vlan-1",
+    "maNameType": "CHARACTERSTRING",
+    "maNumericId": 1,
+    "ccm-interval": "INTERVAL_1S",
+    "component-list": [
+      { "component": {
+        "component-id":"1",
+        "tag-type": "VLAN_STAG",
+        "vid-list": [
+          {"vid":1}
+        ]
+        }
+      }
+    ],
+    "rmep-list": [
+      { "rmep":10 },
+      { "rmep":20 },
+      { "rmep":30 }
+    ]
+  }
+}
+```
+
+To create a MEP under this:
+`POST http://localhost:8181/onos/cfm/md/Microsemi/ma/ma-vlan-1/mep HTTP/1.1`</br>
+```js
+{
+  "mep": {
+    "mepId": 10,
+    "deviceId": "netconf:10.205.86.26:830",
+    "port": 0,
+    "direction": "DOWN_MEP",
+    "primary-vid": 1,
+    "administrative-state": true,
+    "ccm-ltm-priority": 4,
+    "cci-enabled" :true
+  }
+}
+```
+
+When the MEP is created a configuration is written down to the EA1000 device at 10.205.86.26 through NETCONF roughly in the format:
+```xml
+<maintenance-domain>
+ <id>1</id>
+ <name>Microsemi</name>
+ <name-type>CHARACTER_STRING</name-type>
+ <md-level>3</md-level>
+ <maintenance-association>
+   <id>1</id>
+   <name>ma-vlan-1</name>
+   <name-type>CHARACTER_STRING</name-type>
+   <component-list>
+     <tag-type>vlan-stag</tag-type>
+     <vid>1</vid> 
+   </component-list>
+   <remote-mep>10</remote-mep>
+   <remote-mep>20</remote-mep>
+   <remote-mep>30</remote-mep>
+   <maintenance-association-endpoint>
+     <mep-identifier>10</mep-identifier>
+     ...
+   </maintenance-association-endpoint>
+ </maintenance-association>
+</maintenance-domain>
+```
+
+There are a few things to note here:
+* On EA1000 the MD and MA are indexed by their _id_ and not by name. This means that it is essential when working with EA1000 that all MD's and MA's have a numeric ID specified, and that the numeric IDs of Maintenance Domains should be unique. The numeric IDs of Maintenance Associations should be unique _within_ Maintenance Domains.
+* The component list is flattened down to a singleton object. While in the CFM model many Components are possible, EA1000 supports only 1
+* With Remote Meps - the local and all remote meps must be specified by their ID. In this instance 10 is the local on device 10.205.86.26 and 20 and 30 are remote meps that we expect will be local to some other devices
+* Even though the write to the EA1000 only happens when the MEP is created it brings down the MD and MA to the device with it.
+* When the MEP is deleted the MD and MA are left behind on the device. If the MD and MA were then to be changed in ONOS and a new MEP pushed down to the device, there would be an error, as the MD and MA would remain on the device since the earlier time. To remedy this, the MD and MA would need to be deleted manually through yangcli-pro.
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
index 43c76f1..34274e2 100644
--- a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/Ea1000DeviceDescription.java
@@ -83,16 +83,21 @@
             IetfSystem system = ietfSystemService.getIetfSystemInit(session);
             if (system != null && system.systemState() != null) {
                 swVersion = system.systemState().platform().osRelease();
-                AugmentedSysPlatform augmentedSysPlatform =
+                AugmentedSysPlatform augmentedSysStatePlatform =
                         (AugmentedSysPlatform) system.systemState()
                         .platform().augmentation(DefaultAugmentedSysPlatform.class);
-                serialNumber = augmentedSysPlatform.deviceIdentification().serialNumber();
+                if (augmentedSysStatePlatform != null && augmentedSysStatePlatform.deviceIdentification() != null) {
+                    serialNumber = augmentedSysStatePlatform.deviceIdentification().serialNumber();
+                } else {
+                    log.warn("Serial Number of device not available: {}", handler().data().deviceId());
+                }
                 DateAndTime deviceDateAndTime = system.systemState().clock().currentDatetime();
                 OffsetDateTime odt =
                         OffsetDateTime.parse(deviceDateAndTime.string(), DateTimeFormatter.ISO_OFFSET_DATE_TIME);
                 if (odt.getYear() < OffsetDateTime.now(ZoneId.of("UTC")).getYear()) {
                     OffsetDateTime nowUtc = OffsetDateTime.now(ZoneId.of("UTC"));
-                    log.warn("Date on device is in the past: {}. Setting it to {}", odt.toString(), nowUtc);
+                    log.warn("Date on device {} is in the past: {}. Setting it to {}",
+                            handler().data().deviceId(), odt.toString(), nowUtc);
                     ietfSystemService.setCurrentDatetime(nowUtc, session);
                 }
             }
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
index 32e77b1..d72050e 100644
--- a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
+++ b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/IetfSystemNetconfService.java
@@ -20,14 +20,8 @@
 import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
-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.
@@ -76,15 +70,6 @@
     void setCurrentDatetime(OffsetDateTime date, NetconfSession session) throws NetconfException;
 
     /**
-     * Service interface of systemRestart.
-     *
-     * @param inputVar input of service interface systemRestart
-     * @param session An active NETCONF session
-     * @throws NetconfException if the session has any error
-     */
-    void systemRestart(SystemRestartInput inputVar, NetconfSession session) throws NetconfException;
-
-    /**
      * Service interface of systemShutdown.
      *
      * @param session An active NETCONF session
@@ -92,36 +77,4 @@
      */
     void systemShutdown(NetconfSession session) throws NetconfException;
 
-    /**
-     * Service interface of doUpgradeAndReboot.
-     *
-     * @param inputVar input of service interface doUpgradeAndReboot
-     * @param session An active NETCONF session
-     * @return doUpgradeAndRebootOutput output of service interface doUpgradeAndReboot
-     * @throws NetconfException if the session has any error
-     */
-    DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
-            throws NetconfException;
-
-    /**
-     * Service interface of pullUpdateTarFromTftp.
-     *
-     * @param inputVar input of service interface pullUpdateTarFromTftp
-     * @param session An active NETCONF session
-     * @throws NetconfException if the session has any error
-     */
-    void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
-            throws NetconfException;
-
-    /**
-     * Service interface of readFromSyslog.
-     *
-     * @param inputVar input of service interface readFromSyslog
-     * @param session An active NETCONF session
-     * @return readFromSyslogOutput output of service interface readFromSyslog
-     * @throws NetconfException if the session has any error
-     */
-    ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
-            throws NetconfException;
-
 }
diff --git a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java b/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java
deleted file mode 100644
index a075d83..0000000
--- a/drivers/microsemi/src/main/java/org/onosproject/drivers/microsemi/yang/MicrosemiModelRegistrator.java
+++ /dev/null
@@ -1,135 +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 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/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
index 27c1e86..074aad4 100644
--- 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
@@ -76,15 +76,12 @@
     @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 XmlSerializer xSer = null;
+    protected YangSerializerContext yCtx = null;
 
     protected static final Pattern REGEX_XML_HEADER =
             Pattern.compile("(<\\?xml).*(\\?>)", Pattern.DOTALL);
@@ -107,11 +104,8 @@
     @Activate
     public void activate() {
         Set<YangSerializer> yangSer = ((YangSerializerRegistry) yangModelRegistry).getSerializers();
-        yangSer.forEach(ser -> {
-            if (ser instanceof XmlSerializer) {
-                xSer = (XmlSerializer) ser;
-            }
-        });
+        xSer = (XmlSerializer) yangSer.stream()
+                .filter(ser -> (ser instanceof XmlSerializer)).findFirst().get();
         SchemaContext context = ((SchemaContextProvider) yangModelRegistry)
                 .getSchemaContext(ResourceId.builder().addBranchPointSchema("/", null).build());
 
diff --git a/drivers/microsemi/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
index 0e8f4bd..9a8b471 100644
--- a/drivers/microsemi/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
@@ -29,14 +29,8 @@
 import org.onosproject.netconf.NetconfSession;
 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;
@@ -146,34 +140,10 @@
     }
 
     @Override
-    public void systemRestart(SystemRestartInput inputVar, NetconfSession session) {
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-
-    @Override
     public void systemShutdown(NetconfSession session) {
         throw new UnsupportedOperationException("Not yet implemented");
     }
 
-    @Override
-    public DoUpgradeAndRebootOutput doUpgradeAndReboot(DoUpgradeAndRebootInput inputVar, NetconfSession session)
-            throws NetconfException {
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-
-    @Override
-    public void pullUpdateTarFromTftp(PullUpdateTarFromTftpInput inputVar, NetconfSession session)
-            throws NetconfException {
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-
-    @Override
-    public ReadFromSyslogOutput readFromSyslog(ReadFromSyslogInput inputVar, NetconfSession session)
-            throws NetconfException {
-        throw new UnsupportedOperationException("Not yet implemented");
-    }
-
-
     /**
      * Builds a request crafted to get the configuration required to create
      * details descriptions for the device.
@@ -186,9 +156,10 @@
         rpc.append("xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">");
         rpc.append("<platform>");
         rpc.append("<os-release/>");
-        rpc.append("<sysms:device-identification>");
-        rpc.append("<sysms:serial-number/>");
-        rpc.append("</sysms:device-identification>");
+//FIXME: This has been commented out until the augment of common models issue with onos-yang-tools is sorted
+//        rpc.append("<sysms:device-identification>");
+//        rpc.append("<sysms:serial-number/>");
+//        rpc.append("</sysms:device-identification>");
         rpc.append("</platform>");
         rpc.append("<clock>");
         rpc.append("<current-datetime/>");
diff --git a/drivers/microsemi/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
index 43be669..695dfcb 100644
--- a/drivers/microsemi/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
@@ -35,7 +35,6 @@
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.AbortLoopbackInput;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MaintenanceAssociation;
-import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.CcmIntervalEnum;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaintenanceAssociationEndPoint;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceInput;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitlinktrace.TransmitLinktraceOutput;
@@ -43,7 +42,6 @@
 import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.AugmentedMseaCfmMaintenanceAssociationEndPoint;
 import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.DefaultAugmentedMseaCfmMaintenanceAssociationEndPoint;
 import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.delaymeasurements.DelayMeasurement;
-import org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain.maintenanceassociation.maintenanceassociationendpoint.augmentedmseacfmmaintenanceassociationendpoint.lossmeasurements.lossmeasurement.MessagePeriodEnum;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.ModelConverter;
 import org.onosproject.yang.model.ModelObject;
@@ -56,6 +54,7 @@
 import org.onosproject.yang.runtime.DefaultCompositeStream;
 
 import java.io.ByteArrayInputStream;
+import java.util.regex.Pattern;
 
 /**
  * Implementation of the MseaCfmServiceNetconf YANG model service.
@@ -69,6 +68,16 @@
 
     public static final String MSEA_CFM_NS = "http://www.microsemi.com/microsemi-edge-assure/msea-cfm";
     public static final String MSEA_CFM_PM_NS = "http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm";
+
+    //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
+    @Deprecated
+    protected static final Pattern REGEX_EMPTY_ACTIVE_DEFECTS =
+            Pattern.compile("(<active-defects)[ ]?(/>)", Pattern.DOTALL);
+    //FIXME Remove when the issue with Null bits on onos-yang-tools is sorted
+    @Deprecated
+    protected static final Pattern REGEX_EMPTY_LAST_DEFECT_SENT =
+            Pattern.compile("(<msea-soam-fm:last-defect-sent)[ ]?(/>)", Pattern.DOTALL);
+
     @Activate
     public void activate() {
         super.activate();
@@ -96,7 +105,6 @@
 
         String xmlResult = session.get(xmlQueryStr, null);
         xmlResult = removeRpcReplyData(xmlResult);
-        xmlResult = removePrefixedMessagePeriod(xmlResult);
         DefaultCompositeStream resultDcs = new DefaultCompositeStream(
                 null, new ByteArrayInputStream(xmlResult.getBytes()));
         CompositeData compositeData = xSer.decode(resultDcs, yCtx);
@@ -127,7 +135,7 @@
 
         String xmlResult = session.get(xmlQueryStr, null);
         xmlResult = removeRpcReplyData(xmlResult);
-        xmlResult = removePrefixedCcmInterval(xmlResult);
+        xmlResult = removeEmptyActiveDefects(xmlResult);
         DefaultCompositeStream resultDcs = new DefaultCompositeStream(
                 null, new ByteArrayInputStream(xmlResult.getBytes()));
         CompositeData compositeData = xSer.decode(resultDcs, yCtx);
@@ -155,7 +163,6 @@
 
         String xmlResult = session.get(xmlQueryStr, null);
         xmlResult = removeRpcReplyData(xmlResult);
-        xmlResult = removePrefixedMessagePeriod(xmlResult);
         DefaultCompositeStream resultDcs = new DefaultCompositeStream(
                 null, new ByteArrayInputStream(xmlResult.getBytes()));
         CompositeData compositeData = xSer.decode(resultDcs, yCtx);
@@ -287,6 +294,16 @@
         throw new UnsupportedOperationException("Not yet implemented");
     }
 
+    //FIXME Remove when the fix for null bits with onos-yang-tools
+    // https://gerrit.onosproject.org/#/c/15777/ is available
+    @Deprecated
+    private static String removeEmptyActiveDefects(String rpcReplyXml) throws NetconfException {
+        rpcReplyXml = REGEX_EMPTY_ACTIVE_DEFECTS.matcher(rpcReplyXml).replaceFirst("");
+        rpcReplyXml = REGEX_EMPTY_LAST_DEFECT_SENT.matcher(rpcReplyXml).replaceFirst("");
+
+        return rpcReplyXml;
+    }
+
     @Deprecated //Replace this with a ModelObject defintion
     private String buildMepEssentialsQueryString(MdId mdId, MaIdShort maId,
             MepId mepId) {
@@ -435,29 +452,4 @@
 
         return rpc.toString();
     }
-
-    private static final String removePrefixedMessagePeriod(String xmlResult) {
-        xmlResult = xmlResult.replace("message-period>3ms</",
-                "message-period>" + MessagePeriodEnum.YANGAUTOPREFIX3MS.toString() + "</");
-        xmlResult = xmlResult.replace("message-period>10ms</",
-                "message-period>" + MessagePeriodEnum.YANGAUTOPREFIX10MS.toString() + "</");
-        xmlResult = xmlResult.replace("message-period>100ms</",
-                "message-period>" + MessagePeriodEnum.YANGAUTOPREFIX100MS.toString() + "</");
-        xmlResult = xmlResult.replace("message-period>1000ms</",
-                "message-period>" + MessagePeriodEnum.YANGAUTOPREFIX1000MS.toString() + "</");
-        return xmlResult;
-    }
-
-    private static final String removePrefixedCcmInterval(String xmlResult) {
-        xmlResult = xmlResult.replace("ccm-interval>3.3ms</",
-                "ccm-interval>" + CcmIntervalEnum.YANGAUTOPREFIX3_3MS.toString() + "</");
-        xmlResult = xmlResult.replace("ccm-interval>10ms</",
-                "ccm-interval>" + CcmIntervalEnum.YANGAUTOPREFIX10MS.toString() + "</");
-        xmlResult = xmlResult.replace("ccm-interval>100ms</",
-                "ccm-interval>" + CcmIntervalEnum.YANGAUTOPREFIX100MS.toString() + "</");
-        xmlResult = xmlResult.replace("ccm-interval>1s</",
-                "ccm-interval>" + CcmIntervalEnum.YANGAUTOPREFIX1S.toString() + "</");
-        return xmlResult;
-    }
-
 }
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
index 1b8135c..20e80a1 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
@@ -41,14 +41,17 @@
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.MdNameAndTypeCombo;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.maintenanceassociation.MaNameAndTypeCombo;
 
+import java.util.BitSet;
+
 /**
  * Test of the CFM implementation on EA1000 through the incubator/net/l2monitoring interface.
  */
 public class EA1000CfmMepProgrammableTest {
     EA1000CfmMepProgrammable cfmProgrammable;
-    MdId mdId1 = MdIdCharStr.asMdId("md-1");
-    MaIdShort maId11 = MaIdCharStr.asMaId("ma-1-1");
-    MepId mep111 = MepId.valueOf((short) 1);
+    public static final MdId MD_ID_1 = MdIdCharStr.asMdId("md-1");
+    public static final MaIdShort MA_ID_11 = MaIdCharStr.asMaId("ma-1-1");
+    public static final MepId MEP_111 = MepId.valueOf((short) 1);
+    public static final MepId MEP_112 = MepId.valueOf((short) 2);
 
     @Before
     public void setUp() throws Exception {
@@ -72,7 +75,7 @@
 
     @Test
     public void testGetMep() throws CfmConfigException {
-        MepEntry mepEntry = cfmProgrammable.getMep(mdId1, maId11, mep111);
+        MepEntry mepEntry = cfmProgrammable.getMep(MD_ID_1, MA_ID_11, MEP_111);
 
         //Result will come from MockNetconfSessionEa1000.SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY
         assertNotNull(mepEntry);
@@ -80,13 +83,43 @@
         assertTrue(mepEntry.cciEnabled());
         assertEquals(Priority.PRIO5.name(), mepEntry.ccmLtmPriority().name());
 
-        assertTrue(mepEntry.activeMacStatusDefect()); //remote-mac-error
-        assertTrue(mepEntry.activeRdiCcmDefect()); //remote-rdi
+        assertTrue("Expecting remote-mac-error", mepEntry.activeMacStatusDefect()); //remote-mac-error
+        assertTrue("Expecting remote-rdi", mepEntry.activeRdiCcmDefect()); //remote-rdi
 
         assertNotNull(mepEntry.activeRemoteMepList());
 
-        //TODO Comment back in this test - this is a serious issue with onos-yang-tools that only 1 is found
-        // See https://gerrit.onosproject.org/#/c/15164/
+//FIXME Waiting on patch https://gerrit.onosproject.org/#/c/15778/
+//        assertEquals("Expecting 2 Remote Meps", 2, mepEntry.activeRemoteMepList().size());
+        mepEntry.activeRemoteMepList().forEach(rmep -> {
+            if (rmep.remoteMepId().value() == 1) {
+                assertEquals(RemoteMepState.RMEP_FAILED.name(),
+                        rmep.state().toString());
+                assertEquals(54654654L, rmep.failedOrOkTime().toMillis());
+                assertEquals("aa:bb:cc:dd:ee:ff".toUpperCase(), rmep.macAddress().toString());
+                assertFalse(rmep.rdi());
+                assertEquals(PortStatusTlvType.PS_NO_STATUS_TLV.name(),
+                        rmep.portStatusTlvType().toString());
+                assertEquals(InterfaceStatusTlvType.IS_DORMANT.name(),
+                        rmep.interfaceStatusTlvType().toString());
+            }
+        });
+
+    }
+
+    @Test
+    public void testGetMep2() throws CfmConfigException {
+        MepEntry mepEntry = cfmProgrammable.getMep(MD_ID_1, MA_ID_11, MEP_112);
+
+        //Result will come from MockNetconfSessionEa1000.SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY
+        assertNotNull(mepEntry);
+        assertTrue(mepEntry.administrativeState());
+        assertTrue(mepEntry.cciEnabled());
+        assertEquals(Priority.PRIO4.name(), mepEntry.ccmLtmPriority().name());
+
+        assertNotNull(mepEntry.activeRemoteMepList());
+        BitSet bs1 = new BitSet();
+        bs1.clear();
+//FIXME Waiting on patch https://gerrit.onosproject.org/#/c/15778/
 //        assertEquals("Expecting 2 Remote Meps", 2, mepEntry.activeRemoteMepList().size());
         mepEntry.activeRemoteMepList().forEach(rmep -> {
             if (rmep.remoteMepId().value() == 1) {
@@ -110,7 +143,7 @@
      */
     @Test
     public void testDeleteMep() throws CfmConfigException {
-        assertTrue(cfmProgrammable.deleteMep(mdId1, maId11, mep111));
+        assertTrue(cfmProgrammable.deleteMep(MD_ID_1, MA_ID_11, MEP_111));
     }
 
     /**
@@ -126,12 +159,12 @@
         lbCreate.vlanPriority(Priority.PRIO3);
         lbCreate.vlanDropEligible(true);
 
-        cfmProgrammable.transmitLoopback(mdId1, maId11, mep111, lbCreate.build());
+        cfmProgrammable.transmitLoopback(MD_ID_1, MA_ID_11, MEP_111, lbCreate.build());
     }
 
     @Test
     public void testAbortLoopback() throws CfmConfigException {
-        cfmProgrammable.abortLoopback(mdId1, maId11, mep111);
+        cfmProgrammable.abortLoopback(MD_ID_1, MA_ID_11, MEP_111);
     }
 
 //    @Test
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
index 22112b3..8a5e6f4 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
@@ -96,7 +96,7 @@
         AugmentedSysPlatform sysSystemState =
                 (AugmentedSysPlatform) sys.systemState().platform().augmentation(DefaultAugmentedSysPlatform.class);
 
-        assertEquals("Eagle Simulator.", sysSystemState.deviceIdentification().serialNumber());
+        assertEquals("EA1000 unit test.", sysSystemState.deviceIdentification().serialNumber());
     }
 
     @Test
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
index d2c07e5..b9d4342 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
 
+import org.onosproject.drivers.microsemi.EA1000CfmMepProgrammableTest;
 import org.onosproject.netconf.DatastoreId;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfDeviceOutputEventListener;
@@ -375,43 +376,59 @@
                     + "(</rpc>)\\R?"
                     + "(]]>){2}", Pattern.DOTALL);
 
-    //For testGetConfigMseaCfmEssentials
+    //For testGetMep
+    private String sampleXmlRegexGetMseaCfmFullStr =
+            "(<\\?xml).*(<rpc).*(<get>)\\R?"
+            + "(<filter type=\"subtree\">)\\R?"
+            + "(<mef-cfm).*"
+            + "(<maintenance-domain>)\\R?"
+            + "(<id/>)\\R?"
+            + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+            + "(<md-level/>)?\\R?"
+            + "(<maintenance-association>)\\R?"
+            + "(<id/>)\\R?"
+            + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+            + "(<maintenance-association-end-point>)\\R?"
+            + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
+            + "(<interface/>)?\\R?"
+            + "(<primary-vid/>)?\\R?"
+            + "(<administrative-state/>)?\\R?"
+            + "(<mac-address/>)?\\R?"
+            + "(<ccm-ltm-priority/>)?\\R?"
+            + "(<continuity-check/>)?\\R?"
+            + "(<loopback/>)?\\R?"
+            + "(<linktrace/>)?\\R?"
+            + "(<remote-mep-database/>)\\R?"
+            + "(<msea-soam-fm:operational-state/>)\\R?"
+            + "(<msea-soam-fm:connectivity-status/>)\\R?"
+            + "(<msea-soam-fm:port-status/>)\\R?"
+            + "(<msea-soam-fm:interface-status/>)\\R?"
+            + "(<msea-soam-fm:last-defect-sent/>)\\R?"
+            + "(<msea-soam-fm:rdi-transmit-status/>)\\R?"
+            + "(</maintenance-association-end-point>)\\R?"
+            + "(</maintenance-association>)\\R?"
+            + "(</maintenance-domain>)\\R?"
+            + "(</mef-cfm>)\\R?"
+            + "(</filter>)\\R?"
+            + "(</get>)\\R?"
+            + "(</rpc>)\\R?"
+            + "(]]>){2}";
+
     private Pattern sampleXmlRegexGetMseaCfmFull =
-            Pattern.compile("(<\\?xml).*(<rpc).*(<get>)\\R?"
-                    + "(<filter type=\"subtree\">)\\R?"
-                    + "(<mef-cfm).*"
-                    + "(<maintenance-domain>)\\R?"
-                    + "(<id/>)\\R?"
-                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
-                    + "(<md-level/>)?\\R?"
-                    + "(<maintenance-association>)\\R?"
-                    + "(<id/>)\\R?"
-                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
-                    + "(<maintenance-association-end-point>)\\R?"
-                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
-                    + "(<interface/>)?\\R?"
-                    + "(<primary-vid/>)?\\R?"
-                    + "(<administrative-state/>)?\\R?"
-                    + "(<mac-address/>)?\\R?"
-                    + "(<ccm-ltm-priority/>)?\\R?"
-                    + "(<continuity-check/>)?\\R?"
-                    + "(<loopback/>)?\\R?"
-                    + "(<linktrace/>)?\\R?"
-                    + "(<remote-mep-database/>)\\R?"
-                    + "(<msea-soam-fm:operational-state/>)\\R?"
-                    + "(<msea-soam-fm:connectivity-status/>)\\R?"
-                    + "(<msea-soam-fm:port-status/>)\\R?"
-                    + "(<msea-soam-fm:interface-status/>)\\R?"
-                    + "(<msea-soam-fm:last-defect-sent/>)\\R?"
-                    + "(<msea-soam-fm:rdi-transmit-status/>)\\R?"
-                    + "(</maintenance-association-end-point>)\\R?"
-                    + "(</maintenance-association>)\\R?"
-                    + "(</maintenance-domain>)\\R?"
-                    + "(</mef-cfm>)\\R?"
-                    + "(</filter>)\\R?"
-                    + "(</get>)\\R?"
-                    + "(</rpc>)\\R?"
-                    + "(]]>){2}", Pattern.DOTALL);
+            Pattern.compile(sampleXmlRegexGetMseaCfmFullStr
+                    .replace("(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)",
+                            "(<mep-identifier>)" +
+                                    EA1000CfmMepProgrammableTest.MEP_111 +
+                                    "(</mep-identifier>)"),
+                    Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexGetMseaCfmFull2 =
+            Pattern.compile(sampleXmlRegexGetMseaCfmFullStr
+                    .replace("(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)",
+                            "(<mep-identifier>)" +
+                                    EA1000CfmMepProgrammableTest.MEP_112 +
+                                    "(</mep-identifier>)"),
+                    Pattern.DOTALL);
 
     //For testGetConfigMseaCfmEssentials
     private Pattern sampleXmlRegexGetMseaDelay =
@@ -555,7 +572,7 @@
             + "<platform>\n"
             + "<os-release>4.4.0-53-generic</os-release>\n"
             + "<sysms:device-identification>\n"
-            + "<sysms:serial-number>Eagle Simulator.</sysms:serial-number>\n"
+            + "<sysms:serial-number>EA1000 unit test.</sysms:serial-number>\n"
             + "</sysms:device-identification>\n"
             + "</platform>\n"
             + "</system-state>\n"
@@ -830,25 +847,25 @@
             + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
             + "<maintenance-domain>"
             + "<id>1</id>"
-            + "<name>md-1</name>"
+            + "<name>" + EA1000CfmMepProgrammableTest.MD_ID_1 + "</name>"
             + "<maintenance-association>"
             + "<id>1</id>"
-            + "<name>ma-1-1</name>"
+            + "<name>" + EA1000CfmMepProgrammableTest.MA_ID_11 + "</name>"
             + "<ccm-interval>3.3ms</ccm-interval>"
             + "<maintenance-association-end-point>"
-            + "<mep-identifier>1</mep-identifier>"
+            + "<mep-identifier>" + EA1000CfmMepProgrammableTest.MEP_111 + "</mep-identifier>"
             + "<interface>eth0</interface>"
             + "<primary-vid>20</primary-vid>"
             + "<administrative-state>true</administrative-state>"
             + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
             + "<ccm-ltm-priority>5</ccm-ltm-priority>"
             + "<continuity-check>"
-            + "<cci-enabled>true</cci-enabled>"
-            + "<fng-state>defect-reported</fng-state>"
-            + "<highest-priority-defect-found>remote-invalid-ccm</highest-priority-defect-found>"
-            + "<active-defects>remote-rdi remote-invalid-ccm</active-defects>"
-            + "<ccm-sequence-error-count>0</ccm-sequence-error-count>"
-            + "<sent-ccms>197</sent-ccms>"
+                + "<cci-enabled>true</cci-enabled>"
+                + "<fng-state>defect-reported</fng-state>"
+                + "<highest-priority-defect-found>remote-invalid-ccm</highest-priority-defect-found>"
+                + "<active-defects>remote-rdi remote-invalid-ccm</active-defects>"
+                + "<ccm-sequence-error-count>0</ccm-sequence-error-count>"
+                + "<sent-ccms>197</sent-ccms>"
             + "</continuity-check>"
             + "<loopback>"
             + "</loopback>"
@@ -887,6 +904,85 @@
             + "</data>"
             + "</rpc-reply>";
 
+
+    /**
+     * With an empty <last-defect-sent />. Retrieved from simulator.
+     */
+    private static final String SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY2 =
+            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
+            + "<data>"
+            + "<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" "
+            + "xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" "
+            + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
+            + "<maintenance-domain>"
+                + "<id>1</id>"
+                + "<name>" + EA1000CfmMepProgrammableTest.MD_ID_1 + "</name>"
+                + "<maintenance-association>"
+                    + "<id>1</id>"
+                    + "<name>" + EA1000CfmMepProgrammableTest.MA_ID_11 + "</name>"
+                    + "<maintenance-association-end-point>"
+                        + "<mep-identifier>" + EA1000CfmMepProgrammableTest.MEP_112 + "</mep-identifier>"
+                        + "<interface>eth0</interface>"
+                        + "<administrative-state>true</administrative-state>"
+                        + "<ccm-ltm-priority>4</ccm-ltm-priority>"
+                        + "<continuity-check>"
+                            + "<cci-enabled>true</cci-enabled>"
+                            + "<fng-state>report-defect</fng-state>"
+                            + "<highest-priority-defect-found>remote-mac-error</highest-priority-defect-found>"
+                            + "<active-defects> remote-mac-error invalid-ccm</active-defects>"
+                            + "<last-error-ccm>U2FtcGxlIGxhc3QgZXJyb3IgY2NtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
+                            + "</last-error-ccm>"
+                            + "<ccm-sequence-error-count>10</ccm-sequence-error-count>"
+                            + "<sent-ccms>15</sent-ccms>"
+                        + "</continuity-check>"
+                        + "<mac-address>53:65:61:6e:20:43</mac-address>"
+                        + "<msea-soam-fm:port-status>no-status-tlv</msea-soam-fm:port-status>"
+                        + "<msea-soam-fm:interface-status>no-status-tlv</msea-soam-fm:interface-status>"
+                        + "<msea-soam-fm:last-defect-sent />"
+                        + "<msea-soam-fm:rdi-transmit-status>false</msea-soam-fm:rdi-transmit-status>"
+                        + "<loopback>"
+                            + "<replies-received>123</replies-received>"
+                            + "<replies-transmitted>456</replies-transmitted>"
+                        + "</loopback>"
+                        + "<remote-mep-database>"
+                            + "<remote-mep>"
+                                + "<remote-mep-id>20</remote-mep-id>"
+                                + "<remote-mep-state>ok</remote-mep-state>"
+                                + "<failed-ok-time>150859498</failed-ok-time>"
+                                + "<mac-address>53:65:61:6e:20:43</mac-address>"
+                                + "<rdi>true</rdi>"
+                                + "<port-status-tlv>up</port-status-tlv>"
+                                + "<interface-status-tlv>no-status-tlv</interface-status-tlv>"
+                            + "</remote-mep>"
+                            + "<remote-mep>"
+                                + "<remote-mep-id>30</remote-mep-id>"
+                                + "<remote-mep-state>ok</remote-mep-state>"
+                                + "<failed-ok-time>150859498</failed-ok-time>"
+                                + "<mac-address>53:65:61:6e:20:43</mac-address>"
+                                + "<rdi>true</rdi>"
+                                + "<port-status-tlv>no-status-tlv</port-status-tlv>"
+                                + "<interface-status-tlv>down</interface-status-tlv>"
+                            + "</remote-mep>"
+                        + "</remote-mep-database>"
+                        + "<linktrace>"
+                            + "<unexpected-replies-received>0</unexpected-replies-received>"
+                            + "<msea-soam-fm:ltm-msgs-transmitted>2</msea-soam-fm:ltm-msgs-transmitted>"
+                            + "<msea-soam-fm:ltm-msgs-received>2</msea-soam-fm:ltm-msgs-received>"
+                            + "<msea-soam-fm:ltr-msgs-transmitted>2</msea-soam-fm:ltr-msgs-transmitted>"
+                            + "<msea-soam-fm:ltr-msgs-received>2</msea-soam-fm:ltr-msgs-received>"
+                            + "<linktrace-database />"
+                        + "</linktrace>"
+                    + "</maintenance-association-end-point>"
+                + "</maintenance-association>"
+            + "</maintenance-domain>"
+            + "</mef-cfm>"
+            + "</data>"
+            + "</rpc-reply>";
+
     private static final String SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
             + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
@@ -1208,6 +1304,9 @@
         } else if (sampleXmlRegexGetMseaCfmFull.matcher(request).matches()) {
             return SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY;
 
+        } else if (sampleXmlRegexGetMseaCfmFull2.matcher(request).matches()) {
+            return SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY2;
+
         } else if (sampleXmlRegexDeleteMseaCfmMep.matcher(request).matches()) {
             return SAMPLE_REPLY_OK;
 
diff --git a/drivers/microsemi/src/test/java/org/onosproject/yang/MockMicrosemiRegistrator.java b/drivers/microsemi/src/test/java/org/onosproject/yang/MockMicrosemiRegistrator.java
index f8129f2..111ec8a 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/yang/MockMicrosemiRegistrator.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/yang/MockMicrosemiRegistrator.java
@@ -15,7 +15,7 @@
  */
 package org.onosproject.yang;
 
-import org.onosproject.drivers.microsemi.yang.MicrosemiModelRegistrator;
+import org.onosproject.models.microsemi.MicrosemiModelRegistrator;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.tool.YangNodeInfo;
 import org.onosproject.yang.runtime.DefaultModelRegistrationParam;