diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/pom.xml b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/pom.xml
index 07e3226..9904b97 100644
--- a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/pom.xml
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/pom.xml
@@ -75,7 +75,11 @@
             <version>${project.version}</version>
             <scope>runtime</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealer.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealer.java
index 4bb5bc8..0416cc9 100644
--- a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealer.java
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealer.java
@@ -33,10 +33,19 @@
 public class ManufacturerReferenceNumberHealer implements Healer {
 
   private static final String MANUFACTURER_REFERENCE_NUMBER = "MRN";
-  private VendorLicenseFacade vendorLicenseFacade = VendorLicenseFacadeFactory.getInstance()
-      .createInterface();
-  private static final FeatureGroupDao featureGroupDao =
-      FeatureGroupDaoFactory.getInstance().createInterface();
+  private final VendorLicenseFacade vendorLicenseFacade;
+  private final FeatureGroupDao featureGroupDao;
+
+  public ManufacturerReferenceNumberHealer() {
+    this(VendorLicenseFacadeFactory.getInstance().createInterface(), FeatureGroupDaoFactory
+        .getInstance().createInterface());
+  }
+
+  public ManufacturerReferenceNumberHealer(VendorLicenseFacade vendorLicenseFacade,
+                                           FeatureGroupDao featureGroupDao) {
+    this.vendorLicenseFacade = vendorLicenseFacade;
+    this.featureGroupDao = featureGroupDao;
+  }
 
   @Override
   public boolean isHealingNeeded(String itemId, Version version) {
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/NetworkPackageHealer.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/NetworkPackageHealer.java
index 5ff90ae..e1807ba 100644
--- a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/NetworkPackageHealer.java
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/main/java/org/openecomp/sdc/healing/healers/NetworkPackageHealer.java
@@ -75,14 +75,22 @@
       "Vsp with invalid structure: does not contain element OrchestrationTemplateValidationData"
           + " under OrchestrationTemplate element";
 
-  private VendorSoftwareProductInfoDao vspInfoDao;
-  private ZusammenAdaptor zusammenAdaptor;
-  private CandidateService candidateService;
+  private final VendorSoftwareProductInfoDao vspInfoDao;
+  private final ZusammenAdaptor zusammenAdaptor;
+  private final CandidateService candidateService;
 
   public NetworkPackageHealer() {
-    this.vspInfoDao = VendorSoftwareProductInfoDaoFactory.getInstance().createInterface();
-    this.zusammenAdaptor = ZusammenAdaptorFactory.getInstance().createInterface();
-    this.candidateService = CandidateServiceFactory.getInstance().createInterface();
+    this(VendorSoftwareProductInfoDaoFactory.getInstance().createInterface(),
+        ZusammenAdaptorFactory.getInstance().createInterface(), CandidateServiceFactory
+            .getInstance().createInterface());
+  }
+
+  public NetworkPackageHealer(VendorSoftwareProductInfoDao vspInfoDao,
+                              ZusammenAdaptor zusammenAdaptor,
+                              CandidateService candidateService) {
+    this.vspInfoDao = vspInfoDao;
+    this.zusammenAdaptor = zusammenAdaptor;
+    this.candidateService = candidateService;
   }
 
   @Override
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealerTest.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealerTest.java
new file mode 100644
index 0000000..2d432fc
--- /dev/null
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/ManufacturerReferenceNumberHealerTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.openecomp.sdc.healing.healers;
+
+import static java.lang.Boolean.FALSE;
+import static java.lang.Boolean.TRUE;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.vendorlicense.dao.FeatureGroupDao;
+import org.openecomp.sdc.vendorlicense.dao.types.EntitlementPoolEntity;
+import org.openecomp.sdc.vendorlicense.dao.types.FeatureGroupEntity;
+import org.openecomp.sdc.vendorlicense.dao.types.LicenseKeyGroupEntity;
+import org.openecomp.sdc.vendorlicense.facade.VendorLicenseFacade;
+import org.openecomp.sdc.versioning.dao.types.Version;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+public class ManufacturerReferenceNumberHealerTest {
+
+  @Mock
+  private VendorLicenseFacade vendorLicenseFacade;
+  @Mock
+  private FeatureGroupDao featureGroupDao;
+  private ManufacturerReferenceNumberHealer manufacturerReferenceNumberHealer;
+
+  private final String ITEM_ID = "ITEM_ID";
+  private final Version version = new Version();
+
+  @Before
+  public void init(){
+    MockitoAnnotations.initMocks(this);
+    manufacturerReferenceNumberHealer = new ManufacturerReferenceNumberHealer
+        (vendorLicenseFacade, featureGroupDao);
+  }
+
+  @Test
+  public void testIsHealingNeeded_Positive() {
+    Collection<EntitlementPoolEntity> entitlementPoolEntities = new ArrayList<>();
+    entitlementPoolEntities.add(new EntitlementPoolEntity(ITEM_ID, version, ""));
+
+    when(vendorLicenseFacade.listEntitlementPools(ITEM_ID, version )).thenReturn(entitlementPoolEntities);
+    Assert.assertEquals(TRUE, manufacturerReferenceNumberHealer.isHealingNeeded("ITEM_ID", version));
+  }
+
+  @Test
+  public void testIsHealingNeeded_Negative() {
+    Collection<EntitlementPoolEntity> entitlementPoolEntities = new ArrayList<>();
+    EntitlementPoolEntity entitlementPoolEntity = new EntitlementPoolEntity(ITEM_ID, version, "");
+    entitlementPoolEntity.setManufacturerReferenceNumber("MRN");
+    entitlementPoolEntities.add(entitlementPoolEntity);
+
+    when(vendorLicenseFacade.listEntitlementPools(ITEM_ID, version )).thenReturn(entitlementPoolEntities);
+    Assert.assertEquals(FALSE, manufacturerReferenceNumberHealer.isHealingNeeded("ITEM_ID", version));
+  }
+
+  @Test
+  public void testHeal() throws Exception {
+
+    Collection<EntitlementPoolEntity> entitlementPoolEntities = getEntitlementPoolEntities();
+    when(vendorLicenseFacade.listEntitlementPools(ITEM_ID, version)).thenReturn(entitlementPoolEntities);
+    doNothing().when(vendorLicenseFacade).updateEntitlementPool(any());
+    Collection<LicenseKeyGroupEntity> licenseKeyGroupEntities = getLicenseKeyGroupEntities();
+    when(vendorLicenseFacade.listLicenseKeyGroups(ITEM_ID, version)).thenReturn
+        (licenseKeyGroupEntities);
+    doNothing().when(vendorLicenseFacade).updateLicenseKeyGroup(any());
+
+    FeatureGroupEntity featureGroupEntity = new FeatureGroupEntity();
+    when(vendorLicenseFacade.getFeatureGroup(any())).thenReturn(featureGroupEntity);
+
+    Collection<FeatureGroupEntity> featureGroupEntities = new ArrayList<>();
+    featureGroupEntities.add(featureGroupEntity);
+    when(vendorLicenseFacade.listFeatureGroups(ITEM_ID, version)).thenReturn
+        (featureGroupEntities);
+    doNothing().when(featureGroupDao).update(any());
+
+    manufacturerReferenceNumberHealer.heal(ITEM_ID, version);
+
+    verify(vendorLicenseFacade, times(1)).updateEntitlementPool(any());
+    verify(vendorLicenseFacade,times(1)).updateLicenseKeyGroup(any());
+  }
+
+  private Collection<EntitlementPoolEntity> getEntitlementPoolEntities() {
+    Set<String> oneReferencingFeatureGroups = new HashSet<String>(Arrays.asList("1"));
+    Collection<EntitlementPoolEntity> entitlementPoolEntities = new ArrayList<>();
+    EntitlementPoolEntity entitlementPoolEntity = new EntitlementPoolEntity();
+    entitlementPoolEntity.setReferencingFeatureGroups(oneReferencingFeatureGroups);
+    entitlementPoolEntities.add(entitlementPoolEntity);
+    return entitlementPoolEntities;
+  }
+
+  private Collection<LicenseKeyGroupEntity> getLicenseKeyGroupEntities() {
+    Set<String> oneReferencingFeatureGroups = new HashSet<String>(Arrays.asList("1"));
+    Collection<LicenseKeyGroupEntity> licenseKeyGroupEntities = new ArrayList<>();
+    LicenseKeyGroupEntity licenseKeyGroupEntity = new LicenseKeyGroupEntity();
+    licenseKeyGroupEntity.setReferencingFeatureGroups(oneReferencingFeatureGroups);
+    licenseKeyGroupEntities.add(licenseKeyGroupEntity);
+    return  licenseKeyGroupEntities;
+  }
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/NetworkPackageHealerTest.java b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/NetworkPackageHealerTest.java
new file mode 100644
index 0000000..d94d10c
--- /dev/null
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/java/org/openecomp/sdc/healing/healers/NetworkPackageHealerTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.openecomp.sdc.healing.healers;
+
+import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo;
+import com.amdocs.zusammen.datatypes.item.Info;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+
+import static java.lang.Boolean.FALSE;
+import static java.lang.Boolean.TRUE;
+import static org.mockito.Mockito.any;
+
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.core.zusammen.api.ZusammenAdaptor;
+import org.openecomp.sdc.common.session.SessionContextProviderFactory;
+import org.openecomp.sdc.datatypes.model.ElementType;
+import org.openecomp.sdc.healing.healers.NetworkPackageHealer;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.VendorSoftwareProductInfoDao;
+import org.openecomp.sdc.vendorsoftwareproduct.dao.type.VspDetails;
+import org.openecomp.sdc.vendorsoftwareproduct.services.filedatastructuremodule.CandidateService;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class NetworkPackageHealerTest {
+
+  @Mock
+  private VendorSoftwareProductInfoDao vspInfoDaoMock;
+  @Mock
+  private ZusammenAdaptor zusammenAdaptorMock;
+  @Mock
+  private CandidateService candidateService;
+
+  private NetworkPackageHealer networkPackageHealer;
+  private static final String tenant = "dox";
+
+  @Before
+  public void init() {
+    SessionContextProviderFactory.getInstance().createInterface().create("test", tenant);
+    MockitoAnnotations.initMocks(this);
+    networkPackageHealer = new NetworkPackageHealer(vspInfoDaoMock, zusammenAdaptorMock, candidateService);
+  }
+
+  @After
+  public void tearDown(){
+    SessionContextProviderFactory.getInstance().createInterface().close();
+  }
+
+  @Test
+  public void testIsHealingNeeded_Positive() {
+    VspDetails vspDetails = new VspDetails("ITEM_ID",new Version());
+    vspDetails.setOnboardingMethod("NetworkPackage");
+    Mockito.when(vspInfoDaoMock.get(any())).thenReturn(vspDetails);
+    Collection<ElementInfo> elementInfos = new ArrayList<>();
+    ElementInfo elementInfo = new ElementInfo();
+    Info info = new Info();
+    info.setName(ElementType.OrchestrationTemplateCandidate.name());
+    elementInfo.setInfo(info);
+    elementInfos.add(elementInfo);
+    Mockito.when(zusammenAdaptorMock.listElementsByName(any(),any(),any(),any())).thenReturn
+        (elementInfos);
+    Assert.assertEquals(TRUE,networkPackageHealer.isHealingNeeded("ITEM_ID", new Version()));
+}
+
+  @Test
+  public  void testIsHealingNeeded_Negative() {
+    VspDetails vspDetails = new VspDetails("ITEM_ID",new Version());
+    vspDetails.setOnboardingMethod("NetworkPackage");
+    Mockito.when(vspInfoDaoMock.get(any())).thenReturn(vspDetails);
+    Collection<ElementInfo> elementInfos = new ArrayList<>();
+
+    ElementInfo elementInfo = new ElementInfo();
+    Info info = new Info();
+    info.setName(ElementType.OrchestrationTemplateCandidate.name());
+    elementInfo.setInfo(info);
+    elementInfos.add(elementInfo);
+
+    ElementInfo elementInfo1 = new ElementInfo();
+    Info info1 = new Info();
+    info1.setName(ElementType.OrchestrationTemplateCandidateValidationData.name());
+    elementInfo1.setInfo(info1);
+    elementInfos.add(elementInfo1);
+
+    Mockito.when(zusammenAdaptorMock.listElementsByName(any(),any(),any(),any())).thenReturn
+        (elementInfos);
+    Assert.assertEquals(FALSE,networkPackageHealer.isHealingNeeded("ITEM_ID", new Version()));
+  }
+
+  @Test
+  public void testIsHealingNeeded_OnboardingMethod() {
+    VspDetails vspDetails = new VspDetails("ITEM_ID",new Version());
+    vspDetails.setOnboardingMethod("Manual");
+    Mockito.when(vspInfoDaoMock.get(any())).thenReturn(vspDetails);
+
+    Assert.assertEquals(FALSE,networkPackageHealer.isHealingNeeded("ITEM_ID", new Version()));
+  }
+}
diff --git a/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/resources/logback-test.xml b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..04378bf
--- /dev/null
+++ b/openecomp-be/lib/openecomp-healing-lib/openecomp-sdc-healing-impl/src/test/resources/logback-test.xml
@@ -0,0 +1,13 @@
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="off">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+</configuration>
\ No newline at end of file
