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
new file mode 100644
index 0000000..1b8135c
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
@@ -0,0 +1,173 @@
+/*
+ * 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 junit.framework.TestCase.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.onosproject.drivers.microsemi.yang.utils.MaNameUtil;
+import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMepLbCreate;
+import org.onosproject.incubator.net.l2monitoring.cfm.Mep.Priority;
+import org.onosproject.incubator.net.l2monitoring.cfm.MepEntry;
+import org.onosproject.incubator.net.l2monitoring.cfm.MepLbCreate;
+import org.onosproject.incubator.net.l2monitoring.cfm.RemoteMepEntry.InterfaceStatusTlvType;
+import org.onosproject.incubator.net.l2monitoring.cfm.RemoteMepEntry.PortStatusTlvType;
+import org.onosproject.incubator.net.l2monitoring.cfm.RemoteMepEntry.RemoteMepState;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+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;
+
+/**
+ * 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);
+
+    @Before
+    public void setUp() throws Exception {
+        cfmProgrammable = new EA1000CfmMepProgrammable();
+        cfmProgrammable.setHandler(new MockEa1000DriverHandler());
+        assertNotNull(cfmProgrammable.handler().data().deviceId());
+    }
+
+
+    @Ignore
+    @Test
+    public void testCreateMep() {
+        fail("Not yet implemented");
+    }
+
+    @Ignore
+    @Test
+    public void testGetAllMeps() {
+        fail("Not yet implemented");
+    }
+
+    @Test
+    public void testGetMep() throws CfmConfigException {
+        MepEntry mepEntry = cfmProgrammable.getMep(mdId1, maId11, mep111);
+
+        //Result will come from MockNetconfSessionEa1000.SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY
+        assertNotNull(mepEntry);
+        assertTrue(mepEntry.administrativeState());
+        assertTrue(mepEntry.cciEnabled());
+        assertEquals(Priority.PRIO5.name(), mepEntry.ccmLtmPriority().name());
+
+        assertTrue(mepEntry.activeMacStatusDefect()); //remote-mac-error
+        assertTrue(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/
+//        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());
+            }
+        });
+
+    }
+
+    /**
+     * For sampleXmlRegexDeleteMseaCfmMep.
+     * @throws CfmConfigException If an error occurs
+     */
+    @Test
+    public void testDeleteMep() throws CfmConfigException {
+        assertTrue(cfmProgrammable.deleteMep(mdId1, maId11, mep111));
+    }
+
+    /**
+     * For sampleXmlRegexTransmitLoopback.
+     * @throws CfmConfigException If an error occurs
+     */
+    @Test
+    public void testTransmitLoopback() throws CfmConfigException {
+        MepLbCreate.MepLbCreateBuilder lbCreate =
+                    DefaultMepLbCreate.builder(MepId.valueOf((short) 12));
+        lbCreate.numberMessages(5);
+//        lbCreate.dataTlvHex("AA:BB:CC:DD:EE");
+        lbCreate.vlanPriority(Priority.PRIO3);
+        lbCreate.vlanDropEligible(true);
+
+        cfmProgrammable.transmitLoopback(mdId1, maId11, mep111, lbCreate.build());
+    }
+
+    @Test
+    public void testAbortLoopback() throws CfmConfigException {
+        cfmProgrammable.abortLoopback(mdId1, maId11, mep111);
+    }
+
+//    @Test
+//    public void testTransmitLinktrace() {
+//        fail("Not yet implemented");
+//    }
+
+    @Test
+    public void testGetYangMdNameFromApiMdId() throws CfmConfigException {
+        MdNameAndTypeCombo name = EA1000CfmMepProgrammable
+                .getYangMdNameFromApiMdId(MdIdCharStr.asMdId("md-1"));
+
+        assertEquals(org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm
+                .maintenancedomain.mdnameandtypecombo
+                .DefaultNameCharacterString.class, name.getClass());
+
+//There's a problem with checkstyle for typecast on really long paths
+//        assertEquals("md-1", ((org.onosproject.yang.gen.v1.http.www.microsemi.com
+//                .microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm
+//                .maintenancedomain.mdnameandtypecombo
+//                .DefaultNameCharacterString) name).name().string());
+    }
+
+    @Test
+    public void testGetYangMaNameFromApiMaId() throws CfmConfigException {
+        MaNameAndTypeCombo name = MaNameUtil
+                .getYangMaNameFromApiMaId(MaIdCharStr.asMaId("ma-1-1"));
+        assertEquals(org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm
+                .maintenancedomain.maintenanceassociation.manameandtypecombo
+                .DefaultNameCharacterString.class, name.getClass());
+
+//There's a problem with checkstyle for typecast on really long paths
+//        assertEquals("ma-1-1", ((org.onosproject.yang.gen.v1.http.www.microsemi.com
+//                .microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm
+//                .maintenancedomain.maintenanceassociation.manameandtypecombo
+//                .DefaultNameCharacterString) name).name().string());
+    }
+
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java
new file mode 100644
index 0000000..59c674e
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java
@@ -0,0 +1,267 @@
+/*
+ * 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.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Collection;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.incubator.net.l2monitoring.cfm.Mep.Priority;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdShort;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.soam.SoamConfigException;
+import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DefaultDelayMeasurementCreate;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementCreate.DmCreateBuilder;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementCreate.DmType;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementCreate.MeasurementOption;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementCreate.Version;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementEntry;
+import org.onosproject.incubator.net.l2monitoring.soam.delay.DelayMeasurementEntry.SessionStatus;
+
+public class EA1000SoamDmProgrammableTest {
+
+    EA1000SoamDmProgrammable dmProgrammable;
+    MdId mdId1 = MdIdCharStr.asMdId("md-1");
+    MaIdShort maId11 = MaIdCharStr.asMaId("ma-1-1");
+    MepId mep111 = MepId.valueOf((short) 1);
+
+    @Before
+    public void setUp() throws Exception {
+        dmProgrammable = new EA1000SoamDmProgrammable();
+        dmProgrammable.setHandler(new MockEa1000DriverHandler());
+        assertNotNull(dmProgrammable.handler().data().deviceId());
+    }
+
+    //TODO Implement all these tests
+//    @Test
+//    public void testEA1000SoamDmProgrammable() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetAllDms() {
+//        fail("Not yet implemented");
+//    }
+
+    /**
+     * From SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY.
+     * @throws CfmConfigException
+     * @throws SoamConfigException
+     */
+    @Test
+    public void testGetDm() throws CfmConfigException, SoamConfigException {
+        DelayMeasurementEntry dmEntry =
+                dmProgrammable.getDm(mdId1, maId11, mep111, SoamId.valueOf(1));
+        assertEquals(1, dmEntry.dmId().id().intValue());
+        assertEquals(2, dmEntry.measurementsEnabled().size());
+        assertEquals(SessionStatus.ACTIVE.name(), dmEntry.sessionStatus().name());
+        assertEquals(100, dmEntry.frameDelayTwoWay().toNanos() / 1000);
+        assertEquals(101, dmEntry.interFrameDelayVariationTwoWay().toNanos() / 1000);
+    }
+
+    @Test
+    public void testCreateDm() throws CfmConfigException, SoamConfigException {
+        DmCreateBuilder dmBuilder = (DmCreateBuilder) DefaultDelayMeasurementCreate
+            .builder(DmType.DMDMM, Version.Y17312011,
+                MepId.valueOf((short) 10), Priority.PRIO3)
+            .frameSize((short) 1200);
+
+        dmProgrammable.createDm(mdId1, maId11, mep111, dmBuilder.build());
+    }
+
+    @Test
+    public void testCreateDmWrongMsgPeriod()
+            throws CfmConfigException, SoamConfigException {
+        DmCreateBuilder dmBuilder = (DmCreateBuilder) DefaultDelayMeasurementCreate
+                .builder(DmType.DMDMM, Version.Y17312011,
+                        MepId.valueOf((short) 10), Priority.PRIO3)
+                .messagePeriod(Duration.ofMillis(1234));
+
+        try {
+            dmProgrammable.createDm(mdId1, maId11, mep111, dmBuilder.build());
+            fail("Expecting to get an exception");
+        } catch (SoamConfigException e) {
+            assertTrue(e.getMessage()
+                    .contains("EA1000 supports only Message Periods"));
+        }
+
+    }
+
+//    @Test
+//    public void testGetDmCurrentStat() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetDmHistoricalStats() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testAbortDmMdIdMaIdShortMepIdSoamId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testBuildApiDmFromYangDm() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testAbortDmMdIdMaIdShortMepId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testClearDelayHistoryStatsMdIdMaIdShortMepId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testClearDelayHistoryStatsMdIdMaIdShortMepIdSoamId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetAllLms() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetLm() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetLmCurrentStat() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testGetLmHistoricalStats() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testCreateLm() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testAbortLmMdIdMaIdShortMepId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testAbortLmMdIdMaIdShortMepIdSoamId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testClearLossHistoryStatsMdIdMaIdShortMepId() {
+//        fail("Not yet implemented");
+//    }
+//
+//    @Test
+//    public void testClearLossHistoryStatsMdIdMaIdShortMepIdSoamId() {
+//        fail("Not yet implemented");
+//    }
+
+    @Test
+    public void testCreateTestSignal() {
+        try {
+            dmProgrammable.createTestSignal(mdId1, maId11, mep111, null);
+            fail("Expected an exception");
+        } catch (UnsupportedOperationException e) {
+            assertEquals("Not supported by EA1000", e.getMessage());
+        } catch (CfmConfigException e) {
+            fail("CfmConfigException was not expected");
+        }
+    }
+
+    @Test
+    public void testAbortTestSignal() {
+        try {
+            dmProgrammable.abortTestSignal(mdId1, maId11, mep111);
+            fail("Expected an exception");
+        } catch (UnsupportedOperationException e) {
+            assertEquals("Not supported by EA1000", e.getMessage());
+        } catch (CfmConfigException e) {
+            fail("CfmConfigException was not expected");
+        }
+    }
+
+    @Test
+    public void testMeasurementEnableCollectionOfMeasurementOption() {
+        BitSet meBs = BitSet.valueOf(new byte[]{0x05});
+        Collection<MeasurementOption> moSet =
+                EA1000SoamDmProgrammable.getMeasurementOptions(meBs);
+        assertTrue(moSet.contains(MeasurementOption.SOAM_PDUS_RECEIVED));
+        assertTrue(moSet.contains(MeasurementOption.FRAME_DELAY_TWO_WAY_MIN));
+    }
+
+    @Test
+    public void testMeasurementEnableBitSetEmpty() {
+        Collection<MeasurementOption> moSet = new ArrayList<>();
+        try {
+            BitSet bitSet = EA1000SoamDmProgrammable.getMeasurementEnabledSet(moSet);
+            assertEquals("{}", bitSet.toString());
+        } catch (SoamConfigException e) {
+            fail("Was not expecting exception here");
+        }
+    }
+
+    @Test
+    public void testMeasurementEnableBitSetInvalid() {
+        Collection<MeasurementOption> moSet = new ArrayList<>();
+        moSet.add(MeasurementOption.FRAME_DELAY_BACKWARD_BINS);
+        moSet.add(MeasurementOption.FRAME_DELAY_RANGE_BACKWARD_AVERAGE);
+        try {
+            EA1000SoamDmProgrammable.getMeasurementEnabledSet(moSet);
+            fail("Was expecting an exception");
+        } catch (SoamConfigException e) {
+            assertTrue(e.getMessage()
+                    .contains("Measurement Option is not supported on EA1000"));
+        }
+    }
+
+    @Test
+    public void testMeasurementEnableBitSet2Good() {
+        Collection<MeasurementOption> moSet = new ArrayList<>();
+        moSet.add(MeasurementOption.FRAME_DELAY_TWO_WAY_BINS);
+        moSet.add(MeasurementOption.FRAME_DELAY_TWO_WAY_AVERAGE);
+        try {
+            BitSet bitSet = EA1000SoamDmProgrammable.getMeasurementEnabledSet(moSet);
+            assertEquals("{1, 4}", bitSet.toString());
+        } catch (SoamConfigException e) {
+            fail("Was not expecting exception here");
+        }
+    }
+
+}
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
index 75c6811..58a8a5b 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/MockEa1000DriverHandler.java
@@ -19,14 +19,18 @@
 import java.util.Map;
 
 import org.onosproject.core.CoreService;
