diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/OnapLoggingContext.java b/common-logging/src/main/java/org/onap/policy/common/logging/OnapLoggingContext.java
index 0373abf..47c0504 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/OnapLoggingContext.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/OnapLoggingContext.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP-Logging
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -24,7 +24,6 @@
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Date;
-
 import org.onap.policy.common.logging.nsa.LoggingContextFactory;
 import org.onap.policy.common.logging.nsa.SharedLoggingContext;
 import org.slf4j.MDC;
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/eelf/PolicyLogger.java b/common-logging/src/main/java/org/onap/policy/common/logging/eelf/PolicyLogger.java
index 7bc2c1d..c582ea8 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/eelf/PolicyLogger.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/eelf/PolicyLogger.java
@@ -54,10 +54,8 @@
 import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.Instant;
-import java.util.Arrays;
 import java.util.Date;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Properties;
 import java.util.Timer;
 import java.util.UUID;
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/EelfLogger.java b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/EelfLogger.java
index df60fa9..837a584 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/EelfLogger.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/EelfLogger.java
@@ -21,10 +21,8 @@
 package org.onap.policy.common.logging.flexlogger;
 
 import com.att.eelf.configuration.EELFLogger.Level;
-
 import java.io.Serializable;
 import java.util.UUID;
-
 import org.onap.policy.common.logging.eelf.MessageCodes;
 import org.onap.policy.common.logging.eelf.PolicyLogger;
 
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/FlexLogger.java b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/FlexLogger.java
index 62459bc..eb6daee 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/FlexLogger.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/FlexLogger.java
@@ -29,7 +29,6 @@
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-
 import org.onap.policy.common.logging.eelf.PolicyLogger;
 import org.onap.policy.common.logging.flexlogger.PropertyUtil.Listener;
 
@@ -73,10 +72,8 @@
 
     /**
      * Returns an instance of Logger.
-     *
-     * @param name the name of the logger
      */
