diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPaps.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPaps.java
index c3171de..cd290c6 100644
--- a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPaps.java
+++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPaps.java
@@ -22,7 +22,6 @@
 package org.onap.policy.pap.xacml.rest.components;
 
 import com.att.research.xacml.util.XACMLProperties;
-
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.ProtocolException;
@@ -33,7 +32,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
-
 import org.onap.policy.common.logging.flexlogger.FlexLogger;
 import org.onap.policy.common.logging.flexlogger.Logger;
 import org.onap.policy.rest.XacmlRestProperties;
@@ -58,7 +56,7 @@
      */
     public void notifyOthers(long entityId, String entityType, String newGroupId) {
         LOGGER.debug("notifyOthers(long entityId, String entityType, long newGroupId) as notifyOthers(" + entityId + ","
-                + entityType + "," + newGroupId + ") called");
+            + entityType + "," + newGroupId + ") called");
         failedPaps = new ArrayList<>();
 
         List<?> otherServers = PolicyDbDao.getPolicyDbDaoInstance().getOtherServers();
@@ -70,7 +68,7 @@
         }
     }
 
-    private void startNotifyThreads(List<?> otherServers, long entityId, String entityType, String newGroupId) {
+    protected void startNotifyThreads(List<?> otherServers, long entityId, String entityType, String newGroupId) {
         LinkedList<Thread> notifyThreads = new LinkedList<>();
         // we're going to run notifications in parallel threads to speed things
         // up
@@ -144,11 +142,11 @@
                     return;
                 }
                 if (newGroupId == null) {
-                    url = new URL(otherPap + "?policydbdaourl=" + papUrl + "&entityid=" + entityId + "&entitytype="
-                            + entityType);
+                    url = new URL(
+                        otherPap + "?policydbdaourl=" + papUrl + "&entityid=" + entityId + "&entitytype=" + entityType);
                 } else {
                     url = new URL(otherPap + "?policydbdaourl=" + papUrl + "&entityid=" + entityId + "&entitytype="
-                            + entityType + "&extradata=" + newGroupId);
+                        + entityType + "&extradata=" + newGroupId);
                 }
             } catch (MalformedURLException e) {
                 LOGGER.warn("Caught MalformedURLException on: new URL()", e);
@@ -188,7 +186,7 @@
             int readTimeout;
             try {
                 readTimeout =
-                        Integer.parseInt(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_NOTIFY_TIMEOUT));
+                    Integer.parseInt(XACMLProperties.getProperty(XacmlRestProperties.PROP_PAP_NOTIFY_TIMEOUT));
             } catch (Exception e) {
                 LOGGER.error("xacml.rest.pap.notify.timeoutms property not set, using a default.", e);
                 readTimeout = 10000;
@@ -217,7 +215,7 @@
                     LOGGER.info("PolicyDBDao: NotifyOtherThread received response 200 from pap server on notify");
                 } else {
                     LOGGER.warn("PolicyDBDao: NotifyOtherThread connection response code not 200, received: "
-                            + connection.getResponseCode());
+                        + connection.getResponseCode());
                     failedPaps.add(dbdEntity);
                 }
             } catch (Exception e) {
diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/service/ImportService.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/service/ImportService.java
index d4801df..050bcc5 100644
--- a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/service/ImportService.java
+++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/service/ImportService.java
@@ -30,10 +30,9 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
-
+import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-
 import org.onap.policy.common.logging.eelf.PolicyLogger;
 import org.onap.policy.common.logging.flexlogger.FlexLogger;
 import org.onap.policy.common.logging.flexlogger.Logger;
@@ -74,7 +73,8 @@
             StringBuilder builder = new StringBuilder();
             int ch;
             try {
-                while ((ch = request.getInputStream().read()) != -1) {
+                ServletInputStream stream = request.getInputStream();
+                while ((ch = stream.read()) != -1) {
                     builder.append((char) ch);
                 }
             } catch (IOException e) {
@@ -115,7 +115,7 @@
                     }
                     PolicyLogger.info("Request from API to import new Service");
                     try (Writer writer = new BufferedWriter(new OutputStreamWriter(
-                            new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
+                        new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
                         writer.write(xmi);
                     } catch (IOException e) {
                         logger.error(e);
@@ -125,7 +125,7 @@
                 } else {
                     InputStream inputStream = null;
                     try (FileOutputStream outputStream =
-                            new FileOutputStream(extractDir + File.separator + randomID + ".zip")) {
+                        new FileOutputStream(extractDir + File.separator + randomID + ".zip")) {
                         inputStream = request.getInputStream();
                         byte[] buffer = new byte[4096];
                         int bytesRead = -1;
@@ -178,7 +178,7 @@
                 }
                 PolicyLogger.info("Request from API to import new Optimization Service Model");
                 try (Writer writer = new BufferedWriter(new OutputStreamWriter(
-                        new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
+                    new FileOutputStream(extractDir + File.separator + randomID + type), "utf-8"))) {
                     writer.write(yml);
                 } catch (IOException e) {
                     logger.error(e);
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/HeartbeatTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/HeartbeatTest.java
new file mode 100644
index 0000000..13fb81d
--- /dev/null
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/HeartbeatTest.java
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.xacml.rest;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.att.research.xacml.api.pap.PAPException;
+import java.io.IOException;
+import org.junit.Test;
+
+public class HeartbeatTest {
+    @Test
+    public void testHeartbeat() throws IOException, PAPException {
+        Heartbeat hb = new Heartbeat(null);
+
+        assertThatThrownBy(hb::run).isInstanceOf(NullPointerException.class);
+        assertTrue(hb.isHeartBeatRunning());
+        hb.terminate();
+        assertFalse(hb.isHeartBeatRunning());
+    }
+}
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/UpdatePdpThreadTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/UpdatePdpThreadTest.java
new file mode 100644
index 0000000..9034f39
--- /dev/null
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/UpdatePdpThreadTest.java
@@ -0,0 +1,58 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.xacml.rest;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import org.junit.Test;
+import org.onap.policy.common.logging.OnapLoggingContext;
+import org.onap.policy.xacml.api.pap.OnapPDP;
+import org.onap.policy.xacml.std.pap.StdPDP;
+
+public class UpdatePdpThreadTest {
+    @Test
+    public void testConstructor1() {
+        UpdatePdpThread thread = new UpdatePdpThread(null, null);
+        assertNotNull(thread);
+    }
+
+    @Test
+    public void testConstructor2() {
+        OnapLoggingContext loggingContext = new OnapLoggingContext();
+        loggingContext.setRequestId("id");
+        UpdatePdpThread thread = new UpdatePdpThread(null, loggingContext, null);
+        assertNotNull(thread);
+    }
+
+    @Test
+    public void testRun() {
+        OnapPDP pdp = new StdPDP("http://id", 0);
+        OnapLoggingContext loggingContext = new OnapLoggingContext();
+        loggingContext.setRequestId("id");
+        List<Properties> properties = new ArrayList<Properties>();
+        UpdatePdpThread thread = new UpdatePdpThread(pdp, loggingContext, properties);
+        assertThatCode(thread::run).doesNotThrowAnyException();
+    }
+}
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPapsTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPapsTest.java
new file mode 100644
index 0000000..50c166a
--- /dev/null
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/components/NotifyOtherPapsTest.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.xacml.rest.components;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+import com.att.research.xacml.util.XACMLProperties;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.rest.jpa.PolicyDBDaoEntity;
+
+public class NotifyOtherPapsTest {
+    private static final String systemKey = XACMLProperties.XACML_PROPERTIES_NAME;
+    private static final String oldProperty = System.getProperty(systemKey);
+
+    @Before
+    public void setup() {
+        // Set the system property temporarily
+        System.setProperty(systemKey, "xacml.pap.properties");
+    }
+
+    @Test
+    public void negTestNotify() {
+        NotifyOtherPaps notify = new NotifyOtherPaps();
+        List<PolicyDBDaoEntity> otherServers = new ArrayList<PolicyDBDaoEntity>();
+        PolicyDBDaoEntity dbdaoEntity = new PolicyDBDaoEntity();
+        dbdaoEntity.setPolicyDBDaoUrl("http://test");
+        otherServers.add(dbdaoEntity);
+        long entityId = 0;
+        String entityType = "entityType";
+        String newGroupId = "newGroupId";
+        assertThatCode(() -> notify.startNotifyThreads(otherServers, entityId, entityType, newGroupId))
+            .doesNotThrowAnyException();
+    }
+
+    @After
+    public void cleanup() {
+        // Restore the original system property
+        if (oldProperty != null) {
+            System.setProperty(systemKey, oldProperty);
+        } else {
+            System.clearProperty(systemKey);
+        }
+    }
+}
diff --git a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/service/ImportServiceTest.java b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/service/ImportServiceTest.java
index 72d4926..3b826f6 100644
--- a/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/service/ImportServiceTest.java
+++ b/ONAP-PAP-REST/src/test/java/org/onap/policy/pap/xacml/rest/service/ImportServiceTest.java
@@ -20,14 +20,14 @@
 
 package org.onap.policy.pap.xacml.rest.service;
 
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 
 import com.mockrunner.mock.web.MockHttpServletRequest;
 import com.mockrunner.mock.web.MockHttpServletResponse;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-
 import org.junit.Test;
 
 public class ImportServiceTest {
@@ -39,4 +39,39 @@
         service.doImportMicroServicePut(request, response);
         assertEquals(response.getHeader("error"), "missing");
     }
+
+    @Test
+    public void testImportBRMS() {
+        ImportService service = new ImportService();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setupAddParameter("serviceName", "serviceName");
+        request.setupAddParameter("importService", "BRMSPARAM");
+        request.setBodyContent("foo");
+        HttpServletResponse response = new MockHttpServletResponse();
+        assertThatCode(() -> service.doImportMicroServicePut(request, response)).doesNotThrowAnyException();
+    }
+
+    @Test
+    public void testImportMS() {
+        ImportService service = new ImportService();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setupAddParameter("serviceName", "serviceName");
+        request.setupAddParameter("importService", "MICROSERVICE");
+        request.setupAddParameter("fileName", "fileName");
+        request.setBodyContent("foo");
+        HttpServletResponse response = new MockHttpServletResponse();
+        assertThatThrownBy(() -> service.doImportMicroServicePut(request, response)).isInstanceOf(Exception.class);
+    }
+
+    @Test
+    public void testImportOpt() {
+        ImportService service = new ImportService();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setupAddParameter("serviceName", "serviceName");
+        request.setupAddParameter("importService", "OPTIMIZATION");
+        request.setupAddParameter("fileName", "fileName");
+        request.setBodyContent("foo");
+        HttpServletResponse response = new MockHttpServletResponse();
+        assertThatThrownBy(() -> service.doImportMicroServicePut(request, response)).isInstanceOf(Exception.class);
+    }
 }