+import org.onosproject.drivers.microsemi.yang.MockCfmMdService;
+import org.onosproject.drivers.microsemi.yang.MockMseaCfmManager;
 import org.onosproject.drivers.microsemi.yang.MockMseaSaFilteringManager;
 import org.onosproject.drivers.microsemi.yang.MockMseaUniEvcServiceManager;
 import org.onosproject.drivers.microsemi.yang.MockNetconfSessionEa1000;
+import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService;
 import org.onosproject.drivers.microsemi.yang.MseaSaFilteringNetconfService;
 import org.onosproject.drivers.microsemi.yang.MseaUniEvcServiceNetconfService;
 import org.onosproject.drivers.netconf.MockCoreService;
 import org.onosproject.drivers.netconf.MockNetconfController;
 import org.onosproject.drivers.netconf.MockNetconfDevice;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmMdService;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.driver.Behaviour;
 import org.onosproject.net.driver.DefaultDriver;
@@ -53,6 +57,8 @@
     private NetconfController ncc;
     private MockMseaSaFilteringManager mseaSaFilteringService;
     private MockMseaUniEvcServiceManager mseaUniEvcService;
+    private MockMseaCfmManager mseaCfmService;
+    private MockCfmMdService mockMdService;
     private CoreService coreService;
 
     public MockEa1000DriverHandler() throws NetconfException {
@@ -63,7 +69,9 @@
         Map<String, String> properties = new HashMap<String, String>();
 
         Driver mockDriver =
-                new DefaultDriver("mockDriver", null, "ONOSProject", "1.0.0", "1.0.0", behaviours, properties);
+                new DefaultDriver("mockDriver", null,
+                        "ONOSProject", "1.0.0",
+                        "1.0.0", behaviours, properties);
         DeviceId mockDeviceId = DeviceId.deviceId("netconf:1.2.3.4:830");
         mockDriverData = new DefaultDriverData(mockDriver, mockDeviceId);
 
@@ -78,6 +86,12 @@
         mseaUniEvcService = new MockMseaUniEvcServiceManager();
         mseaUniEvcService.activate();
 
+        mseaCfmService = new MockMseaCfmManager();
+        mseaCfmService.activate();
+
+        mockMdService = new MockCfmMdService();
+        mockMdService.activate();
+
         coreService = new MockCoreService();
         coreService.registerApplication(MICROSEMI_DRIVERS);
     }