-    public static Logger getLogger(String name) {
+    public static Logger getLogger() {
         Logger logger = null;
         displayMessage(GET_LOGGER_PREFIX + loggerType);
         switch (loggerType) {
@@ -121,10 +118,9 @@
     /**
      * Returns an instance of Logger.
      *
-     * @param name the name of the logger
      * @param isNewTransaction is a new transaction
      */
-    public static Logger getLogger(String name, boolean isNewTransaction) {
+    public static Logger getLogger(boolean isNewTransaction) {
         Logger logger = null;
         displayMessage(GET_LOGGER_PREFIX + loggerType);
         switch (loggerType) {
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/Logger.java b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/Logger.java
index 315cd93..ad155a4 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/Logger.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/Logger.java
@@ -21,7 +21,6 @@
 package org.onap.policy.common.logging.flexlogger;
 
 import java.util.UUID;
-
 import org.onap.policy.common.logging.eelf.MessageCodes;
 
 /**
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/SystemOutLogger.java b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/SystemOutLogger.java
index bc7633d..a059bd7 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/SystemOutLogger.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/flexlogger/SystemOutLogger.java
@@ -23,11 +23,9 @@
 import static org.onap.policy.common.logging.flexlogger.DisplayUtils.displayMessage;
 
 import com.att.eelf.configuration.EELFLogger.Level;
-
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.UUID;
-
 import org.onap.policy.common.logging.OnapLoggingUtils;
 import org.onap.policy.common.logging.eelf.MessageCodes;
 import org.onap.policy.common.logging.eelf.PolicyLogger;
diff --git a/common-logging/src/main/java/org/onap/policy/common/logging/nsa/impl/SharedContext.java b/common-logging/src/main/java/org/onap/policy/common/logging/nsa/impl/SharedContext.java
index e5f5e65..13b38fc 100644
--- a/common-logging/src/main/java/org/onap/policy/common/logging/nsa/impl/SharedContext.java
+++ b/common-logging/src/main/java/org/onap/policy/common/logging/nsa/impl/SharedContext.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP-Logging
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -22,7 +22,6 @@
 
 import java.util.HashMap;
 import java.util.Map.Entry;
-
 import org.onap.policy.common.logging.nsa.LoggingContext;
 import org.onap.policy.common.logging.nsa.SharedLoggingContext;
 
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventDataTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventDataTest.java
index 6fe81d2..882cc2c 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventDataTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventDataTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Engine - Common Modules
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -21,13 +21,10 @@
 package org.onap.policy.common.logging.eelf;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 import java.time.Instant;
-
 import org.junit.Test;
 
 public class EventDataTest {
@@ -142,32 +139,33 @@
         final EventData d3 = new EventData("abc", iend, istart);
 
         // same object
-        assertTrue(d1.equals(d1));
+        assertEquals(d1, d1);
 
         // compare with null
-        assertFalse(d1.equals(null));
+        assertNotEquals(d1, null);
 
         // compare with request id
-        assertTrue(d1.equals("abc"));
-        assertFalse(d1.equals("abd"));
+        // note: ignoring sonar because we want to test d1.equals(), not "abc".equals()
+        assertEquals(d1, "abc");        // NOSONAR
+        assertNotEquals(d1, "abd");
 
         // compare with int - different class type
-        assertFalse(d1.equals(10));
+        assertNotEquals(d1, 10);
 
         // "this" has null request id
-        assertFalse(new EventData().equals(d1));
+        assertNotEquals(new EventData(), d1);
 
         // both null
-        assertTrue(new EventData().equals(new EventData()));
+        assertEquals(new EventData(), new EventData());
 
         // this request id is not null, other is null
-        assertFalse(d1.equals(new EventData()));
+        assertNotEquals(d1, new EventData());
 
         // neither null, same
-        assertTrue(d1.equals(d3));
+        assertEquals(d1, d3);
 
         // neither null, diff
-        assertFalse(d1.equals(d2));
+        assertNotEquals(d1, d2);
     }
 
 }
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoHandlerTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoHandlerTest.java
index d1d5983..2cc1e59 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoHandlerTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoHandlerTest.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Engine - Common Modules
  * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018, 2020 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.
@@ -24,7 +24,6 @@
 
 import java.time.Instant;
 import java.util.concurrent.ConcurrentMap;
-
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoTest.java
index e602468..0ca5feb 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/EventTrackInfoTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP Policy Engine - Common Modules
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -23,10 +23,10 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import java.time.Instant;
-
 import org.junit.Before;
 import org.junit.Test;
 
@@ -62,8 +62,8 @@
         info.storeEventData(data1);
         info.storeEventData(data2);
 
-        assertTrue(data1 == info.getEventDataByRequestId("abc"));
-        assertTrue(data2 == info.getEventDataByRequestId("def"));
+        assertSame(data1, info.getEventDataByRequestId("abc"));
+        assertSame(data2, info.getEventDataByRequestId("def"));
         assertNull(info.getEventDataByRequestId("hello"));
     }
 
@@ -86,14 +86,14 @@
         assertEquals(2, info.getEventInfo().size());
 
         // look-up by request id
-        assertTrue(data1 == info.getEventDataByRequestId("abc"));
-        assertTrue(data2 == info.getEventDataByRequestId("def"));
+        assertSame(data1, info.getEventDataByRequestId("abc"));
+        assertSame(data2, info.getEventDataByRequestId("def"));
 
         // doesn't replace existing value
         info.storeEventData(new EventData("abc", iend, istart));
         assertEquals(2, info.getEventInfo().size());
-        assertTrue(data1 == info.getEventDataByRequestId("abc"));
-        assertTrue(data2 == info.getEventDataByRequestId("def"));
+        assertSame(data1, info.getEventDataByRequestId("abc"));
+        assertSame(data2, info.getEventDataByRequestId("def"));
     }
 
     /**
@@ -111,7 +111,7 @@
 
         // look-up by request id
         assertNull(info.getEventDataByRequestId("abc"));
-        assertTrue(data2 == info.getEventDataByRequestId("def"));
+        assertSame(data2, info.getEventDataByRequestId("def"));
     }
 
     /**
@@ -123,8 +123,8 @@
         info.storeEventData(data2);
 
         assertEquals(2, info.getEventInfo().size());
-        assertTrue(data1 == info.getEventInfo().get("abc"));
-        assertTrue(data2 == info.getEventInfo().get("def"));
+        assertSame(data1, info.getEventInfo().get("abc"));
+        assertSame(data2, info.getEventInfo().get("def"));
     }
 
 }
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/PolicyLoggerTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/PolicyLoggerTest.java
index adb7d36..8688ea3 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/eelf/PolicyLoggerTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/eelf/PolicyLoggerTest.java
@@ -37,7 +37,6 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
 import static org.onap.policy.common.logging.eelf.OnapConfigProperties.PARTNER_NAME;
 import static org.onap.policy.common.logging.eelf.OnapConfigProperties.RESPONSE_CODE;
 import static org.onap.policy.common.logging.eelf.OnapConfigProperties.RESPONSE_DESCRIPTION;
@@ -46,11 +45,9 @@
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFLogger.Level;
-
 import java.time.Instant;
 import java.util.Properties;
 import java.util.UUID;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/FlexLoggerTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/FlexLoggerTest.java
index f43c85d..f5fcefe 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/FlexLoggerTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/FlexLoggerTest.java
@@ -52,15 +52,15 @@
     @Test
     public void testGetLoggerStringEelf() {
         Whitebox.setInternalState(FlexLogger.class, "loggerType", LoggerType.EELF);
-        Logger logger = FlexLogger.getLogger("str1");
-        assertSame(logger, FlexLogger.getLogger("str1"));
+        Logger logger = FlexLogger.getLogger();
+        assertSame(logger, FlexLogger.getLogger());
     }
 
     @Test
     public void testGetLoggerStringSystemOut() {
         Whitebox.setInternalState(FlexLogger.class, "loggerType", LoggerType.SYSTEMOUT);
-        Logger logger = FlexLogger.getLogger("str1");
-        assertSame(logger, FlexLogger.getLogger("str1"));
+        Logger logger = FlexLogger.getLogger();
+        assertSame(logger, FlexLogger.getLogger());
     }
 
     @Test
@@ -80,15 +80,15 @@
     @Test
     public void testGetLoggerStringBooleanEelf() {
         Whitebox.setInternalState(FlexLogger.class, "loggerType", LoggerType.EELF);
-        Logger logger = FlexLogger.getLogger("str1", true);
-        assertSame(logger, FlexLogger.getLogger("str1", true));
+        Logger logger = FlexLogger.getLogger(true);
+        assertSame(logger, FlexLogger.getLogger(true));
     }
 
     @Test
     public void testGetLoggerStringBooleanSystemOut() {
         Whitebox.setInternalState(FlexLogger.class, "loggerType", LoggerType.SYSTEMOUT);
-        Logger logger = FlexLogger.getLogger("str1", true);
-        assertSame(logger, FlexLogger.getLogger("str1", true));
+        Logger logger = FlexLogger.getLogger(true);
+        assertSame(logger, FlexLogger.getLogger(true));
     }
 
     @Test
diff --git a/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/SystemOutLoggerTest.java b/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/SystemOutLoggerTest.java
index cde423f..38c9e0d 100644
--- a/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/SystemOutLoggerTest.java
+++ b/common-logging/src/test/java/org/onap/policy/common/logging/flexlogger/SystemOutLoggerTest.java
@@ -27,11 +27,9 @@
 import static org.junit.Assert.assertTrue;
 
 import com.att.eelf.configuration.EELFLogger.Level;
-
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
 import java.util.UUID;
-
 import org.junit.Test;
 import org.onap.policy.common.logging.eelf.MessageCodes;
 import org.onap.policy.common.logging.eelf.PolicyLogger;
diff --git a/common-parameters/src/test/java/org/onap/policy/common/parameters/ExceptionTest.java b/common-parameters/src/test/java/org/onap/policy/common/parameters/ExceptionTest.java
index b874db6..48d2f4b 100644
--- a/common-parameters/src/test/java/org/onap/policy/common/parameters/ExceptionTest.java
+++ b/common-parameters/src/test/java/org/onap/policy/common/parameters/ExceptionTest.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2019-2020 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.
@@ -24,7 +24,6 @@
 import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
-
 import org.junit.Test;
 
 public class ExceptionTest {
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
index 39ec6bd..64a51d0 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
@@ -127,8 +127,8 @@
 
         ConvInfo wtr = writer;
 
-        @SuppressWarnings("rawtypes")
-        TypeAdapter conv = (wtr.clazz == clazz ? wtr.getConverter() : gson.getAdapter(clazz));
+        TypeAdapter<Object> conv =
+                        (wtr.clazz == clazz ? wtr.getConverter() : (TypeAdapter<Object>) gson.getAdapter(clazz));
 
         return conv.toJsonTree(object);
     }
@@ -316,36 +316,33 @@
         /**
          * Type on which the converter works.
          */
-        @SuppressWarnings("rawtypes")
-        private TypeToken type;
+        private TypeToken<?> type;
 
         /**
          * Class of object on which the converter works.
          */
-        @SuppressWarnings("rawtypes")
-        private Class clazz;
+        private Class<?> clazz;
 
         /**
          * Converter to use, initialized lazily.
          */
-        @SuppressWarnings("rawtypes")
-        private TypeAdapter conv = null;
+        private TypeAdapter<Object> conv = null;
 
         /**
          * Constructs the object.
          *
          * @param type type of object to be converted
          */
-        public ConvInfo(@SuppressWarnings("rawtypes") TypeToken type) {
+        public ConvInfo(TypeToken<?> type) {
             this.type = type;
             this.clazz = type.getRawType();
         }
 
-        @SuppressWarnings({"rawtypes", "unchecked"})
-        public final TypeAdapter getConverter() {
+        @SuppressWarnings("unchecked")
+        public final TypeAdapter<Object> getConverter() {
             if (conv == null) {
                 // race condition here, but it's ok to overwrite a previous value
-                this.conv = gson.getAdapter(type);
+                this.conv = (TypeAdapter<Object>) gson.getAdapter(type);
             }
 
             return conv;
diff --git a/integrity-audit/src/main/java/org/onap/policy/common/ia/DbDao.java b/integrity-audit/src/main/java/org/onap/policy/common/ia/DbDao.java
index 80177b3..28e8e38 100644
--- a/integrity-audit/src/main/java/org/onap/policy/common/ia/DbDao.java
+++ b/integrity-audit/src/main/java/org/onap/policy/common/ia/DbDao.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -48,7 +48,7 @@
  *
  */
 public class DbDao {
-    private static final Logger logger = FlexLogger.getLogger(DbDao.class.getName());
+    private static final Logger logger = FlexLogger.getLogger();
 
     private String resourceName;
     private String persistenceUnit;
@@ -505,17 +505,16 @@
 
             // if IntegrityAuditEntity entry exists for resourceName and PU, update it. If not
             // found, create a new entry
-            Query iaequery = em.createQuery(SELECT_STRING);
+            TypedQuery<IntegrityAuditEntity> iaequery = em.createQuery(SELECT_STRING, IntegrityAuditEntity.class);
             iaequery.setParameter("rn", resourceName);
             iaequery.setParameter("pu", persistenceUnit);
 
-            @SuppressWarnings("rawtypes")
-            List iaeList = iaequery.getResultList();
+            List<IntegrityAuditEntity> iaeList = iaequery.getResultList();
             IntegrityAuditEntity iae;
 
             if (!iaeList.isEmpty()) {
                 // ignores multiple results
-                iae = (IntegrityAuditEntity) iaeList.get(0);
+                iae = iaeList.get(0);
 
             } else {
                 // If it does not exist
diff --git a/integrity-audit/src/main/java/org/onap/policy/common/ia/jpa/IntegrityAuditEntity.java b/integrity-audit/src/main/java/org/onap/policy/common/ia/jpa/IntegrityAuditEntity.java
index c104682..a1d2116 100644
--- a/integrity-audit/src/main/java/org/onap/policy/common/ia/jpa/IntegrityAuditEntity.java
+++ b/integrity-audit/src/main/java/org/onap/policy/common/ia/jpa/IntegrityAuditEntity.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -24,7 +24,6 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditCompareEntriesTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditCompareEntriesTest.java
index 99cf4b2..ad154d3 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditCompareEntriesTest.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditCompareEntriesTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -30,12 +30,10 @@
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.onap.policy.common.ia.jpa.IaTestEntity;
 import org.onap.policy.common.ia.jpa.IntegrityAuditEntity;
@@ -419,7 +417,6 @@
     /*
      * Tests that comparison algorithm works for each entity in the database
      */
-    @Ignore
     @Test
     public void testCompareAllDbEntities() throws Exception {
         logger.info("testCompareAllDbEntities: Entering");
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditTest.java
index 220b063..4728fe8 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditTest.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -26,11 +26,9 @@
 
 import java.util.List;
 import java.util.Properties;
-
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTest.java
index ef21e83..79dfeb1 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTest.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -25,26 +25,18 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-/*
- * All JUnits are designed to run in the local development environment
- * where they have write privileges and can execute time-sensitive
- * tasks.
- */
-
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-
 import javax.persistence.PersistenceUnitUtil;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Root;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DefaultLoggingPatternTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DefaultLoggingPatternTest.java
index fda7e4a..5944443 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DefaultLoggingPatternTest.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/DefaultLoggingPatternTest.java
@@ -25,7 +25,6 @@
 
 import java.io.File;
 import java.io.IOException;
-
 import org.junit.AfterClass;
 import org.junit.Test;
 import org.onap.policy.common.utils.resources.TextFileUtils;
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditTest.java
index c9ff685..9550017 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditTest.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -21,10 +21,10 @@
 package org.onap.policy.common.ia;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.util.Properties;
-
 import org.junit.Test;
 
 public class IntegrityAuditTest {
@@ -41,7 +41,7 @@
         StringBuilder badParams = new StringBuilder();
         IntegrityAudit.parmsAreBad(null, SOMETHING, null, badParams);
 
-        assertFalse("".equals(badParams.toString()));
+        assertNotEquals("", badParams.toString());
         assertTrue(badParams.toString().contains(RESOURCE_NAME));
         assertTrue(badParams.toString().contains(PROPERTIES));
 
@@ -51,14 +51,14 @@
         props.put(IntegrityAuditProperties.DB_DRIVER, "test_db_driver");
         IntegrityAudit.parmsAreBad(null, SOMETHING, props, badParams);
 
-        assertFalse("".equals(badParams.toString()));
+        assertNotEquals("", badParams.toString());
         assertTrue(badParams.toString().contains(RESOURCE_NAME));
         assertFalse(badParams.toString().contains(PROPERTIES));
 
         // Try with 0 null params
         badParams = new StringBuilder();
         IntegrityAudit.parmsAreBad("someting", SOMETHING, props, badParams);
-        assertFalse("".equals(badParams.toString()));
+        assertNotEquals("", badParams.toString());
         assertFalse(badParams.toString().contains(RESOURCE_NAME));
         assertFalse(badParams.toString().contains(PROPERTIES));
 
@@ -66,7 +66,7 @@
         props.put(IntegrityAuditProperties.NODE_TYPE, "bogus");
         badParams = new StringBuilder();
         IntegrityAudit.parmsAreBad("someting", SOMETHING, props, badParams);
-        assertFalse("".equals(badParams.toString()));
+        assertNotEquals("", badParams.toString());
         assertTrue(badParams.toString().contains("nodeType"));
 
     }
diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/jpa/IaTestEntity.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/jpa/IaTestEntity.java
index 4a4824c..2ca8305 100644
--- a/integrity-audit/src/test/java/org/onap/policy/common/ia/jpa/IaTestEntity.java
+++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/jpa/IaTestEntity.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Audit
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -22,7 +22,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java
index d12a9bd..33c51e2 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/IntegrityMonitor.java
@@ -43,6 +43,7 @@
 import javax.persistence.LockModeType;
 import javax.persistence.Persistence;
 import javax.persistence.Query;
+import javax.persistence.TypedQuery;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.onap.policy.common.im.jmx.ComponentAdmin;
@@ -287,15 +288,15 @@
     }
 
     protected void createOrUpdateForwardProgress(String resourceName) {
-        Query fquery = em.createQuery(QUERY_STRING);
+        TypedQuery<ForwardProgressEntity> fquery = em.createQuery(QUERY_STRING, ForwardProgressEntity.class);
         fquery.setParameter("rn", resourceName);
 
-        @SuppressWarnings("rawtypes")
-        List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+        List<ForwardProgressEntity> fpList =
+                        fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
         ForwardProgressEntity fpx = null;
         if (!fpList.isEmpty()) {
             // ignores multiple results
-            fpx = (ForwardProgressEntity) fpList.get(0);
+            fpx = fpList.get(0);
             // refresh the object from DB in case cached data was returned
             em.refresh(fpx);
             if (logger.isDebugEnabled()) {
@@ -318,15 +319,17 @@
     }
 
     protected void createOrUpdateResourceReg(String resourceName, String jmxUrl, EntityTransaction et) {
-        Query rquery = em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn");
+        TypedQuery<ResourceRegistrationEntity> rquery =
+                        em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn",
+                                        ResourceRegistrationEntity.class);
         rquery.setParameter("rn", resourceName);
 
-        @SuppressWarnings("rawtypes")
-        List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+        List<ResourceRegistrationEntity> rrList =
+                        rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
         ResourceRegistrationEntity rrx = null;
         if (!rrList.isEmpty()) {
             // ignores multiple results
-            rrx = (ResourceRegistrationEntity) rrList.get(0);
+            rrx = rrList.get(0);
             // refresh the object from DB in case cached data was returned
             em.refresh(rrx);
             if (logger.isDebugEnabled()) {
@@ -555,41 +558,44 @@
         AtomicReference<StateManagementEntity> stateManagementEntity = new AtomicReference<>();
 
         String errorMsg =
-                withinTransaction(dep + ": ForwardProgressEntity DB operation failed with exception: ", () -> {
-                    Query query =
-                            em.createQuery("Select p from ForwardProgressEntity p where p.resourceName=:resource");
-                    query.setParameter(LC_RESOURCE_STRING, dep);
+            withinTransaction(dep + ": ForwardProgressEntity DB operation failed with exception: ", () -> {
+                TypedQuery<ForwardProgressEntity> query = em.createQuery(
+                                "Select p from ForwardProgressEntity p where p.resourceName=:resource",
+                                ForwardProgressEntity.class);
+                query.setParameter(LC_RESOURCE_STRING, dep);
 
-                    @SuppressWarnings("rawtypes")
-                    List fpList =
-                            query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+                List<ForwardProgressEntity> fpList = query.setLockMode(LockModeType.NONE)
+                                .setFlushMode(FlushModeType.COMMIT).getResultList();
 
-                    if (!fpList.isEmpty()) {
-                        // exists
-                        forwardProgressEntity.set((ForwardProgressEntity) fpList.get(0));
-                        // refresh the object from DB in case cached data was
-                        // returned
-                        em.refresh(forwardProgressEntity.get());
-                        logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}", dep);
-                        return null;
+                if (!fpList.isEmpty()) {
+                    // exists
+                    forwardProgressEntity.set(fpList.get(0));
+                    // refresh the object from DB in case cached data was
+                    // returned
+                    em.refresh(forwardProgressEntity.get());
+                    logger.debug("Found entry in ForwardProgressEntity table for dependent Resource={}",
+                                    dep);
+                    return null;
 
-                    } else {
-                        return dep + ": resource not found in ForwardProgressEntity database table";
-                    }
-                });
+                } else {
+                    return dep + ": resource not found in ForwardProgressEntity database table";
+                }
+            });
 
         if (errorMsg == null) {
             errorMsg = withinTransaction(dep + ": StateManagementEntity DB read failed with exception: ", () -> {
 
                 // query if StateManagement entry exists for dependent resource
-                Query query = em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource");
+                TypedQuery<StateManagementEntity> query =
+                                em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource",
+                                                StateManagementEntity.class);
                 query.setParameter(LC_RESOURCE_STRING, dep);
 
-                @SuppressWarnings("rawtypes")
-                List smList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+                List<StateManagementEntity> smList =
+                                query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
                 if (!smList.isEmpty()) {
                     // exist
-                    stateManagementEntity.set((StateManagementEntity) smList.get(0));
+                    stateManagementEntity.set(smList.get(0));
                     // refresh the object from DB in case cached data was
                     // returned
                     em.refresh(stateManagementEntity.get());
@@ -713,15 +719,15 @@
     }
 
     private String fpCheck2(String dep) {
-        Query fquery = em.createQuery(QUERY_STRING);
+        TypedQuery<ForwardProgressEntity> fquery = em.createQuery(QUERY_STRING, ForwardProgressEntity.class);
         fquery.setParameter("rn", dep);
 
-        @SuppressWarnings("rawtypes")
-        List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+        List<ForwardProgressEntity> fpList =
+                        fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
         ForwardProgressEntity fpx;
         if (!fpList.isEmpty()) {
             // ignores multiple results
-            fpx = (ForwardProgressEntity) fpList.get(0);
+            fpx = fpList.get(0);
             // refresh the object from DB in case cached data was returned
             em.refresh(fpx);
             if (logger.isDebugEnabled()) {
@@ -794,16 +800,18 @@
 
     private String getJmxUrlFromDb(String dep, AtomicReference<String> jmxUrl) {
         // query if ResourceRegistration entry exists for resourceName
-        Query rquery = em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn");
+        TypedQuery<ResourceRegistrationEntity> rquery =
+                        em.createQuery("Select r from ResourceRegistrationEntity r where r.resourceName=:rn",
+                                        ResourceRegistrationEntity.class);
         rquery.setParameter("rn", dep);
 
-        @SuppressWarnings("rawtypes")
-        List rrList = rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+        List<ResourceRegistrationEntity> rrList =
+                        rquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
         ResourceRegistrationEntity rrx = null;
 
         if (!rrList.isEmpty()) {
             // ignores multiple results
-            rrx = (ResourceRegistrationEntity) rrList.get(0);
+            rrx = rrList.get(0);
             // refresh the object from DB in case cached data was
             // returned
             em.refresh(rrx);
@@ -1197,15 +1205,15 @@
 
         try {
             // query if ForwardProgress entry exists for resourceName
-            Query fquery = em.createQuery(QUERY_STRING);
+            TypedQuery<ForwardProgressEntity> fquery = em.createQuery(QUERY_STRING, ForwardProgressEntity.class);
             fquery.setParameter("rn", resourceName);
 
-            @SuppressWarnings("rawtypes")
-            List fpList = fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+            List<ForwardProgressEntity> fpList =
+                            fquery.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
             ForwardProgressEntity fpx;
             if (!fpList.isEmpty()) {
                 // ignores multiple results
-                fpx = (ForwardProgressEntity) fpList.get(0);
+                fpx = fpList.get(0);
                 // refresh the object from DB in case cached data was returned
                 em.refresh(fpx);
                 if (logger.isDebugEnabled()) {
@@ -1544,14 +1552,16 @@
 
         try {
             // query if StateManagement entry exists for fpe resource
-            Query query = em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource");
+            TypedQuery<StateManagementEntity> query =
+                            em.createQuery("Select p from StateManagementEntity p where p.resourceName=:resource",
+                                            StateManagementEntity.class);
             query.setParameter(LC_RESOURCE_STRING, fpe.getResourceName());
 
-            @SuppressWarnings("rawtypes")
-            List smList = query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
+            List<StateManagementEntity> smList =
+                            query.setLockMode(LockModeType.NONE).setFlushMode(FlushModeType.COMMIT).getResultList();
             if (!smList.isEmpty()) {
                 // exists
-                sme = (StateManagementEntity) smList.get(0);
+                sme = smList.get(0);
                 // refresh the object from DB in case cached data was
                 // returned
                 em.refresh(sme);
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jmx/ComponentAdmin.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jmx/ComponentAdmin.java
index bd7ed7b..cf7a968 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jmx/ComponentAdmin.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jmx/ComponentAdmin.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -22,7 +22,6 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
-
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.InstanceNotFoundException;
 import javax.management.MBeanRegistrationException;
@@ -31,7 +30,6 @@
 import javax.management.MalformedObjectNameException;
 import javax.management.NotCompliantMBeanException;
 import javax.management.ObjectName;
-
 import org.onap.policy.common.im.IntegrityMonitor;
 import org.onap.policy.common.im.IntegrityMonitorException;
 import org.onap.policy.common.im.StateManagement;
@@ -54,7 +52,7 @@
 
     /**
      * Constructor.
-     * 
+     *
      * @param name the MBean name
      * @param integrityMonitor the integrity monitor
      * @param stateManager the state manager
@@ -81,7 +79,7 @@
 
     /**
      * Registers with the MBean server.
-     * 
+     *
      * @throws ComponentAdminException a JMX exception
      */
     public synchronized void register() throws ComponentAdminException {
@@ -114,7 +112,7 @@
 
     /**
      * Checks if this MBean is registered with the MBeanServer.
-     * 
+     *
      * @return true if this MBean is registered with the MBeanServer.
      */
     public boolean isRegistered() {
@@ -123,7 +121,7 @@
 
     /**
      * Unregisters with the MBean server.
-     * 
+     *
      * @throws ComponentAdminException a JMX exception
      */
     public synchronized void unregister() throws ComponentAdminException {
@@ -151,7 +149,7 @@
 
     /**
      * Finds the MBeanServer.
-     * 
+     *
      * @return the MBeanServer, or null if it is not found
      */
     public static MBeanServer findMBeanServer() {
@@ -172,7 +170,7 @@
 
     /**
      * Creates the MBeanServer (intended for unit testing only).
-     * 
+     *
      * @return the MBeanServer
      */
     public static MBeanServer createMBeanServer() {
@@ -181,7 +179,7 @@
 
     /**
      * Get the MBean object name for the specified feature name.
-     * 
+     *
      * @param componentName component name
      * @return the object name
      * @throws MalformedObjectNameException a JMX exception
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ForwardProgressEntity.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ForwardProgressEntity.java
index f0ea2c0..0e0c24c 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ForwardProgressEntity.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ForwardProgressEntity.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -22,7 +22,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -91,7 +90,7 @@
 
     /**
      * Get the forward progress Id.
-     * 
+     *
      * @return the Id
      */
     public long getForwardProgressId() {
@@ -108,7 +107,7 @@
 
     /**
      * Get the fpcCount.
-     * 
+     *
      * @return the fpcCount
      */
     public long getFpcCount() {
@@ -117,7 +116,7 @@
 
     /**
      * Set the fpcCount.
-     * 
+     *
      * @param fpcCount the fpcCount to set
      */
     public void setFpcCount(long fpcCount) {
@@ -126,7 +125,7 @@
 
     /**
      * Get the lastUpdated.
-     * 
+     *
      * @return the lastUpdated
      */
     public Date getLastUpdated() {
@@ -135,7 +134,7 @@
 
     /**
      * Set the lastUpdated.
-     * 
+     *
      * @param lastUpdated the lastUpdated to set
      */
     public void setLastUpdated(Date lastUpdated) {
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ImTestEntity.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ImTestEntity.java
index 1822578..6c710f2 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ImTestEntity.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ImTestEntity.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -22,7 +22,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -87,7 +86,7 @@
 
     /**
      * Get the Im test Id.
-     * 
+     *
      * @return the Id
      */
     public long getImTestId() {
@@ -96,7 +95,7 @@
 
     /**
      * Get the createdBy.
-     * 
+     *
      * @return the createdBy
      */
     public String getCreatedBy() {
@@ -105,7 +104,7 @@
 
     /**
      * Set the createdBy.
-     * 
+     *
      * @param createdBy the createdBy to set
      */
     public void setCreatedBy(String createdBy) {
@@ -114,7 +113,7 @@
 
     /**
      * Get the modifiedBy.
-     * 
+     *
      * @return the modifiedBy
      */
     public String getModifiedBy() {
@@ -123,7 +122,7 @@
 
     /**
      * Set the ModifiedBy.
-     * 
+     *
      * @param modifiedBy the modifiedBy to set
      */
     public void setModifiedBy(String modifiedBy) {
@@ -132,7 +131,7 @@
 
     /**
      * Get the modifiedDate.
-     * 
+     *
      * @return the modifiedDate
      */
     public Date getModifiedDate() {
@@ -141,7 +140,7 @@
 
     /**
      * Set the modifiedDate.
-     * 
+     *
      * @param modifiedDate the modifiedDate to set
      */
     public void setModifiedDate(Date modifiedDate) {
@@ -150,7 +149,7 @@
 
     /**
      * Get the createdDate.
-     * 
+     *
      * @return the createdDate
      */
     public Date getCreatedDate() {
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ResourceRegistrationEntity.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ResourceRegistrationEntity.java
index 42e141a..e23553f 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ResourceRegistrationEntity.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/ResourceRegistrationEntity.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018, 2020 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.
@@ -22,7 +22,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -99,7 +98,7 @@
 
     /**
      * Get the resource registration Id.
-     * 
+     *
      * @return the Id
      */
     public long getResourceRegistrationId() {
@@ -140,7 +139,7 @@
 
     /**
      * Get the createdDate.
-     * 
+     *
      * @return the createdDate
      */
     public Date getCreatedDate() {
@@ -149,7 +148,7 @@
 
     /**
      * Get the lastUpdated.
-     * 
+     *
      * @return the lastUpdated
      */
     public Date getLastUpdated() {
@@ -158,7 +157,7 @@
 
     /**
      * Set the lastUpdated.
-     * 
+     *
      * @param lastUpdated the lastUpdated to set
      */
     public void setLastUpdated(Date lastUpdated) {
diff --git a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java
index 494931d..3067781 100644
--- a/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java
+++ b/integrity-monitor/src/main/java/org/onap/policy/common/im/jpa/StateManagementEntity.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -22,7 +22,6 @@
 
 import java.io.Serializable;
 import java.util.Date;
-
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
diff --git a/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementEntityTest.java b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementEntityTest.java
index 3e482dd..10ab9f3 100644
--- a/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementEntityTest.java
+++ b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementEntityTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Integrity Monitor
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -23,9 +23,7 @@
 import static org.junit.Assert.assertEquals;
 
 import java.util.List;
-
 import javax.persistence.Query;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
diff --git a/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementTest.java b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementTest.java
index dccef6a..680a73e 100644
--- a/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementTest.java
+++ b/integrity-monitor/src/test/java/org/onap/policy/common/im/StateManagementTest.java
@@ -34,7 +34,6 @@
 import javax.persistence.PersistenceException;
 import javax.persistence.QueryTimeoutException;
 import javax.persistence.TypedQuery;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/Topic.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/Topic.java
index 96c00c7..6532a19 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/Topic.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/Topic.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Samsung Electronics Co., Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,6 @@
 package org.onap.policy.common.endpoints.event.comm;
 
 import java.util.List;
-
 import org.onap.policy.common.capabilities.Lockable;
 import org.onap.policy.common.capabilities.Startable;
 
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java
index 1666990..00bd9e3 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineBusTopicSink.java
@@ -22,7 +22,6 @@
 package org.onap.policy.common.endpoints.event.comm.bus.internal;
 
 import java.util.UUID;
-
 import org.onap.policy.common.endpoints.event.comm.bus.BusTopicSink;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineDmaapTopicSink.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineDmaapTopicSink.java
index ba556bb..a7a692d 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineDmaapTopicSink.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/InlineDmaapTopicSink.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
  * Modified Copyright (C) 2018 Samsung Electronics Co., Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,6 @@
 package org.onap.policy.common.endpoints.event.comm.bus.internal;
 
 import java.util.Map;
-
 import org.onap.policy.common.endpoints.event.comm.Topic;
 import org.onap.policy.common.endpoints.event.comm.bus.DmaapTopicSink;
 import org.slf4j.Logger;
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java
index d0d25a2..e52204f 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedBusTopicSource.java
@@ -24,7 +24,6 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.util.UUID;
-
 import org.onap.policy.common.endpoints.event.comm.FilterableTopicSource;
 import org.onap.policy.common.endpoints.event.comm.TopicListener;
 import org.onap.policy.common.endpoints.event.comm.bus.BusTopicSource;
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
index 6ed2e31..c5f2b5b 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/SingleThreadedDmaapTopicSource.java
@@ -23,7 +23,6 @@
 
 import java.net.MalformedURLException;
 import java.util.Map;
-
 import org.onap.policy.common.endpoints.event.comm.Topic;
 import org.onap.policy.common.endpoints.event.comm.bus.DmaapTopicSource;
 import org.slf4j.Logger;
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/TopicBase.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/TopicBase.java
index 6f07df1..2e0a9a4 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/TopicBase.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/bus/internal/TopicBase.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 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.
@@ -22,7 +22,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
 import org.apache.commons.collections4.queue.CircularFifoQueue;
 import org.onap.policy.common.endpoints.event.comm.Topic;
 import org.onap.policy.common.endpoints.event.comm.TopicListener;
@@ -76,10 +75,10 @@
 
     /**
      * Instantiates a new Topic Base.
-     * 
+     *
      * @param servers list of servers
      * @param topic topic name
-     * 
+     *
      * @throws IllegalArgumentException if invalid parameters are present
      */
     public TopicBase(List<String> servers, String topic) {
@@ -152,7 +151,7 @@
 
     /**
      * Broadcast event to all listeners.
-     * 
+     *
      * @param message the event
      * @return true if all notifications are performed with no error, false otherwise
      */
@@ -173,7 +172,7 @@
 
     /**
      * Take a snapshot of current topic listeners.
-     * 
+     *
      * @return the topic listeners
      */
     protected synchronized List<TopicListener> snapshotTopicListeners() {
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java
index 4987484..8a13315 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java
@@ -26,7 +26,6 @@
 import javax.ws.rs.client.InvocationCallback;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
-
 import org.onap.policy.common.capabilities.Startable;
 
 /**
diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/parameters/RestServerParameters.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/parameters/RestServerParameters.java
index 85f1f45..53154b9 100644
--- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/parameters/RestServerParameters.java
+++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/parameters/RestServerParameters.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2020 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.
@@ -21,7 +22,6 @@
 package org.onap.policy.common.endpoints.parameters;
 
 import lombok.Getter;
-
 import org.onap.policy.common.parameters.ParameterGroupImpl;
 import org.onap.policy.common.parameters.annotations.Min;
 import org.onap.policy.common.parameters.annotations.NotBlank;
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/TopicEndpointProxyTest.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/TopicEndpointProxyTest.java
index a661b06..e47b266 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/TopicEndpointProxyTest.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/TopicEndpointProxyTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 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.
@@ -31,7 +31,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
-
 import org.junit.After;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/BusTopicFactoryTestBase.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/BusTopicFactoryTestBase.java
index b5c9e61..7a819e0 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/BusTopicFactoryTestBase.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/BusTopicFactoryTestBase.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * policy-endpoints
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -25,6 +25,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.onap.policy.common.endpoints.properties.PolicyEndPointProperties.PROPERTY_ALLOW_SELF_SIGNED_CERTIFICATES_SUFFIX;
 import static org.onap.policy.common.endpoints.properties.PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX;
@@ -82,7 +84,7 @@
         assertNotNull(item2);
         assertEquals(item.getTopic(), item.getEffectiveTopic());
         assertNotEquals(item2.getTopic(), item2.getEffectiveTopic());
-        assertTrue(item != item2);
+        assertNotSame(item, item2);
 
         // duplicate topics, but since they aren't managed, they should be different
         T item3 = buildTopic(makeBuilder().managed(false).build());
@@ -91,9 +93,9 @@
         assertNotNull(item4);
         assertEquals(MY_TOPIC, item4.getTopic());
         assertEquals(TOPIC2, item4.getEffectiveTopic());
-        assertTrue(item != item3);
-        assertTrue(item != item4);
-        assertTrue(item3 != item4);
+        assertNotSame(item, item3);
+        assertNotSame(item, item4);
+        assertNotSame(item3, item4);
 
         // two managed topics
         T item5 = buildTopic(makeBuilder().build());
@@ -102,8 +104,8 @@
         assertNotNull(item6);
 
         // re-build same managed topics - should get exact same objects
-        assertTrue(item5 == buildTopic(makeBuilder().topic(MY_TOPIC).build()));
-        assertTrue(item6 == buildTopic(makeBuilder().topic(TOPIC2).build()));
+        assertSame(item5, buildTopic(makeBuilder().topic(MY_TOPIC).build()));
+        assertSame(item6, buildTopic(makeBuilder().topic(TOPIC2).build()));
     }
 
     /**
@@ -135,11 +137,11 @@
 
         T item2 = buildTopic(servers, TOPIC2);
         assertNotNull(item2);
-        assertTrue(item1 != item2);
+        assertNotSame(item1, item2);
 
         // duplicate - should be the same, as these topics are managed
         T item3 = buildTopic(servers, TOPIC2);
-        assertTrue(item2 == item3);
+        assertSame(item2, item3);
     }
 
     /**
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpointTest.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpointTest.java
index 0974a04..6cdb628 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpointTest.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/NoopTopicEndpointTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 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.
@@ -29,7 +29,6 @@
 
 import java.util.Arrays;
 import java.util.Collections;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/TopicFactoryTestBase.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/TopicFactoryTestBase.java
index d8a1642..9795fd3 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/TopicFactoryTestBase.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/event/comm/bus/TopicFactoryTestBase.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * policy-endpoints
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -24,6 +24,8 @@
 import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.onap.policy.common.endpoints.properties.PolicyEndPointProperties.PROPERTY_TOPIC_SERVERS_SUFFIX;
 
@@ -126,9 +128,9 @@
 
         int index = 0;
         T item = lst.get(index++);
-        assertTrue(item != lst.get(index++));
-        assertTrue(item == lst.get(index++));
-        assertTrue(item == lst.get(index++));
+        assertNotSame(item, lst.get(index++));
+        assertSame(item, lst.get(index++));
+        assertSame(item, lst.get(index++));
     }
 
     /**
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/HttpServerTest.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/HttpServerTest.java
index cbe5a5a..2ff1d56 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/HttpServerTest.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/HttpServerTest.java
@@ -27,10 +27,10 @@
 import static org.assertj.core.api.Assertions.catchThrowable;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import com.google.gson.Gson;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.HttpURLConnection;
@@ -401,13 +401,13 @@
         assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port2).isAlive());
 
         String response = http(portUrl + JUNIT_ECHO_HELLO);
-        assertTrue(HELLO.equals(response));
+        assertEquals(HELLO, response);
 
         response = http(portUrl + SWAGGER_JSON);
-        assertTrue(response != null);
+        assertNotNull(response);
 
         response = http(LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
-        assertTrue(HELLO.equals(response));
+        assertEquals(HELLO, response);
 
         assertThatThrownBy(() -> http(LOCALHOST_PREFIX + port2 + SWAGGER_JSON)).isInstanceOf(IOException.class);
 
@@ -429,7 +429,7 @@
         assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
 
         String response = http(portUrl + JUNIT_ECHO_HELLO);
-        assertTrue(HELLO.equals(response));
+        assertEquals(HELLO, response);
 
         response = http(portUrl + "/junit/endpoints/http/servers");
         assertTrue(response.contains(randomName));
@@ -451,7 +451,7 @@
         assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
 
         String response = http(portUrl + JUNIT_ECHO_HELLO);
-        assertTrue(HELLO.equals(response));
+        assertEquals(HELLO, response);
 
         HttpServletServerFactoryInstance.getServerFactory().destroy();
         assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
@@ -472,7 +472,7 @@
         assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
 
         String response = http(portUrl + JUNIT_ECHO_HELLO);
-        assertTrue(HELLO.equals(response));
+        assertEquals(HELLO, response);
 
         response = http(portUrl + "/junit/endpoints/http/servers");
         assertTrue(response.contains(randomName));
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/MyJacksonProvider.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/MyJacksonProvider.java
index 8c4eea5..cd922eb 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/MyJacksonProvider.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/MyJacksonProvider.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,10 +28,8 @@
 import java.lang.reflect.Type;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
-
 import lombok.AccessLevel;
 import lombok.Setter;
-
 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
 
 /**
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/RestEndpoints.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/RestEndpoints.java
index 6ada15c..cafab42 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/RestEndpoints.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/http/server/test/RestEndpoints.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * policy-endpoints
  * ================================================================================
- * Copyright (C) 2017, 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017, 2019-2020 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.
@@ -21,12 +21,10 @@
 package org.onap.policy.common.endpoints.http.server.test;
 
 import java.util.List;
-
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-
 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
 
diff --git a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/report/TestHealthCheckReport.java b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/report/TestHealthCheckReport.java
index ebab616..36970d7 100644
--- a/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/report/TestHealthCheckReport.java
+++ b/policy-endpoints/src/test/java/org/onap/policy/common/endpoints/report/TestHealthCheckReport.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
+ *  Modifications Copyright (C) 2020 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.
@@ -27,7 +28,6 @@
 import com.openpojo.validation.rule.impl.SetterMustExistRule;
 import com.openpojo.validation.test.impl.GetterTester;
 import com.openpojo.validation.test.impl.SetterTester;
-
 import org.junit.Test;
 import org.onap.policy.common.utils.test.ToStringTester;
 
diff --git a/utils-test/src/main/java/org/onap/policy/common/utils/test/ThrowablesTester.java b/utils-test/src/main/java/org/onap/policy/common/utils/test/ThrowablesTester.java
index f051a10..fd819b2 100644
--- a/utils-test/src/main/java/org/onap/policy/common/utils/test/ThrowablesTester.java
+++ b/utils-test/src/main/java/org/onap/policy/common/utils/test/ThrowablesTester.java
@@ -27,7 +27,6 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/utils-test/src/main/java/org/onap/policy/common/utils/test/ToStringTester.java b/utils-test/src/main/java/org/onap/policy/common/utils/test/ToStringTester.java
index f9ae39a..18502a3 100644
--- a/utils-test/src/main/java/org/onap/policy/common/utils/test/ToStringTester.java
+++ b/utils-test/src/main/java/org/onap/policy/common/utils/test/ToStringTester.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2018 Ericsson. All rights reserved.
- *  Modifications Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ *  Modifications Copyright (C) 2018-2020 AT&T Intellectual Property. All rights reserved.
  *  Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,7 +29,6 @@
 import com.openpojo.validation.affirm.Affirm;
 import com.openpojo.validation.test.Tester;
 import com.openpojo.validation.utils.ValidationHelper;
-
 import org.hamcrest.Matcher;
 
 
diff --git a/utils-test/src/test/java/org/onap/policy/common/utils/test/log/logback/ExtractAppenderTest.java b/utils-test/src/test/java/org/onap/policy/common/utils/test/log/logback/ExtractAppenderTest.java
index 2eb0736..4c2237f 100644
--- a/utils-test/src/test/java/org/onap/policy/common/utils/test/log/logback/ExtractAppenderTest.java
+++ b/utils-test/src/test/java/org/onap/policy/common/utils/test/log/logback/ExtractAppenderTest.java
@@ -26,13 +26,11 @@
 import ch.qos.logback.classic.Level;
 import ch.qos.logback.classic.Logger;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
diff --git a/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java b/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
index 58e2baf..2acc67a 100644
--- a/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
+++ b/utils/src/main/java/org/onap/policy/common/utils/resources/ResourceUtils.java
@@ -33,7 +33,6 @@
 import java.util.TreeSet;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/utils/src/main/java/org/onap/policy/common/utils/services/OrderedServiceImpl.java b/utils/src/main/java/org/onap/policy/common/utils/services/OrderedServiceImpl.java
index bbd3022..7c5c9cb 100644
--- a/utils/src/main/java/org/onap/policy/common/utils/services/OrderedServiceImpl.java
+++ b/utils/src/main/java/org/onap/policy/common/utils/services/OrderedServiceImpl.java
@@ -2,14 +2,14 @@
  * ============LICENSE_START=======================================================
  * utils
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 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.
@@ -24,18 +24,18 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.ServiceLoader;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * This class is a template for building a sorted list of service instances,
- * which are discovered and created using 'ServiceLoader'. 
+ * which are discovered and created using 'ServiceLoader'.
  */
 public class OrderedServiceImpl<T extends OrderedService> {
     // logger
-    private static Logger  logger = LoggerFactory.getLogger(OrderedServiceImpl.class); 
+    private static Logger  logger = LoggerFactory.getLogger(OrderedServiceImpl.class);
 
     // sorted list of instances implementing the service
     private List<T> implementers = null;
@@ -44,8 +44,7 @@
     private ServiceLoader<T> serviceLoader = null;
 
     // use this to ensure that we only use one unique instance of each class
-    @SuppressWarnings("rawtypes")
-    private static HashMap<Class,OrderedService> classToSingleton = new HashMap<>();
+    private static Map<Class<?>,OrderedService> classToSingleton = new HashMap<>();
 
     /**
      * Constructor - create the 'ServiceLoader' instance.
@@ -60,7 +59,7 @@
 
     /**
      * Get List of implementers.
-     * 
+     *
      * @return the sorted list of services implementing interface 'T' discovered
      *     by 'ServiceLoader'.
      */
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
index 83017e7..47453df 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 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.
@@ -23,13 +23,10 @@
 import static org.junit.Assert.assertEquals;
 
 import com.google.gson.annotations.SerializedName;
-
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.List;
-
 import lombok.Getter;
-
 import org.junit.Before;
 import org.junit.Test;
 
@@ -102,4 +99,4 @@
         private String port;
         private String pass;
     }
-}
\ No newline at end of file
+}
diff --git a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrCloserTest.java b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrCloserTest.java
index 589d092..b8730a6 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrCloserTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrCloserTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Common Utils
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.verify;
 
 import javax.persistence.EntityManager;
-
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrFactoryCloserTest.java b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrFactoryCloserTest.java
index ca2b722..3981e2a 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrFactoryCloserTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityMgrFactoryCloserTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Common Utils
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.verify;
 
 import javax.persistence.EntityManagerFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityTransCloserTest.java b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityTransCloserTest.java
index d764e9d..3b6e495 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityTransCloserTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/jpa/EntityTransCloserTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * Common Utils
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -28,7 +28,6 @@
 import static org.mockito.Mockito.when;
 
 import javax.persistence.EntityTransaction;
-
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/utils/src/test/java/org/onap/policy/common/utils/network/NetworkUtilTest.java b/utils/src/test/java/org/onap/policy/common/utils/network/NetworkUtilTest.java
index a0b8353..4ae7284 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/network/NetworkUtilTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/network/NetworkUtilTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * policy-utils
  * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2020 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.
@@ -22,6 +22,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
@@ -67,7 +68,7 @@
     public void testAllocPort_testAllocPortString__testAllocPortInetSocketAddress() throws Exception {
         // allocate wild-card port
         int wildCardPort = NetworkUtil.allocPort();
-        assertTrue(wildCardPort != 0);
+        assertNotEquals(0, wildCardPort);
 
         // verify that we can listen on the port
         try (ServerSocket wildSocket = new ServerSocket(wildCardPort)) {
@@ -78,10 +79,10 @@
 
         // allocate port using host name
         int localPort = NetworkUtil.allocPort(LOCALHOST);
-        assertTrue(localPort != 0);
+        assertNotEquals(0, localPort);
 
         // the OS should have allocated a new port, even though the first has been closed
-        assertTrue(localPort != wildCardPort);
+        assertNotEquals(wildCardPort, localPort);
 
         try (ServerSocket localSocket = new ServerSocket()) {
             localSocket.bind(new InetSocketAddress(LOCALHOST, localPort));
diff --git a/utils/src/test/java/org/onap/policy/common/utils/resources/ResourceUtilsTest.java b/utils/src/test/java/org/onap/policy/common/utils/resources/ResourceUtilsTest.java
index af98e30..2e12218 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/resources/ResourceUtilsTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/resources/ResourceUtilsTest.java
@@ -34,7 +34,6 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Set;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -234,10 +233,10 @@
         assertNotNull(theString);
 
         theString = ResourceUtils.getResourceAsString(tmpEmptyFile.getAbsolutePath());
-        assertTrue(theString.equals(""));
+        assertEquals("", theString);
 
         theString = ResourceUtils.getResourceAsString(tmpUsedFile.getAbsolutePath());
-        assertTrue(theString.equals("Bluebirds fly over the rainbow"));
+        assertEquals("Bluebirds fly over the rainbow", theString);
 
         theString = ResourceUtils.getResourceAsString(jarFileResource);
         assertNotNull(theString);
diff --git a/utils/src/test/java/org/onap/policy/common/utils/resources/TextFileUtilsTest.java b/utils/src/test/java/org/onap/policy/common/utils/resources/TextFileUtilsTest.java
index 0952b16..67cdab5 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/resources/TextFileUtilsTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/resources/TextFileUtilsTest.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Modifications Copyright (C) 2020 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.
@@ -25,7 +26,6 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
-
 import org.junit.Test;
 
 /**
diff --git a/utils/src/test/java/org/onap/policy/common/utils/validation/VersionTest.java b/utils/src/test/java/org/onap/policy/common/utils/validation/VersionTest.java
index 1a45f9e..4673233 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/validation/VersionTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/validation/VersionTest.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,7 @@
 package org.onap.policy.common.utils.validation;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
@@ -48,7 +48,7 @@
     public void testHashCode() {
         int hash = vers.hashCode();
         int hash2 = new Version(MAJOR, MINOR, PATCH + 1).hashCode();
-        assertTrue(hash != hash2);
+        assertNotEquals(hash, hash2);
     }
 
     @Test
@@ -72,16 +72,16 @@
 
     @Test
     public void testEquals() {
-        assertFalse(vers.equals(null));
-        assertFalse(vers.equals(new Object()));
+        assertNotEquals(vers, null);
+        assertNotEquals(vers, new Object());
 
-        assertTrue(vers.equals(vers));
+        assertEquals(vers, vers);
 
-        assertTrue(vers.equals(new Version(MAJOR, MINOR, PATCH)));
+        assertEquals(vers, new Version(MAJOR, MINOR, PATCH));
 
-        assertFalse(vers.equals(new Version(MAJOR + 1, MINOR, PATCH)));
-        assertFalse(vers.equals(new Version(MAJOR, MINOR + 1, PATCH)));
-        assertFalse(vers.equals(new Version(MAJOR, MINOR, PATCH + 1)));
+        assertNotEquals(vers, new Version(MAJOR + 1, MINOR, PATCH));
+        assertNotEquals(vers, new Version(MAJOR, MINOR + 1, PATCH));
+        assertNotEquals(vers, new Version(MAJOR, MINOR, PATCH + 1));
     }
 
     @Test
@@ -89,7 +89,7 @@
         vers = new Version(101, 201, 301);
 
         // equals case
-        assertTrue(new Version(101, 201, 301).compareTo(vers) == 0);
+        assertEquals(0, new Version(101, 201, 301).compareTo(vers));
 
         // major takes precedence
         assertTrue(new Version(102, 200, 300).compareTo(vers) > 0);
@@ -139,4 +139,4 @@
     public void testVersion() {
         assertEquals("0.0.0", new Version().toString());
     }
-}
\ No newline at end of file
+}
