Reverting "Merge "fix try block""
[policy/engine.git] / ONAP-PAP-REST / src / main / java / org / onap / policy / pap / xacml / rest / components / PolicyDBDao.java
index d2ed1ad..a8449e3 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP-PAP-REST
  * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2018 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,13 +31,13 @@ import java.io.StringReader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.ProtocolException;
+import java.net.URI;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.security.Key;
 import java.util.Base64;
 import java.util.Date;
 import java.util.HashMap;
@@ -49,8 +49,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
-import javax.crypto.Cipher;
-import javax.crypto.spec.SecretKeySpec;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.LockModeType;
@@ -71,6 +69,7 @@ import org.onap.policy.common.logging.flexlogger.Logger;
 import org.onap.policy.pap.xacml.rest.XACMLPapServlet;
 import org.onap.policy.rest.XACMLRestProperties;
 import org.onap.policy.rest.adapter.PolicyRestAdapter;
+import org.onap.policy.rest.dao.PolicyDBException;
 import org.onap.policy.rest.jpa.ActionBodyEntity;
 import org.onap.policy.rest.jpa.ConfigurationDataEntity;
 import org.onap.policy.rest.jpa.DatabaseLockEntity;
@@ -78,7 +77,7 @@ import org.onap.policy.rest.jpa.GroupEntity;
 import org.onap.policy.rest.jpa.PdpEntity;
 import org.onap.policy.rest.jpa.PolicyDBDaoEntity;
 import org.onap.policy.rest.jpa.PolicyEntity;
-import org.onap.policy.rest.util.Webapps;
+import org.onap.policy.utils.CryptoUtils;
 import org.onap.policy.xacml.api.pap.OnapPDP;
 import org.onap.policy.xacml.api.pap.OnapPDPGroup;
 import org.onap.policy.xacml.api.pap.PAPPolicyEngine;