@@ -109,9 +123,14 @@
         } else if (serviceClass.equals(MseaUniEvcServiceNetconfService.class)) {
             return (T) mseaUniEvcService;
 
+        } else if (serviceClass.equals(MseaCfmNetconfService.class)) {
+            return (T) mseaCfmService;
+
         } else if (serviceClass.equals(CoreService.class)) {
             return (T) coreService;
 
+        } else if (serviceClass.equals(CfmMdService.class)) {
+            return (T) mockMdService;
         }
 
         return null;
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java
new file mode 100644
index 0000000..ba6d656
--- /dev/null
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MockCfmMdService.java
@@ -0,0 +1,63 @@
+/*
+ * 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.incubator.net.l2monitoring.cfm.DefaultMaintenanceAssociation;
+import org.onosproject.incubator.net.l2monitoring.cfm.DefaultMaintenanceDomain;
+import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceAssociation;
+import org.onosproject.incubator.net.l2monitoring.cfm.MaintenanceDomain;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdId;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.impl.CfmMdManager;
+import static org.easymock.EasyMock.*;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.MdStore;
+
+import java.util.Optional;
+
+public class MockCfmMdService extends CfmMdManager {
+
+    @Override
+    public void activate() {
+        store = createMock(MdStore.class);
+
+        try {
+            MaintenanceAssociation ma = DefaultMaintenanceAssociation
+                    .builder(MaIdCharStr.asMaId("ma-1-1"), 6)
+                    .maNumericId((short) 1)
+                    .ccmInterval(MaintenanceAssociation.CcmInterval.INTERVAL_3MS)
+                    .build();
+
+            MdId md1Name = MdIdCharStr.asMdId("md-1");
+            MaintenanceDomain md1 = DefaultMaintenanceDomain
+                    .builder(md1Name)
+                    .mdNumericId((short) 1)
+                    .mdLevel(MaintenanceDomain.MdLevel.LEVEL3)
+                    .addToMaList(ma)
+                    .build();
+
+            expect(store.createUpdateMaintenanceDomain(md1))
+                    .andReturn(true);
+            expect(store.getMaintenanceDomain(md1Name))
+                    .andReturn(Optional.of(md1)).anyTimes();
+            replay(store);
+
+        } catch (CfmConfigException e) {
+            throw new IllegalArgumentException("Error creating Md md-1 for 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 8068cff..d2c07e5 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
@@ -72,10 +72,23 @@
 
     private Pattern sampleXmlRegexSaFiltering =
             Pattern.compile("(<\\?xml).*"
-                    + "(<rpc).*(<get>).*"
-                    + "(<filter type=\"subtree\">).*(<source-ipaddress-filtering).*"
-                    + "(</filter>).*(</get>).*(</rpc>).*"
-                    + "(]]>){2}", Pattern.DOTALL);
+                    + "(<rpc).*(<get>)\\R?"
+                    + "(<filter type=\"subtree\">)\\R?"
+                    + "(<source-ipaddress-filtering).*(</source-ipaddress-filtering>)\\R?"
+                    + "(</filter>)\\R?(</get>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexSaFilteringErrorScenario =
+            Pattern.compile("(<\\?xml).*"
+                    + "(<rpc).*(<get>)\\R?"
+                    + "(<filter type=\"subtree\">)\\R?"
+                    + "(<source-ipaddress-filtering).*"
+                    + "(<interface-eth0>)\\R?"
+                    + "(<source-address-range>)\\R?"
+                    + "(<range-id>)10(</range-id>)\\R?"
+                    + "(</source-address-range>)\\R?"
+                    + "(</interface-eth0>)\\R?"
+                    + "(</source-ipaddress-filtering>)\\R?"
+                    + "(</filter>)\\R?(</get>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
 
     private Pattern sampleXmlRegexEditConfigSaFilt =
             Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
@@ -328,7 +341,7 @@
                     + "(<maintenance-domain>)\\R?"
                     + "(<id/>)\\R?"
                     + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
-                    + "(<md-level/>)\\R?"
+                    + "(<md-level/>)?\\R?"
                     + "(<maintenance-association>)\\R?"
                     + "(<id/>)\\R?"
                     + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
@@ -337,19 +350,22 @@
                     + "(<component-list/>)\\R?"
                     + "(<maintenance-association-end-point>)\\R?"
                     + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
-                    + "(<interface/>)\\R?"
-                    + "(<primary-vid/>)\\R?"
-                    + "(<administrative-state/>)\\R?"
-                    + "(<ccm-ltm-priority/>)\\R?"
-                    + "(<continuity-check/>)\\R?"
-                    + "(<mac-address/>)\\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?"
-                    + "(<loopback/>)\\R?"
-                    + "(<remote-mep-database/>)\\R?"
-                    + "(<linktrace/>)\\R?"
+                    + "(<mac-address/>)?\\R?"
+                    + "((<remote-mep-database>)\\R?"
+                    + "(<remote-mep>)\\R?"
+                    + "(<remote-mep-id/>)\\R?"
+                    + "(</remote-mep>)\\R?"
+                    + "(</remote-mep-database>))?\\R?"
+                    + "((<msea-soam-pm:delay-measurements>)\\R?"
+                    + "(<msea-soam-pm:delay-measurement>)\\R?"
+                    + "((<msea-soam-pm:dm-id/>)|(<msea-soam-pm:dm-id>[0-9]*</msea-soam-pm:dm-id>))\\R?"
+                    + "(</msea-soam-pm:delay-measurement>)\\R?"
+                    + "(</msea-soam-pm:delay-measurements>))?\\R?"
+                    + "((<msea-soam-pm:loss-measurements>)\\R?"
+                    + "(<msea-soam-pm:loss-measurement>)\\R?"
+                    + "((<msea-soam-pm:lm-id/>)|(<msea-soam-pm:lm-id>[0-9]*</msea-soam-pm:lm-id>))\\R?"
+                    + "(</msea-soam-pm:loss-measurement>)\\R?"
+                    + "(</msea-soam-pm:loss-measurements>))?\\R?"
                     + "(</maintenance-association-end-point>)\\R?"
                     + "(</maintenance-association>)\\R?"
                     + "(</maintenance-domain>)\\R?"
@@ -359,6 +375,164 @@
                     + "(</rpc>)\\R?"
                     + "(]]>){2}", Pattern.DOTALL);
 
+    //For testGetConfigMseaCfmEssentials
+    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);
+
+    //For testGetConfigMseaCfmEssentials
+    private Pattern sampleXmlRegexGetMseaDelay =
+            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?"
+                    + "(<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?"
+                    + "((<msea-soam-pm:delay-measurements>)\\R?"
+                    + "(<msea-soam-pm:delay-measurement>)\\R?"
+                    + "((<msea-soam-pm:dm-id/>)|(<msea-soam-pm:dm-id>[0-9]*</msea-soam-pm:dm-id>))\\R?"
+                    + "(<msea-soam-pm:mep-id/>)\\R?"
+                    + "(<msea-soam-pm:mac-address/>)\\R?"
+                    + "(<msea-soam-pm:administrative-state/>)\\R?"
+                    + "(<msea-soam-pm:measurement-enable/>)\\R?"
+                    + "(<msea-soam-pm:message-period/>)\\R?"
+                    + "(<msea-soam-pm:priority/>)\\R?"
+                    + "(<msea-soam-pm:frame-size/>)\\R?"
+                    + "(<msea-soam-pm:measurement-interval/>)\\R?"
+                    + "(<msea-soam-pm:number-intervals-stored/>)\\R?"
+                    + "(<msea-soam-pm:session-status/>)\\R?"
+                    + "(<msea-soam-pm:frame-delay-two-way/>)\\R?"
+                    + "(<msea-soam-pm:inter-frame-delay-variation-two-way/>)\\R?"
+                    + "(<msea-soam-pm:current-stats/>)?\\R?"
+                    + "(<msea-soam-pm:history-stats/>)?\\R?"
+                    + "(</msea-soam-pm:delay-measurement>)\\R?"
+                    + "(</msea-soam-pm:delay-measurements>))?\\R?"
+                    + "(</maintenance-association-end-point>)\\R?"
+                    + "(</maintenance-association>)\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</filter>)\\R?"
+                    + "(</get>)\\R?"
+                    + "(</rpc>)\\R?"
+                    + "(]]>){2}", Pattern.DOTALL);
+
+    //For testGetConfigMseaCfmEssentials
+    private Pattern sampleXmlRegexDeleteMseaCfmMep =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-cfm).*"
+                    + "(<maintenance-domain>)\\R?"
+                    + "(<id/>)?\\R?"
+                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+                    + "(<maintenance-association>)\\R?"
+                    + "(<id/>)?\\R?"
+                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
+                    + "(<maintenance-association-end-point nc:operation=\"delete\">)\\R?"
+                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
+                    + "(</maintenance-association-end-point>)\\R?"
+                    + "(</maintenance-association>)\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</config>)\\R?"
+                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+
+    private Pattern sampleXmlRegexTransmitLoopback =
+            Pattern.compile("(<\\?xml).*(<rpc).*\\R?"
+                    + "(<transmit-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
+                    + "((<number-of-messages>)[0-9]*(</number-of-messages>))?\\R?"
+                    + "((<data-tlv>)[a-zA-Z0-9+=/]*(</data-tlv>))?\\R?"
+                    + "((<vlan-priority>)[0-9]{1}(</vlan-priority>))?\\R?"
+                    + "((<vlan-drop-eligible>)((true)|(false))(</vlan-drop-eligible>))?\\R?"
+                    + "(<maintenance-association-end-point>)[0-9]{1,4}(</maintenance-association-end-point>)\\R?"
+                    + "(<maintenance-association>)[0-9]{1,5}(</maintenance-association>)\\R?"
+                    + "(<maintenance-domain>)[0-9]{1,5}(</maintenance-domain>)\\R?"
+                    + "(<target-address>)\\R?"
+                    + "((<mep-id>)[0-9]{1,4}(</mep-id>))?\\R?"
+                    + "((<mac-address>)[a-fA-F0-9:-]{17}(</mac-address>))?\\R?"
+                    + "(</target-address>)\\R?"
+                    + "(</transmit-loopback>)\\R?"
+                    + "(</rpc>)\\R?"
+                    + "(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexAbortLoopback =
+            Pattern.compile("(<\\?xml).*(<rpc).*\\R?"
+                    + "(<abort-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
+                    + "(<maintenance-association-end-point>)[0-9]{1,4}(</maintenance-association-end-point>)\\R?"
+                    + "(<maintenance-association>)[0-9]{1,5}(</maintenance-association>)\\R?"
+                    + "(<maintenance-domain>)[0-9]{1,5}(</maintenance-domain>)\\R?"
+                    + "(</abort-loopback>)\\R?"
+                    + "(</rpc>)\\R?"
+                    + "(]]>){2}", Pattern.DOTALL);
+
+    //For testCreateDm()
+    private Pattern sampleXmlRegexEditConfigDmCreate =
+        Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+            + "(<target>\\R?<running/>\\R?</target>)\\R?"
+            + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+            + "(<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
+            + "(<maintenance-domain>)\\R?"
+            + "(<id>)[0-9]*(</id>)\\R?"
+            + "(<maintenance-association>)\\R?"
+            + "(<id>)[0-9]*(</id>)\\R?"
+            + "(<maintenance-association-end-point>)\\R?"
+            + "(<mep-identifier>)[0-9]*(</mep-identifier>)\\R?"
+            + "(<delay-measurements xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">)\\R?"
+            + "(<delay-measurement>)\\R?"
+            + "(<dm-id>)[0-9]*(</dm-id>)\\R?"
+            + "((<administrative-state>)(true|false)(</administrative-state>))?\\R?"
+            + "((<message-period>)(1000ms|100ms|10ms|3ms)(</message-period>))?\\R?"
+            + "(<priority>)[0-9]*(</priority>)\\R?"
+            + "((<frame-size>)[0-9]*(</frame-size>))?\\R?"
+            + "(<mep-id>)[0-9]*(</mep-id>)\\R?"
+            + "(</delay-measurement>)\\R?"
+            + "(</delay-measurements>)\\R?"
+            + "(</maintenance-association-end-point>)\\R?"
+            + "(</maintenance-association>)\\R?"
+            + "(</maintenance-domain>)\\R?"
+            + "(</mef-cfm>)\\R?"
+            + "(</config>)\\R?"
+            + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
 
     private static final String SAMPLE_SYSTEM_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
             + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
@@ -410,6 +584,17 @@
             + "</data>\n"
             + "</rpc-reply>";
 
+    private static final String SAMPLE_ERROR_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
+            + "<rpc-error>"
+            + "<error-type>application</error-type>"
+            + "<error-tag>data-missing</error-tag>"
+            + "<error-severity>error</error-severity>"
+            + "<error-message>Request could not be completed because " +
+                "the relevant data model content does not exist.</error-message>"
+            + "</rpc-error>"
+            + "</rpc-reply>";
+
     private static final String SAMPLE_MSEAEVCUNI_REPLY_INIT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
             + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
             + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
@@ -592,7 +777,7 @@
             + "</data>\n"
             + "</rpc-reply>";
 
-    private static final String SAMPLE_MSEACFM_MD_MA_MEP_REPLY =
+    private static final String SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
             + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
             + "<data>"
@@ -602,72 +787,41 @@
             + "<maintenance-domain>"
             + "<id>1</id>"
             + "<name>md-1</name>"
-            + "<md-level>3</md-level>"
             + "<maintenance-association>"
             + "<id>1</id>"
             + "<name>ma-1-1</name>"
-            + "<ccm-interval>10ms</ccm-interval>" //Causing problems on create of MA
-            + "<remote-meps>1</remote-meps>"
-            + "<remote-meps>2</remote-meps>"
-            + "<component-list>"
-            + "<vid>100</vid>"
-            + "<tag-type>vlan-stag</tag-type>"
-            + "</component-list>"
             + "<maintenance-association-end-point>"
             + "<mep-identifier>1</mep-identifier>"
-            + "<interface>eth1</interface>"
-            + "<primary-vid>100</primary-vid>"
-            + "<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>U2FtcGxlIGxhc3QgZXJyb3IgY2NtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-            + "AAAAAAAAAAAAAAAAAAAAAAAAAAAA==</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/>" --Can't handle this at the moment
-            + "<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>"
+            + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
             + "<remote-mep-database>"
             + "<remote-mep>"
+            + "<remote-mep-id>1</remote-mep-id>"
+            + "</remote-mep>"
+            + "<remote-mep>"
             + "<remote-mep-id>2</remote-mep-id>"
-            + "<remote-mep-state>ok</remote-mep-state>"
-            + "<failed-ok-time>1490692834</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>dormant</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>"
+            + "<msea-soam-pm:delay-measurements>"
+            + "<msea-soam-pm:delay-measurement>"
+            + "<msea-soam-pm:dm-id>1</msea-soam-pm:dm-id>"
+            + "</msea-soam-pm:delay-measurement>"
+            + "</msea-soam-pm:delay-measurements>"
+            + "<msea-soam-pm:loss-measurements>"
+            + "<msea-soam-pm:loss-measurement>"
+            + "<msea-soam-pm:lm-id>1</msea-soam-pm:lm-id>"
+            + "</msea-soam-pm:loss-measurement>"
+            + "<msea-soam-pm:loss-measurement>"
+            + "<msea-soam-pm:lm-id>2</msea-soam-pm:lm-id>"
+            + "</msea-soam-pm:loss-measurement>"
+            + "</msea-soam-pm:loss-measurements>"
             + "</maintenance-association-end-point>"
-            + "<remote-meps>4</remote-meps>"
             + "</maintenance-association>"
             + "</maintenance-domain>"
             + "</mef-cfm>"
             + "</data>"
             + "</rpc-reply>";
 
-    private static final String SAMPLE_MSEACFM_MD_MA_MEP_REPLY2 =
+    private static final String SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY =
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
             + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
             + "<data>"
@@ -676,63 +830,100 @@
             + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
             + "<maintenance-domain>"
             + "<id>1</id>"
-            + "<name>Microsemi</name>"
-            + "<md-level>2</md-level>"
+            + "<name>md-1</name>"
             + "<maintenance-association>"
             + "<id>1</id>"
-            + "<name>example-ma</name>"
-            + "<remote-meps>1</remote-meps>"
-            + "<remote-meps>2</remote-meps>"
-            + "<component-list>"
-            + "<vid>100</vid>"
-            + "<tag-type>vlan-stag</tag-type>"
-            + "</component-list>"
+            + "<name>ma-1-1</name>"
+            + "<ccm-interval>3.3ms</ccm-interval>"
             + "<maintenance-association-end-point>"
-            + "<mep-identifier>4</mep-identifier>"
-            + "<interface>eth1</interface>"
-            + "<primary-vid>100</primary-vid>"
+            + "<mep-identifier>1</mep-identifier>"
+            + "<interface>eth0</interface>"
+            + "<primary-vid>20</primary-vid>"
             + "<administrative-state>true</administrative-state>"
-            + "<ccm-ltm-priority>4</ccm-ltm-priority>"
+            + "<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-invalid-ccm</active-defects>"
-            + "<active-defects/>"
+            + "<active-defects>remote-rdi remote-invalid-ccm</active-defects>"
             + "<ccm-sequence-error-count>0</ccm-sequence-error-count>"
-            + "<sent-ccms>41013</sent-ccms>"
+            + "<sent-ccms>197</sent-ccms>"
             + "</continuity-check>"
-            + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
+            + "<loopback>"
+            + "</loopback>"
+            + "<linktrace>"
+            + "</linktrace>"
+            + "<remote-mep-database>"
+                + "<remote-mep>"
+                    + "<remote-mep-id>1</remote-mep-id>"
+                    + "<remote-mep-state>failed</remote-mep-state>"
+                    + "<failed-ok-time>54654654</failed-ok-time>"
+                    + "<mac-address>aa:bb:cc:dd:ee:ff</mac-address>"
+                    + "<rdi>false</rdi>"
+                    + "<port-status-tlv>no-status-tlv</port-status-tlv>"
+                    + "<interface-status-tlv>dormant</interface-status-tlv>"
+                + "</remote-mep>"
+                + "<remote-mep>"
+                    + "<remote-mep-id>2</remote-mep-id>"
+                    + "<remote-mep-state>failed</remote-mep-state>"
+                    + "<failed-ok-time>54654654</failed-ok-time>"
+                    + "<mac-address>aa:bb:cc:dd:ee:ff</mac-address>"
+                    + "<rdi>false</rdi>"
+                    + "<port-status-tlv>no-status-tlv</port-status-tlv>"
+                    + "<interface-status-tlv>dormant</interface-status-tlv>"
+                + "</remote-mep>"
+            + "</remote-mep-database>"
+            + "<msea-soam-fm:operational-state>enabled</msea-soam-fm:operational-state>"
+            + "<msea-soam-fm:connectivity-status>partially-active</msea-soam-fm:connectivity-status>"
             + "<msea-soam-fm:port-status>up</msea-soam-fm:port-status>"
             + "<msea-soam-fm:interface-status>up</msea-soam-fm:interface-status>"
+            + "<msea-soam-fm:last-defect-sent>remote-rdi remote-mac-error</msea-soam-fm:last-defect-sent>"
             + "<msea-soam-fm:rdi-transmit-status>true</msea-soam-fm:rdi-transmit-status>"
-            + "<loopback>"
-            + "<replies-received>0</replies-received>"
-            + "<replies-transmitted>0</replies-transmitted>"
-            + "</loopback>"
-            + "<remote-mep-database>"
-            + "<remote-mep>"
-            + "<remote-mep-id>1</remote-mep-id>"
-            + "<remote-mep-state>failed</remote-mep-state>"
-            + "<failed-ok-time>26315533</failed-ok-time>"
-            + "<mac-address>00:00:00:00:00:00</mac-address>"
-            + "<rdi>false</rdi>"
-            + "<port-status-tlv>no-status-tlv</port-status-tlv>"
-            + "<interface-status-tlv>no-status-tlv</interface-status-tlv>"
-            + "</remote-mep>"
-            + "<remote-mep>"
-            + "<remote-mep-id>2</remote-mep-id>"
-            + "<remote-mep-state>failed</remote-mep-state>"
-            + "<failed-ok-time>26315541</failed-ok-time>"
-            + "<mac-address>00:00:00:00:00:00</mac-address>"
-            + "<rdi>false</rdi>"
-            + "<port-status-tlv>no-status-tlv</port-status-tlv>"
-            + "<interface-status-tlv>no-status-tlv</interface-status-tlv>"
-            + "</remote-mep>"
-            + "</remote-mep-database>"
-            + "<linktrace />"
             + "</maintenance-association-end-point>"
-            + "<remote-meps>4</remote-meps>"
+            + "</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\">"
+            + "<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>md-1</name>"
+            + "<maintenance-association>"
+            + "<id>1</id>"
+            + "<name>ma-1-1</name>"
+            + "<maintenance-association-end-point>"
+            + "<mep-identifier>1</mep-identifier>"
+            + "<msea-soam-pm:delay-measurements>"
+            + "<msea-soam-pm:delay-measurement>"
+            + "<msea-soam-pm:dm-id>1</msea-soam-pm:dm-id>"
+            + "<msea-soam-pm:mep-id>10</msea-soam-pm:mep-id>"
+            + "<msea-soam-pm:administrative-state>true</msea-soam-pm:administrative-state>"
+            + "<msea-soam-pm:measurement-enable>frame-delay-two-way-bins "
+            + "frame-delay-two-way-max</msea-soam-pm:measurement-enable>"
+            + "<msea-soam-pm:message-period>3ms</msea-soam-pm:message-period>"
+            + "<msea-soam-pm:priority>6</msea-soam-pm:priority>"
+            + "<msea-soam-pm:frame-size>1000</msea-soam-pm:frame-size>"
+            + "<msea-soam-pm:measurement-interval>15</msea-soam-pm:measurement-interval>"
+            + "<msea-soam-pm:number-intervals-stored>32</msea-soam-pm:number-intervals-stored>"
+            + "<msea-soam-pm:session-status>active</msea-soam-pm:session-status>"
+            + "<msea-soam-pm:frame-delay-two-way>100</msea-soam-pm:frame-delay-two-way>"
+            + "<msea-soam-pm:inter-frame-delay-variation-two-way>101</msea-soam-pm:inter-frame-delay-variation-two-way>"
+//            + "<msea-soam-pm:current-stats>"
+//            + "</msea-soam-pm:current-stats>"
+//            + "<msea-soam-pm:history-stats>"
+//            + "</msea-soam-pm:history-stats>"
+            + "</msea-soam-pm:delay-measurement>"
+            + "</msea-soam-pm:delay-measurements>"
+            + "</maintenance-association-end-point>"
             + "</maintenance-association>"
             + "</maintenance-domain>"
             + "</mef-cfm>"
@@ -966,6 +1157,9 @@
         } else if (sampleXmlRegex2.matcher(request).matches()) {
             return SAMPLE_SYSTEM_REPLY_INIT;
 
+        } else if (sampleXmlRegexSaFilteringErrorScenario.matcher(request).matches()) {
+            return SAMPLE_ERROR_REPLY;
+
         } else if (sampleXmlRegexSaFiltering.matcher(request).matches()) {
             return SAMPLE_MSEASAFILTERING_FE_REPLY;
 
@@ -1009,7 +1203,25 @@
             return SAMPLE_REPLY_OK;
 
         } else if (sampleXmlRegexGetMseaCfmEssentials.matcher(request).matches()) {
-            return SAMPLE_MSEACFM_MD_MA_MEP_REPLY2;
+            return SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY;
+
+        } else if (sampleXmlRegexGetMseaCfmFull.matcher(request).matches()) {
+            return SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY;
+
+        } else if (sampleXmlRegexDeleteMseaCfmMep.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexGetMseaDelay.matcher(request).matches()) {
+            return SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY;
+
+        } else if (sampleXmlRegexEditConfigDmCreate.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexTransmitLoopback.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexAbortLoopback.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
 
         } else {
             throw new NetconfException("MocknetconfSession. No sendRequest() case for query: " +
diff --git a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
index 2908d53..fe99bf3 100644
--- a/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
+++ b/drivers/microsemi/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -26,18 +26,42 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.MseaCfmNetconfService.DmEntryParts;
 import org.onosproject.drivers.microsemi.yang.impl.MseaCfmManager;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil2;
+import org.onosproject.drivers.microsemi.yang.utils.MepIdUtil3;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MdIdCharStr;
+import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MepId;
+import org.onosproject.incubator.net.l2monitoring.cfm.service.CfmConfigException;
+import org.onosproject.incubator.net.l2monitoring.soam.SoamId;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.ietfyangtypes.rev20130715.ietfyangtypes.MacAddress;
 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.abortloopback.AbortLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.abortloopback.DefaultAbortLoopbackInput;
 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.maintenanceassociation.MaintenanceAssociationEndPoint;
 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.mseacfm.rev20160229.mseacfm.targetaddressgroup.AddressType;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMacAddress;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMepId;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.DefaultTransmitLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.TransmitLoopbackInput;
+import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.transmitloopbackinput.DefaultTargetAddress;
+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.gen.v1.mseasoampm.rev20160229.mseasoampm.sessionstatustype.SessionStatusTypeEnum;
 import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.MepIdType;
+import org.onosproject.yang.gen.v1.mseatypes.rev20160229.mseatypes.PriorityType;
 
 public class MseaCfmManagerTest {
 
@@ -52,7 +76,8 @@
         } catch (UncheckedIOException e) {
             fail(e.getMessage());
         }
-        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf",
+                Ip4Address.valueOf("1.2.3.4"), 830);
         session = new MockNetconfSessionEa1000(deviceInfo);
     }
 
@@ -61,13 +86,92 @@
     }
 
     @Test
-    public void testGetConfigMseaCfmEssentials() throws NetconfException {
-        MseaCfm mseaCfm = mseaCfmService.getMepEssentials("md-1", "ma-1-1", 1, session);
+    public void testGetConfigMseaCfmEssentials()
+            throws NetconfException, CfmConfigException {
+        MseaCfm mseaCfm = mseaCfmService.getMepEssentials(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1), session);
         assertNotNull(mseaCfm);
 
-        //See SAMPLE_MSEACFM_MD_MA_MEP_REPLY in MockNetconfSessionEa1000
+        //See SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY in MockNetconfSessionEa1000
         assertEquals(1, mseaCfm.mefCfm().maintenanceDomain().size());
-        assertEquals(2, mseaCfm.mefCfm().maintenanceDomain().get(0).mdLevel().uint8());
+    }
+
+    @Test
+    public void testGetConfigMseaCfmFull()
+            throws NetconfException, CfmConfigException {
+        MseaCfm mseaCfm = mseaCfmService.getMepFull(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1), session);
+        assertNotNull(mseaCfm);
+
+        //See SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY in MockNetconfSessionEa1000
+        assertEquals(1, mseaCfm.mefCfm().maintenanceDomain().size());
+        MaintenanceAssociationEndPoint mep = mseaCfm.mefCfm()
+                .maintenanceDomain().get(0)
+                .maintenanceAssociation().get(0)
+                .maintenanceAssociationEndPoint().get(0);
+        assertTrue(mep.administrativeState());
+        assertEquals("00:b0:ae:03:ff:31", mep.macAddress().toString());
+
+        org.onosproject.yang.gen.v1.mseasoamfm.rev20160229.mseasoamfm.mefcfm.maintenancedomain
+        .maintenanceassociation.maintenanceassociationendpoint
+        .AugmentedMseaCfmMaintenanceAssociationEndPoint augmentedMep =
+            MepIdUtil2.convertFmAugmentedMep(mep);
+
+        assertEquals("partially-active", augmentedMep.connectivityStatus().toString());
+        assertEquals("up", augmentedMep.interfaceStatus().enumeration().toString());
+    }
+
+    /**
+     * Driven by SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY.
+     * @throws NetconfException If there's a problem
+     */
+    @Test
+    public void testGetSoamDm() throws NetconfException {
+        MseaCfm mseaCfmWithDm = mseaCfmService.getSoamDm(
+                MdIdCharStr.asMdId("md-1"),
+                MaIdCharStr.asMaId("ma-1-1"),
+                MepId.valueOf((short) 1),
+                SoamId.valueOf(1),
+                DmEntryParts.ALL_PARTS, session);
+
+        assertNotNull(mseaCfmWithDm);
+        MaintenanceAssociationEndPoint mep = mseaCfmWithDm.mefCfm()
+            .maintenanceDomain().get(0)
+            .maintenanceAssociation().get(0)
+            .maintenanceAssociationEndPoint().get(0);
+
+        //Because of a checkstyle problem with typecasts including really long
+        //package names, this has to be handed off to a different class
+        org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.mefcfm.maintenancedomain
+        .maintenanceassociation.maintenanceassociationendpoint
+        .AugmentedMseaCfmMaintenanceAssociationEndPoint augmentedMep =
+                MepIdUtil.convertPmAugmentedMep(mep);
+
+        DelayMeasurement dm = augmentedMep.delayMeasurements().delayMeasurement().get(0);
+        assertEquals(true, dm.administrativeState());
+        assertTrue(dm.measurementEnable().get(3)); //frame-delay-two-way-bins
+        assertTrue(dm.measurementEnable().get(1)); //frame-delay-two-way-max
+
+        assertEquals(MessagePeriodEnum.YANGAUTOPREFIX3MS.name(), dm.messagePeriod().name());
+        assertEquals(6, dm.priority().uint8());
+        assertEquals(1000, dm.frameSize());
+        assertEquals(15, dm.measurementInterval());
+        assertEquals(32, dm.numberIntervalsStored());
+        assertEquals(SessionStatusTypeEnum.ACTIVE.name(),
+                dm.sessionStatus().enumeration().name());
+        assertEquals(100, dm.frameDelayTwoWay().uint32());
+        assertEquals(101, dm.interFrameDelayVariationTwoWay().uint32());
+
+        //The remoteMep of the DM is a choice, which for mepId is a leafref object
+        org.onosproject.yang.gen.v1.mseasoampm.rev20160229.mseasoampm.remotemepgroup.remotemep
+        .DefaultMepId remoteMepId = MepIdUtil3.convertPmRemoteMepToMepId(dm.remoteMep());
+        assertNotNull(remoteMepId);
+        assertEquals(10, ((MepIdType) remoteMepId.mepId()).uint16());
+
     }
 
     /**
@@ -91,20 +195,67 @@
     }
 
     @Test
-    public void testTransmitLoopback() throws NetconfException {
+    /**
+     * Using Remote remote MEP ID and all arguments.
+     */
+    public void testTransmitLoopback1() {
+        TransmitLoopbackInput lbTr1 = new DefaultTransmitLoopbackInput();
+        lbTr1.maintenanceDomain(Short.valueOf((short) 1));
+        lbTr1.maintenanceAssociation(Short.valueOf((short) 2));
+        lbTr1.maintenanceAssociationEndPoint(Short.valueOf((short) 3));
+
+        DefaultTargetAddress ta = new DefaultTargetAddress();
+        DefaultMepId mepId = new DefaultMepId();
+        mepId.mepId(MepIdType.of(4));
+        ta.addressType((AddressType) mepId);
+        lbTr1.targetAddress(ta);
+
+//        lbTr1.dataTlv(new byte[]{0x01, 0x02, 0x03}); Not supported in onos-yang-tools just yet
+        lbTr1.numberOfMessages(10);
+        lbTr1.vlanDropEligible(true);
+        lbTr1.vlanPriority(PriorityType.of((short) 1));
         try {
-            mseaCfmService.transmitLoopback(null, session);
-        } catch (UnsupportedOperationException e) {
-            assertTrue(e.getMessage().contains("Not yet implemented"));
+            mseaCfmService.transmitLoopback(lbTr1, session);
+        } catch (NetconfException e) {
+            fail("Calling of TransmitLoopback failed: " + e.getMessage());
+        }
+    }
+
+    @Test
+    /**
+     * Using Remote Mac address in place of remote MEP ID and fewer arguments.
+     */
+    public void testTransmitLoopback2() {
+        TransmitLoopbackInput lbTr2 = new DefaultTransmitLoopbackInput();
+
+        lbTr2.maintenanceDomain(Short.valueOf((short) 63));
+        lbTr2.maintenanceAssociation(Short.valueOf((short) 62));
+        lbTr2.maintenanceAssociationEndPoint(Short.valueOf((short) 61));
+
+        DefaultTargetAddress ta = new DefaultTargetAddress();
+        DefaultMacAddress macAddr = new DefaultMacAddress();
+        macAddr.macAddress(MacAddress.of("FF:EE:DD:CC:BB:AA"));
+        ta.addressType(macAddr);
+        lbTr2.targetAddress(ta);
+        try {
+            mseaCfmService.transmitLoopback(lbTr2, session);
+        } catch (NetconfException e) {
+            fail("Calling of TransmitLoopback failed: " + e.getMessage());
         }
     }
 
     @Test
     public void testAbortLoopback() throws NetconfException {
+        AbortLoopbackInput lbAbort = new DefaultAbortLoopbackInput();
+
+        lbAbort.maintenanceDomain((short) 70);
+        lbAbort.maintenanceAssociation((short) 71);
+        lbAbort.maintenanceAssociationEndPoint((short) 72);
+
         try {
-            mseaCfmService.abortLoopback(null, session);
-        } catch (UnsupportedOperationException e) {
-            assertTrue(e.getMessage().contains("Not yet implemented"));
+            mseaCfmService.abortLoopback(lbAbort, session);
+        } catch (NetconfException e) {
+            fail("Calling of AbortLoopback failed: " + e.getMessage());
         }
     }
 
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
index 1a3e779..29ac4a3 100644
--- 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
@@ -18,6 +18,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
+import static org.junit.Assert.assertTrue;
 
 import java.io.UncheckedIOException;
 import java.util.List;
