Initial import of Microsemi Driver

Change-Id: I431d5f2c18e0b66a84c36273c3d9f0b84f223841

Added in BUCK files for building driver

Change-Id: I70681327f5b89f67e904c45d5974ab393652d51f

Corrected some syntax errors

Change-Id: I11150cc499c212005f80619e3900e747f1c23d96

Updated pom file to clean build

Change-Id: I6613ddc9e6802aa882e716cf04df210249870835

Added in utility functions for EA1000 Init

Change-Id: I51ffe0cf0daf9ffcea0e2479ee9982fcd1755440

Added YMS code to Microsemi Driver

Change-Id: I6f2a14e454c6909bf9e9f6025321c74c98c13c72

Updated driver to work with YMS and YCH

Change-Id: If7dbe3cd5bd1b6f902d09d6b2dc3895605d70f70

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

Change-Id: If1c5e8482b1f53f578a3b0b770accd50024111cf

Moved YMS calls over in to Yang Service implementation

Change-Id: I044aad06f1ef7452bc48e88987787a683666cd72

improved unit test for IetfSystemManager

Change-Id: I48fbf831e7e5ca0e1ef3de8288e56da1b5ebb7a4

Major changes to IetfSystemManager to work in live system

Change-Id: I6e3aa118ba422151f314b9a666860d90905c9929

Added in retry mechanism for DeviceDescription to wait for YCH

Change-Id: If8e0f2c2f315ffd6db15627a11382a00217dd262

Added in implementation of MseaSaFiltering and unit tests

Change-Id: I34bf888e0e732bd4664d1fb8ef5abb679b1506fe

Updated driver with unit tests for MseaSaFiltering

Change-Id: I7ea2407a546622ff55d1ab21610c45697546d632

Modified removeFlowRules of Ea1000FlowRuleProgrammable

Change-Id: Ibb4a555f61887a8e6e42af588bb42f7b70f58efb

Added in manager for MseaUniEvc service with unit tests

Change-Id: Idc5853f46051548973f52a0659f7f88982ff960c

Implemented getFlowEntries() for EVCs from EA1000

Change-Id: Ie85dadfa7760f0b30a9bdf6ccd09cca9f097fff9

Added in translation of FlowRules in to EVC on EA1000

Change-Id: Icfb65171c3300c96b3ca4e18cbd327f0ed2190be

Added in handling of FlowRule deletion including complex ceVlanMaps

Change-Id: I7fd0bb0ef04d1b40e4b7d6a6db7f7ee662329780

Updated Service entries for new onos-yang-tools

Change-Id: I44e655202f3a45073e1e16f83737caed6e01afa8

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

This reverts commit 642b550ef1de12ed59bad2eaa3a2da414d2e5e59.

Improved timeout mechanism for YANG model loading

Change-Id: If744ecd206372e822edf2b736c83226321a12256

Minor edits of EVC creation

Change-Id: Ib0a4763deaf6dce37625ba77f5095b39cd98272d

Added in CustomEvc and supporting classes

Change-Id: Iad60eb1bcd48d2aec55b894b2d419b51852c3b2f

Created CeVlanUtils to resolve loading problem

Change-Id: I0d63931ad2c5ad2725861ebc7dccc4d5fe7b9298

Modified startup check

Change-Id: I6e6bcfa7e615044cb08fe7ee2f8a6c8b89aabb21

Modified handlin of flow rules

Change-Id: I965a79c23298866122aeb94c6d9d584aafee3bd5

Fixed problem with ceVlanMap

Change-Id: If1458c35d0b95b5b25b6636f098292f9e91c06c6

Minor Pom edits

Change-Id: I5cefb18674aa04b1f50bd7e2306260c1c3ad3814

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

Change-Id: I32fdb34c4f476f495fe28e75d0f410aaf14e2ec1

Corrected error in removing 0 in CeVlanMapUtils

Change-Id: I8cd1fd02788b81c2613364d5639ef6e090057f80

Changes in YMS to accomodate EA1000 driver