@@ -107,6 +106,32 @@ public class PolicyDBDao {
        public static final String PROPERTIES_CONFIG = "PROPERTIES";
        public static final String OTHER_CONFIG = "OTHER";
        public static final String AUDIT_USER = "audit";
+       
+       //Declared to static variables which were repeating multiple times across the PolicyDBDao
+       public static final String config = "Config";
+       public static final String action = "Action";
+       public static final String groupIdVar = "groupId";
+       public static final String deletedVar = "deleted";
+       public static final String groupEntitySelectQuery = "SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted";
+       public static final String pdpEntitySelectQuery = "SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted";
+       public static final String groupCannotBeFound = "The group could not be found with id ";
+       public static final String foundInDBNotDeleted = " were found in the database that are not deleted";
+       public static final String moreThanOnePDP = "Somehow, more than one pdp with the same id ";
+       public static final String deletedStatusFound = " and deleted status were found in the database";
+       public static final String duplicateGroupId = "Somehow, more than one group with the same id ";
+       public static final String pdpIdVariable = "pdpId";
+       public static final String queryFailedToCheckExisting = "Query failed trying to check for existing group";
+       public static final String queryFailedToGetGroup = "Query failed trying to get group ";
+       public static final String scope = "scope";
+       public static final String policyDBDaoVar = "PolicyDBDao";
+       public static final String duplicatePolicyId = "Somehow, more than one policy with the id ";
+       public static final String foundInDB = " were found in the database";
+       
+       private static boolean isJunit = false;
+
+       public static void setJunit(boolean isJunit) {
+               PolicyDBDao.isJunit = isJunit;
+       }
 
        /**
         * Get an instance of a PolicyDBDao. It creates one if it does not exist.
@@ -115,7 +140,7 @@ public class PolicyDBDao {
         * @return The new instance of PolicyDBDao or throw exception if the given emf is null.
         * @throws IllegalStateException if a PolicyDBDao has already been constructed. Call getPolicyDBDaoInstance() to get this.
         */
-       public static PolicyDBDao getPolicyDBDaoInstance(EntityManagerFactory emf) throws Exception{
+       public static PolicyDBDao getPolicyDBDaoInstance(EntityManagerFactory emf){
                logger.debug("getPolicyDBDaoInstance(EntityManagerFactory emf) as getPolicyDBDaoInstance("+emf+") called");
                if(currentInstance == null){
                        if(emf != null){
@@ -132,16 +157,18 @@ public class PolicyDBDao {
         * @return The instance of PolicyDBDao or throws exception if the given instance is null.
         * @throws IllegalStateException if a PolicyDBDao instance is null. Call createPolicyDBDaoInstance(EntityManagerFactory emf) to get this.
         */
-       public static PolicyDBDao getPolicyDBDaoInstance() throws Exception{
+       public static PolicyDBDao getPolicyDBDaoInstance(){
                logger.debug("getPolicyDBDaoInstance() as getPolicyDBDaoInstance() called");
                if(currentInstance != null){
                        return currentInstance;
                }
                throw new IllegalStateException("The PolicyDBDao.currentInstance is Null.  Use getPolicyDBDao(EntityManagerFactory emf)");
        }
+       
        public void setPapEngine(PAPPolicyEngine papEngine2){
-               this.papEngine = (PAPPolicyEngine) papEngine2;
+               this.papEngine = papEngine2;
        }
+       
        private PolicyDBDao(EntityManagerFactory emf){
                logger.debug("PolicyDBDao(EntityManagerFactory emf) as PolicyDBDao("+emf+") called");
                this.emf = emf;
@@ -211,12 +238,13 @@ public class PolicyDBDao {
                        policyDBDaoEntityList = getPolicyDBDaoEntityQuery.getResultList();
 
                } catch(Exception e){
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception querying for other registered PolicyDBDaos");
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Exception querying for other registered PolicyDBDaos");
                        logger.warn("List of remote PolicyDBDaos will be empty", e);
                }
                try{
                        em.getTransaction().commit();
                } catch(Exception e){
+                       logger.warn("List of remote PolicyDBDaos will be empty", e);
                        try{
                                em.getTransaction().rollback();
                        } catch(Exception e2){
@@ -229,7 +257,7 @@ public class PolicyDBDao {
 
        public PolicyDBDaoTransaction getNewTransaction(){
                logger.debug("getNewTransaction() as getNewTransaction() called");
-               return (PolicyDBDaoTransaction)(new PolicyDBDaoTransactionInstance());
+               return new PolicyDBDaoTransactionInstance();
        }
 
        /*
@@ -244,7 +272,7 @@ public class PolicyDBDao {
                int auditWaitMs = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT));
                //Use the (extended) audit timeout time in ms
                int auditTimeoutMs = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_AUDIT_TIMEOUT)); 
-               return (PolicyDBDaoTransaction)(new PolicyDBDaoTransactionInstance(auditTimeoutMs, auditWaitMs));
+               return new PolicyDBDaoTransactionInstance(auditTimeoutMs, auditWaitMs);
        }
 
 
@@ -264,27 +292,6 @@ public class PolicyDBDao {
                return one.equals(two);
        }
 
-       /**
-        * Computes the scope in dotted format based on an absolute path and a path that divides the scope.
-        * @param fullPath An absolute path including scope folders and other folders(does not have to be absolute, must just contain scope and other folders before)
-        * @param pathToExclude The path that acts as a division between the scope and the other folders
-        * @return The scope in dotted format (org.onap)
-        */
-       private static String computeScope(String fullPath, String pathToExclude){
-               logger.debug("computeScope(String fullPath, String pathToExclude) as computeScope("+fullPath+", "+pathToExclude+") called");
-               int excludeIndex = fullPath.indexOf(pathToExclude);
-               String scopePath = fullPath.substring(excludeIndex+pathToExclude.length());
-               String scope = scopePath.replace('\\', '.');
-               scope = scope.replace('/', '.');
-               if(scope.charAt(0) == '.'){
-                       scope = scope.substring(1);
-               }
-               if(scope.charAt(scope.length()-1) == '.'){
-                       scope = scope.substring(0, scope.length()-1);
-               }
-               return scope;
-       }
-
        /**
         * Returns the url of this local pap server, removing the username and password, if they are present
         * @return The url of this local pap server
@@ -296,9 +303,8 @@ public class PolicyDBDao {
                        return null;
                }
                return splitPapUrlUserPass(url);
-
-
        }
+       
        private String[] splitPapUrlUserPass(String url){
                String[] urlUserPass = new String[3];
                String[] commaSplit = url.split(",");
@@ -307,13 +313,13 @@ public class PolicyDBDao {
                        urlUserPass[1] = commaSplit[1];
                        urlUserPass[2] = commaSplit[2];
                }
-               if(urlUserPass[1] == null || urlUserPass[1].equals("")){
+               if(urlUserPass[1] == null || "".equals(urlUserPass[1])){
                        String usernamePropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
                        if(usernamePropertyValue != null){
                                urlUserPass[1] = usernamePropertyValue;
                        }
                }
-               if(urlUserPass[2] == null || urlUserPass[2].equals("")){
+               if(urlUserPass[2] == null || "".equals(urlUserPass[2])){
                        String passwordPropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
                        if(passwordPropertyValue != null){
                                urlUserPass[2] = passwordPropertyValue;
@@ -322,25 +328,7 @@ public class PolicyDBDao {
                //if there is no comma, for some reason there is no username and password, so don't try to cut them off
                return urlUserPass;
        }
-
-       private static String encryptPassword(String password) throws Exception{
-               Cipher cipher = Cipher.getInstance("AES");              
-               cipher.init(Cipher.ENCRYPT_MODE, aesKey());
-               byte[] encryption = cipher.doFinal(password.getBytes("UTF-8"));
-               System.out.println(encryption);
-               return new String(Base64.getMimeEncoder().encode(encryption),"UTF-8");
-       }
-
-       private static String decryptPassword(String encryptedPassword) throws Exception{
-               Cipher cipher = Cipher.getInstance("AES");
-               cipher.init(Cipher.DECRYPT_MODE, aesKey());
-               byte[] password = cipher.doFinal(Base64.getDecoder().decode(encryptedPassword.getBytes("UTF-8")));
-               return new String(password,"UTF-8");
-       }
-       private static Key aesKey(){
-               byte[] aesValue = (new String("njrmbklcxtoplawf")).getBytes();
-               return new SecretKeySpec(aesValue,"AES");
-       }
+       
        /**
         * Register the PolicyDBDao instance in the PolicyDBDaoEntity table
         * @return Boolean, were we able to register?
@@ -348,6 +336,10 @@ public class PolicyDBDao {
        private boolean register(){
                logger.debug("register() as register() called");
                String[] url = getPapUrlUserPass();
+               //--- check URL length
+               if(url == null || url.length<3){                        
+                       return false;
+               }
                EntityManager em = emf.createEntityManager();
                try{
                        startTransactionSynced(em, 1000);
@@ -364,15 +356,15 @@ public class PolicyDBDao {
                                        em.getTransaction().commit();
                                        em.close();                                     
                                } catch(Exception e2){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "COULD NOT CREATE DATABASELOCK ROW.  WILL TRY ONE MORE TIME");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, policyDBDaoVar, "COULD NOT CREATE DATABASELOCK ROW.  WILL TRY ONE MORE TIME");
                                }
-                               em = null;
+                               
                                em = emf.createEntityManager();
                                try{
                                        startTransactionSynced(em, 1000);
                                } catch(Exception e3){
                                        String msg = "DATABASE LOCKING NOT WORKING. CONCURRENCY CONTROL NOT WORKING";
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e3, "PolicyDBDao", msg);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e3, policyDBDaoVar, msg);
                                        throw new IllegalStateException("msg" + "\n" + e3);
                                }
                        }
@@ -381,48 +373,50 @@ public class PolicyDBDao {
                PolicyDBDaoEntity foundPolicyDBDaoEntity = em.find(PolicyDBDaoEntity.class, url[0]);
                Query getPolicyDBDaoEntityQuery = em.createQuery("SELECT e FROM PolicyDBDaoEntity e WHERE e.policyDBDaoUrl=:url");
                getPolicyDBDaoEntityQuery.setParameter("url", url[0]);
+               // encrypt the password
+               String txt = null;
+               try{
+                       txt = CryptoUtils.encryptTxt(url[2].getBytes(StandardCharsets.UTF_8));
+               } catch(Exception e){
+                       logger.debug(e);
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Could not encrypt PAP password");
+               }
                if(foundPolicyDBDaoEntity == null){
                        PolicyDBDaoEntity newPolicyDBDaoEntity = new PolicyDBDaoEntity();
                        em.persist(newPolicyDBDaoEntity);
                        newPolicyDBDaoEntity.setPolicyDBDaoUrl(url[0]);
                        newPolicyDBDaoEntity.setDescription("PAP server at "+url[0]);
                        newPolicyDBDaoEntity.setUsername(url[1]);
-                       try{
-                               newPolicyDBDaoEntity.setPassword(encryptPassword(url[2]));
-                       } catch(Exception e){
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not encrypt PAP password");
-                       }
+                       newPolicyDBDaoEntity.setPassword(txt);
                        try{
                                em.getTransaction().commit();
                        } catch(Exception e){
+                               logger.debug(e);
                                try{
                                        em.getTransaction().rollback();
                                } catch(Exception e2){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not add new PolicyDBDao to the database");
+                                       logger.debug(e2);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, policyDBDaoVar, "Could not add new PolicyDBDao to the database");
                                }
                        }
                } else {
                        //just want to update in order to change modified date
-                       String encryptedPassword = null;
-                       try{
-                               encryptedPassword = encryptPassword(url[2]);
-                       } catch(Exception e){
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not encrypt PAP password");
-                       }
                        if(url[1] != null && !stringEquals(url[1], foundPolicyDBDaoEntity.getUsername())){
                                foundPolicyDBDaoEntity.setUsername(url[1]);
                        }
-                       if(encryptedPassword != null && !stringEquals(encryptedPassword, foundPolicyDBDaoEntity.getPassword())){
-                               foundPolicyDBDaoEntity.setPassword(encryptedPassword);
+                       if(txt != null && !stringEquals(txt, foundPolicyDBDaoEntity.getPassword())){
+                               foundPolicyDBDaoEntity.setPassword(txt);
                        }
                        foundPolicyDBDaoEntity.preUpdate();
                        try{
                                em.getTransaction().commit();
                        } catch(Exception e){
+                               logger.debug(e);
                                try{
                                        em.getTransaction().rollback();
                                } catch(Exception e2){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not update PolicyDBDao in the database");
+                                       logger.debug(e2);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, policyDBDaoVar, "Could not update PolicyDBDao in the database");
                                }
                        }
                }
@@ -430,22 +424,20 @@ public class PolicyDBDao {
                logger.debug("\nPolicyDBDao.register(). Success!!\n");
                return true;
        }
+       
        public void notifyOthers(long entityId,String entityType){
                notifyOthers(entityId,entityType,null);
        }
+       
        public void notifyOthers(long entityId, String entityType, String newGroupId){
                logger.debug("notifyOthers(long entityId, String entityType, long newGroupId) as notifyOthers("+entityId+","+entityType+","+newGroupId+") called");             
                LinkedList<Thread> notifyThreads = new LinkedList<>();
 
                //we're going to run notifications in parallel threads to speed things up
                for(Object obj : otherServers){
-
                        Thread newNotifyThread = new Thread(new NotifyOtherThread(obj, entityId, entityType, newGroupId));
-
                        newNotifyThread.start();
-
                        notifyThreads.add(newNotifyThread);
-
                }
                //we want to wait for all notifications to complete or timeout before we unlock the interface and allow more changes
                for(Thread t : notifyThreads){
@@ -455,8 +447,6 @@ public class PolicyDBDao {
                                logger.warn("Could not join a notifcation thread" + e);
                        }
                }
-
-
        }
 
        private class NotifyOtherThread implements Runnable {
@@ -476,23 +466,27 @@ public class PolicyDBDao {
                        PolicyDBDaoEntity dbdEntity = (PolicyDBDaoEntity)obj;
                        String o = dbdEntity.getPolicyDBDaoUrl();
                        String username = dbdEntity.getUsername();
-                       String password;
+                       String txt;
                        try{
-                               password = decryptPassword(dbdEntity.getPassword());
+                               txt = new String(CryptoUtils.decryptTxt(dbdEntity.getPassword()), StandardCharsets.UTF_8);
                        } catch(Exception e){
+                               logger.debug(e);
                                //if we can't decrypt, might as well try it anyway
-                               password = dbdEntity.getPassword();
+                               txt = dbdEntity.getPassword();
                        }
                        Base64.Encoder encoder = Base64.getEncoder();                   
-                       String encoding = encoder.encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));
+                       String encoding = encoder.encodeToString((username+":"+txt).getBytes(StandardCharsets.UTF_8));
                        HttpURLConnection connection = null;
                        UUID requestID = UUID.randomUUID();
                        URL url;
+                       String papUrl;
                        try {
-                               String papUrl = getPapUrlUserPass()[0];
-                               if(papUrl == null){
-                                       papUrl = "undefined";
-                               }
+                               String[] papUrlUserPass = getPapUrlUserPass();
+                               if(papUrlUserPass == null ){
+                                   papUrl = "undefined";
+                               } else {
+                                   papUrl = papUrlUserPass[0];
+                               }
                                logger.debug("We are going to try to notify "+o);
                                //is this our own url?
                                String ourUrl = o;
@@ -506,13 +500,13 @@ public class PolicyDBDao {
                                        o = "undefined";
                                }
                                if(papUrl.equals(ourUrl)){
-                                       logger.debug(((String)o)+" is our url, skipping notify");
+                                       logger.debug(o+" is our url, skipping notify");
                                        return;
                                }
                                if(newGroupId == null){
-                                       url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType);
+                                       url = new URL(o+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType);
                                } else {
-                                       url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType+"&extradata="+newGroupId);
+                                       url = new URL(o+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType+"&extradata="+newGroupId);
                                }
                        } catch (MalformedURLException e) {
                                logger.warn("Caught MalformedURLException on: new URL()", e);
@@ -521,7 +515,8 @@ public class PolicyDBDao {
                        //
                        // Open up the connection
                        //
-                       logger.debug("Connecting with url: "+url);
+                       logger.info("PolicyDBDao: NotifyOtherThread: notifying other PAPs of an update");
+                       logger.info("Connecting with url: "+url);
                        try {
                                connection = (HttpURLConnection)url.openConnection();
                        } catch (Exception e) {
@@ -545,9 +540,8 @@ public class PolicyDBDao {
                        int readTimeout;
                        try{
                                readTimeout = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_NOTIFY_TIMEOUT));
-
                        } catch(Exception e){
-                               logger.error("xacml.rest.pap.notify.timeoutms property not set, using a default.");
+                               logger.error("xacml.rest.pap.notify.timeoutms property not set, using a default.", e);
                                readTimeout = 10000;
                        }
                        connection.setReadTimeout(readTimeout);
@@ -571,16 +565,14 @@ public class PolicyDBDao {
                        }
                        try {
                                if (connection.getResponseCode() == 200) {
-                                       logger.info("Received response 200 from pap server on notify");
-                                       //notified = true;
+                                       logger.info("PolicyDBDao: NotifyOtherThread received response 200 from pap server on notify");
                                } else {
-                                       logger.warn("connection response code not 200, received: "+connection.getResponseCode());
+                                       logger.warn("PolicyDBDao: NotifyOtherThread connection response code not 200, received: "+connection.getResponseCode());
                                }
                        } catch (Exception e) {
                                logger.warn("Caught Exception on: connection.getResponseCode() ", e);
                        }
 
-
                        connection.disconnect();
                }
        }
@@ -596,28 +588,17 @@ public class PolicyDBDao {
 
                        XPathFactory xpathFactory = XPathFactory.newInstance();
                        XPath xpath = xpathFactory.newXPath();
-
-
+                       
                        description = xpath.evaluate(expression, document);             
                }catch(Exception e){
                        logger.error("Exception Occured while evaluating path"+e);
                }
-
                return description;
        }
-
-       private static String getDescriptionFromXacml(String xacmlData){
-               String openTag = "<Description>";
-               String closeTag = "</Description>";
-               int descIndex = xacmlData.indexOf(openTag);
-               int endDescIndex = xacmlData.indexOf(closeTag);
-               String desc = xacmlData.substring(descIndex+openTag.length(),endDescIndex);
-               return desc;
-       }
        
-       private final String POLICY_NOTIFICATION = "policy";
-       private final String PDP_NOTIFICATION = "pdp";
-       private final String GROUP_NOTIFICATION = "group";
+       private static final String POLICY_NOTIFICATION = "policy";
+       private static final String PDP_NOTIFICATION = "pdp";
+       private static final String GROUP_NOTIFICATION = "group";
        public void handleIncomingHttpNotification(String url, String entityId, String entityType, String extraData, XACMLPapServlet xacmlPapServlet){
                logger.info("DBDao url: " + url + " has reported an update on "+entityType+" entity "+entityId);                
                PolicyDBDaoTransaction transaction = this.getNewTransaction();
@@ -625,7 +606,6 @@ public class PolicyDBDao {
                int retries;
                try{
                        retries = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_INCOMINGNOTIFICATION_TRIES));
-
                } catch(Exception e){
                        logger.error("xacml.rest.pap.incomingnotification.tries property not set, using a default of 3."+e);
                        retries = 3;
@@ -640,14 +620,16 @@ public class PolicyDBDao {
                case POLICY_NOTIFICATION:
                        for(int i=0; i<retries;i++){
                                try{
-                                       handleIncomingPolicyChange(url, entityId,extraData);
+                                       handleIncomingPolicyChange(entityId);
                                        break;
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")");
+                                       logger.debug(e);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")");
                                }
                                try{
                                        Thread.sleep(pauseBetweenRetries);
                                }catch(InterruptedException ie){
+                                       Thread.currentThread().interrupt();
                                        break;
                                }
                        }
@@ -655,14 +637,16 @@ public class PolicyDBDao {
                case PDP_NOTIFICATION:
                        for(int i=0; i<retries;i++){
                                try{
-                                       handleIncomingPdpChange(url, entityId, transaction);
+                                       handleIncomingPdpChange(entityId, transaction);
                                        break;
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")");
+                                       logger.debug(e);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")");
                                }
                                try{
                                        Thread.sleep(pauseBetweenRetries);
                                }catch(InterruptedException ie){
+                                       Thread.currentThread().interrupt();
                                        break;
                                }
                        }
@@ -670,14 +654,16 @@ public class PolicyDBDao {
                case GROUP_NOTIFICATION:
                        for(int i=0; i<retries;i++){
                                try{
-                                       handleIncomingGroupChange(url, entityId, extraData, transaction, xacmlPapServlet);
+                                       handleIncomingGroupChange(entityId, extraData, transaction);
                                        break;
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")");
+                                       logger.debug(e);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")");
                                }
                                try{
                                        Thread.sleep(pauseBetweenRetries);
                                }catch(InterruptedException ie){
+                                       Thread.currentThread().interrupt();
                                        break;
                                }
                        }
@@ -686,7 +672,8 @@ public class PolicyDBDao {
                //no changes should be being made in this function, we still need to close
                transaction.rollbackTransaction();
        }
-       private void handleIncomingGroupChange(String url, String groupId, String extraData,PolicyDBDaoTransaction transaction,XACMLPapServlet xacmlPapServlet) throws PAPException{
+       
+       private void handleIncomingGroupChange(String groupId, String extraData,PolicyDBDaoTransaction transaction) throws PAPException, PolicyDBException{
                GroupEntity groupRecord = null;
                long groupIdLong = -1;
                try{
@@ -697,7 +684,7 @@ public class PolicyDBDao {
                try{
                        groupRecord = transaction.getGroup(groupIdLong);
                } catch(Exception e){
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");");
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");");
                        throw new PAPException("Could not get local group "+groupIdLong);
                }
                if(groupRecord == null){
@@ -725,13 +712,13 @@ public class PolicyDBDao {
                                try {
                                        newLocalGroup = papEngine.getGroup(extraData);
                                } catch (PAPException e) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");");
                                }
                        }
                        try {
                                papEngine.removeGroup(localGroup, newLocalGroup);
                        } catch (NullPointerException | PAPException e) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");");
                                throw new PAPException("Could not remove group "+groupId);
                        }
                }
@@ -740,13 +727,13 @@ public class PolicyDBDao {
                        try {
                                papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());
                        } catch (NullPointerException | PAPException e) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to create pdp group with papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to create pdp group with papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());");
                                throw new PAPException("Could not create group "+groupRecord);
                        }
                        try {
                                localGroup = papEngine.getGroup(groupRecord.getGroupId());
                        } catch (PAPException e1) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Caught PAPException trying to get pdp group we just created with papEngine.getGroup(groupRecord.getGroupId());\nAny PDPs or policies in the new group may not have been added");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, policyDBDaoVar, "Caught PAPException trying to get pdp group we just created with papEngine.getGroup(groupRecord.getGroupId());\nAny PDPs or policies in the new group may not have been added");
                                return;
                        }
                        //add possible pdps to group
@@ -756,7 +743,7 @@ public class PolicyDBDao {
                                try {
                                        papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());
                                } catch (NullPointerException | PAPException e) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get create pdp with papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to get create pdp with papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());");
                                        throw new PAPException("Could not create pdp "+pdp);
                                }
                        }
@@ -775,10 +762,10 @@ public class PolicyDBDao {
                        //set default if it should be
                        if(!localGroupClone.isDefaultGroup() && groupRecord.isDefaultGroup()){
                                try {
-                                       papEngine.SetDefaultGroup(localGroup);
+                                       papEngine.setDefaultGroup(localGroup);
                                        return;
                                } catch (PAPException e) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");");
                                        throw new PAPException("Could not set default group to "+localGroupClone);
                                }                               
                        }               
@@ -798,26 +785,24 @@ public class PolicyDBDao {
                        }
                        if(needToUpdate){
                                try {
-
                                        papEngine.updateGroup(localGroupClone);
                                } catch (PAPException e) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to update group with papEngine.updateGroup("+localGroupClone+");");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to update group with papEngine.updateGroup("+localGroupClone+");");
                                        throw new PAPException("Could not update group "+localGroupClone);
                                }
                        }                               
-
                }
-               //call command that corresponds to the change that was made
        }
+       
        //this will also handle removes, since incoming pdpGroup has no policies internally, we are just going to add them all in from the db
-       private boolean updateGroupPoliciesInFileSystem(OnapPDPGroup pdpGroup,OnapPDPGroup oldPdpGroup, GroupEntity groupRecord, PolicyDBDaoTransaction transaction) throws PAPException{
+       private boolean updateGroupPoliciesInFileSystem(OnapPDPGroup pdpGroup,OnapPDPGroup oldPdpGroup, GroupEntity groupRecord, PolicyDBDaoTransaction transaction) throws PAPException, PolicyDBException{
                if(!(pdpGroup instanceof StdPDPGroup)){
                        throw new PAPException("group is not a StdPDPGroup");
                }
                StdPDPGroup group = (StdPDPGroup)pdpGroup;
                //this must always be true since we don't explicitly know when a delete is occuring
                boolean didUpdate = true;
-               HashMap<String,PDPPolicy> currentPolicySet = new HashMap<String,PDPPolicy>(oldPdpGroup.getPolicies().size());
+               HashMap<String,PDPPolicy> currentPolicySet = new HashMap<>(oldPdpGroup.getPolicies().size());
                HashSet<PDPPolicy> newPolicySet = new HashSet<>();
                for(PDPPolicy pdpPolicy : oldPdpGroup.getPolicies()){
                        currentPolicySet.put(pdpPolicy.getId(), pdpPolicy);
@@ -829,9 +814,10 @@ public class PolicyDBDao {
                                if(currentPolicySet.containsKey(pdpPolicyName)){
                                        newPolicySet.add(currentPolicySet.get(pdpPolicyName));
                                } else{
+                                       logger.info("PolicyDBDao: Adding the new policy to the PDP group after notification: " + pdpPolicyName);
                                        InputStream policyStream = new ByteArrayInputStream(policy.getPolicyData().getBytes());
                                        group.copyPolicyToFile(pdpPolicyName,policyStream);
-                                       ((StdPDPPolicy)(group.getPolicy(pdpPolicyName))).setName(removeExtensionAndVersionFromPolicyName(policy.getPolicyName()));
+                                       ((StdPDPPolicy)(group.getPolicy(pdpPolicyName))).setName(removeExtensionAndVersionFromPolicyName(pdpPolicyName));
                                        try {
                                                policyStream.close();
                                        } catch (IOException e) {
@@ -841,14 +827,70 @@ public class PolicyDBDao {
                                }
                        }
                }
+               logger.info("PolicyDBDao: Adding updated policies to group after notification.");
                if(didUpdate){
                        newPolicySet.addAll(group.getPolicies());
                        group.setPolicies(newPolicySet);
                }
                return didUpdate;
+       }
+       
+       /*
+        *  This method is called during all pushPolicy transactions and makes sure the file system
+        *  group is in sync with the database groupentity 
+        */
+       private StdPDPGroup synchronizeGroupPoliciesInFileSystem(StdPDPGroup pdpGroup, GroupEntity groupentity) throws PAPException, PolicyDBException{
+
+               HashMap<String,PDPPolicy> currentPolicyMap = new HashMap<>();
+               HashSet<String> newPolicyIdSet = new HashSet<>();
+               HashSet<PDPPolicy> newPolicySet = new HashSet<>();
+               
+               for(PDPPolicy pdpPolicy : pdpGroup.getPolicies()){
+                       currentPolicyMap.put(pdpPolicy.getId(), pdpPolicy);
+               }
+               
+               for(PolicyEntity policy : groupentity.getPolicies()){
+                       String pdpPolicyId = getPdpPolicyName(policy.getPolicyName(), policy.getScope());
+                       newPolicyIdSet.add(pdpPolicyId);
+
+                       if(currentPolicyMap.containsKey(pdpPolicyId)){
+                               newPolicySet.add(currentPolicyMap.get(pdpPolicyId));
+                       } else {
+                               //convert PolicyEntity object to PDPPolicy
+               String name = pdpPolicyId.replace(".xml", "");
+               name = name.substring(0, name.lastIndexOf('.'));
+                               InputStream policyStream = new ByteArrayInputStream(policy.getPolicyData().getBytes());
+                               pdpGroup.copyPolicyToFile(pdpPolicyId,name,policyStream);
+                               URI location = Paths.get(pdpGroup.getDirectory().toAbsolutePath().toString(), pdpPolicyId).toUri();
+                               StdPDPPolicy newPolicy = null;
+                               try {
+                                       newPolicy = new StdPDPPolicy(pdpPolicyId, true, removeExtensionAndVersionFromPolicyName(pdpPolicyId),location);
+                                       newPolicySet.add(newPolicy);
+                               } catch (Exception e) {
+                                       logger.debug(e);
+                                       PolicyLogger.error("PolicyDBDao: Exception occurred while creating the StdPDPPolicy newPolicy object " + e.getMessage());
+                               }
+                       }
+               }
 
+               for(String id : currentPolicyMap.keySet()) {
+                       if(!newPolicyIdSet.contains(id)){
+                               try {
+                                       Files.delete(Paths.get(currentPolicyMap.get(id).getLocation()));
+                               } catch (Exception e) {
+                                       logger.debug(e);
+                                       PolicyLogger.error("PolicyDBDao: Exception occurred while attempting to delete the old version of the policy file from the group. " + e.getMessage());
+                               }
+                       }
+               }
+               
+               logger.info("PolicyDBDao: Adding new policy set to group to keep filesystem and DB in sync");
+               pdpGroup.setPolicies(newPolicySet);
+               
+               return pdpGroup;
        }
-       private String removeExtensionAndVersionFromPolicyName(String originalPolicyName){
+       
+       private String removeExtensionAndVersionFromPolicyName(String originalPolicyName) throws PolicyDBException{
         return getPolicyNameAndVersionFromPolicyFileName(originalPolicyName)[0];
     }
 
@@ -857,14 +899,14 @@ public class PolicyDBDao {
      * @param originalPolicyName: a policy file name ex: Config_policy.2.xml
      * @return An array [0]: The policy name, [1]: the policy version, as a string
      */
-    private String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName){
+    private String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName) throws PolicyDBException{
         String policyName = originalPolicyName;
         String[] nameAndVersion = new String[2];
         try{
             policyName = removeFileExtension(policyName);
             nameAndVersion[0] = policyName.substring(0,policyName.lastIndexOf('.'));
             if(isNullOrEmpty(nameAndVersion[0])){
-                throw new Exception();
+                throw new PolicyDBException();
             }
         } catch(Exception e){
             nameAndVersion[0] = originalPolicyName;         
@@ -873,7 +915,7 @@ public class PolicyDBDao {
         try{
             nameAndVersion[1] = policyName.substring(policyName.lastIndexOf('.')+1);
             if(isNullOrEmpty(nameAndVersion[1])){
-                throw new Exception();
+                throw new PolicyDBException();
             }
         } catch(Exception e){
             nameAndVersion[1] = "1";
@@ -882,7 +924,7 @@ public class PolicyDBDao {
         return nameAndVersion;
     }
     
-       private void handleIncomingPdpChange(String url, String pdpId, PolicyDBDaoTransaction transaction) throws PAPException{
+       private void handleIncomingPdpChange(String pdpId, PolicyDBDaoTransaction transaction) throws PAPException{
                //get pdp
                long pdpIdLong = -1;
                try{
@@ -894,7 +936,7 @@ public class PolicyDBDao {
                try{
                        pdpRecord = transaction.getPdp(pdpIdLong);
                }catch(Exception e){
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");");
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");");
                        throw new PAPException("Could not get local pdp "+pdpIdLong);
                }
                if(pdpRecord == null){
@@ -910,7 +952,7 @@ public class PolicyDBDao {
                        try {
                                papEngine.removePDP((OnapPDP) localPdp);
                        } catch (PAPException e) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");");
                                throw new PAPException("Could not remove pdp "+pdpId);
                        }
                }
@@ -921,13 +963,13 @@ public class PolicyDBDao {
                        try {
                                localGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
                        } catch (PAPException e1) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Caught PAPException trying to get local group to add pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, policyDBDaoVar, "Caught PAPException trying to get local group to add pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
                                throw new PAPException("Could not get local group");
                        }                       
                        try {
                                papEngine.newPDP(pdpRecord.getPdpId(), localGroup, pdpRecord.getPdpName(), pdpRecord.getDescription(), pdpRecord.getJmxPort());
                        } catch (NullPointerException | PAPException e) {
-                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to create pdp with papEngine.newPDP("+pdpRecord.getPdpId()+", "+localGroup+", "+pdpRecord.getPdpName()+", "+pdpRecord.getDescription()+", "+pdpRecord.getJmxPort()+");");
+                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to create pdp with papEngine.newPDP("+pdpRecord.getPdpId()+", "+localGroup+", "+pdpRecord.getPdpName()+", "+pdpRecord.getDescription()+", "+pdpRecord.getJmxPort()+");");
                                throw new PAPException("Could not create pdp "+pdpRecord);
                        }
                } else {
@@ -954,13 +996,13 @@ public class PolicyDBDao {
                                        newPdpGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
                                }catch(PAPException e){
                                        //ok, now we have an issue. Time to stop things
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get id of local group to move pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to get id of local group to move pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());");
                                        throw new PAPException("Could not get local group");
                                }
                                try{
                                        papEngine.movePDP((OnapPDP) localPdp, newPdpGroup);
                                }catch(PAPException e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);");
                                        throw new PAPException("Could not move pdp "+localPdp);
                                }
                        }
@@ -972,7 +1014,7 @@ public class PolicyDBDao {
                                try {
                                        papEngine.updatePDP((OnapPDP) localPdp);
                                } catch (PAPException e) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");");
                                        throw new PAPException("Could not update pdp "+localPdp);
                                }
                        }
@@ -980,7 +1022,7 @@ public class PolicyDBDao {
                //compare to local situation
                //call command to update
        }
-       private void handleIncomingPolicyChange(String url, String policyId,String oldPathString){
+       private void handleIncomingPolicyChange(String policyId){
                String policyName = null;
                EntityManager em = emf.createEntityManager();
                Query getPolicyEntityQuery = em.createNamedQuery("PolicyEntity.FindById");
@@ -996,27 +1038,27 @@ public class PolicyDBDao {
                try {
                        if(policy != null){
                                policyName = policy.getPolicyName();
-                               logger.debug("Deleting Policy: " + policy.getPolicyName());
+                               logger.info("Deleting old Policy Config File for " + policy.getPolicyName());
                                action = "delete";
                                Path subFile = null;
 
                                if (policy.getConfigurationData()!= null){
-                                       subFile = getPolicySubFile(policy.getConfigurationData().getConfigurationName(), "Config");
+                                       subFile = getPolicySubFile(policy.getConfigurationData().getConfigurationName(), config);
                                }else if(policy.getActionBodyEntity()!= null){
-                                       subFile = getPolicySubFile(policy.getActionBodyEntity().getActionBodyName(), "Action");
+                                       subFile = getPolicySubFile(policy.getActionBodyEntity().getActionBodyName(), action);
                                }
 
                                if(subFile != null){
                                        Files.deleteIfExists(subFile);
                                }
                                if (policy.getConfigurationData()!= null){
-                                       writePolicySubFile(policy, "Config");
+                                       writePolicySubFile(policy, config);
                                }else if(policy.getActionBodyEntity()!= null){
-                                       writePolicySubFile(policy, "Action");
+                                       writePolicySubFile(policy, action);
                                }
                        }
                } catch (IOException e1) {
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Error occurred while performing [" + action + "] of Policy File: " + policyName);
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, policyDBDaoVar, "Error occurred while performing [" + action + "] of Policy File: " + policyName);
                }       
        }
 
@@ -1032,9 +1074,10 @@ public class PolicyDBDao {
                return fileName.substring(0, fileName.lastIndexOf('.'));
        }
 
-       private Path getPolicySubFile(String filename, String subFileType){
-               logger.debug("getPolicySubFile(" + filename + ", " + subFileType + ")");
-               Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), subFileType);
+       private Path getPolicySubFile(String inputFileName, String subFileType){
+               String filename = inputFileName;
+               logger.info("getPolicySubFile(" + filename + ", " + subFileType + ")");
+               Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS), subFileType);
                File file = null;
 
                filename = FilenameUtils.removeExtension(filename);
@@ -1050,7 +1093,7 @@ public class PolicyDBDao {
                        finalPath = Paths.get(file.getAbsolutePath());
                }
 
-               logger.debug("end of getPolicySubFile: " + finalPath);
+               logger.info("end of getPolicySubFile: " + finalPath);
                return finalPath;       
        }
 
@@ -1059,14 +1102,13 @@ public class PolicyDBDao {
                String type = null;
                String subTypeName = null;
                String subTypeBody = null;
-               if (policyType.equalsIgnoreCase("config")){
-                       type = "Config";
+               if (config.equalsIgnoreCase(policyType)){
+                       type = config;
                        subTypeName = FilenameUtils.removeExtension(policy.getConfigurationData().getConfigurationName());
                        subTypeBody = policy.getConfigurationData().getConfigBody();
 
                        String configType = policy.getConfigurationData().getConfigType();
 
-
                        if (configType != null) {
                                if (configType.equals(JSON_CONFIG)) {
                                        subTypeName = subTypeName + ".json";
@@ -1081,13 +1123,10 @@ public class PolicyDBDao {
                                        subTypeName = subTypeName + ".txt";
                                }
                        }
-
-               }else if (policyType.equalsIgnoreCase("action")){
-                       type = "Action";
+               }else if (action.equalsIgnoreCase(policyType)){
+                       type = action;
                        subTypeName = policy.getActionBodyEntity().getActionBodyName();
                        subTypeBody = policy.getActionBodyEntity().getActionBody();
-
-
                }
                Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), type);
 
@@ -1098,18 +1137,18 @@ public class PolicyDBDao {
                try {
                        Files.deleteIfExists(Paths.get(filePath.toString(), subTypeName));
                        File file = Paths.get(filePath.toString(),subTypeName).toFile();
-                       file.createNewFile();
-                       FileWriter fileWriter = new FileWriter(file, false); // false to overwrite
-                       fileWriter.write(subTypeBody);
-                       fileWriter.close();
-                       success = true;
-
+                       boolean value = file.createNewFile();
+                       logger.debug("New file created successfully"+value);
+                       try(FileWriter fileWriter = new FileWriter(file, false)){
+                               // false to overwrite
+                               fileWriter.write(subTypeBody);
+                               fileWriter.close();
+                               success = true;
+                       }
                } catch (Exception e) {
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception occured while creating Configuration File for Policy : " + policy.getPolicyName());
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Exception occured while creating Configuration File for Policy : " + policy.getPolicyName());
                }                                       
-
                return success;
-
        }
 
        public void auditLocalDatabase(PAPPolicyEngine papEngine2){
@@ -1118,11 +1157,44 @@ public class PolicyDBDao {
                        deleteAllGroupTables();
                        auditGroups(papEngine2);
                } catch(Exception e){
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "auditLocalDatabase() error");
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "auditLocalDatabase() error");
                        logger.error("Exception Occured"+e);
                }
        }
 
+       
+       public StdPDPGroup auditLocalFileSystem(StdPDPGroup group){
+               
+               logger.info("Starting Local File System group audit");
+               EntityManager em = emf.createEntityManager();
+               em.getTransaction().begin();
+               
+               StdPDPGroup updatedGroup = null;
+               try {
+                       Query groupQuery = em.createQuery(groupEntitySelectQuery);
+                       groupQuery.setParameter(groupIdVar, group.getId());
+                       groupQuery.setParameter(deletedVar, false);
+                       List<?> groupQueryList = groupQuery.getResultList();
+                       if(groupQueryList!=null && !groupQueryList.isEmpty()){
+                               GroupEntity dbgroup = (GroupEntity)groupQueryList.get(0);
+                               updatedGroup = synchronizeGroupPoliciesInFileSystem(group, dbgroup);
+                               logger.info("Group was updated during file system audit: " + updatedGroup.toString());
+                       }
+               } catch (PAPException | PolicyDBException e) {
+                       logger.error(e);
+               } catch (Exception e) {
+                       logger.error(e);
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if group exists groupQuery.getResultList()");
+                       throw new PersistenceException("Query failed trying to check if group "+group.getId()+" exists");
+               }
+               
+               em.getTransaction().commit();
+               em.close();
+               
+               return updatedGroup;
+               
+       }
+       
        public void deleteAllGroupTables(){
                logger.debug("PolicyDBDao.deleteAllGroupTables() called");
                EntityManager em = emf.createEntityManager();
@@ -1178,10 +1250,13 @@ public class PolicyDBDao {
                                        for(PDPPolicy policy : policies){
                                                try{
                                                        String[] stringArray = getNameScopeAndVersionFromPdpPolicy(policy.getId());
+                                                       if(stringArray == null) {
+                                                           throw new IllegalArgumentException("Invalid input - policyID must contain name, scope and version");
+                                                       }
                                                        List<PolicyEntity> policyEntityList;
                                                        Query getPolicyEntitiesQuery = em.createNamedQuery("PolicyEntity.findByNameAndScope");
                                                        getPolicyEntitiesQuery.setParameter("name", stringArray[0]);
-                                                       getPolicyEntitiesQuery.setParameter("scope", stringArray[1]);
+                                                       getPolicyEntitiesQuery.setParameter(scope, stringArray[1]);
 
                                                        policyEntityList = getPolicyEntitiesQuery.getResultList();
                                                        PolicyEntity policyEntity = null;
@@ -1192,16 +1267,16 @@ public class PolicyDBDao {
                                                                groupEntity.addPolicyToGroup(policyEntity);
                                                        }
                                                }catch(Exception e2){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Exception auditGroups inner catch");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, policyDBDaoVar, "Exception auditGroups inner catch");
                                                }
                                        }
                                }catch(Exception e1){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Exception auditGroups middle catch");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, policyDBDaoVar, "Exception auditGroups middle catch");
                                }
                        }
                }catch(Exception e){
                        em.getTransaction().rollback();
-                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception auditGroups outer catch");
+                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Exception auditGroups outer catch");
                        em.close();
                        return;
                }
@@ -1220,7 +1295,8 @@ public class PolicyDBDao {
        //copied from ConfigPolicy.java and modified
        // Here we are adding the extension for the configurations file based on the
        // config type selection for saving.
-       private String getConfigFile(String filename, String configType) {
+       private String getConfigFile(String inputFilename, String configType) {
+               String filename = inputFilename;
                logger.debug("getConfigFile(String filename, String scope, String configType) as getConfigFile("+filename+", "+configType+") called");
                filename = FilenameUtils.removeExtension(filename);
                String id = configType;
@@ -1245,8 +1321,7 @@ public class PolicyDBDao {
        private String[] getNameScopeAndVersionFromPdpPolicy(String fileName){
                String[] splitByDots = fileName.split("\\.");
                if(splitByDots.length < 3){
-                       //should we throw something
-                       return null;
+                       return null;
                }
                String policyName = splitByDots[splitByDots.length-3];
                String version = splitByDots[splitByDots.length-2];
@@ -1295,10 +1370,7 @@ public class PolicyDBDao {
         */
        private static boolean isNullOrEmpty(String... strings){
                for(String s : strings){
-                       if(!(s instanceof String)){
-                               return true;
-                       }
-                       if(s.equals("")){
+                       if(s == null || "".equals(s)){
                                return true;
                        }
                }
@@ -1338,6 +1410,7 @@ public class PolicyDBDao {
                                try{
                                        startTransactionSynced(this.em,transactionWaitTime);
                                } catch(Exception e){
+                                       logger.debug(e);
                                        throw new PersistenceException("Could not lock transaction within "+transactionWaitTime+" milliseconds");
                                }
                        }
@@ -1366,6 +1439,7 @@ public class PolicyDBDao {
                                                                        + "\n   TimeStamp = " + date.getTime()
                                                                        + "\n\n");
                                                }
+                                               Thread.currentThread().interrupt();
                                                return;
                                        }
                                        if(logger.isDebugEnabled()){
@@ -1415,7 +1489,7 @@ public class PolicyDBDao {
                                try{
                                        em.getTransaction().commit();
                                } catch(RollbackException e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught RollbackException on em.getTransaction().commit()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught RollbackException on em.getTransaction().commit()");
                                        throw new PersistenceException("The commit failed. Message:\n"+e.getMessage());
                                }
                                em.close();
@@ -1425,13 +1499,13 @@ public class PolicyDBDao {
                                                try{
                                                        notifyOthers(policyId,POLICY_NOTIFICATION,newGroupId);
                                                } catch(Exception e){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")");
                                                }
                                        } else {
                                                try{
                                                        notifyOthers(policyId,POLICY_NOTIFICATION);
                                                } catch(Exception e){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")");
                                                }
                                        }
                                }
@@ -1441,13 +1515,13 @@ public class PolicyDBDao {
                                                try{
                                                        notifyOthers(groupId,GROUP_NOTIFICATION,newGroupId);
                                                } catch(Exception e){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")");
                                                }
                                        } else {
                                                try{
                                                        notifyOthers(groupId,GROUP_NOTIFICATION);
                                                } catch(Exception e){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")");
                                                }
                                        }
                                }
@@ -1456,11 +1530,11 @@ public class PolicyDBDao {
                                        try{
                                                notifyOthers(pdpId,PDP_NOTIFICATION);
                                        } catch(Exception e){
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")");
+                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")");
                                        }
                                }
                        }
-                       if(transactionTimer instanceof Thread){
+                       if(transactionTimer != null){
                                transactionTimer.interrupt();
                        }
                }
@@ -1474,31 +1548,30 @@ public class PolicyDBDao {
                                        try{
                                                em.getTransaction().rollback();                                 
                                        } catch(Exception e){
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not rollback transaction");
+                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Could not rollback transaction");
                                        }
                                        try{
                                                em.close();
                                        }catch(Exception e){
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not close EntityManager");
+                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Could not close EntityManager");
                                        }
 
                                } else {
                                        try{
                                                em.close();
                                        }catch(Exception e){
-                                               logger.warn("Could not close already closed transaction");
+                                               logger.warn("Could not close already closed transaction", e);
                                        }
                                }
 
                        }
-                       if(transactionTimer instanceof Thread){
+                       if(transactionTimer != null){
                                transactionTimer.interrupt();
                        }
-
-
                }
 
-               private void createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) {
+               private void createPolicy(PolicyRestAdapter policy, String username, String policyScope, String inputPolicyName, String policyDataString) {
+                       String policyName = inputPolicyName;
                        logger.debug("createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) as createPolicy("+policy+", "+username+", "+policyScope+", "+policyName+", "+policyDataString+") called");
                        synchronized(emLock){
                                checkBeforeOperationRun();
@@ -1512,12 +1585,12 @@ public class PolicyDBDao {
                                }
                                policyName = policyName.split(":")[1];
                                Query createPolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName");                     
-                               createPolicyQuery.setParameter("scope", policyScope);
+                               createPolicyQuery.setParameter(scope, policyScope);
                                createPolicyQuery.setParameter("policyName", policyName);
                                List<?> createPolicyQueryList = createPolicyQuery.getResultList();
                                PolicyEntity newPolicyEntity;
                                boolean update;
-                               if(createPolicyQueryList.size() < 1){
+                               if(createPolicyQueryList.isEmpty()){
                                        newPolicyEntity = new PolicyEntity();
                                        update = false;
                                } else if(createPolicyQueryList.size() > 1){
@@ -1529,7 +1602,7 @@ public class PolicyDBDao {
                                }                       
 
                                ActionBodyEntity newActionBodyEntity = null;
-                               if(policy.getPolicyType().equals("Action")){
+                               if(policy.getPolicyType().equals(action)){
                                        boolean abupdate = false;
                                        if(newPolicyEntity.getActionBodyEntity() == null){
                                                newActionBodyEntity = new ActionBodyEntity();
@@ -1546,45 +1619,12 @@ public class PolicyDBDao {
                                                //trim the .xml off the end
                                                String policyNameClean = FilenameUtils.removeExtension(configName);
                                                String actionBodyName =  policyNameClean + ".json";
-                                               Path actionBodyPath = Paths.get(Webapps.getActionHome(), actionBodyName);
-                                               if(logger.isDebugEnabled()){
-                                                       logger.debug("\nPolicyDBDao.createPolicy"
-                                                                       + "\n   actionBodyPath = " + actionBodyPath);
-                                               }
-                                               //get the action body
-                                               String actionBodyString = null;
-                                               String actionBodyPathStr = null;
-                                               InputStream fileContentStream = null;
-
-                                               if (Files.exists(actionBodyPath)) {
-                                                       try {
-                                                               actionBodyPathStr = (actionBodyPath != null ? actionBodyPath.toString() : null);
-                                                               fileContentStream = new FileInputStream(actionBodyPathStr);
-                                                               actionBodyString = IOUtils.toString(fileContentStream);
-                                                               if(logger.isDebugEnabled()){
-                                                                       logger.debug("\nPolicyDBDao.createPolicy"
-                                                                                       + "\n   actionBodyPathStr = " + actionBodyPathStr
-                                                                                       + "\n   actionBodyString = " + actionBodyString);
-                                                               }
-                                                       } catch (FileNotFoundException e) {
-                                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new actionBodyPathStr FileInputStream("+actionBodyPathStr+")");
-                                                               throw new IllegalArgumentException("The actionBodyPathStr file path " + actionBodyPathStr + " does not exist" 
-                                                                               + "\nEXCEPTION: " + e);
-                                                       } catch(IOException e2){
-                                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Caught IOException on actionBodyPath newIOUtils.toString("+fileContentStream+")");
-                                                               throw new IllegalArgumentException("The actionBodyPath file path cannot be read" + fileContentStream 
-                                                                               + "\nEXCEPTION: " + e2);
-                                                       } finally {
-                                                               IOUtils.closeQuietly(fileContentStream);
-                                                       }
 
-                                                       if(actionBodyString == null){
-                                                               throw new IllegalArgumentException("The file path (" + actionBodyPathStr + ") cannot be read");
-                                                       }
-                                               } else {
+                                               //get the action body
+                                               String actionBodyString = policy.getActionBody();
+                                               if(actionBodyString == null){
                                                        actionBodyString = "{}";
                                                }
-
                                                newActionBodyEntity.setActionBody(actionBodyString);
                                                newActionBodyEntity.setActionBodyName(actionBodyName);
                                                newActionBodyEntity.setModifiedBy("PolicyDBDao.createPolicy()");
@@ -1616,7 +1656,7 @@ public class PolicyDBDao {
                                }
 
                                ConfigurationDataEntity newConfigurationDataEntity;
-                               if(policy.getPolicyType().equals("Config")){
+                               if(policy.getPolicyType().equals(config)){
                                        boolean configUpdate;
                                        if(newPolicyEntity.getConfigurationData() == null){
                                                newConfigurationDataEntity = new ConfigurationDataEntity();
@@ -1654,7 +1694,7 @@ public class PolicyDBDao {
                                                                newConfigurationDataEntity.setConfigBody(policy.getConfigBodyData());
                                                        }
                                                }
-                                               if(newConfigurationDataEntity.isDeleted() == true){
+                                               if(newConfigurationDataEntity.isDeleted()){
                                                        newConfigurationDataEntity.setDeleted(false);
                                                }
 
@@ -1702,11 +1742,9 @@ public class PolicyDBDao {
                                newPolicyEntity.setConfigurationData(newConfigurationDataEntity);
                                newPolicyEntity.setActionBodyEntity(newActionBodyEntity);
 
-
                                em.flush();
                                this.policyId = newPolicyEntity.getPolicyId();
                        }
-
                        return;
                }
 
@@ -1742,135 +1780,20 @@ public class PolicyDBDao {
                                try{
                                        policyQueryList = policyQuery.getResultList();
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get policy with policyQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get policy with policyQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get policy "+policyId);
                                }
-                               if(policyQueryList.size() < 1){
+                               if(policyQueryList.isEmpty()){
                                        PolicyLogger.error("Policy does not exist with id "+policyId);
                                        throw new PersistenceException("Group policy is being added to does not exist with id "+policyId);
                                } else if(policyQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one policy with the id "+policyId+" were found in the database");
-                                       throw new PersistenceException("Somehow, more than one policy with the id "+policyId+" were found in the database");
+                                       PolicyLogger.error(duplicatePolicyId+policyId+foundInDB);
+                                       throw new PersistenceException(duplicatePolicyId+policyId+foundInDB);
                                }
                                return (PolicyEntity)policyQueryList.get(0);
                        }
                }
 
-               @Override
-               public void renamePolicy(String oldPath, String newPath,String username){
-/*                     String[] oldPolicy = getScopeAndNameAndType(oldPath);
-                       String[] newPolicy = getScopeAndNameAndType(newPath);
-                       if(oldPolicy == null || newPolicy == null){
-                               PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
-                                               +oldPath+", "+newPath);
-                               throw new IllegalArgumentException("Could not parse one or more of the path names");
-                       }
-                       synchronized (emLock) {
-                               checkBeforeOperationRun();
-
-                               PolicyEntity existingPolicy;
-                               boolean existingPolicyDeleted = false;
-                               List<?> groups = null;
-                               try{
-                                       existingPolicy = getPolicy(newPolicy[1],newPolicy[0]);
-                               } catch(Exception e){
-                                       existingPolicy = null;
-                               }
-                               if(existingPolicy != null && !existingPolicy.isDeleted()){
-                                       logger.error("The policy named "+existingPolicy.getPolicyName()+" already exists, cannot rename policy: "+newPolicy);
-                                       throw new IllegalArgumentException("The policy named "+existingPolicy.getPolicyName()+" already exists, cannot rename policy: "+newPolicy);
-                               } else if(existingPolicy != null && existingPolicy.isDeleted()){
-                                       try{
-                                               Query getGroups = em.createQuery("SELECT g FROM GroupEntity g JOIN g.policies p WHERE p.policyId=:pid");
-
-                                               getGroups.setParameter("pid", existingPolicy.getPolicyId());
-                                               groups = getGroups.getResultList();
-                                       }catch(Exception e){
-                                               groups = new LinkedList<>();
-                                       }
-                                       for(Object o : groups){
-                                               GroupEntity group = (GroupEntity)o;
-                                               group.removePolicyFromGroup(existingPolicy);
-                                       }
-                                       try{
-                                               em.flush();
-                                       }catch(Exception e){
-                                               logger.error("Error while removing the policy from groups: "+existingPolicy.getPolicyName());
-                                       }
-                                       try{
-                                               em.remove(existingPolicy);
-                                               em.flush();
-                                       }catch(Exception e){
-                                               logger.error("Could not remove the existing deleted policy: "+existingPolicy.getPolicyName());
-                                       }
-                                       existingPolicyDeleted = true;
-                                       //create the new policy
-                                       //for each of the groups, add the new policy
-                               }
-
-                               PolicyEntity policyToRename;
-                               try{
-                                       policyToRename = getPolicy(oldPolicy[1],oldPolicy[0]);
-                               } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "PolicyDBDao", "Could not get policy record to rename: "
-                                                       +oldPolicy[1]);
-                                       throw new PersistenceException("Could not get policy record to rename");
-                               }
-                               String policyDataString = null;
-                               InputStream fileContentStream = null;
-                               String policyFilePath = Paths.get(oldPath).toAbsolutePath().toString();
-                               //I want to try the old path first, then if it doesn't work, try the new path
-                               for(int i=0;i<2;i++){
-                                       try {
-                                               fileContentStream = new FileInputStream(policyFilePath);
-                                               policyDataString = IOUtils.toString(fileContentStream);
-                                       } catch (FileNotFoundException e) {
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new FileInputStream("+policyFilePath+")");
-                                               //if we can't find the oldPath, we'll try the new path
-                                               if(i == 0){
-                                                       policyFilePath = Paths.get(newPath).toAbsolutePath().toString();
-                                                       continue;
-                                               }
-                                               throw new IllegalArgumentException("The file path does not exist");
-                                       } catch(IOException e2){
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Caught IOException on newIOUtils.toString("+fileContentStream+")");
-                                               throw new IllegalArgumentException("The file path cannot be read");
-                                       } finally {
-                                               IOUtils.closeQuietly(fileContentStream);
-                                       }
-                                       if(policyDataString == null){
-                                               throw new IllegalArgumentException("The file path cannot be read");
-                                       }
-                                       //escape the loop
-                                       i=2;
-                               }
-                               policyToRename.setPolicyName(newPolicy[1]);
-                               policyToRename.setPolicyData(policyDataString);
-                               policyToRename.setScope(newPolicy[0]);
-                               policyToRename.setModifiedBy(username);
-                               if(policyToRename.getConfigurationData() != null){
-                                       String configType = policyToRename.getConfigurationData().getConfigType();
-                                       policyToRename.getConfigurationData().setConfigurationName(getConfigFile(newPolicy[1], configType));
-                                       policyToRename.getConfigurationData().setModifiedBy(username);
-                               }
-                               if(policyToRename.getActionBodyEntity() != null){
-                                       String newActionName = newPolicy[0]+"."+removeFileExtension(newPolicy[1])+".json";
-                                       policyToRename.getActionBodyEntity().setActionBodyName(newActionName);
-                                       policyToRename.getActionBodyEntity().setModifiedBy(username);
-                               }
-                               if(existingPolicyDeleted){
-                                       for(Object o : groups){
-
-                                               GroupEntity group = (GroupEntity)o;
-                                               group.addPolicyToGroup(policyToRename);
-                                       }
-                               }
-                               em.flush();
-                               this.policyId = policyToRename.getPolicyId();
-                               this.newGroupId = oldPath;
-                       }*/
-               }
-
                @Override
                public GroupEntity getGroup(long groupKey){
                        logger.debug("getGroup(int groupKey) as getGroup("+groupKey+") called");
@@ -1886,15 +1809,15 @@ public class PolicyDBDao {
                                try{
                                        groupQueryList = groupQuery.getResultList();
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group with groupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to get group "+groupKey);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get group with groupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToGetGroup+groupKey);
                                }
-                               if(groupQueryList.size() < 1){
+                               if(groupQueryList.isEmpty()){
                                        PolicyLogger.error("Group does not exist with groupKey "+groupKey);
                                        throw new PersistenceException("Group does not exist with groupKey "+groupKey);
                                } else if(groupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
-                                       throw new PersistenceException("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
+                                       PolicyLogger.error("Somehow, more than one group with the groupKey "+groupKey+foundInDB);
+                                       throw new PersistenceException("Somehow, more than one group with the groupKey "+groupKey+foundInDB);
                                }
                                return (GroupEntity)groupQueryList.get(0);
                        }
@@ -1910,24 +1833,25 @@ public class PolicyDBDao {
                                checkBeforeOperationRun(true);
                                //check if group exists
                                Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId");
-                               groupQuery.setParameter("groupId", groupId);                    
+                               groupQuery.setParameter(groupIdVar, groupId);                   
                                List<?> groupQueryList;
                                try{
                                        groupQueryList = groupQuery.getResultList();
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group with groupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to get group "+groupId);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get group with groupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToGetGroup+groupId);
                                }
-                               if(groupQueryList.size() < 1){
+                               if(groupQueryList.isEmpty()){
                                        PolicyLogger.error("Group does not exist with id "+groupId);
                                        throw new PersistenceException("Group does not exist with id "+groupId);
                                } else if(groupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the id "+groupId+" were found in the database");
-                                       throw new PersistenceException("Somehow, more than one group with the id "+groupId+" were found in the database");
+                                       PolicyLogger.error(duplicateGroupId +groupId+foundInDB);
+                                       throw new PersistenceException(duplicateGroupId+groupId+foundInDB);
                                }
                                return (GroupEntity)groupQueryList.get(0);
                        }
                }
+               
                @Override
                public List<?> getPdpsInGroup(long groupKey){
                        logger.debug("getPdpsInGroup(int groupKey) as getPdpsInGroup("+groupKey+") called");
@@ -1941,6 +1865,7 @@ public class PolicyDBDao {
                                return pdpsQuery.getResultList();
                        }
                }
+               
                @Override
                public PdpEntity getPdp(long pdpKey){
                        logger.debug("getPdp(int pdpKey) as getPdp("+pdpKey+") called");
@@ -1956,65 +1881,19 @@ public class PolicyDBDao {
                                try{
                                        pdpQueryList = pdpQuery.getResultList();
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp with pdpQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get pdp with pdpQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get pdp "+pdpKey);
                                }
-                               if(pdpQueryList.size() < 1){
+                               if(pdpQueryList.isEmpty()){
                                        PolicyLogger.error("Pdp does not exist with pdpKey "+pdpKey);
                                        throw new PersistenceException("Pdp does not exist with pdpKey "+pdpKey);
                                } else if(pdpQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
-                                       throw new PersistenceException("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
+                                       PolicyLogger.error("Somehow, more than one pdp with the pdpKey "+pdpKey+foundInDB);
+                                       throw new PersistenceException("Somehow, more than one pdp with the pdpKey "+pdpKey+foundInDB);
                                }
                                return (PdpEntity)pdpQueryList.get(0);
                        }
                }
-               
-               public void deletePolicy(String policyToDeletes){
-                       /*synchronized(emLock){
-                               checkBeforeOperationRun();
-                               logger.debug("deletePolicy(String policyToDeletes) as deletePolicy("+policyToDeletes+") called");
-                               String[] scopeNameAndType = getScopeAndNameAndType(policyToDeletes);
-                               if(scopeNameAndType == null){
-                                       throw new IllegalArgumentException("Could not parse file path");
-                               }
-                               String realScope = scopeNameAndType[0];
-                               String realName = scopeNameAndType[1];
-                               Query deletePolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName AND p.deleted=:deleted");                      
-                               deletePolicyQuery.setParameter("scope",realScope);
-                               deletePolicyQuery.setParameter("policyName", realName);
-                               deletePolicyQuery.setParameter("deleted", false);
-                               List<?> deletePolicyQueryList = deletePolicyQuery.getResultList();
-                               if(deletePolicyQueryList.size() < 1){
-                                       logger.warn("The policy being deleted could not be found.");
-                                       return;
-                               } else if(deletePolicyQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
-                                       throw new PersistenceException("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
-                               } else {
-                                       PolicyEntity policyToDelete = (PolicyEntity)deletePolicyQueryList.get(0);
-                                       policyToDelete.setDeleted(true);
-                                       if(policyToDelete.getConfigurationData() != null){
-                                               ConfigurationDataEntity cde = em.find(ConfigurationDataEntity.class,policyToDelete.getConfigurationData().getConfigurationDataId());                                    
-                                               if(cde != null){
-                                                       cde.setDeleted(true);
-                                               }
-                                       }
-                                       if(policyToDelete.getActionBodyEntity() != null){
-                                               ActionBodyEntity abe = em.find(ActionBodyEntity.class,policyToDelete.getActionBodyEntity().getActionBodyId());                                  
-                                               if(abe != null){
-                                                       abe.setDeleted(true);
-                                               }
-                                       }
-
-                                       em.flush();
-                                       this.policyId = policyToDelete.getPolicyId();
-
-                               }
-                       }
-*/
-               }
-
 
                @Override
                public boolean isTransactionOpen() {
@@ -2024,51 +1903,8 @@ public class PolicyDBDao {
                        }
                }
 
-
-               @Override
-               public void clonePolicy(String oldPolicyPath, String newPolicyPath, String username){
-                       /*String[] oldPolicyData = getScopeAndNameAndType(oldPolicyPath);
-                       String[] newPolicyData = getScopeAndNameAndType(newPolicyPath);
-                       if(oldPolicyData == null || newPolicyData == null){
-                               PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
-                                               +oldPolicyPath+", "+newPolicyPath);
-                               throw new IllegalArgumentException("Could not parse the oldPolicyPath or newPolicyPath");
-                       }
-                       PolicyEntity oldPolicy;
-                       try{
-                               oldPolicy = getPolicy(oldPolicyData[1],oldPolicyData[0]);
-                       }catch(Exception e){
-                               PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "PolicyDBDao", "Could not get policy record to clone: "
-                                               +oldPolicyData[1]);
-                               throw new PersistenceException("Could not get policy record to clone");
-                       }
-                       ConfigurationDataEntity clonedConfig = null;
-                       if(oldPolicy.getConfigurationData() != null){
-                               clonedConfig = new ConfigurationDataEntity();
-                               em.persist(clonedConfig);
-                               clonedConfig.setConfigBody(oldPolicy.getConfigurationData().getConfigBody());
-                               clonedConfig.setConfigType(oldPolicy.getConfigurationData().getConfigType());
-                               clonedConfig.setCreatedBy(username);
-                               clonedConfig.setConfigurationName(getConfigFile(newPolicyData[1], oldPolicy.getConfigurationData().getConfigType()));
-                               clonedConfig.setDescription(oldPolicy.getConfigurationData().getDescription());
-                               clonedConfig.setModifiedBy(username);
-                               em.flush();
-                       }
-                       ActionBodyEntity clonedAction = null;
-                       if(oldPolicy.getActionBodyEntity() != null){
-                               clonedAction = new ActionBodyEntity();
-                               em.persist(clonedAction);
-                               clonedAction.setActionBody(oldPolicy.getActionBodyEntity().getActionBody());
-                               clonedAction.setActionBodyName(newPolicyData[0]+"."+newPolicyData[1]+".json");
-                               clonedAction.setCreatedBy(username);
-                               clonedAction.setModifiedBy(username);
-                               em.flush();
-                       }                       
-
-*/
-               }
-
-               private String processConfigPath(String configPath){
+               private String processConfigPath(String inputConfigPath){
+                       String configPath = inputConfigPath;
                        String webappsPath = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS);
                        if(webappsPath == null){
                                logger.error("Webapps property does not exist");
@@ -2079,11 +1915,12 @@ public class PolicyDBDao {
                        try{
                                configPath = Paths.get(configPath).toString();
                        } catch(InvalidPathException e){
-                               logger.error("Invalid config path: "+configPath);
+                               logger.error("Invalid config path: "+configPath, e);
                                throw new IllegalArgumentException("Invalid config path: "+configPath);
                        }
                        return configPath;
                }
+               
                private String readConfigFile(String configPath){
                        String configDataString = null;
                        InputStream configContentStream = null;
@@ -2119,21 +1956,25 @@ public class PolicyDBDao {
                                        policyDataString = IOUtils.toString(policyXmlStream);
                                } catch (IOException e) {
                                        policyDataString = "could not read";
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught IOException on IOUtils.toString("+policyXmlStream+")");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught IOException on IOUtils.toString("+policyXmlStream+")");
                                        throw new IllegalArgumentException("Cannot parse the policy xml from the PolicyRestAdapter.");
                                }
                                IOUtils.closeQuietly(policyXmlStream);
+                               if(isJunit){
+                                       //Using parentPath object to set policy data.
+                                       policyDataString = policy.policyAdapter.getParentPath();
+                               }
                                String configPath = "";
-                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Config")) {
+                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase(config)) {
                                        configPath = evaluateXPath("/Policy/Rule/AdviceExpressions/AdviceExpression[contains(@AdviceId,'ID')]/AttributeAssignmentExpression[@AttributeId='URLID']/AttributeValue/text()", policyDataString);
-                               } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")) {
+                               } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase(action)) {
                                        configPath = evaluateXPath("/Policy/Rule/ObligationExpressions/ObligationExpression[contains(@ObligationId, " +policy.policyAdapter.getActionAttribute()+ ")]/AttributeAssignmentExpression[@AttributeId='body']/AttributeValue/text()", policyDataString);
                                }
 
                                String prefix = null;
-                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Config")) {
+                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase(config)) {
 
-                                       prefix = configPath.substring(configPath.indexOf(policyScope+".")+policyScope.concat(".").length(), configPath.indexOf(policy.policyAdapter.getPolicyName()));
+                                       prefix = configPath.substring(configPath.indexOf(policyScope+".")+policyScope.concat(".").length(), configPath.lastIndexOf(policy.policyAdapter.getPolicyName()));
                                        if(isNullOrEmpty(policy.policyAdapter.getConfigBodyData())){
                                                String configData = "";
                                                try{
@@ -2149,9 +1990,9 @@ public class PolicyDBDao {
                                                }
                                                policy.policyAdapter.setConfigBodyData(configData);
                                        }
-                               } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")) {
+                               } else if (action.equalsIgnoreCase(policy.policyAdapter.getPolicyType())) {
                                        prefix = "Action_";
-                               } else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Decision")) {
+                               } else if ("Decision".equalsIgnoreCase(policy.policyAdapter.getPolicyType())) {
                                        prefix = "Decision_";
                                }
 
@@ -2160,13 +2001,11 @@ public class PolicyDBDao {
                                        throw new IllegalArgumentException("The data field is not an instance of PolicyType");
                                }
                                String finalName = policyScope + "." + prefix+policy.policyAdapter.getPolicyName()+"."+((PolicyType)policy.policyAdapter.getData()).getVersion()+".xml";
-                               if(policy.policyAdapter.getConfigType() == null || policy.policyAdapter.getConfigType().equals("")){
+                               if(policy.policyAdapter.getConfigType() == null || "".equals(policy.policyAdapter.getConfigType())){
                                        //get the config file extension
                                        String ext = "";
-                                       if (configPath != null) {
-                                               if (!configPath.equalsIgnoreCase("")) {
-                                                       ext = configPath.substring(configPath.lastIndexOf('.'), configPath.length());;
-                                               }
+                                       if (configPath != null && !"".equalsIgnoreCase(configPath)) {
+                                               ext = configPath.substring(configPath.lastIndexOf('.'), configPath.length());;
                                        }
 
                                        if(ext.contains("txt")){
@@ -2178,7 +2017,7 @@ public class PolicyDBDao {
                                        } else if(ext.contains("properties")){
                                                policy.policyAdapter.setConfigType(PROPERTIES_CONFIG);
                                        } else {
-                                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")){
+                                               if (policy.policyAdapter.getPolicyType().equalsIgnoreCase(action)){
                                                        policy.policyAdapter.setConfigType(JSON_CONFIG);
                                                }
                                        }
@@ -2205,37 +2044,36 @@ public class PolicyDBDao {
                                        }
                                        em.close();
                                }
-                               if(transactionTimer instanceof Thread){
+                               if(transactionTimer != null){
                                        transactionTimer.interrupt();
                                }
                        }
                }
 
-
-
                @Override
-               public void createGroup(String groupId, String groupName, String groupDescription, String username) {
+               public void createGroup(String groupId, String groupName, String inputGroupDescription, String username) {
+                       String groupDescription = inputGroupDescription;
                        logger.debug("deletePolicy(String policyToDeletes) as createGroup("+groupId+", "+groupName+", "+groupDescription+") called");
                        if(isNullOrEmpty(groupId, groupName, username)){
                                throw new IllegalArgumentException("groupId, groupName, and username must not be null or empty");
                        }
-                       if(!(groupDescription instanceof String)){
+                       if(groupDescription == null){
                                groupDescription = "";
                        }
 
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               checkGroupQuery.setParameter("groupId", groupId);
-                               checkGroupQuery.setParameter("deleted", false);
+                               Query checkGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               checkGroupQuery.setParameter(groupIdVar, groupId);
+                               checkGroupQuery.setParameter(deletedVar, false);
                                List<?> checkGroupQueryList;
                                try{
                                        checkGroupQueryList = checkGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to check for existing group");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on checkGroupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToCheckExisting);
                                }
-                               if(checkGroupQueryList.size() > 0){
+                               if(!checkGroupQueryList.isEmpty()){
                                        PolicyLogger.error("The group being added already exists with id "+groupId);
                                        throw new PersistenceException("The group being added already exists with id "+groupId);
                                }
@@ -2254,7 +2092,7 @@ public class PolicyDBDao {
 
                @Override
                public void updateGroup(OnapPDPGroup group, String username){
-                       logger.debug("updateGroup(PDPGroup group) as updateGroup("+group+","+username+") called");
+                       logger.info("PolicyDBDao: updateGroup(PDPGroup group) as updateGroup("+group+","+username+") called");
                        if(group == null){
                                throw new IllegalArgumentException("PDPGroup group must not be null");
                        }
@@ -2264,41 +2102,40 @@ public class PolicyDBDao {
 
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query getGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               getGroupQuery.setParameter("groupId", group.getId());
-                               getGroupQuery.setParameter("deleted", false);
+                               Query getGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               getGroupQuery.setParameter(groupIdVar, group.getId());
+                               getGroupQuery.setParameter(deletedVar, false);
                                List<?> getGroupQueryList;
                                try{
                                        getGroupQueryList = getGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getGroupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to get group "+group.getId()+" for editing");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on getGroupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToGetGroup+group.getId()+" for editing");
                                }
-                               if(getGroupQueryList.size() < 1){
+                               if(getGroupQueryList.isEmpty()){
                                        PolicyLogger.error("The group cannot be found to update with id "+group.getId());
                                        throw new PersistenceException("The group cannot be found to update with id "+group.getId());
                                } else if(getGroupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
-                                       throw new PersistenceException("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+                                       PolicyLogger.error(duplicateGroupId+group.getId()+deletedStatusFound);
+                                       throw new PersistenceException(duplicateGroupId+group.getId()+deletedStatusFound);
                                }
-                               GroupEntity groupToUpdate = (GroupEntity)getGroupQueryList.get(0);
-                               if(!stringEquals(groupToUpdate.getModifiedBy(), username)){
-                                       groupToUpdate.setModifiedBy(username);
+                               GroupEntity groupToUpdateInDB = (GroupEntity)getGroupQueryList.get(0);
+                               if(!stringEquals(groupToUpdateInDB.getModifiedBy(), username)){
+                                       groupToUpdateInDB.setModifiedBy(username);
                                }
-                               if(group.getDescription() != null && !stringEquals(group.getDescription(),groupToUpdate.getDescription())){
-                                       groupToUpdate.setDescription(group.getDescription());
+                               if(group.getDescription() != null && !stringEquals(group.getDescription(),groupToUpdateInDB.getDescription())){
+                                       groupToUpdateInDB.setDescription(group.getDescription());
                                }
                                //let's find out what policies have been deleted
                                StdPDPGroup oldGroup = null;
                                try {
                                        oldGroup = (StdPDPGroup) papEngine.getGroup(group.getId());
                                } catch (PAPException e1) {
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "We cannot get the group from the papEngine to delete policies");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, policyDBDaoVar, "We cannot get the group from the papEngine to delete policies");
                                }
                                if(oldGroup == null){
                                        PolicyLogger.error("We cannot get the group from the papEngine to delete policies");
                                } else {
-
                                        Set<String> newPolicySet = new HashSet<>(group.getPolicies().size());
                                        //a multiple of n runtime is faster than n^2, so I am using a hashset to do the comparison
                                        for(PDPPolicy pol: group.getPolicies()){
@@ -2308,42 +2145,64 @@ public class PolicyDBDao {
                                                //should be fast since getPolicies uses a HashSet in StdPDPGroup
                                                if(!newPolicySet.contains(pol.getId())){
                                                        String[] scopeAndName = getNameScopeAndVersionFromPdpPolicy(pol.getId());
-                                                       PolicyEntity policyToDelete;
+                                                       PolicyEntity policyToDelete = null;
                                                        try{
-                                                               policyToDelete = getPolicy(scopeAndName[0],scopeAndName[1]);
+                                                               if(scopeAndName!=null){
+                                                                       policyToDelete = getPolicy(scopeAndName[0],scopeAndName[1]);
+                                                                       if ("XACMLPapServlet.doDelete".equals(username)) {
+                                                                               Iterator<PolicyEntity> dbPolicyIt = groupToUpdateInDB.getPolicies().iterator();
+                                                                               String policyName = getPolicyNameAndVersionFromPolicyFileName(policyToDelete.getPolicyName())[0];
+                                                       
+                                                                               logger.info("PolicyDBDao: delete policy from GroupEntity");
+                                                                               try{
+                                                                                       while(dbPolicyIt.hasNext()){
+                                                                                               PolicyEntity dbpolicy = dbPolicyIt.next();
+                                                                                               if(policyToDelete.getScope().equals(dbpolicy.getScope()) && 
+                                                                                                               getPolicyNameAndVersionFromPolicyFileName(dbpolicy.getPolicyName())[0].equals(policyName)) {
+                                                                                                       dbPolicyIt.remove();
+                                                                                                       
+                                                                                                       logger.info("PolicyDBDao: deleting policy from the existing group:\n "
+                                                                                                                       + "policyName is " + policyToDelete.getScope()+"."+policyToDelete.getPolicyName() + "\n"
+                                                                                                                       + "group is " + groupToUpdateInDB.getGroupId());
+                                                                                               }  
+                                                                                       }
+                                                                               }catch(Exception e){
+                                                                                       logger.debug(e);
+                                                                                       PolicyLogger.error("Could not delete policy with name: "+ policyToDelete.getScope()+"."+policyToDelete.getPolicyName()+"\n ID: "+ policyToDelete.getPolicyId());
+                                                               }
+                                                                       }
+                                                               }       
                                                        }catch(Exception e){
-                                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get policy to remove: "+pol.getId());
+                                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Could not get policy to remove: "+pol.getId());
                                                                throw new PersistenceException("Could not get policy to remove: "+pol.getId());
                                                        }
-                                                       groupToUpdate.getPolicies().remove(policyToDelete);
-
                                                }
                                        }
                                }
-                               if(group.getName() != null && !stringEquals(group.getName(),groupToUpdate.getgroupName())){
+
+                               if(group.getName() != null && !stringEquals(group.getName(),groupToUpdateInDB.getgroupName())){
                                        //we need to check if the new id exists in the database
                                        String newGroupId = createNewPDPGroupId(group.getName());
-                                       Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                                       checkGroupQuery.setParameter("groupId", newGroupId);
-                                       checkGroupQuery.setParameter("deleted", false);
+                                       Query checkGroupQuery = em.createQuery(groupEntitySelectQuery);
+                                       checkGroupQuery.setParameter(groupIdVar, newGroupId);
+                                       checkGroupQuery.setParameter(deletedVar, false);
                                        List<?> checkGroupQueryList;
                                        try{
                                                checkGroupQueryList = checkGroupQuery.getResultList();
                                        } catch(Exception e){
-                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
-                                               throw new PersistenceException("Query failed trying to check for existing group");
+                                               PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on checkGroupQuery.getResultList()");
+                                               throw new PersistenceException(queryFailedToCheckExisting);
                                        }
-                                       if(checkGroupQueryList.size() != 0){
+                                       if(!checkGroupQueryList.isEmpty()){
                                                PolicyLogger.error("The new group name already exists, group id "+newGroupId);
                                                throw new PersistenceException("The new group name already exists, group id "+newGroupId);
                                        }
-                                       groupToUpdate.setGroupId(newGroupId);
-                                       groupToUpdate.setGroupName(group.getName());
+                                       groupToUpdateInDB.setGroupId(newGroupId);
+                                       groupToUpdateInDB.setGroupName(group.getName());
                                        this.newGroupId = group.getId();
                                }
-
                                em.flush();
-                               this.groupId = groupToUpdate.getGroupKey();
+                               this.groupId = groupToUpdateInDB.getGroupKey();
                        }
                }
 
@@ -2353,37 +2212,34 @@ public class PolicyDBDao {
                        if(isNullOrEmpty(pdpID, groupID,pdpName,username)){
                                throw new IllegalArgumentException("pdpID, groupID, pdpName, and username must not be null or empty");
                        }
-                       if(!(pdpDescription instanceof String)){
-                               pdpDescription = "";
-                       }
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               checkGroupQuery.setParameter("groupId", groupID);
-                               checkGroupQuery.setParameter("deleted", false);
+                               Query checkGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               checkGroupQuery.setParameter(groupIdVar, groupID);
+                               checkGroupQuery.setParameter(deletedVar, false);
                                List<?> checkGroupQueryList;
                                try{
                                        checkGroupQueryList = checkGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check for existing group on checkGroupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to check for existing group");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check for existing group on checkGroupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToCheckExisting);
                                }
                                if(checkGroupQueryList.size() != 1){
                                        PolicyLogger.error("The group does not exist");
                                        throw new PersistenceException("The group does not exist");
                                }
-                               Query checkDuplicateQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
-                               checkDuplicateQuery.setParameter("pdpId", pdpID);
-                               checkDuplicateQuery.setParameter("deleted", false);
+                               Query checkDuplicateQuery = em.createQuery(pdpEntitySelectQuery);
+                               checkDuplicateQuery.setParameter(pdpIdVariable, pdpID);
+                               checkDuplicateQuery.setParameter(deletedVar, false);
                                List<?> checkDuplicateList;
                                try{
                                        checkDuplicateList = checkDuplicateQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check for duplicate PDP "+pdpID+" on checkDuplicateQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check for duplicate PDP "+pdpID+" on checkDuplicateQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to check for duplicate PDP "+pdpID);
                                }
                                PdpEntity newPdp;
-                               if(checkDuplicateList.size() > 0){
+                               if(!checkDuplicateList.isEmpty()){
                                        logger.warn("PDP already exists with id "+pdpID);                               
                                        newPdp = (PdpEntity)checkDuplicateList.get(0);
                                } else {
@@ -2402,7 +2258,6 @@ public class PolicyDBDao {
 
                                em.flush();
                                this.pdpId = newPdp.getPdpKey();
-
                        }
                }
 
@@ -2419,22 +2274,22 @@ public class PolicyDBDao {
 
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query getPdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
-                               getPdpQuery.setParameter("pdpId", pdp.getId());
-                               getPdpQuery.setParameter("deleted", false);
+                               Query getPdpQuery = em.createQuery(pdpEntitySelectQuery);
+                               getPdpQuery.setParameter(pdpIdVariable, pdp.getId());
+                               getPdpQuery.setParameter(deletedVar, false);
                                List<?> getPdpQueryList;
                                try{
                                        getPdpQueryList = getPdpQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on getPdpQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get PDP "+pdp.getId());
                                }
-                               if(getPdpQueryList.size() < 1){
+                               if(getPdpQueryList.isEmpty()){
                                        PolicyLogger.error("The pdp cannot be found to update with id "+pdp.getId());
                                        throw new PersistenceException("The pdp cannot be found to update with id "+pdp.getId());
                                } else if(getPdpQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
-                                       throw new PersistenceException("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+                                       PolicyLogger.error(moreThanOnePDP+pdp.getId()+deletedStatusFound);
+                                       throw new PersistenceException(moreThanOnePDP+pdp.getId()+deletedStatusFound);
                                }
                                PdpEntity pdpToUpdate = (PdpEntity)getPdpQueryList.get(0);
                                if(!stringEquals(pdpToUpdate.getModifiedBy(), username)){
@@ -2468,33 +2323,33 @@ public class PolicyDBDao {
                        synchronized(emLock){
                                checkBeforeOperationRun();
                                //check if pdp exists
-                               Query getPdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
-                               getPdpQuery.setParameter("pdpId", pdp.getId());
-                               getPdpQuery.setParameter("deleted", false);
+                               Query getPdpQuery = em.createQuery(pdpEntitySelectQuery);
+                               getPdpQuery.setParameter(pdpIdVariable, pdp.getId());
+                               getPdpQuery.setParameter(deletedVar, false);
                                List<?> getPdpQueryList;
                                try{
                                        getPdpQueryList = getPdpQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on getPdpQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get pdp to move with id "+pdp.getId());
                                }
-                               if(getPdpQueryList.size() < 1){
+                               if(getPdpQueryList.isEmpty()){
                                        PolicyLogger.error("The pdp cannot be found to move with id "+pdp.getId());
                                        throw new PersistenceException("The pdp cannot be found to move with id "+pdp.getId());
                                } else if(getPdpQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
-                                       throw new PersistenceException("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+                                       PolicyLogger.error(moreThanOnePDP+pdp.getId()+deletedStatusFound);
+                                       throw new PersistenceException(moreThanOnePDP+pdp.getId()+deletedStatusFound);
                                }
 
                                //check if new group exists
-                               Query checkGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               checkGroupQuery.setParameter("groupId", group.getId());
-                               checkGroupQuery.setParameter("deleted", false);
+                               Query checkGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               checkGroupQuery.setParameter(groupIdVar, group.getId());
+                               checkGroupQuery.setParameter(deletedVar, false);
                                List<?> checkGroupQueryList;
                                try{
                                        checkGroupQueryList = checkGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get group on checkGroupQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get group on checkGroupQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get new group "+group.getId());
                                }
                                if(checkGroupQueryList.size() != 1){
@@ -2525,22 +2380,22 @@ public class PolicyDBDao {
 
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query getGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               getGroupQuery.setParameter("groupId", group.getId());
-                               getGroupQuery.setParameter("deleted", false);
+                               Query getGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               getGroupQuery.setParameter(groupIdVar, group.getId());
+                               getGroupQuery.setParameter(deletedVar, false);
                                List<?> getGroupQueryList;
                                try{
                                        getGroupQueryList = getGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getGroupQuery.getResultList()");
-                                       throw new PersistenceException("Query failed trying to get group "+group.getId());
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on getGroupQuery.getResultList()");
+                                       throw new PersistenceException(queryFailedToGetGroup+group.getId());
                                }
-                               if(getGroupQueryList.size() < 1){
+                               if(getGroupQueryList.isEmpty()){
                                        PolicyLogger.error("The group cannot be found to set default with id "+group.getId());                          
                                        throw new PersistenceException("The group cannot be found to set default with id "+group.getId());
                                } else if(getGroupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
-                                       throw new PersistenceException("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+                                       PolicyLogger.error(duplicateGroupId+group.getId()+deletedStatusFound);
+                                       throw new PersistenceException(duplicateGroupId+group.getId()+deletedStatusFound);
                                }
                                GroupEntity newDefaultGroup = (GroupEntity)getGroupQueryList.get(0);
                                newDefaultGroup.setDefaultGroup(true);
@@ -2553,22 +2408,21 @@ public class PolicyDBDao {
                                Query setAllGroupsNotDefault = em.createQuery("UPDATE GroupEntity g SET g.defaultGroup=:defaultGroup WHERE g.deleted=:deleted AND g.groupKey<>:groupKey");
                                //not going to set modified by for all groups
                                setAllGroupsNotDefault.setParameter("defaultGroup", false);
-                               setAllGroupsNotDefault.setParameter("deleted", false);
+                               setAllGroupsNotDefault.setParameter(deletedVar, false);
                                setAllGroupsNotDefault.setParameter("groupKey", newDefaultGroup.getGroupKey());
                                try{
                                        logger.info("set " + setAllGroupsNotDefault.executeUpdate() + " groups as not default");
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on setAllGroupsNotDefault.executeUpdate()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception on setAllGroupsNotDefault.executeUpdate()");
                                        throw new PersistenceException("Could not set all other groups default to false");
                                }
-
                                em.flush();
                        }
                }
 
 
                @Override
-               public void deleteGroup(OnapPDPGroup group, OnapPDPGroup moveToGroup, String username) throws PAPException {
+               public void deleteGroup(OnapPDPGroup group, OnapPDPGroup moveToGroup, String username) throws PolicyDBException {
                        logger.debug("deleteGroup(PDPGroup group, PDPGroup moveToGroup, String username) as deleteGroup("+group+", "+moveToGroup+","+username+") called");
                        if(group == null){
                                throw new IllegalArgumentException("PDPGroup group cannot be null");
@@ -2579,56 +2433,56 @@ public class PolicyDBDao {
 
                        if(group.isDefaultGroup()){
                                PolicyLogger.error("The default group "+group.getId()+" was attempted to be deleted. It cannot be.");
-                               throw new PAPException("You cannot delete the default group.");
+                               throw new PolicyDBException("You cannot delete the default group.");
                        }
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query deleteGroupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               deleteGroupQuery.setParameter("groupId", group.getId());
-                               deleteGroupQuery.setParameter("deleted", false);
+                               Query deleteGroupQuery = em.createQuery(groupEntitySelectQuery);
+                               deleteGroupQuery.setParameter(groupIdVar, group.getId());
+                               deleteGroupQuery.setParameter(deletedVar, false);
                                List<?> deleteGroupQueryList;
                                try{
                                        deleteGroupQueryList = deleteGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists deleteGroupQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if group exists deleteGroupQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to check if group exists");
                                }
-                               if(deleteGroupQueryList.size() < 1){
-                                       logger.warn("The group could not be found with id " + group.getId());
+                               if(deleteGroupQueryList.isEmpty()){
+                                       logger.warn(groupCannotBeFound + group.getId());
                                        return;
                                } else if(deleteGroupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
-                                       throw new PersistenceException("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
+                                       PolicyLogger.error(duplicateGroupId+group.getId()+foundInDBNotDeleted);
+                                       throw new PersistenceException(duplicateGroupId+group.getId()+foundInDBNotDeleted);
                                }                               
 
                                Query pdpsInGroupQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group and p.deleted=:deleted");
                                pdpsInGroupQuery.setParameter("group", ((GroupEntity)deleteGroupQueryList.get(0)));
-                               pdpsInGroupQuery.setParameter("deleted", false);
+                               pdpsInGroupQuery.setParameter(deletedVar, false);
                                List<?> pdpsInGroupList;
                                try{
                                        pdpsInGroupList = pdpsInGroupQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to get PDPs in group");
                                }
-                               if(pdpsInGroupList.size() > 0){
+                               if(!pdpsInGroupList.isEmpty()){
                                        if(moveToGroup != null){
                                                Query checkMoveToGroupQuery = em.createQuery("SELECT o FROM GroupEntity o WHERE o.groupId=:groupId AND o.deleted=:deleted");
-                                               checkMoveToGroupQuery.setParameter("groupId", moveToGroup.getId());
-                                               checkMoveToGroupQuery.setParameter("deleted", false);
+                                               checkMoveToGroupQuery.setParameter(groupIdVar, moveToGroup.getId());
+                                               checkMoveToGroupQuery.setParameter(deletedVar, false);
                                                List<?> checkMoveToGroupList;
                                                try{
                                                        checkMoveToGroupList = checkMoveToGroupQuery.getResultList();
                                                } catch(Exception e){
-                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists checkMoveToGroupQuery.getResultList()");
+                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if group exists checkMoveToGroupQuery.getResultList()");
                                                        throw new PersistenceException("Query failed trying to check if group exists");
                                                }
-                                               if(checkMoveToGroupList.size() < 1){
-                                                       PolicyLogger.error("The group could not be found with id " + moveToGroup.getId());
-                                                       throw new PersistenceException("The group could not be found with id " + moveToGroup.getId());
+                                               if(checkMoveToGroupList.isEmpty()){
+                                                       PolicyLogger.error(groupCannotBeFound + moveToGroup.getId());
+                                                       throw new PersistenceException(groupCannotBeFound + moveToGroup.getId());
                                                } else if(checkMoveToGroupList.size() > 1){
-                                                       PolicyLogger.error("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
-                                                       throw new PersistenceException("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
+                                                       PolicyLogger.error(duplicateGroupId+moveToGroup.getId()+foundInDBNotDeleted);
+                                                       throw new PersistenceException(duplicateGroupId+moveToGroup.getId()+foundInDBNotDeleted);
                                                } else {
                                                        GroupEntity newGroup = (GroupEntity)checkMoveToGroupList.get(0);
                                                        for(Object pdpObject : pdpsInGroupList){
@@ -2638,18 +2492,17 @@ public class PolicyDBDao {
                                                                        pdp.setModifiedBy(username);
                                                                }
                                                                try{
-
                                                                        em.flush();
                                                                        this.newGroupId = newGroup.getGroupId();
                                                                } catch(PersistenceException e){
-                                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PersistenceException trying to set pdp group to null on em.flush()");
+                                                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught PersistenceException trying to set pdp group to null on em.flush()");
                                                                        throw new PersistenceException("Query failed trying to set pdp group to ");
                                                                }
                                                        }
                                                }
                                        } else {
                                                PolicyLogger.error("Group "+group.getId()+" is trying to be delted with PDPs. No group was provided to move them to");
-                                               throw new PAPException("Group has PDPs. Must provide a group for them to move to");
+                                               throw new PolicyDBException("Group has PDPs. Must provide a group for them to move to");
                                        }
                                } 
 
@@ -2665,68 +2518,88 @@ public class PolicyDBDao {
                }
 
                @Override
-               public void addPolicyToGroup(String groupID, String policyID, String username) {
-                       logger.debug("addPolicyToGroup(String groupID, String policyID, String username) as addPolicyToGroup("+groupID+", "+policyID+","+username+") called");
+               public StdPDPGroup addPolicyToGroup(String groupID, String policyID, String username) throws PolicyDBException {
+                       logger.info("PolicyDBDao: addPolicyToGroup(String groupID, String policyID, String username) as addPolicyToGroup("+groupID+", "+policyID+","+username+") called");
                        if(isNullOrEmpty(groupID, policyID, username)){
                                throw new IllegalArgumentException("groupID, policyID, and username must not be null or empty");
                        }
                        synchronized(emLock){
                                checkBeforeOperationRun();
                                //check if group exists
-                               Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
-                               groupQuery.setParameter("groupId", groupID);
-                               groupQuery.setParameter("deleted", false);
+                               Query groupQuery = em.createQuery(groupEntitySelectQuery);
+                               groupQuery.setParameter(groupIdVar, groupID);
+                               groupQuery.setParameter(deletedVar, false);
                                List<?> groupQueryList;
                                try{
                                        groupQueryList = groupQuery.getResultList();
                                }catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if group exists groupQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if group exists groupQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to check if group "+groupID+" exists");
                                }
-                               if(groupQueryList.size() < 1){
+                               if(groupQueryList.isEmpty()){
                                        PolicyLogger.error("Group policy is being added to does not exist with id "+groupID);
                                        throw new PersistenceException("Group policy is being added to does not exist with id "+groupID);
                                } else if(groupQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
-                                       throw new PersistenceException("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
+                                       PolicyLogger.error(duplicateGroupId+groupID+foundInDBNotDeleted);
+                                       throw new PersistenceException(duplicateGroupId+groupID+foundInDBNotDeleted);
                                }
+                                                               
                                //we need to convert the form of the policy id that is used groups into the form that is used 
                                //for the database. (com.Config_mypol.1.xml) to (Config_mypol.xml)
-                               String[] policyNameScopeAndVersion = getNameScopeAndVersionFromPdpPolicy(policyID);                     
+                               String[] policyNameScopeAndVersion = getNameScopeAndVersionFromPdpPolicy(policyID);
+                               if(policyNameScopeAndVersion == null) {
+                                   throw new IllegalArgumentException("Invalid input - policyID must contain name, scope and version");
+                               }
                                Query policyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.policyName=:policyName AND p.scope=:scope AND p.deleted=:deleted");
                                policyQuery.setParameter("policyName", policyNameScopeAndVersion[0]);
-                               policyQuery.setParameter("scope", policyNameScopeAndVersion[1]);                        
-                               policyQuery.setParameter("deleted", false);
+                               policyQuery.setParameter(scope, policyNameScopeAndVersion[1]);                  
+                               policyQuery.setParameter(deletedVar, false);
                                List<?> policyQueryList;
                                try{
                                        policyQueryList = policyQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if policy exists policyQuery.getResultList()");
+                                       logger.debug(e);
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if policy exists policyQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to check if policy "+policyNameScopeAndVersion[0]+" exists");
                                }
-                               if(policyQueryList.size() < 1){
+                               if(policyQueryList.isEmpty()){
                                        PolicyLogger.error("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);
                                        throw new PersistenceException("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);                          
                                } else if(policyQueryList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one policy with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
-                                       throw new PersistenceException("Somehow, more than one group with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
+                                       PolicyLogger.error(duplicatePolicyId+policyNameScopeAndVersion[0]+foundInDBNotDeleted);
+                                       throw new PersistenceException(duplicateGroupId+policyNameScopeAndVersion[0]+foundInDBNotDeleted);
                                }
+                               logger.info("PolicyDBDao: Getting group and policy from database");
                                GroupEntity group = (GroupEntity)groupQueryList.get(0);
                                PolicyEntity policy = (PolicyEntity)policyQueryList.get(0);
                    Iterator<PolicyEntity> policyIt = group.getPolicies().iterator();
                    String policyName = getPolicyNameAndVersionFromPolicyFileName(policy.getPolicyName())[0];
+                   
+                   logger.info("PolicyDBDao: policyName retrieved is " + policyName);
                    try{
-                   while(policyIt.hasNext()){
-                       PolicyEntity pol = policyIt.next();
-                       if(getPolicyNameAndVersionFromPolicyFileName(pol.getPolicyName())[0].equals(policyName)){
-                           policyIt.remove();
-                       }
-                   }
+                           while(policyIt.hasNext()){
+                               PolicyEntity pol = policyIt.next();
+                               if(policy.getScope().equals(pol.getScope()) && 
+                                               getPolicyNameAndVersionFromPolicyFileName(pol.getPolicyName())[0].equals(policyName)) {
+                                       policyIt.remove();
+                               }  
+                       }
                    }catch(Exception e){
+                       logger.debug(e);
                        PolicyLogger.error("Could not delete old versions for policy "+policy.getPolicyName()+", ID: "+policy.getPolicyId());
                    }
                                group.addPolicyToGroup(policy);
                                em.flush();
+                               
+                               // After adding policy to the db group we need to make sure the filesytem group is in sync with the db group
+                               try {
+                                       StdPDPGroup pdpGroup = (StdPDPGroup) papEngine.getGroup(group.getGroupId());
+                                       return synchronizeGroupPoliciesInFileSystem(pdpGroup, group);
+                               } catch (PAPException e) {
+                                       logger.debug(e);
+                                       PolicyLogger.error("PolicyDBDao: Could not synchronize the filesystem group with the database group. " + e.getMessage());
+                               }
+                               return null;
                        }
                }
 
@@ -2739,20 +2612,20 @@ public class PolicyDBDao {
                        }
                        synchronized(emLock){
                                checkBeforeOperationRun();
-                               Query pdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
-                               pdpQuery.setParameter("pdpId", pdpID);
-                               pdpQuery.setParameter("deleted", false);
+                               Query pdpQuery = em.createQuery(pdpEntitySelectQuery);
+                               pdpQuery.setParameter(pdpIdVariable, pdpID);
+                               pdpQuery.setParameter(deletedVar, false);
                                List<?> pdpList;
                                try{
                                        pdpList = pdpQuery.getResultList();
                                } catch(Exception e){
-                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to check if pdp exists  pdpQuery.getResultList()");
+                                       PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, policyDBDaoVar, "Caught Exception trying to check if pdp exists  pdpQuery.getResultList()");
                                        throw new PersistenceException("Query failed trying to check if pdp "+pdpID+" exists");
                                }
                                if(pdpList.size() > 1){
-                                       PolicyLogger.error("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
-                                       throw new PersistenceException("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
-                               } else if(pdpList.size() < 1){
+                                       PolicyLogger.error("Somehow, more than one pdp with the id "+pdpID+foundInDBNotDeleted);
+                                       throw new PersistenceException("Somehow, more than one pdp with the id "+pdpID+foundInDBNotDeleted);
+                               } else if(pdpList.isEmpty()){
                                        PolicyLogger.error("Pdp being removed does not exist with id "+pdpID);
                                        return;
                                }
@@ -2770,7 +2643,7 @@ public class PolicyDBDao {
        }
 
        private PolicyDBDao(){
-
+               //empty constructor
        }
        
        public static PolicyDBDaoTestClass getPolicyDBDaoTestClass(){
@@ -2781,19 +2654,7 @@ public class PolicyDBDao {
                String getConfigFile(String filename, String scope, PolicyRestAdapter policy){
                        return scope + "." + PolicyDBDao.this.getConfigFile(filename, policy);
                }
-               String computeScope(String fullPath, String pathToExclude){
-                       return PolicyDBDao.computeScope(fullPath, pathToExclude);
-               }
-               String encryptPassword(String password) throws Exception{
-                       return PolicyDBDao.encryptPassword(password);
-               }
-               String decryptPassword(String password) throws Exception{
-                       return PolicyDBDao.decryptPassword(password);
-               }
-               String getDescriptionFromXacml(String xacmlData){
-                       return PolicyDBDao.getDescriptionFromXacml(xacmlData);
-               }
-        String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName){
+        String[] getPolicyNameAndVersionFromPolicyFileName(String originalPolicyName) throws PolicyDBException{
             return PolicyDBDao.this.getPolicyNameAndVersionFromPolicyFileName(originalPolicyName);
         }
        }