@@ -85,6 +86,32 @@
         }
     }
 
+    /**
+     * See sampleXmlRegexSaFilteringErrorScenario in MockNetconfSessionEa1000.
+     */
+    @Test
+    public void testGetMseaSaFilteringMseaSaFilteringOpParamNetconfSessionError() {
+
+        SourceAddressRange sar = new DefaultSourceAddressRange();
+        sar.rangeId((short) 10);
+
+        InterfaceEth0 eth0 = new DefaultInterfaceEth0();
+        eth0.addToSourceAddressRange(sar);
+
+        SourceIpaddressFiltering sip = new DefaultSourceIpaddressFiltering();
+        sip.interfaceEth0(eth0);
+
+        MseaSaFilteringOpParam mseaSaFilteringConfig = new MseaSaFilteringOpParam();
+        mseaSaFilteringConfig.sourceIpaddressFiltering(sip);
+
+        try {
+            MseaSaFiltering result = mseaSaSvc.getMseaSaFiltering(mseaSaFilteringConfig, session);
+            fail("Should have thrown exception");
+        } catch (NetconfException ne) {
+            assertTrue(ne.getMessage().startsWith("NETCONF rpc-error"));
+        }
+    }
+
     @Test
     public void testSetMseaSaFilteringMseaSaFilteringOpParamNetconfSessionNcDsType() {
 