Change-Id: I6ae2b9bd2be49eae8d4ad2f929dfe3214c514550
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java
new file mode 100644
index 0000000..c7b3e72
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/CeVlanMapUtilsTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+
+public class CeVlanMapUtilsTest {
+
+    @Test
+    public void testGetVlanSet() {
+        Short[] vlanArray = CeVlanMapUtils.getVlanSet("101:102");
+        assertEquals(2, vlanArray.length);
+
+        vlanArray = CeVlanMapUtils.getVlanSet("101:103,107,110:115");
+        assertEquals(10, vlanArray.length);
+
+        vlanArray = CeVlanMapUtils.getVlanSet("1:4095");
+        assertEquals(4095, vlanArray.length);
+    }
+
+    @Test
+    public void testVlanListAsString() {
+        String ceVlanMap = CeVlanMapUtils.vlanListAsString(new Short[]{101, 102, 103});
+        assertEquals("101:103", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.vlanListAsString(new Short[]{0, 101, 104, 108});
+        assertEquals("101,104,108", ceVlanMap);
+    }
+
+    @Test
+    public void testAddtoCeVlanMap() {
+        String ceVlanMap = CeVlanMapUtils.addtoCeVlanMap("101:102", (short) 103);
+        assertEquals("101:103", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.addtoCeVlanMap("101:102", (short) 0);
+        assertEquals("101:102", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.addtoCeVlanMap("101:102", (short) 104);
+        assertEquals("101:102,104", ceVlanMap);
+    }
+
+    @Test
+    public void testRemoveZeroIfPossible() {
+        String ceVlanMap = CeVlanMapUtils.removeZeroIfPossible("101:102");
+        assertEquals("101:102", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.removeZeroIfPossible("0,101:102");
+        assertEquals("101:102", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.removeZeroIfPossible("0");
+        assertEquals("0", ceVlanMap);
+    }
+
+    @Test
+    public void testRemoveFromCeVlanMap() {
+        String ceVlanMap = CeVlanMapUtils.removeFromCeVlanMap("101:102", (short) 102);
+        assertEquals("101", ceVlanMap);
+
+        ceVlanMap = CeVlanMapUtils.removeFromCeVlanMap("101:103", (short) 102);
+        assertEquals("101,103", ceVlanMap);
+    }
+
+    @Test
+    public void testCombineVlanSets() {
+        assertEquals("101:104", CeVlanMapUtils.combineVlanSets("101:102", "103:104"));
+
+        assertEquals("101:103", CeVlanMapUtils.combineVlanSets("101:102", "103"));
+
+        assertEquals("101:102,104", CeVlanMapUtils.combineVlanSets("101:102", "104"));
+
+        assertEquals("99,101:102", CeVlanMapUtils.combineVlanSets("101:102", "99"));
+
+        assertEquals("101:102", CeVlanMapUtils.combineVlanSets("101:102", "0"));
+
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
new file mode 100644
index 0000000..c792b91
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/IetfSystemManagerTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+import java.text.ParseException;
+import java.time.OffsetDateTime;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.IetfSystemManager;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.system.AugmentedSysSystem;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.ietfsystemmicrosemi.systemstate.platform.AugmentedSysPlatform;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystem;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.DefaultSystem;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.System;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.Clock;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.DefaultClock;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.ietfsystem.system.clock.timezone.DefaultTimezoneName;
+import org.onosproject.yms.ymsm.YmsService;
+
+public class IetfSystemManagerTest {
+
+    IetfSystemManager sysSvc = null;
+    YmsService ymsService;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            sysSvc = new MockIetfSystemManager();
+            sysSvc.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        sysSvc.deactivate();
+    }
+
+    @Test
+    public void testGetIetfSystemSession() throws NetconfException {
+        Clock.ClockBuilder cBuilder = new DefaultClock.ClockBuilder();
+        Clock clock = cBuilder.build();
+
+        System.SystemBuilder sBuilder = new DefaultSystem.SystemBuilder();
+        System system = sBuilder.clock(clock).build();
+
+        IetfSystemOpParam.IetfSystemBuilder builder = new IetfSystemOpParam.IetfSystemBuilder();
+        IetfSystemOpParam sampleSystem = (IetfSystemOpParam) builder.system(system).build();
+
+        IetfSystem sys = sysSvc.getIetfSystem(sampleSystem, session);
+        assertNotNull(sys);
+
+        assertEquals(sys.system().clock().timezone().getClass(), DefaultTimezoneName.class);
+        DefaultTimezoneName tzName = (DefaultTimezoneName) sys.system().clock().timezone();
+        assertEquals("Etc/UTC", tzName.timezoneName().string());
+    }
+
+    @Test
+    public void testGetIetfSystemInit() throws NetconfException {
+
+        IetfSystem sys = sysSvc.getIetfSystemInit(session);
+        assertNotNull(sys);
+        assertNotNull(sys.system());
+
+        AugmentedSysSystem sysSystem = (AugmentedSysSystem) sys.system().yangAugmentedInfo(AugmentedSysSystem.class);
+
+        assertEquals("-8.4683990", sysSystem.longitude().toPlainString());
+        assertEquals("51.9036140", sysSystem.latitude().toPlainString());
+        assertEquals("4.4.0-53-generic", sys.systemState().platform().osRelease());
+
+        AugmentedSysPlatform sysSystemState =
+                (AugmentedSysPlatform) sys.systemState().platform().yangAugmentedInfo(AugmentedSysPlatform.class);
+
+        assertEquals("Eagle Simulator.", sysSystemState.deviceIdentification().serialNumber());
+    }
+
+    @Test
+    public void testSetCurrentDatetime() throws NetconfException, ParseException {
+        sysSvc.setCurrentDatetime(OffsetDateTime.now(), session);
+        //Look at MockNetconfSessionEa1000::sampleXmlRegexSetCurrentDatetime() for catching an error
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
new file mode 100644
index 0000000..49723f0
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockIetfSystemManager.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+
+import org.onosproject.drivers.microsemi.yang.impl.IetfSystemManager;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.system.rev20160505.IetfSystemMicrosemiService;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.system.rev20140806.IetfSystemService;
+import org.onosproject.yms.app.yab.MockYmsManager;
+
+public class MockIetfSystemManager extends IetfSystemManager {
+
+    @Override
+    public void activate() {
+        try {
+            ymsService = new MockYmsManager();
+            ych = ymsService.getYangCodecHandler();
+            ych.addDeviceSchema(IetfSystemService.class);
+            ych.addDeviceSchema(IetfSystemMicrosemiService.class);
+        } catch (InstantiationException | IllegalAccessException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            e.printStackTrace();
+        } catch (IOException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
new file mode 100644
index 0000000..af34a02
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaCfmManager.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+
+import org.onosproject.drivers.microsemi.yang.impl.MseaCfmManager;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfmService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.soam.fm.rev20160229.MseaSoamFmService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.soam.pm.rev20160229.MseaSoamPmService;
+import org.onosproject.yms.app.yab.MockYmsManager;
+
+public class MockMseaCfmManager extends MseaCfmManager {
+
+    @Override
+    public void activate() {
+        try {
+            ymsService = new MockYmsManager();
+            ych = ymsService.getYangCodecHandler();
+            ych.addDeviceSchema(MseaCfmService.class);
+            ych.addDeviceSchema(MseaSoamFmService.class);
+            ych.addDeviceSchema(MseaSoamPmService.class);
+        } catch (InstantiationException | IllegalAccessException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            e.printStackTrace();
+        } catch (IOException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
new file mode 100644
index 0000000..60aae90
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaSaFilteringManager.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+
+import org.onosproject.drivers.microsemi.yang.impl.MseaSaFilteringManager;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringService;
+import org.onosproject.yms.app.yab.MockYmsManager;
+
+public class MockMseaSaFilteringManager extends MseaSaFilteringManager {
+
+    @Override
+    public void activate() {
+        try {
+            ymsService = new MockYmsManager();
+            ych = ymsService.getYangCodecHandler();
+            ych.addDeviceSchema(MseaSaFilteringService.class);
+        } catch (InstantiationException | IllegalAccessException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            e.printStackTrace();
+        } catch (IOException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
new file mode 100644
index 0000000..c715e78
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockMseaUniEvcServiceManager.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+
+import org.onosproject.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceService;
+import org.onosproject.yms.app.yab.MockYmsManager;
+
+public class MockMseaUniEvcServiceManager extends MseaUniEvcServiceManager {
+    @Override
+    public void activate() {
+        try {
+            ymsService = new MockYmsManager();
+            ych = ymsService.getYangCodecHandler();
+            ych.addDeviceSchema(MseaUniEvcServiceService.class);
+        } catch (InstantiationException | IllegalAccessException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            e.printStackTrace();
+        } catch (IOException e) {
+            log.error("Failed to load YMS Manager: " + e.getMessage());
+            throw new UncheckedIOException(e);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
new file mode 100644
index 0000000..19a291e
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MockNetconfSessionEa1000.java
@@ -0,0 +1,1076 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfDeviceOutputEventListener;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MockNetconfSessionEa1000 implements NetconfSession {
+    private static final Logger log = LoggerFactory
+            .getLogger(MockNetconfSessionEa1000.class);
+
+    private static final String MESSAGE_ID_STRING = "message-id";
+    private static final String EQUAL = "=";
+    private static final String RPC_OPEN = "<rpc ";
+    private static final String RPC_CLOSE = "</rpc>";
+    private static final String GET_OPEN = "<get>";
+    private static final String GET_CLOSE = "</get>";
+    private static final String NEW_LINE = "\n";
+    private static final String SUBTREE_FILTER_OPEN = "<filter type=\"subtree\">";
+    private static final String SUBTREE_FILTER_CLOSE = "</filter>";
+    private static final String WITH_DEFAULT_OPEN = "<with-defaults ";
+    private static final String WITH_DEFAULT_CLOSE = "</with-defaults>";
+    private static final String EDIT_CONFIG_OPEN = "<edit-config>";
+    private static final String EDIT_CONFIG_CLOSE = "</edit-config>";
+    private static final String TARGET_OPEN = "<target>";
+    private static final String TARGET_CLOSE = "</target>";
+    private static final String DEFAULT_OPERATION_OPEN = "<default-operation>";
+    private static final String DEFAULT_OPERATION_CLOSE = "</default-operation>";
+    private static final String CONFIG_OPEN = "<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">";
+    private static final String CONFIG_CLOSE = "</config>";
+
+    private static final String ENDPATTERN = "]]>]]>";
+    private static final String XML_HEADER =
+            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+    private static final String NETCONF_BASE_NAMESPACE =
+            "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"";
+    private static final String NETCONF_WITH_DEFAULTS_NAMESPACE =
+            "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\"";
+
+
+    private Pattern sampleXmlRegex1 =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<get>).*(<filter).*"
+                    + "(<system).*(<clock/>).*(</system>).*(</filter>)*.(</get>).*(</rpc).*(]]>){2}",
+                    Pattern.DOTALL);
+
+    private Pattern sampleXmlRegex2 =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<get>).*(<filter).*(<system-state).*(</system-state>).*"
+                    + "(<system).*(</system>).*(</filter>).*(</get>).*(</rpc).*(]]>){2}",
+                    Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexSaFiltering =
+            Pattern.compile("(<\\?xml).*"
+                    + "(<rpc).*(<get>).*"
+                    + "(<filter type=\"subtree\">).*(<source-ipaddress-filtering).*"
+                    + "(</filter>).*(</get>).*(</rpc>).*"
+                    + "(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditConfigSaFilt =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
+                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+                    + "(<source-ipaddress-filtering).*(<interface-eth0>).*"
+                    + "(<source-address-range>).*(<range-id>).*(</range-id>).*"
+                    + "(<name>).*(</name>).*(<ipv4-address-prefix>).*(</ipv4-address-prefix>).*"
+                    + "(</source-address-range>).*(</interface-eth0>)*(</source-ipaddress-filtering>).*"
+                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditDeleteSaFilt =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
+                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+                    + "(<source-ipaddress-filtering "
+                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">).*"
+                    + "(<interface-eth0>).*"
+                    + "(<source-address-range nc:operation=\"delete\">).*(<range-id>).*(</range-id>).*"
+                    + "(</source-address-range>).*"
+                    + "(<source-address-range nc:operation=\"delete\">).*(<range-id>).*(</range-id>).*"
+                    + "(</source-address-range>).*"
+                    + "(</interface-eth0>).*(</source-ipaddress-filtering>).*"
+                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexUniEvc =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
+                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
+                    + "(<filter type=\"subtree\">)\\R?"
+                    + "(<mef-services "
+                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\"/>)\\R?"
+                    + "(</filter>)\\R?(</get-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexUniEvcUni =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
+                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
+                    + "(<filter type=\"subtree\">)\\R?"
+                    + "(<mef-services "
+                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
+                    + "(<uni/>)\\R?"
+                    + "(</mef-services>)\\R?"
+                    + "(</filter>)\\R?(</get-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditConfigUni1Evc =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target><running/></target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-services).*(<uni>)\\R?(<name>).*(</name>)\\R?"
+                    + "(<evc>)\\R?(<evc-index>).*(</evc-index>)\\R?(<name>).*(</name>)\\R?"
+                    + "(<evc-per-uni>)\\R?"
+                    + "(<evc-per-uni-c>)\\R?"
+                    + "(<ce-vlan-map>).*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>).*(</ingress-bwp-group-index>)\\R?"
+                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?(<outer-tag-vlan>).*"
+                    + "(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
+                    + "((<flow-mapping>)\\R?"
+                    + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
+                    + "(<flow-id>)[0-9]*(</flow-id>)\\R?"
+                    + "(</flow-mapping>)\\R?)*"
+                    + "(</evc-per-uni-c>)\\R?"
+                    + "(<evc-per-uni-n>)\\R?"
+                    + "(<ce-vlan-map>).*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>).*(</ingress-bwp-group-index>)\\R?"
+                    + "(<tag-pop).*"
+                    + "((<flow-mapping>)\\R?"
+                    + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
+                    + "(<flow-id>)[0-9]*(</flow-id>)\\R?"
+                    + "(</flow-mapping>)\\R?)*"
+                    + "(</evc-per-uni-n>)\\R?"
+                    + "(</evc-per-uni>)\\R?"
+                    + "(</evc>)\\R?"
+                    + "(</uni>).*"
+                    + "(</mef-services>)\\R?"
+                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditConfigUni2Evc =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
+                    + "(<target><running/></target>)\\R?"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
+                    + "(<mef-services).*(<uni>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
+                    + "(<evc>)\\R?(<evc-index>)[0-9]*(</evc-index>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
+                    + "(<evc-per-uni>)\\R?"
+                    + "(<evc-per-uni-c>)\\R?"
+                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
+                    + "(</evc-per-uni-c>)\\R?"
+                    + "(<evc-per-uni-n>)\\R?"
+                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
+                    + "(<evc-per-uni-service-type>).*(</evc-per-uni-service-type>)\\R?"
+                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?(<outer-tag-vlan>).*"
+                    + "(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
+                    + "(</evc-per-uni-n>)\\R?"
+                    + "(</evc-per-uni>)\\R?"
+                    + "(</evc>)\\R?"
+                    + "(<evc>)\\R?(<evc-index>)[0-9]*(</evc-index>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
+                    + "(<evc-per-uni>)\\R?"
+                    + "(<evc-per-uni-c>)\\R?"
+                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
+                    + "(</evc-per-uni-c>)\\R?"
+                    + "(<evc-per-uni-n>)\\R?"
+                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
+                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
+                    + "(</evc-per-uni-n>)\\R?"
+                    + "(</evc-per-uni>)\\R?"
+                    + "(</evc>)\\R?(</uni>).*"
+                    + "(</mef-services>)\\R?"
+                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditConfigUniProfiles =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
+                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+                    + "(<mef-services).*(<profiles>).*"
+                    + "(<bwp-group>).*(<group-index>).*(</group-index>).*(</bwp-group>).*"
+                    + "(<bwp-group>).*(<group-index>).*(</group-index>).*"
+                    + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
+                    + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
+                    + "(</bwp-group>).*"
+                    + "(</profiles>).*(</mef-services>).*"
+                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexEditConfigEvcDelete =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
+                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+                    + "(<mef-services).*"
+                    + "(<uni>).*"
+                    + "(<evc nc:operation=\"delete\">).*(<evc-index>).*(</evc-index>).*(</evc>).*"
+                    + "(</uni>).*"
+                    + "(</mef-services>).*"
+                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexGetConfigCeVlanMapsEvc =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
+                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
+                    + "(<filter type=\"subtree\">)\\R?"
+                    + "(<mef-services).*"
+                    + "(<uni>)\\R?"
+                    + "(<evc>)\\R?"
+                    + "(<evc-index/>)\\R?"
+                    + "(<evc-per-uni>)\\R?"
+                    + "(<evc-per-uni-c><ce-vlan-map/><flow-mapping/><ingress-bwp-group-index/></evc-per-uni-c>)\\R?"
+                    + "(<evc-per-uni-n><ce-vlan-map/><flow-mapping/><ingress-bwp-group-index/></evc-per-uni-n>)\\R?"
+                    + "(</evc-per-uni>)\\R?"
+                    + "(</evc>)\\R?"
+                    + "(</uni>)\\R?"
+                    + "(</mef-services>)\\R?"
+                    + "(</filter>)\\R?"
+                    + "(</get-config>)\\R?"
+                    + "(</rpc>)\\R?"
+                    + "(]]>){2}", Pattern.DOTALL);
+
+    //For test testRemoveEvcUniFlowEntries()
+    private Pattern sampleXmlRegexEditConfigCeVlanMapReplace =
+            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
+                    + "(<target><running/></target>).*"
+                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
+                    + "(<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">).*"
+                    + "(<uni>).*"
+                    + "(<evc nc:operation=\"delete\">).*(<evc-index>.*</evc-index>).*(</evc>).*"
+                    + "(<evc nc:operation=\"delete\">).*(<evc-index>.*</evc-index>).*(</evc>).*"
+                    + "(<evc>).*(<evc-index>).*(</evc-index>).*(<evc-per-uni>).*"
+                    + "(<evc-per-uni-c>).*"
+                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
+                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
+                    + "(</evc-per-uni-c>).*"
+                    + "(<evc-per-uni-n>).*"
+                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
+                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
+                    + "(</evc-per-uni-n>).*"
+                    + "(</evc-per-uni>).*(</evc>).*"
+                    + "(<evc>).*(<evc-index>).*(</evc-index>).*(<evc-per-uni>).*"
+                    + "(<evc-per-uni-c>).*"
+                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
+                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
+                    + "(</evc-per-uni-c>).*"
+                    + "(<evc-per-uni-n>).*"
+                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
+                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
+                    + "(</evc-per-uni-n>).*"
+                    + "(</evc-per-uni>).*(</evc>).*"
+                    + "(</uni>).*(</mef-services>).*"
+                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);
+
+
+    //For testPerformMeterOperationDeviceIdMeterAdd()
+    private Pattern sampleXmlRegexEditConfigBwpGroup1 =
+            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-services "
+                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
+                    + "(<profiles>)\\R?"
+                    + "(<bwp-group>)\\R?"
+                    + "(<group-index>)[0-9]*(</group-index>)\\R?"
+                    + "(<bwp>)\\R?"
+                    + "(<cos-index>)[0-9]*(</cos-index>)\\R?"
+                    + "(<name>).*(</name>)\\R?"
+                    + "(<committed-information-rate>)[0-9]*(</committed-information-rate>)\\R?"
+                    + "(<committed-burst-size>)[0-9]*(</committed-burst-size>)\\R?"
+                    + "(<excess-information-rate>)[0-9]*(</excess-information-rate>)\\R?"
+                    + "(<excess-burst-size>)[0-9]*(</excess-burst-size>)\\R?"
+                    + "(</bwp>)\\R?"
+                    + "(</bwp-group>)\\R?"
+                    + "(<cos>)\\R?"
+                    + "(<cos-index>)[0-9](</cos-index>)\\R?"
+                    + "(<name>).*(</name>)\\R?"
+                    + "(<outgoing-cos-value>)[0-9]*(</outgoing-cos-value>)\\R?"
+                    + "(<color-aware>true</color-aware>)\\R?"
+                    + "(<color-forward>true</color-forward>)\\R?"
+                    + "(<evc-cos-type-all-8-prio-to-1-evc-color>)\\R?"
+                    + "(<evc-all-8-color-to>green</evc-all-8-color-to>)\\R?"
+                    + "(</evc-cos-type-all-8-prio-to-1-evc-color>)\\R?"
+                    + "(</cos>)\\R?"
+                    + "(</profiles>)\\R?"
+                    + "(</mef-services>)\\R?"
+                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    //For testPerformMeterOperationDeviceIdMeterRemove()
+    private Pattern sampleXmlRegexEditConfigBwpGroup1Delete =
+    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-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
+            + "(<profiles>)\\R?"
+            + "(<bwp-group nc:operation=\"delete\">)\\R?"
+            + "(<group-index>)[0-9]*(</group-index>)\\R?"
+            + "(</bwp-group>)\\R?"
+            + "(</profiles>)\\R?"
+            + "(</mef-services>)\\R?"
+            + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    private Pattern sampleXmlRegexSetCurrentDatetime =
+    Pattern.compile("(<\\?xml).*(<rpc).*"
+            + "(<set-current-datetime xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">)\\R?"
+            + "(<current-datetime>)"
+            + "[0-9]{4}-[0-9]{2}-[0-9]{2}(T)[0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2}"
+            + "(</current-datetime>)\\R?"
+            + "(</set-current-datetime>)\\R?"
+            + "(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);
+
+    //For testGetConfigMseaCfmEssentials
+    private Pattern sampleXmlRegexGetMseaCfmEssentials =
+            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?"
+                    // rpc.append("<ccm-interval>10ms</ccm-interval>\n"); //Have to omit for the moment - YMS problem
+                    + "(<remote-meps/>)\\R?"
+                    + "(<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?"
+                    // rpc.append("<msea-soam-fm:last-defect-sent/>\n");//Have to omit for the moment - YMS problem
+                    + "(<msea-soam-fm:rdi-transmit-status/>)\\R?"
+                    + "(<loopback/>)\\R?"
+                    + "(<remote-mep-database/>)\\R?"
+                    + "(<linktrace/>)\\R?"
+                    + "(</maintenance-association-end-point>)\\R?"
+                    + "(</maintenance-association>)\\R?"
+                    + "(</maintenance-domain>)\\R?"
+                    + "(</mef-cfm>)\\R?"
+                    + "(</filter>)\\R?"
+                    + "(</get>)\\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"
+            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+            + "<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">\n"
+            + "<clock><timezone-name>Etc/UTC</timezone-name></clock>\n"
+            + "</system>\n"
+            + "</data>\n"
+            + "</rpc-reply>";
+
+    private static final String SAMPLE_SYSTEM_REPLY_INIT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">"
+            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+            + "<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">\n"
+            + "<longitude xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">-8.4683990</longitude>\n"
+            + "<latitude xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">51.9036140</latitude>\n"
+            + "</system>\n"
+            + "<system-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\""
+            + " xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">\n"
+            + "<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:device-identification>\n"
+            + "</platform>\n"
+            + "</system-state>\n"
+            + "</data>"
+            + "</rpc-reply>";
+
+    private static final String SAMPLE_MSEASAFILTERING_FE_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"
+            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+            + "<source-ipaddress-filtering "
+            + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">\n"
+            + "<interface-eth0>\n"
+            + "<filter-admin-state>inactive</filter-admin-state>\n"
+            + "<source-address-range>\n"
+            + "<range-id>1</range-id>\n"
+            + "<ipv4-address-prefix>10.10.10.10/16</ipv4-address-prefix>\n"
+            + "<name>Filter1</name>\n"
+            + "</source-address-range>\n"
+            + "<source-address-range>\n"
+            + "<range-id>2</range-id>\n"
+            + "<ipv4-address-prefix>20.30.40.50/18</ipv4-address-prefix>\n"
+            + "<name>Flow:5e0000abaa2772</name>\n"
+            + "</source-address-range>\n"
+            + "</interface-eth0>\n"
+            + "</source-ipaddress-filtering>\n"
+            + "</data>\n"
+            + "</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"
+            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\"/>"
+            + "</data>\n"
+            + "</rpc-reply>";
+
+    private static final String SAMPLE_MSEAEVCUNI_FE_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"
+            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n"
+            + "<uni>\n"
+            + "<name>Flow:7557655abfecd57865</name>\n"
+            + "<evc>\n"
+            + "<evc-index>7</evc-index\n>"
+            + "<name>evc-7</name>\n"
+            + "<evc-per-uni>\n"
+            + "<evc-per-uni-c>\n"
+            + "<ce-vlan-map>10</ce-vlan-map>\n"
+            + "<ingress-bwp-group-index>1</ingress-bwp-group-index>\n"
+            + "<tag-push>\n"
+            + "<push-tag-type>pushStag</push-tag-type>\n"
+            + "<outer-tag-vlan>3</outer-tag-vlan>\n"
+            + "</tag-push>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>10</ce-vlan-id>\n"
+            + "<flow-id>27021600672053710</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<evc-per-uni-service-type>epl</evc-per-uni-service-type>\n"
+            + "</evc-per-uni-c>\n"
+            + "<evc-per-uni-n>\n"
+            + "<ce-vlan-map>11</ce-vlan-map>\n"
+            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>11</ce-vlan-id>\n"
+            + "<flow-id>27021600672053711</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-n>\n"
+            + "</evc-per-uni>\n"
+            + "<uni-evc-id>EA1000-Uni-from-ONOS_5</uni-evc-id>\n"
+            + "<evc-status>\n"
+            + "<operational-state>unknown</operational-state>\n"
+            + "<max-mtu-size>9600</max-mtu-size>\n"
+            + "<max-num-uni>2</max-num-uni>\n"
+            + "</evc-status>\n"
+            + "</evc>\n"
+            + "<evc>\n"
+            + "<evc-index>8</evc-index>\n"
+            + "<name>evc-8</name>\n"
+            + "<evc-per-uni>\n"
+            + "<evc-per-uni-c>\n"
+            + "<ce-vlan-map>12:14,20:22,25</ce-vlan-map>\n"
+            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
+            + "<tag-pop />\n"
+            + "<evc-per-uni-service-type>epl</evc-per-uni-service-type>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>12</ce-vlan-id>\n"
+            + "<flow-id>27021600672053712</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>13</ce-vlan-id>\n"
+            + "<flow-id>27021600672053713</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>14</ce-vlan-id>\n"
+            + "<flow-id>27021600672053714</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>20</ce-vlan-id>\n"
+            + "<flow-id>27021600672053720</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>21</ce-vlan-id>\n"
+            + "<flow-id>27021600672053721</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>22</ce-vlan-id>\n"
+            + "<flow-id>27021600672053722</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>25</ce-vlan-id>\n"
+            + "<flow-id>27021600672053725</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-c>\n"
+            + "<evc-per-uni-n>\n"
+            + "<ce-vlan-map>13</ce-vlan-map>\n"
+            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>13</ce-vlan-id>\n"
+            + "<flow-id>27021600672053713</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-n>\n"
+            + "</evc-per-uni>\n"
+            + "<uni-evc-id>EA1000-Uni-from-ONOS_5</uni-evc-id>\n"
+            + "<evc-status>\n"
+            + "<operational-state>unknown</operational-state>\n"
+            + "<max-mtu-size>9600</max-mtu-size>\n"
+            + "<max-num-uni>2</max-num-uni>\n"
+            + "</evc-status>\n"
+            + "</evc>\n"
+            + "</uni>\n"
+            + "<profiles>\n"
+            + "<bwp-group>\n"
+            + "<group-index>0</group-index>\n"
+            + "</bwp-group>\n"
+            + "</profiles>\n"
+            + "</mef-services>\n"
+            + "</data>\n"
+            + "</rpc-reply>";
+
+    private static final String SAMPLE_MSEAEVCUNI_CEVLANMAP_EVC_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"
+            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
+            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n"
+            + "<uni>\n"
+
+            + "<evc><evc-index>1</evc-index>\n"
+            + "<evc-per-uni>\n"
+            + "<evc-per-uni-c>\n"
+            + "<ce-vlan-map>101</ce-vlan-map>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>101</ce-vlan-id>\n"
+            + "<flow-id>27021598629213101</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-c>\n"
+            + "<evc-per-uni-n>\n"
+            + "<ce-vlan-map>102</ce-vlan-map>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>102</ce-vlan-id>\n"
+            + "<flow-id>27021598629213102</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-n>\n"
+            + "</evc-per-uni>\n"
+            + "</evc>\n"
+
+            + "<evc><evc-index>7</evc-index>\n"
+            + "<evc-per-uni>\n"
+            + "<evc-per-uni-c>\n"
+            + "<ce-vlan-map>700,710,720</ce-vlan-map>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>700</ce-vlan-id>\n"
+            + "<flow-id>27021598629213700</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>710</ce-vlan-id>\n"
+            + "<flow-id>27021598629213710</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>720</ce-vlan-id>\n"
+            + "<flow-id>27021598629213720</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-c>\n"
+            + "<evc-per-uni-n>\n"
+            + "<ce-vlan-map>701:703</ce-vlan-map>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>701</ce-vlan-id>\n"
+            + "<flow-id>27021598629213701</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>702</ce-vlan-id>\n"
+            + "<flow-id>27021598629213702</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "<flow-mapping>\n"
+            + "<ce-vlan-id>703</ce-vlan-id>\n"
+            + "<flow-id>27021598629213703</flow-id>\n"
+            + "</flow-mapping>\n"
+            + "</evc-per-uni-n>\n"
+            + "</evc-per-uni>\n"
+            + "</evc>\n"
+
+            + "<evc><evc-index>8</evc-index>\n"
+            + "<evc-per-uni>\n"
+            + "<evc-per-uni-c>\n<ce-vlan-map>800,810,820</ce-vlan-map>\n</evc-per-uni-c>\n"
+            + "<evc-per-uni-n>\n<ce-vlan-map>801:803</ce-vlan-map>\n</evc-per-uni-n>\n"
+            + "</evc-per-uni>\n"
+            + "</evc>\n"
+
+            + "</uni>\n"
+            + "</mef-services>\n"
+            + "</data>\n"
+            + "</rpc-reply>";
+
+    private static final String SAMPLE_MSEACFM_MD_MA_MEP_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>"
+            + "<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>"
+            + "<remote-mep-database>"
+            + "<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>"
+            + "</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 =
+            "<?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>Microsemi</name>"
+            + "<md-level>2</md-level>"
+            + "<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>"
+            + "<maintenance-association-end-point>"
+            + "<mep-identifier>4</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>defect-reported</fng-state>"
+            + "<highest-priority-defect-found>remote-invalid-ccm</highest-priority-defect-found>"
+//            + "<active-defects> remote-invalid-ccm</active-defects>"
+            + "<active-defects/>"
+            + "<ccm-sequence-error-count>0</ccm-sequence-error-count>"
+            + "<sent-ccms>41013</sent-ccms>"
+            + "</continuity-check>"
+            + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
+            + "<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: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_REPLY_OK = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"2\">"
+            + "<ok/>"
+            + "</rpc-reply>";
+
+    private NetconfDeviceInfo deviceInfo;
+
+    private final AtomicInteger messageIdInteger = new AtomicInteger(0);
+
+    public MockNetconfSessionEa1000(NetconfDeviceInfo deviceInfo) throws NetconfException {
+        this.deviceInfo = deviceInfo;
+    }
+
+    @Override
+    public CompletableFuture<String> request(String request) throws NetconfException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String get(String request) throws NetconfException {
+
+        return sendRequest(request);
+    }
+
+    @Override
+    public String get(String filterSchema, String withDefaultsMode) throws NetconfException {
+        StringBuilder rpc = new StringBuilder(XML_HEADER);
+        rpc.append(RPC_OPEN);
+        rpc.append(MESSAGE_ID_STRING);
+        rpc.append(EQUAL);
+        rpc.append("\"");
+        rpc.append(messageIdInteger.get());
+        rpc.append("\"  ");
+        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
+        rpc.append(GET_OPEN).append(NEW_LINE);
+        if (filterSchema != null) {
+            rpc.append(SUBTREE_FILTER_OPEN).append(NEW_LINE);
+            rpc.append(filterSchema).append(NEW_LINE);
+            rpc.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
+        }
+        if (withDefaultsMode != null) {
+            rpc.append(WITH_DEFAULT_OPEN).append(NETCONF_WITH_DEFAULTS_NAMESPACE).append(">");
+            rpc.append(withDefaultsMode).append(WITH_DEFAULT_CLOSE).append(NEW_LINE);
+        }
+        rpc.append(GET_CLOSE).append(NEW_LINE);
+        rpc.append(RPC_CLOSE).append(NEW_LINE);
+        rpc.append(ENDPATTERN);
+        String reply = sendRequest(rpc.toString());
+        checkReply(reply);
+        return reply;
+    }
+
+    @Override
+    public String doWrappedRpc(String request) throws NetconfException {
+        StringBuilder rpc = new StringBuilder(XML_HEADER);
+        rpc.append(RPC_OPEN);
+        rpc.append(MESSAGE_ID_STRING);
+        rpc.append(EQUAL);
+        rpc.append("\"");
+        rpc.append(messageIdInteger.get());
+        rpc.append("\"  ");
+        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
+        rpc.append(request);
+        rpc.append(RPC_CLOSE).append(NEW_LINE);
+        rpc.append(ENDPATTERN);
+        String reply = sendRequest(rpc.toString());
+        checkReply(reply);
+        return reply;
+    }
+
+    @Override
+    public String requestSync(String request) throws NetconfException {
+        if (!request.contains(ENDPATTERN)) {
+            request = request + NEW_LINE + ENDPATTERN;
+        }
+        String reply = sendRequest(request);
+        checkReply(reply);
+        return reply;
+    }
+
+    @Override
+    public String getConfig(String targetConfiguration) throws NetconfException {
+        return getConfig(TargetConfig.valueOf(targetConfiguration), null);
+    }
+
+    @Override
+    public String getConfig(String targetConfiguration, String configurationSchema) throws NetconfException {
+        return getConfig(TargetConfig.valueOf(targetConfiguration), null);
+    }
+
+    @Override
+    public String getConfig(TargetConfig targetConfiguration) throws NetconfException {
+        return getConfig(targetConfiguration, null);
+    }
+
+    @Override
+    public String getConfig(TargetConfig targetConfiguration, String configurationSchema) throws NetconfException {
+        StringBuilder rpc = new StringBuilder(XML_HEADER);
+        rpc.append("<rpc ");
+        rpc.append(MESSAGE_ID_STRING);
+        rpc.append(EQUAL);
+        rpc.append("\"");
+        rpc.append(messageIdInteger.get());
+        rpc.append("\"  ");
+        rpc.append("xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n");
+        rpc.append("<get-config>\n");
+        rpc.append("<source>\n");
+        rpc.append("<").append(targetConfiguration).append("/>");
+        rpc.append("</source>");
+        if (configurationSchema != null) {
+            rpc.append("<filter type=\"subtree\">\n");
+            rpc.append(configurationSchema).append("\n");
+            rpc.append("</filter>\n");
+        }
+        rpc.append("</get-config>\n");
+        rpc.append("</rpc>\n");
+        rpc.append(ENDPATTERN);
+        String reply = sendRequest(rpc.toString());
+        return checkReply(reply) ? reply : "ERROR " + reply;
+    }
+
+    @Override
+    public boolean editConfig(String newConfiguration) throws NetconfException {
+        return editConfig(TargetConfig.RUNNING, null, newConfiguration);
+    }
+
+    @Override
+    public boolean editConfig(String targetConfiguration, String mode, String newConfiguration)
+            throws NetconfException {
+        return editConfig(TargetConfig.valueOf(targetConfiguration), mode, newConfiguration);
+    }
+    @Override
+    public boolean editConfig(TargetConfig targetConfiguration, String mode, String newConfiguration)
+            throws NetconfException {
+        newConfiguration = newConfiguration.trim();
+        StringBuilder rpc = new StringBuilder(XML_HEADER);
+        rpc.append(RPC_OPEN);
+        rpc.append(MESSAGE_ID_STRING);
+        rpc.append(EQUAL);
+        rpc.append("\"");
+        rpc.append(messageIdInteger.get());
+        rpc.append("\"  ");
+        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
+        rpc.append(EDIT_CONFIG_OPEN).append("\n");
+        rpc.append(TARGET_OPEN);
+        rpc.append("<").append(targetConfiguration).append("/>");
+        rpc.append(TARGET_CLOSE).append("\n");
+        if (mode != null) {
+            rpc.append(DEFAULT_OPERATION_OPEN);
+            rpc.append(mode);
+            rpc.append(DEFAULT_OPERATION_CLOSE).append("\n");
+        }
+        rpc.append(CONFIG_OPEN).append("\n");
+        rpc.append(newConfiguration);
+        rpc.append(CONFIG_CLOSE).append("\n");
+        rpc.append(EDIT_CONFIG_CLOSE).append("\n");
+        rpc.append(RPC_CLOSE);
+        rpc.append(ENDPATTERN);
+        log.debug(rpc.toString());
+        String reply = sendRequest(rpc.toString());
+        return checkReply(reply);
+    }
+
+    @Override
+    public boolean copyConfig(String targetConfiguration, String newConfiguration) throws NetconfException {
+        return copyConfig(TargetConfig.valueOf(targetConfiguration), newConfiguration);
+    }
+
+    @Override
+    public boolean copyConfig(TargetConfig targetConfiguration, String newConfiguration) throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean deleteConfig(String targetConfiguration) throws NetconfException {
+        return deleteConfig(TargetConfig.valueOf(targetConfiguration));
+    }
+
+    @Override
+    public boolean deleteConfig(TargetConfig targetConfiguration) throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void startSubscription() throws NetconfException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void startSubscription(String filterSchema) throws NetconfException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void endSubscription() throws NetconfException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public boolean lock(String configType) throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean unlock(String configType) throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean lock() throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean unlock() throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean close() throws NetconfException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String getSessionId() {
+        return "mockSessionId";
+    }
+
+    @Override
+    public String getServerCapabilities() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void setDeviceCapabilities(List<String> capabilities) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void addDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void removeDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
+        // TODO Auto-generated method stub
+
+    }
+
+    private boolean checkReply(String reply) throws NetconfException {
+        if (reply != null) {
+            if (!reply.contains("<rpc-error>")) {
+                log.debug("Device {} sent reply {}", deviceInfo, reply);
+                return true;
+            } else if (reply.contains("<ok/>")
+                    || (reply.contains("<rpc-error>")
+                    && reply.contains("warning"))) {
+                log.debug("Device {} sent reply {}", deviceInfo, reply);
+                return true;
+            }
+        }
+        log.warn("Device {} has error in reply {}", deviceInfo, reply);
+        return false;
+    }
+
+    private String sendRequest(String request) throws NetconfException {
+        log.info("Mocking NETCONF Session send request: \n" + request);
+
+        if (sampleXmlRegex1.matcher(request).matches()) {
+            return SAMPLE_SYSTEM_REPLY;
+
+        } else if (sampleXmlRegex2.matcher(request).matches()) {
+            return SAMPLE_SYSTEM_REPLY_INIT;
+
+        } else if (sampleXmlRegexSaFiltering.matcher(request).matches()) {
+            return SAMPLE_MSEASAFILTERING_FE_REPLY;
+
+        } else if (sampleXmlRegexEditConfigSaFilt.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditDeleteSaFilt.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexUniEvc.matcher(request).matches()) {
+            return SAMPLE_MSEAEVCUNI_REPLY_INIT;
+
+        } else if (sampleXmlRegexUniEvcUni.matcher(request).matches()) {
+            return SAMPLE_MSEAEVCUNI_FE_REPLY;
+
+        } else if (sampleXmlRegexEditConfigUni1Evc.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditConfigUni2Evc.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditConfigUniProfiles.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditConfigEvcDelete.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexGetConfigCeVlanMapsEvc.matcher(request).matches()) {
+            return SAMPLE_MSEAEVCUNI_CEVLANMAP_EVC_REPLY;
+
+        } else if (sampleXmlRegexEditConfigCeVlanMapReplace.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditConfigBwpGroup1.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexEditConfigBwpGroup1Delete.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexSetCurrentDatetime.matcher(request).matches()) {
+            return SAMPLE_REPLY_OK;
+
+        } else if (sampleXmlRegexGetMseaCfmEssentials.matcher(request).matches()) {
+            return SAMPLE_MSEACFM_MD_MA_MEP_REPLY2;
+
+        } else {
+            throw new NetconfException("MocknetconfSession. No sendRequest() case for query: " +
+                    request);
+        }
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
new file mode 100644
index 0000000..7ec6288
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.MseaCfmManager;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.MseaCfm;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.DefaultMefCfm;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.MefCfm;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.DefaultMaintenanceDomain;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.MaintenanceDomain;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.DefaultNameCharacterString;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.cfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yms.ymsm.YmsService;
+
+public class MseaCfmManagerTest {
+
+    MseaCfmManager mseaCfmService;
+    YmsService ymsService;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            mseaCfmService = new MockMseaCfmManager();
+            mseaCfmService.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetConfigMseaCfmEssentials() throws NetconfException {
+        MseaCfm mseaCfm = mseaCfmService.getMepEssentials("md-1", "ma-1-1", 1, session);
+        assertNotNull(mseaCfm);
+
+        //See SAMPLE_MSEACFM_MD_MA_MEP_REPLY in MockNetconfSessionEa1000
+        assertEquals(1, mseaCfm.mefCfm().maintenanceDomain().size());
+        assertEquals(2, mseaCfm.mefCfm().maintenanceDomain().get(0).mdLevel().uint8());
+    }
+
+    /**
+     * Create the Maintenance Domain "md-1".
+     * @throws NetconfException
+     */
+    @Test
+    public void testSetMseaCfm() throws NetconfException {
+        NameCharacterString mdName = DefaultNameCharacterString.builder().name(Identifier45.fromString("md-1")).build();
+
+        MaintenanceDomain yangMd = DefaultMaintenanceDomain.builder()
+                .id((short) 1)
+                .mdNameAndTypeCombo(mdName)
+                .build();
+
+        MefCfm mefCfm = DefaultMefCfm.builder().addToMaintenanceDomain(yangMd).build();
+      //FIXME implement this
+//        MseaCfmOpParam mseaCfmOpParam = (MseaCfmOpParam) MseaCfmOpParam.builder().mefCfm(mefCfm).build();
+//        mseaCfmService.setMseaCfm(mseaCfmOpParam, session, NcDsType.running);
+    }
+
+    @Test
+    public void testTransmitLoopback() throws NetconfException {
+        try {
+            mseaCfmService.transmitLoopback(null, session);
+        } catch (UnsupportedOperationException e) {
+            assertTrue(e.getMessage().contains("Not yet implemented"));
+        }
+    }
+
+    @Test
+    public void testAbortLoopback() throws NetconfException {
+        try {
+            mseaCfmService.abortLoopback(null, session);
+        } catch (UnsupportedOperationException e) {
+            assertTrue(e.getMessage().contains("Not yet implemented"));
+        }
+    }
+
+    @Test
+    public void testTransmitLinktrace() throws NetconfException {
+        try {
+            mseaCfmService.transmitLinktrace(null, session);
+        } catch (UnsupportedOperationException e) {
+            assertTrue(e.getMessage().contains("Not yet implemented"));
+        }
+    }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
new file mode 100644
index 0000000..b663554
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaSaFilteringManagerTest.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.MseaSaFilteringManager;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.MseaSaFilteringOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.DefaultSourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.SourceIpaddressFiltering;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.DefaultInterfaceEth0;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.InterfaceEth0;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.DefaultSourceAddressRange;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.sa.filtering.rev20160412.mseasafiltering.sourceipaddressfiltering.interfaceeth0.SourceAddressRange;
+import org.onosproject.yms.ymsm.YmsService;
+
+public class MseaSaFilteringManagerTest {
+
+    MseaSaFilteringManager mseaSaSvc;
+    YmsService ymsService;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            mseaSaSvc = new MockMseaSaFilteringManager();
+            mseaSaSvc.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetMseaSaFilteringMseaSaFilteringOpParamNetconfSession() throws NetconfException {
+        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
+                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
+
+        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
+                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
+        MseaSaFilteringOpParam mseaSaFilteringFilter =
+                (MseaSaFilteringOpParam) opBuilder
+                .sourceIpaddressFiltering(sipBuilder.build())
+                .build();
+
+        MseaSaFiltering result = mseaSaSvc.getMseaSaFiltering(mseaSaFilteringFilter, session);
+
+        //Results come from MockNetconfSession SAMPLE_MSEASAFILTERING_REPLY_INIT
+        assertNotNull(result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange());
+        List<SourceAddressRange> ranges = result.sourceIpaddressFiltering().interfaceEth0().sourceAddressRange();
+        assertEquals(2, ranges.size());
+
+        for (SourceAddressRange sa:ranges) {
+            if (sa.rangeId() == 1) {
+                assertEquals("10.10.10.10/16", sa.ipv4AddressPrefix());
+
+            } else if (sa.rangeId() == 2) {
+                assertEquals("20.30.40.50/18", sa.ipv4AddressPrefix());
+            }
+        }
+    }
+
+    @Test
+    public void testSetMseaSaFilteringMseaSaFilteringOpParamNetconfSessionNcDsType() {
+
+        MseaSaFilteringOpParam mseaSaFilteringConfig = createConfigForEdit("192.168.60.10/27", (short) 3, "Filter3");
+
+        //Calling on the edit-config just makes the change and hopefully does not throw a Netconf Exception
+        try {
+            mseaSaSvc.setMseaSaFiltering(mseaSaFilteringConfig, session, TargetConfig.RUNNING);
+        } catch (NetconfException e) {
+            e.printStackTrace();
+            fail("NETCONF Exception: " + e.getMessage());
+        }
+    }
+
+    /**
+     * This is also called from the test case EA1000FlowRuleProgrammableTest().
+     * In the ea1000driver project
+     * @return
+     */
+    public static MseaSaFilteringOpParam createConfigForEdit(String ipAddrPrefix, short rangeId, String rangeName) {
+        SourceAddressRange.SourceAddressRangeBuilder sarBuilder =
+                new DefaultSourceAddressRange.SourceAddressRangeBuilder();
+        SourceAddressRange saRange =
+                sarBuilder
+                .ipv4AddressPrefix(ipAddrPrefix)
+                .rangeId(rangeId)
+                .name(rangeName)
+                .build();
+
+        InterfaceEth0.InterfaceEth0Builder eth0Builder =
+                new DefaultInterfaceEth0.InterfaceEth0Builder();
+        InterfaceEth0 eth0 = eth0Builder.addToSourceAddressRange(saRange).build();
+
+        SourceIpaddressFiltering.SourceIpaddressFilteringBuilder sipBuilder =
+                new DefaultSourceIpaddressFiltering.SourceIpaddressFilteringBuilder();
+
+        SourceIpaddressFiltering sip = sipBuilder.interfaceEth0(eth0).build();
+
+        MseaSaFilteringOpParam.MseaSaFilteringBuilder opBuilder =
+                new MseaSaFilteringOpParam.MseaSaFilteringBuilder();
+        MseaSaFilteringOpParam mseaSaFilteringConfig =
+                (MseaSaFilteringOpParam) opBuilder
+                .sourceIpaddressFiltering(sipBuilder.build())
+                .build();
+
+        return mseaSaFilteringConfig;
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
new file mode 100644
index 0000000..79e3435
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/MseaUniEvcServiceManagerTest.java
@@ -0,0 +1,456 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import java.io.UncheckedIOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.drivers.microsemi.yang.impl.MseaUniEvcServiceManager;
+import org.onosproject.drivers.microsemi.yang.utils.CeVlanMapUtils;
+import org.onosproject.netconf.NetconfDeviceInfo;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.netconf.TargetConfig;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.Identifier45;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.ServiceListType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.types.rev20160229.mseatypes.VlanIdType;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcService;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.MseaUniEvcServiceOpParam;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.DefaultMefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.MefServices;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.EvcPerUniServiceTypeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.TagPush;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.tagpush.tagpush.PushTagTypeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation.DefaultTagPush;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.Profiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultProfiles;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.DefaultUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.Uni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.BwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.Cos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultBwpGroup;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.DefaultCos;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.Bwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.DefaultBwp;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.profiles.bwpgroup.bwp.ColorModeEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.CustomEvc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.DefaultEvc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.Evc;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.UniSideInterfaceAssignmentEnum;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.DefaultEvcPerUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.EvcPerUni;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.CustomEvcPerUnin;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.DefaultEvcPerUnin;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnic;
+import org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc.service.rev20160317.mseaunievcservice.mefservices.uni.evc.evcperuni.EvcPerUnin;
+import org.onosproject.yms.ymsm.YmsService;
+
+public class MseaUniEvcServiceManagerTest {
+
+    MseaUniEvcServiceManager mseaUniEvcServiceSvc;
+    YmsService ymsService;
+    NetconfSession session;
+
+    @Before
+    public void setUp() throws Exception {
+        try {
+            mseaUniEvcServiceSvc = new MockMseaUniEvcServiceManager();
+            mseaUniEvcServiceSvc.activate();
+        } catch (UncheckedIOException e) {
+            fail(e.getMessage());
+        }
+        NetconfDeviceInfo deviceInfo = new NetconfDeviceInfo("netconf", "netconf", Ip4Address.valueOf("1.2.3.4"), 830);
+        session = new MockNetconfSessionEa1000(deviceInfo);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testGetMseaUniEvcServiceMseaUniEvcServiceOpParamNetconfSession() {
+        Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+
+        MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
+        MefServices mefServices = mefBuilder.uni(uniBuilder.build()).build();
+
+        MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+                new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+        MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+                (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+        MseaUniEvcService result = null;
+        try {
+            result =
+                    mseaUniEvcServiceSvc.getConfigMseaUniEvcService(
+                            mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+
+        assertNotNull(result);
+    }
+
+    @Test
+    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamEvcs() {
+      TagPush.TagPushBuilder tpBuilder1 = new DefaultTagPush.TagPushBuilder();
+      org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea.uni.evc
+          .service.rev20160317.mseaunievcservice.evcperuniextensionattributes.tagmanipulation
+          .tagpush.TagPush.TagPushBuilder tpInnerBuilder1 =
+              new org.onosproject.yang.gen.v1.http.www.microsemi.com.microsemi.edge.assure.msea
+                  .uni.evc.service.rev20160317.mseaunievcservice.evcperuniextensionattributes
+                  .tagmanipulation.tagpush.DefaultTagPush.TagPushBuilder();
+      TagPush tp1 = tpBuilder1
+          .tagPush(tpInnerBuilder1
+                  .outerTagVlan(new VlanIdType(3))
+                  .pushTagType(PushTagTypeEnum.PUSHSTAG)
+                  .build())
+          .build();
+
+      EvcPerUnin.EvcPerUninBuilder epunBuilder1 = new DefaultEvcPerUnin.EvcPerUninBuilder();
+      EvcPerUnin epun1 = epunBuilder1
+              .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
+              .ceVlanMap(ServiceListType.fromString("10"))
+              .ingressBwpGroupIndex("0")
+              .tagManipulation(tp1)
+              .build();
+
+      EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
+      EvcPerUnic epuc1 = epucBuilder1
+              .ceVlanMap(new ServiceListType("11"))
+              .ingressBwpGroupIndex("0")
+              .build();
+
+      EvcPerUni.EvcPerUniBuilder epuBuilder = new DefaultEvcPerUni.EvcPerUniBuilder();
+
+      List<Evc> evcList = new ArrayList<Evc>();
+      Evc.EvcBuilder evcBuilder1 = new DefaultEvc.EvcBuilder();
+      evcList.add(evcBuilder1
+              .evcIndex(1)
+              .name(new Identifier45("evc-1"))
+              .evcPerUni(epuBuilder.evcPerUnin(epun1).evcPerUnic(epuc1).build())
+              .build());
+
+
+      EvcPerUnin.EvcPerUninBuilder epunBuilder2 = new DefaultEvcPerUnin.EvcPerUninBuilder();
+      EvcPerUnin epun2 = epunBuilder2
+              .ceVlanMap(ServiceListType.fromString("13"))
+              .ingressBwpGroupIndex("0")
+              .build();
+
+      EvcPerUnic.EvcPerUnicBuilder epucBuilder2 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
+      EvcPerUnic epuc2 = epucBuilder2
+              .ceVlanMap(new ServiceListType("12"))
+              .ingressBwpGroupIndex("0")
+              .build();
+
+      Evc.EvcBuilder evcBuilder2 = new DefaultEvc.EvcBuilder();
+      evcList.add(evcBuilder2
+              .evcIndex(2)
+              .name(new Identifier45("evc-2"))
+              .evcPerUni(epuBuilder.evcPerUnin(epun2).evcPerUnic(epuc2).build())
+              .build());
+
+      Uni.UniBuilder uniBuilder = new DefaultUni.UniBuilder();
+      Uni uni = uniBuilder.name(new Identifier45("testUni")).evc(evcList).build();
+
+      MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
+      MefServices mefServices = mefBuilder.uni(uni).build();
+
+      MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+              new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+      MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+              (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+      try {
+          mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+      } catch (NetconfException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+          fail("Error: " + e.getMessage());
+      }
+    }
+
+    @Test
+    public void testSetMseaUniEvcServiceMseaUniEvcServiceOpParamProfiles() {
+      List<Cos> cosList = new ArrayList<Cos>();
+      Cos.CosBuilder cosBuilder0 = new DefaultCos.CosBuilder();
+      cosList.add(cosBuilder0.cosIndex(0).name("cos0").build());
+      Cos.CosBuilder cosBuilder1 = new DefaultCos.CosBuilder();
+      cosList.add(cosBuilder1.cosIndex(1).name("cos1").build());
+
+      List<BwpGroup> bwpGroupList = new ArrayList<BwpGroup>();
+      BwpGroup.BwpGroupBuilder bwpGrpBuilder = new DefaultBwpGroup.BwpGroupBuilder();
+      bwpGroupList.add(bwpGrpBuilder.groupIndex((short) 0).build());
+
+      List<Bwp> bwpList = new ArrayList<Bwp>();
+      Bwp.BwpBuilder bwpBuilder1 = new DefaultBwp.BwpBuilder();
+      bwpList.add(bwpBuilder1.cosIndex(0).colorMode(ColorModeEnum.COLORAWARE).build());
+      Bwp.BwpBuilder bwpBuilder2 = new DefaultBwp.BwpBuilder();
+      bwpList.add(bwpBuilder2.cosIndex(1).colorMode(ColorModeEnum.COLORBLIND).build());
+
+      BwpGroup.BwpGroupBuilder bwpGrpBuilder1 = new DefaultBwpGroup.BwpGroupBuilder();
+      bwpGroupList.add(bwpGrpBuilder1.groupIndex((short) 1).bwp(bwpList).build());
+
+      Profiles.ProfilesBuilder profilesBuilder = new DefaultProfiles.ProfilesBuilder();
+      Profiles profiles = profilesBuilder.bwpGroup(bwpGroupList).build();
+
+      MefServices.MefServicesBuilder mefBuilder = new DefaultMefServices.MefServicesBuilder();
+      MefServices mefServices = mefBuilder.profiles(profiles).build();
+
+      MseaUniEvcService.MseaUniEvcServiceBuilder evcUniBuilder =
+              new MseaUniEvcServiceOpParam.MseaUniEvcServiceBuilder();
+
+      MseaUniEvcServiceOpParam mseaUniEvcServiceFilter =
+              (MseaUniEvcServiceOpParam) evcUniBuilder.mefServices(mefServices).build();
+      try {
+          mseaUniEvcServiceSvc.setMseaUniEvcService(mseaUniEvcServiceFilter, session, TargetConfig.RUNNING);
+      } catch (NetconfException e) {
+          // TODO Auto-generated catch block
+          e.printStackTrace();
+          fail("Error: " + e.getMessage());
+      }
+    }
+
+    @Test
+    public void testGetMseaUniEvcCeVlanMaps() {
+
+        try {
+            MseaUniEvcService ceVlanMapsResult7 =
+                    mseaUniEvcServiceSvc.getmseaUniEvcCeVlanMaps(session, TargetConfig.RUNNING);
+
+            assertNotNull(ceVlanMapsResult7.mefServices().uni().evc());
+
+            List<Evc> evcList = ceVlanMapsResult7.mefServices().uni().evc();
+            assertEquals(3, evcList.size());
+            for (Evc evc : evcList) {
+               assertNotNull(evc.evcPerUni().evcPerUnic().ceVlanMap());
+               assertNotNull(evc.evcPerUni().evcPerUnin().ceVlanMap());
+
+               if (evc.evcIndex() == 7) {
+                   assertEquals("700,710,720", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+                   assertEquals("701:703", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+               }
+            }
+
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testChangeEvcCeVlanMap() {
+        EvcPerUnin.EvcPerUninBuilder epunBuilder1 = new DefaultEvcPerUnin.EvcPerUninBuilder();
+        EvcPerUnin epun1 = epunBuilder1
+                .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
+                .ceVlanMap(ServiceListType.fromString("10"))
+                .ingressBwpGroupIndex("0")
+                .build();
+
+        EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = new DefaultEvcPerUnic.EvcPerUnicBuilder();
+        EvcPerUnic epuc1 = epucBuilder1
+                .ceVlanMap(new ServiceListType("11"))
+                .ingressBwpGroupIndex("0")
+                .build();
+
+        EvcPerUni.EvcPerUniBuilder epuBuilder = DefaultEvcPerUni.builder().evcPerUnic(epuc1).evcPerUnin(epun1);
+
+        Evc evc = CustomEvc.builder().evcPerUni(epuBuilder.build()).build();
+
+        assertEquals("10", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+
+        evc = CustomEvc.builder(evc).addToCeVlanMap(new ServiceListType("12,13"), UniSide.NETWORK).build();
+
+        assertEquals("10,12:13", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+        assertEquals("11", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+
+    }
+
+    @Test
+    public void testChangeEvcCeVlanMapNoValues() {
+        EvcPerUnin.EvcPerUninBuilder epunBuilder1 = CustomEvcPerUnin.builder();
+        EvcPerUnin epun1 = epunBuilder1
+                .evcPerUniServiceType(EvcPerUniServiceTypeEnum.EVPL)
+                .ingressBwpGroupIndex("0")
+                .build();
+
+        EvcPerUnic.EvcPerUnicBuilder epucBuilder1 = CustomEvcPerUnic.builder();
+        EvcPerUnic epuc1 = epucBuilder1
+                .ingressBwpGroupIndex("0")
+                .build();
+
+        EvcPerUni.EvcPerUniBuilder epuBuilder = DefaultEvcPerUni.builder().evcPerUnic(epuc1).evcPerUnin(epun1);
+
+        Evc evc = CustomEvc.builder().evcPerUni(epuBuilder.build()).build();
+
+        assertEquals("0", evc.evcPerUni().evcPerUnin().ceVlanMap().string());
+        assertEquals("0", evc.evcPerUni().evcPerUnic().ceVlanMap().string());
+    }
+
+    @Test
+    public void testRemoveEvcUniFlowEntries() {
+
+        Map<Integer, String> ceVlanUpdates = new TreeMap<>();
+        ceVlanUpdates.put((1 << 2), "");
+        ceVlanUpdates.put((1 << 2) + 1, "");
+        ceVlanUpdates.put((2 << 2), "");
+        ceVlanUpdates.put((2 << 2) + 1, "");
+
+        ceVlanUpdates.put((7 << 2), "700,710,720");
+        ceVlanUpdates.put((7 << 2) + 1, "701:703");
+        ceVlanUpdates.put((8 << 2), "800,810,820");
+        ceVlanUpdates.put((8 << 2) + 1, "801,802,803");
+
+        Map<Integer, List<Short>> flowVlanIdMap = new HashMap<>();
+        //These should get ignored because whole EVC is being deleted
+        flowVlanIdMap.put(1 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(1 << 2).add((short) 11);
+
+        flowVlanIdMap.put((1 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((1 << 2) + 1).add((short) 12L);
+
+        //These are the EVCs being removed
+        flowVlanIdMap.put(7 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(7 << 2).add((short) 730L);
+        flowVlanIdMap.get(7 << 2).add((short) 740L);
+
+        flowVlanIdMap.put((7 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((7 << 2) + 1).add((short) 705L);
+        flowVlanIdMap.get((7 << 2) + 1).add((short) 706L);
+
+        flowVlanIdMap.put(8 << 2, new ArrayList<Short>());
+        flowVlanIdMap.get(8 << 2).add((short) 830L);
+        flowVlanIdMap.get(8 << 2).add((short) 840L);
+
+        flowVlanIdMap.put((8 << 2) + 1, new ArrayList<Short>());
+        flowVlanIdMap.get((8 << 2) + 1).add((short) 805L);
+        flowVlanIdMap.get((8 << 2) + 1).add((short) 806L);
+
+        try {
+            mseaUniEvcServiceSvc.removeEvcUniFlowEntries(
+                    ceVlanUpdates, flowVlanIdMap, session, TargetConfig.RUNNING,
+                    UniSideInterfaceAssignmentEnum.UNI_C_ON_OPTICS);
+        } catch (NetconfException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            fail("Error: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testGetVlanSet1() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10");
+        assertEquals(1, vlanIds.length);
+    }
+
+    @Test
+    public void testGetVlanSet2() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20");
+        assertEquals(11, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(20, vlanIds[10].shortValue());
+    }
+
+    @Test
+    public void testGetVlanSet3() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10:20,30:40");
+        assertEquals(22, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(40, vlanIds[21].shortValue());
+    }
+
+    @Test
+    public void testGetVlanSet4() {
+        Short[] vlanIds = CeVlanMapUtils.getVlanSet("10,20,30");
+        assertEquals(3, vlanIds.length);
+        assertEquals(10, vlanIds[0].shortValue());
+        assertEquals(30, vlanIds[2].shortValue());
+    }
+
+    @Test
+    public void testVlanListAsString() {
+        assertEquals("20:22", CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22}));
+
+        assertEquals("20:22,24:25",
+                CeVlanMapUtils.vlanListAsString(new Short[]{20, 21, 22, 24, 25}));
+
+        assertEquals("30,33,36:40",
+                CeVlanMapUtils.vlanListAsString(new Short[]{30, 33, 36, 37, 38, 39, 40}));
+
+        assertEquals("20", CeVlanMapUtils.vlanListAsString(new Short[]{20}));
+
+        assertEquals("20,22,24,26,28",
+                CeVlanMapUtils.vlanListAsString(new Short[]{20, 22, 24, 26, 28}));
+    }
+
+    @Test
+    public void testAddtoCeVlanMap() {
+        assertEquals("20,22:24,26,28",
+                CeVlanMapUtils.addtoCeVlanMap("20,22,24,26,28", (short) 23));
+
+        assertEquals("20:26,28",
+                CeVlanMapUtils.addtoCeVlanMap("20,21,22,24,25,26,28", (short) 23));
+
+        assertEquals("20,23",
+                CeVlanMapUtils.addtoCeVlanMap("20", (short) 23));
+
+        assertEquals("20,22:23",
+                CeVlanMapUtils.addtoCeVlanMap("20,22", (short) 23));
+    }
+
+    @Test
+    public void testCombineVlanSets() {
+        assertEquals("10:11,13:14", CeVlanMapUtils.combineVlanSets("10:11", "13:14"));
+
+        assertEquals("10:14", CeVlanMapUtils.combineVlanSets("10:11", "12:14"));
+
+        assertEquals("10:11,14", CeVlanMapUtils.combineVlanSets("10:11", "14"));
+
+        assertEquals("10:12", CeVlanMapUtils.combineVlanSets("10:11", "11:12"));
+    }
+
+    @Test
+    public void testRemoveZeroIfPossible() {
+        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible(""));
+
+        assertEquals("0", CeVlanMapUtils.removeZeroIfPossible("0"));
+
+        assertEquals("1,3", CeVlanMapUtils.removeZeroIfPossible("0:1,3"));
+
+        assertEquals("1:2", CeVlanMapUtils.removeZeroIfPossible("0:2"));
+
+        assertEquals("10:12", CeVlanMapUtils.removeZeroIfPossible("0,10:12"));
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java
new file mode 100644
index 0000000..4173ece
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.drivers.microsemi.yang;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
new file mode 100644
index 0000000..4e62beb
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/drivers/microsemi/yang/utils/IetfYangTypesUtilsTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.microsemi.yang.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DateAndTime;
+
+public class IetfYangTypesUtilsTest {
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testFromYangDateTime() {
+        OffsetDateTime odt = IetfYangTypesUtils.fromYangDateTime(DateAndTime.fromString("2015-07-08T12:49:20.9Z"));
+        assertEquals(OffsetDateTime.of(2015, 7, 8, 12, 49, 20, 900000000, ZoneOffset.UTC), odt);
+    }
+
+    @Test
+    public void testFromYangDateTimeZoned() {
+        ZonedDateTime zdt = IetfYangTypesUtils.fromYangDateTimeZoned(DateAndTime.fromString("2015-07-08T12:49:20.9Z"),
+                ZoneId.systemDefault());
+
+        assertEquals(OffsetDateTime.of(2015, 7, 8, 12, 49, 20, 900000000, ZoneOffset.UTC).toInstant(),
+                zdt.toOffsetDateTime().toInstant());
+    }
+
+    @Test
+    public void testFromYangDateTimeToLocal() {
+        LocalDateTime ldt = IetfYangTypesUtils
+                .fromYangDateTimeToLocal(DateAndTime.fromString("2015-07-08T12:49:20.9Z"));
+
+        OffsetDateTime odtExpected = OffsetDateTime.of(2015, 7, 8, 12, 49, 20, 900000000, ZoneOffset.UTC);
+        ZoneOffset offsetForcurrentZone = ZoneId.systemDefault().getRules().getOffset(ldt);
+        assertEquals(odtExpected.toInstant(), ldt.toInstant(offsetForcurrentZone));
+    }
+
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
new file mode 100644
index 0000000..7645a32
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yab;
+
+import static java.lang.String.valueOf;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.core.CoreService;
+import org.onosproject.core.IdGenerator;
+import org.onosproject.drivers.netconf.MockCoreService;
+import org.onosproject.yms.app.ych.DefaultYangCodecHandler;
+import org.onosproject.yms.app.ych.defaultcodecs.YangCodecRegistry;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ysr.DefaultYangModuleLibrary;
+import org.onosproject.yms.app.ysr.MockYangSchemaRegistry;
+import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+import org.onosproject.yms.ych.YangCodecHandler;
+import org.onosproject.yms.ych.YangDataTreeCodec;
+import org.onosproject.yms.ych.YangProtocolEncodingFormat;
+import org.onosproject.yms.ydt.YdtBuilder;
+import org.onosproject.yms.ydt.YdtResponse;
+import org.onosproject.yms.ydt.YdtWalker;
+import org.onosproject.yms.ydt.YmsOperationType;
+import org.onosproject.yms.ymsm.YmsService;
+import org.onosproject.yms.ynh.YangNotificationService;
+import org.onosproject.yms.ysr.YangModuleIdentifier;
+import org.onosproject.yms.ysr.YangModuleLibrary;
+
+/**
+ * Represents implementation of YANG application management system manager.
+ */
+public class MockYmsManager
+        implements YmsService {
+    private static final String MODULE_ID = "module-id";
+
+    YangSchemaRegistry schemaRegistry;
+    private YangModuleLibrary library;
+    private IdGenerator moduleIdGenerator;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    public MockYmsManager()
+            throws InstantiationException, IllegalAccessException, IOException {
+        coreService = new MockCoreService();
+        moduleIdGenerator = coreService.getIdGenerator(MODULE_ID);
+        library = new DefaultYangModuleLibrary(getNewModuleId());
+        YangCodecRegistry.initializeDefaultCodec();
+    }
+
+    @Override
+    public YdtBuilder getYdtBuilder(String logicalRootName,
+                                    String rootNamespace,
+                                    YmsOperationType operationType) {
+        return new YangRequestWorkBench(logicalRootName, rootNamespace,
+                                        operationType, schemaRegistry, false);
+    }
+
+    @Override
+    public YdtBuilder getYdtBuilder(String logicalRootName,
+                                    String rootNamespace,
+                                    YmsOperationType operationType,
+                                    Object schemaRegistryForYdt) {
+        return null;
+    }
+
+    @Override
+    public YdtWalker getYdtWalker() {
+        return null;
+    }
+
+    @Override
+    public YdtResponse executeOperation(YdtBuilder operationRequest) {
+        YangApplicationBroker requestBroker =
+                new YangApplicationBroker(schemaRegistry);
+        switch (operationRequest.getYmsOperationType()) {
+            case EDIT_CONFIG_REQUEST:
+                try {
+                    return requestBroker.processEdit(operationRequest);
+                } catch (CloneNotSupportedException e) {
+                }
+                break;
+            case QUERY_CONFIG_REQUEST:
+            case QUERY_REQUEST:
+                return requestBroker.processQuery(operationRequest);
+            case RPC_REQUEST:
+                return requestBroker.processOperation(operationRequest);
+            default:
+        }
+        return null;
+    }
+
+    @Override
+    public YangNotificationService getYangNotificationService() {
+        return null;
+    }
+
+    @Override
+    public void registerService(Object appManager, Class<?> yangService,
+                                List<String> supportedFeatureList) {
+    }
+
+    @Override
+    public void unRegisterService(Object appManager, Class<?> yangService) {
+
+    }
+
+    @Override
+    public YangModuleLibrary getYangModuleLibrary() {
+        return library;
+    }
+
+    @Override
+    public String getYangFile(YangModuleIdentifier moduleIdentifier) {
+        return null;
+    }
+
+    @Override
+    public void registerDefaultCodec(YangDataTreeCodec defaultCodec,
+                                     YangProtocolEncodingFormat dataFormat) {
+    }
+
+    @Override
+    public YangCodecHandler getYangCodecHandler() {
+        YangSchemaRegistry registry = new MockYangSchemaRegistry();
+        DefaultYangCodecHandler handler = new DefaultYangCodecHandler(registry);
+        handler.setLibrary(new DefaultYangModuleLibrary(getNewModuleId()));
+        return handler;
+    }
+
+    private String getNewModuleId() {
+        return valueOf(moduleIdGenerator.getNewId());
+    }
+}
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
new file mode 100644
index 0000000..a8a971c
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/yab/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.yms.app.yab;
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java
new file mode 100644
index 0000000..5de56fd
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/MockYangSchemaRegistry.java
@@ -0,0 +1,767 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.ysr;
+
+import org.onosproject.yangutils.datamodel.YangInclude;
+import org.onosproject.yangutils.datamodel.YangModule;
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangSchemaNode;
+import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yms.ysr.YangModuleIdentifier;
+import org.onosproject.yms.ysr.YangModuleInformation;
+import org.onosproject.yms.ysr.YangModuleLibrary;
+import org.slf4j.Logger;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.regex.Pattern;
+
+import static java.util.Collections.sort;
+import static org.apache.commons.io.FileUtils.deleteDirectory;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.deSerializeDataModel;
+import static org.onosproject.yangutils.utils.UtilConstants.EVENT_STRING;
+import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
+import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
+import static org.slf4j.LoggerFactory.getLogger;
+
+
+/**
+ * Representation of default YANG schema registry. Yang schema registry
+ * provides interface to an application to register its YANG schema
+ * with YMS. It provides YANG schema nodes to YDT, YNB and YSB.
+ */
+public class MockYangSchemaRegistry implements YangSchemaRegistry {
+
+    private static final String SYSTEM = SLASH + "system" + SLASH;
+    private static final String MAVEN = "mvn:";
+    private static final String JAR = ".jar";
+    private static final String USER_DIRECTORY = "user.dir";
+    private static final String AT = "@";
+    private static final String DATE_FORMAT = "yyyy-mm-dd";
+    private static final String ONOS = "org.onosproject";
+    private static final Logger log = getLogger(MockYangSchemaRegistry.class);
+
+    private static final String FS = File.separator;
+    private static final String USER_DIR = System.getProperty("user.dir").replaceAll("ea1000driver", "ea1000yang");
+//    private static final String BUCK_OUT_DIR = "/buck-out/gen/drivers/microsemi/ea1000yang/";
+    private static final String BUCK_OUT_BIN_LOC =
+            "/buck-out/bin/drivers/microsemi/ea1000yang/"
+            + "lib__onos-drivers-microsemi-ea1000yang__classes/YangMetaData.ser";
+    private static final String PATH = FS + "target" + FS + "classes" + FS;
+    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
+            FS + "YangMetaData.ser";
+    private static final String RESOURCE = "src/test/resources";
+
+
+    /*
+     * Map for storing app objects.
+     */
+    private final ConcurrentMap<String, Object> appObjectStore;
+
+    /*
+     * Map for storing YANG schema nodes.
+     */
+    private final ConcurrentMap<String, ConcurrentMap<String, YangSchemaNode>>
+            yangSchemaStore;
+
+    /*
+     * Map for storing YANG schema nodes with respect to root's generated
+     * interface file name.
+     */
+    private final ConcurrentMap<String, YangSchemaNode> interfaceNameKeyStore;
+
+    /*
+     * Map for storing YANG schema nodes root's generated op param file name.
+     */
+    private final ConcurrentMap<String, YangSchemaNode> opParamNameKeyStore;
+
+    /*
+     * Map for storing YANG schema nodes with respect to notifications.
+     */
+    private final ConcurrentMap<String, YangSchemaNode> eventNameKeyStore;
+
+    /*
+     * Map for storing YANG schema nodes with respect to app name.
+     */
+    private final ConcurrentMap<String, YangSchemaNode> appNameKeyStore;
+
+    /*
+     * Map for storing registered classes.
+     */
+    private final ConcurrentMap<String, Class<?>> registerClassStore;
+
+    /*
+     * Map for storing YANG file details.
+     */
+    private final ConcurrentMap<YangModuleIdentifier, String> yangFileStore;
+
+    /**
+     * Map for storing schema nodes with respect to namespace.
+     */
+    private final ConcurrentMap<String, YangSchemaNode> nameSpaceSchemaStore;
+
+    private final ConcurrentMap<Object, Boolean> ynhRegistrationStore;
+    private final ConcurrentMap<String, String> jarPathStore;
+
+    /**
+     * Creates an instance of default YANG schema registry.
+     */
+    public MockYangSchemaRegistry() {
+        appObjectStore = new ConcurrentHashMap<>();
+        yangSchemaStore = new ConcurrentHashMap<>();
+        interfaceNameKeyStore = new ConcurrentHashMap<>();
+        opParamNameKeyStore = new ConcurrentHashMap<>();
+        eventNameKeyStore = new ConcurrentHashMap<>();
+        registerClassStore = new ConcurrentHashMap<>();
+        yangFileStore = new ConcurrentHashMap<>();
+        appNameKeyStore = new ConcurrentHashMap<>();
+        ynhRegistrationStore = new ConcurrentHashMap<>();
+        jarPathStore = new ConcurrentHashMap<>();
+        nameSpaceSchemaStore = new ConcurrentHashMap<>();
+    }
+
+
+    /**
+     * This is overridden for Maven and Buck.
+     *
+     * Because they don't have a Bundle Context, and the JAR file doesn't exist
+     * when this is called, we have to work with the .ser file
+     */
+    @Override
+    public void registerApplication(Object appObject, Class<?> serviceClass) {
+        synchronized (MockYangSchemaRegistry.class) {
+            doPreProcessing(serviceClass, appObject);
+            if (!verifyIfApplicationAlreadyRegistered(serviceClass)) {
+
+                List<YangNode> curNodes = new ArrayList<>();
+                Path serFile = Paths.get(USER_DIR, PATH, SER_FILE_PATH);
+                if (USER_DIR.contains("ea1000yang")) {
+                    serFile = Paths.get(USER_DIR, PATH, SER_FILE_PATH);
+                } else {
+                    serFile = Paths.get(USER_DIR, BUCK_OUT_BIN_LOC);
+                }
+
+                if (Files.notExists(serFile)) {
+                    throw new UncheckedIOException(
+                            new IOException("File " + serFile.toString() + " does not exist!"));
+                }
+
+                try {
+                    curNodes.addAll(deSerializeDataModel(serFile.toString()));
+                } catch (IOException e) {
+                    throw new UncheckedIOException(e);
+                }
+
+                // process application registration.
+                if (curNodes != null && !curNodes.isEmpty()) {
+                    jarPathStore.put(serviceClass.getName(), serFile.toString());
+                    processRegistration(serviceClass, serFile.toString(),
+                                        curNodes, appObject, false);
+                } else {
+                    throw new UncheckedIOException(
+                            new IOException("Unable to find Yang Nodes in serFile: " + serFile.toString()));
+                }
+            }
+        }
+    }
+
+    @Override
+    public void unRegisterApplication(Object managerObject,
+                                      Class<?> serviceClass) {
+        synchronized (MockYangSchemaRegistry.class) {
+            YangSchemaNode curNode;
+            String serviceName = serviceClass.getName();
+
+            //Check if service should be unregistered?
+            if (managerObject != null) {
+                verifyApplicationRegistration(managerObject, serviceClass);
+            }
+            //Remove registered class from store.
+            registerClassStore.remove(serviceName);
+            //check if service is in app store.
+            curNode = appNameKeyStore.get(serviceName);
+            if (curNode == null) {
+                curNode = interfaceNameKeyStore.get(serviceName);
+            }
+
+            if (curNode != null) {
+                removeSchemaNode(curNode);
+                eventNameKeyStore.remove(getEventClassName(curNode));
+                appObjectStore.remove(serviceName);
+                interfaceNameKeyStore.remove(getInterfaceClassName(curNode));
+                opParamNameKeyStore.remove(getOpParamClassName(curNode));
+                yangFileStore.remove(getModuleIdentifier(curNode));
+                appNameKeyStore.remove(serviceName);
+                nameSpaceSchemaStore.remove(curNode.getNameSpace()
+                                                    .getModuleNamespace());
+                removeYsrGeneratedTemporaryResources(jarPathStore.get(serviceName),
+                                                     serviceName);
+                log.info(" service {} is unregistered.",
+                         serviceClass.getSimpleName());
+            } else {
+                throw new RuntimeException(serviceClass.getSimpleName() +
+                                                   " service was not registered.");
+            }
+        }
+    }
+
+    @Override
+    public Object getRegisteredApplication(YangSchemaNode schemaNode) {
+        Object obj = null;
+        if (schemaNode != null) {
+            String name = getServiceName(schemaNode);
+            obj = appObjectStore.get(name);
+            if (obj == null) {
+                log.error("{} not found.", name);
+            }
+        }
+        return obj;
+    }
+
+    @Override
+    public YangSchemaNode getYangSchemaNodeUsingSchemaName(String schemaName) {
+        return getSchemaNodeUsingSchemaNameWithRev(schemaName);
+    }
+
+    @Override
+    public YangSchemaNode getYangSchemaNodeUsingAppName(String appName) {
+        YangSchemaNode node = appNameKeyStore.get(appName);
+        if (node == null) {
+            log.error("{} not found.", appName);
+        }
+        return node;
+    }
+
+    @Override
+    public YangSchemaNode
+    getYangSchemaNodeUsingGeneratedRootNodeInterfaceFileName(String name) {
+        YangSchemaNode node = interfaceNameKeyStore.get(name);
+        if (node == null) {
+            log.error("{} not found.", name);
+        }
+        return node;
+    }
+
+    @Override
+    public YangSchemaNode getYangSchemaNodeUsingGeneratedRootNodeOpPramFileName(
+            String name) {
+        YangSchemaNode node = opParamNameKeyStore.get(name);
+        if (node == null) {
+            log.error("{} not found.", name);
+        }
+        return node;
+    }
+
+    @Override
+    public YangSchemaNode getRootYangSchemaNodeForNotification(String name) {
+        YangSchemaNode node = eventNameKeyStore.get(name);
+        if (node == null) {
+            log.error("{} not found.", name);
+        }
+        return node;
+    }
+
+    @Override
+    public Class<?> getRegisteredClass(YangSchemaNode schemaNode) {
+        String interfaceName = getInterfaceClassName(schemaNode);
+        String serviceName = getServiceName(schemaNode);
+        Class<?> regClass = registerClassStore.get(serviceName);
+        if (regClass == null) {
+            regClass = registerClassStore.get(interfaceName);
+        }
+        return regClass;
+    }
+
+    @Override
+    public YangSchemaNode getSchemaWrtNameSpace(String nameSpace) {
+
+        YangSchemaNode node = nameSpaceSchemaStore.get(nameSpace);
+        if (node == null) {
+            log.error("node with {} namespace not found.", nameSpace);
+        }
+        return node;
+    }
+
+    @Override
+    public String getYangFile(YangModuleIdentifier moduleIdentifier) {
+        String file = yangFileStore.get(moduleIdentifier);
+        if (file == null) {
+            log.error("YANG files for corresponding module identifier {} not " +
+                              "found", moduleIdentifier);
+        }
+        return file;
+    }
+
+    @Override
+    public boolean verifyNotificationObject(Object appObj, Class<?> service) {
+        synchronized (MockYangSchemaRegistry.class) {
+            YangSchemaNode node = appNameKeyStore.get(service.getName());
+            if (node == null) {
+                log.error("application is not registered with YMS {}",
+                          service.getName());
+                return false;
+            }
+            try {
+                if (node.isNotificationPresent()) {
+                    if (appObj != null) {
+                        Boolean ifPresent = ynhRegistrationStore.get(appObj);
+                        if (ifPresent == null) {
+                            ynhRegistrationStore.put(appObj, true);
+                            return true;
+                        }
+                    }
+                }
+            } catch (DataModelException e) {
+                log.error("notification registration error: {} {}", e
+                        .getLocalizedMessage(), e);
+            }
+            return false;
+        }
+    }
+
+    @Override
+    public void flushYsrData() {
+        appObjectStore.clear();
+        yangSchemaStore.clear();
+        eventNameKeyStore.clear();
+        opParamNameKeyStore.clear();
+        interfaceNameKeyStore.clear();
+        registerClassStore.clear();
+        yangFileStore.clear();
+        nameSpaceSchemaStore.clear();
+    }
+
+    @Override
+    public void processModuleLibrary(String serviceName,
+                                     YangModuleLibrary library) {
+        synchronized (MockYangSchemaRegistry.class) {
+            YangSchemaNode node = appNameKeyStore.get(serviceName);
+            if (node != null) {
+                YangModuleInformation moduleInformation =
+                        new DefaultYangModuleInformation(getModuleIdentifier(node),
+                                                         node.getNameSpace());
+                addSubModuleIdentifier(node, (
+                        DefaultYangModuleInformation) moduleInformation);
+                //TODO: add feature list to module information.
+                ((DefaultYangModuleLibrary) library)
+                        .addModuleInformation(moduleInformation);
+            }
+        }
+    }
+
+    /**
+     * Process service class.
+     *
+     * @param serviceClass service class
+     * @param appObject    application object
+     */
+
+    void doPreProcessing(Class<?> serviceClass, Object appObject) {
+
+        //Check if service should be registered?
+        if (appObject != null) {
+            verifyApplicationRegistration(appObject, serviceClass);
+        }
+        String name = serviceClass.getName();
+        //Add app class to registered service store.
+        if (!registerClassStore.containsKey(name)) {
+            registerClassStore.put(name, serviceClass);
+        }
+    }
+
+    void updateServiceClass(Class<?> service) {
+        registerClassStore.put(service.getName(), service);
+    }
+
+    /**
+     * Process application registration.
+     *
+     * @param service  service class
+     * @param jarPath  jar path
+     * @param nodes    YANG nodes
+     * @param appObj   application object
+     * @param isFromUt if registration is being called form unit test
+     */
+    void processRegistration(Class<?> service, String jarPath,
+                             List<YangNode> nodes,
+                             Object appObj, boolean isFromUt) {
+
+        // process storing operations.
+        YangNode schemaNode = findNodeWhichShouldBeReg(service.getName(), nodes);
+        if (schemaNode != null) {
+            if (appObj != null) {
+                appObjectStore.put(service.getName(), appObj);
+            }
+            //Process application context for registrations.
+            processApplicationContext(schemaNode, service.getName(), isFromUt);
+            //Update YANG file store.
+            updateYangFileStore(schemaNode, jarPath);
+        }
+    }
+
+    /**
+     * Returns the node for which corresponding class is generated.
+     *
+     * @param name  generated class name
+     * @param nodes list of yang nodes
+     * @return node for which corresponding class is generated
+     */
+    private YangNode findNodeWhichShouldBeReg(String name, List<YangNode> nodes) {
+        for (YangNode node : nodes) {
+            if (name.equals(getServiceName(node)) ||
+                    name.equals(getInterfaceClassName(node))) {
+                return node;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Verifies if service class should be registered or not.
+     *
+     * @param appObject application object
+     * @param appClass  application class
+     */
+    private void verifyApplicationRegistration(Object appObject,
+                                               Class<?> appClass) {
+        Class<?> managerClass = appObject.getClass();
+        Class<?>[] services = managerClass.getInterfaces();
+        List<Class<?>> classes = new ArrayList<>();
+        Collections.addAll(classes, services);
+        if (!classes.contains(appClass)) {
+            throw new RuntimeException("service class " + appClass.getName() +
+                                               "is not being implemented by " +
+                                               managerClass.getName());
+        }
+    }
+
+    /**
+     * Verifies if application is already registered with YMS.
+     *
+     * @param appClass application class
+     * @return true if application already registered
+     */
+    private boolean verifyIfApplicationAlreadyRegistered(Class<?> appClass) {
+        String appName = appClass.getName();
+        return appObjectStore.containsKey(appName) ||
+                interfaceNameKeyStore.containsKey(appName);
+    }
+
+    /**
+     * Updates yang file store for YANG node.
+     *
+     * @param node    YANG node
+     * @param jarPath jar file path
+     */
+    private void updateYangFileStore(YangNode node, String jarPath) {
+        yangFileStore.put(getModuleIdentifier(node),
+                          getYangFilePath(jarPath, node.getFileName()));
+    }
+
+    /**
+     * Returns yang file path.
+     *
+     * @param jarPath          jar path
+     * @param metaDataFileName name of yang file from metadata
+     * @return yang file path
+     */
+    private String getYangFilePath(String jarPath, String metaDataFileName) {
+        String[] metaData = metaDataFileName.split(SLASH);
+        return jarPath + SLASH + metaData[metaData.length - 1];
+    }
+
+
+    /**
+     * Process an application an updates the maps for YANG schema registry.
+     *
+     * @param appNode  application YANG schema nodes
+     * @param name     class name
+     * @param isFormUt if method is being called from unit tests
+     */
+    private void processApplicationContext(YangSchemaNode appNode, String name,
+                                           boolean isFormUt) {
+
+        //Update map for which registrations is being called.
+        appNameKeyStore.put(name, appNode);
+
+        // Updates schema store.
+        addToSchemaStore(appNode);
+        // update interface store.
+        interfaceNameKeyStore.put(getInterfaceClassName(appNode), appNode);
+
+        //update op param store.
+        opParamNameKeyStore.put(getOpParamClassName(appNode), appNode);
+
+        //update namespaceSchema store.
+        nameSpaceSchemaStore.put(appNode.getNameSpace().getModuleNamespace(), appNode);
+
+        //Checks if notification is present then update notification store map.
+        String eventSubject = null;
+        try {
+            if (appNode.isNotificationPresent()) {
+                eventSubject = getEventClassName(appNode);
+            }
+        } catch (DataModelException e) {
+            log.error("failed to search notification from schema map : {}",
+                      e.getLocalizedMessage());
+        }
+        if (eventSubject != null) {
+            eventNameKeyStore.put(eventSubject, appNode);
+        }
+        if (!isFormUt) {
+            log.info("successfully registered this application {}", name);
+        }
+    }
+
+    /**
+     * Returns jar path from bundle mvnLocationPath.
+     *
+     * @param mvnLocationPath mvnLocationPath of bundle
+     * @return path of jar
+     */
+    private String getJarPathFromBundleLocation(String mvnLocationPath,
+                                                String currentDirectory) {
+        String path = currentDirectory + SYSTEM;
+        if (mvnLocationPath.contains(MAVEN)) {
+            String[] strArray = mvnLocationPath.split(MAVEN);
+            if (strArray[1].contains(File.separator)) {
+                String[] split = strArray[1].split(File.separator);
+                if (split[0].contains(PERIOD)) {
+                    String[] groupId = split[0].split(Pattern.quote(PERIOD));
+                    return path + groupId[0] + SLASH + groupId[1] + SLASH + split[1] +
+                            SLASH + split[2] + SLASH + split[1] + HYPHEN + split[2];
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns schema node based on the revision.
+     *
+     * @param name name of the schema node
+     * @return schema node based on the revision
+     */
+    private YangSchemaNode getSchemaNodeUsingSchemaNameWithRev(String name) {
+        ConcurrentMap<String, YangSchemaNode> revMap;
+        YangSchemaNode schemaNode;
+        if (name.contains(AT)) {
+            String[] revArray = name.split(AT);
+            revMap = yangSchemaStore.get(revArray[0]);
+            schemaNode = revMap.get(name);
+            if (schemaNode == null) {
+                log.error("{} not found.", name);
+            }
+            return schemaNode;
+        }
+        if (yangSchemaStore.containsKey(name)) {
+            revMap = yangSchemaStore.get(name);
+            if (revMap != null && !revMap.isEmpty()) {
+                YangSchemaNode node = revMap.get(name);
+                if (node != null) {
+                    return node;
+                }
+                String revName = getLatestVersion(revMap);
+                return revMap.get(revName);
+            }
+        }
+        log.error("{} not found.", name);
+        return null;
+    }
+
+    private String getLatestVersion(ConcurrentMap<String, YangSchemaNode> revMap) {
+        List<String> keys = new ArrayList<>();
+        for (Map.Entry<String, YangSchemaNode> entry : revMap.entrySet()) {
+            keys.add(entry.getKey());
+        }
+        sort(keys);
+        return keys.get(keys.size() - 1);
+    }
+
+    /**
+     * Adds schema node when different revision of node has received.
+     *
+     * @param schemaNode schema node
+     */
+    private void addToSchemaStore(YangSchemaNode schemaNode) {
+
+        String date = getDateInStringFormat(schemaNode);
+        String name = schemaNode.getName();
+        String revName = name;
+        if (date != null) {
+            revName = name + AT + date;
+        }
+        //check if already present.
+        if (!yangSchemaStore.containsKey(name)) {
+            ConcurrentMap<String, YangSchemaNode> revStore =
+                    new ConcurrentHashMap<>();
+            revStore.put(revName, schemaNode);
+            yangSchemaStore.put(name, revStore);
+        } else {
+            yangSchemaStore.get(name).put(revName, schemaNode);
+        }
+    }
+
+    /**
+     * Returns date in string format.
+     *
+     * @param schemaNode schema node
+     * @return date in string format
+     */
+    String getDateInStringFormat(YangSchemaNode schemaNode) {
+        if (schemaNode != null) {
+            if (((YangNode) schemaNode).getRevision() != null) {
+                return new SimpleDateFormat(DATE_FORMAT)
+                        .format(((YangNode) schemaNode).getRevision()
+                                        .getRevDate());
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Removes schema node from schema map.
+     *
+     * @param removableNode schema node which needs to be removed
+     */
+    private void removeSchemaNode(YangSchemaNode removableNode) {
+        String name = removableNode.getName();
+        String revName = name;
+        String date = getDateInStringFormat(removableNode);
+        if (date != null) {
+            revName = name + AT + date;
+        }
+        ConcurrentMap<String, YangSchemaNode> revMap = yangSchemaStore.get(name);
+        if (revMap != null && !revMap.isEmpty() && revMap.size() != 1) {
+            revMap.remove(revName);
+        } else {
+            yangSchemaStore.remove(removableNode.getName());
+        }
+    }
+
+    /**
+     * Adds sub module identifier.
+     *
+     * @param node        schema node
+     * @param information module information
+     */
+    private void addSubModuleIdentifier(
+            YangSchemaNode node, DefaultYangModuleInformation information) {
+        List<YangInclude> includeList = new ArrayList<>();
+        if (node instanceof YangModule) {
+            includeList = ((YangModule) node).getIncludeList();
+        } else if (node instanceof YangSubModule) {
+            includeList = ((YangSubModule) node).getIncludeList();
+        }
+        for (YangInclude include : includeList) {
+            information.addSubModuleIdentifiers(getModuleIdentifier(
+                    include.getIncludedNode()));
+        }
+    }
+
+    /**
+     * Returns module identifier for schema node.
+     *
+     * @param schemaNode schema node
+     * @return module identifier for schema node
+     */
+    private YangModuleIdentifier getModuleIdentifier(
+            YangSchemaNode schemaNode) {
+        return new DefaultYangModuleIdentifier(
+                schemaNode.getName(), getDateInStringFormat(schemaNode));
+    }
+
+    /**
+     * Returns schema node's generated interface class name.
+     *
+     * @param schemaNode schema node
+     * @return schema node's generated interface class name
+     */
+    String getInterfaceClassName(YangSchemaNode schemaNode) {
+        return schemaNode.getJavaPackage() + PERIOD +
+                getCapitalCase(schemaNode.getJavaClassNameOrBuiltInType());
+    }
+
+    /**
+     * Returns schema node's generated op param class name.
+     *
+     * @param schemaNode schema node
+     * @return schema node's generated op param class name
+     */
+    private String getOpParamClassName(YangSchemaNode schemaNode) {
+        return getInterfaceClassName(schemaNode) + OP_PARAM;
+    }
+
+    /**
+     * Returns schema node's generated event class name.
+     *
+     * @param schemaNode schema node
+     * @return schema node's generated event class name
+     */
+    private String getEventClassName(YangSchemaNode schemaNode) {
+        return getInterfaceClassName(schemaNode).toLowerCase() + PERIOD +
+                getCapitalCase(schemaNode.getJavaClassNameOrBuiltInType()) +
+                EVENT_STRING;
+    }
+
+    /**
+     * Returns schema node's generated service class name.
+     *
+     * @param schemaNode schema node
+     * @return schema node's generated service class name
+     */
+    String getServiceName(YangSchemaNode schemaNode) {
+        return getInterfaceClassName(schemaNode) + SERVICE;
+    }
+
+    /**
+     * Removes YSR generated temporary resources.
+     *
+     * @param rscPath resource path
+     * @param appName application name
+     */
+    private void removeYsrGeneratedTemporaryResources(String rscPath,
+                                                      String appName) {
+        if (rscPath != null) {
+            File jarPath = new File(rscPath);
+            if (jarPath.exists()) {
+                try {
+                    deleteDirectory(jarPath);
+                } catch (IOException e) {
+                    log.error("failed to delete ysr resources for {} : {}",
+                              appName, e.getLocalizedMessage());
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
new file mode 100644
index 0000000..6e7ab5c
--- /dev/null
+++ b/drivers/microsemi/ea1000yang/src/test/java/org/onosproject/yms/app/ysr/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Package for Microsemi device drivers support for NETCONF for EA1000.
+ */
+package org.onosproject.yms.app.ysr;
\ No newline at end of file