diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
index 1f87634..fbfbb13 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000CfmMepProgrammableTest.java
@@ -23,6 +23,7 @@
 import static org.onosproject.drivers.microsemi.yang.utils.MdNameUtil.getYangMdNameFromApiMdId;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.onosproject.drivers.microsemi.yang.utils.MaNameUtil;
@@ -58,10 +59,17 @@
 
     private CfmMepProgrammable cfmProgrammable;
 
+    private static MockEa1000DriverHandler mockHandler;
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        mockHandler = new MockEa1000DriverHandler();
+    }
+
     @Before
     public void setUp() throws Exception {
         cfmProgrammable = new EA1000CfmMepProgrammable();
-        cfmProgrammable.setHandler(new MockEa1000DriverHandler());
+        cfmProgrammable.setHandler(mockHandler);
         assertNotNull(cfmProgrammable.handler().data().deviceId());
     }
 
@@ -118,8 +126,7 @@
         assertNotNull(mepEntry.activeRemoteMepList());
         BitSet bs1 = new BitSet();
         bs1.clear();
-//FIXME Waiting on patch https://gerrit.onosproject.org/#/c/15778/
-//        assertEquals("Expecting 2 Remote Meps", 2, mepEntry.activeRemoteMepList().size());
+        assertEquals("Expecting 2 Remote Meps", 2, mepEntry.activeRemoteMepList().size());
         mepEntry.activeRemoteMepList().forEach(rmep -> {
             if (rmep.remoteMepId().value() == 1) {
                 assertEquals(RemoteMepState.RMEP_FAILED.name(),
diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
index aa04dab..fe95582 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000FlowRuleProgrammableTest.java
@@ -29,6 +29,7 @@
 
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.packet.EthType.EtherType;
 import org.onlab.packet.IpPrefix;
@@ -59,10 +60,16 @@
 public class EA1000FlowRuleProgrammableTest {
     EA1000FlowRuleProgrammable frProgramable;
 
+    private static MockEa1000DriverHandler mockHandler;
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        mockHandler = new MockEa1000DriverHandler();
+    }
     @Before
     public void setUp() throws Exception {
         frProgramable = new EA1000FlowRuleProgrammable();
-        frProgramable.setHandler(new MockEa1000DriverHandler());
+        frProgramable.setHandler(mockHandler);
         assertNotNull(frProgramable.handler().data().deviceId());
     }
 
@@ -142,7 +149,7 @@
 
         TrafficTreatment treatmentDrop = DefaultTrafficTreatment.builder().drop().build();
 
-        Collection<FlowRule> frAddedList = new HashSet<FlowRule>();
+        Collection<FlowRule> frAddedList = new HashSet<>();
 
         FlowRule fr4 = new DefaultFlowRule.Builder()
             .forDevice(frProgramable.handler().data().deviceId())
@@ -279,7 +286,7 @@
         TrafficTreatment.Builder trDropBuilder = DefaultTrafficTreatment.builder();
         TrafficTreatment treatmentDrop = trDropBuilder.drop().build();
 
-        Collection<FlowRule> frRemoveList = new HashSet<FlowRule>();
+        Collection<FlowRule> frRemoveList = new HashSet<>();
         ApplicationId app = new DefaultApplicationId(1, "org.onosproject.rest");
 
         Criterion matchIpSrc1 = Criteria.matchIPSrc(IpPrefix.valueOf("10.10.10.10/16"));
diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java
index 59c674e..7017bd6 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/EA1000SoamDmProgrammableTest.java
@@ -26,6 +26,7 @@
 import java.util.Collection;
 
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onosproject.incubator.net.l2monitoring.cfm.Mep.Priority;
 import org.onosproject.incubator.net.l2monitoring.cfm.identifier.MaIdCharStr;
@@ -51,10 +52,16 @@
     MaIdShort maId11 = MaIdCharStr.asMaId("ma-1-1");
     MepId mep111 = MepId.valueOf((short) 1);
 
+    private static MockEa1000DriverHandler mockHandler;
+
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        mockHandler = new MockEa1000DriverHandler();
+    }
     @Before
     public void setUp() throws Exception {
         dmProgrammable = new EA1000SoamDmProgrammable();
-        dmProgrammable.setHandler(new MockEa1000DriverHandler());
+        dmProgrammable.setHandler(mockHandler);
         assertNotNull(dmProgrammable.handler().data().deviceId());
     }
 
diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
index bb65a4d..161621b 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/drivers/microsemi/yang/MseaCfmManagerTest.java
@@ -61,7 +61,6 @@
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameCharacterString;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.NameDomainName;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.mefcfm.maintenancedomain.mdnameandtypecombo.namedomainname.NameDomainNameUnion;
-import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.AddressType;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMacAddress;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.targetaddressgroup.addresstype.DefaultMepId;
 import org.onosproject.yang.gen.v1.mseacfm.rev20160229.mseacfm.transmitloopback.DefaultTransmitLoopbackInput;
@@ -381,7 +380,7 @@
         DefaultTargetAddress ta = new DefaultTargetAddress();
         DefaultMepId mepId = new DefaultMepId();
         mepId.mepId(MepIdType.of(4));
-        ta.addressType((AddressType) mepId);
+        ta.addressType(mepId);
         lbTr1.targetAddress(ta);
 
 //        lbTr1.dataTlv(new byte[]{0x01, 0x02, 0x03}); Not supported in onos-yang-tools just yet
diff --git a/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java b/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
index bb931f0..f5c0753 100644
--- a/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
+++ b/drivers/microsemi/ea1000/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
@@ -23,27 +23,35 @@
 import org.onosproject.yang.runtime.YangSerializerContext;
 import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
 
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+
 import java.util.LinkedList;
 import java.util.List;
 
 public class MockYangSerializerContext implements YangSerializerContext {
 
-    private static MockMicrosemiRegistrator schemaProviderMicrosemi =
-            new MockMicrosemiRegistrator();
     private static MockYangRegistrator schemaProviderYang =
             new MockYangRegistrator();
+
+    private static Supplier<MockMicrosemiRegistrator> schemaProviderMicrosemi =
+            Suppliers.memoize(() -> {
+                MockMicrosemiRegistrator r = new MockMicrosemiRegistrator();
+                r.addAppInfo(schemaProviderYang.getAppInfo());
+                r.activate();
+                return r;
+            });
+
     private static final String NETCONF_NS =
             "urn:ietf:params:xml:ns:netconf:base:1.0";
     private static final String XMNLS_NC = "xmlns:xc";
 
     public MockYangSerializerContext() {
-        schemaProviderMicrosemi.addAppInfo(schemaProviderYang.getAppInfo());
-        schemaProviderMicrosemi.activate();
     }
 
     @Override
     public SchemaContext getContext() {
-        DefaultYangModelRegistry registry = (DefaultYangModelRegistry) schemaProviderMicrosemi.registry();
+        DefaultYangModelRegistry registry = (DefaultYangModelRegistry) schemaProviderMicrosemi.get().registry();
         return registry;
     }
 
