Initial OpenECOMP policy/engine commit

Change-Id: I7dbff37733b661643dd4d1caefa3d7dccc361b6e
Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
diff --git a/ECOMP-PAP-REST/.gitignore b/ECOMP-PAP-REST/.gitignore
new file mode 100644
index 0000000..8567d58
--- /dev/null
+++ b/ECOMP-PAP-REST/.gitignore
@@ -0,0 +1,4 @@
+/build/
+/target/
+/target/
+/target/
diff --git a/ECOMP-PAP-REST/WebContent/META-INF/MANIFEST.MF b/ECOMP-PAP-REST/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59499bc
--- /dev/null
+++ b/ECOMP-PAP-REST/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+
diff --git a/ECOMP-PAP-REST/WebContent/README.txt b/ECOMP-PAP-REST/WebContent/README.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ECOMP-PAP-REST/WebContent/README.txt
diff --git a/ECOMP-PAP-REST/autopush.properties b/ECOMP-PAP-REST/autopush.properties
new file mode 100644
index 0000000..481c33c
--- /dev/null
+++ b/ECOMP-PAP-REST/autopush.properties
@@ -0,0 +1,22 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+default.policyType=
+default.policyScope=
diff --git a/ECOMP-PAP-REST/dictionaryItemsAPI.json b/ECOMP-PAP-REST/dictionaryItemsAPI.json
new file mode 100644
index 0000000..4a42197
--- /dev/null
+++ b/ECOMP-PAP-REST/dictionaryItemsAPI.json
@@ -0,0 +1,52 @@
+{
+	"dictionary": [{
+		"type": "commmon",
+		"dictionaries": [{
+			"name": "attribute",
+			"table": "Attribute",
+			"fields": [{
+				"name": "xacmlId"
+			}, {
+				"name": "description"
+			}, {
+				"name": "categoryBean"
+			}, {
+				"name": "datatypeBean"
+			}, {
+				"name": "priority"
+			}, {
+				"name": "attributeValue"
+			}]
+		}, {
+			"name": "ecompname",
+			"table": "EcompName",
+			"fields": [{
+				"name": "ecompName"
+			}, {
+				"name": "description"
+			}]
+		}]
+	}, {
+		"type": "action",
+		"dictionaries": [{
+			"name": "action",
+			"table": "ActionPolicyDict",
+			"fields": [{
+				"name": "type"
+			}, {
+				"name": "url"
+			}, {
+				"name": "method"
+			}, {
+				"name": "header"
+			}, {
+				"name": "body"
+			}, {
+				"name": "attributeName"
+			},	{
+				"name": "description"
+			}]
+		}]
+	}]
+
+}
diff --git a/ECOMP-PAP-REST/policyLogger.properties b/ECOMP-PAP-REST/policyLogger.properties
new file mode 100644
index 0000000..a597a7a
--- /dev/null
+++ b/ECOMP-PAP-REST/policyLogger.properties
@@ -0,0 +1,44 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+################################### Set concurrentHashMap and timer info  #######################
+#Timer initial delay and the delay between in milliseconds before task is to be execute.
+timer.delay.time=1000
+#Timer scheduleAtFixedRate period - time in milliseconds between successive task executions.
+check.interval= 30000
+#Longest time an event info can be stored in the concurrentHashMap for logging - in seconds. 
+event.expired.time=86400
+#Size of the concurrentHashMap which stores the event starting time, etc - when its size reaches this limit, the Timer gets executed 
+#to remove all expired records from this concurrentHashMap.
+concurrentHashMap.limit=5000
+#Size of the concurrentHashMap - when its size drops to this point, stop the Timer
+stop.check.point=2500
+################################### Set logging format #############################################
+# set EELF for EELF logging format, set LOG4J for using log4j, set SYSTEMOUT for using system.out.println
+logger.type=EELF
+#################################### Set level for EELF or SYSTEMOUT logging ##################################
+# Set level for debug file. Set DEBUG to enable .info, .warn and .debug; set INFO for enable .info and .warn; set OFF to disable all 
+debugLogger.level=INFO
+# Set level for metrics file. Set OFF to disable; set ON to enable
+metricsLogger.level=ON
+# Set level for error file. Set OFF to disable; set ON to enable
+error.level=ON
+# Set level for audit file. Set OFF to disable; set ON to enable
+audit.level=ON
diff --git a/ECOMP-PAP-REST/pom.xml b/ECOMP-PAP-REST/pom.xml
new file mode 100644
index 0000000..b3d4066
--- /dev/null
+++ b/ECOMP-PAP-REST/pom.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP Policy Engine
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.openecomp.policy.engine</groupId>
+	<artifactId>ECOMP-PAP-REST</artifactId>
+	<description>ECOMP-PAP-REST</description>
+	<packaging>war</packaging>
+	<parent>
+		<groupId>org.openecomp.policy.engine</groupId>
+		<artifactId>PolicyEngineSuite</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	<build>
+		<plugins>
+	 		<plugin>
+	      		<artifactId>maven-war-plugin</artifactId>
+	      		<version>2.1</version>
+	      		<configuration>
+	        		<attachClasses>true</attachClasses>
+	        		<webResources>
+	        			<webResource>
+	        				<directory>src/main/java/</directory>
+	        				<targetPath>WEB-INF/classes/</targetPath>
+	        				<includes>
+	        					<include>hibernate.cfg.xml</include>
+	        				</includes>
+	        			</webResource>
+	        		</webResources>
+	      		</configuration>
+   			</plugin>
+   			<plugin>
+   				<groupId>org.apache.maven.plugins</groupId>
+   				<artifactId>maven-compiler-plugin</artifactId>
+   				<version>3.2</version>
+   				<configuration>
+   					<source>1.8</source>
+   					<target>1.8</target>
+   				</configuration>
+   			</plugin>
+    	</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<!-- To support integrity-audit audit of BackupMonitorEntity table -->
+			<groupId>org.openecomp.policy.engine</groupId>
+			<artifactId>PolicyEngineUtils</artifactId>
+			<version>${project.version}</version>
+		</dependency>		
+		<dependency>
+			 <groupId>org.apache.commons</groupId>
+			 <artifactId>commons-lang3</artifactId>
+			 <version>3.4</version>
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.policy.engine</groupId>
+			<artifactId>ECOMP-PDP</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.policy.common</groupId>
+			<artifactId>ECOMP-Logging</artifactId>
+			<version>${common-modules.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<version>3.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-logging</groupId>
+			<artifactId>commons-logging</artifactId>
+			<version>1.1.3</version>
+			<exclusions>
+				<exclusion>
+					<groupId>javax.servlet</groupId>
+					<artifactId>servlet-api</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-compress</artifactId>
+			<version>1.8</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-fileupload</groupId>
+			<artifactId>commons-fileupload</artifactId>
+			<version>1.3.1</version>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>apache-log4j-extras</artifactId>
+			<version>1.2.17</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.4</version>
+		</dependency>
+		<dependency>
+			<groupId>io.netty</groupId>
+			<artifactId>netty</artifactId>
+			<version>3.5.0.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>14.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.3.0-rc1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.json</groupId>
+			<artifactId>json</artifactId>
+			<version>[20090211,)</version>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.jgit</groupId>
+			<artifactId>org.eclipse.jgit</artifactId>
+			<version>3.2.0.201312181205-r</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.tomcat</groupId>
+			<artifactId>tomcat-jdbc</artifactId>
+			<version>8.0.24</version>
+		</dependency>
+		<dependency>
+			<groupId>com.h2database</groupId>
+			<artifactId>h2</artifactId>
+			<version>[1.4.186,)</version>
+		</dependency>
+		<dependency>
+			<groupId>com.github.fge</groupId>
+			<artifactId>json-patch</artifactId>
+			<version>1.9</version>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.persistence</groupId>
+			<artifactId>javax.persistence</artifactId>
+			<version>2.1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse.persistence</groupId>
+			<artifactId>eclipselink</artifactId>
+			<version>2.6.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.30</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mariadb.jdbc</groupId>
+			<artifactId>mariadb-java-client</artifactId>
+			<version>1.2.3</version>
+		</dependency>		
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<version>1.9.5</version>
+		</dependency>     
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
+			<version>3.0.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-mock</artifactId>
+			<version>2.0.8</version>
+		</dependency>
+		<dependency>
+			<groupId>com.mockrunner</groupId>
+			<artifactId>mockrunner</artifactId>
+			<version>0.3.1</version>
+		</dependency>
+				<!-- Spring -->
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-tx</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-orm</artifactId>
+			<version>${springframework.version}</version>
+		</dependency>
+		<!-- Hibernate -->
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-core</artifactId>
+			<version>${hibernate.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-validator</artifactId>
+			<version>5.1.3.Final</version>
+		</dependency>
+	</dependencies>
+	<properties>
+		<springframework.version>4.2.0.RELEASE</springframework.version>
+		<hibernate.version>4.3.11.Final</hibernate.version>
+		<projectversion>2.0.2</projectversion>
+	</properties>
+</project>
diff --git a/ECOMP-PAP-REST/src/main/java/hibernate.cfg.xml b/ECOMP-PAP-REST/src/main/java/hibernate.cfg.xml
new file mode 100644
index 0000000..33f5177
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/hibernate.cfg.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP-PAP-REST
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+
+<!DOCTYPE hibernate-configuration SYSTEM
+    "classpath://org/hibernate/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+	<session-factory>
+		
+		<!-- Hibernate JPA Mapping Classes -->
+		<mapping class="org.openecomp.policy.rest.jpa.Attribute"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ActionPolicyDict"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ActionList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.AddressGroup"/>
+		<mapping class="org.openecomp.policy.rest.jpa.BRMSParamTemplate"/>
+		<mapping class="org.openecomp.policy.rest.jpa.Category"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ClosedLoopD2Services"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ClosedLoopSite"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ConstraintType"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ConstraintValue"/>
+		<mapping class="org.openecomp.policy.rest.jpa.Datatype"/>	
+		<mapping class="org.openecomp.policy.rest.jpa.DCAEuuid"/>
+		<mapping class="org.openecomp.policy.rest.jpa.DecisionSettings"/>	
+		<mapping class="org.openecomp.policy.rest.jpa.DescriptiveScope"/>
+		<mapping class="org.openecomp.policy.rest.jpa.EcompName"/>
+		<mapping class="org.openecomp.policy.rest.jpa.EnforcingType"/>
+		<mapping class="org.openecomp.policy.rest.jpa.FirewallDictionaryList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.FunctionDefinition"/>
+		<mapping class="org.openecomp.policy.rest.jpa.FunctionArgument"/>
+		<mapping class="org.openecomp.policy.rest.jpa.GroupPolicyScopeList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.GroupServiceList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.MicroServiceConfigName"/>
+		<mapping class="org.openecomp.policy.rest.jpa.MicroServiceLocation"/>
+		<mapping class="org.openecomp.policy.rest.jpa.MicroServiceModels"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PEPOptions"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PolicyScopeClosedLoop"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PolicyScopeResource"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PolicyScopeType"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PolicyScopeService"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PortList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.PREFIXLIST"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ProtocolList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.ServiceList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.SecurityZone"/>
+		<mapping class="org.openecomp.policy.rest.jpa.TermList"/>
+		<mapping class="org.openecomp.policy.rest.jpa.UserInfo"/>
+		<mapping class="org.openecomp.policy.rest.jpa.VarbindDictionary"/>
+		<mapping class="org.openecomp.policy.rest.jpa.VNFType"/>
+		<mapping class="org.openecomp.policy.rest.jpa.VSCLAction"/>
+		<mapping class="org.openecomp.policy.rest.jpa.Zone"/>
+		<mapping class="org.openecomp.policy.rest.jpa.RiskType"/>
+		<mapping class="org.openecomp.policy.rest.jpa.SafePolicyWarning"/>
+	</session-factory>
+</hibernate-configuration>
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/HibernateSession.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/HibernateSession.java
new file mode 100644
index 0000000..17babfa
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/HibernateSession.java
@@ -0,0 +1,60 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
+
+
+public class HibernateSession{
+	private static SessionFactory xacmlsessionFactory;
+
+
+	static {
+		try {
+			Configuration configuration= new Configuration();
+			configuration.setProperty("hibernate.connection.url", XACMLPapServlet.papDbUrl);
+			configuration.setProperty("hibernate.connection.username", XACMLPapServlet.papDbUser);
+			configuration.setProperty("hibernate.connection.password", XACMLPapServlet.papDbPassword);
+			configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
+			configuration.setProperty("hibernate.connection.driver_class", XACMLPapServlet.papDbDriver);	
+			configuration.setProperty("hibernate.show_sql", "false");	
+			configuration.setProperty("hibernate.connection.autocommit", "true");
+			configuration.setProperty("hibernate.c3p0.min_size", "5");
+			configuration.setProperty("hibernate.c3p0.max_size", "200");
+			configuration.setProperty("hibernate.c3p0.timeout", "3600");
+			configuration.setProperty("hibernate.c3p0.idle_test_period", "3600");
+			
+			StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
+			xacmlsessionFactory = configuration.configure("/hibernate.cfg.xml").buildSessionFactory(builder.build());
+			
+		} catch (Throwable ex) {
+			throw new ExceptionInInitializerError(ex);
+		}
+	}
+	public static Session getSessionFactory() throws HibernateException {
+		return xacmlsessionFactory.openSession();
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/WebConfig.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/WebConfig.java
new file mode 100644
index 0000000..b84049c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/WebConfig.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Base64;
+import java.util.Properties;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletRegistration;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.support.XmlWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+public class WebConfig implements WebApplicationInitializer {
+	
+	private static final Log logger	= LogFactory.getLog(WebConfig.class);
+	
+	@Override
+	public void onStartup(ServletContext container) {
+		
+		//need to get properties for userid and password on the pap to get authorization string used in URI Mapping
+		Properties prop = new Properties();
+		String propFileName = "xacml.pap.properties";
+		
+		try {
+			InputStream is = new FileInputStream(propFileName);
+			prop.load(is);
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "property file '" + propFileName + "' not found in the classpath");
+		}
+		
+		String papID = prop.getProperty("xacml.rest.pap.userid");
+		String papPass = prop.getProperty("xacml.rest.pap.password");
+		
+		String usernameAndPassword = papID+":"+papPass;		
+		String authorizationString = Base64.getEncoder().encodeToString(usernameAndPassword.getBytes());
+		
+		
+		XmlWebApplicationContext appContext = new XmlWebApplicationContext();
+		appContext.setConfigLocation("classpath:spring.xml");
+		
+		System.out.println("Spring XML File Location: " + appContext.getConfigLocations());
+		logger.info("Spring XML File Location: " + appContext.getConfigLocations());
+
+		ServletRegistration.Dynamic dispatcher =
+				container.addServlet("dispatcher", new DispatcherServlet(appContext));
+		dispatcher.setLoadOnStartup(1);
+		dispatcher.addMapping("/@Auth@"+authorizationString+"/ecomp/*");
+	}
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServlet.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServlet.java
new file mode 100644
index 0000000..efc7070
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServlet.java
@@ -0,0 +1,4858 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.ConnectException;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.net.UnknownHostException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+import javax.persistence.EntityManagerFactory;
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.components.ActionPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.AutoPushPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.ClosedLoopPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.ConfigPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.CreateBrmsParamPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.CreateBrmsRawPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.CreateClosedLoopPerformanceMetrics;
+import org.openecomp.policy.pap.xacml.rest.components.CreateNewMicroSerivceModel;
+import org.openecomp.policy.pap.xacml.rest.components.DecisionPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.FirewallConfigPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.MicroServiceConfigPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.Policy;
+import org.openecomp.policy.pap.xacml.rest.components.PolicyDBDao;
+import org.openecomp.policy.pap.xacml.rest.components.PolicyDBDaoTransaction;
+import org.openecomp.policy.pap.xacml.rest.model.RemoveGroupPolicy;
+import org.openecomp.policy.pap.xacml.rest.util.JPAUtils;
+import org.openecomp.policy.pap.xacml.restAuth.CheckPDP;
+import org.openecomp.policy.rest.XACMLRest;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.BRMSParamTemplate;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.openecomp.policy.rest.jpa.PolicyEditorScopes;
+import org.openecomp.policy.rest.jpa.PolicyScore;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.persistence.PersistenceException;
+
+import org.openecomp.policy.common.logging.ECOMPLoggingContext;
+import org.openecomp.policy.common.logging.ECOMPLoggingUtils;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.api.pap.ECOMPPapEngineFactory;
+import org.openecomp.policy.xacml.api.pap.EcompPDP;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.api.pap.PAPPolicyEngine;
+
+import com.att.research.xacml.api.pap.PAPException;
+//import com.att.research.xacml.api.pap.PDP;
+//import com.att.research.xacml.api.pap.PDPGroup;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import com.att.research.xacml.api.pap.PDPStatus;
+import org.openecomp.policy.xacml.std.pap.StdPAPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDP;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPStatus;
+import org.openecomp.policy.xacml.std.pap.StdPDPItemSetChangeNotifier.StdItemSetChangeListener;
+import org.openecomp.policy.xacml.util.XACMLPolicyScanner;
+
+import com.att.research.xacml.util.FactoryException;
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import org.openecomp.policy.common.im.AdministrativeStateException;
+import org.openecomp.policy.common.im.ForwardProgressException;
+
+//IntegrityMontitor
+import org.openecomp.policy.common.im.IntegrityMonitor;
+import org.openecomp.policy.common.im.IntegrityMonitorProperties;
+import org.openecomp.policy.common.im.StandbyStatusException;
+//IntegrityAudit
+import org.openecomp.policy.common.ia.IntegrityAudit;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+
+/**
+ * Servlet implementation class XacmlPapServlet
+ * 
+ * 
+ */
+@WebServlet(
+		description = "Implements the XACML PAP RESTful API.", 
+		urlPatterns = { "/" }, 
+		loadOnStartup=1,
+		initParams = {
+				@WebInitParam(name = "XACML_PROPERTIES_NAME", value = "xacml.pap.properties", description = "The location of the properties file holding configuration information.")
+		})
+
+public class XACMLPapServlet extends HttpServlet implements StdItemSetChangeListener, Runnable {
+	private static final long serialVersionUID = 1L;
+	private static final Logger logger	= FlexLogger.getLogger(XACMLPapServlet.class);
+
+	private static String CONFIG_HOME = getConfigHome();
+	private static String ACTION_HOME = getActionHome();
+
+	// audit (transaction) logger
+	private static final Logger auditLogger = FlexLogger.getLogger("auditLogger");
+
+	private IntegrityMonitor im;
+	private IntegrityAudit ia;
+
+	/*
+	 * 
+	 * papEngine - This is our engine workhorse that manages the PDP Groups and Nodes.
+	 */
+	private PAPPolicyEngine papEngine = null;
+	/*
+	 * This PAP instance's own URL.
+	 * 
+	 * Need this when creating URLs to send to the PDPs so they can GET the Policy files from this process. 
+	 */
+	private static String papURL = null;
+
+	/*
+	 * These are the parameters needed for DB access from the PAP
+	 */
+	public static String papDbDriver = null;
+	public static String papDbUrl = null;
+	public static String papDbUser = null;
+	public static String papDbPassword = null;
+	private static Integer papTransWait = null;
+	private static Integer papTransTimeout = null;
+	private static Integer papAuditTimeout = null;
+	private static Boolean papAuditFlag = null;
+	private static Boolean papFileSystemAudit = null;
+	private static Boolean autoPushFlag = false;
+	private static String papResourceName = null;
+	private static Integer fpMonitorInterval = null; 
+	private static Integer failedCounterThreshold = null;
+	private static Integer testTransInterval = null;
+	private static Integer writeFpcInterval = null;
+	private static String papSiteName=null;
+	private static String papNodeType=null;	
+	private static String papDependencyGroups = null;
+	private String storedRequestId = null;
+	private static int papIntegrityAuditPeriodSeconds = -1;
+	private static String[] papDependencyGroupsFlatArray = null;
+
+	//The entity manager factory for JPA access
+	private EntityManagerFactory emf;
+
+	//Persistence Unit for JPA 
+	private static final String PERSISTENCE_UNIT = "XACML-PAP-REST";
+	private static final String AUDIT_PAP_PERSISTENCE_UNIT = "auditPapPU";
+
+
+	/*
+	 * List of Admin Console URLs.
+	 * Used to send notifications when configuration changes.
+	 * 
+	 * The CopyOnWriteArrayList *should* protect from concurrency errors.
+	 * This list is seldom changed but often read, so the costs of this approach make sense.
+	 */
+	private static final CopyOnWriteArrayList<String> adminConsoleURLStringList = new CopyOnWriteArrayList<String>();
+
+	// Mike M 11/24 Client Headers. 
+	private static final String ENVIRONMENT_HEADER = "Environment";
+	private static String environment = null;
+
+	/*
+	 * This thread may be invoked upon startup to initiate sending PDP policy/pip configuration when
+	 * this servlet starts. Its configurable by the admin.
+	 */
+	private Thread initiateThread = null;
+
+	/*
+	// The heartbeat thread.
+	 */
+	private static Heartbeat heartbeat = null;
+	private static Thread heartbeatThread = null;
+
+	private ECOMPLoggingContext baseLoggingContext = null;
+
+	private PolicyDBDao policyDBDao;
+	private AutoPushPolicy autoPushPolicy;
+	/**
+	 * @see HttpServlet#HttpServlet()
+	 */
+	public XACMLPapServlet() {
+		super();
+	}
+	/*
+	 * PDP FIle
+	 */
+	private static String pdpFile = null;
+	public static String getPDPFile(){
+		return XACMLPapServlet.pdpFile;
+	}
+
+	/**
+	 * @see Servlet#init(ServletConfig)
+	 */
+	public void init(ServletConfig config) throws ServletException {
+
+
+		try {
+			//
+			// Logging stuff....
+			//
+			baseLoggingContext = new ECOMPLoggingContext();
+			// fixed data that will be the same in all logging output goes here
+			try {
+				String hostname = InetAddress.getLocalHost().getCanonicalHostName();
+				baseLoggingContext.setServer(hostname);
+			} catch (UnknownHostException e) {
+				logger.warn(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Unable to get hostname for logging");
+			}
+
+			//
+			// Initialize
+			//
+			XACMLRest.xacmlInit(config);
+			//
+			// Load the properties
+			//
+			XACMLRest.loadXacmlProperties(null, null);
+
+			/*
+			 * Retrieve the property values for db access and audits from the xacml.pap.properties
+			 */
+			//Null string occurs when a property is not present
+			try{
+				papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+				if(papDbDriver == null){
+					throw new PAPException("papDbDriver is null");
+				}
+			}
+			catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+			try{
+				papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+				if(papDbUrl == null){
+					throw new PAPException("papDbUrl is null");
+				}
+			} catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+			try{
+				papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+				if(papDbUser == null){
+					throw new PAPException("papDbUser is null");
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+			try{
+				papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+				if(papDbPassword == null){
+					throw new PAPException("papDbPassword is null");
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+
+			environment = XACMLProperties.getProperty("ENVIRONMENT", "DEVL");
+
+			//Integer will throw an exception of anything is missing or unrecognized
+			papTransWait = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT));
+			papTransTimeout = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT));
+			papAuditTimeout = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_AUDIT_TIMEOUT));
+
+			//Boolean will default to false if anything is missing or unrecognized
+			papAuditFlag = Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_RUN_AUDIT_FLAG));
+			papFileSystemAudit = Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_AUDIT_FLAG));
+
+			//PAP Auto Push 
+			autoPushFlag = Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PUSH_FLAG));
+			// if Auto push then Load with properties. 
+			if(autoPushFlag){
+				String file;
+				try{
+					file = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PUSH_FILE);
+					if(file.endsWith(".properties")){
+						autoPushPolicy = new AutoPushPolicy(file);
+					}else{
+						throw new Exception();
+					}
+				}catch(Exception e){
+					PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Missing property or not a proper property file check for: " + XACMLRestProperties.PROP_PAP_PUSH_FILE );  
+					logger.info("Overriding the autoPushFlag to False...");
+					autoPushFlag = false;
+				}
+			}
+
+			try{
+				papResourceName = XACMLProperties.getProperty(XACMLRestProperties.PAP_RESOURCE_NAME);
+				if(papResourceName == null){
+					throw new PAPException("papResourceName is null");
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+
+			try{
+				papSiteName = XACMLProperties.getProperty(XACMLRestProperties.PAP_SITE_NAME);
+				if(papSiteName == null){
+					throw new PAPException("papSiteName is null");
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+			try{
+				papNodeType = XACMLProperties.getProperty(XACMLRestProperties.PAP_NODE_TYPE);
+				if(papNodeType == null){
+					throw new PAPException("papNodeType is null");
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+			try{
+				papDependencyGroups = XACMLProperties.getProperty(XACMLRestProperties.PAP_DEPENDENCY_GROUPS);
+				if(papDependencyGroups == null){
+					throw new PAPException("papDependencyGroups is null");
+				}
+				//Now we have flattened the array into a simple comma-separated list
+				papDependencyGroupsFlatArray = papDependencyGroups.split("[;,]");
+
+				//clean up the entries
+				for (int i = 0 ; i < papDependencyGroupsFlatArray.length ; i ++){
+					papDependencyGroupsFlatArray[i] = papDependencyGroupsFlatArray[i].trim();
+				}
+				try{
+					if(XACMLProperties.getProperty(XACMLRestProperties.PAP_INTEGRITY_AUDIT_PERIOD_SECONDS) != null){
+						papIntegrityAuditPeriodSeconds = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PAP_INTEGRITY_AUDIT_PERIOD_SECONDS).trim());
+					}else{
+						//nothing to do.  The parameter is optional
+					}
+				}catch(Exception e){
+					String msg = "integrity_audit_period_seconds ";
+					logger.error("\n\nERROR: " + msg + "Bad property entry: " + e.getMessage() + "\n");
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: " + msg +"Bad property entry");
+					throw e;
+				}
+			}catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR: Bad property entry");
+				throw e;
+			}
+
+			//Integer will throw an exception of anything is missing or unrecognized
+			fpMonitorInterval = Integer.parseInt(XACMLProperties.getProperty(IntegrityMonitorProperties.FP_MONITOR_INTERVAL));
+			failedCounterThreshold = Integer.parseInt(XACMLProperties.getProperty(IntegrityMonitorProperties.FAILED_COUNTER_THRESHOLD));
+			testTransInterval = Integer.parseInt(XACMLProperties.getProperty(IntegrityMonitorProperties.TEST_TRANS_INTERVAL));
+			writeFpcInterval = Integer.parseInt(XACMLProperties.getProperty(IntegrityMonitorProperties.WRITE_FPC_INTERVAL));
+
+			logger.debug("\n\n\n**************************************"
+					+ "\n**************************************"
+					+ "\n"
+					+ "\n   papDbDriver = " + papDbDriver
+					+ "\n   papDbUrl = " + papDbUrl
+					+ "\n   papDbUser = " + papDbUser
+					+ "\n   papDbPassword = " + papDbPassword
+					+ "\n   papTransWait = " + papTransWait
+					+ "\n   papTransTimeout = " + papTransTimeout
+					+ "\n   papAuditTimeout = " + papAuditTimeout
+					+ "\n   papAuditFlag = " + papAuditFlag
+					+ "\n   papFileSystemAudit = " + papFileSystemAudit
+					+ "\n	autoPushFlag = " + autoPushFlag
+					+ "\n	papResourceName = " + papResourceName
+					+ "\n	fpMonitorInterval = " + fpMonitorInterval
+					+ "\n	failedCounterThreshold = " + failedCounterThreshold
+					+ "\n	testTransInterval = " + testTransInterval
+					+ "\n	writeFpcInterval = " + writeFpcInterval
+					+ "\n	papSiteName = " + papSiteName
+					+ "\n	papNodeType = " + papNodeType
+					+ "\n	papDependencyGroupsList = " + papDependencyGroups
+					+ "\n   papIntegrityAuditPeriodSeconds = " + papIntegrityAuditPeriodSeconds
+					+ "\n\n**************************************"
+					+ "\n**************************************");
+
+			//
+			// Pull custom persistence settings
+			//
+
+			Properties properties;
+			try {
+				properties = XACMLProperties.getProperties();//XACMLRestProperties.getProperties();
+				logger.debug("\n\n\n**************************************"
+						+ "\n**************************************"
+						+ "\n\n"
+						+ "properties = " + properties
+						+ "\n\n**************************************");
+
+			} catch (IOException e) {
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "XACMLPapServlet", " Error loading properties with: "
+						+ "XACMLProperties.getProperties()");
+				throw new ServletException(e.getMessage(), e.getCause());
+			}
+
+			// Create an IntegrityMonitor
+			im = IntegrityMonitor.getInstance(papResourceName,properties);
+
+			// Create an IntegrityAudit
+			ia = new IntegrityAudit(papResourceName, AUDIT_PAP_PERSISTENCE_UNIT, properties);
+			ia.startAuditThread();
+
+			//
+			// Create the entity manager factory
+			//
+			emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT, properties);
+			//
+			// Did it get created?
+			//
+			if (emf == null) {
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Error creating entity manager factory with persistence unit: "
+						+ PERSISTENCE_UNIT);
+				throw new ServletException("Unable to create Entity Manager Factory");
+			}
+			//
+			// we are about to call the PDPs and give them their configuration.
+			// To do that we need to have the URL of this PAP so we can construct the Policy file URLs
+			//
+			XACMLPapServlet.papURL = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
+			/*
+			 * Create the PolicyDBDao singleton
+			 */		
+			//Create the policyDBDao
+			policyDBDao = PolicyDBDao.getPolicyDBDaoInstance(getEmf());
+			boolean performFileToDatabaseAudit = false;
+			if (Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_RUN_AUDIT_FLAG))){
+				if (Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_AUDIT_FLAG))){
+					//get an AuditTransaction to lock out all other transactions
+					PolicyDBDaoTransaction auditTrans = policyDBDao.getNewAuditTransaction();
+					policyDBDao.auditLocalFileSystem();
+					//release the transaction lock
+					auditTrans.close();
+				}else{
+					performFileToDatabaseAudit = true;					
+				}
+			}
+
+
+
+			//
+			// Load our PAP engine, first create a factory
+			//
+			ECOMPPapEngineFactory factory = ECOMPPapEngineFactory.newInstance(XACMLProperties.getProperty(XACMLProperties.PROP_PAP_PAPENGINEFACTORY));
+			//
+			// The factory knows how to go about creating a PAP Engine
+			//
+			this.papEngine = (PAPPolicyEngine) factory.newEngine();
+			PolicyDBDaoTransaction addNewGroup = null;
+			try{
+
+				if(((org.openecomp.policy.xacml.std.pap.StdEngine)papEngine).wasDefaultGroupJustAdded){
+					addNewGroup = policyDBDao.getNewTransaction();
+					EcompPDPGroup group = papEngine.getDefaultGroup();
+					addNewGroup.createGroup(group.getId(), group.getName(), group.getDescription(), "automaticallyAdded");
+					addNewGroup.commitTransaction();
+					addNewGroup = policyDBDao.getNewTransaction();					
+					addNewGroup.changeDefaultGroup(group, "automaticallyAdded");
+					addNewGroup.commitTransaction();				
+				}
+
+			} catch(Exception e){
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " Error creating new default group in the database");
+				if(addNewGroup != null){
+					addNewGroup.rollbackTransaction();
+				}
+			}
+
+			policyDBDao.setPapEngine((PAPPolicyEngine) this.papEngine);
+
+
+			if(performFileToDatabaseAudit){
+				//get an AuditTransaction to lock out all other transactions
+				PolicyDBDaoTransaction auditTrans = policyDBDao.getNewAuditTransaction();
+				policyDBDao.auditLocalDatabase((PAPPolicyEngine) this.papEngine);
+				//release the transaction lock
+				auditTrans.close();
+			}
+
+			//
+			// PDPId File location 
+			//
+			XACMLPapServlet.pdpFile = XACMLProperties.getProperty(XACMLRestProperties.PROP_PDP_IDFILE);
+			if (XACMLPapServlet.pdpFile == null) {
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + 
+						" The PDP Id Authentication File Property is not valid: "
+						+ XACMLRestProperties.PROP_PDP_IDFILE);
+				throw new PAPException("The PDP Id Authentication File Property :"+ XACMLRestProperties.PROP_PDP_IDFILE+ " is not Valid. ");
+			}
+			//
+			// Sanity check that a URL was defined somewhere, its essential.
+			//
+			// How to check that its valid? We can validate the form, but since we are in the init() method we
+			// are not fully loaded yet so we really couldn't ping ourself to see if the URL will work. One
+			// will have to look for errors in the PDP logs to determine if they are failing to initiate a
+			// request to this servlet.
+			//
+			if (XACMLPapServlet.papURL == null) {
+
+				throw new PAPException("The property " + XACMLRestProperties.PROP_PAP_URL + " is not valid: " + XACMLPapServlet.papURL);
+			}
+			//
+			// Configurable - have the PAP servlet initiate sending the latest PDP policy/pip configuration
+			// to all its known PDP nodes.
+			//
+			// Note: parseBoolean will return false if there is no property defined. This is fine for a default.
+			//
+			if (Boolean.parseBoolean(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_INITIATE_PDP_CONFIG))) {
+				this.initiateThread = new Thread(this);
+				this.initiateThread.start();
+			}
+			//
+			// After startup, the PAP does Heartbeats to each of the PDPs periodically
+			//
+			XACMLPapServlet.heartbeat = new Heartbeat((PAPPolicyEngine) this.papEngine);
+			XACMLPapServlet.heartbeatThread = new Thread(XACMLPapServlet.heartbeat);
+			XACMLPapServlet.heartbeatThread.start();
+		} catch (FactoryException | PAPException e) {
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Failed to create engine");
+			throw new ServletException (XACMLErrorConstants.ERROR_SYSTEM_ERROR + "PAP not initialized; error: "+e);
+		} catch (Exception e) {
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Failed to create engine - unexpected error");
+			throw new ServletException (XACMLErrorConstants.ERROR_SYSTEM_ERROR + "PAP not initialized; unexpected error: "+e);		}
+	}
+
+	/**
+	 * Thread used only during PAP startup to initiate change messages to all known PDPs.
+	 * This must be on a separate thread so that any GET requests from the PDPs during this update can be serviced.
+	 */
+	@Override
+	public void run() {
+		//
+		// send the current configuration to all the PDPs that we know about
+		//
+		changed();
+	}
+
+
+	/**
+	 * @see Servlet#destroy()
+	 * 
+	 * Depending on how this servlet is run, we may or may not care about cleaning up the resources.
+	 * For now we assume that we do care.
+	 */
+	public void destroy() {
+		//
+		// Make sure our threads are destroyed
+		//
+		if (XACMLPapServlet.heartbeatThread != null) {
+			//
+			// stop the heartbeat
+			//
+			try {
+				if (XACMLPapServlet.heartbeat != null) {
+					XACMLPapServlet.heartbeat.terminate();
+				}
+				XACMLPapServlet.heartbeatThread.interrupt();
+				XACMLPapServlet.heartbeatThread.join();
+			} catch (InterruptedException e) {
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Error stopping heartbeat");
+			}
+		}
+		if (this.initiateThread != null) {
+			try {
+				this.initiateThread.interrupt();
+				this.initiateThread.join();
+			} catch (InterruptedException e) {
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Error stopping thread");
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * Called by:
+	 * 	- PDP nodes to register themselves with the PAP, and
+	 * 	- Admin Console to make changes in the PDP Groups.
+	 * 
+	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		ECOMPLoggingContext loggingContext = ECOMPLoggingUtils.getLoggingContextForRequest(request, baseLoggingContext);
+
+		loggingContext.transactionStarted();
+		loggingContext.setServiceName("PAP.post"); // we may set a more specific value later
+		if ((loggingContext.getRequestID() == null) || (loggingContext.getRequestID() == "")){
+			UUID requestID = UUID.randomUUID();
+			loggingContext.setRequestID(requestID.toString());
+			PolicyLogger.info("requestID not provided in call to XACMLPapSrvlet (doPost) so we generated one");
+		} else {
+			PolicyLogger.info("requestID was provided in call to XACMLPapSrvlet (doPost)");
+		}
+		// dummy metric.log example posted below as proof of concept
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 1 of 2");
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 2 of 2");
+		// dummy metric.log example posted above as proof of concept
+		PolicyDBDaoTransaction pdpTransaction = null;
+
+		//This im.startTransaction() covers all Post transactions
+		try {
+			im.startTransaction();
+		} catch (AdministrativeStateException ae){
+			String message = "POST interface called for PAP " + papResourceName + " but it has an Administrative"
+					+ " state of " + im.getStateManager().getAdminState()
+					+ "\n Exception Message: " + ae.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}catch (StandbyStatusException se) {
+			se.printStackTrace();
+			String message = "POST interface called for PAP " + papResourceName + " but it has a Standby Status"
+					+ " of " + im.getStateManager().getStandbyStatus()
+					+ "\n Exception Message: " + se.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}
+
+		try {
+
+			XACMLRest.dumpRequest(request);
+
+			// since getParameter reads the content string, explicitly get the content before doing that.
+			// Simply getting the inputStream seems to protect it against being consumed by getParameter.
+			request.getInputStream();
+
+
+			String groupId = request.getParameter("groupId");
+			String apiflag = request.getParameter("apiflag");
+
+			if (groupId != null) {
+				// Is this from the Admin Console or API?
+				if(apiflag!=null) {
+					if (apiflag.equalsIgnoreCase("api")) {
+						// this is from the API so we need to check the client credentials before processing the request
+						if(authorizeRequest(request)){
+							doACPost(request, response, groupId, loggingContext);
+							// Mike B - ended loggingContext transacton & added EELF 'Success' EELF Audit.log message
+							loggingContext.transactionEnded();
+							PolicyLogger.audit("Transaction Ended Successfully");
+							im.endTransaction();
+							return;
+						} else {
+							String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+							PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+							loggingContext.transactionEnded();
+
+							PolicyLogger.audit("Transaction Failed - See Error.log");
+
+							response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+							im.endTransaction();
+							return;
+						}
+					}
+				}
+
+				// this is from the Admin Console, so handle separately
+				doACPost(request, response, groupId, loggingContext);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Ended Successfully");
+				im.endTransaction();
+				return;
+
+			}
+
+
+			//
+			//  Request is from a PDP.
+			//	It is coming up and asking for its config
+			//
+			loggingContext.setServiceName("PDP:PAP.register");
+
+
+			//
+			// Get the PDP's ID
+			//
+			String id = this.getPDPID(request);
+			String jmxport = this.getPDPJMX(request);
+			//logger.info("doPost from: " + id);
+			logger.info("Request(doPost) from PDP coming up: " + id);
+			//
+			// Get the PDP Object
+			//
+			EcompPDP pdp = this.papEngine.getPDP(id);
+			//
+			// Is it known?
+			//
+			if (pdp == null) {
+				logger.info("Unknown PDP: " + id);
+				// PDP ID Check is performed Here. 
+				if(CheckPDP.validateID(id)){
+					pdpTransaction = policyDBDao.getNewTransaction();
+					try {
+						//this.papEngine.newPDP(id, this.papEngine.getDefaultGroup(), id, "Registered on first startup");
+						pdpTransaction.addPdpToGroup(id, this.papEngine.getDefaultGroup().getId(), id, "Registered on first startup", Integer.parseInt(jmxport), "PDP autoregister");
+						this.papEngine.newPDP(id, this.papEngine.getDefaultGroup(), id, "Registered on first startup", Integer.parseInt(jmxport));
+					} catch (NullPointerException | PAPException | IllegalArgumentException | IllegalStateException | PersistenceException e) {
+						pdpTransaction.rollbackTransaction();
+						String message = "Failed to create new PDP for id: " + id;
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " " + message);
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+						im.endTransaction();
+						return;
+					}
+					// get the PDP we just created
+					pdp = this.papEngine.getPDP(id);
+					if (pdp == null) {
+						if(pdpTransaction != null){
+							pdpTransaction.rollbackTransaction();
+						}
+						String message = "Failed to create new PDP for id: " + id;
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+						im.endTransaction();
+						return;
+					}
+				} else {
+					String message = "PDP is Unauthorized to Connect to PAP: "+ id;
+					PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+					loggingContext.transactionEnded();
+					response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "PDP not Authorized to connect to this PAP. Please contact the PAP Admin for registration.");
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					im.endTransaction();
+					return;
+				}
+				// get the PDP we just created
+				pdp = this.papEngine.getPDP(id);
+				if (pdp == null) {
+					if(pdpTransaction != null){
+						pdpTransaction.rollbackTransaction();
+					}
+					String message = "Failed to create new PDP for id: " + id;
+					PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+					loggingContext.transactionEnded();
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+					im.endTransaction();
+					return;
+				}
+				try{
+					pdpTransaction.commitTransaction();
+				} catch(Exception e){
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", "Could not commit transaction to put pdp in the database");
+				}
+			}
+
+			if (jmxport != null && jmxport != ""){
+				((StdPDP) pdp).setJmxPort(Integer.valueOf(jmxport));
+			}
+
+			//
+			// Get the PDP's Group
+			//
+			EcompPDPGroup group = this.papEngine.getPDPGroup((EcompPDP) pdp);
+			if (group == null) {
+				PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " PDP not associated with any group, even the default");
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "PDP not associated with any group, even the default");
+				im.endTransaction();
+				return;
+			}
+			//
+			// Determine what group the PDP node is in and get
+			// its policy/pip properties.
+			//
+			Properties policies = group.getPolicyProperties();
+			Properties pipconfig = group.getPipConfigProperties();
+			//
+			// Get the current policy/pip configuration that the PDP has
+			//
+			Properties pdpProperties = new Properties();
+			pdpProperties.load(request.getInputStream());
+			logger.info("PDP Current Properties: " + pdpProperties.toString());
+			logger.info("Policies: " + (policies != null ? policies.toString() : "null"));
+			logger.info("Pip config: " + (pipconfig != null ? pipconfig.toString() : "null"));
+			//
+			// Validate the node's properties
+			//
+			boolean isCurrent = this.isPDPCurrent(policies, pipconfig, pdpProperties);
+			//
+			// Send back current configuration
+			//
+			if (isCurrent == false) {
+				//
+				// Tell the PDP we are sending back the current policies/pip config
+				//
+				logger.info("PDP configuration NOT current.");
+				if (policies != null) {
+					//
+					// Put URL's into the properties in case the PDP needs to
+					// retrieve them.
+					//
+					this.populatePolicyURL(request.getRequestURL(), policies);
+					//
+					// Copy the properties to the output stream
+					//
+					policies.store(response.getOutputStream(), "");
+				}
+				if (pipconfig != null) {
+					//
+					// Copy the properties to the output stream
+					//
+					pipconfig.store(response.getOutputStream(), "");
+				}
+				//
+				// We are good - and we are sending them information
+				//
+				response.setStatus(HttpServletResponse.SC_OK);
+
+				setPDPSummaryStatus(pdp, PDPStatus.Status.OUT_OF_SYNCH);
+			} else {
+				//
+				// Tell them they are good
+				//
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+
+				setPDPSummaryStatus(pdp, PDPStatus.Status.UP_TO_DATE);
+
+			}
+			//
+			// tell the AC that something changed
+			//
+			notifyAC();
+			loggingContext.transactionEnded();
+			auditLogger.info("Success");
+			PolicyLogger.audit("Transaction Ended Successfully");
+		} catch (PAPException e) {
+			if(pdpTransaction != null){
+				pdpTransaction.rollbackTransaction();
+			}
+			logger.debug(XACMLErrorConstants.ERROR_PROCESS_FLOW + "POST exception: " + e, e);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response.sendError(500, e.getMessage());
+			im.endTransaction();
+			return;
+		}
+		//Catch anything that fell through
+		loggingContext.transactionEnded();
+		PolicyLogger.audit("Transaction Ended");
+		im.endTransaction();
+	}
+
+	/**
+	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		ECOMPLoggingContext loggingContext = ECOMPLoggingUtils.getLoggingContextForRequest(request, baseLoggingContext);
+		loggingContext.transactionStarted();
+		loggingContext.setServiceName("PAP.get"); // we may set a more specific value later
+		if ((loggingContext.getRequestID() == null) || (loggingContext.getRequestID() == "")){
+			UUID requestID = UUID.randomUUID();
+			loggingContext.setRequestID(requestID.toString());
+			PolicyLogger.info("requestID not provided in call to XACMLPapSrvlet (doGet) so we generated one");
+		} else {
+			PolicyLogger.info("requestID was provided in call to XACMLPapSrvlet (doGet)");
+		}
+		// dummy metric.log example posted below as proof of concept
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 1 of 2");
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 2 of 2");
+		// dummy metric.log example posted above as proof of concept
+		try {
+			XACMLRest.dumpRequest(request);
+			String pathInfo = request.getRequestURI();
+			logger.info("path info: " + pathInfo);
+			if (pathInfo != null){
+				//DO NOT do a im.startTransaction for the test request
+				if (pathInfo.equals("/pap/test")) {
+					logger.info("Test request received");
+					try {
+						im.evaluateSanity();
+						//If we make it this far, all is well
+						String message = "GET:/pap/test called and PAP " + papResourceName + " is OK";
+						logger.info(message);
+						loggingContext.transactionEnded();
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.setStatus(HttpServletResponse.SC_OK);
+						return;
+					}catch (ForwardProgressException fpe){
+						//No forward progress is being made
+						String message = "GET:/pap/test called and PAP " + papResourceName + " is not making forward progress."
+								+ " Exception Message: " + fpe.getMessage();
+						logger.info(message);
+						PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+						return;
+					}catch (AdministrativeStateException ase){
+						//Administrative State is locked
+						String message = "GET:/pap/test called and PAP " + papResourceName + " Administrative State is LOCKED "
+								+ " Exception Message: " + ase.getMessage();
+						logger.info(message);
+						PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+						return;
+					}catch (StandbyStatusException sse){
+						//Administrative State is locked
+						String message = "GET:/pap/test called and PAP " + papResourceName + " Standby Status is NOT PROVIDING SERVICE "
+								+ " Exception Message: " + sse.getMessage();
+						logger.info(message);
+						PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+						return;
+					}catch (Exception e) {
+						//A subsystem is not making progress, is locked, standby or is not responding
+						String eMsg = e.getMessage();
+						if(eMsg == null){
+							eMsg = "No Exception Message";
+						}
+						String message = "GET:/pap/test called and PAP " + papResourceName + " has had a subsystem failure."
+								+ " Exception Message: " + eMsg;
+						logger.info(message);
+						PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						//Get the specific list of subsystems that failed
+						String ssFailureList = null;
+						for(String failedSS : papDependencyGroupsFlatArray){
+							if(eMsg.contains(failedSS)){
+								if(ssFailureList == null){
+									ssFailureList = failedSS;
+								}else{
+									ssFailureList = ssFailureList.concat(","+failedSS);
+								}
+							}
+						}
+						if(ssFailureList == null){
+							ssFailureList = "UnknownSubSystem";
+						}
+						response.addHeader("X-ECOMP-SubsystemFailure", ssFailureList);
+						response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+						return;
+					}
+				}
+			}
+
+			//This im.startTransaction() covers all other Get transactions
+			try {
+				im.startTransaction();
+			} catch (AdministrativeStateException ae){
+				String message = "GET interface called for PAP " + papResourceName + " but it has an Administrative"
+						+ " state of " + im.getStateManager().getAdminState()
+						+ "\n Exception Message: " + ae.getMessage();
+				logger.info(message);
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+				return;
+			}catch (StandbyStatusException se) {
+				se.printStackTrace();
+				String message = "GET interface called for PAP " + papResourceName + " but it has a Standby Status"
+						+ " of " + im.getStateManager().getStandbyStatus()
+						+ "\n Exception Message: " + se.getMessage();
+				logger.info(message);
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+				return;
+			}
+
+
+			// Request from the API to get the gitPath
+			String apiflag = request.getParameter("apiflag");
+			if (apiflag!=null) {
+				if(authorizeRequest(request)){
+
+
+					// Request from the API to get the gitPath
+					if (apiflag.equalsIgnoreCase("gitPath")) {
+						getGitPath(request, response);
+						// Mike B - ended loggingContext transacton & added EELF 'Success' EELF Audit.log message
+						loggingContext.transactionEnded();
+						PolicyLogger.audit("Transaction Ended Successfully");
+						im.endTransaction();
+						return;
+					}
+
+					// Request from the API to get the ActiveVersion from the PolicyVersion table
+					if (apiflag.equalsIgnoreCase("version")){
+						getActiveVersion(request, response);
+						loggingContext.transactionEnded();
+						PolicyLogger.audit("Transaction Ended Successfully");
+						im.endTransaction();
+						return;
+					}
+
+					// Request from the API to get the URI from the gitpath
+					if (apiflag.equalsIgnoreCase("uri")){
+						getSelectedURI(request, response);
+						loggingContext.transactionEnded();
+						PolicyLogger.audit("Transaction Ended Successfully");
+						im.endTransaction();
+						return;
+					}
+
+				} else {
+					String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+					PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+					im.endTransaction();
+					return;
+				}
+
+			}
+
+
+			// Is this from the Admin Console?
+			String groupId = request.getParameter("groupId");
+			if (groupId != null) {
+				// this is from the Admin Console, so handle separately
+				doACGet(request, response, groupId, loggingContext);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Ended Successfully");
+				im.endTransaction();
+				return;
+			}
+
+			//
+			// Get the PDP's ID
+			//
+			String id = this.getPDPID(request);
+			logger.info("doGet from: " + id);
+			//
+			// Get the PDP Object
+			//
+			EcompPDP pdp = this.papEngine.getPDP(id);
+			//
+			// Is it known?
+			//
+			if (pdp == null) {
+				//
+				// Check if request came from localhost
+				//
+				if (request.getRemoteHost().equals("localhost") ||
+						request.getRemoteHost().equals("127.0.0.1") ||
+						request.getRemoteHost().equals(request.getLocalAddr())) {
+					//
+					// Return status information - basically all the groups
+					//
+					loggingContext.setServiceName("PAP.getGroups");
+					Set<EcompPDPGroup> groups = papEngine.getEcompPDPGroups();
+
+					// convert response object to JSON and include in the response
+					ObjectMapper mapper = new ObjectMapper();
+					mapper.writeValue(response.getOutputStream(),  groups);
+					response.setHeader("content-type", "application/json");
+					response.setStatus(HttpServletResponse.SC_OK);
+					loggingContext.transactionEnded();
+					PolicyLogger.audit("Transaction Ended Successfully");
+					im.endTransaction();
+					return;
+				}
+				String message = "Unknown PDP: " + id + " from " + request.getRemoteHost() + " us: " + request.getLocalAddr();
+				PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED, message);
+				im.endTransaction();
+				return;
+			}
+
+			loggingContext.setServiceName("PAP.getPolicy");
+
+			//
+			// Get the PDP's Group
+			//
+			EcompPDPGroup group = this.papEngine.getPDPGroup((EcompPDP) pdp);
+			if (group == null) {
+				String message = "No group associated with pdp " + pdp.getId();
+				logger.warn(XACMLErrorConstants.ERROR_PERMISSIONS + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_UNAUTHORIZED, message);
+				im.endTransaction();
+				return;
+			}
+			//
+			// Which policy do they want?
+			//
+			String policyId = request.getParameter("id");
+			if (policyId == null) {
+				String message = "Did not specify an id for the policy";
+				logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+				im.endTransaction();
+				return;
+			}
+			PDPPolicy policy = group.getPolicy(policyId);
+			if (policy == null) {
+				String message = "Unknown policy: " + policyId;
+				logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+				im.endTransaction();
+				return;
+			}
+			//
+			// Get its stream
+			//
+			logger.warn("PolicyDebugging: Policy Validity: " + policy.isValid() + "\n "
+					+ "Policy Name : " + policy.getName() + "\n Policy URI: " + policy.getLocation().toString() );
+			try (InputStream is = policy.getStream(); OutputStream os = response.getOutputStream()) {
+				//
+				// Send the policy back
+				//
+				IOUtils.copy(is, os);
+
+				response.setStatus(HttpServletResponse.SC_OK);
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+			} catch (PAPException e) {
+				String message = "Failed to open policy id " + policyId;
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+			}
+		}  catch (PAPException e) {
+			PolicyLogger.error(MessageCodes.ERROR_UNKNOWN, e, "XACMLPapServlet", " GET exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(500, e.getMessage());
+			im.endTransaction();
+			return;
+		}
+		loggingContext.transactionEnded();
+		PolicyLogger.audit("Transaction Ended");
+		im.endTransaction();
+	}
+
+
+	/**
+	 * Requests from the PolicyEngine API to update the PDP Group with pushed policy
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void updateGroupsFromAPI(HttpServletRequest request, HttpServletResponse response, String groupId, ECOMPLoggingContext loggingContext) throws IOException {
+		PolicyDBDaoTransaction acPutTransaction = policyDBDao.getNewTransaction();
+		try {
+
+
+			// for PUT operations the group may or may not need to exist before the operation can be done
+			StdPDPGroup group = (StdPDPGroup) papEngine.getGroup(groupId);
+
+			// get the request content into a String
+			String json = null;
+
+			// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+			java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+			scanner.useDelimiter("\\A");
+			json =  scanner.hasNext() ? scanner.next() : "";
+			scanner.close();
+			logger.info("JSON request from PolicyEngine API: " + json);
+
+			// convert Object sent as JSON into local object
+			ObjectMapper mapper = new ObjectMapper();
+
+			Object objectFromJSON = mapper.readValue(json, StdPDPPolicy.class);
+
+			StdPDPPolicy policy = (StdPDPPolicy) objectFromJSON;
+
+			Set<PDPPolicy> policies = new HashSet<PDPPolicy>();
+
+			if(policy!=null){
+				policies.add(policy);
+			}
+
+			//Get the current policies from the Group and Add the new one
+			Set<PDPPolicy> currentPoliciesInGroup = new HashSet<PDPPolicy>();
+			currentPoliciesInGroup = group.getPolicies();
+
+			//If the selected policy is in the group we must remove it because the name is default
+			Iterator<PDPPolicy> policyIterator = policies.iterator();
+			logger.debug("policyIterator....." + policies);
+			while (policyIterator.hasNext()) {
+				PDPPolicy selPolicy = policyIterator.next();
+				for (PDPPolicy existingPolicy : currentPoliciesInGroup) {
+					if (existingPolicy.getId().equals(selPolicy.getId())) {
+						group.removePolicyFromGroup(existingPolicy);
+						logger.debug("Removing policy: " + existingPolicy);
+						break;
+					}
+				}
+			}
+
+			if(currentPoliciesInGroup!=null){
+				policies.addAll(currentPoliciesInGroup);
+			}
+			group.setPolicies(policies);
+
+			// Assume that this is an update of an existing PDP Group
+			loggingContext.setServiceName("PolicyEngineAPI:PAP.updateGroup");
+
+			try{
+				acPutTransaction.updateGroup(group, "XACMLPapServlet.doACPut");
+			} catch(Exception e){
+				PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Error while updating group in the database: "
+						+"group="+group.getId());
+				throw new PAPException(e.getMessage());	
+			}
+
+			papEngine.updateGroup(group);
+			response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+			response.addHeader("operation", "push");
+			response.addHeader("policyId", policy.getId());
+			response.addHeader("groupId", groupId);
+			if (logger.isDebugEnabled()) {		
+				logger.debug("Group '" + group.getId() + "' updated");
+			}
+
+			acPutTransaction.commitTransaction();
+
+			notifyAC();
+
+			// Group changed, which might include changing the policies	
+			groupChanged(group);
+			loggingContext.transactionEnded();
+			auditLogger.info("Success");
+			PolicyLogger.audit("Transaction Ended Successfully");
+			return;
+		} catch (PAPException e) {
+			acPutTransaction.rollbackTransaction();
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " API PUT exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			String message = XACMLErrorConstants.ERROR_PROCESS_FLOW + "Exception in request to update group from API - See Error.log on on the PAP.";
+			response.sendError(500, e.getMessage());
+			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+			response.addHeader("error","addGroupError");
+			response.addHeader("message", message);
+			return;
+		}
+
+	}
+
+	private void getActiveVersion(HttpServletRequest request, HttpServletResponse response) {
+		//Setup EntityManager to communicate with the PolicyVersion table of the DB
+		EntityManager em = null;
+		em = (EntityManager) emf.createEntityManager();
+
+		if (em==null){
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Error creating entity manager with persistence unit: " + PERSISTENCE_UNIT);
+			try {
+				throw new Exception("Unable to create Entity Manager Factory");
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+
+		String policyScope = request.getParameter("policyScope");
+		String filePrefix = request.getParameter("filePrefix");
+		String policyName = request.getParameter("policyName");
+
+		String pvName = policyScope + File.separator + filePrefix + policyName;
+		int activeVersion = 0;
+
+
+		//Get the Active Version to use in the ID
+		em.getTransaction().begin();
+		Query query = em.createQuery("Select p from PolicyVersion p where p.policyName=:pname");
+		query.setParameter("pname", pvName);
+
+		@SuppressWarnings("rawtypes")
+		List result = query.getResultList();
+		PolicyVersion versionEntity = null;
+		if (!result.isEmpty()) {
+			versionEntity = (PolicyVersion) result.get(0);
+			em.persist(versionEntity);
+			activeVersion = versionEntity.getActiveVersion();
+			em.getTransaction().commit();
+		} else {
+			logger.debug("No PolicyVersion using policyName found");
+		}
+
+		//clean up connection
+		em.close();
+		if (String.valueOf(activeVersion)!=null || !String.valueOf(activeVersion).equalsIgnoreCase("")) {							
+			response.setStatus(HttpServletResponse.SC_OK);								
+			response.addHeader("version", String.valueOf(activeVersion));								
+		} else {						
+			response.setStatus(HttpServletResponse.SC_NOT_FOUND);								
+		}	
+
+
+	}
+
+	private void getSelectedURI(HttpServletRequest request,
+			HttpServletResponse response) {
+
+		String gitPath = request.getParameter("gitPath");
+
+		File file = new File(gitPath);
+
+		logger.debug("The fileItem is : " + file.toString());
+
+		URI selectedURI = file.toURI();
+
+		String uri = selectedURI.toString();
+
+		if (!uri.equalsIgnoreCase("")) {							
+			response.setStatus(HttpServletResponse.SC_OK);								
+			response.addHeader("selectedURI", uri);								
+		} else {						
+			response.setStatus(HttpServletResponse.SC_NOT_FOUND);								
+		}						
+	}
+
+	/*
+	 * getGitPath() method to get the gitPath using data from the JSON string 
+	 * when deleting policies using doAPIDelete()
+	 */
+	private File getPolicyFile(String policyName){
+
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+
+		//getting the fullpath of the gitPath and convert to string
+		String fullGitPath = gitPath.toAbsolutePath().toString();
+		String finalGitPath = null;
+
+		//creating the parentPath directory for the Admin Console use
+		if(fullGitPath.contains("\\")){
+			finalGitPath = fullGitPath.replace("ECOMP-PAP-REST", "ecomp-sdk-app");
+		}else{
+			finalGitPath = fullGitPath.replace("pap",  "console");
+		}
+
+		finalGitPath += File.separator + policyName;
+
+		File file = new File(finalGitPath);
+
+		return file;
+
+	}
+
+	/*
+	 * getGitPath() method to get the gitPath using data from the http request
+	 * and send back in response when pushing policies
+	 */
+	private void getGitPath(HttpServletRequest request,
+			HttpServletResponse response) {
+
+		String policyScope = request.getParameter("policyScope");
+		String filePrefix = request.getParameter("filePrefix");
+		String policyName = request.getParameter("policyName");
+		String activeVersion = request.getParameter("activeVersion");
+
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+
+		//getting the fullpath of the gitPath and convert to string
+		String fullGitPath = gitPath.toAbsolutePath().toString();
+		String finalGitPath = null;
+
+		//creating the parentPath directory for the Admin Console use
+		if(fullGitPath.contains("\\")){
+			finalGitPath = fullGitPath.replace("ECOMP-PAP-REST", "ecomp-sdk-app");
+		}else{
+			finalGitPath = fullGitPath.replace("pap",  "console");
+		}
+
+		finalGitPath += File.separator + policyScope + File.separator + filePrefix + policyName + "." + activeVersion + ".xml";
+		File file = new File(finalGitPath);
+		URI uri = file.toURI();
+		
+		//
+		// Extract XACML policy information
+		//
+		Boolean isValid = false;
+		String policyId = null;
+		String description = null;
+		String	version = null;
+
+		URL url;
+		try {
+			url = uri.toURL();
+			Object rootElement = XACMLPolicyScanner.readPolicy(url.openStream());
+			if (rootElement == null ||
+					(
+							! (rootElement instanceof PolicySetType) &&
+							! (rootElement instanceof PolicyType)
+							)	) {
+				logger.warn("No root policy element in URI: " + uri.toString() + " : " + rootElement);
+				isValid = false;
+			} else {
+				if (rootElement instanceof PolicySetType) {
+					policyId = ((PolicySetType)rootElement).getPolicySetId();
+					description = ((PolicySetType)rootElement).getDescription();
+					isValid = true;
+					version = ((PolicySetType)rootElement).getVersion();
+				} else if (rootElement instanceof PolicyType) {
+					policyId = ((PolicyType)rootElement).getPolicyId();
+					description = ((PolicyType)rootElement).getDescription();
+					version = ((PolicyType)rootElement).getVersion();
+					isValid = true;
+				} else {
+					PolicyLogger.error("Unknown root element: " + rootElement.getClass().getCanonicalName());
+				}
+			}
+		} catch (Exception e) {
+			logger.error("Exception Occured While Extracting Policy Information");
+		} 
+
+		if (!finalGitPath.equalsIgnoreCase("") || policyId!=null || description!=null || version!=null || isValid!=null) {							
+			response.setStatus(HttpServletResponse.SC_OK);								
+			response.addHeader("gitPath", finalGitPath);
+			response.addHeader("policyId", policyId);
+			response.addHeader("description", description);
+			response.addHeader("version", version);
+			response.addHeader("isValid", isValid.toString());
+		} else {						
+			response.setStatus(HttpServletResponse.SC_NOT_FOUND);								
+		}						
+
+	}
+
+	/**
+	 * Given a version string consisting of integers with dots between them, convert it into an array of ints.
+	 * 
+	 * @param version
+	 * @return
+	 * @throws NumberFormatException
+	 */
+	public static int[] versionStringToArray(String version) throws NumberFormatException {
+		if (version == null || version.length() == 0) {
+			return new int[0];
+		}
+		String[] stringArray = version.split("\\.");
+		int[] resultArray = new int[stringArray.length];
+		for (int i = 0; i < stringArray.length; i++) {
+			resultArray[i] = Integer.parseInt(stringArray[i]);
+		}
+		return resultArray;
+	}
+
+	protected String	getPDPID(HttpServletRequest request) {
+		String pdpURL = request.getHeader(XACMLRestProperties.PROP_PDP_HTTP_HEADER_ID);
+		if (pdpURL == null || pdpURL.isEmpty()) {
+			//
+			// Should send back its port for identification
+			//
+			logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + "PDP did not send custom header");
+			pdpURL = "";
+		}
+		return  pdpURL;
+	}
+
+	protected String getPDPJMX(HttpServletRequest request) {
+		String pdpJMMX = request.getHeader(XACMLRestProperties.PROP_PDP_HTTP_HEADER_JMX_PORT);
+		if (pdpJMMX == null || pdpJMMX.isEmpty()) {
+			//
+			// Should send back its port for identification
+			//
+			logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + "PDP did not send custom header for JMX Port so the value of 0 is assigned");
+			return null;
+		}
+		return pdpJMMX;
+	}
+	private boolean isPDPCurrent(Properties policies, Properties pipconfig, Properties pdpProperties) {
+		String localRootPolicies = policies.getProperty(XACMLProperties.PROP_ROOTPOLICIES);
+		String localReferencedPolicies = policies.getProperty(XACMLProperties.PROP_REFERENCEDPOLICIES);
+		if (localRootPolicies == null || localReferencedPolicies == null) {
+			logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + "Missing property on PAP server: RootPolicies="+localRootPolicies+"  ReferencedPolicies="+localReferencedPolicies);
+			return false;
+		}
+		//
+		// Compare the policies and pipconfig properties to the pdpProperties
+		//
+		try {
+			//
+			// the policy properties includes only xacml.rootPolicies and 
+			// xacml.referencedPolicies without any .url entries
+			//
+			Properties pdpPolicies = XACMLProperties.getPolicyProperties(pdpProperties, false);
+			Properties pdpPipConfig = XACMLProperties.getPipProperties(pdpProperties);
+			if (localRootPolicies.equals(pdpPolicies.getProperty(XACMLProperties.PROP_ROOTPOLICIES)) &&
+					localReferencedPolicies.equals(pdpPolicies.getProperty(XACMLProperties.PROP_REFERENCEDPOLICIES)) &&
+					pdpPipConfig.equals(pipconfig)) {
+				//
+				// The PDP is current
+				//
+				return true;
+			}
+		} catch (Exception e) {
+			// we get here if the PDP did not include either xacml.rootPolicies or xacml.pip.engines,
+			// or if there are policies that do not have a corresponding ".url" property.
+			// Either of these cases means that the PDP is not up-to-date, so just drop-through to return false.
+			PolicyLogger.error(MessageCodes.ERROR_SCHEMA_INVALID, e, "XACMLPapServlet", " PDP Error");
+		}
+		return false;
+	}
+
+	private void populatePolicyURL(StringBuffer urlPath, Properties policies) {
+		String lists[] = new String[2];
+		lists[0] = policies.getProperty(XACMLProperties.PROP_ROOTPOLICIES);
+		lists[1] = policies.getProperty(XACMLProperties.PROP_REFERENCEDPOLICIES);
+		for (String list : lists) {
+			if (list != null && list.isEmpty() == false) {
+				for (String id : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) {
+					String url = urlPath + "?id=" + id;
+					logger.info("Policy URL for " + id + ": " + url);
+					policies.setProperty(id + ".url", url);
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * @see HttpServlet#doPut(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		ECOMPLoggingContext loggingContext = ECOMPLoggingUtils.getLoggingContextForRequest(request, baseLoggingContext);
+		storedRequestId = loggingContext.getRequestID();
+		loggingContext.transactionStarted();
+		loggingContext.setServiceName("PAP.put"); // we may set a more specific value later
+		if ((loggingContext.getRequestID() == null) || (loggingContext.getRequestID() == "")){
+			UUID requestID = UUID.randomUUID();
+			loggingContext.setRequestID(requestID.toString());
+			PolicyLogger.info("requestID not provided in call to XACMLPapSrvlet (doPut) so we generated one");
+		} else {
+			PolicyLogger.info("requestID was provided in call to XACMLPapSrvlet (doPut)");
+		}
+		// dummy metric.log example posted below as proof of concept
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 1 of 2");
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 2 of 2");
+		//This im.startTransaction() covers all Put transactions
+		try {
+			im.startTransaction();
+		} catch (AdministrativeStateException ae){
+			String message = "PUT interface called for PAP " + papResourceName + " but it has an Administrative"
+					+ " state of " + im.getStateManager().getAdminState()
+					+ "\n Exception Message: " + ae.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}catch (StandbyStatusException se) {
+			se.printStackTrace();
+			String message = "PUT interface called for PAP " + papResourceName + " but it has a Standby Status"
+					+ " of " + im.getStateManager().getStandbyStatus()
+					+ "\n Exception Message: " + se.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}
+
+		XACMLRest.dumpRequest(request);
+
+		//
+		// since getParameter reads the content string, explicitly get the content before doing that.
+		// Simply getting the inputStream seems to protect it against being consumed by getParameter.
+		//
+		request.getInputStream();
+
+		//need to check if request is from the API or Admin console
+		String apiflag = request.getParameter("apiflag");
+
+		//This would occur if a PolicyDBDao notification was received
+		String policyDBDaoRequestUrl = request.getParameter("policydbdaourl");
+		if(policyDBDaoRequestUrl != null){
+			String policyDBDaoRequestEntityId = request.getParameter("entityid");
+			//String policyDBDaoRequestEntityType = request.getParameter("entitytype");
+			String policyDBDaoRequestEntityType = request.getParameter("entitytype");
+			String policyDBDaoRequestExtraData = request.getParameter("extradata");
+			if(policyDBDaoRequestEntityId == null || policyDBDaoRequestEntityType == null){
+				response.sendError(400, "entityid or entitytype not supplied");
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Ended Successfully");
+				im.endTransaction();
+				return;
+			}
+			policyDBDao.handleIncomingHttpNotification(policyDBDaoRequestUrl,policyDBDaoRequestEntityId,policyDBDaoRequestEntityType,policyDBDaoRequestExtraData,this);			
+			response.setStatus(200);
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+		}
+
+		//This would occur if we received a notification of a policy creation or update
+		String policyToCreateUpdate = request.getParameter("policyToCreateUpdate");
+		if(policyToCreateUpdate != null){
+			if(logger.isDebugEnabled()){
+				logger.debug("\nXACMLPapServlet.doPut() - before decoding"
+						+ "\npolicyToCreateUpdate = " + policyToCreateUpdate);
+			}
+			//decode it
+			try{
+				policyToCreateUpdate = URLDecoder.decode(policyToCreateUpdate, "UTF-8");
+				if(logger.isDebugEnabled()){
+					logger.debug("\nXACMLPapServlet.doPut() - after decoding"
+							+ "\npolicyToCreateUpdate = " + policyToCreateUpdate);
+				}
+			} catch(UnsupportedEncodingException e){
+				PolicyLogger.error("\nXACMLPapServlet.doPut() - Unsupported URL encoding of policyToCreateUpdate (UTF-8)"
+						+ "\npolicyToCreateUpdate = " + policyToCreateUpdate);
+				response.sendError(500,"policyToCreateUpdate encoding not supported"
+						+ "\nfailure with the following exception: " + e);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See error.log");
+				im.endTransaction();
+				return;
+			}
+
+			//send it to PolicyDBDao
+			PolicyDBDaoTransaction createUpdateTransaction = policyDBDao.getNewTransaction();
+			try{
+				createUpdateTransaction.createPolicy(policyToCreateUpdate, "XACMLPapServlet.doPut");
+			}catch(Exception e){
+				createUpdateTransaction.rollbackTransaction();
+				response.sendError(500,"createUpdateTransaction.createPolicy(policyToCreateUpdate, XACMLPapServlet.doPut) "
+						+ "\nfailure with the following exception: " + e);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See error.log");
+				im.endTransaction();
+				return;
+			}
+			createUpdateTransaction.commitTransaction();
+			// Before sending Ok. Lets call AutoPush. 
+			if(autoPushFlag){
+				Set<StdPDPGroup> changedGroups = autoPushPolicy.checkGroupsToPush(policyToCreateUpdate,  this.papEngine);
+				if(!changedGroups.isEmpty()){
+					for(StdPDPGroup group: changedGroups){
+						try{
+							papEngine.updateGroup(group);
+							if (logger.isDebugEnabled()) {		
+								logger.debug("Group '" + group.getId() + "' updated");
+							}
+							notifyAC();
+							// Group changed, which might include changing the policies	
+							groupChanged(group);
+						}catch(Exception e){
+							PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " Failed to Push policy. ");
+						}
+					}
+				}
+			}
+			response.setStatus(HttpServletResponse.SC_OK);
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+		}
+
+		/*
+		 * Request for Micro Service Import
+		 */
+		String microServiceCreation = request.getParameter("importService");
+		if (microServiceCreation != null) {
+			if(authorizeRequest(request)){   
+				if (microServiceCreation.contains("MICROSERVICE")){
+					doImportMicroServicePut(request, response);
+					im.endTransaction();
+					return;
+				}
+			} else {
+				String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+				logger.error(XACMLErrorConstants.ERROR_PERMISSIONS + message );
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+				return;
+			}
+		}
+		//This would occur if we received a notification of a policy rename from AC
+		String oldPolicyName = request.getParameter("oldPolicyName");
+		String newPolicyName = request.getParameter("newPolicyName");
+		if(oldPolicyName != null && newPolicyName != null){
+			if(logger.isDebugEnabled()){
+				logger.debug("\nXACMLPapServlet.doPut() - before decoding"
+						+ "\npolicyToCreateUpdate = " + " ");
+			}
+			//decode it
+			try{
+				oldPolicyName = URLDecoder.decode(oldPolicyName, "UTF-8");
+				newPolicyName = URLDecoder.decode(newPolicyName, "UTF-8");
+				if(logger.isDebugEnabled()){
+					logger.debug("\nXACMLPapServlet.doPut() - after decoding"
+							+ "\npolicyToCreateUpdate = " + " ");
+				}
+			} catch(UnsupportedEncodingException e){
+				PolicyLogger.error("\nXACMLPapServlet.doPut() - Unsupported URL encoding of policyToCreateUpdate (UTF-8)"
+						+ "\npolicyToCreateUpdate = " + " ");
+				response.sendError(500,"policyToCreateUpdate encoding not supported"
+						+ "\nfailure with the following exception: " + e);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See error.log");
+				im.endTransaction();
+				return;
+			}
+			//send it to PolicyDBDao
+			PolicyDBDaoTransaction renameTransaction = policyDBDao.getNewTransaction();
+			try{
+				renameTransaction.renamePolicy(oldPolicyName,newPolicyName, "XACMLPapServlet.doPut");
+			}catch(Exception e){
+				renameTransaction.rollbackTransaction();
+				response.sendError(500,"createUpdateTransaction.createPolicy(policyToCreateUpdate, XACMLPapServlet.doPut) "
+						+ "\nfailure with the following exception: " + e);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See error.log");
+				im.endTransaction();
+				return;
+			}
+			renameTransaction.commitTransaction();
+			response.setStatus(HttpServletResponse.SC_OK);
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+		}
+
+
+		//
+		// See if this is Admin Console registering itself with us
+		//
+		String acURLString = request.getParameter("adminConsoleURL");
+		if (acURLString != null) {
+			loggingContext.setServiceName("AC:PAP.register");
+			//
+			// remember this Admin Console for future updates
+			//
+			if ( ! adminConsoleURLStringList.contains(acURLString)) {
+				adminConsoleURLStringList.add(acURLString);
+			}
+			if (logger.isDebugEnabled()) {
+				logger.debug("Admin Console registering with URL: " + acURLString);
+			}
+			response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+			loggingContext.transactionEnded();
+			auditLogger.info("Success");
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+		}
+
+		/*
+		 * This is to update the PDP Group with the policy/policies being pushed
+		 * Part of a 2 step process to push policie to the PDP that can now be done 
+		 * From both the Admin Console and the PolicyEngine API
+		 */
+		String groupId = request.getParameter("groupId");
+		if (groupId != null) {
+			if(apiflag!=null){
+				if(apiflag.equalsIgnoreCase("addPolicyToGroup")){
+					updateGroupsFromAPI(request, response, groupId, loggingContext);
+					loggingContext.transactionEnded();
+					PolicyLogger.audit("Transaction Ended Successfully");
+					im.endTransaction();
+					return;
+				}
+			}
+			//
+			// this is from the Admin Console, so handle separately
+			//
+			doACPut(request, response, groupId, loggingContext);
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+		}
+
+		//
+		// Request is for policy validation and creation
+		//
+		if (apiflag != null && apiflag.equalsIgnoreCase("admin")){
+			/*
+			 * this request is from the Admin Console
+			 */
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			doACPolicyPut(request, response);
+			im.endTransaction();
+			return;
+
+		} else if (apiflag != null && apiflag.equalsIgnoreCase("api")) {
+			/*
+			 * this request is from the Policy Creation API
+			 */
+			// Authenticating the Request here. 
+			if(authorizeRequest(request)){
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Ended Successfully");
+				doPolicyAPIPut(request, response);
+				im.endTransaction();
+				return;
+			} else {
+				String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+				PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+				im.endTransaction();
+				return;
+			}
+
+		}
+
+
+		//
+		// We do not expect anything from anywhere else.
+		// This method is here in case we ever need to support other operations.
+		//
+		logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Request does not have groupId or apiflag");
+		loggingContext.transactionEnded();
+
+		PolicyLogger.audit("Transaction Failed - See Error.log");
+		response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Request does not have groupId or apiflag");
+		loggingContext.transactionEnded();
+		PolicyLogger.audit("Transaction Failed - See error.log");
+		im.endTransaction();
+	}
+
+	/**
+	 * @see HttpServlet#doDelete(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+		ECOMPLoggingContext loggingContext = ECOMPLoggingUtils.getLoggingContextForRequest(request, baseLoggingContext);
+		loggingContext.transactionStarted();
+		loggingContext.setServiceName("PAP.delete"); // we may set a more specific value later
+		if ((loggingContext.getRequestID() == null) || (loggingContext.getRequestID() == "")){
+			UUID requestID = UUID.randomUUID();
+			loggingContext.setRequestID(requestID.toString());
+			PolicyLogger.info("requestID not provided in call to XACMLPapSrvlet (doDelete) so we generated one");
+		} else {
+			PolicyLogger.info("requestID was provided in call to XACMLPapSrvlet (doDelete)");
+		}
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 1 of 2");
+		loggingContext.metricStarted();
+		loggingContext.metricEnded();
+		PolicyLogger.metrics("Metric example posted here - 2 of 2");	
+
+		//This im.startTransaction() covers all Delete transactions
+		try {
+			im.startTransaction();
+		} catch (AdministrativeStateException ae){
+			String message = "DELETE interface called for PAP " + papResourceName + " but it has an Administrative"
+					+ " state of " + im.getStateManager().getAdminState()
+					+ "\n Exception Message: " + ae.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}catch (StandbyStatusException se) {
+			se.printStackTrace();
+			String message = "PUT interface called for PAP " + papResourceName + " but it has a Standby Status"
+					+ " of " + im.getStateManager().getStandbyStatus()
+					+ "\n Exception Message: " + se.getMessage();
+			logger.info(message);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, message);
+			return;
+		}
+
+		XACMLRest.dumpRequest(request);
+
+		String groupId = request.getParameter("groupId");
+		String apiflag = request.getParameter("apiflag");
+
+		if (groupId != null) {
+			// Is this from the Admin Console or API?
+			if(apiflag!=null) {
+				if (apiflag.equalsIgnoreCase("deletePapApi")) {
+					// this is from the API so we need to check the client credentials before processing the request
+					if(authorizeRequest(request)){
+						doAPIDeleteFromPAP(request, response, loggingContext);
+						return;
+					} else {
+						String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+						PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+						return;
+					}
+				} else if (apiflag.equalsIgnoreCase("deletePdpApi")) {
+					if(authorizeRequest(request)){
+						doAPIDeleteFromPDP(request, response, loggingContext);
+						return;
+					} else {
+						String message = "PEP not Authorized for making this Request!! \n Contact Administrator for this Scope. ";
+						PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + " " + message);
+						loggingContext.transactionEnded();
+
+						PolicyLogger.audit("Transaction Failed - See Error.log");
+						response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+						return;
+					}
+				}
+			}
+
+			// this is from the Admin Console, so handle separately
+			doACDelete(request, response, groupId, loggingContext);
+			loggingContext.transactionEnded();
+			PolicyLogger.audit("Transaction Ended Successfully");
+			im.endTransaction();
+			return;
+
+		}
+		//
+		// We do not expect anything from anywhere else.
+		// This method is here in case we ever need to support other operations.
+		//
+		PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Request does not have groupId");
+		loggingContext.transactionEnded();
+
+		PolicyLogger.audit("Transaction Failed - See Error.log");
+
+		response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Request does not have groupId");
+
+		//Catch anything that fell through
+		im.endTransaction();
+
+	}
+	//
+	// Admin Console request handling
+	//
+
+	/**
+	 * Requests from the Admin Console to GET info about the Groups and PDPs
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doACGet(HttpServletRequest request, HttpServletResponse response, String groupId, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+		try {
+			String parameterDefault = request.getParameter("default");
+			String pdpId = request.getParameter("pdpId");
+			String pdpGroup = request.getParameter("getPDPGroup");
+			if ("".equals(groupId)) {
+				// request IS from AC but does not identify a group by name
+				if (parameterDefault != null) {
+					// Request is for the Default group (whatever its id)
+					loggingContext.setServiceName("AC:PAP.getDefaultGroup");
+
+					EcompPDPGroup group = papEngine.getDefaultGroup();
+
+					// convert response object to JSON and include in the response
+					ObjectMapper mapper = new ObjectMapper();
+					mapper.writeValue(response.getOutputStream(),  group);
+
+					if (logger.isDebugEnabled()) {
+						logger.debug("GET Default group req from '" + request.getRequestURL() + "'");
+					}
+					response.setStatus(HttpServletResponse.SC_OK);
+					response.setHeader("content-type", "application/json");
+					response.getOutputStream().close();
+					loggingContext.transactionEnded();
+					auditLogger.info("Success");
+					PolicyLogger.audit("Transaction Ended Successfully");
+					return;
+
+				} else if (pdpId != null) {
+					// Request is related to a PDP
+					if (pdpGroup == null) {
+						// Request is for the PDP itself
+						// Request is for the (unspecified) group containing a given PDP
+						loggingContext.setServiceName("AC:PAP.getPDP");
+						EcompPDP pdp = papEngine.getPDP(pdpId);
+
+						// convert response object to JSON and include in the response
+						ObjectMapper mapper = new ObjectMapper();
+						mapper.writeValue(response.getOutputStream(),  pdp);
+
+						if (logger.isDebugEnabled()) {
+							logger.debug("GET pdp '" + pdpId + "' req from '" + request.getRequestURL() + "'");
+						}
+						response.setStatus(HttpServletResponse.SC_OK);
+						response.setHeader("content-type", "application/json");
+						response.getOutputStream().close();
+						loggingContext.transactionEnded();
+						auditLogger.info("Success");
+						PolicyLogger.audit("Transaction Ended Successfully");
+						return;
+
+					} else {
+						// Request is for the group containing a given PDP
+						loggingContext.setServiceName("AC:PAP.getGroupForPDP");
+						EcompPDP pdp = papEngine.getPDP(pdpId);
+						EcompPDPGroup group = papEngine.getPDPGroup((EcompPDP) pdp);
+
+						// convert response object to JSON and include in the response
+						ObjectMapper mapper = new ObjectMapper();
+						mapper.writeValue(response.getOutputStream(),  group);
+
+						if (logger.isDebugEnabled()) {
+							logger.debug("GET PDP '" + pdpId + "' Group req from '" + request.getRequestURL() + "'");
+						}
+						response.setStatus(HttpServletResponse.SC_OK);
+						response.setHeader("content-type", "application/json");
+						response.getOutputStream().close();
+						loggingContext.transactionEnded();
+						auditLogger.info("Success");
+						PolicyLogger.audit("Transaction Ended Successfully");
+						return;
+					}
+
+				} else {
+					// request is for top-level properties about all groups
+					loggingContext.setServiceName("AC:PAP.getAllGroups");
+					Set<EcompPDPGroup> groups = papEngine.getEcompPDPGroups();
+
+					// convert response object to JSON and include in the response
+					ObjectMapper mapper = new ObjectMapper();
+					mapper.writeValue(response.getOutputStream(),  groups);
+
+					if (logger.isDebugEnabled()) {
+						logger.debug("GET All groups req");
+					}
+					response.setStatus(HttpServletResponse.SC_OK);
+					response.setHeader("content-type", "application/json");
+					response.getOutputStream().close();
+					loggingContext.transactionEnded();
+					auditLogger.info("Success");
+					PolicyLogger.audit("Transaction Ended Successfully");
+					return;
+				}
+			}
+
+			// for all other GET operations the group must exist before the operation can be done
+			EcompPDPGroup group = papEngine.getGroup(groupId);
+			if (group == null) {
+				String message = "Unknown groupId '" + groupId + "'";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+				return;
+			}
+
+
+			// Figure out which request this is based on the parameters
+			String policyId = request.getParameter("policyId");
+
+			if (policyId != null) {
+				// retrieve a policy
+				loggingContext.setServiceName("AC:PAP.getPolicy");
+				//
+				// convert response object to JSON and include in the response
+				//
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " GET Policy not implemented");
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, "GET Policy not implemented");
+
+			} else {
+				// No other parameters, so return the identified Group
+				loggingContext.setServiceName("AC:PAP.getGroup");
+
+				// convert response object to JSON and include in the response
+				ObjectMapper mapper = new ObjectMapper();
+				mapper.writeValue(response.getOutputStream(),  group);
+
+				if (logger.isDebugEnabled()) {
+					logger.debug("GET group '" + group.getId() + "' req from '" + request.getRequestURL() + "'");
+				}
+				response.setStatus(HttpServletResponse.SC_OK);
+				response.setHeader("content-type", "application/json");
+				response.getOutputStream().close();
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			}
+
+			//
+			// Currently there are no other GET calls from the AC.
+			// The AC uses the "GET All Groups" operation to fill its local cache and uses that cache for all other GETs without calling the PAP.
+			// Other GETs that could be called:
+			//				Specific Group	(groupId=<groupId>)
+			//				A Policy		(groupId=<groupId> policyId=<policyId>)
+			//				A PDP			(groupId=<groupId> pdpId=<pdpId>)
+
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " UNIMPLEMENTED ");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response.sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
+		} catch (PAPException e) {
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " AC Get exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(500, e.getMessage());
+			return;
+		}
+
+	}
+
+	/**
+	 * Requests from the Admin Console for validating and creating policies
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @throws JsonMappingException 
+	 * @throws JsonParseException 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doACPolicyPut(HttpServletRequest request,
+			HttpServletResponse response) throws JsonParseException, JsonMappingException, IOException {
+
+		String operation = request.getParameter("operation");
+		String policyType = request.getParameter("policyType");
+		String apiflag = request.getParameter("apiflag"); 
+
+		if ( policyType != null ) {
+			PolicyRestAdapter policyAdapter = new PolicyRestAdapter();
+			Policy newPolicy = null;
+			// get the request content into a String
+			String json = null;
+			// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+			java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+			scanner.useDelimiter("\\A");
+			json =  scanner.hasNext() ? scanner.next() : "";
+			scanner.close();
+			logger.info("JSON request from AC: " + json);
+			// convert Object sent as JSON into local object
+			ObjectMapper mapper = new ObjectMapper();
+			Object objectFromJSON = mapper.readValue(json, StdPAPPolicy.class);
+
+			StdPAPPolicy policy = (StdPAPPolicy) objectFromJSON;
+
+			//Set policyAdapter values including parentPath (Common to all policy types)
+			//Set values for policy adapter
+			try {
+				if (operation.equalsIgnoreCase("validate")) {
+					policyAdapter.setPolicyName(policy.getPolicyName());
+					policyAdapter.setConfigType(policy.getConfigType());
+					policyAdapter.setConfigBodyData(policy.getConfigBodyData());
+				} else {
+					policyAdapter = setDataToPolicyAdapter(policy, policyType, apiflag);
+				}
+			} catch (Exception e1) {
+				logger.error("Exception occured While Setting Values for Policy Adapter"+e1);
+			}
+			// Calling Component class per policy type
+			if (policyType.equalsIgnoreCase("Config")) {
+				String configPolicyType = policy.getConfigPolicyType();
+				if (configPolicyType != null && configPolicyType.equalsIgnoreCase("Firewall Config")) {
+					newPolicy = new FirewallConfigPolicy(policyAdapter);
+				} 
+				else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("BRMS_Raw")) {
+					newPolicy = new CreateBrmsRawPolicy(policyAdapter);
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("BRMS_Param")) {
+					policyAdapter.setBrmsParamBody(policy.getDrlRuleAndUIParams());
+					newPolicy = new CreateBrmsParamPolicy(policyAdapter);
+				}
+				else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("Base")) {
+					newPolicy =  new ConfigPolicy(policyAdapter);
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("ClosedLoop_Fault")) {
+					newPolicy = new ClosedLoopPolicy(policyAdapter);
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("ClosedLoop_PM")) {
+					newPolicy = new CreateClosedLoopPerformanceMetrics(policyAdapter);	
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("DCAE Micro Service")) {	
+					newPolicy = new MicroServiceConfigPolicy(policyAdapter);
+				}
+
+			} else if (policyType.equalsIgnoreCase("Action")) {
+				newPolicy = new ActionPolicy(policyAdapter);
+			} else if (policyType.equalsIgnoreCase("Decision")) {
+				newPolicy = new DecisionPolicy(policyAdapter);	
+			}
+
+			// Validation
+			if (operation != null && operation.equalsIgnoreCase("validate")) {
+
+				// validate the body data if applicable and return a response to the PAP-ADMIN	(Config Base only)
+				if (newPolicy.validateConfigForm()) {					
+					response.setStatus(HttpServletResponse.SC_OK);
+					response.addHeader("isValidData", "true");					
+				} else {	
+					response.setStatus(HttpServletResponse.SC_OK);	
+					response.addHeader("isValidData", "false");
+				}
+
+			}   
+
+			// Create or Update Policy        
+			if (operation != null && (operation.equalsIgnoreCase("create") || operation.equalsIgnoreCase("update"))) {
+
+				// create the policy and return a response to the PAP-ADMIN		        
+				PolicyDBDaoTransaction policyDBDaoTransaction = policyDBDao.getNewTransaction();
+				try {
+					Map<String, String> successMap;
+					newPolicy.prepareToSave();
+					policyDBDaoTransaction.createPolicy(newPolicy, "doACPolicyPut");
+					successMap = newPolicy.savePolicies();
+					if (successMap.containsKey("success")) {
+						policyDBDaoTransaction.commitTransaction();
+						response.setStatus(HttpServletResponse.SC_OK);
+						response.addHeader("successMapKey", "success");		    						    				
+						response.addHeader("finalPolicyPath", policyAdapter.getFinalPolicyPath());	
+					} else {								
+						policyDBDaoTransaction.rollbackTransaction();
+						response.setStatus(HttpServletResponse.SC_OK);								
+					}	
+				} catch (Exception e) {	
+					policyDBDaoTransaction.rollbackTransaction();
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Could not save policy ");
+					response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+				}		        	
+			}
+
+		}
+
+	}
+
+	private void doPolicyAPIPut(HttpServletRequest request,
+			HttpServletResponse response) throws IOException, ServletException {
+		String operation = request.getParameter("operation");
+		String policyType = request.getParameter("policyType");
+		String apiflag = request.getParameter("apiflag");
+
+		
+		if ( policyType != null ) {
+			PolicyRestAdapter policyAdapter = new PolicyRestAdapter();
+			Policy newPolicy = null;
+
+			// get the request content into a String
+			String json = null;
+
+			// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+			java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+			scanner.useDelimiter("\\A");
+			json =  scanner.hasNext() ? scanner.next() : "";
+			scanner.close();
+			logger.info("JSON request from API: " + json);
+
+			// convert Object sent as JSON into local object
+			ObjectMapper mapper = new ObjectMapper();
+
+			Object objectFromJSON = mapper.readValue(json, StdPAPPolicy.class);
+
+			StdPAPPolicy policy = (StdPAPPolicy) objectFromJSON;
+
+			//Set policyAdapter values including parentPath (Common to all policy types)
+			try {
+				policyAdapter = setDataToPolicyAdapter(policy, policyType, apiflag);
+			} catch (Exception e1) {
+				logger.error(XACMLErrorConstants.ERROR_UNKNOWN + 
+						"Could not set data to policy adapter ",e1);
+			}
+
+			// Calling Component class per policy type
+			if (policyType.equalsIgnoreCase("Config")) {
+				String configPolicyType = policy.getConfigPolicyType();
+				if (configPolicyType != null && configPolicyType.equalsIgnoreCase("Firewall Config")) {
+
+					newPolicy = new FirewallConfigPolicy(policyAdapter);
+
+				} 
+				else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("BRMS_Raw")) { 
+
+					newPolicy = new CreateBrmsRawPolicy(policyAdapter);
+
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("BRMS_Param")) {
+
+					policyAdapter.setBrmsParamBody(policy.getDrlRuleAndUIParams());
+					//check for valid actionAttributes
+					//Setup EntityManager to communicate with the PolicyVersion table of the DB
+					EntityManager em = null;
+					em = (EntityManager) emf.createEntityManager();
+
+					Map<String,String> ruleAndUIValue=policyAdapter.getBrmsParamBody();
+					String modelName= ruleAndUIValue.get("templateName");
+					logger.info("Template name from API is: "+modelName);
+
+					Query getModel = em.createNamedQuery("BRMSParamTemplate.findAll");	
+					List<?> modelList = getModel.getResultList(); 	
+					Boolean isValidService = false;
+					for (Object id : modelList) {
+						BRMSParamTemplate value = (BRMSParamTemplate)id;
+						logger.info("Template value from dictionary is: "+value);
+						if (modelName.equals(value.getRuleName())) {
+							isValidService = true;
+							break;
+						}
+					}
+
+					em.close();
+
+					if (isValidService) {
+						newPolicy = new CreateBrmsParamPolicy(policyAdapter);
+					} else {
+						logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Invalid Template.  The template name, " 
+								+ modelName 
+								+ " was not found in the dictionary.");
+						response.addHeader("error", "missingTemplate");	
+						response.addHeader("modelName", modelName);
+						response.setStatus(HttpServletResponse.SC_BAD_REQUEST);								
+						return;
+					}
+				}
+				else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("Base")) {
+
+					newPolicy =  new ConfigPolicy(policyAdapter);
+
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("ClosedLoop_Fault")) {
+
+					newPolicy = new ClosedLoopPolicy(policyAdapter);
+
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("ClosedLoop_PM")) {
+
+					newPolicy = new CreateClosedLoopPerformanceMetrics(policyAdapter);
+
+				}else if (configPolicyType != null && configPolicyType.equalsIgnoreCase("DCAE Micro Service")) {
+
+					//check for valid actionAttributes
+					//Setup EntityManager to communicate with the PolicyVersion table of the DB
+					EntityManager em = null;
+					em = (EntityManager) emf.createEntityManager();
+
+					String modelName = policy.getServiceType();
+					String modelVersion = policy.getVersion();
+
+					Query getModel = em.createNamedQuery("MicroServiceModels.findAll");	
+					List<?> modelList = getModel.getResultList(); 	
+					Boolean isValidService = false;
+					for (Object id : modelList) {
+						MicroServiceModels value = (MicroServiceModels)id;
+						if (modelName.equals(value.getModelName()) && modelVersion.equals(value.getVersion())) {
+							isValidService = true;
+							break;
+						}
+					}
+
+					em.close();
+
+					if (isValidService) {
+						newPolicy = new MicroServiceConfigPolicy(policyAdapter);
+					} else {
+						logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Invalid Service or Version.  The Service Model, " 
+								+ modelName + " of version " + modelVersion 
+								+ " was not found in the dictionary.");
+						response.addHeader("error", "serviceModelDB");	
+						response.addHeader("modelName", modelName);
+						response.addHeader("modelVersion", modelVersion);
+						response.setStatus(HttpServletResponse.SC_BAD_REQUEST);								
+						return;
+					}
+
+				}
+
+			} else if (policyType.equalsIgnoreCase("Action")) {
+
+				//check for valid actionAttributes
+				//Setup EntityManager to communicate with the PolicyVersion table of the DB
+				EntityManager em = null;
+				em = (EntityManager) emf.createEntityManager();
+
+				String attributeName = policy.getActionAttribute();
+
+				Query getActionAttributes = em.createNamedQuery("ActionPolicyDict.findAll");	
+				List<?> actionAttributesList = getActionAttributes.getResultList(); 	
+				Boolean isAttribute = false;
+				for (Object id : actionAttributesList) {
+					ActionPolicyDict value = (ActionPolicyDict)id;
+					if (attributeName.equals(value.getAttributeName())) {
+						isAttribute = true;
+						break;
+					}
+				}
+
+				em.close();
+
+				if (isAttribute) {
+					newPolicy = new ActionPolicy(policyAdapter);
+				} else {
+					logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Could not fine " + attributeName + " in the ActionPolicyDict table.");
+					response.addHeader("error", "actionPolicyDB");	
+					response.addHeader("actionAttribute", attributeName);
+					response.setStatus(HttpServletResponse.SC_BAD_REQUEST);								
+					return;
+				}
+
+			} else if (policyType.equalsIgnoreCase("Decision")) {
+
+				newPolicy = new DecisionPolicy(policyAdapter);
+
+			}
+
+			// Create or Update Policy        
+			if (operation != null && (operation.equalsIgnoreCase("create") || operation.equalsIgnoreCase("update"))) {
+
+				// create the policy and return a response to the PAP-ADMIN		        
+				if (newPolicy.validateConfigForm()) {		        		
+					PolicyDBDaoTransaction policyDBDaoTransaction = policyDBDao.getNewTransaction();
+					try {	
+
+						// added check for existing policy when new policy is created to 
+						// unique API error for "policy already exists" 
+						Boolean isNewPolicy = newPolicy.prepareToSave();
+						if(isNewPolicy){
+							policyDBDaoTransaction.createPolicy(newPolicy, "doPolicyAPIPut");
+						}
+						Map<String, String> successMap = newPolicy.savePolicies();							
+						if (successMap.containsKey("success")) {
+							
+							EntityManager apiEm = null;
+							apiEm = (EntityManager) emf.createEntityManager();
+							//
+							// Did it get created?
+							//
+							if (apiEm == null) {
+								PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE +  " Error creating entity manager with persistence unit: " + PERSISTENCE_UNIT);	
+								ServletException e = new ServletException("Unable to create Entity Manager Factory");
+								e.printStackTrace();
+								throw e;
+							}
+							
+							String finalPath = policyAdapter.getFinalPolicyPath();
+		    				//
+		    				//Check the database entry if a scope is available in PolicyEditorScope table or not.
+		    				//If not exists create a new entry.
+		    				//
+		    				String dirName = finalPath.toString().substring(finalPath.toString().indexOf("repository")+11, finalPath.toString().lastIndexOf(File.separator));
+		    				apiEm.getTransaction().begin();
+		    				Query query = apiEm.createQuery("Select p from PolicyEditorScopes p where p.scopeName=:sname");
+		    				query.setParameter("sname", dirName);
+		    				
+		    				@SuppressWarnings("rawtypes")
+		    				List result = query.getResultList();
+		    				if(result.isEmpty()){
+		    					PolicyEditorScopes scopeEntity = new PolicyEditorScopes();
+		    					scopeEntity.setScopeName(dirName);
+		    					UserInfo user = new UserInfo();
+		    					user.setUserLoginId("API");
+		    					user.setUserName("API");
+		    					scopeEntity.setUserCreatedBy(user);
+		    					scopeEntity.setUserModifiedBy(user);
+		    					try{
+		    						apiEm.persist(scopeEntity);
+			    					apiEm.getTransaction().commit();
+		    					}catch(Exception e){
+		    						PolicyLogger.error("Exception Occured while inserting a new Entry to PolicyEditorScopes table"+e);
+		    						apiEm.getTransaction().rollback();
+		    					}finally{
+		    						apiEm.close();
+		    					}
+		    				}else{
+	    						PolicyLogger.info("Scope Already Exists in PolicyEditorScopes table, Hence Closing the Transaction");
+	    						apiEm.close();
+	    					}
+		    				
+							policyDBDaoTransaction.commitTransaction();
+							response.setStatus(HttpServletResponse.SC_OK);								
+							response.addHeader("successMapKey", "success");								
+							response.addHeader("policyName", policyAdapter.getPolicyName());
+
+							if (operation.equalsIgnoreCase("update")) {
+								response.addHeader("operation",  "update");
+							} else {
+								response.addHeader("operation", "create");
+							}
+						} else if (successMap.containsKey("EXISTS")) {
+							policyDBDaoTransaction.rollbackTransaction();
+							response.setStatus(HttpServletResponse.SC_CONFLICT);
+							response.addHeader("error", "policyExists");
+							response.addHeader("policyName", policyAdapter.getPolicyName());
+						} else if (successMap.containsKey("fwdberror")) {
+							policyDBDaoTransaction.rollbackTransaction();
+							response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+							response.addHeader("error", "FWDBError");
+							response.addHeader("policyName", policyAdapter.getPolicyName());
+						}else {						
+							policyDBDaoTransaction.rollbackTransaction();
+							response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);								
+							response.addHeader("error", "error");							
+						}						
+					} catch (Exception e) {							
+						policyDBDaoTransaction.rollbackTransaction();
+						String message = XACMLErrorConstants.ERROR_PROCESS_FLOW + 
+								"Could not save policy " + e;
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Could not save policy");
+						response.setStatus(HttpServletResponse.SC_BAD_REQUEST);	
+						response.addHeader("error", "savePolicy");
+						response.addHeader("message", message);
+					}		        	
+				}
+			}
+		}
+	}
+
+	private PolicyRestAdapter setDataToPolicyAdapter(StdPAPPolicy policy, String policyType, String apiflag) throws Exception {
+		PolicyRestAdapter policyAdapter = new PolicyRestAdapter();
+		int highestVersion = 0;
+
+		if (policy.getHighestVersion()!=null) {	
+			highestVersion = policy.getHighestVersion();
+		}
+
+		EntityManager apiEm = null;
+		apiEm = (EntityManager) emf.createEntityManager();
+
+		//
+		// Did it get created?
+		//
+		if (apiEm == null) {
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + 
+					" Error creating entity manager with persistence unit: "
+					+ PERSISTENCE_UNIT);	
+			throw new ServletException("Unable to create Entity Manager Factory");
+		}
+
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+
+		/*
+		 * Getting and Setting the parent path for Admin Console use when reading the policy files
+		 */
+		//domain chosen by the client to store the policy action files 
+		String domain = policy.getDomainDir();
+
+		//adding the domain to the gitPath
+		Path path;
+		String gitPathString = gitPath.toString();
+
+		if (gitPathString.contains("\\")) {
+			path = Paths.get(gitPath + "\\" + policy.getDomainDir());
+		} else {
+			path = Paths.get(gitPath + "/" + policy.getDomainDir());
+
+		}
+		logger.debug("path is: " + path.toString());
+
+		//getting the fullpath of the gitPath and convert to string
+		String policyDir = path.toAbsolutePath().toString();
+		String parentPath = null;
+
+		//creating the parentPath directory for the Admin Console use
+		File file;
+		if(policyDir.contains("\\"))
+		{
+			parentPath = policyDir.replace("ECOMP-PAP-REST", "ecomp-sdk-app");
+			file = new File(parentPath);
+		}
+		else
+		{
+			parentPath = policyDir.replace("pap",  "console");
+			file = new File(parentPath);
+
+		}
+
+		//Get the policy file from the git repository
+		String filePrefix = null;
+		if (policyType.equalsIgnoreCase("Config")) {
+			if (policy.getConfigPolicyType().equalsIgnoreCase("Firewall Config")) {
+				filePrefix = "Config_FW_";
+			}else if (policy.getConfigPolicyType().equalsIgnoreCase("ClosedLoop_Fault")) {
+				filePrefix = "Config_Fault_";
+			}else if (policy.getConfigPolicyType().equalsIgnoreCase("ClosedLoop_PM")) {
+				filePrefix = "Config_PM_";
+			}else if (policy.getConfigPolicyType().equalsIgnoreCase("DCAE Micro Service")) {
+				filePrefix = "Config_MS_";
+			} else if (policy.getConfigPolicyType().equalsIgnoreCase("BRMS_Raw")) {
+				filePrefix = "Config_BRMS_Raw_";
+			} else if (policy.getConfigPolicyType().equalsIgnoreCase("BRMS_Param")) {
+				filePrefix = "Config_BRMS_Param_";
+			}
+			else {
+				filePrefix = "Config_";
+			}
+		} else if (policyType.equalsIgnoreCase("Action")) {
+			filePrefix = "Action_";
+		} else if (policyType.equalsIgnoreCase("Decision")) {
+			filePrefix = "Decision_";
+		}
+
+
+		String pvName = domain + File.separator + filePrefix + policy.getPolicyName();
+
+		//create the directory if it does not exist
+		Boolean fileDir=true;
+		if (!file.exists()){
+			fileDir = new File(parentPath).mkdirs();
+		}
+
+		//set the parent path in the policy adapter
+		if (!fileDir){
+			logger.debug("Unable to create the policy directory");
+		}
+
+		logger.debug("ParentPath is: " + parentPath.toString());
+		policyAdapter.setParentPath(parentPath.toString());
+		policyAdapter.setApiflag(apiflag);
+
+		if (policy.isEditPolicy()) {
+
+			if(apiflag.equalsIgnoreCase("api")) {
+
+				//Get the Highest Version to Update
+				apiEm.getTransaction().begin();
+				Query query = apiEm.createQuery("Select p from PolicyVersion p where p.policyName=:pname");
+				query.setParameter("pname", pvName);
+
+				@SuppressWarnings("rawtypes")
+				List result = query.getResultList();
+				PolicyVersion versionEntity = null;
+				if (!result.isEmpty()) {
+					versionEntity = (PolicyVersion) result.get(0);
+					apiEm.persist(versionEntity);
+					highestVersion = versionEntity.getHigherVersion();
+					int activeVersion = versionEntity.getActiveVersion();
+
+					Calendar calendar = Calendar.getInstance();
+					Timestamp modifyDate = new Timestamp(calendar.getTime().getTime());
+
+					//update table with highestVersion
+					try{
+						versionEntity.setHigherVersion(highestVersion+1);
+						versionEntity.setActiveVersion(activeVersion+1);
+						versionEntity.setCreatedBy("API");
+						versionEntity.setModifiedBy("API");
+						versionEntity.setModifiedDate(modifyDate);
+
+						apiEm.getTransaction().commit();
+
+					}catch(Exception e){
+						apiEm.getTransaction().rollback();
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR");
+					} finally {
+						apiEm.close();
+					}
+				} else {
+					logger.debug("\nNo PolicyVersion using policyName found");
+				}		
+
+			}
+
+			File policyFile = null;
+			if(policy.getOldPolicyFileName() != null && policy.getOldPolicyFileName().endsWith("Draft.1")) {
+				policyFile = new File(parentPath.toString() + File.separator + policy.getOldPolicyFileName() + ".xml");
+			} else {
+				policyFile = new File(parentPath.toString() + File.separator + filePrefix + policy.getPolicyName() +"."+(highestVersion)+ ".xml");
+			}
+
+			if (policyFile.exists()) {
+				DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+				DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+				Document doc = dBuilder.parse(policyFile);
+
+				doc.getDocumentElement().normalize();
+
+				String version = doc.getDocumentElement().getAttribute("Version");
+
+				NodeList rList = doc.getElementsByTagName("Rule");
+				Node rNode = rList.item(0);
+				Element rElement = (Element) rNode;
+
+				String ruleID = null;
+				if (rNode!=null){
+					ruleID = rElement.getAttribute("RuleId");
+				} else {
+					ruleID = newRuleID();
+				}
+
+				policyAdapter.setPolicyID(newPolicyID());
+				policyAdapter.setRuleID(ruleID);
+				policyAdapter.setVersion(version);
+
+			} else {
+				PolicyLogger.error(MessageCodes.ERROR_UNKNOWN + " The policy file at the path " + policyFile + " does not exist.");
+			}
+
+		} else {
+
+			highestVersion = 1;
+			if (apiflag.equalsIgnoreCase("api")) {
+				Calendar calendar = Calendar.getInstance();
+				Timestamp createdDate = new Timestamp(calendar.getTime().getTime());
+
+				apiEm.getTransaction().begin();
+				Query query = apiEm.createQuery("Select p from PolicyVersion p where p.policyName=:pname");
+				query.setParameter("pname", pvName);
+
+				@SuppressWarnings("rawtypes")
+				List result = query.getResultList();
+
+				if (result.isEmpty()) {
+
+					try{
+						PolicyVersion versionEntity = new PolicyVersion();
+						apiEm.persist(versionEntity);
+						versionEntity.setPolicyName(pvName);
+						versionEntity.setHigherVersion(highestVersion);
+						versionEntity.setActiveVersion(highestVersion);
+						versionEntity.setCreatedBy("API");
+						versionEntity.setModifiedBy("API");
+						versionEntity.setCreatedDate(createdDate);
+						versionEntity.setModifiedDate(createdDate);
+
+						apiEm.getTransaction().commit();
+
+					}catch(Exception e){
+						apiEm.getTransaction().rollback();
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR");
+					} finally {
+						apiEm.close();
+					}		
+				}
+			}
+
+			policyAdapter.setPolicyID(newPolicyID());
+			policyAdapter.setRuleID(newRuleID());	
+
+		}
+
+		/*
+		 * set policy adapter values for Building JSON object containing policy data
+		 */
+		//Common among policy types
+		policyAdapter.setPolicyName(policy.getPolicyName());
+		policyAdapter.setPolicyDescription(policy.getPolicyDescription());
+		policyAdapter.setEcompName(policy.getEcompName()); //Config Base and Decision Policies
+		policyAdapter.setHighestVersion(highestVersion);
+		policyAdapter.setRuleCombiningAlgId("urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides");
+		policyAdapter.setUserGitPath(gitPath.toString());
+		policyAdapter.setPolicyType(policyType);
+		policyAdapter.setDynamicFieldConfigAttributes(policy.getDynamicFieldConfigAttributes());
+		policyAdapter.setEditPolicy(policy.isEditPolicy());
+		policyAdapter.setEntityManagerFactory(getEmf());
+
+
+		//Config Specific
+		policyAdapter.setConfigName(policy.getConfigName());  //Base and Firewall
+		policyAdapter.setConfigBodyData(policy.getConfigBodyData()); //Base
+		policyAdapter.setConfigType(policy.getConfigType());  //Base
+		policyAdapter.setJsonBody(policy.getJsonBody()); //Firewall, ClosedLoop, and GoC
+		policyAdapter.setConfigPolicyType(policy.getConfigPolicyType());
+		policyAdapter.setDraft(policy.isDraft()); //ClosedLoop_Fault
+		policyAdapter.setServiceType(policy.getServiceType()); //ClosedLoop_PM
+		policyAdapter.setUuid(policy.getUuid()); //Micro Service
+		policyAdapter.setLocation(policy.getMsLocation()); //Micro Service
+		policyAdapter.setPriority(policy.getPriority()); //Micro Service
+		policyAdapter.setPolicyScope(policy.getDomainDir());
+		policyAdapter.setRiskType(policy.getRiskType()); //Safe Policy Attributes
+		policyAdapter.setRiskLevel(policy.getRiskLevel());//Safe Policy Attributes
+		policyAdapter.setGuard(policy.getGuard());//Safe Policy Attributes
+		policyAdapter.setTtlDate(policy.getTTLDate());//Safe Policy Attributes
+
+		//Action Policy Specific
+		policyAdapter.setActionAttribute(policy.getActionAttribute());  //comboDictValue
+		policyAdapter.setActionPerformer(policy.getActionPerformer());
+		policyAdapter.setDynamicRuleAlgorithmLabels(policy.getDynamicRuleAlgorithmLabels());
+		policyAdapter.setDynamicRuleAlgorithmCombo(policy.getDynamicRuleAlgorithmCombo());
+		policyAdapter.setDynamicRuleAlgorithmField1(policy.getDynamicRuleAlgorithmField1());
+		policyAdapter.setDynamicRuleAlgorithmField2(policy.getDynamicRuleAlgorithmField2());
+
+		//Decision Policy Specific
+		policyAdapter.setDynamicSettingsMap(policy.getDynamicSettingsMap());
+		policyAdapter.setProviderComboBox(policy.getProviderComboBox());
+
+		return policyAdapter;
+	}
+
+	public String	newPolicyID() {
+		return Joiner.on(':').skipNulls().join((XACMLPapServlet.getDomain().startsWith("urn") ? null : "urn"),
+				XACMLPapServlet.getDomain().replaceAll("[/\\\\.]", ":"), 
+				"xacml", "policy", "id", UUID.randomUUID());
+	}
+
+	public String	newRuleID() {
+		return Joiner.on(':').skipNulls().join((XACMLPapServlet.getDomain().startsWith("urn") ? null : "urn"),
+				XACMLPapServlet.getDomain().replaceAll("[/\\\\.]", ":"), 
+				"xacml", "rule", "id", UUID.randomUUID());
+	}
+
+	public static String	getDomain() {
+		return XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DOMAIN, "urn");
+	}
+
+
+	/**
+	 * Requests from the Admin Console for operations not on single specific objects
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doACPost(HttpServletRequest request, HttpServletResponse response, String groupId, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+		PolicyDBDaoTransaction doACPostTransaction = null;
+
+		try {
+			String groupName = request.getParameter("groupName");
+			String groupDescription = request.getParameter("groupDescription");
+			String apiflag = request.getParameter("apiflag");
+
+			if (groupName != null && groupDescription != null) {
+				// Args:	      group=<groupId> groupName=<name> groupDescription=<description>            <= create a new group
+				loggingContext.setServiceName("AC:PAP.createGroup");
+
+				String unescapedName = URLDecoder.decode(groupName, "UTF-8");
+				String unescapedDescription = URLDecoder.decode(groupDescription, "UTF-8");
+				PolicyDBDaoTransaction newGroupTransaction = policyDBDao.getNewTransaction();
+				try {					
+					newGroupTransaction.createGroup(PolicyDBDao.createNewPDPGroupId(unescapedName), unescapedName, unescapedDescription,"XACMLPapServlet.doACPost");
+					papEngine.newGroup(unescapedName, unescapedDescription);
+					newGroupTransaction.commitTransaction();
+				} catch (Exception e) {
+					newGroupTransaction.rollbackTransaction();
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Unable to create new group");
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(500, "Unable to create new group '" + groupId + "'");
+					return;
+				}
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				if (logger.isDebugEnabled()) {
+					logger.debug("New Group '" + groupId + "' created");
+				}
+				// tell the Admin Consoles there is a change
+				notifyAC();
+				// new group by definition has no PDPs, so no need to notify them of changes
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			}
+
+			// for all remaining POST operations the group must exist before the operation can be done
+			EcompPDPGroup group = papEngine.getGroup(groupId);
+			if (group == null) {
+				String message = "Unknown groupId '" + groupId + "'";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				if (apiflag!=null){
+					response.addHeader("error", "unknownGroupId");
+					response.addHeader("operation", "push");
+					response.addHeader("message", message);
+					response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+				} else {
+					response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+				}
+				return;
+			}
+
+			// determine the operation needed based on the parameters in the request
+			if (request.getParameter("policyId") != null) {
+				//	Args:        group=<groupId> policy=<policyId>		<= copy file
+				// copy a policy from the request contents into a file in the group's directory on this machine
+				if(apiflag!=null){
+					loggingContext.setServiceName("PolicyEngineAPI:PAP.postPolicy");
+				} else {
+					loggingContext.setServiceName("AC:PAP.postPolicy");
+				}
+
+				String policyId = request.getParameter("policyId");
+				PolicyDBDaoTransaction addPolicyToGroupTransaction = policyDBDao.getNewTransaction();
+				try {
+					InputStream is = null;
+					if (apiflag != null){
+						// get the request content into a String if the request is from API 
+						String json = null;
+						// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+						java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+						scanner.useDelimiter("\\A");
+						json =  scanner.hasNext() ? scanner.next() : "";
+						scanner.close();
+						logger.info("JSON request from API: " + json);
+
+						// convert Object sent as JSON into local object
+						ObjectMapper mapper = new ObjectMapper();
+
+						Object objectFromJSON = mapper.readValue(json, StdPAPPolicy.class);
+
+						StdPAPPolicy policy = (StdPAPPolicy) objectFromJSON;
+
+						is = new FileInputStream(new File(policy.getLocation()));
+					} else {
+						is = request.getInputStream();
+
+					}
+
+					addPolicyToGroupTransaction.addPolicyToGroup(group.getId(), policyId,"XACMLPapServlet.doACPost");
+					((StdPDPGroup) group).copyPolicyToFile(policyId, is);
+					addPolicyToGroupTransaction.commitTransaction();
+
+				} catch (Exception e) {
+					addPolicyToGroupTransaction.rollbackTransaction();
+					String message = "Policy '" + policyId + "' not copied to group '" + groupId +"': " + e;
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " " + message);
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+
+					if (apiflag!=null){
+						response.addHeader("error", "policyCopyError");
+						response.addHeader("message", message);
+						response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+					} else {
+						response.sendError(500, message);
+					}
+					return;
+				}
+
+				// policy file copied ok and the Group was updated on the PDP
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				response.addHeader("operation", "push");
+				response.addHeader("policyId", policyId);
+				response.addHeader("groupId", groupId);
+				if (logger.isDebugEnabled()) {
+					logger.debug("policy '" + policyId + "' copied to directory for group '" + groupId + "'");
+				}
+
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+
+			} else if (request.getParameter("default") != null) {
+				// Args:       group=<groupId> default=true               <= make default
+				// change the current default group to be the one identified in the request.
+				loggingContext.setServiceName("AC:PAP.setDefaultGroup");
+				//
+				// This is a POST operation rather than a PUT "update group" because of the side-effect that the current default group is also changed.
+				// It should never be the case that multiple groups are currently marked as the default, but protect against that anyway.
+				PolicyDBDaoTransaction setDefaultGroupTransaction = policyDBDao.getNewTransaction();
+				try {
+					setDefaultGroupTransaction.changeDefaultGroup(group, "XACMLPapServlet.doACPost");
+					papEngine.SetDefaultGroup(group);
+					setDefaultGroupTransaction.commitTransaction();
+				} catch (Exception e) {
+					setDefaultGroupTransaction.rollbackTransaction();
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Unable to set group");
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(500, "Unable to set group '" + groupId + "' to default");
+					return;
+				}
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				if (logger.isDebugEnabled()) {
+					logger.debug("Group '" + groupId + "' set to be default");
+				}
+				// Notify the Admin Consoles that something changed
+				// For now the AC cannot handle anything more detailed than the whole set of PDPGroups, so just notify on that
+				//TODO - Future: FIGURE OUT WHAT LEVEL TO NOTIFY: 2 groups or entire set - currently notify AC to update whole configuration of all groups
+				notifyAC();
+				// This does not affect any PDPs in the existing groups, so no need to notify them of this change
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+
+			} else if (request.getParameter("pdpId") != null) {
+				doACPostTransaction = policyDBDao.getNewTransaction();
+				// Args:       group=<groupId> pdpId=<pdpId>               <= move PDP to group
+				loggingContext.setServiceName("AC:PAP.movePDP");
+
+				String pdpId = request.getParameter("pdpId");
+				EcompPDP pdp = papEngine.getPDP(pdpId);
+
+				EcompPDPGroup originalGroup = papEngine.getPDPGroup((EcompPDP) pdp);
+				try{
+					doACPostTransaction.movePdp(pdp, group, "XACMLPapServlet.doACPost");
+				}catch(Exception e){	
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", 
+							" Error while moving pdp in the database: "
+									+"pdp="+pdp.getId()+",to group="+group.getId());
+					throw new PAPException(e.getMessage());
+				}
+				papEngine.movePDP((EcompPDP) pdp, group);
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				if (logger.isDebugEnabled()) {
+					logger.debug("PDP '" + pdp.getId() +"' moved to group '" + group.getId() + "' set to be default");
+				}
+
+				// update the status of both the original group and the new one
+				((StdPDPGroup)originalGroup).resetStatus();
+				((StdPDPGroup)group).resetStatus();
+
+				// Notify the Admin Consoles that something changed
+				// For now the AC cannot handle anything more detailed than the whole set of PDPGroups, so just notify on that
+				notifyAC();
+				// Need to notify the PDP that it's config may have changed
+				pdpChanged(pdp);
+				doACPostTransaction.commitTransaction();
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+
+
+			}
+		} catch (PAPException e) {
+			if(doACPostTransaction != null){
+				doACPostTransaction.rollbackTransaction();
+			}
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " AC POST exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(500, e.getMessage());
+			return;
+		}
+	}
+
+	/**
+	 * Requests from the Admin Console to create new items or update existing ones
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doACPut(HttpServletRequest request, HttpServletResponse response, String groupId, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+		PolicyDBDaoTransaction acPutTransaction = policyDBDao.getNewTransaction();
+		try {
+
+
+			// for PUT operations the group may or may not need to exist before the operation can be done
+			EcompPDPGroup group = papEngine.getGroup(groupId);
+
+			// determine the operation needed based on the parameters in the request
+
+			// for remaining operations the group must exist before the operation can be done
+			if (group == null) {
+				String message = "Unknown groupId '" + groupId + "'";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+				return;
+			}
+			if (request.getParameter("policy") != null) {
+				//        group=<groupId> policy=<policyId> contents=policy file               <= Create new policy file in group dir, or replace it if it already exists (do not touch properties)
+				loggingContext.setServiceName("AC:PAP.putPolicy");
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " PARTIALLY IMPLEMENTED!!!  ACTUAL CHANGES SHOULD BE MADE BY PAP SERVLET!!! ");
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			} else if (request.getParameter("pdpId") != null) {
+				// ARGS:        group=<groupId> pdpId=<pdpId/URL>          <= create a new PDP or Update an Existing one
+
+				String pdpId = request.getParameter("pdpId");
+				if (papEngine.getPDP(pdpId) == null) {
+					loggingContext.setServiceName("AC:PAP.createPDP");
+				} else {
+					loggingContext.setServiceName("AC:PAP.updatePDP");
+				}
+
+				// get the request content into a String
+				String json = null;
+				// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+				java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+				scanner.useDelimiter("\\A");
+				json =  scanner.hasNext() ? scanner.next() : "";
+				scanner.close();
+				logger.info("JSON request from AC: " + json);
+
+				// convert Object sent as JSON into local object
+				ObjectMapper mapper = new ObjectMapper();
+
+				Object objectFromJSON = mapper.readValue(json, StdPDP.class);
+
+				if (pdpId == null ||
+						objectFromJSON == null ||
+						! (objectFromJSON instanceof StdPDP) ||
+						((StdPDP)objectFromJSON).getId() == null ||
+						! ((StdPDP)objectFromJSON).getId().equals(pdpId)) {
+					PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " PDP new/update had bad input. pdpId=" + pdpId + " objectFromJSON="+objectFromJSON);
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(500, "Bad input, pdpid="+pdpId+" object="+objectFromJSON);
+				}
+				StdPDP pdp = (StdPDP) objectFromJSON;
+
+				if (papEngine.getPDP(pdpId) == null) {
+					// this is a request to create a new PDP object
+					try{
+						acPutTransaction.addPdpToGroup(pdp.getId(), group.getId(), pdp.getName(), pdp.getDescription(), pdp.getJmxPort(),"XACMLPapServlet.doACPut");
+					} catch(Exception e){
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Error while adding pdp to group in the database: "
+								+"pdp="+pdp.getId()+",to group="+group.getId());
+						throw new PAPException(e.getMessage());
+					}
+					papEngine.newPDP(pdp.getId(), group, pdp.getName(), pdp.getDescription(), pdp.getJmxPort());
+				} else {
+					try{
+						acPutTransaction.updatePdp(pdp, "XACMLPapServlet.doACPut");
+					} catch(Exception e){
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Error while updating pdp in the database: "
+								+"pdp="+pdp.getId());
+						throw new PAPException(e.getMessage());
+					}
+					// this is a request to update the pdp
+					papEngine.updatePDP(pdp);
+				}
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				if (logger.isDebugEnabled()) {
+					logger.debug("PDP '" + pdpId + "' created/updated");
+				}
+
+				// adjust the group's state including the new PDP
+				((StdPDPGroup)group).resetStatus();
+
+				// tell the Admin Consoles there is a change
+				notifyAC();
+				// this might affect the PDP, so notify it of the change
+				pdpChanged(pdp);
+				acPutTransaction.commitTransaction();
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			} else if (request.getParameter("pipId") != null) {
+				//                group=<groupId> pipId=<pipEngineId> contents=pip properties              <= add a PIP to pip config, or replace it if it already exists (lenient operation) 
+				loggingContext.setServiceName("AC:PAP.putPIP");
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " UNIMPLEMENTED");
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
+				return;
+			} else {
+				// Assume that this is an update of an existing PDP Group
+				// ARGS:        group=<groupId>         <= Update an Existing Group
+				loggingContext.setServiceName("AC:PAP.updateGroup");
+
+				// get the request content into a String
+				String json = null;
+				// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+				java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+				scanner.useDelimiter("\\A");
+				json =  scanner.hasNext() ? scanner.next() : "";
+				scanner.close();
+				logger.info("JSON request from AC: " + json);
+
+				// convert Object sent as JSON into local object
+				ObjectMapper mapper = new ObjectMapper();
+
+				Object objectFromJSON  = mapper.readValue(json, StdPDPGroup.class);
+
+				if (objectFromJSON == null ||
+						! (objectFromJSON instanceof StdPDPGroup) ||
+						! ((StdPDPGroup)objectFromJSON).getId().equals(group.getId())) {
+					PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Group update had bad input. id=" + group.getId() + " objectFromJSON="+objectFromJSON);
+					loggingContext.transactionEnded();
+
+					PolicyLogger.audit("Transaction Failed - See Error.log");
+					response.sendError(500, "Bad input, id="+group.getId() +" object="+objectFromJSON);
+				}
+
+				// The Path on the PAP side is not carried on the RESTful interface with the AC
+				// (because it is local to the PAP)
+				// so we need to fill that in before submitting the group for update
+				((StdPDPGroup)objectFromJSON).setDirectory(((StdPDPGroup)group).getDirectory());
+
+				try{
+					acPutTransaction.updateGroup((StdPDPGroup)objectFromJSON, "XACMLPapServlet.doACPut");
+				} catch(Exception e){
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " Error while updating group in the database: "
+							+"group="+group.getId());
+					throw new PAPException(e.getMessage());
+				}
+				papEngine.updateGroup((StdPDPGroup)objectFromJSON);
+
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				if (logger.isDebugEnabled()) {
+					logger.debug("Group '" + group.getId() + "' updated");
+				}
+				acPutTransaction.commitTransaction();
+				// tell the Admin Consoles there is a change
+				notifyAC();
+				// Group changed, which might include changing the policies
+				groupChanged(group);
+
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			}
+		} catch (PAPException e) {
+			acPutTransaction.rollbackTransaction();
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " AC PUT exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.sendError(500, e.getMessage());
+			return;
+		}
+	}
+
+	/**
+	 * Requests from the Admin Console to delete/remove items
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doACDelete(HttpServletRequest request, HttpServletResponse response, String groupId, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+
+		//This is temporary code to allow deletes to propagate to the database since delete is not implemented
+		String isDeleteNotify = request.getParameter("isDeleteNotify");
+		if(isDeleteNotify != null){
+			String policyToDelete = request.getParameter("policyToDelete");
+			try{
+				policyToDelete = URLDecoder.decode(policyToDelete,"UTF-8");
+			} catch(UnsupportedEncodingException e){
+				PolicyLogger.error("Unsupported URL encoding of policyToDelete (UTF-8");
+				response.sendError(500,"policyToDelete encoding not supported");
+				return;
+			}
+			PolicyDBDaoTransaction deleteTransaction = policyDBDao.getNewTransaction();
+			try{
+				deleteTransaction.deletePolicy(policyToDelete);
+			} catch(Exception e){
+				deleteTransaction.rollbackTransaction();
+				response.sendError(500,"deleteTransaction.deleteTransaction(policyToDelete) "
+						+ "\nfailure with the following exception: " + e);
+				return;
+			}
+			deleteTransaction.commitTransaction();
+			response.setStatus(HttpServletResponse.SC_OK);
+			return;
+		}
+		PolicyDBDaoTransaction removePdpOrGroupTransaction = policyDBDao.getNewTransaction();
+		try {
+			// for all DELETE operations the group must exist before the operation can be done
+			loggingContext.setServiceName("AC:PAP.delete");
+			EcompPDPGroup group = papEngine.getGroup(groupId);
+			if (group == null) {
+				String message = "Unknown groupId '" + groupId + "'";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_NOT_FOUND, "Unknown groupId '" + groupId +"'");
+				return;
+			}
+
+
+			// determine the operation needed based on the parameters in the request
+			if (request.getParameter("policy") != null) {
+				//        group=<groupId> policy=<policyId>  [delete=<true|false>]       <= delete policy file from group
+				loggingContext.setServiceName("AC:PAP.deletePolicy");
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " UNIMPLEMENTED");
+				//DATABASE so can policies not be deleted? or doesn't matter maybe as long as this gets called
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
+				return;
+			} else if (request.getParameter("pdpId") != null) {
+				// ARGS:        group=<groupId> pdpId=<pdpId>                  <= delete PDP 
+				String pdpId = request.getParameter("pdpId");
+				EcompPDP pdp = papEngine.getPDP(pdpId);
+
+				try{
+					removePdpOrGroupTransaction.removePdpFromGroup(pdp.getId(),"XACMLPapServlet.doACDelete");
+				} catch(Exception e){
+					throw new PAPException();
+				}
+				papEngine.removePDP((EcompPDP) pdp);
+
+				// adjust the status of the group, which may have changed when we removed this PDP
+				((StdPDPGroup)group).resetStatus();
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				notifyAC();
+
+				// update the PDP and tell it that it has NO Policies (which prevents it from serving PEP Requests)
+				pdpChanged(pdp);
+				removePdpOrGroupTransaction.commitTransaction();
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			} else if (request.getParameter("pipId") != null) {
+				//        group=<groupId> pipId=<pipEngineId> <= delete PIP config for given engine
+
+				loggingContext.setServiceName("AC:PAP.deletePIPConfig");
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " UNIMPLEMENTED");
+				loggingContext.transactionEnded();
+
+				PolicyLogger.audit("Transaction Failed - See Error.log");
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
+				return;
+			} else {
+				// ARGS:      group=<groupId> movePDPsToGroupId=<movePDPsToGroupId>            <= delete a group and move all its PDPs to the given group
+				String moveToGroupId = request.getParameter("movePDPsToGroupId");
+				EcompPDPGroup moveToGroup = null;
+				if (moveToGroupId != null) {
+					moveToGroup = papEngine.getGroup(moveToGroupId);
+				}
+
+				// get list of PDPs in the group being deleted so we can notify them that they got changed
+				Set<EcompPDP> movedPDPs = new HashSet<EcompPDP>();
+				movedPDPs.addAll(group.getEcompPdps());
+
+				// do the move/remove
+				try{
+					removePdpOrGroupTransaction.deleteGroup(group, moveToGroup,"XACMLPapServlet.doACDelete");
+				} catch(Exception e){
+					PolicyLogger.error(MessageCodes.ERROR_UNKNOWN, e, "XACMLPapServlet", " Failed to delete PDP Group. Exception");
+					e.printStackTrace();
+					throw new PAPException(e.getMessage());
+				}
+				papEngine.removeGroup(group, moveToGroup);
+
+				response.setStatus(HttpServletResponse.SC_NO_CONTENT);
+				notifyAC();
+				// notify any PDPs in the removed set that their config may have changed
+				for (EcompPDP pdp : movedPDPs) {
+					pdpChanged(pdp);
+				}
+				removePdpOrGroupTransaction.commitTransaction();
+				loggingContext.transactionEnded();
+				auditLogger.info("Success");
+				PolicyLogger.audit("Transaction Ended Successfully");
+				return;
+			}
+
+		} catch (PAPException e) {
+			removePdpOrGroupTransaction.rollbackTransaction();
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " AC DELETE exception");
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Exception in request processing");
+			response.sendError(500, e.getMessage());
+			return;
+		}
+	}
+
+
+	/**
+	 * Requests from the API to delete/remove items
+	 * 
+	 * @param request
+	 * @param response
+	 * @param groupId
+	 * @param loggingContext 
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	private void doAPIDeleteFromPAP(HttpServletRequest request, HttpServletResponse response, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+
+		// get the request content into a String
+		String json = null;
+
+		// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+		java.util.Scanner scanner = new java.util.Scanner(request.getInputStream());
+		scanner.useDelimiter("\\A");
+		json =  scanner.hasNext() ? scanner.next() : "";
+		scanner.close();
+		logger.info("JSON request from API: " + json);
+
+		// convert Object sent as JSON into local object
+		ObjectMapper mapper = new ObjectMapper();
+
+		Object objectFromJSON = mapper.readValue(json, StdPAPPolicy.class);
+
+		StdPAPPolicy policy = (StdPAPPolicy) objectFromJSON;
+
+		String policyName = policy.getPolicyName();
+		String fileSeparator = File.separator;
+		policyName = policyName.replaceFirst("\\.", "\\"+fileSeparator);
+
+		File file = getPolicyFile(policyName);
+		String domain = getParentPathSubScopeDir(file);
+		Boolean policyFileDeleted = false;
+		Boolean configFileDeleted = false;
+		Boolean policyVersionScoreDeleted = false;
+
+		if (policy.getDeleteCondition().equalsIgnoreCase("All Versions")){
+
+			//check for extension in policyName
+			String removexmlExtension = null;
+			String removeVersion = null;
+			if (policyName.contains("xml")) {
+				removexmlExtension = file.toString().substring(0, file.toString().lastIndexOf("."));
+				removeVersion = removexmlExtension.substring(0, removexmlExtension.lastIndexOf("."));
+			} else {
+				removeVersion = file.toString();
+			}
+
+			File dirXML = new File(file.getParent());
+			File[] listofXMLFiles = dirXML.listFiles();
+
+			for (File files : listofXMLFiles) {
+				//delete the xml files from the Repository
+				if (files.isFile() && files.toString().contains(removeVersion)) {
+					JPAUtils jpaUtils = null;
+					try {
+						jpaUtils = JPAUtils.getJPAUtilsInstance(emf);
+					} catch (Exception e) {
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " Could not create JPAUtils instance on the PAP");
+						e.printStackTrace();
+						response.addHeader("error", "jpautils");
+						response.addHeader("operation", "delete");
+						response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+						return;
+					}
+
+					if (jpaUtils.dbLockdownIgnoreErrors()) {
+						logger.warn("Policies are locked down");
+						response.addHeader("operation", "delete");
+						response.addHeader("lockdown", "true");
+						response.setStatus(HttpServletResponse.SC_ACCEPTED);
+						return;
+					}
+
+					//Propagates delete to the database 
+					Boolean deletedFromDB = notifyDBofDelete(files.toString());
+
+					if (deletedFromDB) {
+						logger.info("Policy deleted from the database.  Continuing with file delete");
+					} else {
+						PolicyLogger.error("Failed to delete Policy from database. Aborting file delete");
+						response.addHeader("error", "deleteDB");
+						response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+						return;
+					}
+
+					if (files.delete()) {
+						if (logger.isDebugEnabled()) {
+							logger.debug("Deleted file: " + files.toString());
+						}
+						policyFileDeleted = true;
+					} else {
+						logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + 
+								"Cannot delete the policy file in specified location: " + files.getAbsolutePath());	
+						response.addHeader("error", "deleteFile");
+						response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+						return;
+					}
+
+					// Get tomcat home directory for deleting config data
+					logger.info("print the path:" +domain);
+					String path = domain.replace('\\', '.');
+					if(path.contains("/")){
+						path = path.replace('/', '.');
+						logger.info("print the path:" +path);
+					}
+					String fileName = FilenameUtils.removeExtension(file.getName());
+					String removeVersionInFileName = fileName.substring(0, fileName.lastIndexOf("."));
+					String fileLocation = null;
+
+					if(CONFIG_HOME == null){
+						CONFIG_HOME = getConfigHome();
+					}
+					if(ACTION_HOME == null){
+						ACTION_HOME = getActionHome();
+					}
+
+
+					if (fileName != null && fileName.contains("Config_")) {
+						fileLocation = CONFIG_HOME;
+					} else if (fileName != null && fileName.contains("Action_")) {
+						fileLocation = ACTION_HOME;
+					}
+
+					if (logger.isDebugEnabled()) {
+						logger.debug("Attempting to rename file from the location: "+ fileLocation);
+					}
+
+					if(!files.toString().contains("Decision_")){
+						// Get the file from the saved location
+						File dir = new File(fileLocation);
+						File[] listOfFiles = dir.listFiles();
+
+						for (File file1 : listOfFiles) {
+							if (file1.isFile() && file1.getName().contains( path + removeVersionInFileName)) {
+								try {
+									if (file1.delete()) {
+										if (logger.isDebugEnabled()) {
+											logger.debug("Deleted file: " + file1.toString());
+										}
+										configFileDeleted = true;
+									} else {
+										logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + 
+												"Cannot delete the configuration or action body file in specified location: " + file1.getAbsolutePath());	
+										response.addHeader("error", "deleteConfig");
+										response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+										return;
+									}
+								} catch (Exception e) {
+									PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " Failed to Delete file");	
+								}
+							}
+							configFileDeleted = true;
+						}
+					} else {
+						configFileDeleted = true;
+					}
+
+					//Delete the Policy from Database Policy Version table
+					if (policyFileDeleted && configFileDeleted) {
+						String removeExtension = domain + removeVersionInFileName;
+						EntityManager em = (EntityManager) emf.createEntityManager();
+
+						Query getPolicyVersion = em.createQuery("Select p from PolicyVersion p where p.policyName=:pname");
+						Query getPolicyScore = em.createQuery("Select p from PolicyScore p where p.PolicyName=:pname");
+						getPolicyVersion.setParameter("pname", removeExtension);
+						getPolicyScore.setParameter("pname", removeExtension);
+
+						@SuppressWarnings("rawtypes")
+						List pvResult = getPolicyVersion.getResultList();
+						@SuppressWarnings("rawtypes")
+						List psResult = getPolicyScore.getResultList();
+
+
+						try{
+							em.getTransaction().begin();
+							if (!pvResult.isEmpty()) {
+								for (Object id : pvResult) {
+									PolicyVersion versionEntity = (PolicyVersion)id;	
+									em.remove(versionEntity);
+								}
+							} else {
+								logger.debug("No PolicyVersion record found in database.");
+							}
+
+							if (!psResult.isEmpty()) {				
+								for (Object id : psResult) {
+									PolicyScore scoreEntity = (PolicyScore)id;	
+									em.remove(scoreEntity);
+								}
+							} else {
+								PolicyLogger.error("No PolicyScore record found in database.");
+							}
+							em.getTransaction().commit();
+							policyVersionScoreDeleted = true;
+						}catch(Exception e){
+							em.getTransaction().rollback();
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR");
+							response.addHeader("error", "deleteDB");
+							response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+							return;
+						} finally {
+							em.close();
+						}
+					}
+				}
+			}
+			//If Specific version is requested for delete
+		} else if (policy.getDeleteCondition().equalsIgnoreCase("Current Version")) {
+			String policyScoreName = domain + file.getName().toString();
+			String policyVersionName = policyScoreName.substring(0, policyScoreName.indexOf("."));
+			String versionExtension = policyScoreName.substring(policyScoreName.indexOf(".")+1);
+			String removexmlExtension = file.toString().substring(0, file.toString().lastIndexOf("."));
+			String getVersion = removexmlExtension.substring(removexmlExtension.indexOf(".")+1);
+			String removeVersion = removexmlExtension.substring(0, removexmlExtension.lastIndexOf("."));
+
+
+			JPAUtils jpaUtils = null;
+			try {
+				jpaUtils = JPAUtils.getJPAUtilsInstance(emf);
+			} catch (Exception e) {
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " Could not create JPAUtils instance on the PAP");
+				e.printStackTrace();
+				response.addHeader("error", "jpautils");
+				response.addHeader("operation", "delete");
+				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+				return;
+			}
+
+			if (jpaUtils.dbLockdownIgnoreErrors()) {
+				logger.warn("Policies are locked down");
+				response.addHeader("lockdown", "true");
+				response.addHeader("operation", "delete");
+				response.setStatus(HttpServletResponse.SC_ACCEPTED);
+				return;
+			}
+
+			//Propagates delete to the database 
+			Boolean deletedFromDB = notifyDBofDelete(file.toString());
+
+			if (deletedFromDB) {
+				logger.info("Policy deleted from the database.  Continuing with file delete");
+			} else {
+				PolicyLogger.error("Failed to delete Policy from database. Aborting file delete");
+				response.addHeader("error", "deleteDB");
+				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+				return;
+			}
+
+			if (file.delete()) {
+				if (logger.isDebugEnabled()) {
+					logger.debug("Deleted file: " + file.toString());
+				}
+				policyFileDeleted = true;
+			} else {
+				logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + 
+						"Cannot delete the policy file in specified location: " + file.getAbsolutePath());	
+				response.addHeader("error", "deleteFile");
+				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+				return;
+			}
+
+			// Get tomcat home directory for deleting config data
+			logger.info("print the path:" +domain);
+			String path = domain.replace('\\', '.');
+			if(path.contains("/")){
+				path = path.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			String fileName = FilenameUtils.removeExtension(file.getName());
+			String removeVersionInFileName = fileName.substring(0, fileName.lastIndexOf("."));
+			String fileLocation = null;
+
+			if(CONFIG_HOME == null){
+				CONFIG_HOME = getConfigHome();
+			}
+			if(ACTION_HOME == null){
+				ACTION_HOME = getActionHome();
+			}
+
+
+			if (fileName != null && fileName.contains("Config_")) {
+				fileLocation = CONFIG_HOME;
+			} else if (fileName != null && fileName.contains("Action_")) {
+				fileLocation = ACTION_HOME;
+			}
+
+			if (logger.isDebugEnabled()) {
+				logger.debug("Attempting to rename file from the location: "+ fileLocation);
+			}
+
+			if(!file.toString().contains("Decision_")){
+				// Get the file from the saved location
+				File dir = new File(fileLocation);
+				File[] listOfFiles = dir.listFiles();
+
+				for (File file1 : listOfFiles) {
+					if (file1.isFile() && file1.getName().contains( path + fileName)) {
+						try {
+							if (file1.delete()) {
+								if (logger.isDebugEnabled()) {
+									logger.debug("Deleted file: " + file1.toString());
+								}
+								configFileDeleted = true;
+							} else {
+								logger.warn(XACMLErrorConstants.ERROR_DATA_ISSUE + 
+										"Cannot delete the configuration or action body file in specified location: " + file1.getAbsolutePath());	
+								response.addHeader("error", "deleteConfig");
+								response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+								return;
+							}
+						} catch (Exception e) {
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " Failed to Delete file");		
+						}
+					}
+					configFileDeleted = true;
+				}
+			} else {
+				configFileDeleted = true;
+			}
+
+			//Delete the Policy from Database and set Active Version based on the deleted file.
+			int highestVersion = 0;
+			if (policyFileDeleted && configFileDeleted) {
+				String removeExtension = domain + removeVersionInFileName;
+				EntityManager em = (EntityManager) emf.createEntityManager();
+
+				Query getPolicyVersion = em.createQuery("Select p from PolicyVersion p where p.policyName=:pname");
+				Query getPolicyScore = em.createQuery("Select p from PolicyScore p where p.PolicyName=:pname");
+				getPolicyVersion.setParameter("pname", removeExtension);
+				getPolicyScore.setParameter("pname", removeExtension);
+
+				@SuppressWarnings("rawtypes")
+				List pvResult = getPolicyVersion.getResultList();
+				@SuppressWarnings("rawtypes")
+				List psResult = getPolicyScore.getResultList();
+
+
+				try{
+					em.getTransaction().begin();
+					if (!pvResult.isEmpty()) {
+						PolicyVersion versionEntity = null;
+						for (Object id : pvResult) {
+							versionEntity = (PolicyVersion)id;
+							if(versionEntity.getPolicyName().equals(removeExtension)){
+								highestVersion = versionEntity.getHigherVersion();
+								em.remove(versionEntity);
+							}
+						}
+
+						int i = 0;
+						int version = Integer.parseInt(getVersion);
+
+						if(version == highestVersion) {
+							for(i = highestVersion; i>=1; i--){
+								highestVersion = highestVersion - 1;
+								String dirXML = removeVersion + "." + highestVersion + ".xml";
+								File filenew = new File(dirXML);
+
+								if(filenew.exists()){
+									break;
+								}
+
+							}
+						}
+
+						versionEntity.setPolicyName(removeExtension);
+						versionEntity.setHigherVersion(highestVersion);
+						versionEntity.setActiveVersion(highestVersion);
+						versionEntity.setModifiedBy("API");	
+
+						em.persist(versionEntity);
+
+					} else {
+						logger.debug("No PolicyVersion record found in database.");
+					}
+
+					if (!psResult.isEmpty()) {				
+						for (Object id : psResult) {
+							PolicyScore scoreEntity = (PolicyScore)id;	
+							if(scoreEntity.getPolicyName().equals(policyVersionName) && scoreEntity.getVersionExtension().equals(versionExtension)){
+								em.remove(scoreEntity);
+							}
+						}
+					} else {
+						PolicyLogger.error("No PolicyScore record found in database.");
+					}
+					em.getTransaction().commit();
+					policyVersionScoreDeleted = true;
+				}catch(Exception e){
+					em.getTransaction().rollback();
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "XACMLPapServlet", " ERROR");
+					response.addHeader("error", "deleteDB");
+					response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+					return;
+				} finally {
+					em.close();
+				}
+			}
+		}
+
+		if (policyFileDeleted && configFileDeleted && policyVersionScoreDeleted) {
+			response.setStatus(HttpServletResponse.SC_OK);
+			response.addHeader("successMapKey", "success");
+			response.addHeader("operation", "delete");
+			return;				
+		} else {
+			PolicyLogger.error(MessageCodes.ERROR_UNKNOWN + "Failed to delete the policy for an unknown reason.  Check the file system and other logs for further information.");
+
+			response.addHeader("error", "unknown");
+			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+			return;
+		}
+
+	}
+
+	private void doImportMicroServicePut(HttpServletRequest request, HttpServletResponse response) {
+		String importServiceCreation = request.getParameter("importService");;
+		String fileName = request.getParameter("fileName");
+		String version = request.getParameter("version");
+		String serviceName = request.getParameter("serviceName");
+		CreateNewMicroSerivceModel newMS = null;
+
+		String randomID = UUID.randomUUID().toString();
+
+		if ( importServiceCreation != null  || fileName != null) {
+			File extracDir = new File("ExtractDir");
+			if (!extracDir.exists()){
+				extracDir.mkdirs();
+			}
+			if (fileName.contains(".xmi")){
+				// get the request content into a String
+				String xmi = null;
+
+				// read the inputStream into a buffer (trick found online scans entire input looking for end-of-file)
+				java.util.Scanner scanner;
+				try {
+					scanner = new java.util.Scanner(request.getInputStream());
+					scanner.useDelimiter("\\A");
+					xmi =  scanner.hasNext() ? scanner.next() : "";
+					scanner.close();
+				} catch (IOException e1) {
+					logger.error("Error in reading in file from API call");
+					return;
+				}
+
+				logger.info("XML request from API for import new Service");
+
+				//Might need to seperate by , for more than one file. 
+
+				try (Writer writer = new BufferedWriter(new OutputStreamWriter(
+						new FileOutputStream("ExtractDir" + File.separator + randomID+".xmi"), "utf-8"))) {
+					writer.write(xmi);
+				} catch (IOException e) {
+					logger.error("Error in reading in file from API call");
+					return;
+				}
+			}else{ 
+				try {	
+					InputStream inputStream = request.getInputStream() ; 
+
+					FileOutputStream outputStream = new FileOutputStream("ExtractDir" + File.separator + randomID+".zip"); 
+					byte[] buffer = new byte[4096];
+					int bytesRead = -1 ; 
+					while ((bytesRead = inputStream.read(buffer)) != -1) { 
+						outputStream.write(buffer, 0, bytesRead) ; 
+					} 
+
+					outputStream.close() ; 
+					inputStream.close() ;
+
+				} catch (IOException e) {
+					logger.error("Error in reading in Zip File from API call");
+					return;
+				}
+			}
+
+			newMS =  new CreateNewMicroSerivceModel(fileName, serviceName, "API IMPORT", version, randomID);
+			Map<String, String> successMap = newMS.addValuesToNewModel();
+			if (successMap.containsKey("success")) {
+				successMap.clear();
+				successMap = newMS.saveImportService();
+			}
+
+
+			// create the policy and return a response to the PAP-ADMIN		    
+			if (successMap.containsKey("success")) {							
+				response.setStatus(HttpServletResponse.SC_OK);								
+				response.addHeader("successMapKey", "success");								
+				response.addHeader("operation", "import");
+				response.addHeader("service", serviceName);
+			} else if (successMap.containsKey("DBError")) {
+				if (successMap.get("DBError").contains("EXISTS")){
+					response.setStatus(HttpServletResponse.SC_CONFLICT);
+					response.addHeader("service", serviceName);
+					response.addHeader("error", "modelExistsDB");
+				}else{
+					response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+					response.addHeader("error", "importDB");
+				}
+				response.addHeader("operation", "import");
+				response.addHeader("service", serviceName);
+			}else if (successMap.get("error").contains("MISSING")){
+				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+				response.addHeader("error", "missing");	
+				response.addHeader("operation", "import");
+				response.addHeader("service", serviceName);
+			}
+		}
+	}
+
+	private void doAPIDeleteFromPDP(HttpServletRequest request, HttpServletResponse response, ECOMPLoggingContext loggingContext) throws ServletException, IOException {
+
+		String policyName = request.getParameter("policyName");
+		String groupId = request.getParameter("groupId");
+		String responseString = null;
+
+		// for PUT operations the group may or may not need to exist before the operation can be done
+		EcompPDPGroup group = null;
+		try {
+			group = papEngine.getGroup(groupId);
+		} catch (PAPException e) {
+			logger.error("Exception occured While PUT operation is performing for PDP Group"+e);
+		}
+
+		if (group == null) {
+			String message = "Unknown groupId '" + groupId + "'";
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " " + message);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+			response.addHeader("error", "UnknownGroup");
+			response.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+			return;
+		} else {
+
+			loggingContext.setServiceName("API:PAP.deletPolicyFromPDPGroup");
+
+			if (policyName.contains("xml")) {
+				logger.debug("The full file name including the extension was provided for policyName.. continue.");
+			} else {
+				String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Invalid policyName... "
+						+ "policyName must be the full name of the file to be deleted including version and extension";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Invalid policyName... "
+						+ "policyName must be the full name of the file to be deleted including version and extension");
+				response.addHeader("error", "invalidPolicyName");
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+				return;
+			}
+			RemoveGroupPolicy removePolicy = new RemoveGroupPolicy((StdPDPGroup) group);
+
+			PDPPolicy policy =  group.getPolicy(policyName);
+
+			if (policy != null) {
+				removePolicy.prepareToRemove(policy);
+				EcompPDPGroup updatedGroup = removePolicy.getUpdatedObject();
+				responseString = deletePolicyFromPDPGroup(updatedGroup, loggingContext);
+			} else {
+				String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Policy does not exist on the PDP.";
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Policy does not exist on the PDP.");
+				response.addHeader("error", "noPolicyExist");
+				response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+				return;
+			}			
+		}
+
+		if (responseString.equals("success")) {
+			logger.info("Policy successfully deleted!");
+			PolicyLogger.audit("Policy successfully deleted!");
+			response.setStatus(HttpServletResponse.SC_OK);
+			response.addHeader("successMapKey", "success");
+			response.addHeader("operation", "delete");
+			return;		
+		} else if (responseString.equals("No Group")) {
+			String message = XACMLErrorConstants.ERROR_DATA_ISSUE + "Group update had bad input.";
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Group update had bad input.");
+			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+			response.addHeader("error", "groupUpdate");
+			response.addHeader("message", message);
+			return;	
+		} else if (responseString.equals("DB Error")) {
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW + " Error while updating group in the database");
+			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+			response.addHeader("error", "deleteDB");
+			return;
+		} else {
+			PolicyLogger.error(MessageCodes.ERROR_UNKNOWN + " Failed to delete the policy for an unknown reason.  Check the file system and other logs for further information.");
+			response.addHeader("error", "unknown");
+			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
+			return;
+		}
+
+	}
+
+	protected String getParentPathSubScopeDir(File file) {
+		String domain1 = null;
+
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+
+		String policyDir = file.getAbsolutePath();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		if(policyDir.contains("Config_")){
+			domain1 = policyDir.substring(0,policyDir.indexOf("Config_"));
+		}else if(policyDir.contains("Action_")){
+			domain1 = policyDir.substring(0,policyDir.indexOf("Action_"));	
+		}else{
+			domain1 = policyDir.substring(0,policyDir.indexOf("Decision_"));	
+		}
+		logger.info("print the main domain value"+policyDir);
+
+		return domain1;
+	}
+
+	/*
+	 * method to delete the policy from the database and return notification when using API
+	 */
+	private Boolean notifyDBofDelete (String policyToDelete) {
+		//String policyToDelete = request.getParameter("policyToDelete");
+		try{
+			policyToDelete = URLDecoder.decode(policyToDelete,"UTF-8");
+		} catch(UnsupportedEncodingException e){
+			PolicyLogger.error("Unsupported URL encoding of policyToDelete (UTF-8)");
+			return false;
+		}
+		PolicyDBDaoTransaction deleteTransaction = policyDBDao.getNewTransaction();
+		try{
+			deleteTransaction.deletePolicy(policyToDelete);
+		} catch(Exception e){
+			deleteTransaction.rollbackTransaction();
+			return false;
+		}
+		deleteTransaction.commitTransaction();
+		return true;
+	}
+
+	private String deletePolicyFromPDPGroup (EcompPDPGroup group, ECOMPLoggingContext loggingContext){
+		PolicyDBDaoTransaction acPutTransaction = policyDBDao.getNewTransaction();
+
+		String response = null;
+		loggingContext.setServiceName("API:PAP.updateGroup");
+
+		EcompPDPGroup existingGroup = null;
+		try {
+			existingGroup = papEngine.getGroup(group.getId());
+		} catch (PAPException e1) {
+			logger.error("Exception occured While Deleting Policy From PDP Group"+e1);
+		}
+
+		if (group == null ||
+				! (group instanceof StdPDPGroup) ||
+				! (group.getId().equals(existingGroup.getId()))) {
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + " Group update had bad input. id=" + existingGroup.getId() + " objectFromJSON="+group);
+			loggingContext.transactionEnded();
+
+			PolicyLogger.audit("Transaction Failed - See Error.log");
+
+			response = "No Group";
+			return response;
+		}
+
+		// The Path on the PAP side is not carried on the RESTful interface with the AC
+		// (because it is local to the PAP)
+		// so we need to fill that in before submitting the group for update
+		((StdPDPGroup)group).setDirectory(((StdPDPGroup)existingGroup).getDirectory());
+
+		try{
+			acPutTransaction.updateGroup(group, "XACMLPapServlet.doAPIDelete");
+		} catch(Exception e){
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Error while updating group in the database: "
+					+"group="+existingGroup.getId());
+			response = "DB Error";
+			return response;
+		}
+
+		try {
+			papEngine.updateGroup(group);
+		} catch (PAPException e) {
+			logger.error("Exception occured While Updating PDP Groups"+e);
+			response = "error in updateGroup method";
+		}
+
+		if (logger.isDebugEnabled()) {
+			logger.debug("Group '" + group.getId() + "' updated");
+		}
+
+		acPutTransaction.commitTransaction();
+
+		// Group changed, which might include changing the policies
+		try {
+			groupChanged(existingGroup);
+		}  catch (Exception e) {
+			logger.error("Exception occured in Group Change Method"+e);
+			response = "error in groupChanged method";
+		}
+
+		if (response==null){
+			response = "success";
+			PolicyLogger.audit("Policy successfully deleted!");
+			PolicyLogger.audit("Transaction Ended Successfully");
+		}
+
+		loggingContext.transactionEnded();
+		PolicyLogger.audit("Transaction Ended");
+		return response;
+	}
+
+
+	//
+	// Heartbeat thread - periodically check on PDPs' status
+	//
+
+	/**
+	 * Heartbeat with all known PDPs.
+	 * 
+	 * Implementation note:
+	 * 
+	 * The PDPs are contacted Sequentially, not in Parallel.
+	 * 
+	 * If we did this in parallel using multiple threads we would simultaneously use
+	 * 		- 1 thread and
+	 * 		- 1 connection
+	 * for EACH PDP.
+	 * This could become a resource problem since we already use multiple threads and connections for updating the PDPs
+	 * when user changes occur.
+	 * Using separate threads can also make it tricky dealing with timeouts on PDPs that are non-responsive.
+	 * 
+	 * The Sequential operation does a heartbeat request to each PDP one at a time.
+	 * This has the flaw that any PDPs that do not respond will hold up the entire heartbeat sequence until they timeout.
+	 * If there are a lot of non-responsive PDPs and the timeout is large-ish (the default is 20 seconds)
+	 * it could take a long time to cycle through all of the PDPs.
+	 * That means that this may not notice a PDP being down in a predictable time.
+	 * 
+	 *
+	 */
+	private class Heartbeat implements Runnable {
+		private PAPPolicyEngine papEngine;
+		private Set<EcompPDP> pdps = new HashSet<EcompPDP>();
+		private int heartbeatInterval;
+		private int heartbeatTimeout;
+
+		public volatile boolean isRunning = false;
+
+		public synchronized boolean isRunning() {
+			return this.isRunning;
+		}
+
+		public synchronized void terminate() {
+			this.isRunning = false;
+		}
+
+		public Heartbeat(PAPPolicyEngine papEngine2) {
+			this.papEngine = papEngine2;
+			this.heartbeatInterval = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_HEARTBEAT_INTERVAL, "10000"));
+			this.heartbeatTimeout = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_HEARTBEAT_TIMEOUT, "10000"));
+		}
+
+		@Override
+		public void run() {
+			//
+			// Set ourselves as running
+			//
+			synchronized(this) {
+				this.isRunning = true;
+			}
+			HashMap<String, URL> idToURLMap = new HashMap<String, URL>();
+			try {
+				while (this.isRunning()) {
+					// Wait the given time
+					Thread.sleep(heartbeatInterval);
+
+					// get the list of PDPs (may have changed since last time)
+					pdps.clear();
+					synchronized(papEngine) {
+						try {
+							for (EcompPDPGroup g : papEngine.getEcompPDPGroups()) {
+								for (EcompPDP p : g.getEcompPdps()) {
+									pdps.add(p);
+								}
+							}
+						} catch (PAPException e) {
+							PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", "Heartbeat unable to read PDPs from PAPEngine");
+						}
+					}
+					//
+					// Check for shutdown
+					//
+					if (this.isRunning() == false) {
+						logger.info("isRunning is false, getting out of loop.");
+						break;
+					}
+
+					// try to get the summary status from each PDP
+					boolean changeSeen = false;
+					for (EcompPDP pdp : pdps) {
+						//
+						// Check for shutdown
+						//
+						if (this.isRunning() == false) {
+							logger.info("isRunning is false, getting out of loop.");
+							break;
+						}
+						// the id of the PDP is its url (though we add a query parameter)
+						URL pdpURL = idToURLMap.get(pdp.getId());
+						if (pdpURL == null) {
+							// haven't seen this PDP before
+							String fullURLString = null;
+							try {
+								// Check PDP ID
+								if(CheckPDP.validateID(pdp.getId())){
+									fullURLString = pdp.getId() + "?type=hb";
+									pdpURL = new URL(fullURLString);
+									idToURLMap.put(pdp.getId(), pdpURL);
+								}
+							} catch (MalformedURLException e) {
+								PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "XACMLPapServlet", " PDP id '" + fullURLString + "' is not a valid URL");
+								continue;
+							}
+						}
+
+						// Do a GET with type HeartBeat
+						String newStatus = "";
+
+						HttpURLConnection connection = null;
+						try {
+
+							//
+							// Open up the connection
+							//
+							connection = (HttpURLConnection)pdpURL.openConnection();
+							//
+							// Setup our method and headers
+							//
+							connection.setRequestMethod("GET");
+							connection.setConnectTimeout(heartbeatTimeout);
+							// Added for Authentication
+							String encoding = CheckPDP.getEncoding(pdp.getId());
+							if(encoding !=null){
+								connection.setRequestProperty("Authorization", "Basic " + encoding);
+							}
+							//
+							// Do the connect
+							//
+							connection.connect();
+							if (connection.getResponseCode() == 204) {
+								newStatus = connection.getHeaderField(XACMLRestProperties.PROP_PDP_HTTP_HEADER_HB);
+								if (logger.isDebugEnabled()) {
+									logger.debug("Heartbeat '" + pdp.getId() + "' status='" + newStatus + "'");
+								}
+							} else {
+								// anything else is an unexpected result
+								newStatus = PDPStatus.Status.UNKNOWN.toString();
+								PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " Heartbeat connect response code " + connection.getResponseCode() + ": " + pdp.getId());
+							}
+						} catch (UnknownHostException e) {
+							newStatus = PDPStatus.Status.NO_SUCH_HOST.toString();
+							PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Heartbeat '" + pdp.getId() + "' NO_SUCH_HOST");
+						} catch (SocketTimeoutException e) {
+							newStatus = PDPStatus.Status.CANNOT_CONNECT.toString();
+							PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Heartbeat '" + pdp.getId() + "' connection timeout");
+						} catch (ConnectException e) {
+							newStatus = PDPStatus.Status.CANNOT_CONNECT.toString();
+							PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Heartbeat '" + pdp.getId() + "' cannot connect");
+						} catch (Exception e) {
+							newStatus = PDPStatus.Status.UNKNOWN.toString();
+							PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", "Heartbeat '" + pdp.getId() + "' connect exception");
+						} finally {
+							// cleanup the connection
+							connection.disconnect();
+						}
+
+						if ( ! pdp.getStatus().getStatus().toString().equals(newStatus)) {
+							if (logger.isDebugEnabled()) {
+								logger.debug("previous status='" + pdp.getStatus().getStatus()+"'  new Status='" + newStatus + "'");
+							}
+							try {
+								setPDPSummaryStatus(pdp, newStatus);
+							} catch (PAPException e) {
+								PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", "Unable to set state for PDP '" + pdp.getId());
+							}
+							changeSeen = true;
+						}
+
+					}
+					//
+					// Check for shutdown
+					//
+					if (this.isRunning() == false) {
+						logger.info("isRunning is false, getting out of loop.");
+						break;
+					}
+
+					// if any of the PDPs changed state, tell the ACs to update
+					if (changeSeen) {
+						notifyAC();
+					}
+
+				}
+			} catch (InterruptedException e) {
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + " Heartbeat interrupted.  Shutting down");
+				this.terminate();
+			}
+		}
+	}
+
+
+	//
+	// HELPER to change Group status when PDP status is changed
+	//
+	// (Must NOT be called from a method that is synchronized on the papEngine or it may deadlock)
+	//
+
+	private void setPDPSummaryStatus(EcompPDP pdp, PDPStatus.Status newStatus) throws PAPException {
+		setPDPSummaryStatus(pdp, newStatus.toString());
+	}
+
+	private void setPDPSummaryStatus(EcompPDP pdp, String newStatus) throws PAPException {
+		synchronized(papEngine) {
+			StdPDPStatus status = new StdPDPStatus();
+			status.setStatus(PDPStatus.Status.valueOf(newStatus));
+			((StdPDP)pdp).setStatus(status);
+
+			// now adjust the group
+			StdPDPGroup group = (StdPDPGroup)papEngine.getPDPGroup((EcompPDP) pdp);
+			// if the PDP was just deleted it may transiently exist but not be in a group
+			if (group != null) {
+				group.resetStatus();
+			}
+		}
+	}
+
+
+	//
+	// Callback methods telling this servlet to notify PDPs of changes made by the PAP StdEngine
+	//	in the PDP group directories
+	//
+
+	@Override
+	public void changed() {
+		// all PDPs in all groups need to be updated/sync'd
+		Set<EcompPDPGroup> groups;
+		try {
+			groups = papEngine.getEcompPDPGroups();
+		} catch (PAPException e) {
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " getPDPGroups failed");
+			throw new RuntimeException(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Unable to get Groups: " + e);
+		}
+		for (EcompPDPGroup group : groups) {
+			groupChanged(group);
+		}
+	}
+
+	@Override
+	public void groupChanged(EcompPDPGroup group) {
+		// all PDPs within one group need to be updated/sync'd
+		for (EcompPDP pdp : group.getEcompPdps()) {
+			pdpChanged(pdp);
+		}
+	}
+
+	@Override
+	public void pdpChanged(EcompPDP pdp) {
+		// kick off a thread to do an event notification for each PDP.
+		// This needs to be on a separate thread so that PDPs that do not respond (down, non-existent, etc)
+		// do not block the PSP response to the AC, which would freeze the GUI until all PDPs sequentially respond or time-out.
+		// begin - Fix to maintain requestId - including storedRequestId in UpdatePDPThread to be used later when calling PDP
+		// Thread t = new Thread(new UpdatePDPThread(pdp));
+		Thread t = new Thread(new UpdatePDPThread(pdp, storedRequestId));
+		// end   - Fix to maintain requestId
+		if(CheckPDP.validateID(pdp.getId())){
+			t.start();
+		}
+	}
+
+	private class UpdatePDPThread implements Runnable {
+		private EcompPDP pdp;
+		// begin - Fix to maintain requestId - define requestId under class to be used later when calling PDP
+		private String requestId;
+		// end   - Fix to maintain requestId
+
+		// remember which PDP to notify
+		public UpdatePDPThread(EcompPDP pdp) {
+			this.pdp = pdp;
+		}
+
+		// begin - Fix to maintain requestId - clone UpdatePDPThread method with different method signature so to include requestId to be used later when calling PDP
+		public UpdatePDPThread(EcompPDP pdp, String storedRequestId) {
+			this.pdp = pdp;
+			requestId = storedRequestId;
+		}
+		// end   - Fix to maintain requestId
+
+		public void run() {
+			// send the current configuration to one PDP
+			HttpURLConnection connection = null;
+			// get a new logging context for the thread
+			ECOMPLoggingContext loggingContext = new ECOMPLoggingContext(baseLoggingContext);
+			try {
+				loggingContext.setServiceName("PAP:PDP.putConfig");
+				// get a new transaction (request) ID and update the logging context.
+				// begin - Fix to maintain requestId - replace unconditioned generation of new requestID so it won't be used later when calling PDP
+				// If a requestId was provided, use it, otherwise generate one; post to loggingContext to be used later when calling PDP
+				// UUID requestID = UUID.randomUUID();
+				// loggingContext.setRequestID(requestID.toString());
+				if ((requestId == null) || (requestId == "")) {
+					UUID requestID = UUID.randomUUID();
+					loggingContext.setRequestID(requestID.toString());
+					PolicyLogger.info("requestID not provided in call to XACMLPapSrvlet (UpdatePDPThread) so we generated one:  " + loggingContext.getRequestID());
+				} else {
+					loggingContext.setRequestID(requestId);
+					PolicyLogger.info("requestID was provided in call to XACMLPapSrvlet (UpdatePDPThread):  " + loggingContext.getRequestID());
+				}
+				// end   - Fix to maintain requestId
+				loggingContext.transactionStarted();
+				// dummy metric.log example posted below as proof of concept
+				loggingContext.metricStarted();
+				loggingContext.metricEnded();
+				PolicyLogger.metrics("Metric example posted here - 1 of 2");
+				loggingContext.metricStarted();
+				loggingContext.metricEnded();
+				PolicyLogger.metrics("Metric example posted here - 2 of 2");
+				// dummy metric.log example posted above as proof of concept
+
+				//
+				// the Id of the PDP is its URL
+				//
+				if (logger.isDebugEnabled()) {
+					logger.debug("creating url for id '" + pdp.getId() + "'");
+				}
+				//TODO - currently always send both policies and pips.  Do we care enough to add code to allow sending just one or the other?
+				//TODO		(need to change "cache=", implying getting some input saying which to change)
+				URL url = new URL(pdp.getId() + "?cache=all");
+
+				//
+				// Open up the connection
+				//
+				connection = (HttpURLConnection)url.openConnection();
+				//
+				// Setup our method and headers
+				//
+				connection.setRequestMethod("PUT");
+				// Added for Authentication
+				String encoding = CheckPDP.getEncoding(pdp.getId());
+				if(encoding !=null){
+					connection.setRequestProperty("Authorization", "Basic " + encoding);
+				}
+				connection.setRequestProperty("Content-Type", "text/x-java-properties");
+				// begin - Fix to maintain requestId - post requestID from loggingContext in PDP request header for call to PDP, then reinit storedRequestId to null
+				// connection.setRequestProperty("X-ECOMP-RequestID", requestID.toString());
+				connection.setRequestProperty("X-ECOMP-RequestID", loggingContext.getRequestID());
+				storedRequestId = null;
+				// end   - Fix to maintain requestId 
+				//
+				// Adding this in. It seems the HttpUrlConnection class does NOT
+				// properly forward our headers for POST re-direction. It does so
+				// for a GET re-direction.
+				//
+				// So we need to handle this ourselves.
+				//
+				//TODO - is this needed for a PUT?  seems better to leave in for now?
+				//	            connection.setInstanceFollowRedirects(false);
+				//
+				// PLD - MUST be able to handle re-directs.
+				//
+				connection.setInstanceFollowRedirects(true);
+				connection.setDoOutput(true);
+				try (OutputStream os = connection.getOutputStream()) {
+
+					EcompPDPGroup group = papEngine.getPDPGroup((EcompPDP) pdp);
+					// if the PDP was just deleted, there is no group, but we want to send an update anyway
+					if (group == null) {
+						// create blank properties files
+						Properties policyProperties = new Properties();
+						policyProperties.put(XACMLProperties.PROP_ROOTPOLICIES, "");
+						policyProperties.put(XACMLProperties.PROP_REFERENCEDPOLICIES, "");
+						policyProperties.store(os, "");
+
+						Properties pipProps = new Properties();
+						pipProps.setProperty(XACMLProperties.PROP_PIP_ENGINES, "");
+						pipProps.store(os, "");
+
+					} else {
+						// send properties from the current group
+						group.getPolicyProperties().store(os, "");
+						Properties policyLocations = new Properties();
+						for (PDPPolicy policy : group.getPolicies()) {
+							policyLocations.put(policy.getId() + ".url", XACMLPapServlet.papURL + "?id=" + policy.getId());
+						}
+						policyLocations.store(os, "");
+						group.getPipConfigProperties().store(os, "");
+					}
+
+				} catch (Exception e) {
+					PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Failed to send property file to " + pdp.getId());
+					// Since this is a server-side error, it probably does not reflect a problem on the client,
+					// so do not change the PDP status.
+					return;
+				}
+				//
+				// Do the connect
+				//
+				connection.connect();
+				if (connection.getResponseCode() == 204) {
+					logger.info("Success. We are configured correctly.");
+					loggingContext.transactionEnded();
+					auditLogger.info("Success. PDP is configured correctly.");
+					PolicyLogger.audit("Transaction Success. PDP is configured correctly.");
+					setPDPSummaryStatus(pdp, PDPStatus.Status.UP_TO_DATE);
+				} else if (connection.getResponseCode() == 200) {
+					logger.info("Success. PDP needs to update its configuration.");
+					loggingContext.transactionEnded();
+					auditLogger.info("Success. PDP needs to update its configuration.");
+					PolicyLogger.audit("Transaction Success. PDP is configured correctly.");
+					setPDPSummaryStatus(pdp, PDPStatus.Status.OUT_OF_SYNCH);
+				} else {
+					logger.warn("Failed: " + connection.getResponseCode() + "  message: " + connection.getResponseMessage());
+					loggingContext.transactionEnded();
+					auditLogger.warn("Failed: " + connection.getResponseCode() + "  message: " + connection.getResponseMessage());
+					PolicyLogger.audit("Transaction Failed: " + connection.getResponseCode() + "  message: " + connection.getResponseMessage());
+
+					setPDPSummaryStatus(pdp, PDPStatus.Status.UNKNOWN);
+				}
+			} catch (Exception e) {
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Unable to sync config with PDP '" + pdp.getId() + "'");
+				loggingContext.transactionEnded();
+				PolicyLogger.audit("Transaction Failed: Unable to sync config with PDP '" + pdp.getId() + "': " + e);
+				try {
+					setPDPSummaryStatus(pdp, PDPStatus.Status.UNKNOWN);
+				} catch (PAPException e1) {
+					PolicyLogger.audit("Transaction Failed: Unable to set status of PDP " + pdp.getId() + " to UNKNOWN: " + e);
+
+					PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Unable to set status of PDP '" + pdp.getId() + "' to UNKNOWN");
+				}
+			} finally {
+				// cleanup the connection
+				connection.disconnect();
+
+				// tell the AC to update it's status info
+				notifyAC();
+			}
+
+		}
+	}
+
+	//
+	// RESTful Interface from PAP to ACs notifying them of changes
+	//
+
+	private void notifyAC() {
+		// kick off a thread to do one event notification for all registered ACs
+		// This needs to be on a separate thread so that ACs can make calls back to PAP to get the updated Group data
+		// as part of processing this message on their end.
+		Thread t = new Thread(new NotifyACThread());
+		t.start();
+	}
+
+	private class NotifyACThread implements Runnable {
+
+		public void run() {
+			List<String> disconnectedACs = new ArrayList<String>();
+
+			// There should be no Concurrent exception here because the list is a CopyOnWriteArrayList.
+			// The "for each" loop uses the collection's iterator under the covers, so it should be correct.
+			for (String acURL : adminConsoleURLStringList) {
+				HttpURLConnection connection = null;
+				try {
+
+					acURL += "?PAPNotification=true";
+
+					//TODO - Currently we just tell AC that "Something changed" without being specific.  Do we want to tell it which group/pdp changed?
+					//TODO - If so, put correct parameters into the Query string here
+					acURL += "&objectType=all" + "&action=update";
+
+					if (logger.isDebugEnabled()) {
+						logger.debug("creating url for id '" + acURL + "'");
+					}
+					//TODO - currently always send both policies and pips.  Do we care enough to add code to allow sending just one or the other?
+					//TODO		(need to change "cache=", implying getting some input saying which to change)
+
+					URL url = new URL(acURL );
+
+					//
+					// Open up the connection
+					//
+					connection = (HttpURLConnection)url.openConnection();
+					//
+					// Setup our method and headers
+					//
+					connection.setRequestMethod("PUT");
+					connection.setRequestProperty("Content-Type", "text/x-java-properties");
+					//
+					// Adding this in. It seems the HttpUrlConnection class does NOT
+					// properly forward our headers for POST re-direction. It does so
+					// for a GET re-direction.
+					//
+					// So we need to handle this ourselves.
+					//
+					//TODO - is this needed for a PUT?  seems better to leave in for now?
+					connection.setInstanceFollowRedirects(false);
+					//
+					// Do not include any data in the PUT because this is just a
+					// notification to the AC.
+					// The AC will use GETs back to the PAP to get what it needs
+					// to fill in the screens.
+					//
+
+					//
+					// Do the connect
+					//
+					connection.connect();
+					if (connection.getResponseCode() == 204) {
+						logger.info("Success. We updated correctly.");
+					} else {
+						logger.warn(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Failed: " + connection.getResponseCode() + "  message: " + connection.getResponseMessage());
+					}
+
+				} catch (Exception e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Unable to sync config AC '" + acURL + "': " + e, e);
+					PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "XACMLPapServlet", " Unable to sync config AC '" + acURL + "'");
+					disconnectedACs.add(acURL);
+				} finally {
+					// cleanup the connection
+					connection.disconnect();
+				}
+			}
+
+			// remove any ACs that are no longer connected
+			if (disconnectedACs.size() > 0) {
+				adminConsoleURLStringList.removeAll(disconnectedACs);
+			}
+
+		}
+	}
+
+	/*
+	 * Added by Mike M in 1602 release for Authorizing the PEP Requests for Granularity. 
+	 */
+	private boolean authorizeRequest(HttpServletRequest request) {
+		if(request instanceof HttpServletRequest) {
+
+			// Get the client Credentials from the Request header. 
+			String clientCredentials = request.getHeader(ENVIRONMENT_HEADER);
+
+			// Check if the Client is Authorized. 
+			if(clientCredentials!=null && clientCredentials.equalsIgnoreCase(environment)){
+				return true;
+			}else{
+				return false;
+			}
+		} else {
+			return false;
+		}
+	}
+
+	public static String getConfigHome(){
+		try {
+			loadWebapps();
+		} catch (Exception e) {
+			return null;
+		}
+		return CONFIG_HOME;
+	}
+
+	public static String getActionHome(){
+		try {
+			loadWebapps();
+		} catch (Exception e) {
+			return null;
+		}
+		return ACTION_HOME;
+	}
+
+	private static void loadWebapps() throws Exception{
+		if(ACTION_HOME == null || CONFIG_HOME == null){
+			Path webappsPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS));
+			//Sanity Check
+			if (webappsPath == null) {
+				PolicyLogger.error("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+				throw new Exception("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+			}
+			Path webappsPathConfig;
+			Path webappsPathAction;
+			if(webappsPath.toString().contains("\\"))
+			{
+				webappsPathConfig = Paths.get(webappsPath.toString()+"\\Config");
+				webappsPathAction = Paths.get(webappsPath.toString()+"\\Action");
+			}
+			else
+			{
+				webappsPathConfig = Paths.get(webappsPath.toString()+"/Config");
+				webappsPathAction = Paths.get(webappsPath.toString()+"/Action");
+			}
+			if (Files.notExists(webappsPathConfig)) 
+			{
+				try {
+					Files.createDirectories(webappsPathConfig);
+				} catch (IOException e) {
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "XACMLPapServlet", " Failed to create config directory: "
+							+ webappsPathConfig.toAbsolutePath().toString());
+				}
+			}
+			if (Files.notExists(webappsPathAction)) 
+			{
+				try {
+					Files.createDirectories(webappsPathAction);
+				} catch (IOException e) {
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to create config directory: "
+							+ webappsPathAction.toAbsolutePath().toString(), e);
+				}
+			}
+			ACTION_HOME = webappsPathAction.toString();
+			CONFIG_HOME = webappsPathConfig.toString();
+		}
+	}
+
+	/**
+	 * @return the emf
+	 */
+	public EntityManagerFactory getEmf() {
+		return emf;
+	}
+	public IntegrityMonitor getIm() {
+		return im;
+	}
+
+	public IntegrityAudit getIa() {
+		return ia;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/GridData.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/GridData.java
new file mode 100644
index 0000000..86f42bc
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/GridData.java
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.adapters;
+
+import java.util.ArrayList;
+
+public class GridData {
+	private ArrayList<Object> attributes;
+	private ArrayList<Object> alAttributes;
+	private ArrayList<Object> transportProtocols;
+	private ArrayList<Object> appProtocols;
+
+	public ArrayList<Object> getAttributes() {
+		return attributes;
+	}
+
+	public void setAttributes(ArrayList<Object> attributes) {
+		this.attributes = attributes;
+	}
+
+	public ArrayList<Object> getAlAttributes() {
+		return alAttributes;
+	}
+
+	public void setAlAttributes(ArrayList<Object> alAttributes) {
+		this.alAttributes = alAttributes;
+	}
+
+	public ArrayList<Object> getAppProtocols() {
+		return appProtocols;
+	}
+
+	public void setAppProtocols(ArrayList<Object> appProtocols) {
+		this.appProtocols = appProtocols;
+	}
+
+	public ArrayList<Object> getTransportProtocols() {
+		return transportProtocols;
+	}
+
+	public void setTransportProtocols(ArrayList<Object> transportProtocols) {
+		this.transportProtocols = transportProtocols;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/PolicyRestAdapter.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/PolicyRestAdapter.java
new file mode 100644
index 0000000..19af8b0
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/PolicyRestAdapter.java
@@ -0,0 +1,480 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.adapters;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+
+//import org.openecomp.policy.pap.xacml.rest.model.GitRepositoryContainer;
+
+public class PolicyRestAdapter {
+	
+	private Object data;
+	private String policyName = null;
+	private String configBodyData = null;
+	private String configType = null;
+	private String policyID = null;
+	private String policyType = null;
+	private String configPolicyType = null;
+	private String policyDescription = null;
+	private String ecompName = null;
+	private String configName = null;
+	private String ruleID = null;
+	private String ruleCombiningAlgId = null;
+	private Map<String,String> dynamicFieldConfigAttributes;
+	private Map<String,String> dynamicSettingsMap;
+	private Map<String,String> dropDownMap;
+	private String actionPerformer = null;
+	private String actionAttribute = null;
+	private List<String> dynamicRuleAlgorithmLabels;
+	private List<String> dynamicRuleAlgorithmCombo;
+	private List<String> dynamicRuleAlgorithmField1;
+	private List<String> dynamicRuleAlgorithmField2;
+	private List<Object> dynamicVariableList;
+	private List<String> dataTypeList;
+	private String parentPath;	
+	private boolean isValidData = false;
+	private String adminNotification = null;
+	private boolean isEditPolicy = false;
+	private boolean isViewPolicy = false;
+	private boolean isDraft = false;
+	private Object policyData = null;
+	private String gitPath;
+	private boolean readOnly;
+	private String configHome;
+	private String configUrl;
+	private String finalPolicyPath;
+	private String version;
+	private String jsonBody;
+	private String apiflag;
+	private String prevJsonBody;
+	private Integer highestVersion;
+//	private String actionDictHeader = null;
+//	private String actionDictType = null;
+//	private String actionDictUrl = null;
+//	private String actionDictMethod = null;
+	private String serviceType = null;
+	private String uuid = null;
+	private String location = null;
+    private String priority = null;
+	private Map<String,String> brmsParamBody=null;
+	private EntityManagerFactory entityManagerFactory = null;
+	private Boolean policyExists = false;
+	private String policyScope;
+	private String providerComboBox = null;
+	private String riskType;
+	private String guard;
+	private String riskLevel;
+	private String ttlDate;
+	
+
+	public Integer getHighestVersion() {
+		return highestVersion;
+	}
+	public void setHighestVersion(Integer highestVersion) {
+		this.highestVersion = highestVersion;
+	}
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	public String getPolicyName() {
+		return policyName;
+	}
+	public void setPolicyName(String policyName) {
+		this.policyName = policyName;
+	}
+	public String getConfigBodyData() {
+		return configBodyData;
+	}
+	public void setConfigBodyData(String configBodyData) {
+		this.configBodyData = configBodyData;
+	}
+	public String getConfigType() {
+		return configType;
+	}
+	public void setConfigType(String configType) {
+		this.configType = configType;
+	}
+	public String getPolicyID() {
+		return policyID;
+	}
+	public void setPolicyID(String policyID) {
+		this.policyID = policyID;
+	}
+	public String getPolicyType() {
+		return policyType;
+	}
+	public void setPolicyType(String policyType) {
+		this.policyType = policyType;
+	}
+	public String getPolicyDescription() {
+		return policyDescription;
+	}
+	public void setPolicyDescription(String policyDescription) {
+		this.policyDescription = policyDescription;
+	}
+	public String getEcompName() {
+		return ecompName;
+	}
+	public void setEcompName(String ecompName) {
+		this.ecompName = ecompName;
+	}
+	public String getConfigName() {
+		return configName;
+	}
+	public void setConfigName(String configName) {
+		this.configName = configName;
+	}
+	public String getRuleID() {
+		return ruleID;
+	}
+	public void setRuleID(String ruleID) {
+		this.ruleID = ruleID;
+	}
+	public String getRuleCombiningAlgId() {
+		return ruleCombiningAlgId;
+	}
+	public void setRuleCombiningAlgId(String ruleCombiningAlgId) {
+		this.ruleCombiningAlgId = ruleCombiningAlgId;
+	}
+	public Map<String,String> getDynamicFieldConfigAttributes() {
+		return dynamicFieldConfigAttributes;
+	}
+	public void setDynamicFieldConfigAttributes(
+			Map<String,String> dynamicFieldConfigAttributes) {
+		this.dynamicFieldConfigAttributes = dynamicFieldConfigAttributes;
+	}
+	public String getParentPath() {
+		return parentPath;
+	}
+	public void setParentPath(String parentPath) {
+		this.parentPath = parentPath;
+	}
+	public boolean isEditPolicy() {
+		return isEditPolicy;
+	}
+	public void setEditPolicy(boolean isEditPolicy) {
+		this.isEditPolicy = isEditPolicy;
+	}
+	public boolean isViewPolicy() {
+		return isViewPolicy;
+	}
+	public void setViewPolicy(boolean isViewPolicy) {
+		this.isViewPolicy = isViewPolicy;
+	}
+	public Object getPolicyData() {
+		return policyData;
+	}
+	public void setPolicyData(Object policyData) {
+		this.policyData = policyData;
+	}
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+	public void setReadOnly(boolean readOnly) {
+		this.readOnly = readOnly;
+	}
+	public String getUserGitPath() {
+		return gitPath;
+	}
+	public void setUserGitPath(String gitPath) {
+		this.gitPath = gitPath;
+	}
+	public boolean isValidData() {
+		return isValidData;
+	}
+	public void setValidData(boolean isValidData) {
+		this.isValidData = isValidData;
+	}
+	public String getAdminNotification() {
+		return adminNotification;
+	}
+	public void setAdminNotification(String adminNotification) {
+		this.adminNotification = adminNotification;
+	}
+	public String getConfigHome() {
+		return configHome;
+	}
+	public void setConfigHome(String configHome) {
+		this.configHome = configHome;
+	}
+	public String getConfigUrl() {
+		return configUrl;
+	}
+	public void setConfigUrl(String configUrl) {
+		this.configUrl = configUrl;
+	}
+	public String getFinalPolicyPath() {
+		return finalPolicyPath;
+	}
+	public void setFinalPolicyPath(String finalPolicyPath) {
+		this.finalPolicyPath = finalPolicyPath;
+	}
+	public String getVersion() {
+		return version;
+	}
+	public void setVersion(String version) {
+		this.version = version;
+	}
+	public String getJsonBody() {
+		return jsonBody;
+	}
+	public void setJsonBody(String jsonBody) {
+		this.jsonBody = jsonBody;
+	}
+	public String getPrevJsonBody() {
+		return prevJsonBody;
+	}
+	public void setPrevJsonBody(String prevJsonBody) {
+		this.prevJsonBody = prevJsonBody;
+	}
+	public String getApiflag() {
+		return apiflag;
+	}
+	public void setApiflag(String apiflag) {
+		this.apiflag = apiflag;
+	}
+	/**
+	 * @return the actionPerformer
+	 */
+	public String getActionPerformer() {
+		return actionPerformer;
+	}
+	/**
+	 * @param actionPerformer the actionPerformer to set
+	 */
+	public void setActionPerformer(String actionPerformer) {
+		this.actionPerformer = actionPerformer;
+	}
+	/**
+	 * @return the actionAttribute
+	 */
+	public String getActionAttribute() {
+		return actionAttribute;
+	}
+	/**
+	 * @param actionAttribute the actionAttribute to set
+	 */
+	public void setActionAttribute(String actionAttribute) {
+		this.actionAttribute = actionAttribute;
+	}
+	/**
+	 * @return the dynamicRuleAlgorithmLabels
+	 */
+	public List<String> getDynamicRuleAlgorithmLabels() {
+		return dynamicRuleAlgorithmLabels;
+	}
+	/**
+	 * @param dynamicRuleAlgorithmLabels the dynamicRuleAlgorithmLabels to set
+	 */
+	public void setDynamicRuleAlgorithmLabels(
+			List<String> dynamicRuleAlgorithmLabels) {
+		this.dynamicRuleAlgorithmLabels = dynamicRuleAlgorithmLabels;
+	}
+	/**
+	 * @return the dynamicRuleAlgorithmCombo
+	 */
+	public List<String> getDynamicRuleAlgorithmCombo() {
+		return dynamicRuleAlgorithmCombo;
+	}
+	/**
+	 * @param dynamicRuleAlgorithmCombo the dynamicRuleAlgorithmCombo to set
+	 */
+	public void setDynamicRuleAlgorithmCombo(List<String> dynamicRuleAlgorithmCombo) {
+		this.dynamicRuleAlgorithmCombo = dynamicRuleAlgorithmCombo;
+	}
+	/**
+	 * @return the dynamicRuleAlgorithmField1
+	 */
+	public List<String> getDynamicRuleAlgorithmField1() {
+		return dynamicRuleAlgorithmField1;
+	}
+	/**
+	 * @param dynamicRuleAlgorithmField1 the dynamicRuleAlgorithmField1 to set
+	 */
+	public void setDynamicRuleAlgorithmField1(
+			List<String> dynamicRuleAlgorithmField1) {
+		this.dynamicRuleAlgorithmField1 = dynamicRuleAlgorithmField1;
+	}
+	/**
+	 * @return the dynamicRuleAlgorithmField2
+	 */
+	public List<String> getDynamicRuleAlgorithmField2() {
+		return dynamicRuleAlgorithmField2;
+	}
+	/**
+	 * @param dynamicRuleAlgorithmField2 the dynamicRuleAlgorithmField2 to set
+	 */
+	public void setDynamicRuleAlgorithmField2(
+			List<String> dynamicRuleAlgorithmField2) {
+		this.dynamicRuleAlgorithmField2 = dynamicRuleAlgorithmField2;
+	}
+	public Map<String,String> getDropDownMap() {
+		return dropDownMap;
+	}
+	public void setDropDownMap(Map<String,String> dropDownMap) {
+		this.dropDownMap = dropDownMap;
+	}
+/*	public String getActionDictHeader() {
+		return actionDictHeader;
+	}
+	public void setActionDictHeader(String actionDictHeader) {
+		this.actionDictHeader = actionDictHeader;
+	}
+	public String getActionDictType() {
+		return actionDictType;
+	}
+	public void setActionDictType(String actionDictType) {
+		this.actionDictType = actionDictType;
+	}
+	public String getActionDictUrl() {
+		return actionDictUrl;
+	}
+	public void setActionDictUrl(String actionDictUrl) {
+		this.actionDictUrl = actionDictUrl;
+	}
+	public String getActionDictMethod() {
+		return actionDictMethod;
+	}
+	public void setActionDictMethod(String actionDictMethod) {
+		this.actionDictMethod = actionDictMethod;
+	}*/
+	public Map<String,String> getDynamicSettingsMap() {
+		return dynamicSettingsMap;
+	}
+	public void setDynamicSettingsMap(Map<String,String> dynamicSettingsMap) {
+		this.dynamicSettingsMap = dynamicSettingsMap;
+	}
+	public List<Object> getDynamicVariableList() {
+		return dynamicVariableList;
+	}
+	public void setDynamicVariableList(List<Object> dynamicVariableList) {
+		this.dynamicVariableList = dynamicVariableList;
+	}
+	public List<String> getDataTypeList() {
+		return dataTypeList;
+	}
+	public void setDataTypeList(List<String> dataTypeList) {
+		this.dataTypeList = dataTypeList;
+	}
+	public boolean isDraft() {
+		return isDraft;
+	}
+	public void setDraft(boolean isDraft) {
+		this.isDraft = isDraft;
+	}
+	public String getConfigPolicyType() {
+		return configPolicyType;
+	}
+	public void setConfigPolicyType(String configPolicyType) {
+		this.configPolicyType = configPolicyType;
+	}
+	public String getServiceType() {
+		return serviceType;
+	}
+	public void setServiceType(String serviceType) {
+		this.serviceType = serviceType;
+	}
+	public String getUuid() {
+		return uuid;
+	}
+	public void setUuid(String uuid) {
+		this.uuid = uuid;
+	}
+	public String getLocation() {
+		return location;
+	}
+	public void setLocation(String location) {
+		this.location = location;
+	}
+    public String getPriority() {
+        return priority;
+    }
+    public void setPriority(String priority) {
+        this.priority = priority;
+    }
+	public Map<String, String> getBrmsParamBody() {
+		return brmsParamBody;
+	}
+	public void setBrmsParamBody(Map<String, String> brmsParamBody) {
+		this.brmsParamBody = brmsParamBody;
+	}
+	public EntityManagerFactory getEntityManagerFactory() {
+		return entityManagerFactory;
+	}
+	public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
+		this.entityManagerFactory = entityManagerFactory;
+	}
+	/**
+	 * @return the policyExists
+	 */
+	public Boolean getPolicyExists() {
+		return policyExists;
+	}
+	/**
+	 * @param policyExists the policyExists to set
+	 */
+	public void setPolicyExists(Boolean policyExists) {
+		this.policyExists = policyExists;
+	}
+	public String getPolicyScope() {
+		return policyScope;
+	}
+	
+	public void setPolicyScope(String domainDir) {
+		this. policyScope=domainDir;
+	}
+	public String getProviderComboBox() {
+		return providerComboBox;
+	}
+	public void setProviderComboBox(String providerComboBox) {
+		this.providerComboBox = providerComboBox;
+	}
+	public String getRiskType() {
+		return riskType;
+	}
+	public void setRiskType(String riskType) {
+		this.riskType = riskType;
+	}
+	public String getGuard() {
+		return guard;
+	}
+	public void setGuard(String guard) {
+		this.guard = guard;
+	}
+	public String getRiskLevel() {
+		return riskLevel;
+	}
+	public void setRiskLevel(String riskLevel) {
+		this.riskLevel = riskLevel;
+	}
+	public String getTtlDate() {
+		return ttlDate;
+	}
+	public void setTtlDate(String ttlDate) {
+		this.ttlDate = ttlDate;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/package-info.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/package-info.java
new file mode 100644
index 0000000..fd5f064
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/adapters/package-info.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * 
+ */
+/**
+ *
+ */
+package org.openecomp.policy.pap.xacml.rest.adapters;
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java
new file mode 100644
index 0000000..b6e003c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ActionPolicy.java
@@ -0,0 +1,626 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.util.JPAUtils;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class ActionPolicy extends Policy {
+	
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+	
+	public static final String PDP_ACTION = "PDP";
+	public static final String PEP_ACTION = "PEP";
+	public static final String TYPE_ACTION = "REST";
+
+	public static final String GET_METHOD = "GET";
+	public static final String PUT_METHOD = "PUT";
+	public static final String POST_METHOD = "POST";
+
+	public static final String PERFORMER_ATTRIBUTEID = "performer";
+	public static final String TYPE_ATTRIBUTEID = "type";
+	public static final String METHOD_ATTRIBUTEID = "method";
+	public static final String HEADERS_ATTRIBUTEID = "headers";
+	public static final String URL_ATTRIBUTEID = "url";
+	public static final String BODY_ATTRIBUTEID = "body";
+	
+	List<String> dynamicLabelRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldFunctionRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<String>();
+	
+	protected Map<String, String> dropDownMap = new HashMap<String, String>();
+	
+	public ActionPolicy() {
+		super();
+	}
+	
+	public ActionPolicy(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+	
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			//Prep and configure the policy for saving
+			prepareToSave();
+		}
+
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );		
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+	
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+		
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Action")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+		
+		if (policyAdapter.getData() != null) {
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy already Exists, cannot create the policy.");
+				PolicyLogger.error("Policy already Exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			policyName = newFile.getFileName().toString();
+			
+			// Action body is optional so checking value provided or not
+			//String actionBodyString = policyAdapter.getActionBody();
+			String comboDictValue = policyAdapter.getActionAttribute();
+	        String actionBody = getActionPolicyDict(comboDictValue).getBody();
+			if(!(actionBody==null || "".equals(actionBody))){
+				saveActionBody(policyName, actionBody);
+			}
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+			PolicyType actionPolicy = (PolicyType) policyAdapter.getData();
+			
+			actionPolicy.setDescription(policyAdapter.getPolicyDescription());
+			
+			actionPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+			AllOfType allOf = new AllOfType();
+			
+			Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+			
+			// If there is any dynamic field attributes create the matches here
+			for (String keyField : dynamicFieldComponentAttributes.keySet()) {
+				String key = keyField;
+				String value = dynamicFieldComponentAttributes.get(key);
+				MatchType dynamicMatch = createDynamicMatch(key, value);
+				allOf.getMatch().add(dynamicMatch);
+			}
+
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			target.getAnyOf().add(anyOf);
+			
+			// Adding the target to the policy element
+			actionPolicy.setTarget(target);
+			
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+
+			rule.setEffect(EffectType.PERMIT);
+			rule.setTarget(new TargetType());
+			
+			dynamicLabelRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmLabels();
+			dynamicFieldFunctionRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmCombo();
+			dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
+			dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
+			//dropDownMap = policyAdapter.getDropDownMap();
+			dropDownMap = createDropDownMap();
+						
+			// Rule attributes are optional and dynamic so check and add them to condition.
+			if (dynamicLabelRuleAlgorithms != null && dynamicLabelRuleAlgorithms.size() > 0) {
+				boolean isCompound = false;
+				ConditionType condition = new ConditionType();
+				int index = dynamicFieldOneRuleAlgorithms.size() - 1;
+
+				for (String labelAttr : dynamicLabelRuleAlgorithms) {
+					// if the rule algorithm as a label means it is a compound
+					if (dynamicFieldOneRuleAlgorithms.get(index).toString().equals(labelAttr)) {
+						ApplyType actionApply = new ApplyType();
+
+						String selectedFunction = (String) dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+						String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+						String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+						actionApply.setFunctionId(dropDownMap.get(selectedFunction));
+						actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
+						actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
+						condition.setExpression(new ObjectFactory().createApply(actionApply));
+						isCompound = true;
+					}
+					
+				}
+				// if rule algorithm not a compound
+				if (!isCompound) {
+					condition.setExpression(new ObjectFactory().createApply(getInnerActionApply(dynamicLabelRuleAlgorithms.get(index).toString())));
+				}
+				rule.setCondition(condition);
+			}
+			// set the obligations to rule
+			rule.setObligationExpressions(getObligationExpressions());
+			actionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(actionPolicy);
+		}  else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}	
+
+		setPreparedToSave(true);
+		return true;
+	}
+	
+	// Saving the json Configurations file if exists at server location for action policy.
+	private void saveActionBody(String policyName, String actionBodyData) {
+		int version = 0;
+		int highestVersion = 0;
+		String domain = getParentPathSubScopeDir();
+		String path = domain.replace('\\', '.');
+		String removeExtension = policyName.substring(0, policyName.indexOf(".xml"));
+		String removeVersion = removeExtension.substring(0, removeExtension.indexOf("."));
+		if (policyAdapter.isEditPolicy()) {
+			highestVersion = policyAdapter.getHighestVersion();
+			if(highestVersion != 0){
+				version = highestVersion + 1;	
+			}
+		} else {
+			version = 1;
+		}
+		if(path.contains("/")){
+			path = domain.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		try {
+
+			File file = new File(ACTION_HOME + File.separator + path + "." + removeVersion + "." + version + ".json");
+			
+			if (logger.isDebugEnabled())
+				logger.debug("The action body is at " + file.getAbsolutePath());
+
+			// if file doesn't exists, then create it
+			if (!file.exists()) {
+				file.createNewFile();
+			}
+			File configHomeDir = new File(ACTION_HOME);
+			File[] listOfFiles = configHomeDir.listFiles();
+			if (listOfFiles != null){
+				for(File eachFile : listOfFiles){
+					if(eachFile.isFile()){
+						String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+						String actionFileNameWithoutExtension = FilenameUtils.removeExtension(path + "." + policyName);
+						if (fileNameWithoutExtension.equals(actionFileNameWithoutExtension)){
+							//delete the file
+							if (logger.isInfoEnabled())
+								logger.info("Deleting action body is at " + eachFile.getAbsolutePath());
+							eachFile.delete();
+						}
+					}
+				}
+			}
+			FileWriter fw = new FileWriter(file.getAbsoluteFile());
+			BufferedWriter bw = new BufferedWriter(fw);
+			bw.write(actionBodyData);
+			bw.close();
+
+			if (logger.isInfoEnabled()) {
+				logger.info("Action Body is succesfully saved at " + file.getAbsolutePath());
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+	}
+	
+	// Data required for obligation part is setting here.
+	private ObligationExpressionsType getObligationExpressions() {
+		
+		// TODO: add code to get all these values from dictionary
+		ObligationExpressionsType obligations = new ObligationExpressionsType();
+
+		ObligationExpressionType obligation = new ObligationExpressionType();
+        String comboDictValue = policyAdapter.getActionAttribute();
+		obligation.setObligationId(comboDictValue);
+		obligation.setFulfillOn(EffectType.PERMIT);
+
+		// Add Action Assignment:
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId(PERFORMER_ATTRIBUTEID);
+		assignment1.setCategory(CATEGORY_RECIPIENT_SUBJECT);
+
+		AttributeValueType actionNameAttributeValue = new AttributeValueType();
+		actionNameAttributeValue.setDataType(STRING_DATATYPE);
+		actionNameAttributeValue.getContent().add(performer.get(policyAdapter.getActionPerformer()));
+
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(actionNameAttributeValue));
+		obligation.getAttributeAssignmentExpression().add(assignment1);
+
+		// Add Type Assignment:
+		AttributeAssignmentExpressionType assignmentType = new AttributeAssignmentExpressionType();
+		assignmentType.setAttributeId(TYPE_ATTRIBUTEID);
+		assignmentType.setCategory(CATEGORY_RESOURCE);
+
+		AttributeValueType typeAttributeValue = new AttributeValueType();
+		typeAttributeValue.setDataType(STRING_DATATYPE);
+		String actionDictType = getActionPolicyDict(comboDictValue).getType();
+		typeAttributeValue.getContent().add(actionDictType);
+
+		assignmentType.setExpression(new ObjectFactory().createAttributeValue(typeAttributeValue));
+		obligation.getAttributeAssignmentExpression().add(assignmentType);
+
+		// Add Rest_URL Assignment:
+		AttributeAssignmentExpressionType assignmentURL = new AttributeAssignmentExpressionType();
+		assignmentURL.setAttributeId(URL_ATTRIBUTEID);
+		assignmentURL.setCategory(CATEGORY_RESOURCE);
+
+		AttributeValueType actionURLAttributeValue = new AttributeValueType();
+		actionURLAttributeValue.setDataType(URI_DATATYPE);
+		String actionDictUrl = getActionPolicyDict(comboDictValue).getUrl();
+		actionURLAttributeValue.getContent().add(actionDictUrl);
+
+		assignmentURL.setExpression(new ObjectFactory().createAttributeValue(actionURLAttributeValue));
+		obligation.getAttributeAssignmentExpression().add(assignmentURL);
+
+		// Add Method Assignment:
+		AttributeAssignmentExpressionType assignmentMethod = new AttributeAssignmentExpressionType();
+		assignmentMethod.setAttributeId(METHOD_ATTRIBUTEID);
+		assignmentMethod.setCategory(CATEGORY_RESOURCE);
+
+		AttributeValueType methodAttributeValue = new AttributeValueType();
+		methodAttributeValue.setDataType(STRING_DATATYPE);
+		String actionDictMethod = getActionPolicyDict(comboDictValue).getMethod();
+		methodAttributeValue.getContent().add(actionDictMethod);
+
+		assignmentMethod.setExpression(new ObjectFactory().createAttributeValue(methodAttributeValue));
+		obligation.getAttributeAssignmentExpression().add(assignmentMethod);
+
+		// Add JSON_URL Assignment:
+		String actionBody = getActionPolicyDict(comboDictValue).getBody();
+		if (!actionBody.equals(null)) {
+		//if(!(actionBody==null || "".equals(actionBody))){
+			AttributeAssignmentExpressionType assignmentJsonURL = new AttributeAssignmentExpressionType();
+			assignmentJsonURL.setAttributeId(BODY_ATTRIBUTEID);
+			assignmentJsonURL.setCategory(CATEGORY_RESOURCE);
+
+			AttributeValueType jsonURLAttributeValue = new AttributeValueType();
+			jsonURLAttributeValue.setDataType(URI_DATATYPE);
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());;
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex1 = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex1, policyDir.length());
+			logger.info("print the main domain value"+policyDir);
+			String path = policyDir.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			jsonURLAttributeValue.getContent().add(CONFIG_URL + "/Action/" +  path + "." +FilenameUtils.removeExtension(policyName) + ".json");
+
+			assignmentJsonURL.setExpression(new ObjectFactory().createAttributeValue(jsonURLAttributeValue));
+			obligation.getAttributeAssignmentExpression().add(assignmentJsonURL);
+		}
+
+		if(!getActionPolicyDict(comboDictValue).getHeader().equals(null)){
+			String headerVal = getActionPolicyDict(comboDictValue).getHeader();
+			if(headerVal != null && !headerVal.equals("")){
+				// parse it on : to get number of headers
+				String[] result = headerVal.split(":");
+				System.out.println(Arrays.toString(result));
+				for (String eachString : result){
+					// parse each value on =
+					String[] textFieldVals = eachString.split("=");
+					obligation.getAttributeAssignmentExpression().add(addDynamicHeaders(textFieldVals[0], textFieldVals[1]));
+				}
+			}
+
+		}
+			
+		obligations.getObligationExpression().add(obligation);
+		return obligations;
+	}
+
+	
+	// if compound setting the inner apply here
+	protected ApplyType getInnerActionApply(String value1Label) {
+		ApplyType actionApply = new ApplyType();
+		int index = 0;
+		// check the index for the label.
+		for (String labelAttr : dynamicLabelRuleAlgorithms) {
+			if (labelAttr.equals(value1Label)) {
+				String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+				// check if the row contains label again
+				for (String labelValue : dynamicLabelRuleAlgorithms) {
+					if (labelValue.equals(value1)) {
+						return getCompoundApply(index);
+					}
+				}
+
+				// Getting the values from the form.
+				String functionKey = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+				String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+				actionApply.setFunctionId(dropDownMap.get(functionKey));
+				// if two text field are rule attributes.
+				if ((value1.contains(RULE_VARIABLE)) && (value2.contains(RULE_VARIABLE))) {
+					ApplyType innerActionApply1 = new ApplyType();
+					ApplyType innerActionApply2 = new ApplyType();
+					AttributeDesignatorType attributeDesignator1 = new AttributeDesignatorType();
+					AttributeDesignatorType attributeDesignator2 = new AttributeDesignatorType();
+					// If selected function is Integer function set integer functionID
+					if (functionKey.toLowerCase().contains("integer")) {
+						innerActionApply1.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+						innerActionApply2.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+						attributeDesignator1.setDataType(INTEGER_DATATYPE);
+						attributeDesignator2.setDataType(INTEGER_DATATYPE);
+					} else {
+						// If selected function is not a Integer function
+						// set String functionID
+						innerActionApply1.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+						innerActionApply2.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+						attributeDesignator1.setDataType(STRING_DATATYPE);
+						attributeDesignator2.setDataType(STRING_DATATYPE);
+					}
+					attributeDesignator1.setCategory(CATEGORY_RESOURCE);
+					attributeDesignator2.setCategory(CATEGORY_RESOURCE);
+
+					// Here set actual field values
+					attributeDesignator1.setAttributeId(value1.contains("resource:") ? value1.substring(9): value1.substring(8));
+					attributeDesignator2.setAttributeId(value1.contains("resource:") ? value1.substring(9): value1.substring(8));
+
+					innerActionApply1.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator1));
+					innerActionApply2.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator2));
+
+					actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply1));
+					actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply2));
+
+				} else {// if either of one text field is rule attribute.
+					ApplyType innerActionApply = new ApplyType();
+					AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+					AttributeValueType actionConditionAttributeValue = new AttributeValueType();
+
+					if (functionKey.toLowerCase().contains("integer")) {
+						innerActionApply.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+						actionConditionAttributeValue.setDataType(INTEGER_DATATYPE);
+						attributeDesignator.setDataType(INTEGER_DATATYPE);
+					} else {
+						innerActionApply.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+						actionConditionAttributeValue.setDataType(STRING_DATATYPE);
+						attributeDesignator.setDataType(STRING_DATATYPE);
+					}
+
+					String attributeId = null;
+					String attributeValue = null;
+
+					// Find which textField has rule attribute and set it as
+					attributeId = value1;
+					attributeValue = value2;
+
+					if (attributeId != null) {
+						attributeDesignator.setCategory(CATEGORY_RESOURCE);
+						attributeDesignator.setAttributeId(attributeId);
+					}
+					actionConditionAttributeValue.getContent().add(attributeValue);
+					innerActionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
+					// Decide the order of element based the values.
+					if (attributeId.equals(value1)) {
+						actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
+						actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
+					} else {
+						actionApply.getExpression().add(new ObjectFactory().createAttributeValue(actionConditionAttributeValue));
+						actionApply.getExpression().add(new ObjectFactory().createApply(innerActionApply));
+					}
+				}
+			}
+			index++;
+		}
+		return actionApply;
+	}
+
+	// if the rule algorithm is multiple compound one setting the apply
+	protected ApplyType getCompoundApply(int index) {
+		ApplyType actionApply = new ApplyType();
+		String selectedFunction = dynamicFieldFunctionRuleAlgorithms.get(index).toString();
+		String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+		String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+		actionApply.setFunctionId(dropDownMap.get(selectedFunction));
+		actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value1)));
+		actionApply.getExpression().add(new ObjectFactory().createApply(getInnerActionApply(value2)));
+		return actionApply;
+	}
+		
+	// Adding the dynamic headers if any
+	private AttributeAssignmentExpressionType addDynamicHeaders(String header, String value) {
+		AttributeAssignmentExpressionType assignmentHeaders = new AttributeAssignmentExpressionType();
+		assignmentHeaders.setAttributeId("headers:" + header);
+		assignmentHeaders.setCategory(CATEGORY_RESOURCE);
+
+		AttributeValueType headersAttributeValue = new AttributeValueType();
+		headersAttributeValue.setDataType(STRING_DATATYPE);
+		headersAttributeValue.getContent().add(value);
+
+		assignmentHeaders.setExpression(new ObjectFactory().createAttributeValue(headersAttributeValue));
+		return assignmentHeaders;
+	}
+	
+	private Map<String,String> createDropDownMap(){
+		JPAUtils jpaUtils = null;
+		try {
+			jpaUtils = JPAUtils.getJPAUtilsInstance(policyAdapter.getEntityManagerFactory());
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Map<Datatype, List<FunctionDefinition>> functionMap = jpaUtils.getFunctionDatatypeMap();
+		Map<String, String> dropDownMap = new HashMap<String, String>();
+		for (Datatype id : functionMap.keySet()) {
+			List<FunctionDefinition> functionDefinitions = (List<FunctionDefinition>) functionMap
+					.get(id);
+			for (FunctionDefinition functionDef : functionDefinitions) {
+				dropDownMap.put(functionDef.getShortname(),functionDef.getXacmlid());
+			}
+		}
+		
+		return dropDownMap;
+	}
+	
+	private ActionPolicyDict getActionPolicyDict(String attributeName){
+		ActionPolicyDict retObj = new ActionPolicyDict();
+		//EntityManagerFactory emf = policyAdapter.getEntityManagerFactory();
+		//EntityManager em = emf.createEntityManager();
+		EntityManager em = policyAdapter.getEntityManagerFactory().createEntityManager();
+		Query getActionPolicyDicts = em.createNamedQuery("ActionPolicyDict.findAll");	
+		List<?> actionPolicyDicts = getActionPolicyDicts.getResultList(); 	
+		
+		for (Object id : actionPolicyDicts) {
+			//ActionPolicyDict actionPolicyList = actionPolicyDicts.getItem(id).getEntity();
+			ActionPolicyDict actionPolicy = (ActionPolicyDict) id;
+			if(attributeName.equals(actionPolicy.getAttributeName())){
+				retObj = actionPolicy;
+				break;
+			}
+		}
+		
+		try{
+		em.getTransaction().commit();
+		} catch(Exception e){
+			try{
+				em.getTransaction().rollback();
+			} catch(Exception e2){
+				e2.printStackTrace();
+			}
+		}
+		em.close();
+		
+		return retObj;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getPolicyData();
+	}
+
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java
new file mode 100644
index 0000000..61498e2
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/AutoPushPolicy.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.api.pap.PAPPolicyEngine;
+
+import com.att.research.xacml.api.pap.PAPEngine;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+/**
+ * Auto Push Policy based on the property file properties. 
+ * 
+ * @version 0.1
+ */
+public class AutoPushPolicy {
+	
+	private static final Logger logger = FlexLogger.getLogger(AutoPushPolicy.class);
+	
+	private String filePath = null;
+	private Properties properties;
+	private Long newModified;
+	private Long oldModified;
+	private File propFile;
+	
+	
+	/**
+	 * Constructor Pass in the property file path. 
+	 */
+	public AutoPushPolicy(String file){
+		filePath = file;
+		properties = new Properties();
+		propFile = Paths.get(filePath).toFile();
+		readFile();
+	}
+	
+	/**
+	 * Checks Policy with all the Groups which has set such Property. 
+	 * Else returns Empty Set. 
+	 * 
+	 * @param policyToCreateUpdate
+	 * @param papEngine
+	 */
+	public Set<StdPDPGroup> checkGroupsToPush(String policyToCreateUpdate, PAPPolicyEngine papEngine) {
+		Set<StdPDPGroup> changedGroups= new HashSet<StdPDPGroup>();
+		// Check if the file has been modified. then re-load the properties file. 
+		newModified = propFile.lastModified();
+		try {
+			if(newModified!=oldModified){
+				// File has been updated.
+				readFile();
+			}
+			// Read the File name as its made.
+			String gitPath  = PolicyDBDao.getGitPath();
+			String policyId =  policyToCreateUpdate.substring(policyToCreateUpdate.indexOf(gitPath)+gitPath.length()+1);
+			String policyName = policyId.substring(policyId.lastIndexOf(File.separator)+1,policyId.lastIndexOf("."));
+			policyName = policyName.substring(0,policyName.lastIndexOf("."));
+			policyId = policyId.replace("/", ".");
+			if(policyId.contains("\\")){
+				policyId = policyId.replace("\\", ".");
+			}
+			logger.info("Policy ID : " + policyId);
+			logger.info("Policy Name : " + policyName);
+			// Read in Groups 
+			for(EcompPDPGroup pdpGroup: papEngine.getEcompPDPGroups()){
+				String groupName = pdpGroup.getName();
+				Boolean typeFlag = false;
+				Boolean scopeFlag = false;
+				if(properties.containsKey(groupName + ".policyType")){
+					String type= properties.getProperty(groupName + ".policyType").replaceAll(" ","");
+					if(type.equals("")){
+						type = " ";
+					}
+					typeFlag = policyName.contains(type);
+				}
+				if(properties.containsKey(groupName + ".policyScope")){
+					String scope = properties.getProperty(groupName + ".policyScope").replaceAll(" ", "");
+					if(scope.equals("")){
+						scope = " ";
+					}
+					scopeFlag = policyId.contains(scope);
+				}
+				if(typeFlag || scopeFlag){
+					StdPDPGroup group = addToGroup(policyId,policyName, policyToCreateUpdate, (StdPDPGroup)pdpGroup);
+					changedGroups.add(group);
+				}
+			}
+		} catch (Exception e) {
+			//TODO:EELF Cleanup - Remove logger
+ 			//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while processing the auto push for " + policyToCreateUpdate +"\n " + e.getMessage());
+ 			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "AutoPushPolicy", "Error while processing the auto push for " + policyToCreateUpdate);
+		}
+		return changedGroups;
+	}
+	
+	private void readFile(){
+		try {
+			properties.load(new FileInputStream(propFile));
+			oldModified = propFile.lastModified();
+		} catch (Exception e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while loading in the auto push properties file. " + propFile.toString());
+			PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "AutoPushPolicy", "Error while loading in the auto push properties file.");
+		}
+	}
+	
+	private StdPDPGroup addToGroup(String policyId, String policyName, String policyToCreateUpdate, StdPDPGroup pdpGroup) throws Exception{
+		// Add to group. Send Notification. 
+		StdPDPPolicy policy = new StdPDPPolicy(policyId, true, policyName, Paths.get(policyToCreateUpdate).toUri());
+		//Get the current policies from the Group and Add the new one
+        Set<PDPPolicy> currentPoliciesInGroup = pdpGroup.getPolicies();
+        Set<PDPPolicy> policies = new HashSet<PDPPolicy>();
+        if(policy!=null){
+			policies.add(policy);
+		}
+        pdpGroup.copyPolicyToFile(policyId, new FileInputStream(Paths.get(policyToCreateUpdate).toFile()));
+        //If the selected policy is in the group we must remove it because the name is default
+		Iterator<PDPPolicy> policyIterator = policies.iterator();
+		while (policyIterator.hasNext()) {
+			PDPPolicy selPolicy = policyIterator.next();
+			for (PDPPolicy existingPolicy : currentPoliciesInGroup) {
+				if (existingPolicy.getId().equals(selPolicy.getId())) {
+					pdpGroup.removePolicyFromGroup(existingPolicy);
+					logger.debug("Removing policy: " + existingPolicy);
+					break;
+				}
+			}
+		}
+		if(currentPoliciesInGroup!=null){
+            policies.addAll(currentPoliciesInGroup);
+        }
+		pdpGroup.setPolicies(policies);
+		return pdpGroup;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java
new file mode 100644
index 0000000..8c3e34d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ClosedLoopPolicy.java
@@ -0,0 +1,552 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class ClosedLoopPolicy extends Policy {
+	
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public ClosedLoopPolicy() {
+		super();
+	}
+	
+	public ClosedLoopPolicy(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+	
+	//save configuration of the policy based on the policyname
+	private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+		String domain = getParentPathSubScopeDir();
+		String path = domain.replace('\\', '.');
+		if(path.contains("/")){
+			path = domain.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		try {
+			String body = jsonBody;
+			try {
+				try{
+					//Remove the trapMaxAge in Verification Signature
+					body = body.replace(",\"trapMaxAge\":null", "");
+				}catch(Exception e){
+					logger.debug("No Trap Max Age in JSON body");
+				}
+				this.policyAdapter.setJsonBody(body);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+			System.out.println(body);
+			if(policyName.endsWith(".xml")){
+				policyName	 = policyName.substring(0, policyName.lastIndexOf(".xml"));	
+			}
+			PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+			out.println(body);
+			out.close();
+
+		} catch (JsonGenerationException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+	}
+	
+	//Utility to read json data from the existing file to a string
+	static String readFile(String path, Charset encoding) throws IOException {
+		
+		byte[] encoded = Files.readAllBytes(Paths.get(path));
+		return new String(encoded, encoding);
+		
+	}
+	
+	//create the configuration file based on the policy name on adding the extension as .json 
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".xml")) {
+			filename = filename.substring(0, filename.length() - 4);
+		}
+		filename = filename + ".json";
+		return filename;
+	}
+
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			prepareToSave();
+		}
+		
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+
+		successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject());	
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+		
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+
+		if (policyAdapter.getData() != null) {
+			
+			//delete the closed loop draft file and configuration file, if validation is success after editing the draft policy
+			String prevPolicyName = null;
+			if(policyAdapter.isEditPolicy()){
+				prevPolicyName = "Config_Fault_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+
+				if (policyAdapter.isDraft()) {
+					policyName = "Config_Fault_" + policyAdapter.getPolicyName() + "_Draft";
+				} else {
+					policyName = "Config_Fault_" + policyAdapter.getPolicyName();
+				}
+				
+				//delete the closed loop draft configuration file, if validation is success after editing the draft policy
+				final Path gitPath = Paths.get(policyAdapter.getUserGitPath());
+				String policyDir = policyAdapter.getParentPath();
+				int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+				policyDir = policyDir.substring(startIndex, policyDir.length());
+				logger.info("print the main domain value"+policyDir);
+				String path = policyDir.replace('\\', '.');
+				if(path.contains("/")){
+					path = policyDir.replace('/', '.');
+					logger.info("print the path:" +path); 
+				}
+				String fileName = FilenameUtils.removeExtension(policyName);
+
+				final String tempPath = path;
+				String fileLocation = null;
+				if (fileName != null && fileName.contains("Config_Fault_")) {
+					fileLocation = CONFIG_HOME;
+				} 
+				// Get the file from the saved location
+				File dir = new File(fileLocation);
+				File[] listOfFiles = dir.listFiles();
+				for (File file : listOfFiles) {
+					String configFile = null;
+					if(!policyAdapter.isDraft()){
+						configFile = fileName + "_Draft";
+					}else{
+						configFile = fileName;
+					}
+					if (file.isFile() && file.getName().contains( tempPath + "." + configFile)) {
+						try {
+							if (file.delete() == false) {
+								throw new Exception(
+										"No known error, Delete failed");
+							}
+						} catch (Exception e) {
+							logger.error("Failed to Delete file: "
+									+ e.getLocalizedMessage());
+						}
+					}
+				}
+			}
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			String policyName1 = null;
+			if(policyAdapter.isDraft()){
+				policyName1 = policyAdapter.getPolicyName() + "_Draft";
+			}else{
+				policyName1 = policyAdapter.getPolicyName();
+			}
+			
+			Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(), policyAdapter.getConfigPolicyType(), policyName1, version);
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("File already exists, cannot create the policy.");
+				PolicyLogger.error("File already exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			
+			policyName = newFile.getFileName().toString();
+			
+			// Save the Configurations file with the policy name with extention based on selection.
+			String jsonBody = policyAdapter.getJsonBody();
+			saveConfigurations(policyName, prevPolicyName, jsonBody);
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+			PolicyType faultPolicy = (PolicyType) policyAdapter.getData();
+			
+			faultPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			faultPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+			
+			AllOfType allOfOne = new AllOfType();
+			File policyFilePath = new File(policyAdapter.getParentPath().toString(), policyName);
+			String policyDir = policyFilePath.getParentFile().getName();
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = policyDir + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			AllOfType allOf = new AllOfType();
+			// Adding the matches to AllOfType element
+			// Match for Ecomp
+			allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+			// Adding the target to the policy element
+			faultPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+			rule.setEffect(EffectType.PERMIT);
+			
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getStackTrace());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateClosedLoopPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType closedMatch = new MatchType();
+			AttributeValueType closedAttributeValue = new AttributeValueType();
+			closedAttributeValue.setDataType(STRING_DATATYPE);
+			closedAttributeValue.getContent().add("Config");
+			closedMatch.setAttributeValue(closedAttributeValue);
+			AttributeDesignatorType closedAttributeDesignator = new AttributeDesignatorType();
+			URI closedURI = null;
+			try {
+				closedURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getStackTrace());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateClosedLoopPolicy", "Exception creating closed URI");
+			}
+			closedAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			closedAttributeDesignator.setDataType(STRING_DATATYPE);
+			closedAttributeDesignator.setAttributeId(new IdentifierImpl(closedURI).stringValue());
+			closedMatch.setAttributeDesignator(closedAttributeDesignator);
+			closedMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(closedMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			faultPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(faultPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}
+
+		setPreparedToSave(true);
+		return true;
+	}
+
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("faultID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment1);
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		// For Config file Url if configurations are provided.
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value"+policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+
+		String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+		System.out.println("URL value :" + content);
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment2);
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+		}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+		}
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+		advice.getAttributeAssignmentExpression().add(assignment4);
+
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+		assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+		advice.getAttributeAssignmentExpression().add(assignment5);
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("RiskType");
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getRiskType());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+		advice.getAttributeAssignmentExpression().add(assignment6);
+		
+		AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+		assignment7.setAttributeId("RiskLevel");
+		assignment7.setCategory(CATEGORY_RESOURCE);
+		assignment7.setIssuer("");
+
+		AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+		configNameAttributeValue7.setDataType(STRING_DATATYPE);
+		configNameAttributeValue7.getContent().add(policyAdapter.getRiskLevel());
+		assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+		advice.getAttributeAssignmentExpression().add(assignment7);	
+
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("guard");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getGuard());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);
+		
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("TTLDate");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getTtlDate());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);
+
+
+		
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getPolicyData();
+	}
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java
new file mode 100644
index 0000000..a339b15
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/ConfigPolicy.java
@@ -0,0 +1,693 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+import java.util.StringTokenizer;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class ConfigPolicy extends Policy {
+
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+
+	private String configBodyData;
+
+	public ConfigPolicy() {
+		super();
+	}
+	
+	public ConfigPolicy(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+
+	// Saving the Configurations file at server location for config policy.
+	protected void saveConfigurations(String policyName) {
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		logger.info("print the main domain value"+policyDir);
+		String path = policyDir.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		
+		try {
+			File file;
+			String configFileName = getConfigFile(policyName);
+			if(CONFIG_HOME.contains("\\"))
+			{
+			 file = new File(CONFIG_HOME + "\\" + path + "."+ configFileName);
+			}
+			else
+			{
+			 file = new File(CONFIG_HOME + "/" + path + "."+ configFileName);
+			}
+			
+			// if file doesnt exists, then create it
+			if (!file.exists()) {
+				file.createNewFile();
+			}
+
+
+			File configHomeDir = new File(CONFIG_HOME);
+			File[] listOfFiles = configHomeDir.listFiles();
+			if (listOfFiles != null){
+				for(File eachFile : listOfFiles){
+					if(eachFile.isFile()){
+						String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+						String configFileNameWithoutExtension = FilenameUtils.removeExtension(path + "." + configFileName);
+						if (fileNameWithoutExtension.equals(configFileNameWithoutExtension)){
+							//delete the file
+							eachFile.delete();
+						}
+					}
+				}
+			}
+
+			FileWriter fw = new FileWriter(file.getAbsoluteFile());
+			BufferedWriter bw = new BufferedWriter(fw);
+			bw.write(configBodyData);
+			bw.close();
+			if (logger.isDebugEnabled()) {
+				logger.debug("Configuration is succesfully saved");
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	// Here we are adding the extension for the configurations file based on the
+	// config type selection for saving.
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".xml")) {
+			filename = filename.substring(0, filename.length() - 4);
+		}
+		String id = policyAdapter.getConfigType();
+
+		if (id != null) {
+			if (id.equalsIgnoreCase(JSON_CONFIG)) {
+				filename = filename + ".json";
+			}
+			if (id.equalsIgnoreCase(XML_CONFIG)) {
+				filename = filename + ".xml";
+			}
+			if (id.equalsIgnoreCase(PROPERTIES_CONFIG)) {
+				filename = filename + ".properties";
+			}
+			if (id.equalsIgnoreCase(OTHER_CONFIG)) {
+				filename = filename + ".txt";
+			}
+		}
+		return filename;
+	}
+
+	// Validations for Config form
+	/*
+	 * FORM VALIDATION WILL BE DONE BY THE PAP-ADMIN before creating JSON object... 
+	 * BODY VALIDATION WILL BE DONE BY THE PAP-REST after receiving and deserializing the JSON object
+	 */
+	public boolean validateConfigForm() {
+		
+		isValidForm = true;
+		
+		/*
+		 * Validate Text Area Body
+		 */
+		configBodyData = policyAdapter.getConfigBodyData();
+		String id = policyAdapter.getConfigType();
+		if (id != null) {
+			if (id.equals(JSON_CONFIG)) {
+				if (!isJSONValid(configBodyData)) {
+					isValidForm = false;
+				}
+			} else if (id.equals(XML_CONFIG)) {
+				if (!isXMLValid(configBodyData)) {
+					isValidForm = false;
+				}
+			} else if (id.equals(PROPERTIES_CONFIG)) {
+				if (!isPropValid(configBodyData)||configBodyData.equals("")) {
+					isValidForm = false;
+				} 
+			} else if (id.equals(OTHER_CONFIG)) {
+				if (configBodyData.equals("")) {
+					isValidForm = false;
+				}
+			}
+		}
+		return isValidForm;
+
+	}
+
+	// Validation for XML.
+	private boolean isXMLValid(String data) {
+
+		SAXParserFactory factory = SAXParserFactory.newInstance();
+		factory.setValidating(false);
+		factory.setNamespaceAware(true);
+		try {
+			SAXParser parser = factory.newSAXParser();
+			XMLReader reader = parser.getXMLReader();
+			reader.setErrorHandler(new XMLErrorHandler());
+			reader.parse(new InputSource(new StringReader(data)));
+		} catch (ParserConfigurationException e) {
+			return false;
+		} catch (SAXException e) {
+			return false;
+		} catch (IOException e) {
+			return false;
+		}
+		return true;
+
+	}
+
+	// Validation for Properties file.
+	public boolean isPropValid(String prop) {
+
+		Scanner scanner = new Scanner(prop);
+		while (scanner.hasNextLine()) {
+			String line = scanner.nextLine();
+			line.replaceAll("\\s+", "");
+			if (line.startsWith("#")) {
+				continue;
+			} else {
+				if (line.contains("=")) {
+					String[] parts = line.split("=");
+					if (parts.length < 2) {
+						scanner.close();
+						return false;
+					}
+				} else {
+					scanner.close();
+					return false;
+				}
+			}
+		}
+		scanner.close();
+		return true;
+
+	}
+
+	public class XMLErrorHandler implements ErrorHandler {
+
+		public void warning(SAXParseException e) throws SAXException {
+			System.out.println(e.getMessage());
+		}
+
+		public void error(SAXParseException e) throws SAXException {
+			System.out.println(e.getMessage());
+		}
+
+		public void fatalError(SAXParseException e) throws SAXException {
+			System.out.println(e.getMessage());
+		}
+
+	}
+
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			//Prep and configure the policy for saving
+			prepareToSave();
+		}
+
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );		
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+	
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+		
+		if (policyAdapter.getData() != null) {
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("File already exists");
+				PolicyLogger.error("File alrady exists");
+				setPolicyExists(true);
+				return false;
+			}
+			policyName = newFile.getFileName().toString();
+			
+			// Body is optional so checking.
+			configBodyData = policyAdapter.getConfigBodyData();
+			if (!configBodyData.equals("")) {
+				// Save the Configurations file with the policy name with extention based on selection.
+				saveConfigurations(policyName);
+			}
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+	
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+			
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+			AllOfType allOfOne = new AllOfType();
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			logger.info("print the main domain value "+policyDir);
+			String path = policyDir.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = path + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			AllOfType allOf = new AllOfType();
+			
+			// Adding the matches to AllOfType element Match for Ecomp
+			allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			// Match for ConfigName
+			allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+			
+			Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+			
+			// If there is any dynamic field create the matches here
+			for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+				String key = keyField;
+				String value = dynamicFieldConfigAttributes.get(key);
+				MatchType dynamicMatch = createDynamicMatch(key, value);
+				allOf.getMatch().add(dynamicMatch);
+			}
+
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+			
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+			
+			rule.setEffect(EffectType.PERMIT);
+			
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "ConfigPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+			configAttributeValue.getContent().add("Config");
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "ConfigPolicy", "Exception creating Config URI");
+			}
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("configID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment1);
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		
+		// For Config file Url if configurations are provided.
+		if (policyAdapter.getConfigType() != null) {
+			AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+			assignment2.setAttributeId("URLID");
+			assignment2.setCategory(CATEGORY_RESOURCE);
+			assignment2.setIssuer("");
+
+			AttributeValueType AttributeValue = new AttributeValueType();
+			AttributeValue.setDataType(URI_DATATYPE);
+			String policyDir1 = policyAdapter.getParentPath().toString();
+			int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+			logger.info("print the main domain value"+policyDir1);
+			String path = policyDir1.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir1.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+
+			String content = "$URL" + "/Config/" + path + "." + getConfigFile(policyName);
+			System.out.println("URL value :" + content);
+			AttributeValue.getContent().add(content);
+			assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+			advice.getAttributeAssignmentExpression().add(assignment2);
+			AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+			assignment3.setAttributeId("PolicyName");
+			assignment3.setCategory(CATEGORY_RESOURCE);
+			assignment3.setIssuer("");
+
+			AttributeValueType attributeValue3 = new AttributeValueType();
+			attributeValue3.setDataType(STRING_DATATYPE);
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			StringTokenizer tokenizer = null;
+			StringBuffer buffer = new StringBuffer();
+			if (policyDir.contains("\\")) {
+				tokenizer = new StringTokenizer(policyDir, "\\");
+			} else {
+				tokenizer = new StringTokenizer(policyDir, "/");
+			}
+			if (tokenizer != null) {
+				while (tokenizer.hasMoreElements()) {
+					String value = tokenizer.nextToken();
+					buffer.append(value);
+					buffer.append(".");
+				}
+			}
+			fileName = FilenameUtils.removeExtension(fileName);
+			fileName = buffer.toString() + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			attributeValue3.getContent().add(name);
+			assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+			advice.getAttributeAssignmentExpression().add(assignment3);
+
+			AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+			assignment4.setAttributeId("VersionNumber");
+			assignment4.setCategory(CATEGORY_RESOURCE);
+			assignment4.setIssuer("");
+
+			AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+			configNameAttributeValue4.setDataType(STRING_DATATYPE);
+			configNameAttributeValue4.getContent().add(Integer.toString(version));
+			assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+			advice.getAttributeAssignmentExpression().add(assignment4);
+
+			AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+			assignment5.setAttributeId("matching:" + this.ECOMPID);
+			assignment5.setCategory(CATEGORY_RESOURCE);
+			assignment5.setIssuer("");
+
+			AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+			configNameAttributeValue5.setDataType(STRING_DATATYPE);
+			configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+			assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+			advice.getAttributeAssignmentExpression().add(assignment5);
+
+			AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+			assignment6.setAttributeId("matching:" + this.CONFIGID);
+			assignment6.setCategory(CATEGORY_RESOURCE);
+			assignment6.setIssuer("");
+
+			AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+			configNameAttributeValue6.setDataType(STRING_DATATYPE);
+			configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+			assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+			advice.getAttributeAssignmentExpression().add(assignment6);
+
+			Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+			for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+				String key = keyField;
+				String value = dynamicFieldConfigAttributes.get(key);
+				AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+				assignment7.setAttributeId("matching:" + key);
+				assignment7.setCategory(CATEGORY_RESOURCE);
+				assignment7.setIssuer("");
+
+				AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+				configNameAttributeValue7.setDataType(STRING_DATATYPE);
+				configNameAttributeValue7.getContent().add(value);
+				assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+				advice.getAttributeAssignmentExpression().add(assignment7);
+			}
+		}
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("RiskType");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);
+		
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("RiskLevel");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);	
+
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("guard");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+		
+		AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+		assignment11.setAttributeId("TTLDate");
+		assignment11.setCategory(CATEGORY_RESOURCE);
+		assignment11.setIssuer("");
+
+		AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+		configNameAttributeValue11.setDataType(STRING_DATATYPE);
+		configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+		assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+		advice.getAttributeAssignmentExpression().add(assignment11);
+		
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getPolicyData();
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java
new file mode 100644
index 0000000..6e18da5
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsParamPolicy.java
@@ -0,0 +1,896 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher; 
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import com.att.research.xacml.std.IdentifierImpl;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class CreateBrmsParamPolicy extends Policy {
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger
+			.getLogger(CreateBrmsParamPolicy.class);
+
+	/*
+	 * These are the parameters needed for DB access from the PAP
+	 */
+	private static String papDbDriver = null;
+	private static String papDbUrl = null;
+	private static String papDbUser = null;
+	private static String papDbPassword = null;
+
+	public CreateBrmsParamPolicy() {
+		super();
+	}
+
+	public CreateBrmsParamPolicy(PolicyRestAdapter policyAdapter) {
+		this.policyAdapter = policyAdapter;
+		this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+
+	}
+	
+	public String expandConfigBody(String ruleContents,  
+										Map<String, String> brmsParamBody
+										  ) { 
+			 
+			Set<String> keySet= new HashSet<String>();
+			
+			Map<String,String> copyMap=new HashMap<>();
+			copyMap.putAll(brmsParamBody);
+			copyMap.put("policyName", policyAdapter.getPolicyName());
+			copyMap.put("policyScope", policyAdapter.getPolicyScope());
+			copyMap.put("policyVersion",policyAdapter.getHighestVersion().toString());
+			
+			//Finding all the keys in the Map data-structure.
+			keySet= copyMap.keySet();
+			Iterator<String> iterator = keySet.iterator(); 
+			Pattern p;
+			Matcher m;
+			while(iterator.hasNext()) {
+				//Converting the first character of the key into a lower case. 
+				String input= iterator.next();
+				String output  = Character.toLowerCase(input.charAt(0)) +
+		                   (input.length() > 1 ? input.substring(1) : "");
+				//Searching for a pattern in the String using the key. 
+				p=Pattern.compile("\\$\\{"+output+"\\}");	
+				m=p.matcher(ruleContents);
+				//Replacing the value with the inputs provided by the user in the editor. 
+				String finalInput = copyMap.get(input);
+				if(finalInput.contains("$")){
+					finalInput = finalInput.replace("$", "\\$");
+				}
+				ruleContents=m.replaceAll(finalInput);
+			}
+			System.out.println(ruleContents);
+			return ruleContents; 
+	} 
+			 
+	// Saving the Configurations file at server location for config policy.
+	protected void saveConfigurations(String policyName, String prevPolicyName,
+			String ruleBody) {
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+				.toString());
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		logger.info("print the main domain value" + policyDir);
+		String path = policyDir.replace('\\', '.');
+		if (path.contains("/")) {
+			path = policyDir.replace('/', '.');
+			logger.info("print the path:" + path);
+		}
+
+		
+			String configFileName = getConfigFile(policyName);
+        try{
+			// Getting the previous policy Config Json file to be used for
+			// updating the dictionary tables
+			if (policyAdapter.isEditPolicy()) {
+
+				String prevConfigFileName = getConfigFile(prevPolicyName);
+
+				File oldFile;
+				if (CONFIG_HOME.contains("\\")) {
+					oldFile = new File(CONFIG_HOME + "\\" + path + "."
+							+ prevConfigFileName);
+				} else {
+					oldFile = new File(CONFIG_HOME + "/" + path + "."
+							+ prevConfigFileName);
+				}
+
+				String filepath = oldFile.toString();
+
+				String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+				policyAdapter.setPrevJsonBody(prevJsonBody);
+			}
+
+			File configHomeDir = new File(CONFIG_HOME);
+			File[] listOfFiles = configHomeDir.listFiles();
+			if (listOfFiles != null) {
+				for (File eachFile : listOfFiles) {
+					if (eachFile.isFile()) {
+						String fileNameWithoutExtension = FilenameUtils
+								.removeExtension(eachFile.getName());
+						String configFileNameWithoutExtension = FilenameUtils
+								.removeExtension(configFileName);
+						if (fileNameWithoutExtension
+								.equals(configFileNameWithoutExtension)) {
+							// delete the file
+							eachFile.delete();
+						}
+					}
+				}
+			}
+        }
+        catch(IOException e){
+        	
+        }
+			try {
+				
+				if (policyName.endsWith(".xml")) {
+					policyName = policyName.substring(0,
+							policyName.lastIndexOf(".xml"));
+				}
+				PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator
+						+ path + "." + policyName + ".txt");
+				String expandedBody=expandConfigBody(ruleBody,policyAdapter.getBrmsParamBody());
+				out.println(expandedBody);
+				out.close();
+
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+				PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving configuration file");
+			}
+	}
+
+	// Utility to read json data from the existing file to a string
+	static String readFile(String path, Charset encoding) throws IOException {
+
+		byte[] encoded = Files.readAllBytes(Paths.get(path));
+		return new String(encoded, encoding);
+
+	}
+
+	// Here we are adding the extension for the configurations file based on the
+	// config type selection for saving.
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".txt")) {
+			filename = filename.substring(0, filename.length() - 3);
+		}
+
+		filename = filename + ".txt";
+		return filename;
+	}
+
+	// Validations for Config form
+	public boolean validateConfigForm() {
+
+		// Validating mandatory Fields.
+		isValidForm = true;
+		return isValidForm;
+
+	}
+
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if (!isPreparedToSave()) {
+			prepareToSave();
+		}
+		// Until here we prepared the data and here calling the method to create
+		// xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(),
+				policyName);
+		
+		Boolean dbIsUpdated = true;
+
+		successMap = new HashMap<String, String>();
+		if (dbIsUpdated) {
+			successMap = createPolicy(newPolicyPath,
+					getCorrectPolicyDataObject());
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Failed to Update the Database Dictionary Tables.");
+			PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+
+			// remove the new json file
+			String jsonBody = policyAdapter.getPrevJsonBody();
+			saveConfigurations(policyName, "", jsonBody);
+			successMap.put("error", "DB UPDATE");
+		}
+
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;
+	}
+	
+	private String getValueFromDictionary(String templateName){
+		
+		Connection con = null;
+		Statement st = null;
+		ResultSet rs = null;
+		
+		/*
+		 * Retrieve the property values for db access from the xacml.pap.properties
+		 */
+		papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+		papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+		papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+		papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+		
+		String ruleTemplate=null;
+		
+		try {
+			//Get DB Connection
+			Class.forName(papDbDriver);
+			con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+			st = con.createStatement();
+			
+			String queryString="select rule from BRMSParamTemplate where param_template_name=\"";
+			queryString=queryString+templateName+"\"";
+			
+			rs = st.executeQuery(queryString);
+			if(rs.next()){
+				ruleTemplate=rs.getString("rule");
+			}
+			rs.close();
+		}catch (ClassNotFoundException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(e.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateBrmsParamPolicy", "Exception querying BRMSParamTemplate");
+			System.out.println(e.getMessage());
+
+		} catch (SQLException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(e.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "CreateBrmsParamPolicy", "Exception querying BRMSParamTemplate");
+			System.out.println(e.getMessage());
+		} finally {
+			try{
+				if (con!=null) con.close();
+				if (rs!=null) rs.close();
+				if (st!=null) st.close();
+			} catch (Exception ex){}
+		}
+		return ruleTemplate;
+		
+	}
+	
+	protected Map<String, String> findType(String rule) {
+		Map<String, String> mapFieldType= new HashMap<String,String>();
+		if(rule!=null){
+			try {
+				String params = "";
+				Boolean flag = false;
+				Boolean comment = false;
+				String lines[] = rule.split("\n");
+				for(String line : lines){
+					if (line.isEmpty() || line.startsWith("//")) {
+						continue;
+					}
+					if (line.startsWith("/*")) {
+						comment = true;
+						continue;
+					}
+					if (line.contains("//")) {
+						if(!(line.contains("http://") || line.contains("https://"))){
+							line = line.split("\\/\\/")[0];
+						}
+					}
+					if (line.contains("/*")) {
+						comment = true;
+						if (line.contains("*/")) {
+							try {
+								comment = false;
+								line = line.split("\\/\\*")[0]
+										+ line.split("\\*\\/")[1].replace("*/", "");
+							} catch (Exception e) {
+								line = line.split("\\/\\*")[0];
+							}
+						} else {
+							line = line.split("\\/\\*")[0];
+						}
+					}
+					if (line.contains("*/")) {
+						comment = false;
+						try {
+							line = line.split("\\*\\/")[1].replace("*/", "");
+						} catch (Exception e) {
+							line = "";
+						}
+					}
+					if (comment) {
+						continue;
+					}
+					if (flag) {
+						params = params + line;
+					}
+					if (line.contains("declare Params")) {
+						params = params + line;
+						flag = true;
+					}
+					if (line.contains("end") && flag) {
+						break;
+					}
+				}
+				params = params.replace("declare Params", "").replace("end", "")
+						.replaceAll("\\s+", "");
+				String[] components = params.split(":");
+				String caption = "";
+				for (int i = 0; i < components.length; i++) {
+					String type = "";
+					if (i == 0) {
+						caption = components[i];
+					}
+					if(caption.equals("")){
+						break;
+					}
+					String nextComponent = "";
+					try {
+						nextComponent = components[i + 1];
+					} catch (Exception e) {
+						nextComponent = components[i];
+					}
+					//If the type is of type String then we add the UI Item and type to the map. 
+					if (nextComponent.startsWith("String")) {
+						type = "String";
+						mapFieldType.put(caption, type);
+						caption = nextComponent.replace("String", "");
+					} else if (nextComponent.startsWith("int")) {
+						type = "int";
+						mapFieldType.put(caption, type);
+						caption = nextComponent.replace("int", "");
+					}
+				}
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CreateBrmsParamPolicy", "Exception parsing file in findType");
+			}
+		}
+		return mapFieldType;
+	}
+	
+	// This is the method for preparing the policy for saving. We have broken it
+	// out
+	// separately because the fully configured policy is used for multiple
+	// things
+	@Override
+	public boolean prepareToSave() throws Exception {
+		
+		if (isPreparedToSave()) {
+			// we have already done this
+			return true;
+		}
+
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			// version = Integer.parseInt(policyAdapter.getVersion()) + 1;
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+
+		// Create the Instance for pojo, PolicyType object is used in
+		// marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+
+		if (policyAdapter.getData() != null) {
+
+			// Save off everything
+			// making ready all the required elements to generate the action
+			// policy xml.
+			// Get the uniqueness for policy name.
+			String prevPolicyName = null;
+			if (policyAdapter.isEditPolicy()) {
+				prevPolicyName = "Config_BRMS_Param_" + policyAdapter.getPolicyName()
+						+ "." + policyAdapter.getHighestVersion() + ".xml";
+			}
+
+			Path newFile = getNextFilename(
+					Paths.get(policyAdapter.getParentPath().toString()),
+					(policyAdapter.getPolicyType() + "_BRMS_Param"),
+					policyAdapter.getPolicyName(), version);
+
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy already Exists, cannot create the policy.");
+				PolicyLogger.error("Policy already Exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;			
+			}
+			policyName = newFile.getFileName().toString();
+			
+				
+			Map<String,String> ruleAndUIValue= policyAdapter.getBrmsParamBody();
+			String tempateValue= ruleAndUIValue.get("templateName");
+			String valueFromDictionary= getValueFromDictionary(tempateValue);
+			
+			//Get the type of the UI Fields. 
+			Map<String,String> typeOfUIField=findType(valueFromDictionary);
+			String generatedRule=null;
+			String body = "";
+			
+			try {
+				
+				try {
+					body = "/* Autogenerated Code Please Don't change/remove this comment section. This is for the UI purpose. \n\t " +
+								"<$%BRMSParamTemplate=" + tempateValue + "%$> \n */ \n";
+					body = body +  valueFromDictionary + "\n";
+					generatedRule = "rule \"Params\" \n\tsalience 1000 \n\twhen\n\tthen\n\t\tParams params = new Params();";
+					
+					//We first read the map data structure(ruleAndUIValue) received from the PAP-ADMIN
+					//We ignore if the key is "templateName as we are interested only in the UI fields and its value. 
+					//We have one more map data structure(typeOfUIField) created by parsing the Drools rule. 
+					//From the type of the UI field(String/int) we structure whether to put the "" or not. 
+					for (Map.Entry<String, String> entry : ruleAndUIValue.entrySet()) {
+						if(entry.getKey()!="templateName")
+						{
+							for(Map.Entry<String, String> fieldType:typeOfUIField.entrySet())
+							{
+								if(fieldType.getKey().equalsIgnoreCase(entry.getKey()))
+								{
+									String key = entry.getKey().substring(0, 1).toUpperCase() + entry.getKey().substring(1); 
+									if(fieldType.getValue()=="String")
+									{
+										//Type is String
+										generatedRule = generatedRule + "\n\t\tparams.set"
+												+ key + "(\""
+												+ entry.getValue() + "\");";
+									}
+									else{
+										generatedRule = generatedRule + "\n\t\tparams.set"
+												+ key  + "("
+												+  entry.getValue() + ");";
+									}
+								}
+							}
+						}
+					}
+					
+					generatedRule = generatedRule
+							+ "\n\t\tinsert(params);\nend";
+					logger.info("New rule generated with :" + generatedRule);
+					body = body + generatedRule;
+				} catch (Exception e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+					PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving policy");
+				}
+			}
+			catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+				PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsParamPolicy", "Exception saving policy");
+			}
+			
+			saveConfigurations(policyName,prevPolicyName,body);
+
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter
+					.getRuleCombiningAlgId());
+
+			AllOfType allOfOne = new AllOfType();
+			File policyFilePath = new File(policyAdapter.getParentPath()
+					.toString(), policyName);
+			String policyDir = policyFilePath.getParentFile().getName();
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = policyDir + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+					fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1,
+						fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			
+			
+			AllOfType allOf = new AllOfType();
+
+			// Match for ECOMPName
+			allOf.getMatch().add(
+					createMatch("ECOMPName", policyAdapter.getEcompName()));
+			allOf.getMatch().add(
+					createMatch("ConfigName", policyAdapter.getConfigName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+
+			rule.setEffect(EffectType.PERMIT);
+
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+						//+ e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsParamPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(
+					accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+
+			configAttributeValue.getContent().add("Config");
+
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+						//+ e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsParamPolicy", "Exception creating Config URI");
+			}
+
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(
+					configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy
+					.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()
+					.add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object."
+					//+ policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object."
+					+ policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version,
+			String fileName) {
+
+		//Policy Config ID Assignment
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("BRMSPARAMID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment1);
+
+		// For Config file Url if configurations are provided.
+		// URL ID Assignment
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+				.toString());
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value" + policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if (path.contains("/")) {
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" + path);
+		}
+		String content = CONFIG_URL + "/Config/" + path + "."
+				+ getConfigFile(policyName);
+
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory()
+				.createAttributeValue(AttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment2);
+
+		// Policy Name Assignment
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+		}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		System.out.println(fileName);
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+				fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1,
+					fileName.length());
+		}
+		System.out.println(name);
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory()
+				.createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+
+		// Version Number Assignment
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue4));
+		advice.getAttributeAssignmentExpression().add(assignment4);
+
+		// Ecomp Name Assignment
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+		assignment5.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue5));
+		advice.getAttributeAssignmentExpression().add(assignment5);
+		
+		
+		//Config Name Assignment
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("matching:" + this.CONFIGID);
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+		advice.getAttributeAssignmentExpression().add(assignment6);
+		
+		Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+		for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+			String key = keyField;
+			String value = dynamicFieldConfigAttributes.get(key);
+			AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+			assignment7.setAttributeId("key:" + key);
+			assignment7.setCategory(CATEGORY_RESOURCE);
+			assignment7.setIssuer("");
+
+			AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+			configNameAttributeValue7.setDataType(STRING_DATATYPE);
+			configNameAttributeValue7.getContent().add(value);
+			assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+			advice.getAttributeAssignmentExpression().add(assignment7);
+		}
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("RiskType");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);
+		
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("RiskLevel");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);	
+
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("guard");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+
+		AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+		assignment11.setAttributeId("TTLDate");
+		assignment11.setCategory(CATEGORY_RESOURCE);
+		assignment11.setIssuer("");
+
+		AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+		configNameAttributeValue11.setDataType(STRING_DATATYPE);
+		configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+		assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+		advice.getAttributeAssignmentExpression().add(assignment11);
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {		
+		return policyAdapter.getData();
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java
new file mode 100644
index 0000000..d77abf0
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateBrmsRawPolicy.java
@@ -0,0 +1,661 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+
+public class CreateBrmsRawPolicy extends Policy {
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger
+			.getLogger(CreateBrmsRawPolicy.class);
+
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+
+	public CreateBrmsRawPolicy() {
+		super();
+	}
+
+	public CreateBrmsRawPolicy(PolicyRestAdapter policyAdapter) {
+		this.policyAdapter = policyAdapter;
+		this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+
+	}
+
+	// Saving the Configurations file at server location for config policy.
+	protected void saveConfigurations(String policyName, String prevPolicyName,
+			String jsonBody) {
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+				.toString());
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		logger.info("print the main domain value" + policyDir);
+		String path = policyDir.replace('\\', '.');
+		if (path.contains("/")) {
+			path = policyDir.replace('/', '.');
+			logger.info("print the path:" + path);
+		}
+
+		try {
+			String configFileName = getConfigFile(policyName);
+
+			File file;
+			if (CONFIG_HOME.contains("\\")) {
+				file = new File(CONFIG_HOME + "\\" + path + "."
+						+ configFileName);
+			} else {
+				file = new File(CONFIG_HOME + "/" + path + "." + configFileName);
+			}
+
+			// if file doesnt exists, then create it
+			if (!file.exists()) {
+				file.createNewFile();
+			}
+
+			// Getting the previous policy Config Json file to be used for
+			// updating the dictionary tables
+			if (policyAdapter.isEditPolicy()) {
+
+				String prevConfigFileName = getConfigFile(prevPolicyName);
+
+				File oldFile;
+				if (CONFIG_HOME.contains("\\")) {
+					oldFile = new File(CONFIG_HOME + "\\" + path + "."
+							+ prevConfigFileName);
+				} else {
+					oldFile = new File(CONFIG_HOME + "/" + path + "."
+							+ prevConfigFileName);
+				}
+
+				String filepath = oldFile.toString();
+
+				String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+				policyAdapter.setPrevJsonBody(prevJsonBody);
+			}
+
+			File configHomeDir = new File(CONFIG_HOME);
+			File[] listOfFiles = configHomeDir.listFiles();
+			if (listOfFiles != null) {
+				for (File eachFile : listOfFiles) {
+					if (eachFile.isFile()) {
+						String fileNameWithoutExtension = FilenameUtils
+								.removeExtension(eachFile.getName());
+						String configFileNameWithoutExtension = FilenameUtils
+								.removeExtension(configFileName);
+						if (fileNameWithoutExtension
+								.equals(configFileNameWithoutExtension)) {
+							// delete the file
+							eachFile.delete();
+						}
+					}
+				}
+			}
+
+			/*FileWriter fw = new FileWriter(file.getAbsoluteFile());
+			BufferedWriter bw = new BufferedWriter(fw);
+			bw.write(jsonBody);
+			bw.close();
+			if (logger.isDebugEnabled()) {
+				logger.debug("Configuration is succesfully saved");
+			}*/
+			
+			try {
+				
+				if (policyName.endsWith(".xml")) {
+					policyName = policyName.substring(0,
+							policyName.lastIndexOf(".xml"));
+				}
+				PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator
+						+ path + "." + policyName + ".txt");
+				out.println(jsonBody);
+				out.close();
+
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e);
+				PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "CreateBrmsRawPolicy", "Exception saving configurations file");
+			}
+			
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	// Utility to read json data from the existing file to a string
+	static String readFile(String path, Charset encoding) throws IOException {
+
+		byte[] encoded = Files.readAllBytes(Paths.get(path));
+		return new String(encoded, encoding);
+
+	}
+
+	// Here we are adding the extension for the configurations file based on the
+	// config type selection for saving.
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".txt")) {
+			filename = filename.substring(0, filename.length() - 3);
+		}
+
+		filename = filename + ".txt";
+		return filename;
+	}
+
+	// Validations for Config form
+	public boolean validateConfigForm() {
+
+		// Validating mandatory Fields.
+		isValidForm = true;
+		return isValidForm;
+
+	}
+
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if (!isPreparedToSave()) {
+			prepareToSave();
+		}
+		// Until here we prepared the data and here calling the method to create
+		// xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(),
+				policyName);
+		
+		Boolean dbIsUpdated = true;
+
+		successMap = new HashMap<String, String>();
+		if (dbIsUpdated) {
+			successMap = createPolicy(newPolicyPath,
+					getCorrectPolicyDataObject());
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Failed to Update the Database Dictionary Tables.");
+			PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+
+			// remove the new json file
+			String jsonBody = policyAdapter.getPrevJsonBody();
+			saveConfigurations(policyName, "", jsonBody);
+			successMap.put("error", "DB UPDATE");
+		}
+
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;
+	}
+
+	// This is the method for preparing the policy for saving. We have broken it
+	// out
+	// separately because the fully configured policy is used for multiple
+	// things
+	@Override
+	public boolean prepareToSave() throws Exception {
+
+		if (isPreparedToSave()) {
+			// we have already done this
+			return true;
+		}
+
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			// version = Integer.parseInt(policyAdapter.getVersion()) + 1;
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+
+		// Create the Instance for pojo, PolicyType object is used in
+		// marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+
+		if (policyAdapter.getData() != null) {
+
+			// Save off everything
+			// making ready all the required elements to generate the action
+			// policy xml.
+			// Get the uniqueness for policy name.
+			String prevPolicyName = null;
+			if (policyAdapter.isEditPolicy()) {
+				prevPolicyName = "Config_BRMS_Raw_" + policyAdapter.getPolicyName()
+						+ "." + policyAdapter.getHighestVersion() + ".xml";
+			}
+			//if (!policyAdapter.isEditPolicy()) {
+				Path newFile = getNextFilename(
+						Paths.get(policyAdapter.getParentPath().toString()),
+						(policyAdapter.getPolicyType() + "_BRMS_Raw"),
+						policyAdapter.getPolicyName(), version);
+	
+				if (newFile == null) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("File already exists, cannot create the policy.");
+					PolicyLogger.error("File already exists, cannot create the policy.");
+					setPolicyExists(true);
+					return false;
+				}
+				policyName = newFile.getFileName().toString();
+			//}
+
+			//String jsonBody = policyAdapter.getJsonBody();
+			String configBody=policyAdapter.getConfigBodyData();
+			saveConfigurations(policyName, prevPolicyName, configBody);
+
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter
+					.getRuleCombiningAlgId());
+
+			AllOfType allOfOne = new AllOfType();
+			File policyFilePath = new File(policyAdapter.getParentPath()
+					.toString(), policyName);
+			String policyDir = policyFilePath.getParentFile().getName();
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = policyDir + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+					fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1,
+						fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			
+			
+			AllOfType allOf = new AllOfType();
+
+			// Match for ECOMPName
+			allOf.getMatch().add(
+					createMatch("ECOMPName", policyAdapter.getEcompName()));
+			allOf.getMatch().add(
+					createMatch("ConfigName", policyAdapter.getConfigName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+
+			rule.setEffect(EffectType.PERMIT);
+
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+						//+ e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsRawPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(
+					accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+
+			configAttributeValue.getContent().add("Config");
+
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE
+						//+ e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateBrmsRawPolicy", "Exception creating Config URI");
+			}
+
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(
+					configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy
+					.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()
+					.add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object."
+					//+ policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object."
+					+ policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version,
+			String fileName) {
+
+		// Policy Config ID Assignment
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("BRMSRAWID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment1);
+
+		// For Config file Url if configurations are provided.
+		// URL ID Assignment
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath()
+				.toString());
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value" + policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if (path.contains("/")) {
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" + path);
+		}
+		String content = CONFIG_URL + "/Config/" + path + "."
+				+ getConfigFile(policyName);
+
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory()
+				.createAttributeValue(AttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment2);
+
+		// Policy Name Assignment
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString())
+				+ gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+		}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		System.out.println(fileName);
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1,
+				fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1,
+					fileName.length());
+		}
+		System.out.println(name);
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory()
+				.createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+
+		// Version Number Assignment
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue4));
+		advice.getAttributeAssignmentExpression().add(assignment4);
+
+		// Ecomp Name Assignment
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+		assignment5.setExpression(new ObjectFactory()
+				.createAttributeValue(configNameAttributeValue5));
+		advice.getAttributeAssignmentExpression().add(assignment5);
+		
+		
+		//Config Name Assignment
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("matching:" + this.CONFIGID);
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+		advice.getAttributeAssignmentExpression().add(assignment6);
+		
+		Map<String, String> dynamicFieldConfigAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+		for (String keyField : dynamicFieldConfigAttributes.keySet()) {
+			String key = keyField;
+			String value = dynamicFieldConfigAttributes.get(key);
+			AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+			assignment7.setAttributeId("key:" + key);
+			assignment7.setCategory(CATEGORY_RESOURCE);
+			assignment7.setIssuer("");
+
+			AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+			configNameAttributeValue7.setDataType(STRING_DATATYPE);
+			configNameAttributeValue7.getContent().add(value);
+			assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+			advice.getAttributeAssignmentExpression().add(assignment7);
+		}
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("RiskType");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getRiskType());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);
+		
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("RiskLevel");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getRiskLevel());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);	
+
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("guard");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getGuard());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+
+		AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+		assignment11.setAttributeId("TTLDate");
+		assignment11.setCategory(CATEGORY_RESOURCE);
+		assignment11.setIssuer("");
+
+		AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+		configNameAttributeValue11.setDataType(STRING_DATATYPE);
+		configNameAttributeValue11.getContent().add(policyAdapter.getTtlDate());
+		assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+		advice.getAttributeAssignmentExpression().add(assignment11);
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getData();
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java
new file mode 100644
index 0000000..578efc2
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateClosedLoopPerformanceMetrics.java
@@ -0,0 +1,506 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class CreateClosedLoopPerformanceMetrics extends Policy {
+	
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public CreateClosedLoopPerformanceMetrics() {
+		super();
+	}
+	
+	public CreateClosedLoopPerformanceMetrics(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+
+	//save configuration of the policy based on the policyname
+	private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+		String domain = getParentPathSubScopeDir();
+		String path = domain.replace('\\', '.');
+		if(path.contains("/")){
+			path = domain.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		try {
+			String body = null;
+			try {
+				body = jsonBody;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+			System.out.println(body);
+			if(policyName.endsWith(".xml")){
+				policyName	 = policyName.substring(0, policyName.lastIndexOf(".xml"));	
+			}
+			PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+			out.println(body);
+			out.close();
+
+		} catch (JsonGenerationException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+	}
+	
+	//getting the policy name and setting to configuration on adding .json
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".xml")) {
+			filename = filename.substring(0, filename.length() - 4);
+		}
+		filename = filename +".json";
+		return filename;
+	}
+	
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			//Prep and configure the policy for saving
+			prepareToSave();
+		}
+
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );		
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+	
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+		
+		if (policyAdapter.getData() != null) {
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			String prevPolicyName = null;
+			if(policyAdapter.isEditPolicy()){
+				prevPolicyName = "Config_PM_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+			}
+			
+			Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(), policyAdapter.getConfigPolicyType(), policyAdapter.getPolicyName(), version);
+
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("File already exists, cannot create the policy.");
+				PolicyLogger.error("File already exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			
+			policyName = newFile.getFileName().toString();
+			
+			// Save the Configurations file with the policy name with extention based on selection.
+			String jsonBody = policyAdapter.getJsonBody();
+			saveConfigurations(policyName, prevPolicyName, jsonBody);
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+	
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+			
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+			
+			AllOfType allOfOne = new AllOfType();
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			logger.info("print the main domain value "+policyDir);
+			String path = policyDir.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = path + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			AllOfType allOf = new AllOfType();
+			
+			// Adding the matches to AllOfType element Match for Ecomp
+			allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			// Match for ServiceType
+			allOf.getMatch().add(createMatch("ServiceType", policyAdapter.getServiceType()));
+
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+			
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+			
+			rule.setEffect(EffectType.PERMIT);
+			
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateClosedLoopPerformanceMetrics", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+			configAttributeValue.getContent().add("Config");
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "CreateClosedLoopPerformanceMetrics", "Exception creating Config URI");
+			}
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+	
+	// Data required for Advice part is setting here.
+	@SuppressWarnings("static-access")
+	private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("PMID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment1);
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		// For Config file Url if configurations are provided.
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value"+policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+		System.out.println("URL value :" + content);
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment2);
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+		}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+		}
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+		advice.getAttributeAssignmentExpression().add(assignment4);
+
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+		assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+		advice.getAttributeAssignmentExpression().add(assignment5);
+
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("matching:" + this.CLOSEDLOOPID);
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getServiceType());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+		advice.getAttributeAssignmentExpression().add(assignment6);
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+		assignment7.setAttributeId("RiskType");
+		assignment7.setCategory(CATEGORY_RESOURCE);
+		assignment7.setIssuer("");
+
+		AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+		configNameAttributeValue7.setDataType(STRING_DATATYPE);
+		configNameAttributeValue7.getContent().add(policyAdapter.getRiskType());
+		assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+		advice.getAttributeAssignmentExpression().add(assignment7);
+		
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("RiskLevel");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getRiskLevel());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);	
+
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("guard");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getGuard());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);
+		
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("TTLDate");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getTtlDate());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		// TODO Auto-generated method stub
+		return policyAdapter.getPolicyData();
+	}	
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java
new file mode 100644
index 0000000..73479fd
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/CreateNewMicroSerivceModel.java
@@ -0,0 +1,305 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+//import org.eclipse.emf.common.util.URI;
+//import org.eclipse.emf.ecore.EPackage;
+//import org.eclipse.emf.ecore.resource.Resource;
+//import org.eclipse.emf.ecore.resource.ResourceSet;
+//import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+//import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.util.MSAttributeObject;
+import org.openecomp.policy.rest.util.MSModelUtitils;
+
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class CreateNewMicroSerivceModel {
+	private static final Logger logger = FlexLogger.getLogger(CreateNewMicroSerivceModel.class);
+	private MicroServiceModels newModel = null;
+	private HashMap<String,MSAttributeObject > classMap = new HashMap<String,MSAttributeObject>();
+	private String directory;
+	
+	/*
+	 * These are the parameters needed for DB access from the PAP
+	 */
+	private static String papDbDriver = null;
+	private static String papDbUrl = null;
+	private static String papDbUser = null;
+	private static String papDbPassword = null;
+	
+	MSModelUtitils utils = new MSModelUtitils();
+
+	public CreateNewMicroSerivceModel(String fileName, String serviceName, String string, String version) {
+		super();
+	}
+
+	public CreateNewMicroSerivceModel(String importFile, String  modelName, String description, String version, String randomID) {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		this.newModel = new MicroServiceModels();
+		this.newModel.setDescription(description);
+		this.newModel.setVersion(version);
+		this.newModel.setModelName(modelName);
+		UserInfo userInfo = new UserInfo();
+		userInfo.setUserLoginId("API");
+		this.newModel.setUserCreatedBy(userInfo);
+		String cleanUpFile = null;
+	
+	    HashMap<String, MSAttributeObject> tempMap = new HashMap<String, MSAttributeObject>();
+	    //Need to delete the file
+	    if (importFile.contains(".zip")){
+	    	extractFolder(randomID + ".zip");
+	        File directory = new File("ExtractDir" + File.separator + randomID);
+	        List<File> fileList = listModelFiles(directory.toString());
+	        //get all the files from a directory
+	        File[] fList = directory.listFiles();
+	        for (File file : fileList){
+	            if (file.isFile()){
+				    tempMap = utils.processEpackage(file.getAbsolutePath());
+				    classMap.putAll(tempMap);
+	            }
+	        }
+	        cleanUpFile = "ExtractDir" + File.separator + randomID + ".zip";
+	        try {
+				FileUtils.deleteDirectory(new File("ExtractDir" + File.separator + randomID));
+				FileUtils.deleteDirectory(new File(randomID));
+				File deleteFile = new File(cleanUpFile); 
+				FileUtils.forceDelete(deleteFile);
+			} catch (IOException e) {
+				logger.error("Failed to unzip model file " + randomID);
+			}
+	    }else {
+		    tempMap = utils.processEpackage("ExtractDir" + File.separator + randomID+".xmi");
+		    classMap.putAll(tempMap);
+		    cleanUpFile = "ExtractDir" + File.separator + randomID+".xmi";
+		    File deleteFile = new File(cleanUpFile); 
+			deleteFile.delete();
+	    }
+
+	    //	addValuesToNewModel();
+
+
+	}
+	
+	private List<File> listModelFiles(String directoryName) {
+		File directory = new File(directoryName);
+		List<File> resultList = new ArrayList<File>();
+		File[] fList = directory.listFiles();
+		for (File file : fList) {
+			if (file.isFile()) {
+				resultList.add(file);
+			} else if (file.isDirectory()) {
+				resultList.addAll(listModelFiles(file.getAbsolutePath()));
+			}
+		}
+		return resultList;
+	}
+
+	private void extractFolder(String zipFile) {
+	    int BUFFER = 2048;
+	    File file = new File(zipFile);
+
+	    ZipFile zip;
+		try {
+			zip = new ZipFile("ExtractDir" + File.separator +file);
+		    String newPath =  zipFile.substring(0, zipFile.length() - 4);
+		    this.directory = "ExtractDir" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+		    new File(newPath).mkdir();
+		    Enumeration zipFileEntries = zip.entries();
+	
+		    // Process each entry
+		    while (zipFileEntries.hasMoreElements())
+		    {
+		        // grab a zip file entry
+		        ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
+		        String currentEntry = entry.getName();
+		        File destFile = new File("ExtractDir" + File.separator + newPath + File.separator + currentEntry);
+		        File destinationParent = destFile.getParentFile();
+	
+		        destinationParent.mkdirs();
+	
+		        if (!entry.isDirectory())
+		        {
+		            BufferedInputStream is = new BufferedInputStream(zip
+		            .getInputStream(entry));
+		            int currentByte;
+
+		            byte data[] = new byte[BUFFER];
+	
+		            FileOutputStream fos = new FileOutputStream(destFile);
+		            BufferedOutputStream dest = new BufferedOutputStream(fos,
+		            BUFFER);
+	
+		            while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
+		                dest.write(data, 0, currentByte);
+		            }
+		            dest.flush();
+		            dest.close();
+		            is.close();
+		        }
+	
+		        if (currentEntry.endsWith(".zip"))
+		        {
+		            extractFolder(destFile.getAbsolutePath());
+		        }
+		    }
+	    } catch (IOException e) {
+			logger.error("Failed to unzip model file " + zipFile);
+		}
+	}
+
+	public Map<String, String> addValuesToNewModel() {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		MSAttributeObject mainClass  = null;
+		ArrayList<String> dependency = null;
+		String subAttribute = null;
+		
+		if (!classMap.containsKey(this.newModel.getModelName())){
+			logger.error("Model Provided does not contain the service name provided in request. Unable to import new model");
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, "AddValuesToNewModel", "Unable to pull out required values, file missing service name provided in request");
+			successMap.put("error", "MISSING");
+			return successMap;
+		}
+		mainClass = classMap.get(this.newModel.getModelName());
+		String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[]{"[", "]", " "}, new String[]{"", "", ""});
+		this.newModel.setDependency(dependTemp);
+		if (!this.newModel.getDependency().equals("")){
+			dependency = new ArrayList<String>(Arrays.asList(dependTemp.split(",")));	
+			dependency = utils.getFullDependencyList(dependency, classMap);
+			if (!dependency.isEmpty()){
+				for (String element : dependency){
+					MSAttributeObject temp = new MSAttributeObject();
+					if (classMap.containsKey(element)){
+						temp = classMap.get(element);
+						mainClass.addAllRefAttribute(temp.getRefAttribute());
+						mainClass.addAllAttribute(temp.getAttribute());
+					}
+				}
+			}		
+		}
+		subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
+
+		this.newModel.setSub_attributes(subAttribute);
+		this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
+		this.newModel.setRef_attributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
+		successMap.put("success", "success");
+		return successMap;
+		
+	}
+	
+	public Map<String, String> saveImportService(){
+		Map<String, String> successMap = new HashMap<String,String>();
+		
+		Connection con = null;
+		Statement st = null;
+		ResultSet rs = null;
+		String modelName = this.newModel.getModelName();
+		String imported_by = "API";////////////////////////////////////////////
+		String version = this.newModel.getVersion();
+		String insertQuery = null;
+		int ID = 0;
+		
+		/*
+		 * Retrieve the property values for db access from the xacml.pap.properties
+		 */
+		papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+		papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+		papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+		papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+		
+		try {
+			//Get DB Connection
+			Class.forName(papDbDriver);
+			con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+			st = con.createStatement();
+			String queryString ="SELECT * FROM MicroServiceModels WHERE modelName='" + modelName + "' AND version='" + version+ "';";
+			rs = st.executeQuery(queryString);
+		
+			if(rs.next()){
+				successMap.put("DBError", "EXISTS");
+				logger.error("Import new service failed.  Service already exists");
+			}else{
+				rs = st.executeQuery("SELECT MAX(ID) AS ID FROM MicroServiceModels;");
+				if(rs.next()){
+					ID = rs.getInt("ID");
+					ID++;
+				}
+	
+				insertQuery = "INSERT INTO MicroServiceModels (ID, modelName, Dependency, DESCRIPTION, attributes, ref_attributes, sub_attributes, version, imported_by) "
+							+ "VALUES("+ID+",'"+modelName+"','"+ this.newModel.getDependency()+"','"+this.newModel.getDescription()+"','"+this.newModel.getAttributes()+
+							"','"+this.newModel.getRef_attributes()+"','"+this.newModel.getSub_attributes()+"','"+version+"','"+imported_by+"')";
+				st.executeUpdate(insertQuery);
+				successMap.put("success", "success");
+			}
+			rs.close();
+		}catch (ClassNotFoundException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(e.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "saveImportService", "Exception querying MicroServiceModels");
+			successMap.put("DBError", "Error Query");
+		} catch (SQLException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(e.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "saveImportService", "Exception querying MicroServiceModels");
+			successMap.put("DBError", "Error Query");
+		} finally {
+			try{
+				if (con!=null) con.close();
+				if (rs!=null) rs.close();
+				if (st!=null) st.close();
+			} catch (Exception ex){}
+		}
+
+		return successMap;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java
new file mode 100644
index 0000000..822768f
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/DecisionPolicy.java
@@ -0,0 +1,633 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.util.JPAUtils;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+import org.openecomp.policy.xacml.std.pip.engines.aaf.AAFEngine;
+
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger;
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class DecisionPolicy extends Policy {
+
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+	
+	public static final String PDP_ACTION = "PDP";
+	public static final String PEP_ACTION = "PEP";
+	public static final String TYPE_ACTION = "REST";
+
+	public static final String GET_METHOD = "GET";
+	public static final String PUT_METHOD = "PUT";
+	public static final String POST_METHOD = "POST";
+
+	public static final String PERFORMER_ATTRIBUTEID = "performer";
+	public static final String TYPE_ATTRIBUTEID = "type";
+	public static final String METHOD_ATTRIBUTEID = "method";
+	public static final String HEADERS_ATTRIBUTEID = "headers";
+	public static final String URL_ATTRIBUTEID = "url";
+	public static final String BODY_ATTRIBUTEID = "body";
+	
+	public static final String FUNCTION_NOT = "urn:oasis:names:tc:xacml:1.0:function:not";
+	
+	private static final String AAFProvider = "AAF";
+	//private static final String CustomProvider = "Custom";
+	
+	List<String> dynamicLabelRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldComboRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldOneRuleAlgorithms = new LinkedList<String>();
+	List<String> dynamicFieldTwoRuleAlgorithms = new LinkedList<String>();
+	//List<Object> dynamicVariableList = new LinkedList<Object>();
+	List<String> dataTypeList = new LinkedList<String>();
+	
+	protected Map<String, String> dropDownMap = new HashMap<String, String>();
+	
+
+	public DecisionPolicy() {
+		super();
+	}
+	
+	public DecisionPolicy(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+	
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			//Prep and configure the policy for saving
+			prepareToSave();
+		}
+
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		successMap = createPolicy(newPolicyPath, getCorrectPolicyDataObject());		
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+	
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+		
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Decision")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+		
+		if (policyAdapter.getData() != null) {
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()), policyAdapter.getPolicyType(), policyAdapter.getPolicyName(), version);
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("File already exists, cannot create the policy.");
+				PolicyLogger.error("File already exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			policyName = newFile.getFileName().toString();
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+			PolicyType decisionPolicy = (PolicyType)  policyAdapter.getData();
+			
+			decisionPolicy.setDescription(policyAdapter.getPolicyDescription());
+			
+			decisionPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+			AllOfType allOfOne = new AllOfType();
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			logger.info("print the main domain value "+policyDir);
+			String path = policyDir.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = path + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			
+			AllOfType allOf = new AllOfType();
+			
+			// Match for Ecomp
+			allOf.getMatch().add(createMatch("ECOMPName", (policyAdapter.getEcompName())));
+			
+			Map<String, String> dynamicFieldComponentAttributes = policyAdapter.getDynamicFieldConfigAttributes();
+			if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+				dynamicFieldComponentAttributes = new HashMap<String,String>();
+			}
+			
+			// If there is any dynamic field attributes create the matches here
+			for (String keyField : dynamicFieldComponentAttributes.keySet()) {
+				String key = keyField;
+				String value = dynamicFieldComponentAttributes.get(key);
+				MatchType dynamicMatch = createDynamicMatch(key, value);
+				allOf.getMatch().add(dynamicMatch);
+			}
+
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			target.getAnyOf().add(anyOf);
+			decisionPolicy.setTarget(target);
+
+			Map<String, String> dynamicFieldDecisionSettings = policyAdapter.getDynamicSettingsMap();
+			
+			//dynamicVariableList = policyAdapter.getDynamicVariableList();
+			if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+				dynamicFieldDecisionSettings = new HashMap<String,String>();
+			}
+			
+			// settings are dynamic so check how many rows are added and add all
+			for (String keyField : dynamicFieldDecisionSettings.keySet()) {
+				String key = keyField;
+				String value = dynamicFieldDecisionSettings.get(key);
+				//String dataType = (String) dynamicVariableList.get(counter);
+				String dataType = getDataType(key);
+				VariableDefinitionType dynamicVariable = createDynamicVariable(key, value, dataType);
+				decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(dynamicVariable);
+			}
+
+			createRule(decisionPolicy, true);
+			createRule(decisionPolicy, false);
+		}
+
+		setPreparedToSave(true);
+		return true;
+	}
+	
+	private DecisionSettings findDecisionSettingsBySettingId(String settingId) {
+		DecisionSettings decisionSetting = null;
+		
+		EntityManager em = policyAdapter.getEntityManagerFactory().createEntityManager();
+		Query getDecisionSettings = em.createNamedQuery("DecisionSettings.findAll");
+		List<?> decisionSettingsList = getDecisionSettings.getResultList();
+		
+		for (Object id : decisionSettingsList) {
+			decisionSetting = (DecisionSettings) id;
+			if (decisionSetting.getXacmlId().equals(settingId)) {
+				break;
+			}
+		}
+		return decisionSetting;
+	}
+	
+	private void createRule(PolicyType decisionPolicy, boolean permitRule) {
+		RuleType rule = new RuleType();
+			
+		rule.setRuleId(policyAdapter.getRuleID());
+			
+		if (permitRule) {
+			rule.setEffect(EffectType.PERMIT);
+		} else {
+			rule.setEffect(EffectType.DENY);
+		}
+		rule.setTarget(new TargetType());
+
+		// Create Target in Rule
+		AllOfType allOfInRule = new AllOfType();
+
+		// Creating match for ACCESS in rule target
+		MatchType accessMatch = new MatchType();
+		AttributeValueType accessAttributeValue = new AttributeValueType();
+		accessAttributeValue.setDataType(STRING_DATATYPE);
+		accessAttributeValue.getContent().add("DECIDE");
+		accessMatch.setAttributeValue(accessAttributeValue);
+		AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+		URI accessURI = null;
+		try {
+			accessURI = new URI(ACTION_ID);
+		} catch (URISyntaxException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "DecisionPolicy", "Exception creating ACCESS URI");
+		}
+		accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+		accessAttributeDesignator.setDataType(STRING_DATATYPE);
+		accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+		accessMatch.setAttributeDesignator(accessAttributeDesignator);
+		accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+		
+		dynamicLabelRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmLabels();
+		dynamicFieldComboRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmCombo();
+		dynamicFieldOneRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField1();
+		dynamicFieldTwoRuleAlgorithms = policyAdapter.getDynamicRuleAlgorithmField2();
+		dropDownMap = createDropDownMap();
+		
+		if(policyAdapter.getProviderComboBox()!=null && policyAdapter.getProviderComboBox().equals(AAFProvider)){
+			// Values for AAF Provider are here for XML Creation. 
+			ConditionType condition = new ConditionType();
+			ApplyType decisionApply = new ApplyType();
+			String selectedFunction = "boolean-equal";
+			
+			AttributeValueType value1 = new AttributeValueType();
+			value1.setDataType(BOOLEAN_DATATYPE);
+			value1.getContent().add("true");
+			
+			AttributeDesignatorType value2 = new AttributeDesignatorType();
+			value2.setAttributeId(AAFEngine.AAF_RESULT);
+			value2.setCategory(CATEGORY_RESOURCE);
+			value2.setDataType(BOOLEAN_DATATYPE);
+			value2.setMustBePresent(false);
+			
+			ApplyType innerDecisionApply = new ApplyType();
+			innerDecisionApply.setFunctionId(FUNCTION_BOOLEAN_ONE_AND_ONLY);
+			innerDecisionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(value2));
+			
+			decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+			decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(value1));
+			decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply));
+			condition.setExpression(new ObjectFactory().createApply(decisionApply));
+			if (!permitRule) {
+				ApplyType notOuterApply = new ApplyType();
+				notOuterApply.setFunctionId(FUNCTION_NOT);
+				notOuterApply.getExpression().add(condition.getExpression());
+				condition.setExpression(new ObjectFactory().createApply(notOuterApply));
+			}
+			rule.setCondition(condition);
+			allOfInRule.getMatch().add(accessMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			if(!permitRule){
+				AdviceExpressionsType adviceExpressions = new AdviceExpressionsType();
+				AdviceExpressionType adviceExpression = new AdviceExpressionType();
+				adviceExpression.setAdviceId(AAFProvider);
+				adviceExpression.setAppliesTo(EffectType.DENY);
+				AttributeAssignmentExpressionType assignment = new AttributeAssignmentExpressionType();
+				assignment.setAttributeId("aaf.response");
+				assignment.setCategory(CATEGORY_RESOURCE);
+				AttributeDesignatorType value = new AttributeDesignatorType();
+				value.setAttributeId(AAFEngine.AAF_RESPONSE);
+				value.setCategory(CATEGORY_RESOURCE);
+				value.setDataType(STRING_DATATYPE);
+				value.setMustBePresent(false);
+				assignment.setExpression(new ObjectFactory().createAttributeDesignator(value));
+				adviceExpression.getAttributeAssignmentExpression().add(assignment);
+				adviceExpressions.getAdviceExpression().add(adviceExpression);
+				rule.setAdviceExpressions(adviceExpressions);
+			}
+			decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(decisionPolicy);
+			
+		}else if (dynamicLabelRuleAlgorithms != null && dynamicLabelRuleAlgorithms.size() > 0) {
+			boolean isCompound = false;
+			ConditionType condition = new ConditionType();
+			int index = dynamicFieldOneRuleAlgorithms.size() - 1;
+			
+			for (String labelAttr : dynamicLabelRuleAlgorithms) {
+				// if the rule algorithm as a label means it is a compound
+				if (dynamicFieldOneRuleAlgorithms.get(index).toString().equals(labelAttr)) {
+					ApplyType decisionApply = new ApplyType();
+
+					String selectedFunction = (String) dynamicFieldComboRuleAlgorithms.get(index).toString();
+					String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+					String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+					decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+					decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value1)));
+					decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value2)));
+					condition.setExpression(new ObjectFactory().createApply(decisionApply));
+					isCompound = true;
+				}
+
+				// if rule algorithm not a compound
+				if (!isCompound) {
+					condition.setExpression(new ObjectFactory().createApply(getInnerDecisionApply(dynamicLabelRuleAlgorithms.get(index).toString())));
+				}
+			}
+			if (!permitRule) {
+				ApplyType notOuterApply = new ApplyType();
+				notOuterApply.setFunctionId(FUNCTION_NOT);
+				notOuterApply.getExpression().add(condition.getExpression());
+				condition.setExpression(new ObjectFactory().createApply(notOuterApply));
+			}
+			rule.setCondition(condition);
+			allOfInRule.getMatch().add(accessMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+
+			decisionPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(decisionPolicy);
+			
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Unsupported data object."+ policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE + "Unsupported data object."+ policyAdapter.getData().getClass().getCanonicalName());
+		}
+
+	}
+	
+	// if compound setting the inner apply here
+	protected ApplyType getInnerDecisionApply(String value1Label) {
+		ApplyType decisionApply = new ApplyType();
+		int index = 0;
+		// check the index for the label.
+		for (String labelAttr : dynamicLabelRuleAlgorithms) {
+			if (labelAttr.equals(value1Label)) {
+				String value1 = (String) dynamicFieldOneRuleAlgorithms.get(index).toString();
+				populateDataTypeList(value1);
+
+				// check if the row contains label again
+				for (String labelValue : dynamicLabelRuleAlgorithms) {
+					if (labelValue.equals(value1)) {
+						return getCompoundDecisionApply(index);
+					}
+				}
+
+				// Getting the values from the form.
+				String functionKey = (String) dynamicFieldComboRuleAlgorithms.get(index).toString();
+				String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+				decisionApply.setFunctionId(dropDownMap.get(functionKey));
+				// if two text field are rule attributes.
+				if ((value1.contains(RULE_VARIABLE)) && (value2.contains(RULE_VARIABLE))) {
+					ApplyType innerDecisionApply1 = new ApplyType();
+					ApplyType	innerDecisionApply2	 = new  ApplyType();							  
+					AttributeDesignatorType  attributeDesignator1	  = new AttributeDesignatorType();								 
+					AttributeDesignatorType  attributeDesignator2	  = new AttributeDesignatorType();											 
+					//If selected function is Integer function set integer functionID
+					if(functionKey.toLowerCase().contains("integer")){
+						innerDecisionApply1.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY );
+						innerDecisionApply2.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+						attributeDesignator1.setDataType(INTEGER_DATATYPE);
+						attributeDesignator2.setDataType(INTEGER_DATATYPE);
+					} else{
+						//If selected function is not a Integer function set String functionID
+						innerDecisionApply1.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+						innerDecisionApply2.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+						attributeDesignator1.setDataType(STRING_DATATYPE);
+						attributeDesignator2.setDataType(STRING_DATATYPE);
+					}
+					attributeDesignator1.setCategory(CATEGORY_RESOURCE);
+					attributeDesignator2.setCategory(CATEGORY_RESOURCE);
+					//Here set actual field values
+					attributeDesignator1.setAttributeId(value1.  contains("resource:")?value1.substring( 9):value1.substring(8));
+					attributeDesignator2.setAttributeId(value1.  contains("resource:")?value1.substring( 9):value1.substring(8));							 
+					innerDecisionApply1.getExpression().add(new ObjectFactory().createAttributeDesignator( attributeDesignator1));
+					innerDecisionApply2.getExpression().add(new ObjectFactory().createAttributeDesignator( attributeDesignator2));							  
+					decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply1));
+					decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply2));							  
+				} else {
+					// if either of one text field is rule attribute.
+					if (!value1.startsWith("S_")) {
+						ApplyType innerDecisionApply = new ApplyType();
+						AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+						AttributeValueType decisionConditionAttributeValue = new AttributeValueType();
+
+						if (functionKey.toLowerCase().contains("integer")) {
+							innerDecisionApply.setFunctionId(FUNTION_INTEGER_ONE_AND_ONLY);
+							decisionConditionAttributeValue.setDataType(INTEGER_DATATYPE);
+							attributeDesignator.setDataType(INTEGER_DATATYPE);
+						} else {
+							innerDecisionApply.setFunctionId(FUNCTION_STRING_ONE_AND_ONLY);
+							decisionConditionAttributeValue.setDataType(STRING_DATATYPE);
+							attributeDesignator.setDataType(STRING_DATATYPE);
+						}
+
+						String attributeId = null;
+						String attributeValue = null;
+
+						// Find which textField has rule attribute and set it as
+						// attributeId and the other as attributeValue.
+						attributeId = value1;
+						attributeValue = value2;
+			
+						if (attributeId != null) {
+							attributeDesignator.setCategory(CATEGORY_RESOURCE);
+							attributeDesignator.setAttributeId(attributeId);
+						}
+						decisionConditionAttributeValue.getContent().add(attributeValue);
+						innerDecisionApply.getExpression().add(new ObjectFactory().createAttributeDesignator(attributeDesignator));
+						decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
+						decisionApply.getExpression().add(new ObjectFactory().createApply(innerDecisionApply));
+					} else {
+						value1 = value1.substring(2, value1.length());
+						VariableReferenceType variableReferenceType = new VariableReferenceType();
+						variableReferenceType.setVariableId(value1);
+						
+						String dataType = dataTypeList.get(index);
+
+						AttributeValueType decisionConditionAttributeValue = new AttributeValueType();
+						decisionConditionAttributeValue.setDataType(dataType);
+						decisionConditionAttributeValue.getContent().add(value2);
+						decisionApply.getExpression().add(new ObjectFactory().createVariableReference(variableReferenceType));
+						decisionApply.getExpression().add(new ObjectFactory().createAttributeValue(decisionConditionAttributeValue));
+					}
+				}
+			}
+			index++;
+		}
+		return decisionApply;
+	}
+
+	// if the rule algorithm is multiple compound one setting the apply
+	protected ApplyType getCompoundDecisionApply(int index) {
+		ApplyType decisionApply = new ApplyType();
+		String selectedFunction = dynamicFieldComboRuleAlgorithms.get(index).toString();
+		String value1 = dynamicFieldOneRuleAlgorithms.get(index).toString();
+		String value2 = dynamicFieldTwoRuleAlgorithms.get(index).toString();
+		decisionApply.setFunctionId(dropDownMap.get(selectedFunction));
+		decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value1)));
+		decisionApply.getExpression().add(new ObjectFactory().createApply(getInnerDecisionApply(value2)));
+		return decisionApply;
+	}
+	
+	private VariableDefinitionType createDynamicVariable(String key, String value, String dataType) {
+		VariableDefinitionType dynamicVariable = new VariableDefinitionType();
+		AttributeValueType dynamicAttributeValue = new AttributeValueType();
+
+		dynamicAttributeValue.setDataType(dataType);
+		dynamicAttributeValue.getContent().add(value);
+
+		dynamicVariable.setVariableId(key);
+		dynamicVariable.setExpression(new ObjectFactory().createAttributeValue(dynamicAttributeValue));
+
+		return dynamicVariable;
+
+	}	
+	
+	private void populateDataTypeList(String value1) {
+		
+		///String value1 = dynamicFieldDecisionOneRuleAlgorithms.get(index).getValue().toString();
+		String dataType = null;
+
+		if(value1.contains("S_")) {
+			value1 = value1.substring(2, value1.length());
+			DecisionSettings decisionSettings = findDecisionSettingsBySettingId(value1);
+			if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("string")) {
+				dataType = STRING_DATATYPE;
+			} else if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("boolean")) {
+				dataType = BOOLEAN_DATATYPE;
+			} else {
+				dataType = INTEGER_DATATYPE;
+			}
+		} else {
+			dataType = "OTHER";
+		}
+
+		dataTypeList.add(dataType);
+	}
+	
+	private Map<String,String> createDropDownMap(){
+		JPAUtils jpaUtils = null;
+		try {
+			jpaUtils = JPAUtils.getJPAUtilsInstance(policyAdapter.getEntityManagerFactory());
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		Map<Datatype, List<FunctionDefinition>> functionMap = jpaUtils.getFunctionDatatypeMap();
+		Map<String, String> dropDownMap = new HashMap<String, String>();
+		for (Datatype id : functionMap.keySet()) {
+			List<FunctionDefinition> functionDefinitions = (List<FunctionDefinition>) functionMap
+					.get(id);
+			for (FunctionDefinition functionDef : functionDefinitions) {
+				dropDownMap.put(functionDef.getShortname(),functionDef.getXacmlid());
+			}
+		}
+		
+		return dropDownMap;
+	}
+	
+	private String getDataType(String key) {
+		
+		DecisionSettings decisionSettings = findDecisionSettingsBySettingId(key);
+		String dataType = null;
+		
+		if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("string")) {
+			dataType = STRING_DATATYPE;
+		} else if (decisionSettings != null && decisionSettings.getDatatypeBean().getShortName().equals("boolean")) {
+			dataType = BOOLEAN_DATATYPE;
+		} else {
+			dataType = INTEGER_DATATYPE;
+		}
+		
+		return dataType;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getData();
+	}
+
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java
new file mode 100644
index 0000000..ad7525b
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/FirewallConfigPolicy.java
@@ -0,0 +1,1871 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonException;
+import javax.json.JsonObject;
+import javax.json.JsonReader;
+import javax.json.JsonString;
+import javax.json.JsonValue;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+import com.att.research.xacml.util.XACMLProperties;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.github.fge.jackson.JsonLoader;
+import com.github.fge.jsonpatch.JsonPatch;
+import com.github.fge.jsonpatch.diff.JsonDiff;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class FirewallConfigPolicy extends Policy {
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(FirewallConfigPolicy.class);
+
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+	
+	/*
+	 * These are the parameters needed for DB access from the PAP
+	 */
+	private static String papDbDriver = null;
+	private static String papDbUrl = null;
+	private static String papDbUser = null;
+	private static String papDbPassword = null;
+
+	public FirewallConfigPolicy() {
+		super();
+	}
+	
+	public FirewallConfigPolicy(PolicyRestAdapter policyAdapter) {
+		this.policyAdapter = policyAdapter;
+		this.policyAdapter.setConfigType(policyAdapter.getConfigType());
+		
+	}
+	
+	// Saving the Configurations file at server location for config policy.
+	protected void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		logger.info("print the main domain value"+policyDir);
+		String path = policyDir.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		
+		try {
+			String configFileName = getConfigFile(policyName);
+			
+			File file;
+			if(CONFIG_HOME.contains("\\"))
+			{
+			 file = new File(CONFIG_HOME + "\\" + path + "."+ configFileName);
+			}
+			else
+			{
+			 file = new File(CONFIG_HOME + "/" + path + "."+ configFileName);
+			}
+			
+			// if file doesnt exists, then create it
+			if (!file.exists()) {
+				file.createNewFile();
+			}
+			
+			//Getting the previous policy Config Json file to be used for updating the dictionary tables
+			if (policyAdapter.isEditPolicy()) {
+				
+				String prevConfigFileName = getConfigFile(prevPolicyName);
+				
+				File oldFile;
+				if(CONFIG_HOME.contains("\\"))
+				{
+					oldFile = new File(CONFIG_HOME + "\\" + path + "."+ prevConfigFileName);
+				}
+				else
+				{
+					oldFile = new File(CONFIG_HOME + "/" + path + "."+ prevConfigFileName);
+				}
+				
+				String filepath = oldFile.toString();
+				
+				String prevJsonBody = readFile(filepath, StandardCharsets.UTF_8);
+				policyAdapter.setPrevJsonBody(prevJsonBody);
+			}
+
+
+			File configHomeDir = new File(CONFIG_HOME);
+			File[] listOfFiles = configHomeDir.listFiles();
+			if (listOfFiles != null){
+				for(File eachFile : listOfFiles){
+					if(eachFile.isFile()){
+						String fileNameWithoutExtension = FilenameUtils.removeExtension(eachFile.getName());
+						String configFileNameWithoutExtension = FilenameUtils.removeExtension(configFileName);
+						if (fileNameWithoutExtension.equals(configFileNameWithoutExtension)){
+							//delete the file
+							eachFile.delete();
+						}
+					}
+				}
+			}
+
+			FileWriter fw = new FileWriter(file.getAbsoluteFile());
+			BufferedWriter bw = new BufferedWriter(fw);
+			bw.write(jsonBody);
+			bw.close();
+			if (logger.isDebugEnabled()) {
+				logger.debug("Configuration is succesfully saved");
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	//Utility to read json data from the existing file to a string
+	static String readFile(String path, Charset encoding) throws IOException {
+		
+		byte[] encoded = Files.readAllBytes(Paths.get(path));
+		return new String(encoded, encoding);
+		
+	}
+
+	// Here we are adding the extension for the configurations file based on the
+	// config type selection for saving.
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".json")) {
+			filename = filename.substring(0, filename.length() - 4);
+		}
+
+		filename=filename+".json";
+		return filename;
+	}
+	
+	
+	// Validations for Config form
+	public boolean validateConfigForm() {
+
+		// Validating mandatory Fields.
+		isValidForm = true;	
+		return isValidForm;
+
+	}
+
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			prepareToSave();
+		}
+		
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		Boolean dbIsUpdated = false;
+		if (policyAdapter.getApiflag().equalsIgnoreCase("admin")){
+			dbIsUpdated = true;
+		} else {
+			if (policyAdapter.isEditPolicy()) {
+				dbIsUpdated = updateFirewallDictionaryData(policyAdapter.getJsonBody(), policyAdapter.getPrevJsonBody());
+			} else {
+				dbIsUpdated = insertFirewallDicionaryData(policyAdapter.getJsonBody());
+			}
+		}
+		
+		if(dbIsUpdated) {
+			successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );	
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Failed to Update the Database Dictionary Tables.");
+			PolicyLogger.error("Failed to Update the Database Dictionary Tables.");
+			
+			//remove the new json file 
+			String jsonBody = policyAdapter.getPrevJsonBody();
+			if (jsonBody!=null){
+				saveConfigurations(policyName, "", jsonBody);
+			} else {
+				saveConfigurations(policyName, "", "");
+			}
+			successMap.put("fwdberror", "DB UPDATE");
+		}
+
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+		
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+
+		if (policyAdapter.getData() != null) {
+	
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			String prevPolicyName = null;
+			if(policyAdapter.isEditPolicy()){
+				prevPolicyName = "Config_FW_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+			}
+
+			Path newFile = getNextFilename(Paths.get(policyAdapter.getParentPath().toString()),
+					(policyAdapter.getPolicyType() + "_FW"), policyAdapter.getPolicyName(), version);
+
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy already Exists, cannot create the policy.");
+				PolicyLogger.error("Policy already Exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			policyName = newFile.getFileName().toString();
+
+			String jsonBody = policyAdapter.getJsonBody();
+			saveConfigurations(policyName, prevPolicyName, jsonBody);
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+			
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+
+			AllOfType allOfOne = new AllOfType();
+			File policyFilePath = new File(policyAdapter.getParentPath().toString(), policyName);
+			String policyDir = policyFilePath.getParentFile().getName();
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = policyDir + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			AllOfType allOf = new AllOfType();
+			
+			// Match for ConfigName
+			allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+			
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+			
+			rule.setEffect(EffectType.PERMIT);
+			
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+			
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "FirewallConfigPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+			
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+			
+			configAttributeValue.getContent().add("Config");
+			
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "FirewallConfigPolicy", "Exception creating Config URI");
+			}
+			
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+			
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+		
+		//Firewall Config ID Assignment
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("firewallConfigID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment1);
+		
+		// For Config file Url if configurations are provided.
+		//URL ID Assignment
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value"+policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" +path);
+		}		
+		String content = CONFIG_URL + "/Config/" + path + "." + getConfigFile(policyName);
+
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+		advice.getAttributeAssignmentExpression().add(assignment2);
+		
+		//Policy Name Assignment
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+			}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		System.out.println(fileName);
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+		}
+		System.out.println(name);
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+		
+		//Version Number Assignment
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+		advice.getAttributeAssignmentExpression().add(assignment4);
+		
+		//Ecomp Name Assignment
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+		advice.getAttributeAssignmentExpression().add(assignment5);
+		
+		//Config Name Assignment
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("matching:" + this.CONFIGID);
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+		advice.getAttributeAssignmentExpression().add(assignment6);
+
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+		assignment7.setAttributeId("RiskType");
+		assignment7.setCategory(CATEGORY_RESOURCE);
+		assignment7.setIssuer("");
+
+		AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+		configNameAttributeValue7.setDataType(STRING_DATATYPE);
+		configNameAttributeValue7.getContent().add(policyAdapter.getRiskType());
+		assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+		advice.getAttributeAssignmentExpression().add(assignment7);
+				
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("RiskLevel");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getRiskLevel());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);	
+
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("guard");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getGuard());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);
+				
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("TTLDate");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getTtlDate());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+		
+		int index = 0;
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+	
+	
+	private Boolean insertFirewallDicionaryData (String jsonBody) throws SQLException {
+
+		
+		JsonObject json = null;
+		if (jsonBody != null) {
+			
+			//Read jsonBody to JsonObject
+			json = stringToJson(jsonBody);
+			
+			JsonArray firewallRules = null;
+			JsonArray serviceGroup = null;
+			JsonArray addressGroup = null;
+			String securityZone=null;
+			
+			Connection con = null;
+			Statement st = null;
+			ResultSet rs = null;
+			
+			/*
+			 * Retrieve the property values for db access from the xacml.pap.properties
+			 */
+			papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+			papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+			papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+			papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+
+			//insert data into tables
+			try {
+				//Get DB Connection
+				Class.forName(papDbDriver);
+				con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+				st = con.createStatement();
+				
+				firewallRules = json.getJsonArray("firewallRuleList");
+				serviceGroup = json.getJsonArray("serviceGroups");
+				addressGroup = json.getJsonArray("addressGroups");	
+				securityZone=json.getString("primaryParentZoneId").toString();
+				
+				logger.info("Parent child: securityZone from JSON: "+securityZone);
+				String insertQuery = null;
+				
+				//Inserting childPolicy and its parent to the FWChildToParent DB table
+				if(securityZone!=null){
+					//Its a child Policy. 
+					//Retrieve the parent name from the securityZone Id
+					String retrieveParentQuery= "select parent from fwparent where securityZone='";
+					
+					retrieveParentQuery=retrieveParentQuery+securityZone+"';";
+					logger.info("Parent child: Query to retrieve parent "+retrieveParentQuery);
+					rs = st.executeQuery(retrieveParentQuery);
+					
+					String parent=null;
+					if(rs.next()){
+						parent = rs.getString("parent");
+					}
+					rs.close();
+					
+					
+					String insertQueryChildTable="INSERT INTO FWChildToParent(child, parent) VALUES ('";
+					insertQueryChildTable=insertQueryChildTable+policyAdapter.getPolicyName()+"','"+parent+"');";
+					logger.info("Parent child: Insert child and parent to DB: "+insertQueryChildTable);
+					st.executeUpdate(insertQueryChildTable);
+					
+				}
+				
+				/*
+				 * Inserting firewallRuleList data into the Terms, SecurityZone, and Action tables
+				 */
+				if (firewallRules != null) {
+					
+					int termID = 0;
+					int zoneID = 0;
+					int actionID = 0;
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM TERM;");
+					if(rs.next()){
+						termID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ZONE;");
+					if(rs.next()){
+						zoneID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ACTIONLIST;");
+					if(rs.next()){
+						actionID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					int i = 0;
+					for(JsonValue jsonValue : firewallRules) {
+						
+						//increment ID Primary Keys
+						termID = termID + 1;
+						zoneID = zoneID + 1;
+						actionID = actionID + 1;
+						
+						/*
+						 * Populate ArrayLists with values from the JSON
+						 */
+						//create the JSON object from the JSON Array for each iteration through the for loop
+						JsonObject ruleListobj = firewallRules.getJsonObject(i);
+												
+						//get values from JSON fields of firewallRulesList Array
+						String ruleName = ruleListobj.get("ruleName").toString();
+						String action = ruleListobj.get("action").toString();
+						String description = ruleListobj.get("description").toString();
+						
+						rs = st.executeQuery("SELECT * FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+						
+						if (rs.next()) {
+							st.executeUpdate("DELETE FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+						}
+						rs.close();
+						
+						//getting fromZone Array field from the firewallRulesList
+						JsonArray fromZoneArray = ruleListobj.getJsonArray("fromZones");
+						String fromZoneString = null;
+						
+						int fromZoneIndex = 0;
+						for (JsonValue fromZoneJsonValue : fromZoneArray) {
+							String value = fromZoneArray.get(fromZoneIndex).toString();
+							value = value.replace("\"", "");
+							
+							if (fromZoneString != null) {
+								fromZoneString = fromZoneString.concat(",").concat(value);
+								
+							} else {
+								fromZoneString = value;
+							}
+							
+							fromZoneIndex++;
+							
+						}
+						String fromZoneInsert = "'"+fromZoneString+"'";
+						
+						//getting toZone Array field from the firewallRulesList
+						JsonArray toZoneArray = ruleListobj.getJsonArray("toZones");
+						String toZoneString = null;
+						
+						int toZoneIndex = 0;
+						for (JsonValue toZoneJsonValue : toZoneArray) {
+							String value = toZoneArray.get(toZoneIndex).toString();
+							value = value.replace("\"", "");
+							
+							if (toZoneString != null) {
+								toZoneString = toZoneString.concat(",").concat(value);
+								
+							} else {
+								toZoneString = value;
+							}
+							
+							toZoneIndex++;
+							
+						}
+						String toZoneInsert = "'"+toZoneString+"'";
+						
+						//getting sourceList Array fields from the firewallRulesList
+						JsonArray srcListArray = ruleListobj.getJsonArray("sourceList");
+						String srcListString = null;
+						
+						int srcListIndex = 0;
+						for (JsonValue srcListJsonValue : srcListArray) {
+							JsonObject srcListObj = srcListArray.getJsonObject(srcListIndex);
+							String type = srcListObj.get("type").toString().replace("\"", "");
+							
+							String value = null;
+							if(type.equals("REFERENCE")||type.equals("GROUP")){
+								value = srcListObj.get("name").toString();
+							} else if (type.equalsIgnoreCase("ANY")){
+								value = null;
+							} else {
+								value = srcListObj.get("value").toString();
+							}
+							
+							if (value!=null){
+								value = value.replace("\"", "");
+							}
+							
+							if (srcListString != null) {
+								srcListString = srcListString.concat(",").concat(value);
+								
+							} else {
+								srcListString = value;
+							}
+							
+							srcListIndex++;
+							
+						}
+						String srcListInsert = "'"+srcListString+"'";
+						
+						//getting destinationList Array fields from the firewallRulesList
+						JsonArray destListArray = ruleListobj.getJsonArray("destinationList");
+						String destListString = null;
+						
+						int destListIndex = 0;
+						for (JsonValue destListJsonValue : destListArray) {
+							JsonObject destListObj = destListArray.getJsonObject(destListIndex);
+							String type = destListObj.get("type").toString().replace("\"", "");
+							
+							String value = null;
+							if(type.equals("REFERENCE")||type.equals("GROUP")){
+								value = destListObj.get("name").toString();
+							} else if (type.equalsIgnoreCase("ANY")){
+								value = null;
+							} else {
+								value = destListObj.get("value").toString();
+							}
+							
+							if (value!=null){
+								value = value.replace("\"", "");
+							}
+							
+							if (destListString != null) {
+								destListString = destListString.concat(",").concat(value);
+							} else {
+								destListString = value;
+							}
+							
+							destListIndex++;
+						}
+						String destListInsert = "'"+destListString+"'";
+						
+						//getting destServices Array fields from the firewallRulesList
+						JsonArray destServicesArray = ruleListobj.getJsonArray("destServices");
+						String destPortListString = null;
+						
+						int destPortListIndex = 0;
+						for (JsonValue destListJsonValue : destServicesArray) {
+							JsonObject destServicesObj = destServicesArray.getJsonObject(destPortListIndex);
+							String type = destServicesObj.get("type").toString().replace("\"", "");
+							
+							String value = null;
+							if(type.equals("REFERENCE")||type.equals("GROUP")){
+								value = destServicesObj.get("name").toString();
+							} else if (type.equalsIgnoreCase("ANY")){
+								value = null;
+							} else {
+								value = destServicesObj.get("value").toString();
+							}
+							
+							if (value!=null){
+								value = value.replace("\"", "");
+							}
+							
+							if (destPortListString != null) {
+								destPortListString = destPortListString.concat(",").concat(value);
+							} else {
+								destPortListString = value;
+							}
+							
+							destPortListIndex++;
+						}
+						String destPortListInsert = "'"+destPortListString+"'";					
+						
+						/*
+						 * Create Queries to INSERT data into database tables and execute 
+						 */					
+                        String termSql = "INSERT INTO Term (ID, TERMNAME, SRCIPLIST, DESTIPLIST, PROTOCOLLIST, PORTLIST, SRCPORTLIST,"
+                                 + " DESTPORTLIST, ACTION, DESCRIPTION, FROMZONE, TOZONE, CREATED_BY, MODIFIED_DATE) VALUES ("+termID+","
+                                 +ruleName+","+srcListInsert+","+destListInsert+","+ "null"+","+"null"+","+"null"+","+destPortListInsert+","
+                                 +action+","+description+","+fromZoneInsert+","+toZoneInsert+",'API',"+ "null"+ "); ";
+						termSql = termSql.replace('"', '\'');
+						st.addBatch(termSql);
+
+						String actionSql = "INSERT INTO ACTIONLIST (ID, ACTIONNAME, DESCRIPTION) VALUES ("+actionID+","+action+","+action+"); ";
+						actionSql = actionSql.replace('"', '\'');
+						st.addBatch(actionSql);
+						
+						st.executeBatch();
+						
+						i++;
+					}
+					
+				}
+				
+				/*
+				 * Inserting serviceGroups data into the ServiceGroup, ServiceList, ProtocolList, and PortList tables
+				 */
+				if (serviceGroup != null) {
+					
+					int serviceGroupID = 0;
+					int serviceListID = 0;
+					int protocolID = 0;
+					int portID = 0;
+
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM SERVICEGROUP;");
+					if(rs.next()){
+						serviceGroupID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM GROUPSERVICELIST;");
+					if(rs.next()){
+						serviceListID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PROTOCOLLIST;");
+					if(rs.next()){
+						protocolID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PORTLIST;");
+					if(rs.next()){
+						portID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					int i = 0;
+					for(JsonValue jsonValue : serviceGroup) {
+						
+						/*
+						 * Populate ArrayLists with values from the JSON
+						 */
+						//create the JSON object from the JSON Array for each iteration through the for loop
+						JsonObject svcGroupListobj = serviceGroup.getJsonObject(i);
+												
+						String serviceListName = svcGroupListobj.get("name").toString();
+						
+						String description = null;
+						if (svcGroupListobj.containsKey("description")){
+							description = svcGroupListobj.get("description").toString();
+						}
+						
+						//getting members Array from the serviceGroup
+						JsonArray membersArray = svcGroupListobj.getJsonArray("members");
+
+						//String type = svcGroupListobj.get("type").toString();
+						Boolean isServiceGroup = false;
+						if (membersArray!=null){
+							String membersType = membersArray.getJsonObject(0).get("type").toString();
+							if (membersType.contains("REFERENCE")) {
+								isServiceGroup = true;
+							}
+						}
+												
+						//Insert values into GROUPSERVICELIST table if name begins with Group 
+						if (isServiceGroup) {
+							
+							//increment ID Primary Keys
+							serviceListID = serviceListID + 1;
+
+							String name = null;
+							
+							int membersIndex = 0;
+							for (JsonValue membersValue : membersArray) {
+								JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+								//String value = membersObj.get("name").toString();
+								String type = membersObj.get("type").toString().replace("\"", "");
+								
+								String value = null;
+								if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+									value = membersObj.get("name").toString();
+								} else if (type.equalsIgnoreCase("ANY")){
+									value = null;
+								} else {
+									value = membersObj.get("value").toString();
+								}
+								
+								if(value != null){
+									value = value.replace("\"", "");
+								}
+								
+								if (name != null) {
+									name = name.concat(",").concat(value);
+								} else {
+									name = value;
+								}
+								
+								membersIndex++;
+							}
+							String nameInsert = "'"+name+"'";		
+							
+							insertQuery = "INSERT INTO GROUPSERVICELIST (ID, NAME, SERVICELIST) "
+									+ "VALUES("+serviceListID+","+serviceListName+","+nameInsert+")";
+							
+							//Replace double quote with single quote
+							insertQuery = insertQuery.replace('"', '\'');
+							
+							//Execute the queries to Insert data
+				            st.executeUpdate(insertQuery);
+													
+						} else { //Insert JSON data serviceList table, protollist table, and portlist table
+
+							//increment ID Primary Keys
+							protocolID = protocolID + 1;
+							portID = portID + 1;
+							serviceGroupID = serviceGroupID + 1;
+							
+							String type = svcGroupListobj.get("type").toString();
+							String transportProtocol = svcGroupListobj.get("transportProtocol").toString();
+							String ports = svcGroupListobj.get("ports").toString();
+							
+							/*
+							 * Create Queries to INSERT data into database table and execute 
+							 */
+							String serviceSql = "INSERT INTO SERVICEGROUP (ID, NAME, DESCRIPTION, TYPE, TRANSPORTPROTOCOL, APPPROTOCOL, PORTS) "
+									+ "VALUES("+serviceGroupID+","+serviceListName+","+description+","+type+","
+									+ transportProtocol+","+"null,"+ports+"); ";
+							serviceSql = serviceSql.replace('"', '\'');
+							st.addBatch(serviceSql);
+							
+							String protSql = "INSERT INTO PROTOCOLLIST (ID, PROTOCOLNAME, DESCRIPTION) VALUES("+protocolID+","+transportProtocol+","+transportProtocol+"); ";
+							protSql = protSql.replace('"', '\'');
+							st.addBatch(protSql);
+							
+							String portSql = "INSERT INTO PORTLIST (ID, PORTNAME, DESCRIPTION) VALUES("+portID+","+ports+","+ports+");";
+							portSql = portSql.replace('"', '\'');
+							st.addBatch(portSql);
+							
+							st.executeBatch();
+
+						}		
+						
+						
+						
+						i++;
+					}
+				}
+				
+				/*
+				 * Inserting addressGroup data into the ADDRESSGROUP table
+				 */
+				if (addressGroup != null) {
+					int prefixID = 0;
+					int addressID = 0;
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PREFIXLIST;");
+					if(rs.next()){
+						prefixID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ADDRESSGROUP;");
+					if(rs.next()){
+						addressID = rs.getInt("ID");
+					}
+					rs.close();
+					
+					
+					int i = 0;
+					for(JsonValue jsonValue : addressGroup) {
+						
+						/*
+						 * Populate ArrayLists with values from the JSON
+						 */
+						//create the JSON object from the JSON Array for each iteration through the for loop
+						JsonObject addressGroupObj = addressGroup.getJsonObject(i);
+						
+						//create JSON array for members
+						JsonArray membersArray = addressGroupObj.getJsonArray("members");
+						String addressGroupName = addressGroupObj.get("name").toString();
+						
+						String description = null;
+						if (addressGroupObj.containsKey("description")){
+							description = addressGroupObj.get("description").toString();
+						}
+						
+						String prefixIP = null;
+						String type = null;
+						
+						int membersIndex = 0;
+						for (JsonValue membersValue : membersArray) {
+							JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+							//String value = membersObj.get("value").toString();
+							type = membersObj.get("type").toString().replace("\"", "");
+							
+							String value = null;
+							if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+								value = membersObj.get("name").toString();
+							} else if (type.equalsIgnoreCase("ANY")){
+								value = null;
+							} else {
+								value = membersObj.get("value").toString();
+							}
+							
+							if(value != null){
+								value = value.replace("\"", "");
+							}
+							
+							if (prefixIP != null) {
+								prefixIP = prefixIP.concat(",").concat(value);
+							} else {
+								prefixIP = value;
+							}
+							
+							membersIndex++;
+						}
+						String prefixList = "'"+prefixIP+"'";
+						
+						Boolean isAddressGroup = type.contains("REFERENCE");
+						
+						if (isAddressGroup) {								
+							//increment ID Primary Keys
+							addressID = addressID + 1;
+							
+							insertQuery = "INSERT INTO ADDRESSGROUP (ID, NAME, DESCRIPTION, PREFIXLIST) "
+										+ "VALUES("+addressID+","+addressGroupName+","+description+","+prefixList+")";	
+						} else {
+							 //increment ID Primary Key
+							prefixID = prefixID + 1;
+							
+							insertQuery = "INSERT INTO PREFIXLIST (ID, PL_NAME, PL_VALUE, DESCRIPTION) "
+										+ "VALUES("+prefixID+","+addressGroupName+","+prefixList+","+description+")";
+							
+						}
+		
+						
+						//Replace double quote with single quote
+						insertQuery = insertQuery.replace('"', '\'');
+						
+						//Execute the queries to Insert data
+			            st.executeUpdate(insertQuery);
+						
+						i++;
+					}
+					
+				}
+				
+				/*
+				 * Remove duplicate values from 'lookup' dictionary tables
+				 */
+				//ProtocolList Table
+				String protoDelete = "DELETE FROM protocollist USING protocollist, protocollist p1 "
+						+ "WHERE protocollist.id > p1.id AND protocollist.protocolname = p1.protocolname;";
+				st.addBatch(protoDelete);
+				
+				//PortList Table
+				String portListDelete = "DELETE FROM portlist USING portlist, portlist p1 "
+						+ "WHERE portlist.id > p1.id AND portlist.portname = p1.portname; ";
+				st.addBatch(portListDelete);
+				
+				//PrefixList Table
+				String prefixListDelete = "DELETE FROM prefixlist USING prefixlist, prefixlist p1 "
+						+ "WHERE prefixlist.id > p1.id AND prefixlist.pl_name = p1.pl_name AND "
+						+ "prefixlist.pl_value = p1.pl_value AND prefixlist.description = p1.description; ";
+				st.addBatch(prefixListDelete);
+				
+				//GroupServiceList
+				String groupServiceDelete = "DELETE FROM groupservicelist USING groupservicelist, groupservicelist g1 "
+						+ "WHERE groupservicelist.id > g1.id AND groupservicelist.name = g1.name AND "
+						+ "groupservicelist.serviceList = g1.serviceList; ";
+				st.addBatch(groupServiceDelete);
+				
+				st.executeBatch();
+				
+			} catch (ClassNotFoundException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception building Firewall queries ");
+				System.out.println(e.getMessage());
+				return false;
+	
+			} catch (SQLException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception executing Firewall queries");
+				System.out.println(e.getMessage());
+				return false;
+			} catch (Exception e) {
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception getting Json values");
+				System.out.println(e.getMessage());
+				return false;
+			} finally {
+				try{
+					if (con!=null) con.close();
+					if (rs!=null) rs.close();
+					if (st!=null) st.close();
+				} catch (Exception ex){}
+			}
+			return true;
+
+		} else {
+			return false;
+		}
+		
+	}
+
+
+	private Boolean updateFirewallDictionaryData(String jsonBody, String prevJsonBody) {
+		
+		JsonObject oldJson = null;
+		JsonObject newJson = null;
+		
+		if (jsonBody != null || prevJsonBody != null) {
+			
+			oldJson = stringToJson(prevJsonBody);
+			newJson = stringToJson(jsonBody);
+			
+			//if no changes to the json then return true
+			if (oldJson.equals(newJson)) {
+				return true;
+			}
+			
+			JsonArray firewallRules = null;
+			JsonArray serviceGroup = null;
+			JsonArray addressGroup = null;
+			
+			firewallRules = newJson.getJsonArray("firewallRuleList");
+			serviceGroup = newJson.getJsonArray("serviceGroups");
+			addressGroup = newJson.getJsonArray("addressGroups");	
+			
+			Connection con = null;
+			Statement st = null;
+			ResultSet rs = null;
+			
+			/*
+			 * Retrieve the property values for db access from the xacml.pap.properties
+			 */
+			papDbDriver = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_DRIVER);
+			papDbUrl = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_URL);
+			papDbUser = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_USER);
+			papDbPassword = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DB_PASSWORD);
+	
+			//insert data into tables
+			try {
+				
+				//Get DB Connection
+				Class.forName(papDbDriver);
+				con = DriverManager.getConnection(papDbUrl,papDbUser,papDbPassword);
+				st = con.createStatement();
+				
+				JsonNode jsonDiff = createPatch(jsonBody, prevJsonBody);
+				
+				int i = 0;
+				for (JsonNode node : jsonDiff) {
+					//String path = jsonDiff.get(i).asText();
+					String jsonpatch = jsonDiff.get(i).toString();
+					
+					JsonObject patchObj = stringToJson(jsonpatch);
+					
+					String path = patchObj.get("path").toString().replace('"', ' ').trim();
+					 					
+					if (path.contains("firewallRuleList")) {
+						int termID = 0;
+						int zoneID = 0;
+						int actionID = 0;
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM TERM;");
+						if(rs.next()){
+							termID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ZONE;");
+						if(rs.next()){
+							zoneID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ACTIONLIST;");
+						if(rs.next()){
+							actionID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						String insertQuery = null;
+						
+						/*
+						 * Inserting firewallRuleList data into the Terms, SecurityZone, and Action tables
+						 */
+						int ri = 0;
+						for(JsonValue jsonValue : firewallRules) {
+							
+							//increment ID Primary Keys
+							termID = termID + 1;
+							zoneID = zoneID + 1;
+							actionID = actionID + 1;
+							
+							/*
+							 * Populate ArrayLists with values from the JSON
+							 */
+							//create the JSON object from the JSON Array for each iteration through the for loop
+							JsonObject ruleListobj = firewallRules.getJsonObject(ri);
+							
+							//get values from JSON fields of firewallRulesList Array
+							String ruleName = ruleListobj.get("ruleName").toString().replace('"', '\'');
+							String action = ruleListobj.get("action").toString().replace('"', '\'');
+							String description = ruleListobj.get("description").toString().replace('"', '\'');
+							
+							rs = st.executeQuery("SELECT * FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+							
+							if (rs.next()) {
+								st.executeUpdate("DELETE FROM TERM WHERE TERMNAME = "+ ruleName + ";");
+							}
+							rs.close();
+							
+							//getting fromZone Array field from the firewallRulesList
+							JsonArray fromZoneArray = ruleListobj.getJsonArray("fromZones");
+							String fromZoneString = null;
+							
+							int fromZoneIndex = 0;
+							for (JsonValue fromZoneJsonValue : fromZoneArray) {
+								String value = fromZoneArray.get(fromZoneIndex).toString();
+								value = value.replace("\"", "");
+								
+								if (fromZoneString != null) {
+									fromZoneString = fromZoneString.concat(",").concat(value);
+									
+								} else {
+									fromZoneString = value;
+								}
+								
+								fromZoneIndex++;
+								
+							}
+							String fromZoneInsert = "'"+fromZoneString+"'";
+							
+							//getting toZone Array field from the firewallRulesList
+							JsonArray toZoneArray = ruleListobj.getJsonArray("toZones");
+							String toZoneString = null;
+							
+							int toZoneIndex = 0;
+							for (JsonValue toZoneJsonValue : toZoneArray) {
+								String value = toZoneArray.get(toZoneIndex).toString();
+								value = value.replace("\"", "");
+								
+								if (toZoneString != null) {
+									toZoneString = toZoneString.concat(",").concat(value);
+									
+								} else {
+									toZoneString = value;
+								}
+								
+								toZoneIndex++;
+								
+							}
+							String toZoneInsert = "'"+toZoneString+"'";
+							//getting sourceList Array fields from the firewallRulesList
+							JsonArray srcListArray = ruleListobj.getJsonArray("sourceList");
+							String srcListString = null;
+							
+							int srcListIndex = 0;
+							for (JsonValue srcListJsonValue : srcListArray) {
+								JsonObject srcListObj = srcListArray.getJsonObject(srcListIndex);
+								String type = srcListObj.get("type").toString().replace("\"", "");
+								
+								String value = null;
+								if(type.equals("REFERENCE")||type.equals("GROUP")){
+									value = srcListObj.get("name").toString();
+								} else if (type.equalsIgnoreCase("ANY")){
+									value = null;
+								} else {
+									value = srcListObj.get("value").toString();
+								}
+								
+								if(value != null){
+									value = value.replace("\"", "");
+								}
+								
+								if (srcListString != null) {
+									srcListString = srcListString.concat(",").concat(value);
+									
+								} else {
+									srcListString = value;
+								}
+								
+								srcListIndex++;
+								
+							}
+							String srcListInsert = "'"+srcListString+"'";
+							
+							//getting destinationList Array fields from the firewallRulesList
+							JsonArray destListArray = ruleListobj.getJsonArray("destinationList");
+							String destListString = null;
+							
+							int destListIndex = 0;
+							for (JsonValue destListJsonValue : destListArray) {
+								JsonObject destListObj = destListArray.getJsonObject(destListIndex);
+								String type = destListObj.get("type").toString().replace("\"", "");
+								
+								String value = null;
+								if(type.equals("REFERENCE")||type.equals("GROUP")){
+									value = destListObj.get("name").toString();
+								} else if (type.equalsIgnoreCase("ANY")){
+									value = null;
+								} else {
+									value = destListObj.get("value").toString();
+								}
+								
+								if(value != null){
+									value = value.replace("\"", "");
+								}
+								
+								if (destListString != null) {
+									destListString = destListString.concat(",").concat(value);
+								} else {
+									destListString = value;
+								}
+								
+								destListIndex++;
+							}
+							String destListInsert = "'"+destListString+"'";
+							
+							//getting destServices Array fields from the firewallRulesList
+							JsonArray destServicesArray = ruleListobj.getJsonArray("destServices");
+							String destPortListString = null;
+							
+							int destPortListIndex = 0;
+							for (JsonValue destListJsonValue : destServicesArray) {
+								JsonObject destServicesObj = destServicesArray.getJsonObject(destPortListIndex);
+								String type = destServicesObj.get("type").toString().replace("\"", "");
+								
+								String value = null;
+								if(type.equals("REFERENCE")||type.equals("GROUP")){
+									value = destServicesObj.get("name").toString();
+								} else if (type.equalsIgnoreCase("ANY")){
+									value = null;
+								} else {
+									value = destServicesObj.get("value").toString();
+								}
+								
+								if(value != null){
+									value = value.replace("\"", "");
+								}
+								
+								if (destPortListString != null) {
+									destPortListString = destPortListString.concat(",").concat(value);
+								} else {
+									destPortListString = value;
+								}
+								
+								destPortListIndex++;
+							}
+							String destPortListInsert = "'"+destPortListString+"'";					
+							
+							/*
+							 * Create Queries to INSERT data into database tables and execute 
+							 */
+							
+							//Insert Into Terms table
+	                        String termSql = "INSERT INTO Term (ID, TERMNAME, SRCIPLIST, DESTIPLIST, PROTOCOLLIST, PORTLIST, SRCPORTLIST,"
+	                                 + " DESTPORTLIST, ACTION, DESCRIPTION, FROMZONE, TOZONE, CREATED_BY, MODIFIED_DATE) VALUES ("+termID+","
+	                                 +ruleName+","+srcListInsert+","+destListInsert+","+ "null"+","+"null"+","+"null"+","+destPortListInsert+","
+	                                 +action+","+description+","+fromZoneInsert+","+toZoneInsert+",'API',"+ "null"+ "); ";
+							
+							termSql = termSql.replace('"', '\'');
+							st.addBatch(termSql);
+							
+							rs = st.executeQuery("SELECT * FROM ACTIONLIST WHERE ACTIONNAME = " + action + ";");
+							
+							String actionSql = null;
+							if (rs.next()) {
+								//do nothing
+							} else {
+								actionSql = "INSERT INTO ACTIONLIST (ID, ACTIONNAME, DESCRIPTION) VALUES ("+actionID+","+action+","+action+") ";
+								actionSql = actionSql.replace('"', '\'');
+								st.addBatch(actionSql);
+							}
+
+							st.executeBatch();
+							
+							ri++;
+						}
+						
+					}
+					
+					if (path.contains("serviceGroups")) {
+						int serviceGroupID = 0;
+						int serviceListID = 0;
+						int protocolID = 0;
+						int portID = 0;
+
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM SERVICEGROUP;");
+						if(rs.next()){
+							serviceGroupID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM GROUPSERVICELIST;");
+						if(rs.next()){
+							serviceListID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PROTOCOLLIST;");
+						if(rs.next()){
+							protocolID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PORTLIST;");
+						if(rs.next()){
+							portID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						String insertQuery = null;
+						
+						/*
+						 * Inserting serviceGroups data into the ServiceGroup, ServiceList, ProtocolList, and PortList tables
+						 */
+						int si = 0;
+						for(JsonValue jsonValue : serviceGroup) {
+							
+							/*
+							 * Populate ArrayLists with values from the JSON
+							 */
+							//create the JSON object from the JSON Array for each iteration through the for loop
+							JsonObject svcGroupListobj = serviceGroup.getJsonObject(si);
+							
+							String groupName = svcGroupListobj.get("name").toString().replace('"', '\''); 
+							
+							String description = null;
+							if (svcGroupListobj.containsKey("description")){
+								description = svcGroupListobj.get("description").toString().replace('"', '\'');
+							}
+							
+							JsonArray membersArray = svcGroupListobj.getJsonArray("members");
+
+							Boolean isServiceGroup = false;
+							if (membersArray!=null){
+								String membersType = membersArray.getJsonObject(0).get("type").toString();
+								if (membersType.contains("REFERENCE")) {
+									isServiceGroup = true;
+								}
+							}
+							
+							//Insert values into GROUPSERVICELIST table if name begins with Group 
+							if (isServiceGroup) {
+								
+								rs = st.executeQuery("SELECT * FROM GROUPSERVICELIST WHERE NAME = "+ groupName + ";");
+								
+								if (rs.next()) {
+									st.executeUpdate("DELETE FROM GROUPSERVICELIST WHERE NAME = "+ groupName + ";");
+								}
+								rs.close();
+								//increment ID Primary Keys
+								serviceListID = serviceListID + 1;
+								
+								String name = null;
+								int membersIndex = 0;
+								for (JsonValue membersValue : membersArray) {
+									JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+									String type = membersObj.get("type").toString().replace("\"", "");
+									
+									String value = null;
+									if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+										value = membersObj.get("name").toString();
+									} else if (type.equalsIgnoreCase("ANY")){
+										value = null;
+									} else {
+										value = membersObj.get("value").toString();
+									}
+									
+									if(value != null){
+										value = value.replace("\"", "");
+									}
+									
+									if (name != null) {
+										name = name.concat(",").concat(value);
+									} else {
+										name = value;
+									}
+									
+									membersIndex++;
+								}
+								String nameInsert = "'"+name+"'";		
+								
+								insertQuery = "INSERT INTO GROUPSERVICELIST (ID, NAME, SERVICELIST) "
+										+ "VALUES("+serviceListID+","+groupName+","+nameInsert+")";
+								
+								//Replace double quote with single quote
+								insertQuery = insertQuery.replace('"', '\'');
+								
+								//Execute the queries to Insert data
+					            st.executeUpdate(insertQuery);
+														
+							} else { //Insert JSON data serviceGroup table, protocollist table, and portlist table
+																
+								//increment ID Primary Keys
+								protocolID = protocolID + 1;
+								portID = portID + 1;
+								serviceGroupID = serviceGroupID + 1;
+								
+								String type = svcGroupListobj.get("type").toString().replace('"', '\'');
+								String transportProtocol = svcGroupListobj.get("transportProtocol").toString().replace('"', '\'');
+								String ports = svcGroupListobj.get("ports").toString().replace('"', '\'');
+								
+								rs = st.executeQuery("SELECT * FROM SERVICEGROUP WHERE NAME = "+ groupName + ";");
+								
+								if (rs.next()) {
+									st.executeUpdate("DELETE FROM SERVICEGROUP WHERE NAME = "+ groupName + ";");
+								}
+								rs.close();
+								
+								String svcGroupSql = "INSERT INTO SERVICEGROUP (ID, NAME, DESCRIPTION, TYPE, TRANSPORTPROTOCOL, APPPROTOCOL, PORTS) "
+											+ "VALUES("+serviceGroupID+","+groupName+","+description+","+type+","
+											+ transportProtocol+","+"null,"+ports+"); ";
+								svcGroupSql = svcGroupSql.replace('"', '\'');
+								st.addBatch(svcGroupSql);
+								
+								rs = st.executeQuery("SELECT * FROM PROTOCOLLIST WHERE PROTOCOLNAME = " + transportProtocol + ";");
+								
+								String protoSql = null;
+								if (rs.next()) {
+									//do nothing
+								} else {
+									protoSql = "INSERT INTO PROTOCOLLIST (ID, PROTOCOLNAME, DESCRIPTION) "
+											+ "VALUES("+protocolID+","+transportProtocol+","+transportProtocol+"); ";
+									protoSql = protoSql.replace('"', '\'');
+									st.addBatch(protoSql);
+
+								}
+								rs.close();
+
+								rs = st.executeQuery("SELECT * FROM PORTLIST WHERE PORTNAME = " + ports + ";");
+								
+								String portSql = null;
+								if (rs.next()) {
+									//do nothing
+								} else {
+									portSql = "INSERT INTO PORTLIST (ID, PORTNAME, DESCRIPTION) VALUES("+portID+","+ports+","+ports+"); ";
+									portSql = portSql.replace('"', '\'');
+									st.addBatch(portSql);
+								}
+								rs.close();
+								
+								st.executeBatch();
+
+							}		
+							
+							
+				            si++;
+						}
+						
+					}
+					
+					if (path.contains("addressGroups")) {
+						/*
+						 * Inserting addressGroup data into the ADDRESSGROUP table
+						 */
+						int prefixID = 0;
+						int addressID = 0;
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM PREFIXLIST;");
+						if(rs.next()){
+							prefixID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						rs = st.executeQuery("SELECT MAX(ID) AS ID FROM ADDRESSGROUP;");
+						if(rs.next()){
+							addressID = rs.getInt("ID");
+						}
+						rs.close();
+						
+						String insertQuery = null;
+						
+						int ai = 0;
+						for(JsonValue jsonValue : addressGroup) {
+							
+							/*
+							 * Populate ArrayLists with values from the JSON
+							 */
+							//create the JSON object from the JSON Array for each iteration through the for loop
+							JsonObject addressGroupObj = addressGroup.getJsonObject(ai);
+							
+							//create JSON array for members
+							JsonArray membersArray = addressGroupObj.getJsonArray("members");
+							String addressGroupName = addressGroupObj.get("name").toString().replace('"', '\'');
+							
+							String description = null;
+							if (addressGroupObj.containsKey("description")){
+								description = addressGroupObj.get("description").toString().replace('"', '\'');
+							}
+							
+							String prefixIP = null;
+							String type = null;
+							int membersIndex = 0;
+							for (JsonValue membersValue : membersArray) {
+								JsonObject membersObj = membersArray.getJsonObject(membersIndex);
+								type = membersObj.get("type").toString().replace("\"", "");
+								
+								String value = null;
+								if(type.equals("REFERENCE")||type.equals("GROUP")||type.equals("SERVICE")){
+									value = membersObj.get("name").toString();
+								} else if (type.equalsIgnoreCase("ANY")){
+									value = null;
+								} else {
+									value = membersObj.get("value").toString();
+								}
+								
+								if(value != null){
+									value = value.replace("\"", "");
+								}
+								
+								if (prefixIP != null) {
+									prefixIP = prefixIP.concat(",").concat(value);
+								} else {
+									prefixIP = value;
+								}
+								
+								membersIndex++;
+							}
+							String prefixList = "'"+prefixIP+"'";
+							
+							Boolean isAddressGroup = type.contains("REFERENCE");
+							
+							if (isAddressGroup) {		
+								
+								rs = st.executeQuery("SELECT * FROM ADDRESSGROUP WHERE NAME = "+ addressGroupName + ";");
+								
+								if (rs.next()) {
+									st.executeUpdate("DELETE FROM ADDRESSGROUP WHERE NAME = "+ addressGroupName + ";");
+								}
+								rs.close();
+								//increment ID Primary Keys
+								addressID = addressID + 1;
+								
+								insertQuery = "INSERT INTO ADDRESSGROUP (ID, NAME, DESCRIPTION, PREFIXLIST) "
+											+ "VALUES("+addressID+","+addressGroupName+","+description+","+prefixList+")";	
+								
+								
+								
+							} else {
+								
+								rs = st.executeQuery("SELECT * FROM PREFIXLIST WHERE PL_NAME = "+ addressGroupName + ";");
+								
+								if (rs.next()) {
+									st.executeUpdate("DELETE FROM PREFIXLIST WHERE PL_NAME = "+ addressGroupName + ";");
+								}
+								rs.close();
+								 //increment ID Primary Key
+								prefixID = prefixID + 1;
+								
+								insertQuery = "INSERT INTO PREFIXLIST (ID, PL_NAME, PL_VALUE, DESCRIPTION) "
+											+ "VALUES("+prefixID+","+addressGroupName+","+prefixList+","+description+")";
+								
+							}
+			
+							
+							//Replace double quote with single quote
+							insertQuery = insertQuery.replace('"', '\'');
+							
+							//Execute the queries to Insert data
+				            st.executeUpdate(insertQuery);
+							
+							ai++;
+						}
+						
+					}
+						
+					i++;	
+				}
+				
+				/*
+				 * Remove duplicate values from 'lookup' dictionary tables
+				 */
+				//ProtocolList Table
+				String protoDelete = "DELETE FROM protocollist USING protocollist, protocollist p1 "
+						+ "WHERE protocollist.id > p1.id AND protocollist.protocolname = p1.protocolname;";
+				st.addBatch(protoDelete);
+				
+				//PortList Table
+				String portListDelete = "DELETE FROM portlist USING portlist, portlist p1 "
+						+ "WHERE portlist.id > p1.id AND portlist.portname = p1.portname; ";
+				st.addBatch(portListDelete);
+				
+				//PrefixList Table
+				String prefixListDelete = "DELETE FROM prefixlist USING prefixlist, prefixlist p1 "
+						+ "WHERE prefixlist.id > p1.id AND prefixlist.pl_name = p1.pl_name AND "
+						+ "prefixlist.pl_value = p1.pl_value AND prefixlist.description = p1.description; ";
+				st.addBatch(prefixListDelete);
+				
+				//GroupServiceList
+				String groupServiceDelete = "DELETE FROM groupservicelist USING groupservicelist, groupservicelist g1 "
+						+ "WHERE groupservicelist.id > g1.id AND groupservicelist.name = g1.name AND "
+						+ "groupservicelist.serviceList = g1.serviceList; ";
+				st.addBatch(groupServiceDelete);
+				
+				st.executeBatch();
+				
+			} catch (ClassNotFoundException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception building Firewall queries");
+				System.out.println(e.getMessage());
+				return false;
+	
+			} catch (SQLException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "FirewallConfigPolicy", "Exception executing Firewall queries");
+				System.out.println(e.getMessage());
+				return false;
+			} finally {
+				try{
+					if (con!=null) con.close();
+					if (rs!=null) rs.close();
+					if (st!=null) st.close();
+				} catch (Exception ex){}
+			}
+			return true;
+	
+		} else {
+			return false;
+		}
+	
+}
+	
+	private JsonObject stringToJson(String jsonString) {
+		
+		JsonObject json = null;
+		if (jsonString != null) {
+			
+			//Read jsonBody to JsonObject
+			StringReader in = null;
+			
+			in = new StringReader(jsonString);
+			
+			JsonReader jsonReader = Json.createReader(in);
+			json = jsonReader.readObject();
+		}
+		
+		return json;
+	}
+		
+		
+	private JsonNode createPatch(String json, String oldJson) {
+		JsonNode oldJason = null;
+		JsonNode updatedJason = null;
+
+		try {
+		oldJason = JsonLoader.fromString(oldJson);
+		updatedJason = JsonLoader.fromString(json);
+		} catch (IOException e) {
+		e.printStackTrace();
+		}
+
+		JsonPatch jsonPatch = JsonDiff.asJsonPatch(oldJason, updatedJason);
+		JsonNode patchNode = JsonDiff.asJson(oldJason, updatedJason);
+		System.out.println("Sending Patch:" + jsonPatch);
+		return patchNode;
+
+		}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getPolicyData();
+	}
+
+}
+	
+	
+	
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java
new file mode 100644
index 0000000..c65b0be
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/MicroServiceConfigPolicy.java
@@ -0,0 +1,561 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import javax.json.stream.JsonGenerationException;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionsType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AllOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AnyOfType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class MicroServiceConfigPolicy extends Policy {
+	
+	/**
+	 * Config Fields
+	 */
+	private static final Logger logger = FlexLogger.getLogger(ConfigPolicy.class);
+
+	public MicroServiceConfigPolicy() {
+		super();
+	}
+	
+	public MicroServiceConfigPolicy(PolicyRestAdapter policyAdapter){
+		this.policyAdapter = policyAdapter;
+	}
+
+	//save configuration of the policy based on the policyname
+	private void saveConfigurations(String policyName, String prevPolicyName, String jsonBody) {
+		String domain = getParentPathSubScopeDir();
+		String path = domain.replace('\\', '.');
+		if(path.contains("/")){
+			path = domain.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		try {
+			String body = null;
+			try {
+				body = jsonBody;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+			System.out.println(body);
+			if(policyName.endsWith(".xml")){
+				policyName	 = policyName.substring(0, policyName.lastIndexOf(".xml"));	
+			}
+			PrintWriter out = new PrintWriter(CONFIG_HOME + File.separator+path + "."+ policyName +".json");
+			out.println(body);
+			out.close();
+
+		} catch (JsonGenerationException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+	}
+	
+	//getting the policy name and setting to configuration on adding .json
+	private String getConfigFile(String filename) {
+		filename = FilenameUtils.removeExtension(filename);
+		if (filename.endsWith(".xml")) {
+			filename = filename.substring(0, filename.length() - 4);
+		}
+		filename = filename +".json";
+		return filename;
+	}
+	
+	@Override
+	public Map<String, String> savePolicies() throws Exception {
+		
+		Map<String, String> successMap = new HashMap<String,String>();
+		if(isPolicyExists()){
+			successMap.put("EXISTS", "This Policy already exist on the PAP");
+			return successMap;
+		}
+		
+		if(!isPreparedToSave()){
+			//Prep and configure the policy for saving
+			prepareToSave();
+		}
+
+		// Until here we prepared the data and here calling the method to create xml.
+		Path newPolicyPath = null;
+		newPolicyPath = Paths.get(policyAdapter.getParentPath().toString(), policyName);
+		successMap = createPolicy(newPolicyPath,getCorrectPolicyDataObject() );		
+		if (successMap.containsKey("success")) {
+			Path finalPolicyPath = getFinalPolicyPath();
+			policyAdapter.setFinalPolicyPath(finalPolicyPath.toString());
+		}
+		return successMap;		
+	}
+	
+	//This is the method for preparing the policy for saving.  We have broken it out
+	//separately because the fully configured policy is used for multiple things
+	@Override
+	public boolean prepareToSave() throws Exception{
+
+		if(isPreparedToSave()){
+			//we have already done this
+			return true;
+		}
+		
+		int version = 0;
+		String policyID = policyAdapter.getPolicyID();
+
+		if (policyAdapter.isEditPolicy()) {
+			version = policyAdapter.getHighestVersion() + 1;
+		} else {
+			version = 1;
+		}
+		
+		// Create the Instance for pojo, PolicyType object is used in marshalling.
+		if (policyAdapter.getPolicyType().equals("Config")) {
+			PolicyType policyConfig = new PolicyType();
+
+			policyConfig.setVersion(Integer.toString(version));
+			policyConfig.setPolicyId(policyID);
+			policyConfig.setTarget(new TargetType());
+			policyAdapter.setData(policyConfig);
+		}
+		
+		if (policyAdapter.getData() != null) {
+			
+			// Save off everything
+			// making ready all the required elements to generate the action policy xml.
+			// Get the uniqueness for policy name.
+			String prevPolicyName = null;
+			if(policyAdapter.isEditPolicy()){
+				prevPolicyName = "Config_MS_" + policyAdapter.getPolicyName() + "." + policyAdapter.getHighestVersion() + ".xml";
+			}
+			
+			Path newFile = this.getNextLoopFilename(Paths.get(policyAdapter.getParentPath()), policyAdapter.getPolicyType(), 
+					policyAdapter.getConfigPolicyType(), policyAdapter.getPolicyName(), version);
+			
+			if (newFile == null) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy already Exists, cannot create the policy.");
+				PolicyLogger.error("Policy already Exists, cannot create the policy.");
+				setPolicyExists(true);
+				return false;
+			}
+			
+			policyName = newFile.getFileName().toString();
+			
+			// Save the Configurations file with the policy name with extention based on selection.
+			String jsonBody = policyAdapter.getJsonBody();
+			saveConfigurations(policyName, prevPolicyName, jsonBody);
+			
+			// Make sure the filename ends with an extension
+			if (policyName.endsWith(".xml") == false) {
+				policyName = policyName + ".xml";
+			}
+			
+	
+			PolicyType configPolicy = (PolicyType) policyAdapter.getData();
+			
+			configPolicy.setDescription(policyAdapter.getPolicyDescription());
+
+			configPolicy.setRuleCombiningAlgId(policyAdapter.getRuleCombiningAlgId());
+			
+			AllOfType allOfOne = new AllOfType();
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			logger.info("print the main domain value "+policyDir);
+			String path = policyDir.replace('\\', '.');
+			if(path.contains("/")){
+				path = policyDir.replace('/', '.');
+				logger.info("print the path:" +path);
+			}
+			String fileName = FilenameUtils.removeExtension(policyName);
+			fileName = path + "." + fileName + ".xml";
+			String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+			if ((name == null) || (name.equals(""))) {
+				name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+			}
+			
+			// Match for policyName
+			allOfOne.getMatch().add(createMatch("PolicyName", name));
+			
+			AllOfType allOf = new AllOfType();
+		
+			// Adding the matches to AllOfType element Match for Ecomp
+			allOf.getMatch().add(createMatch("ECOMPName", policyAdapter.getEcompName()));
+			// Match for ConfigName
+			allOf.getMatch().add(createMatch("ConfigName", policyAdapter.getConfigName()));
+			// Match for Service
+			allOf.getMatch().add(createDynamicMatch("service", policyAdapter.getServiceType()));
+			// Match for uuid
+			allOf.getMatch().add(createDynamicMatch("uuid", policyAdapter.getUuid()));
+			// Match for location
+			allOf.getMatch().add(createDynamicMatch("location", policyAdapter.getLocation()));
+			// Match for riskType
+			allOf.getMatch().add(
+					createDynamicMatch("RiskType", policyAdapter.getRiskType()));
+			// Match for riskLevel
+			allOf.getMatch().add(
+					createDynamicMatch("RiskLevel", String.valueOf(policyAdapter.getRiskLevel())));
+			// Match for riskguard
+			allOf.getMatch().add(
+					createDynamicMatch("guard", policyAdapter.getGuard()));
+			// Match for ttlDate
+			allOf.getMatch().add(
+					createDynamicMatch("TTLDate", policyAdapter.getTtlDate()));
+
+			AnyOfType anyOf = new AnyOfType();
+			anyOf.getAllOf().add(allOfOne);
+			anyOf.getAllOf().add(allOf);
+
+			TargetType target = new TargetType();
+			((TargetType) target).getAnyOf().add(anyOf);
+			
+			// Adding the target to the policy element
+			configPolicy.setTarget((TargetType) target);
+
+			RuleType rule = new RuleType();
+			rule.setRuleId(policyAdapter.getRuleID());
+			
+			rule.setEffect(EffectType.PERMIT);
+			
+			// Create Target in Rule
+			AllOfType allOfInRule = new AllOfType();
+
+			// Creating match for ACCESS in rule target
+			MatchType accessMatch = new MatchType();
+			AttributeValueType accessAttributeValue = new AttributeValueType();
+			accessAttributeValue.setDataType(STRING_DATATYPE);
+			accessAttributeValue.getContent().add("ACCESS");
+			accessMatch.setAttributeValue(accessAttributeValue);
+			AttributeDesignatorType accessAttributeDesignator = new AttributeDesignatorType();
+			URI accessURI = null;
+			try {
+				accessURI = new URI(ACTION_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "MicroServiceConfigPolicy", "Exception creating ACCESS URI");
+			}
+			accessAttributeDesignator.setCategory(CATEGORY_ACTION);
+			accessAttributeDesignator.setDataType(STRING_DATATYPE);
+			accessAttributeDesignator.setAttributeId(new IdentifierImpl(accessURI).stringValue());
+			accessMatch.setAttributeDesignator(accessAttributeDesignator);
+			accessMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			// Creating Config Match in rule Target
+			MatchType configMatch = new MatchType();
+			AttributeValueType configAttributeValue = new AttributeValueType();
+			configAttributeValue.setDataType(STRING_DATATYPE);
+			configAttributeValue.getContent().add("Config");
+			configMatch.setAttributeValue(configAttributeValue);
+			AttributeDesignatorType configAttributeDesignator = new AttributeDesignatorType();
+			URI configURI = null;
+			try {
+				configURI = new URI(RESOURCE_ID);
+			} catch (URISyntaxException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + e.getStackTrace());
+				PolicyLogger.error(MessageCodes.ERROR_DATA_ISSUE, e, "MicroServiceConfigPolicy", "Exception creating Config URI");
+			}
+			configAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			configAttributeDesignator.setDataType(STRING_DATATYPE);
+			configAttributeDesignator.setAttributeId(new IdentifierImpl(configURI).stringValue());
+			configMatch.setAttributeDesignator(configAttributeDesignator);
+			configMatch.setMatchId(FUNCTION_STRING_EQUAL_IGNORE);
+
+			allOfInRule.getMatch().add(accessMatch);
+			allOfInRule.getMatch().add(configMatch);
+
+			AnyOfType anyOfInRule = new AnyOfType();
+			anyOfInRule.getAllOf().add(allOfInRule);
+
+			TargetType targetInRule = new TargetType();
+			targetInRule.getAnyOf().add(anyOfInRule);
+
+			rule.setTarget(targetInRule);
+			rule.setAdviceExpressions(getAdviceExpressions(version, policyName));
+
+			configPolicy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
+			policyAdapter.setPolicyData(configPolicy);
+
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+			PolicyLogger.error("Unsupported data object." + policyAdapter.getData().getClass().getCanonicalName());
+		}
+		setPreparedToSave(true);
+		return true;
+	}
+	
+	// Data required for Advice part is setting here.
+	private AdviceExpressionsType getAdviceExpressions(int version, String fileName) {
+		AdviceExpressionsType advices = new AdviceExpressionsType();
+		AdviceExpressionType advice = new AdviceExpressionType();
+		advice.setAdviceId("MSID");
+		advice.setAppliesTo(EffectType.PERMIT);
+		// For Configuration
+		AttributeAssignmentExpressionType assignment1 = new AttributeAssignmentExpressionType();
+		assignment1.setAttributeId("type");
+		assignment1.setCategory(CATEGORY_RESOURCE);
+		assignment1.setIssuer("");
+
+		AttributeValueType configNameAttributeValue = new AttributeValueType();
+		configNameAttributeValue.setDataType(STRING_DATATYPE);
+		configNameAttributeValue.getContent().add("Configuration");
+		assignment1.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment1);
+		final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+		// For Config file Url if configurations are provided.
+		AttributeAssignmentExpressionType assignment2 = new AttributeAssignmentExpressionType();
+		assignment2.setAttributeId("URLID");
+		assignment2.setCategory(CATEGORY_RESOURCE);
+		assignment2.setIssuer("");
+
+		AttributeValueType AttributeValue = new AttributeValueType();
+		AttributeValue.setDataType(URI_DATATYPE);
+		String policyDir1 = policyAdapter.getParentPath().toString();
+		int startIndex1 = policyDir1.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir1 = policyDir1.substring(startIndex1, policyDir1.length());
+		logger.info("print the main domain value"+policyDir1);
+		String path = policyDir1.replace('\\', '.');
+		if(path.contains("/")){
+			path = policyDir1.replace('/', '.');
+			logger.info("print the path:" +path);
+		}
+		String content = CONFIG_URL +"/Config/" + path + "." + getConfigFile(policyName);
+		System.out.println("URL value :" + content);
+		AttributeValue.getContent().add(content);
+		assignment2.setExpression(new ObjectFactory().createAttributeValue(AttributeValue));
+
+		advice.getAttributeAssignmentExpression().add(assignment2);
+		AttributeAssignmentExpressionType assignment3 = new AttributeAssignmentExpressionType();
+		assignment3.setAttributeId("PolicyName");
+		assignment3.setCategory(CATEGORY_RESOURCE);
+		assignment3.setIssuer("");
+
+		AttributeValueType attributeValue3 = new AttributeValueType();
+		attributeValue3.setDataType(STRING_DATATYPE);
+		String policyDir = policyAdapter.getParentPath().toString();
+		int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+		policyDir = policyDir.substring(startIndex, policyDir.length());
+		StringTokenizer tokenizer = null;
+		StringBuffer buffer = new StringBuffer();
+		if (policyDir.contains("\\")) {
+			tokenizer = new StringTokenizer(policyDir, "\\");
+		} else {
+			tokenizer = new StringTokenizer(policyDir, "/");
+		}
+		if (tokenizer != null) {
+			while (tokenizer.hasMoreElements()) {
+				String value = tokenizer.nextToken();
+				buffer.append(value);
+				buffer.append(".");
+			}
+		}
+		fileName = FilenameUtils.removeExtension(fileName);
+		fileName = buffer.toString() + fileName + ".xml";
+		String name = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
+		if ((name == null) || (name.equals(""))) {
+			name = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
+		}
+		attributeValue3.getContent().add(name);
+		assignment3.setExpression(new ObjectFactory().createAttributeValue(attributeValue3));
+		advice.getAttributeAssignmentExpression().add(assignment3);
+
+		AttributeAssignmentExpressionType assignment4 = new AttributeAssignmentExpressionType();
+		assignment4.setAttributeId("VersionNumber");
+		assignment4.setCategory(CATEGORY_RESOURCE);
+		assignment4.setIssuer("");
+
+		AttributeValueType configNameAttributeValue4 = new AttributeValueType();
+		configNameAttributeValue4.setDataType(STRING_DATATYPE);
+		configNameAttributeValue4.getContent().add(Integer.toString(version));
+		assignment4.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue4));
+
+		advice.getAttributeAssignmentExpression().add(assignment4);
+
+		AttributeAssignmentExpressionType assignment5 = new AttributeAssignmentExpressionType();
+		assignment5.setAttributeId("matching:" + this.ECOMPID);
+		assignment5.setCategory(CATEGORY_RESOURCE);
+		assignment5.setIssuer("");
+
+		AttributeValueType configNameAttributeValue5 = new AttributeValueType();
+		configNameAttributeValue5.setDataType(STRING_DATATYPE);
+		configNameAttributeValue5.getContent().add(policyAdapter.getEcompName());
+		assignment5.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue5));
+
+		advice.getAttributeAssignmentExpression().add(assignment5);
+
+		AttributeAssignmentExpressionType assignment6 = new AttributeAssignmentExpressionType();
+		assignment6.setAttributeId("matching:" + this.CONFIGID);
+		assignment6.setCategory(CATEGORY_RESOURCE);
+		assignment6.setIssuer("");
+
+		AttributeValueType configNameAttributeValue6 = new AttributeValueType();
+		configNameAttributeValue6.setDataType(STRING_DATATYPE);
+		configNameAttributeValue6.getContent().add(policyAdapter.getConfigName());
+		assignment6.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue6));
+
+		advice.getAttributeAssignmentExpression().add(assignment6);
+		AttributeAssignmentExpressionType assignment7 = new AttributeAssignmentExpressionType();
+		assignment7.setAttributeId("matching:service");
+		assignment7.setCategory(CATEGORY_RESOURCE);
+		assignment7.setIssuer("");
+
+		AttributeValueType configNameAttributeValue7 = new AttributeValueType();
+		configNameAttributeValue7.setDataType(STRING_DATATYPE);
+		configNameAttributeValue7.getContent().add(policyAdapter.getServiceType());
+		assignment7.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue7));
+
+		advice.getAttributeAssignmentExpression().add(assignment7);
+		
+		AttributeAssignmentExpressionType assignment8 = new AttributeAssignmentExpressionType();
+		assignment8.setAttributeId("matching:uuid");
+		assignment8.setCategory(CATEGORY_RESOURCE);
+		assignment8.setIssuer("");
+
+		AttributeValueType configNameAttributeValue8 = new AttributeValueType();
+		configNameAttributeValue8.setDataType(STRING_DATATYPE);
+		configNameAttributeValue8.getContent().add(policyAdapter.getUuid());
+		assignment8.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue8));
+
+		advice.getAttributeAssignmentExpression().add(assignment8);
+        
+		AttributeAssignmentExpressionType assignment9 = new AttributeAssignmentExpressionType();
+		assignment9.setAttributeId("matching:Location");
+		assignment9.setCategory(CATEGORY_RESOURCE);
+		assignment9.setIssuer("");
+
+		AttributeValueType configNameAttributeValue9 = new AttributeValueType();
+		configNameAttributeValue9.setDataType(STRING_DATATYPE);
+		configNameAttributeValue9.getContent().add(policyAdapter.getLocation());
+		assignment9.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue9));
+
+		advice.getAttributeAssignmentExpression().add(assignment9);
+		
+		AttributeAssignmentExpressionType assignment10 = new AttributeAssignmentExpressionType();
+		assignment10.setAttributeId("Priority");
+		assignment10.setCategory(CATEGORY_RESOURCE);
+		assignment10.setIssuer("");
+
+		AttributeValueType configNameAttributeValue10 = new AttributeValueType();
+		configNameAttributeValue10.setDataType(STRING_DATATYPE);
+		configNameAttributeValue10.getContent().add(policyAdapter.getPriority());
+		assignment10.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue10));
+
+		advice.getAttributeAssignmentExpression().add(assignment10);
+		
+		//Risk Attributes
+		AttributeAssignmentExpressionType assignment11 = new AttributeAssignmentExpressionType();
+		assignment11.setAttributeId("RiskType");
+		assignment11.setCategory(CATEGORY_RESOURCE);
+		assignment11.setIssuer("");
+
+		AttributeValueType configNameAttributeValue11 = new AttributeValueType();
+		configNameAttributeValue11.setDataType(STRING_DATATYPE);
+		configNameAttributeValue11.getContent().add(policyAdapter.getRiskType());
+		assignment11.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue11));
+
+		advice.getAttributeAssignmentExpression().add(assignment11);
+		
+		AttributeAssignmentExpressionType assignment12 = new AttributeAssignmentExpressionType();
+		assignment12.setAttributeId("RiskLevel");
+		assignment12.setCategory(CATEGORY_RESOURCE);
+		assignment12.setIssuer("");
+
+		AttributeValueType configNameAttributeValue12 = new AttributeValueType();
+		configNameAttributeValue12.setDataType(STRING_DATATYPE);
+		configNameAttributeValue12.getContent().add(policyAdapter.getRiskLevel());
+		assignment12.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue12));
+
+		advice.getAttributeAssignmentExpression().add(assignment12);	
+
+		AttributeAssignmentExpressionType assignment13 = new AttributeAssignmentExpressionType();
+		assignment13.setAttributeId("guard");
+		assignment13.setCategory(CATEGORY_RESOURCE);
+		assignment13.setIssuer("");
+
+		AttributeValueType configNameAttributeValue13 = new AttributeValueType();
+		configNameAttributeValue13.setDataType(STRING_DATATYPE);
+		configNameAttributeValue13.getContent().add(policyAdapter.getRiskLevel());
+		assignment13.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue13));
+
+		advice.getAttributeAssignmentExpression().add(assignment13);
+		
+		AttributeAssignmentExpressionType assignment14 = new AttributeAssignmentExpressionType();
+		assignment14.setAttributeId("TTLDate");
+		assignment14.setCategory(CATEGORY_RESOURCE);
+		assignment14.setIssuer("");
+
+		AttributeValueType configNameAttributeValue14 = new AttributeValueType();
+		configNameAttributeValue14.setDataType(STRING_DATATYPE);
+		configNameAttributeValue14.getContent().add(policyAdapter.getTtlDate());
+		assignment14.setExpression(new ObjectFactory().createAttributeValue(configNameAttributeValue14));
+
+		advice.getAttributeAssignmentExpression().add(assignment14);
+
+		advices.getAdviceExpression().add(advice);
+		return advices;
+	}
+
+	@Override
+	public Object getCorrectPolicyDataObject() {
+		return policyAdapter.getPolicyData();
+	}	
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java
new file mode 100644
index 0000000..09c90de
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/Policy.java
@@ -0,0 +1,455 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.json.Json;
+import javax.json.JsonReader;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.std.IdentifierImpl;
+import org.openecomp.policy.xacml.util.XACMLPolicyWriter;
+import com.att.research.xacml.util.XACMLProperties;
+import com.att.research.xacmlatt.pdp.policy.PolicyDef;
+import com.att.research.xacmlatt.pdp.policy.dom.DOMPolicyDef;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public abstract class Policy {
+
+	/**
+	 * Common Fields
+	 */
+	public static final String GET_INT_TYPE = "Integer";
+	public static final String GET_STRING_TYPE = "String";
+
+	public static final String ECOMPID = "ECOMPName";
+	public static final String CONFIGID = "ConfigName";
+	public static final String CLOSEDLOOPID = "ServiceType";
+	
+	public static final String CONFIG_POLICY = "Config";
+	public static final String ACTION_POLICY = "Action";
+	public static final String DECISION_POLICY = "Decision";
+
+	protected String policyName = null;
+	private static final Logger logger = FlexLogger.getLogger(Policy.class);
+	
+	boolean isValidForm = true;
+	
+	private Path finalPolicyPath = null;
+	
+	private boolean preparedToSave = false;
+	
+	private boolean policyExists = false;
+	
+	public Path getFinalPolicyPath() {
+		return finalPolicyPath;
+	}
+
+	public void setFinalPolicyPath(Path finalPolicyPath) {
+		this.finalPolicyPath = finalPolicyPath;
+	}
+
+		// Constants Used in XML Creation
+		public static final String CATEGORY_RECIPIENT_SUBJECT = "urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject";
+		public static final String CATEGORY_RESOURCE = "urn:oasis:names:tc:xacml:3.0:attribute-category:resource";
+		public static final String CATEGORY_ACTION = "urn:oasis:names:tc:xacml:3.0:attribute-category:action";
+		public static final String CATEGORY_ACCESS_SUBJECT = "urn:oasis:names:tc:xacml:1.0:subject-category:access-subject";
+		public static final String ACTION_ID = "urn:oasis:names:tc:xacml:1.0:action:action-id";
+		public static final String SUBJECT_ID = "urn:oasis:names:tc:xacml:1.0:subject:subject-id";
+		public static final String RESOURCE_ID = "urn:oasis:names:tc:xacml:1.0:resource:resource-id";
+		public static final String FUNTION_INTEGER_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only";
+		public static final String FUNCTION_STRING_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:string-one-and-only";
+		public static final String FUNCTION_BOOLEAN_ONE_AND_ONLY = "urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only";
+		public static final String FUNCTION_STRING_EQUAL = "urn:oasis:names:tc:xacml:1.0:function:string-equal";
+		public static final String FUNCTION_STRING_REGEX_MATCH = "org.openecomp.function.regex-match";
+		public static final String FUNCTION_STRING_EQUAL_IGNORE = "urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case";
+		public static final String INTEGER_DATATYPE = "http://www.w3.org/2001/XMLSchema#integer";
+		public static final String BOOLEAN_DATATYPE = "http://www.w3.org/2001/XMLSchema#boolean";
+		public static final String STRING_DATATYPE = "http://www.w3.org/2001/XMLSchema#string";
+		public static final String URI_DATATYPE = "http://www.w3.org/2001/XMLSchema#anyURI";
+		public static final String RULE_VARIABLE = "var:";
+		public static final String EMPTY_STRING = "";
+		private static final String String = null;
+		
+		public static String CONFIG_HOME = null;
+		public static String ACTION_HOME = null;
+		public static String CONFIG_URL = null;
+		
+		protected Map<String, String> performer = new HashMap<String, String>();
+		
+		private static String actionHome = null;
+		private static String configHome = null;
+
+		public PolicyRestAdapter policyAdapter = null;
+		String ruleID = "";
+		
+		public Policy() {
+			CONFIG_HOME = getConfigHome();
+			ACTION_HOME = getActionHome();
+			CONFIG_URL = "$URL";
+			performer.put("PDP", "PDPAction");
+			performer.put("PEP", "PEPAction");
+		}
+
+		//Each policy type seems to either use policyData or data field policy adapter when
+		//getting the xml to save the policy. Instead of keep this hardcoded in the save method,
+		//this method makes it usable outside.
+		/**
+		 * Return the data field of the PolicyAdapter that will be used when saving this policy
+		 * with the savePolicies method.
+		 * @return Either the PolicyAdapter.getData() or PolicyAdapter.getPolicyData()
+		 */
+		public abstract Object getCorrectPolicyDataObject();
+		public abstract Map<String, String>  savePolicies() throws Exception;
+		
+		//This is the method for preparing the policy for saving.  We have broken it out
+		//separately because the fully configured policy is used for multiple things
+		public abstract boolean prepareToSave() throws Exception;
+
+		
+		// create match for ecomp and config name
+		protected MatchType createMatch(String key, String value) {
+			MatchType match = new MatchType();
+
+			AttributeValueType attributeValue = new AttributeValueType();
+			attributeValue.setDataType(STRING_DATATYPE);
+			attributeValue.getContent().add(value);
+			match.setAttributeValue(attributeValue);
+			AttributeDesignatorType attributeDesignator = new AttributeDesignatorType();
+			URI uri = null;
+			try {
+				uri = new URI(key);
+			} catch (URISyntaxException e) {
+				e.printStackTrace();
+			}
+			attributeDesignator.setCategory(CATEGORY_ACCESS_SUBJECT);
+			attributeDesignator.setDataType(STRING_DATATYPE);
+			attributeDesignator.setAttributeId(new IdentifierImpl(uri).stringValue());
+			match.setAttributeDesignator(attributeDesignator);
+			match.setMatchId(FUNCTION_STRING_REGEX_MATCH);
+			return match;
+		}
+		
+		// Creating the match for dynamically added components.
+		protected MatchType createDynamicMatch(String key, String value) {
+			MatchType dynamicMatch = new MatchType();
+			AttributeValueType dynamicAttributeValue = new AttributeValueType();
+			//Attribute attribute = findAttributeByAttributeId(key);
+			String dataType = null;
+	//		if (value.matches("[0-9]+")) {
+	//			dataType = INTEGER_DATATYPE;
+	//		} else {
+	//			dataType = STRING_DATATYPE;
+	//		}
+			dataType = STRING_DATATYPE;
+			dynamicAttributeValue.setDataType(dataType);
+			dynamicAttributeValue.getContent().add(value);
+			dynamicMatch.setAttributeValue(dynamicAttributeValue);
+
+			AttributeDesignatorType dynamicAttributeDesignator = new AttributeDesignatorType();
+
+			URI dynamicURI = null;
+			try {
+				dynamicURI = new URI(key);
+			} catch (URISyntaxException e) {
+				e.printStackTrace();// log msg
+			}
+			dynamicAttributeDesignator.setCategory(CATEGORY_RESOURCE);
+			dynamicAttributeDesignator.setDataType(dataType);
+			dynamicAttributeDesignator.setAttributeId(new IdentifierImpl(dynamicURI).stringValue());
+			dynamicMatch.setAttributeDesignator(dynamicAttributeDesignator);
+			dynamicMatch.setMatchId(FUNCTION_STRING_REGEX_MATCH);
+
+			return dynamicMatch;
+		}
+
+		//validation for numeric
+		protected boolean isNumeric(String str)
+		{
+			for (char c : str.toCharArray())
+			{
+				if (!Character.isDigit(c)) return false;
+			}
+			return true;
+		}
+		
+		// Validation for json.
+		protected static boolean isJSONValid(String data) {
+			try {
+				new JSONObject(data);
+				InputStream stream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
+				JsonReader jsonReader = Json.createReader(stream);
+				System.out.println("Json Value is: " + jsonReader.read().toString() );
+			} catch (Exception e) {
+				return false;
+			}
+			return true;
+		}
+		
+		//  the Policy Name as Unique One throws error
+		protected Path getNextFilename(Path parent, String policyType, String polcyFileName, Integer version) {
+			policyType = FilenameUtils.removeExtension(policyType);
+			polcyFileName = FilenameUtils.removeExtension(polcyFileName);
+			Path newFile = null;
+			String policyDir = EMPTY_STRING;
+			String absolutePath = parent.toString();
+			if (absolutePath != null && !absolutePath.equals(EMPTY_STRING)) {
+				policyDir = absolutePath.substring(absolutePath.lastIndexOf("\\") + 1, absolutePath.length());
+				if (policyDir == null || policyDir.equals(EMPTY_STRING)) {
+					policyDir = absolutePath.substring(absolutePath.lastIndexOf("/") + 1, absolutePath.length());
+				}
+			}
+
+			String fileName = "default";
+			if (policyDir != null && !policyDir.equals(EMPTY_STRING)) {
+				fileName = policyType + "_" + String.format(polcyFileName) + "." + version + ".xml";
+			} 
+			if (fileName != null) {
+				newFile = Paths.get(parent.toString(), fileName);
+			}
+			if (Files.notExists(newFile)) {
+				return newFile;
+			}
+			return null;
+		}
+		
+		protected Path getNextLoopFilename(Path parentPath, String policyType,
+				String policyConfigType, String policyFileName, Integer version) {
+			policyType = FilenameUtils.removeExtension(policyType);
+			policyConfigType = FilenameUtils.removeExtension(policyConfigType);
+			policyFileName = FilenameUtils.removeExtension(policyFileName);
+			Path newFile = null;
+			String policyDir = EMPTY_STRING;
+			String absolutePath = parentPath.toString();
+			if (absolutePath != null && !absolutePath.equals(EMPTY_STRING)) {
+				policyDir = absolutePath.substring(absolutePath.lastIndexOf("\\") + 1, absolutePath.length());
+				if (policyDir == null || policyDir.equals(EMPTY_STRING)) {
+					policyDir = absolutePath.substring(absolutePath.lastIndexOf("/") + 1, absolutePath.length());
+				}
+			}
+
+			String fileName = "default";
+			if (policyDir != null && !policyDir.equals(EMPTY_STRING)) {
+				if(policyConfigType.equals("ClosedLoop_PM")){
+					fileName = policyType + "_" + "PM" + "_" +java.lang.String.format(policyFileName) + "." +version +".xml";
+				}else if(policyConfigType.equals("ClosedLoop_Fault")){
+					fileName = policyType + "_" + "Fault" + "_" +java.lang.String.format(policyFileName) +  "." + version + ".xml";
+				}else if(policyConfigType.equals("ClosedLoop_Fault")){
+					fileName = policyType + "_" + "Fault" + "_" +java.lang.String.format(policyFileName) +  "." + version + ".xml";
+				}else if(policyConfigType.equals("DCAE Micro Service")){
+					fileName = policyType + "_" + "MS" + "_" + java.lang.String.format(policyFileName) + "." + version + ".xml";
+				}
+			} 
+			if (fileName != null) {
+				newFile = Paths.get(parentPath.toString(), fileName);
+			}
+			if (Files.notExists(newFile)) {
+				return newFile;
+			}
+			return null;
+		}
+		
+		
+		//create policy once all the validations are completed
+		protected Map<String, String> createPolicy(final Path policyPath, final Object policyData) {
+			Map<String, String> success = new HashMap<String, String>(); 
+			//
+			// Is the root a PolicySet or Policy?
+			//
+			
+			if (policyData instanceof PolicyType) {
+				//
+				// Write it out
+				//
+				//Does not need to be XACMLPolicyWriterWithPapNotify since it is already in the PAP
+				//and this transaction is intercepted up stream.
+				InputStream inputStream = XACMLPolicyWriter.getXmlAsInputStream((PolicyType) policyData);
+				try {
+					PolicyDef policyDef = DOMPolicyDef.load(inputStream);
+					if (policyDef != null) {
+						//This is does not need to be XACMLPolicyWriterWithPapNotification since it is already in the PAP
+						//and the transaction was intercepted up stream
+						finalPolicyPath = XACMLPolicyWriter.writePolicyFile(policyPath, (PolicyType) policyData);
+						this.setFinalPolicyPath(finalPolicyPath);
+					} else{
+						success.put("validation", "PolicyDef Validation Failed");
+					}
+				} catch (Exception e) {
+					success.put("error", "Validation Failed");
+				}
+				
+			} else {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Unknown data type sent back.");
+				PolicyLogger.error("Unknown data type sent back.");
+				return success;
+			}
+			//
+			// Did it get written?
+			//
+			if (finalPolicyPath == null || !Files.exists(finalPolicyPath)) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Failed to write policy file.");
+				PolicyLogger.error("Failed to write policy file.");
+				return success;
+			}
+			try {
+				success.put("success", "success");
+			} finally {
+				// vaadin framework will handle exception.
+			}
+			return success;
+		}
+		
+		public static String getConfigHome(){
+			try {
+				loadWebapps();
+			} catch (Exception e) {
+				return null;
+			}
+			return configHome;
+		}
+		
+		public static String getActionHome(){
+			try {
+				loadWebapps();
+			} catch (Exception e) {
+				return null;
+			}
+			return actionHome;
+		}
+		
+		private static void loadWebapps() throws Exception{
+			if(actionHome == null || configHome == null){
+				Path webappsPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS));
+				//Sanity Check
+				if (webappsPath == null) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+					PolicyLogger.error("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+					throw new Exception("Invalid Webapps Path Location property : " + XACMLRestProperties.PROP_PAP_WEBAPPS);
+				}
+				Path webappsPathConfig;
+				Path webappsPathAction;
+				if(webappsPath.toString().contains("\\"))
+				{
+					webappsPathConfig = Paths.get(webappsPath.toString()+"\\Config");
+					webappsPathAction = Paths.get(webappsPath.toString()+"\\Action");
+				}
+				else
+				{
+					webappsPathConfig = Paths.get(webappsPath.toString()+"/Config");
+					webappsPathAction = Paths.get(webappsPath.toString()+"/Action");
+				}
+				if (Files.notExists(webappsPathConfig)) 
+				{
+					try {
+						Files.createDirectories(webappsPathConfig);
+					} catch (IOException e) {
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to create config directory: "
+								//+ webappsPathConfig.toAbsolutePath().toString(), e);
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "Policy", "Failed to create config directory");
+					}
+				}
+				if (Files.notExists(webappsPathAction)) 
+				{
+					try {
+						Files.createDirectories(webappsPathAction);
+					} catch (IOException e) {
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Failed to create config directory: "
+								//+ webappsPathAction.toAbsolutePath().toString(), e);
+						PolicyLogger.error(MessageCodes.ERROR_PROCESS_FLOW, e, "Policy", "Failed to create config directory");
+					}
+				}
+				actionHome = webappsPathAction.toString();
+				configHome = webappsPathConfig.toString();
+			}
+		}
+		
+		protected String getParentPathSubScopeDir() {
+
+			final Path gitPath = Paths.get(policyAdapter.getUserGitPath().toString());
+			String policyDir = policyAdapter.getParentPath().toString();
+			int startIndex = policyDir.indexOf(gitPath.toString()) + gitPath.toString().length() + 1;
+			policyDir = policyDir.substring(startIndex, policyDir.length());
+			
+			return policyDir;
+		}
+
+
+		public boolean validateConfigForm() {
+			// TODO Auto-generated method stub
+			return true;
+		}
+
+		/**
+		 * @return the preparedToSave
+		 */
+		public boolean isPreparedToSave() {
+			return preparedToSave;
+		}
+
+		/**
+		 * @param preparedToSave the preparedToSave to set
+		 */
+		protected void setPreparedToSave(boolean preparedToSave) {
+			this.preparedToSave = preparedToSave;
+		}
+
+		public boolean isPolicyExists() {
+			return policyExists;
+		}
+
+		public void setPolicyExists(boolean policyExists) {
+			this.policyExists = policyExists;
+		}
+		
+		
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java
new file mode 100644
index 0000000..bdd7534
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDao.java
@@ -0,0 +1,3936 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.FileSystems;
+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.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+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;
+import javax.persistence.PersistenceException;
+import javax.persistence.Query;
+import javax.persistence.RollbackException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.ConfigurationDataEntity;
+import org.openecomp.policy.rest.jpa.DatabaseLockEntity;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.rest.jpa.PolicyDBDaoEntity;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.util.Webapps;
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import org.xml.sax.InputSource;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import org.openecomp.policy.xacml.api.pap.EcompPDP;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.api.pap.PAPPolicyEngine;
+
+import com.att.research.xacml.api.pap.PAPEngine;
+import com.att.research.xacml.api.pap.PAPException;
+import com.att.research.xacml.api.pap.PDP;
+//import com.att.research.xacml.api.pap.PDPGroup;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import org.openecomp.policy.xacml.util.XACMLPolicyScanner;
+import org.openecomp.policy.xacml.util.XACMLPolicyWriter;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.w3c.dom.Document;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class PolicyDBDao {
+	private static final Logger logger	= FlexLogger.getLogger(PolicyDBDao.class);		
+	private List<?> otherServers;
+	private EntityManagerFactory emf;
+	private static PolicyDBDao currentInstance = null;
+	private PAPPolicyEngine papEngine;
+	
+	public static final String JSON_CONFIG = "JSON";
+	public static final String XML_CONFIG = "XML";
+	public static final String PROPERTIES_CONFIG = "PROPERTIES";
+	public static final String OTHER_CONFIG = "OTHER";
+	public static final String AUDIT_USER = "audit";
+	
+	/**
+	 * Get an instance of a PolicyDBDao. It creates one if it does not exist.
+	 * Only one instance is allowed to be created per server.
+	 * @param emf The EntityFactoryManager to be used for database connections
+	 * @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{
+		logger.debug("getPolicyDBDaoInstance(EntityManagerFactory emf) as getPolicyDBDaoInstance("+emf+") called");
+		if(currentInstance == null){
+			if(emf != null){
+				currentInstance = new PolicyDBDao(emf);
+				return currentInstance;
+			}
+			throw new IllegalStateException("The EntityManagerFactory is Null");
+		}
+		return currentInstance;
+	}
+	
+	/**
+	 * Gets the current instance of 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{
+		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;
+	}
+	private PolicyDBDao(EntityManagerFactory emf){
+		logger.debug("PolicyDBDao(EntityManagerFactory emf) as PolicyDBDao("+emf+") called");
+		this.emf = emf;
+		
+		//not needed in this release
+		if(!register()){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("This server's PolicyDBDao instance could not be registered and may not reveive updates");
+			PolicyLogger.error("This server's PolicyDBDao instance could not be registered and may not reveive updates");
+		}
+		
+		otherServers = getRemotePolicyDBDaoList();
+		if(logger.isDebugEnabled()){
+			logger.debug("Number of remote PolicyDBDao instances: "+otherServers.size());
+		}
+		if(otherServers.size() < 1){
+			logger.warn("List of PolicyDBDao servers is empty or could not be retrieved");
+		}
+		//otherServers = new LinkedList();		
+		//otherServers.add((Object)"http://localhost:8071/pap/");		
+	}
+	
+	//not static because we are going to be using the instance's emf
+	//waitTime in ms to wait for lock, or -1 to wait forever (no)
+	private void startTransactionSynced(EntityManager entityMgr,int waitTime){
+		logger.debug("\n\nstartTransactionSynced(EntityManager entityMgr,int waitTime) as "
+				+ "\n   startTransactionSynced("+entityMgr+","+waitTime+") called\n\n");
+		DatabaseLockEntity lock = null;		
+		
+		entityMgr.setProperty("javax.persistence.query.timeout", waitTime);
+		entityMgr.getTransaction().begin();
+		
+			if(logger.isDebugEnabled()){
+				Map<String,Object> properties = entityMgr.getProperties();
+				logger.debug("\n\nstartTransactionSynced():"
+						+ "\n   entityManager.getProperties() = " + properties 
+						+ "\n\n");
+			}
+			try{
+				if(logger.isDebugEnabled()){
+					logger.debug("\n\nstartTransactionSynced():"
+							+ "\n   ATTEMPT to get the DB lock"
+							+ "\n\n");
+				}
+				lock = entityMgr.find(DatabaseLockEntity.class, 1, LockModeType.PESSIMISTIC_WRITE);
+				if(logger.isDebugEnabled()){
+					logger.debug("\n\nstartTransactionSynced():"
+							+ "\n   GOT the DB lock"
+							+ "\n\n");
+				}
+			} catch(Exception e){
+				System.out.println("Could not get lock entity");
+				e.printStackTrace();
+			}
+		if(lock == null){
+			throw new IllegalStateException("The lock row does not exist in the table. Please create a primary key with value = 1.");	
+		}
+
+	}
+	/**
+	 * Gets the list of other registered PolicyDBDaos from the database
+	 * @return List (type PolicyDBDaoEntity) of other PolicyDBDaos
+	 */
+	private List<?> getRemotePolicyDBDaoList(){
+		logger.debug("getRemotePolicyDBDaoList() as getRemotePolicyDBDaoList() called");
+		List<?> policyDBDaoEntityList = new LinkedList<Object>();
+		EntityManager em = emf.createEntityManager();
+		startTransactionSynced(em, 1000);
+		try{						
+			Query getPolicyDBDaoEntityQuery = em.createNamedQuery("PolicyDBDaoEntity.findAll");			
+			policyDBDaoEntityList = getPolicyDBDaoEntityQuery.getResultList();
+			
+		} catch(Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Caught Exception on: getPolicyDBDaoEntityQuery.getResultList()",e);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception querying for other registered PolicyDBDaos");
+			logger.warn("List of remote PolicyDBDaos will be empty");
+		}
+		try{
+		em.getTransaction().commit();
+		} catch(Exception e){
+			try{
+				em.getTransaction().rollback();
+			} catch(Exception e2){
+				
+			}
+		}
+		em.close();
+		return policyDBDaoEntityList;
+	}
+	
+	public PolicyDBDaoTransaction getNewTransaction(){
+		logger.debug("getNewTransaction() as getNewTransaction() called");
+		return (PolicyDBDaoTransaction)(new PolicyDBDaoTransactionInstance());
+	}
+	
+	/*
+	 * Because the normal transactions are not used in audits, we can use the same transaction
+	 * mechanism to get a transaction and obtain the emlock and the DB lock.  We just need to
+	 * provide different transaction timeout values in ms because the audit will run longer
+	 * than normal transactions.
+	 */
+	public PolicyDBDaoTransaction getNewAuditTransaction(){
+		logger.debug("getNewAuditTransaction() as getNewAuditTransaction() called");
+		//Use the standard transaction wait time in ms
+		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));
+	}
+	
+	
+	/**
+	 * Checks if two strings are equal. Null strings ARE allowed.
+	 * @param one A String or null to compare
+	 * @param two A String or null to compare
+	 */
+	private static boolean stringEquals(String one, String two){
+		logger.debug("stringEquals(String one, String two) as stringEquals("+one+", "+two+") called");
+		if(one == null && two == null){
+			return true;
+		}
+		if(one == null || two == null){
+			return false;
+		}
+		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.openecomp)
+	 */
+	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
+	 */
+	private String[] getPapUrlUserPass(){
+		logger.debug("getPapUrl() as getPapUrl() called");
+		String url = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
+		if(url == null){
+			return null;
+		}
+		return splitPapUrlUserPass(url);
+
+
+	}
+	private String[] splitPapUrlUserPass(String url){
+		String[] urlUserPass = new String[3];
+		String[] commaSplit = url.split(",");
+		urlUserPass[0] = commaSplit[0];
+		if(commaSplit.length > 2){
+			urlUserPass[1] = commaSplit[1];
+			urlUserPass[2] = commaSplit[2];
+		}
+		if(urlUserPass[1] == null || urlUserPass[1].equals("")){
+			String usernamePropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+			if(usernamePropertyValue != null){
+				urlUserPass[1] = usernamePropertyValue;
+			}
+		}
+		if(urlUserPass[2] == null || urlUserPass[2].equals("")){
+			String passwordPropertyValue = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+			if(passwordPropertyValue != null){
+				urlUserPass[2] = passwordPropertyValue;
+			}
+		}
+		//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?
+	 */
+	private boolean register(){
+		logger.debug("register() as register() called");
+		String[] url = getPapUrlUserPass();
+		EntityManager em = emf.createEntityManager();
+		try{
+			startTransactionSynced(em, 1000);
+		} catch(IllegalStateException e){
+			logger.debug ("\nPolicyDBDao.register() caught an IllegalStateException: \n" +e + "\n");
+			DatabaseLockEntity lock;
+			lock = em.find(DatabaseLockEntity.class, 1);
+			if(lock==null){				
+				lock = new DatabaseLockEntity();
+				em.persist(lock);
+				lock.setKey(1);
+				try{
+					em.flush();
+					em.getTransaction().commit();
+					em.close();					
+				} catch(Exception e2){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("COULD NOT CREATE DATABASELOCK ROW.  WILL TRY ONE MORE TIME \n\n Exception: \n" + e2);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "COULD NOT CREATE DATABASELOCK ROW.  WILL TRY ONE MORE TIME");
+					e2.printStackTrace();
+				}
+				em = null;
+				em = emf.createEntityManager();
+				try{
+					startTransactionSynced(em, 1000);
+				} catch(Exception e3){
+					//still not working
+					String msg = "DATABASE LOCKING NOT WORKING. CONCURRENCY CONTROL NOT WORKING";
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(msg);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e3, "PolicyDBDao", msg);
+					throw new IllegalStateException("msg" + "\n" + e3);
+				}
+			}
+		}
+		logger.debug("\nPolicyDBDao.register. Database locking and concurrency control is initialized\n");
+		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]);
+		if(foundPolicyDBDaoEntity == null){
+			//em.getTransaction().begin();
+			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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Could not encrypt PAP password",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not encrypt PAP password");
+			}
+			/*
+			try{
+				em.getTransaction().commit();
+			} catch(RollbackException e){
+				logger.error("Caught RollbackException during PolicyDBDao Registration on: em.getTransaction().commit()",e);
+				em.close();
+				return false;
+			} catch(Exception e2){
+				logger.error("Caught Exception during PolicyDBDao Registration on: em.getTransaction().commit()",e2);
+				em.close();
+				return false;
+			}
+			*/
+			try{
+				em.getTransaction().commit();
+				} catch(Exception e){
+					try{
+						em.getTransaction().rollback();
+					} catch(Exception e2){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Could not add new PolicyDBDao to the database",e);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not add new PolicyDBDao to the database");
+					}
+				}
+		} else {
+			//em.getTransaction().begin();
+			//just want to update in order to change modified date
+			String encryptedPassword = null;
+			try{
+			encryptedPassword = encryptPassword(url[2]);
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Could not encrypt PAP password",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);
+			}
+			foundPolicyDBDaoEntity.preUpdate();
+			try{
+				em.getTransaction().commit();
+				} catch(Exception e){
+					try{
+						em.getTransaction().rollback();
+					} catch(Exception e2){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Could not update PolicyDBDao in the database",e);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Could not update PolicyDBDao in the database");
+					}
+				}
+			/*
+			try{
+				em.getTransaction().commit();
+			} catch(RollbackException e){
+				logger.error("Caught RollbackException during PolicyDBDao Registration on: em.getTransaction().commit()",e);
+				em.close();
+				return false;
+			} catch(Exception e2){
+				logger.error("Caught Exception during PolicyDBDao Registration on: em.getTransaction().commit()",e2);
+				em.getTransaction().rollback();
+				return false;
+			}
+			*/
+		}
+		em.close();
+		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<Thread>();
+		
+		//we're going to run notiftions in parellel 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){
+			try {
+				t.join();
+			} catch (Exception e) {
+				logger.warn("Could not join a notifcation thread");
+			}
+		}
+
+		
+	}
+
+	private class NotifyOtherThread implements Runnable {
+		public NotifyOtherThread(Object obj, long entityId, String entityType, String newGroupId){
+			this.obj = obj;
+			this.entityId = entityId;
+			this.entityType = entityType;
+			this.newGroupId = newGroupId;
+		}
+		private Object obj;
+		private long entityId;
+		private String entityType;
+		private String newGroupId;
+		@Override
+		public void run(){
+			//naming of 'o' is for backwards compatibility with the rest of the function
+			PolicyDBDaoEntity dbdEntity = (PolicyDBDaoEntity)obj;
+			String o = dbdEntity.getPolicyDBDaoUrl();
+			String username = dbdEntity.getUsername();
+			String password;
+			try{
+			password = decryptPassword(dbdEntity.getPassword());
+			} catch(Exception e){
+				//if we can't decrypt, might as well try it anyway
+				password = dbdEntity.getPassword();
+			}
+			Base64.Encoder encoder = Base64.getEncoder();			
+			String encoding = encoder.encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));
+			HttpURLConnection connection = null;
+			UUID requestID = UUID.randomUUID();
+			//loggingContext.setRequestID(requestID.toString());
+			//loggingContext.transactionStarted();
+			URL url;
+			try {
+				String papUrl = getPapUrlUserPass()[0];
+				if(papUrl == null){
+					papUrl = "undefined";
+				}
+				logger.debug("We are going to try to notify "+o);
+				//is this our own url?
+				String ourUrl = o;
+				try{
+					ourUrl = splitPapUrlUserPass((String)o)[0];
+				}catch(Exception e){
+					ourUrl = o;
+				}
+				if(o == null){
+					o = "undefined";
+				}
+				if(papUrl.equals(ourUrl)){
+					logger.debug(((String)o)+" is our url, skipping notify");
+					return;
+				}
+				if(newGroupId == null){
+				url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType);
+				} else {
+					url = new URL(((String)o)+"?policydbdaourl="+papUrl+"&entityid="+entityId+"&entitytype="+entityType+"&extradata="+newGroupId);
+				}
+			} catch (MalformedURLException e) {
+				logger.warn("Caught MalformedURLException on: new URL()", e);
+				return;
+			}
+			//
+			// Open up the connection
+			//
+			logger.debug("Connecting with url: "+url);
+			try {
+				connection = (HttpURLConnection)url.openConnection();
+			} catch (Exception e) {
+				logger.warn("Caught exception on: url.openConnection()",e);
+				return;
+			}
+			//
+			// Setup our method and headers
+			//
+	        try {
+				connection.setRequestMethod("PUT");
+			} catch (ProtocolException e) {
+				//why would this error ever occur?
+				logger.warn("Caught ProtocolException on connection.setRequestMethod(\"PUT\");",e);			
+				return;
+			}
+	        connection.setRequestProperty("Authorization", "Basic " + encoding);
+			connection.setRequestProperty("Accept", "text/x-java-properties");
+	        connection.setRequestProperty("Content-Type", "text/x-java-properties");	  	        	        
+	        connection.setRequestProperty("requestID", requestID.toString());
+	        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.");
+	        	readTimeout = 10000;
+	        }
+	        connection.setReadTimeout(readTimeout);
+	        connection.setConnectTimeout(readTimeout);
+	        connection.setUseCaches(false);
+	        //
+	        // Adding this in. It seems the HttpUrlConnection class does NOT
+	        // properly forward our headers for POST re-direction. It does so
+	        // for a GET re-direction.
+	        //
+	        // So we need to handle this ourselves.
+	        //
+	        connection.setInstanceFollowRedirects(false);
+			connection.setDoOutput(true);
+			connection.setDoInput(true);
+	        try {
+				connection.connect();
+			} catch (Exception e) {
+				logger.warn("Caught exception on: connection.connect()",e);
+				return;
+			}
+	        try {
+				if (connection.getResponseCode() == 200) {
+					logger.info("Received response 200 from pap server on notify");
+					//notified = true;
+				} else {
+					logger.warn("connection response code not 200, received: "+connection.getResponseCode());
+				}
+			} catch (Exception e) {
+				logger.warn("Caught Exception on: connection.getResponseCode() ", e);
+			}
+			
+			
+			connection.disconnect();
+		}
+	}
+	
+	private static String getElementFromXMLString(String element, String xml) {
+		InputSource source = new InputSource(new StringReader(xml));
+
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		String description = "";
+		try{
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			Document document = db.parse(source);
+
+			XPathFactory xpathFactory = XPathFactory.newInstance();
+			XPath xpath = xpathFactory.newXPath();
+			
+			if (element.endsWith("/")){
+				element = element.substring(0, element.length() -1);
+			}
+
+			description = xpath.evaluate("/Policy" + element + "/text()", document);		
+		}catch(Exception e){
+			
+		}
+
+
+		System.out.println("description_" + description);
+		return description;
+	}
+	private static String evaluateXPath(String expression, String xml) {
+		InputSource source = new InputSource(new StringReader(xml));
+
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		String description = "";
+		try{
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			Document document = db.parse(source);
+
+			XPathFactory xpathFactory = XPathFactory.newInstance();
+			XPath xpath = xpathFactory.newXPath();
+			
+
+			description = xpath.evaluate(expression, document);		
+		}catch(Exception e){
+			
+		}
+
+
+		System.out.println("description_" + description);
+		return description;
+	}
+	
+	private static String getDescriptionFromXacml(String xacmlData){
+		//FIXME completely untested. Probably not a good idea to use. UPDATE: kind of tested
+		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";
+	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();
+		switch(entityType){	
+		
+		case POLICY_NOTIFICATION:
+			try{
+			handleIncomingPolicyChange(url, entityId,extraData);
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPolicyChange("+url+", "+entityId+", "+extraData+")");
+			}
+			break;
+		case PDP_NOTIFICATION:
+			try{
+			handleIncomingPdpChange(url, entityId, transaction);
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingPdpChange("+url+", "+entityId+", "+transaction+")");
+			}
+			break;
+		case GROUP_NOTIFICATION:
+			try{
+			handleIncomingGroupChange(url, entityId, extraData, transaction, xacmlPapServlet);
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught exception on handleIncomingGroupChange("+url+", "+entityId+", "+extraData+", "+transaction+", "+xacmlPapServlet+")");
+			}
+			break;		
+		}
+		//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{
+				
+		GroupEntity groupRecord = null;
+		long groupIdLong = -1;
+		try{
+			groupIdLong = Long.parseLong(groupId);
+		} catch(NumberFormatException e){
+			throw new IllegalArgumentException("groupId "+groupId+" cannot be parsed into a long");
+		}
+		try{
+				groupRecord = transaction.getGroup(groupIdLong);
+		} catch(Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");",e);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp group record with transaction.getGroup("+groupIdLong+");");
+			throw new PAPException("Could not get local group "+groupIdLong);
+		}
+		if(groupRecord == null){
+			throw new PersistenceException("The group record returned is null");
+		}
+		//compare to local fs
+		//does group folder exist
+		EcompPDPGroup localGroup = null;
+		try {
+			localGroup = papEngine.getGroup(groupRecord.getGroupId());
+		} catch (Exception e) {
+			logger.warn("Caught PAPException trying to get local pdp group with papEngine.getGroup("+groupId+");",e);
+			//throw new PAPException("Could not get local group "+groupId);
+		}
+		if(localGroup == null && extraData != null){
+			//here we can try to load an old group id from the extraData
+			try{
+				localGroup = papEngine.getGroup(extraData);
+			}catch(Exception e){
+				logger.warn("Caught PAPException trying to get local pdp group with papEngine.getGroup("+extraData+");",e);
+			}
+		}
+		if(localGroup != null && groupRecord.isDeleted()){
+			EcompPDPGroup newLocalGroup = null;
+			if(extraData != null){
+			try {
+				newLocalGroup = papEngine.getGroup(extraData);
+			} catch (PAPException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get new pdp group with papEngine.getGroup("+extraData+");");
+				//throw new PAPException("Could not get new local group "+newGroupId);
+				
+			}
+			}
+			try {
+				papEngine.removeGroup(localGroup, newLocalGroup);
+			} catch (NullPointerException | PAPException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp group with papEngine.removeGroup("+localGroup+", "+newLocalGroup+");");
+				throw new PAPException("Could not remove group "+groupId);
+			}
+		}
+		else if(localGroup == null){
+			//creating a new group
+			try {
+				papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());
+			} catch (NullPointerException | PAPException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to create pdp group with papEngine.newGroup(groupRecord.getgroupName(), groupRecord.getDescription());",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("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",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");
+				return;
+				//throw new PAPException("Could not get group "+groupRecord);
+			}
+			//add possible pdps to group
+			List<?> pdpsInGroup = transaction.getPdpsInGroup(Long.parseLong(groupRecord.getGroupId()));
+			for(Object pdpO : pdpsInGroup){
+				PdpEntity pdp = (PdpEntity)pdpO;
+				try {
+					papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());
+				} catch (NullPointerException | PAPException e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught PAPException trying to get create pdp with papEngine.newPDP(pdp.getPdpId(), localGroup, pdp.getPdpName(), pdp.getDescription(), pdp.getJmxPort());",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());");
+					throw new PAPException("Could not create pdp "+pdp);
+				}
+			}
+			//add possible policies to group (filesystem only, apparently)
+		} else {
+			if(!(localGroup instanceof StdPDPGroup)){
+				throw new PAPException("group is not a StdPDPGroup");
+			}
+			//clone the object
+			//because it will be comparing the new group to its own version
+			StdPDPGroup localGroupClone = new StdPDPGroup(localGroup.getId(),localGroup.isDefaultGroup(),localGroup.getName(),localGroup.getDescription(),((StdPDPGroup)localGroup).getDirectory());
+			localGroupClone.setEcompPdps(localGroup.getEcompPdps());
+			localGroupClone.setPipConfigs(localGroup.getPipConfigs());
+			localGroupClone.setStatus(localGroup.getStatus());			
+			//we are updating a group or adding a policy or changing default
+			//set default if it should be
+			if(!localGroupClone.isDefaultGroup() && groupRecord.isDefaultGroup()){
+				try {
+					papEngine.SetDefaultGroup(localGroup);
+					return;
+				} catch (PAPException e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to set default group with papEngine.SetDefaultGroup("+localGroupClone+");");
+					throw new PAPException("Could not set default group to "+localGroupClone);
+				}				
+			}		
+			boolean needToUpdate = false;
+			if(updateGroupPoliciesInFileSystem(localGroupClone,localGroup, groupRecord, transaction)){
+				needToUpdate = true;
+			}
+			if(!stringEquals(localGroupClone.getId(),groupRecord.getGroupId()) || !stringEquals(localGroupClone.getName(),groupRecord.getgroupName())){
+				//changing ids
+				//we do not want to change the id, the papEngine will do this for us, it needs to know the old id
+				localGroupClone.setName(groupRecord.getgroupName());
+				needToUpdate = true;
+			}
+			if(!stringEquals(localGroupClone.getDescription(),groupRecord.getDescription())){
+				localGroupClone.setDescription(groupRecord.getDescription());
+				needToUpdate = true;
+			}
+			if(needToUpdate){
+				try {
+					
+					papEngine.updateGroup(localGroupClone);
+				} catch (PAPException e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught PAPException trying to update group with papEngine.updateGroup("+localGroupClone+");",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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(EcompPDPGroup pdpGroup,EcompPDPGroup oldPdpGroup, GroupEntity groupRecord, PolicyDBDaoTransaction transaction) throws PAPException{
+		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());
+		HashSet<PDPPolicy> newPolicySet = new HashSet<PDPPolicy>();
+		for(PDPPolicy pdpPolicy : oldPdpGroup.getPolicies()){
+			currentPolicySet.put(pdpPolicy.getId(), pdpPolicy);
+		}
+		for(PolicyEntity policy : groupRecord.getPolicies()){
+			String pdpPolicyName = getPdpPolicyName(policy.getPolicyName(), policy.getScope());
+			if(group.getPolicy(pdpPolicyName) == null){
+				didUpdate = true;
+				if(currentPolicySet.containsKey(pdpPolicyName)){
+					newPolicySet.add(currentPolicySet.get(pdpPolicyName));
+				} else{
+					InputStream policyStream = new ByteArrayInputStream(policy.getPolicyData().getBytes());
+					group.copyPolicyToFile(pdpPolicyName,policyStream);
+					((StdPDPPolicy)(group.getPolicy(pdpPolicyName))).setName(removeExtensionAndVersionFromPolicyName(policy.getPolicyName()));
+					try {
+						policyStream.close();
+					} catch (IOException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+		if(didUpdate){
+			newPolicySet.addAll(group.getPolicies());
+			group.setPolicies(newPolicySet);
+		}
+		return didUpdate;
+		
+	}
+	private String removeExtensionAndVersionFromPolicyName(String originalPolicyName){
+		String policyName = originalPolicyName;
+		try{
+			policyName = removeFileExtension(policyName);
+			policyName = policyName.substring(0,policyName.lastIndexOf('.'));
+			if(isNullOrEmpty(policyName)){
+				throw new Exception();
+			}
+		} catch(Exception e){
+			policyName = originalPolicyName;
+		}
+		return policyName;
+	}
+	
+	private void handleIncomingPdpChange(String url, String pdpId, PolicyDBDaoTransaction transaction) throws PAPException{
+		//get pdp
+		long pdpIdLong = -1;
+		try{
+			pdpIdLong = Long.parseLong(pdpId);
+		}catch(NumberFormatException e){
+			throw new IllegalArgumentException("pdpId "+pdpId+" cannot be parsed into a long");
+		}
+		PdpEntity pdpRecord = null;
+		try{
+		pdpRecord = transaction.getPdp(pdpIdLong);
+		}catch(Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");",e);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp record with transaction.getPdp("+pdpIdLong+");");
+			throw new PAPException("Could not get local pdp "+pdpIdLong);
+		}
+		if(pdpRecord == null){
+			throw new PersistenceException("The pdpRecord returned is null");
+		}
+		PDP localPdp = null;
+		try {
+			localPdp = papEngine.getPDP(pdpRecord.getPdpId());
+		} catch (PAPException e) {
+			logger.warn("Caught PAPException trying to get local pdp  with papEngine.getPDP("+pdpId+");",e);
+		}
+		if(localPdp != null && pdpRecord.isDeleted()){
+			try {
+				papEngine.removePDP((EcompPDP) localPdp);
+			} catch (PAPException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to get remove pdp with papEngine.removePDP("+localPdp+");");
+				throw new PAPException("Could not remove pdp "+pdpId);
+			}
+		}
+		else if(localPdp == null){
+			//add new pdp
+			//get group
+			
+			EcompPDPGroup localGroup = null;
+			try {
+				localGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
+			} catch (PAPException e1) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to get local group to add pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());",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());");
+				throw new PAPException("Could not get local group");
+			}			
+			try {
+				papEngine.newPDP(pdpRecord.getPdpId(), localGroup, pdpRecord.getPdpName(), pdpRecord.getDescription(), pdpRecord.getJmxPort());
+			} catch (NullPointerException | PAPException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught PAPException trying to create pdp with papEngine.newPDP("+pdpRecord.getPdpId()+", "+localGroup+", "+pdpRecord.getPdpName()+", "+pdpRecord.getDescription()+", "+pdpRecord.getJmxPort()+");",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()+");");
+				throw new PAPException("Could not create pdp "+pdpRecord);
+			}
+		} else {
+			boolean needToUpdate = false;
+			if(!stringEquals(localPdp.getId(),pdpRecord.getPdpId()) || !stringEquals(localPdp.getName(),pdpRecord.getPdpName())){
+				//again, we don't want to change the id, the papEngine will do this
+				localPdp.setName(pdpRecord.getPdpName());
+				needToUpdate = true;
+			}
+			if(!stringEquals(localPdp.getDescription(),pdpRecord.getDescription())){
+				localPdp.setDescription(pdpRecord.getDescription());
+				needToUpdate = true;
+			}
+			String localPdpGroupId = null;
+					try{
+			localPdpGroupId = papEngine.getPDPGroup((EcompPDP) localPdp).getId();
+					} catch(PAPException e){
+						//could be null or something, just warn at this point
+						logger.warn("Caught PAPException trying to get id of local group that pdp is in with localPdpGroupId = papEngine.getPDPGroup(localPdp).getId();",e);
+						//throw new PAPException("Could not get local group");
+					}
+					if(!stringEquals(localPdpGroupId,pdpRecord.getGroup().getGroupId())){
+						EcompPDPGroup newPdpGroup = null;
+						try{
+						newPdpGroup = papEngine.getGroup(pdpRecord.getGroup().getGroupId());
+						}catch(PAPException e){
+							//ok, now we have an issue. Time to stop things
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught PAPException trying to get id of local group to move pdp to with papEngine.getGroup(pdpRecord.getGroup().getGroupId());",e);
+							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());");
+							throw new PAPException("Could not get local group");
+						}
+						try{
+						papEngine.movePDP((EcompPDP) localPdp, newPdpGroup);
+						}catch(PAPException e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);",e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to move pdp with papEngine.movePDP(localPdp, newPdpGroup);");
+							throw new PAPException("Could not move pdp "+localPdp);
+						}
+					}
+			if(((PdpEntity) localPdp).getJmxPort() != pdpRecord.getJmxPort()){
+				((PdpEntity) localPdp).setJmxPort(pdpRecord.getJmxPort());
+				needToUpdate = true;
+			}
+			if(needToUpdate){
+				try {
+					papEngine.updatePDP((EcompPDP) localPdp);
+				} catch (PAPException e) {
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PAPException trying to update pdp with papEngine.updatePdp("+localPdp+");");
+					throw new PAPException("Could not update pdp "+localPdp);
+				}
+			}
+		}
+		//compare to local situation
+		//call command to update
+	}
+	private void handleIncomingPolicyChange(String url, String policyId,String oldPathString){
+		EntityManager em = emf.createEntityManager();
+		Query getPolicyEntityQuery = em.createNamedQuery("PolicyEntity.FindById");
+		getPolicyEntityQuery.setParameter("id", Long.valueOf(policyId));
+		
+		@SuppressWarnings("unchecked")
+		List<PolicyEntity> policies = getPolicyEntityQuery.getResultList();
+		PolicyEntity policy = null;
+		if (policies.size() > 0){
+			policy = policies.get(0);
+		}
+		
+		String policyRepo = buildPolicyScopeDirectory(policy);
+		
+		Path policyPath = Paths.get(policyRepo);
+		String action = "unknown action";
+		try {
+
+			if(policy.isDeleted()){
+				logger.debug("Deleting Policy: " + policy.getPolicyName());
+				action = "delete";
+				Path newPath = Paths.get(policyPath.toString(), policy.getPolicyName());
+				Files.deleteIfExists(newPath);
+				
+				Path subFile = null;
+				
+				if (policy.getConfigurationData()!= null){
+					subFile = getPolicySubFile(policy.getConfigurationData().getConfigurationName(), "Config");
+				}else if(policy.getActionBodyEntity()!= null){
+					subFile = getPolicySubFile(policy.getActionBodyEntity().getActionBodyName(), "Action");
+				}
+				
+				if(subFile != null){
+					Files.deleteIfExists(subFile);
+				}
+				
+			}else{
+				logger.debug("Updating/Creating Policy: " + policy.getPolicyName());
+				action = "update";
+				Files.createDirectories(policyPath);
+				Path newPath = Paths.get(policyPath.toString(), policy.getPolicyName());
+				Files.deleteIfExists(newPath);
+				if(!isNullOrEmpty(oldPathString)){
+					try{
+						String[] scopeName = getScopeAndNameAndType(oldPathString);
+					Path oldPath = Paths.get(buildPolicyScopeDirectory(scopeName[0]),scopeName[1]);
+					Files.delete(oldPath.toAbsolutePath());
+					}catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Could not delete the old policy before rename: "+oldPathString,e);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy before rename: "+oldPathString);
+					}
+				}
+				Object policyData = XACMLPolicyScanner.readPolicy(IOUtils.toInputStream(policy.getPolicyData()));
+				XACMLPolicyWriter.writePolicyFile(newPath, (PolicyType) policyData);		
+				
+				if (policy.getConfigurationData()!= null){
+					if(!isNullOrEmpty(oldPathString)){
+						try{						
+						String[] oldPolicyScopeName = getScopeAndNameAndType(oldPathString);
+						String oldConfigFileName = getConfigFile(oldPolicyScopeName[1],oldPolicyScopeName[0],policy.getConfigurationData().getConfigType());
+						Path oldConfigFilePath = getPolicySubFile(oldConfigFileName, "Config");
+						logger.debug("Trying to delete: "+oldConfigFilePath.toString());
+						Files.delete(oldConfigFilePath);						
+						}catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Could not delete the old policy config before rename for policy: "+oldPathString,e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy config before rename for policy: "+oldPathString);
+						}
+					}
+					writePolicySubFile(policy, "Config");
+					
+				}else if(policy.getActionBodyEntity()!= null){
+					if(!isNullOrEmpty(oldPathString)){
+						try{						
+						String[] oldPolicyScopeName = getScopeAndNameAndType(oldPathString);
+						String oldActionFileName = getConfigFile(oldPolicyScopeName[1],oldPolicyScopeName[0],ConfigPolicy.JSON_CONFIG);
+						Path oldActionFilePath = getPolicySubFile(oldActionFileName, "Action");
+						logger.debug("Trying to delete: "+oldActionFilePath.toString());
+						Files.delete(oldActionFilePath);						
+						}catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Could not delete the old policy action body before rename for policy: "+oldPathString,e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not delete the old policy action body before rename for policy: "+oldPathString);
+						}
+					}
+					writePolicySubFile(policy, "Action");
+				}
+					
+			}
+		} catch (IOException e1) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Error occurred while performing [" + action + "] of Policy File: " +  policy.getPolicyName(), e1);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Error occurred while performing [" + action + "] of Policy File: " +  policy.getPolicyName());
+		}	
+	}
+	
+	//FIXME error correcting and logs
+	private void createGroupsFromDatabase(){
+		//get list of groups
+		boolean foundDefault = false;
+		//need to avoid infinite loop, just in case
+		boolean alreadyRunAdd = false;
+		while(!foundDefault){			
+		
+		EntityManager em = emf.createEntityManager();
+		Query getGroups = em.createQuery("SELECT g FROM GroupEntity g WHERE g.deleted=:deleted");
+		getGroups.setParameter("deleted", false);
+		List<?> groups = getGroups.getResultList();
+		em.close();
+		//make a folder for each group in pdps folders
+		Path pdpsPath = Paths.get("pdps");
+		try {
+			FileUtils.forceDelete(pdpsPath.toFile());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		try {
+			FileUtils.forceMkdir(pdpsPath.toFile());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		Properties propertyFileProperties = new Properties();
+		String groupList = "";
+		String defaultGroup = "";
+		for(Object o : groups){
+			GroupEntity group = (GroupEntity)o;
+			Path groupPath = Paths.get(pdpsPath.toString(), group.getGroupId());
+			try {
+				FileUtils.forceMkdir(groupPath.toFile());
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			Properties policyProperties = new Properties();
+			String rootPolicies = "";
+			for(PolicyEntity policy : group.getPolicies()){
+				Path newPolicyPath = Paths.get(groupPath.toString(),getPdpPolicyName(policy.getPolicyName(),policy.getScope()));
+				File newPolicyFile = newPolicyPath.toFile();
+				try {
+					newPolicyFile.createNewFile();
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				try {
+					FileOutputStream policyFileStream = new FileOutputStream(newPolicyFile);
+						policyFileStream.write(policy.getPolicyData().getBytes("UTF-8"));
+					policyFileStream.close();
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				policyProperties.setProperty(getPdpPolicyName(policy.getPolicyName(),policy.getScope())+".name",removeExtensionAndVersionFromPolicyName(policy.getPolicyName()));
+				rootPolicies += ",".concat(getPdpPolicyName(policy.getPolicyName(),policy.getScope()));
+			}
+			Path xacmlPolicyPropertiesPath = Paths.get(groupPath.toString(),"xacml.policy.properties");
+			File xacmlPolicyPropertiesFile = xacmlPolicyPropertiesPath.toFile();
+			if(rootPolicies.length() > 0){
+				rootPolicies = rootPolicies.substring(1);
+			}
+			policyProperties.setProperty("xacml.referencedPolicies", "");
+			policyProperties.setProperty("xacml.rootPolicies", rootPolicies);
+			
+			try {
+				xacmlPolicyPropertiesFile.createNewFile();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			try {
+				FileOutputStream xacmlPolicyPropertiesFileStream = new FileOutputStream(xacmlPolicyPropertiesFile);
+				//xacmlPolicyPropertiesFileStream.write(xacmlPolicyProperties.getBytes("UTF-8"));
+				policyProperties.store(xacmlPolicyPropertiesFileStream, "");
+				xacmlPolicyPropertiesFileStream.close();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			
+			em = emf.createEntityManager();
+			Query getPdpsQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group AND p.deleted=:deleted");
+			getPdpsQuery.setParameter("group", group);
+			getPdpsQuery.setParameter("deleted", false);
+			List<?> pdps = getPdpsQuery.getResultList();
+			em.close();			
+			String pdpLine = "";
+			for(Object o2 : pdps){
+				PdpEntity pdp = (PdpEntity)o2;
+				pdpLine += ",".concat(pdp.getPdpId());
+				propertyFileProperties.setProperty(pdp.getPdpId()+".description",pdp.getDescription());
+				propertyFileProperties.setProperty(pdp.getPdpId()+".jmxport",String.valueOf(pdp.getJmxPort()));
+				propertyFileProperties.setProperty(pdp.getPdpId()+".name",pdp.getPdpName());
+			}
+			if(pdpLine.length() > 0){
+				pdpLine = pdpLine.substring(1);
+			}
+			propertyFileProperties.setProperty(group.getGroupId()+".description", group.getDescription());
+			propertyFileProperties.setProperty(group.getGroupId()+".name", group.getgroupName());
+			propertyFileProperties.setProperty(group.getGroupId()+".pdps",pdpLine);
+			groupList += ",".concat(group.getGroupId());
+			if(group.isDefaultGroup()){
+				defaultGroup = group.getGroupId();
+				foundDefault = true;
+			}
+		}
+		if(!foundDefault && !alreadyRunAdd){
+			alreadyRunAdd = true;
+			//add default group to db
+			try{
+			em = emf.createEntityManager();
+			em.getTransaction().begin();
+			GroupEntity newDefaultGroup = new GroupEntity();
+			em.persist(newDefaultGroup);
+			newDefaultGroup.setDescription("The default group where new PDP's are put.");
+			newDefaultGroup.setGroupId("default");
+			newDefaultGroup.setGroupName("default");
+			newDefaultGroup.setDefaultGroup(true);
+			newDefaultGroup.setCreatedBy("automaticallyAdded");
+			newDefaultGroup.setModifiedBy("automaticallyAdded");
+			em.flush();
+			em.getTransaction().commit();		
+			continue;
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Could not add a new default group to the database",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not add a new default group to the database");
+			}
+		}
+		
+		Path xacmlPropertiesPath = Paths.get(pdpsPath.toString(),"xacml.properties");
+		File xacmlPropertiesFile = xacmlPropertiesPath.toFile();
+		if(groupList.length()>0){
+			groupList = groupList.substring(1);
+		}
+		propertyFileProperties.setProperty("xacml.pap.groups",groupList);
+		propertyFileProperties.setProperty("xacml.pap.groups.default",defaultGroup);
+		try {
+			xacmlPropertiesFile.createNewFile();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		try {
+			FileOutputStream xacmlPropertiesFileStream = new FileOutputStream(xacmlPropertiesFile);
+			//xacmlPropertiesFileStream.write(fileContents.getBytes("UTF-8"));
+			propertyFileProperties.store(xacmlPropertiesFileStream, "");
+			xacmlPropertiesFileStream.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		//if we get this far down, something went wrong and we don't want to get stuck in the loop
+		foundDefault = true;
+		}
+		//put policies in group folder
+		//create xacml.policy.properties in each folder with list of policies in that folder
+		//get list of pdps
+		//create xacml.properties with list of groups and pdps and other info
+	}
+
+	
+	//FIXME error checking and logging
+	private String getPdpPolicyName(String name, String scope){
+		String finalName = "";
+		finalName += scope;
+		finalName += ".";
+		finalName += removeFileExtension(name);
+		finalName += ".xml";
+		return finalName;
+	}
+	private String removeFileExtension(String fileName){
+		return fileName.substring(0, fileName.lastIndexOf('.'));
+	}
+	
+	private String buildPolicyScopeDirectory(PolicyEntity policy){
+		String repo = buildPolicyDirectory();
+
+		String policyScope = policy.getScope();
+		if(policyScope == null){
+			policyScope = "";
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+			PolicyLogger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+		} else {
+			policyScope = policyScope.replace(".", FileSystems.getDefault().getSeparator());	
+		}
+		if(policyScope == null){
+			policyScope = "";
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+			PolicyLogger.error("buildPolicyScopeDirectory("+policy+") computed null policyScope. Using blank.");
+		}
+		if(repo == null){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+			PolicyLogger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+			repo = "";
+		}
+		Path returnPath = Paths.get(repo + FileSystems.getDefault().getSeparator() + policyScope);
+		if(returnPath !=  null){
+			return returnPath.toString();
+		} else {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("buildPolicyScopeDirectory("+policy+") computed null path");
+			PolicyLogger.error("buildPolicyScopeDirectory("+policy+") received null repo. Using blank.");
+			return "";
+		}
+
+
+	}
+	private String buildPolicyScopeDirectory(String policyScope){
+		String repo = buildPolicyDirectory();		
+		policyScope = policyScope.replace(".", FileSystems.getDefault().getSeparator());
+		return repo + FileSystems.getDefault().getSeparator() + policyScope;
+		
+	}
+	
+	private static String buildPolicyDirectory(){
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), getDefaultWorkspace());
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+		
+    	/*
+    	 * Getting and Setting the parent path for Admin Console use when reading the policy files
+    	 */
+    	//domain chosen by the client to store the policy action files 
+    	//String domain = policy.getDomainDir();
+    	    	   
+    	
+    		
+    	//getting the fullpath of the gitPath and convert to string
+    	String policyDir = gitPath.toAbsolutePath().toString();
+    	
+
+		if(policyDir.contains("\\")){
+			policyDir = policyDir.replace("XACML-PAP-REST", "XACML-PAP-ADMIN");
+		}else{
+			if (policyDir.contains("pap")){
+				policyDir = policyDir.replace("pap", "console");
+			}
+		}
+    	logger.debug("policyDir: " + policyDir);
+		return policyDir;
+	}
+	
+	private Path getPolicySubFile(String filename, String subFileType){
+		logger.debug("getPolicySubFile(" + filename + ", " + subFileType + ")");
+		Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), subFileType);
+		File file = null;
+		
+		filename = FilenameUtils.removeExtension(filename);
+		
+		for(File tmpFile : filePath.toFile().listFiles()){
+			if (FilenameUtils.removeExtension(tmpFile.getName()).equals(filename)){
+				file = tmpFile;
+			}
+		}
+		
+		Path finalPath = null;
+		if (file!= null){
+			finalPath = Paths.get(file.getAbsolutePath());
+		}
+		
+		logger.debug("end of getPolicySubFile: " + finalPath);
+		return finalPath;	
+	}
+		
+	private boolean writePolicySubFile(PolicyEntity policy, String policyType){
+		logger.info("writePolicySubFile with policyName[" + policy.getPolicyName() + "] and policyType[" + policyType + "]");
+		String type = null;
+		String subTypeName = null;
+		String subTypeBody = null;
+		if (policyType.equalsIgnoreCase("config")){
+			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";
+				}
+				if (configType.equals(XML_CONFIG)) {
+					subTypeName = subTypeName + ".xml";
+				}
+				if (configType.equals(PROPERTIES_CONFIG)) {
+					subTypeName = subTypeName + ".properties";
+				}
+				if (configType.equals(OTHER_CONFIG)) {
+					subTypeName = subTypeName + ".txt";
+				}
+			}
+			
+		}else if (policyType.equalsIgnoreCase("action")){
+			type = "Action";
+			subTypeName = policy.getActionBodyEntity().getActionBodyName();
+			subTypeBody = policy.getActionBodyEntity().getActionBody();
+			
+			
+		}
+		Path filePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), type);
+
+		if(subTypeBody == null){
+			subTypeBody = "";
+		}
+		boolean success = false;
+			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;
+
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Exception occured while creating Configuration File for Policy : " + policy.getPolicyName(), e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception occured while creating Configuration File for Policy : " + policy.getPolicyName());
+			}					
+		
+		return success;
+		
+	}
+	
+	private String getPolicySubType(String filename){
+		String type = null;
+	
+		if (filename != null) {
+			if (FilenameUtils.getExtension(filename).equalsIgnoreCase("json")) {
+				type = ConfigPolicy.JSON_CONFIG;
+			}
+			if (FilenameUtils.getExtension(filename).equalsIgnoreCase("xml")) {
+				type = ConfigPolicy.XML_CONFIG;
+			}
+			if (FilenameUtils.getExtension(filename).equalsIgnoreCase("properties")) {
+				type = ConfigPolicy.PROPERTIES_CONFIG;
+			}
+			if (FilenameUtils.getExtension(filename).equalsIgnoreCase("txt")) {
+				type = ConfigPolicy.OTHER_CONFIG;
+			}
+		}
+			
+		return type;
+		
+	}
+	
+	
+	private  void convertFileToDBEntry(Path path){
+		logger.info("convertFileToDBEntry");
+		
+		if(path.toString().contains(".git")){
+			return;
+		}
+		
+		String filename = path.getFileName().toString();
+		if (filename.contains(".svnignore")){
+			return;
+		}
+
+		String[] scopeAndName = getScopeAndNameAndType(path.toString());
+		
+		if(scopeAndName == null){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + path.toString() + " is null!");
+			PolicyLogger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + path.toString() + " is null!");
+			return;
+		}
+
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+		
+		PolicyEntity policy = new PolicyEntity();
+		em.persist(policy);
+		String policyScope = scopeAndName[0];
+		String policyName = scopeAndName[1];
+		policy.setScope(policyScope);
+		policy.setPolicyName(policyName);
+		policy.setCreatedBy(AUDIT_USER);
+		policy.setModifiedBy(AUDIT_USER);
+
+		String newScope = policyScope.replace(".", File.separator);
+		String newName = FilenameUtils.removeExtension(policyName);
+		int version = 1;
+		try{
+			//we want the last index +1 because we don't want the dot
+			version = Integer.parseInt(newName.substring(newName.lastIndexOf(".")+1)); 
+		} catch(Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Could not get the policy version number from "+newName);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get the policy version number from "+newName);
+		}
+		newName = newScope + File.separator + newName.substring(0, newName.lastIndexOf("."));	
+
+		Query query = em.createNamedQuery("PolicyVersion.findByPolicyName");
+		query.setParameter("pname", newName);
+		
+		List<?> result = query.getResultList();
+		PolicyVersion versionEntity = null;
+		
+		if (!result.isEmpty()) {
+			logger.info("Result is not empty");
+			versionEntity = (PolicyVersion) result.get(0);
+			int highestVersion = Math.max(versionEntity.getHigherVersion(),version);
+			versionEntity.setHigherVersion(highestVersion);
+			versionEntity.setActiveVersion(highestVersion);
+		}else{
+			logger.info("result is empty");
+			Calendar calendar = Calendar.getInstance();
+			Timestamp createdDate = new Timestamp(calendar.getTime().getTime());
+			
+			versionEntity = new PolicyVersion();
+			em.persist(versionEntity);
+			versionEntity.setPolicyName(newName);
+			versionEntity.setHigherVersion(version);
+			versionEntity.setActiveVersion(version);
+			versionEntity.setCreatedBy(AUDIT_USER);
+			versionEntity.setModifiedBy(AUDIT_USER);
+			versionEntity.setCreatedDate(createdDate);
+			versionEntity.setModifiedDate(createdDate);
+		}
+		
+		
+		try {
+			String policyContent = new String(Files.readAllBytes(path));
+			policy.setDescription(getElementFromXMLString("/Description", policyContent));
+			policy.setPolicyData(policyContent);
+		} catch (IOException e1) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("convertFileToDBEntry error settingPolicyData: " + e1.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "convertFileToDBEntry error settingPolicyData");
+			em.getTransaction().rollback();
+			em.close();
+			return;
+		}
+		
+		if((scopeAndName[2].equalsIgnoreCase("Config"))){
+			String scopeName = scopeAndName[0] + "." + scopeAndName[1];
+			Path subFilePath = getPolicySubFile(scopeName, scopeAndName[2]);
+			try {
+				String content = new String(Files.readAllBytes(subFilePath));
+				String configName = subFilePath.getFileName().toString();
+				ConfigurationDataEntity configData = new ConfigurationDataEntity();
+				em.persist(configData);
+				configData.setConfigurationName(subFilePath.getFileName().toString());
+				configData.setConfigBody(content);
+				configData.setConfigType(getPolicySubType(configName));
+				configData.setCreatedBy(AUDIT_USER);
+				configData.setModifiedBy(AUDIT_USER);
+				policy.setConfigurationData(configData);
+				
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("convertFileToDBEntry error for Config policy: " + e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "convertFileToDBEntry error for Config policy");
+				em.getTransaction().rollback();
+				em.close();
+				return;
+			}
+		}else if(scopeAndName[2].equalsIgnoreCase("Action")){
+			String scopeName = scopeAndName[0] + "." + scopeAndName[1];
+			Path subFilePath = getPolicySubFile(scopeName, scopeAndName[2]);
+			try {
+				String content = new String(Files.readAllBytes(subFilePath));
+				ActionBodyEntity actionBody = new ActionBodyEntity();
+				em.persist(actionBody);
+				actionBody.setActionBodyName(subFilePath.getFileName().toString());
+				actionBody.setActionBody(content);
+				actionBody.setCreatedBy(AUDIT_USER);
+				actionBody.setModifiedBy(AUDIT_USER);
+				policy.setActionBodyEntity(actionBody);
+				
+			} catch (Exception e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("convertFileToDBEntry error for Action policy: " + e.getMessage());
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "convertFileToDBEntry error for Action policy");
+				em.getTransaction().rollback();
+				em.close();
+				return;
+			}			
+		}
+		logger.debug("convertFileToDBEntry commit transaction");
+		em.getTransaction().commit();
+		em.close();
+	}
+	
+	private void deleteAllPolicyTables(){
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+		Query deletePolicyEntityTableUpdate = em.createNamedQuery("PolicyEntity.deleteAll");
+		Query deleteActionBodyEntityTableUpdate = em.createNamedQuery("ActionBodyEntity.deleteAll");
+		Query deleteConfigurationDataEntityTableUpdate = em.createNamedQuery("ConfigurationDataEntity.deleteAll");
+		Query deletePolicyVersionEntityTableUpdate = em.createNamedQuery("PolicyVersion.deleteAll");
+		deletePolicyEntityTableUpdate.executeUpdate();
+		deleteActionBodyEntityTableUpdate.executeUpdate();
+		deleteConfigurationDataEntityTableUpdate.executeUpdate();
+		deletePolicyVersionEntityTableUpdate.executeUpdate();
+		em.getTransaction().commit();
+		em.close();
+		
+	}
+		
+	public void auditLocalDatabase(PAPPolicyEngine papEngine2){
+		logger.debug("PolicyDBDao.auditLocalDatabase() is called");
+		Path webappsPath = Paths.get(buildPolicyDirectory());
+		try{
+			deleteAllGroupTables();
+			deleteAllPolicyTables();
+			Files.createDirectories(webappsPath);
+			Files.walk(webappsPath).filter(Files::isRegularFile).forEach(this::convertFileToDBEntry);
+			auditGroups(papEngine2);
+		} catch(Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("auditLocalDatabase() error: " + e.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "auditLocalDatabase() error");
+			e.printStackTrace();
+		}		
+	}
+	
+	/**
+	 * Audits and loads the local file system to match the database version.
+	 */
+	@SuppressWarnings("unchecked")
+	public void auditLocalFileSystem(){
+		logger.debug("PolicyDBDau.auditLocalFileSystem() is called");
+
+		Path webappsPath = Paths.get(buildPolicyDirectory());
+		Path configFilesPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), "Config");
+		Path actionFilesPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS).toString(), "Action");
+		try {
+			Files.createDirectories(configFilesPath);
+			Files.createDirectories(actionFilesPath);
+			FileUtils.cleanDirectory(actionFilesPath.toFile());
+			FileUtils.cleanDirectory(configFilesPath.toFile());
+			if (webappsPath.toFile().exists()){
+				FileUtils.cleanDirectory(webappsPath.toFile());
+			}
+			Path repoWithScope = Paths.get(webappsPath.toString(), XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_DOMAIN));
+			Files.createDirectories(repoWithScope);
+		} catch (IOException e2) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("Error occurred while creating / clearing Config and Policy filesystem directories", e2);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Error occurred while creating / clearing Config and Policy filesystem directories");
+		}
+
+		List<PolicyEntity> policyEntityList;
+		try{
+			EntityManager em = emf.createEntityManager();
+			Query getPolicyEntitiesQuery = em.createNamedQuery("PolicyEntity.findAllByDeletedFlag");
+			getPolicyEntitiesQuery.setParameter("deleted", false);
+			policyEntityList = getPolicyEntitiesQuery.getResultList();
+		} catch(Exception e){
+			policyEntityList = new LinkedList<PolicyEntity>();
+		}
+
+		for (PolicyEntity policy: policyEntityList){
+			String name = "";
+			try {
+				if (!policy.isDeleted()){
+					name = policy.getPolicyName();				
+					String scope = policy.getScope();
+
+					scope = scope.replace(".", "//");
+					if (policy.getConfigurationData()!=null){
+						writePolicySubFile(policy, "Config");
+					}	
+					else if(policy.getActionBodyEntity()!=null){
+						writePolicySubFile(policy, "Action");
+					}
+
+
+					Path fileLocation = Paths.get(webappsPath.toString(), scope);
+
+					Files.createDirectories(fileLocation);
+					Path newPath = Paths.get(fileLocation.toString(), name);
+					Object policyData = XACMLPolicyScanner.readPolicy(IOUtils.toInputStream(policy.getPolicyData()));
+					XACMLPolicyWriter.writePolicyFile(newPath, (PolicyType) policyData);		
+				}
+			} catch (Exception e1) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Error occurred while creating Policy File: " + name, e1);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Error occurred while creating Policy File: " + name);
+			}		
+		}	
+		createGroupsFromDatabase();
+	}
+	
+	public void deleteAllGroupTables(){
+		logger.debug("PolicyDBDao.deleteAllGroupTables() called");
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+
+		Query deletePdpEntityEntityTableUpdate = em.createNamedQuery("PdpEntity.deleteAll");
+		deletePdpEntityEntityTableUpdate.executeUpdate();
+		
+		Query deleteGroupEntityTableUpdate = em.createNamedQuery("GroupEntity.deleteAll");
+		deleteGroupEntityTableUpdate.executeUpdate();
+		
+		em.getTransaction().commit();
+		em.close();
+	}
+	
+	@SuppressWarnings("unchecked")
+	public void auditGroups(PAPPolicyEngine papEngine2){
+		logger.debug("PolicyDBDao.auditGroups() called");
+		
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+		final String AUDIT_STR = "Audit";
+		try{
+
+			Set<EcompPDPGroup> groups = papEngine2.getEcompPDPGroups();
+			
+			for (EcompPDPGroup grp : groups){
+				try{
+				GroupEntity groupEntity = new GroupEntity();
+				em.persist(groupEntity);
+				groupEntity.setGroupName(grp.getName());
+				groupEntity.setDescription(grp.getDescription());
+				groupEntity.setDefaultGroup(grp.isDefaultGroup());
+				groupEntity.setCreatedBy(AUDIT_STR);
+				groupEntity.setGroupId(createNewPDPGroupId(grp.getId()));
+				groupEntity.setModifiedBy(AUDIT_STR);
+				Set<EcompPDP> pdps =  grp.getEcompPdps();				
+				
+				for(EcompPDP pdp : pdps){
+					PdpEntity pdpEntity = new PdpEntity();
+					em.persist(pdpEntity);
+					pdpEntity.setGroup(groupEntity);
+					pdpEntity.setJmxPort(pdp.getJmxPort());
+					pdpEntity.setPdpId(pdp.getId());
+					pdpEntity.setPdpName(pdp.getName());
+					pdpEntity.setModifiedBy(AUDIT_STR);
+					pdpEntity.setCreatedBy(AUDIT_STR);
+					
+				}
+				
+				Set<PDPPolicy> policies = grp.getPolicies();
+				
+				for(PDPPolicy policy : policies){
+					try{
+					String[] stringArray = getNameScopeAndVersionFromPdpPolicy(policy.getId());
+					List<PolicyEntity> policyEntityList;
+					Query getPolicyEntitiesQuery = em.createNamedQuery("PolicyEntity.findByNameAndScope");
+					getPolicyEntitiesQuery.setParameter("name", stringArray[0]);
+					getPolicyEntitiesQuery.setParameter("scope", stringArray[1]);
+					
+					policyEntityList = getPolicyEntitiesQuery.getResultList();
+					PolicyEntity policyEntity = null;
+					if(policyEntityList.size() < 1){
+						policyEntity = addPolicyThatOnlyExistsInPdpGroup(policy.getId(),Paths.get("pdps",grp.getId(),policy.getId()),em);
+					} else {
+						policyEntity = policyEntityList.get(0);
+					}
+					if(policyEntity != null){
+						groupEntity.addPolicyToGroup(policyEntity);
+					}
+					}catch(Exception e2){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("ERROR: " + e2);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e2, "PolicyDBDao", "Exception auditGroups inner catch");
+					}
+				}
+				}catch(Exception e1){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("ERROR: " + e1);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "Exception auditGroups middle catch");
+				}
+			}
+		}catch(Exception e){
+			em.getTransaction().rollback();
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("ERROR: " + e);
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception auditGroups outer catch");
+			em.close();
+			return;
+		}
+		
+		em.getTransaction().commit();
+		em.close();
+		
+	}
+	
+	private PolicyEntity addPolicyThatOnlyExistsInPdpGroup(String polId, Path path,EntityManager em){
+		String filename = path.getFileName().toString();
+		if (filename.contains(".svnignore")){
+			return null;
+		}
+
+		String[] scopeAndName = getNameScopeAndVersionFromPdpPolicy(polId);
+		
+		if(scopeAndName == null){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + polId.toString() + " is null!");
+			PolicyLogger.error("convertFileToDBEntry error: getScopeAndNameAndType(" + polId.toString() + " is null!");
+			return null;
+		}
+
+		
+		PolicyEntity policy = new PolicyEntity();
+		em.persist(policy);
+		String policyScope = scopeAndName[1];
+		String policyName = scopeAndName[0];
+		policy.setScope(policyScope);
+		policy.setPolicyName(policyName);
+		policy.setCreatedBy(AUDIT_USER);
+		policy.setModifiedBy(AUDIT_USER);
+		policy.setDeleted(true);
+		
+		try {
+			String policyContent = new String(Files.readAllBytes(path));
+			policy.setDescription(getElementFromXMLString("/Description", policyContent));
+			policy.setPolicyData(policyContent);
+			em.flush();
+			//em.getTransaction().commit();
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error("convertFileToDBEntry error settingPolicyData: " + e1.getMessage());
+			PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "convertFileToDBEntry error settingPolicyData");
+			return null;
+		}
+		//em.close();
+		return policy;
+	}
+	
+	private String getConfigFile(String filename, String scope, PolicyRestAdapter policy){
+		if(policy == null){
+			return getConfigFile(filename, scope, (String)null);
+		}
+		return getConfigFile(filename, scope, policy.getConfigType());
+	}
+	//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 scope, String configType) {
+		logger.debug("getConfigFile(String filename, String scope, String configType) as getConfigFile("+filename+", "+scope+", "+configType+") called");
+		filename = FilenameUtils.removeExtension(filename);
+//		if (filename.endsWith(".xml")) {
+//			filename = filename.substring(0, filename.length() - 4);
+//		}
+		String id = configType;
+
+		if (id != null) {
+			if (id.equals(ConfigPolicy.JSON_CONFIG) || id.contains("Firewall")) {
+				filename = filename + ".json";
+			}
+			if (id.equals(ConfigPolicy.XML_CONFIG)) {
+				filename = filename + ".xml";
+			}
+			if (id.equals(ConfigPolicy.PROPERTIES_CONFIG)) {
+				filename = filename + ".properties";
+			}
+			if (id.equals(ConfigPolicy.OTHER_CONFIG)) {
+				filename = filename + ".txt";
+			}
+		}
+		return scope + "." + filename;
+	}
+	
+	/**
+	 * Constructs the file name of a policy.
+	 * @param policy The name of a policy (ex: mypolicy1)
+	 * @return The file name of the policy (ex: Config_mypolicy1.xml)
+	 * @deprecated
+	 */
+	@SuppressWarnings("unused")
+	private String getName(PolicyRestAdapter policy){
+		logger.debug("getName(PolicyRestAdapter policy) as getName("+policy+") called");
+		String namePrefix = "";
+		if(policy.getPolicyType().contains("Config")){
+			namePrefix = namePrefix.concat(policy.getPolicyType());
+			if(policy.getConfigType().contains("Firewall")){
+				namePrefix = namePrefix.concat("_FW");
+			}
+		}
+		String concats =  namePrefix + "_" +policy.getPolicyName() + ".xml";
+		return concats;
+	}
+	
+	private String stripPolicyName(String policyFileName){
+		String policyName = policyFileName;
+		try{
+			policyName = policyName.substring(policyName.indexOf('_')+1);
+			policyName = removeFileExtension(policyName);
+		}catch(Exception e){						
+			throw new IllegalArgumentException("Could not get name out of policy file name: "+policyName);						
+		}
+		return policyName;
+	}
+	//FIXME error check, logs
+	private String[] getNameScopeAndVersionFromPdpPolicy(String fileName){
+		String[] splitByDots = fileName.split("\\.");
+		if(splitByDots.length < 3){
+			//throw something
+			return null;
+		}
+		String policyName = splitByDots[splitByDots.length-3];
+		String version = splitByDots[splitByDots.length-2];
+		//policy names now include version
+		policyName += "."+version +".xml";
+		String scope = "";
+		for(int i=0;i<splitByDots.length-3;i++){
+			scope += ".".concat(splitByDots[i]);
+		}
+		//remove the first dot
+		if(scope.length() > 0){
+			scope = scope.substring(1);
+		}
+		String[] returnArray = new String[3];
+		returnArray[0] = policyName;
+		returnArray[2] = version;
+		returnArray[1] = scope;
+		return returnArray;
+	}
+	
+	/**
+	 * Constructs the complete repository path based on the properties files
+	 * @return The repository path
+	 */
+	public static String getGitPath(){
+		logger.debug("getGitPath() as getGitPath() called");
+		Path workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE), "admin");
+		Path repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Path gitPath = Paths.get(workspacePath.toString(), repositoryPath.getFileName().toString());
+		logger.debug("after gitPath: " + gitPath);
+		return gitPath.toString();
+	}
+	
+	//copied from StdEngine.java
+	public static String createNewPDPGroupId(String name) {
+		String id = name;
+		// replace "bad" characters with sequences that will be ok for file names and properties keys.
+		id = id.replace(" ", "_sp_");
+		id = id.replace("\t", "_tab_");
+		id = id.replace("\\", "_bksl_");
+		id = id.replace("/", "_sl_");
+		id = id.replace(":", "_col_");
+		id = id.replace("*", "_ast_");
+		id = id.replace("?", "_q_");
+		id = id.replace("\"", "_quo_");
+		id = id.replace("<", "_lt_");
+		id = id.replace(">", "_gt_");
+		id = id.replace("|", "_bar_");
+		id = id.replace("=", "_eq_");
+		id = id.replace(",", "_com_");
+		id = id.replace(";", "_scom_");
+
+		return id;
+	}
+	
+	/**
+	 * Checks if any of the given strings are empty or null
+	 * @param strings One or more Strings (or nulls) to check if they are null or empty
+	 * @return true if one or more of the given strings are empty or null
+	 */
+	private static boolean isNullOrEmpty(String... strings){
+		for(String s : strings){
+			if(!(s instanceof String)){
+				return true;
+			}
+			if(s.equals("")){
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	/**
+	 * Computes the scope, name, and type of a policy based on its file path
+	 * @param path The file path of the policy (including the xml policy file)
+	 * @return A string array of size 3. 1: the scope of the policy  2: the name of the policy (Config_mypol.xml) 3: the type (Config). Or, null if the path can not be parsed.
+	 */
+	private static String[] getScopeAndNameAndType(String path){
+		logger.debug("getScopeAndNameAndType(String path) as getScopeAndNameAndType("+path+") called");
+		if(path == null){
+			
+		}
+		String gitPath  = getGitPath();
+
+		ArrayList<String> gitPathParts = new ArrayList<String>();
+		Iterator<?> gitPathIterator = Paths.get(gitPath).iterator();
+		while(gitPathIterator.hasNext()){
+			gitPathParts.add(gitPathIterator.next().toString());
+		}
+		for(int i=0;i<gitPathParts.size();i++){
+			Path testGitPath = Paths.get("");
+			for(int j=i;j<gitPathParts.size();j++){
+				testGitPath = Paths.get(testGitPath.toString(),gitPathParts.get(j));
+			}
+			if(path.contains(testGitPath.toString())){
+				gitPath = testGitPath.toString();
+				break;
+			}
+		}
+		if(gitPath == null){
+			logger.debug("gitPath is null.  Returning");
+			return null;
+		}
+		if(gitPath.length() >= path.length()){
+			logger.debug("gitPath length(): " + gitPath.length() + ">= path.length(): " + path.length() + ".  Returning null");
+			return null;
+		}
+		String scopeAndName = path.substring(path.indexOf(gitPath)+gitPath.length());
+	
+		logger.debug("scopeAndName: " + scopeAndName);
+		String policyType = null;
+		String[] policyTypes = {"Config_","Action_","Decision_"};
+		for(String pType : policyTypes){
+			if(scopeAndName.contains(pType)){
+				policyType = pType;
+			}
+		}
+		if(policyType == null){
+			return null;
+		}
+		String scope = scopeAndName.substring(0,scopeAndName.indexOf(policyType));
+		String name = scopeAndName.substring(scopeAndName.indexOf(policyType), scopeAndName.length());
+		scope = scope.replace('\\', '.');
+		scope = scope.replace('/', '.');
+		if(scope.length()<1){
+			return null;
+		}
+		if(scope.charAt(0) == '.'){
+			if(scope.length() < 2){
+				logger.debug("getScopeAndNameAndType error: " + scope.length() + " < 2. " + "| scope.charAt(0)==.");
+				return null;
+			}
+			scope = scope.substring(1);
+		}
+		if(scope.charAt(scope.length()-1) == '.'){
+			if(scope.length() < 2){
+				logger.debug("getScopeAndNameAndType error: " + scope.length() + " < 2" + "| scope.charAt(scope.length()-1)==.");
+				return null;
+			}
+			scope = scope.substring(0,scope.length()-1);
+		}
+		if(name.length()<1){
+			logger.debug("getScopeAndNameAndType error: name.length()<1");
+			return null;
+		}
+		if(name.charAt(0) == '.'){
+			if(name.length() < 2){
+				logger.debug("getScopeAndNameAndType error: " + name.length() + " < 2. " + "| scope.charAt(0)==.");
+				return null;
+			}
+			name = name.substring(1);
+		}
+		String[] returnArray = new String[3];
+		returnArray[0] = scope;
+		returnArray[1] = name;
+		//remove the underscore and return it
+		returnArray[2] = policyType.substring(0, policyType.length()-1);
+		return returnArray;
+	}
+
+	
+	private class PolicyDBDaoTransactionInstance implements PolicyDBDaoTransaction {
+		private EntityManager em;
+		private final Object emLock = new Object();
+		long policyId;
+		long groupId;
+		long pdpId;
+		String newGroupId;
+		private boolean operationRun = false;
+		private final Thread transactionTimer;
+		
+		private PolicyDBDaoTransactionInstance(){
+			//call the constructor with arguments
+			this(Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT)),
+					Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT)));
+		}
+		//timeout is how long the transaction can sit before rolling back
+		//wait time is how long to wait for the transaction to start before throwing an exception
+		private PolicyDBDaoTransactionInstance(int transactionTimeout, int transactionWaitTime){
+			if(logger.isDebugEnabled()){
+				logger.debug("\n\nPolicyDBDaoTransactionInstance() as PolicyDBDaoTransactionInstance() called:"
+					+ "\n   transactionTimeout = " + transactionTimeout
+					+ "\n   transactionWaitTime = " + transactionWaitTime + "\n\n");
+			}
+			this.em = emf.createEntityManager();
+			policyId = -1;
+			groupId = -1;
+			pdpId = -1;
+			newGroupId = null;
+			synchronized(emLock){
+				try{
+					startTransactionSynced(this.em,transactionWaitTime);
+				} catch(Exception e){
+					throw new PersistenceException("Could not lock transaction within "+transactionWaitTime+" milliseconds");
+				}
+			}
+			class TransactionTimer implements Runnable {
+
+				private int sleepTime;
+				public TransactionTimer(int timeout){
+					this.sleepTime = timeout;
+				}
+				@Override
+				public void run() {
+					if(logger.isDebugEnabled()){
+						Date date= new java.util.Date();
+						logger.debug("\n\nTransactionTimer.run() - SLEEPING: "
+								+ "\n   sleepTime (ms) = " + sleepTime 
+								+ "\n   TimeStamp = " + date.getTime()
+								+ "\n\n");
+					}
+					try {
+						Thread.sleep(sleepTime);
+					} catch (InterruptedException e) {
+						//probably, the transaction was completed, the last thing we want to do is roll back
+						if(logger.isDebugEnabled()){
+							Date date= new java.util.Date();
+							logger.debug("\n\nTransactionTimer.run() - WAKE Interrupt: "
+									+ "\n   TimeStamp = " + date.getTime()
+									+ "\n\n");
+						}
+						return;
+					}
+					if(logger.isDebugEnabled()){
+						Date date= new java.util.Date();
+						logger.debug("\n\nTransactionTimer.run() - WAKE Timeout: "
+								+ "\n   TimeStamp = " + date.getTime()
+								+ "\n\n");
+					}
+					rollbackTransaction();					
+				}
+				
+			}
+			
+			transactionTimer = new Thread(new TransactionTimer(transactionTimeout),"transactionTimerThread");
+			transactionTimer.start();
+			
+
+		}
+
+		private void checkBeforeOperationRun(){
+			checkBeforeOperationRun(false);
+		}
+		private void checkBeforeOperationRun(boolean justCheckOpen){
+			if(!isTransactionOpen()){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("There is no transaction currently open");
+				PolicyLogger.error("There is no transaction currently open");
+				throw new IllegalStateException("There is no transaction currently open");
+			}
+			if(operationRun && !justCheckOpen){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("An operation has already been performed and the current transaction should be committed");
+				PolicyLogger.error("An operation has already been performed and the current transaction should be committed");
+				throw new IllegalStateException("An operation has already been performed and the current transaction should be committed");
+			}
+			operationRun = true;
+		}
+		@Override
+		public void commitTransaction() {
+			synchronized(emLock){
+				logger.debug("commitTransaction() as commitTransaction() called");
+				if(!isTransactionOpen()){
+					logger.warn("There is no open transaction to commit");
+					//throw new IllegalStateException("There is no open transaction to commit");
+					try{
+					em.close();
+					} catch(Exception e){
+						e.printStackTrace();
+					}
+					return;
+				}
+				try{
+					em.getTransaction().commit();
+				} catch(RollbackException e){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught RollbackException on em.getTransaction().commit()",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught RollbackException on em.getTransaction().commit()");
+					throw new PersistenceException("The commit failed. Message:\n"+e.getMessage());
+				}
+				em.close();
+				//FIXME need to revisit
+				if(policyId >= 0){
+					
+					if(newGroupId != null){
+						try{
+							notifyOthers(policyId,POLICY_NOTIFICATION,newGroupId);
+						} catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")",e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+","+newGroupId+")");
+						}
+					} else {
+						try{
+							notifyOthers(policyId,POLICY_NOTIFICATION);
+						} catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")",e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+policyId+","+POLICY_NOTIFICATION+")");
+						}
+					}
+				}
+				if(groupId >= 0){
+					//we don't want commit to fail just because this does
+					if(newGroupId != null){
+					try{
+						notifyOthers(groupId,GROUP_NOTIFICATION,newGroupId);
+					} catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")",e);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+","+newGroupId+")");
+					}
+					} else {
+					try{
+						notifyOthers(groupId,GROUP_NOTIFICATION);
+					} catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")",e);	
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+groupId+","+GROUP_NOTIFICATION+")");
+					}
+					}
+				}
+				if(pdpId >= 0){
+					//we don't want commit to fail just because this does
+					try{
+						notifyOthers(pdpId,PDP_NOTIFICATION);
+					} catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")",e);
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on notifyOthers("+pdpId+","+PDP_NOTIFICATION+")");
+					}
+				}
+			}
+			if(transactionTimer instanceof Thread){
+				transactionTimer.interrupt();
+			}
+		}
+		
+		@Override
+		public void rollbackTransaction() {
+			logger.debug("rollbackTransaction() as rollbackTransaction() called");
+			synchronized(emLock){
+				if(isTransactionOpen()){	
+
+					try{
+					em.getTransaction().rollback();					
+					} catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Could not rollback transaction");
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not rollback transaction");
+					}
+					try{
+						em.close();
+					}catch(Exception e){
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Could not close EntityManager");
+						PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not close EntityManager");
+					}
+
+				} else {
+					try{
+						em.close();
+					}catch(Exception e){
+						logger.warn("Could not close already closed transaction");
+					}
+				}
+
+			}
+			if(transactionTimer instanceof Thread){
+				transactionTimer.interrupt();
+			}
+
+
+		}
+
+		private void createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) {
+			logger.debug("createPolicy(PolicyRestAdapter policy, String username, String policyScope, String policyName, String policyDataString) as createPolicy("+policy+", "+username+", "+policyScope+", "+policyName+", "+policyDataString+") called");
+			synchronized(emLock){
+				checkBeforeOperationRun();
+			//em.getTransaction().begin();
+			//FIXME if the policy is already found but deleted, when we update it should we reset the created by and version number?
+			Query createPolicyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:policyName");			
+			createPolicyQuery.setParameter("scope", policyScope);
+			createPolicyQuery.setParameter("policyName", policyName);
+			//createPolicyQuery.setParameter("deleted", false);
+			List<?> createPolicyQueryList = createPolicyQuery.getResultList();
+			PolicyEntity newPolicyEntity;
+			boolean update;
+			if(createPolicyQueryList.size() < 1){
+				newPolicyEntity = new PolicyEntity();
+				update = false;
+			} else if(createPolicyQueryList.size() > 1){
+				//something went wrong
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+				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 {
+				newPolicyEntity = (PolicyEntity)createPolicyQueryList.get(0);
+				update = true;
+			}			
+			
+			ActionBodyEntity newActionBodyEntity = null;
+			if(policy.getPolicyType().equals("Action")){
+				boolean abupdate = false;
+				if(newPolicyEntity.getActionBodyEntity() == null){
+					newActionBodyEntity = new ActionBodyEntity();
+				}else{
+					newActionBodyEntity = em.find(ActionBodyEntity.class, newPolicyEntity.getActionBodyEntity().getActionBodyId());
+					abupdate = true;
+				}
+
+				if(newActionBodyEntity != null){
+					if(!abupdate){
+						em.persist(newActionBodyEntity);
+					}
+					//build the file path
+					//trim the .xml off the end
+					String policyNameClean = FilenameUtils.removeExtension(policyName);
+					String actionBodyName = policyScope + "." + 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) {
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught FileNotFoundException on new actionBodyPathStr FileInputStream("+actionBodyPathStr+")",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){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught IOException on actionBodyPath newIOUtils.toString("+fileContentStream+")",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 {
+						actionBodyString = "{}";
+					}
+
+					newActionBodyEntity.setActionBody(actionBodyString);
+					newActionBodyEntity.setActionBodyName(actionBodyName);
+					newActionBodyEntity.setModifiedBy("PolicyDBDao.createPolicy()");
+					newActionBodyEntity.setDeleted(false);
+					if(!abupdate){
+						newActionBodyEntity.setCreatedBy("PolicyDBDao.createPolicy()");
+					}
+					if(logger.isDebugEnabled()){
+						logger.debug("\nPolicyDBDao.createPolicy"
+								+ "\n   newActionBodyEntity.getActionBody() = " + newActionBodyEntity.getActionBody()
+								+ "\n   newActionBodyEntity.getActionBodyName() = " + newActionBodyEntity.getActionBodyName()
+								+ "\n   newActionBodyEntity.getModifiedBy() = " + newActionBodyEntity.getModifiedBy()
+								+ "\n   newActionBodyEntity.getCreatedBy() = " + newActionBodyEntity.getCreatedBy()
+								+ "\n   newActionBodyEntity.isDeleted() = " + newActionBodyEntity.isDeleted()
+								+ "\n   FLUSHING to DB");
+					}
+					//push the actionBodyEntity to the DB
+					em.flush();
+				}else{
+					//newActionBodyEntity == null
+					//We have a actionBody in the policy but we found no actionBody in the DB
+					String msg = "\n\nPolicyDBDao.createPolicy - Incoming Action policy had an "
+							+ "actionBody, but it could not be found in the DB for update."
+							+ "\n  policyScope = " + policyScope
+							+ "\n  policyName = " + policyName + "\n\n";
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(msg);
+					PolicyLogger.error("PolicyDBDao.createPolicy - Incoming Action policy had an actionBody, but it could not be found in the DB for update: policyName = " + policyName);
+					throw new IllegalArgumentException(msg);
+				}
+			}
+
+			ConfigurationDataEntity newConfigurationDataEntity;
+			if(policy.getPolicyType().equals("Config")){
+				boolean configUpdate;
+				if(newPolicyEntity.getConfigurationData() == null){
+					newConfigurationDataEntity = new ConfigurationDataEntity();
+					configUpdate = false;
+				} else {
+					newConfigurationDataEntity = em.find(ConfigurationDataEntity.class, newPolicyEntity.getConfigurationData().getConfigurationDataId());
+					configUpdate = true;
+				}
+
+				if(newConfigurationDataEntity != null){
+					if(!configUpdate){
+						em.persist(newConfigurationDataEntity);
+					}
+					//ConfigPolicy configPolicy = (ConfigPolicy)policy;
+					if(!stringEquals(newConfigurationDataEntity.getConfigurationName(),getConfigFile(policyName,policyScope,policy))){
+						newConfigurationDataEntity.setConfigurationName(getConfigFile(policyName,policyScope,policy));
+					}
+					if(newConfigurationDataEntity.getConfigType() == null || !newConfigurationDataEntity.getConfigType().equals(policy.getConfigType())){
+						newConfigurationDataEntity.setConfigType(policy.getConfigType());
+					}
+					if(!configUpdate){
+						newConfigurationDataEntity.setCreatedBy(username);
+					}
+					if(newConfigurationDataEntity.getModifiedBy() == null || !newConfigurationDataEntity.getModifiedBy().equals(username)){
+						newConfigurationDataEntity.setModifiedBy(username);
+					}					
+					if(newConfigurationDataEntity.getDescription() == null || !newConfigurationDataEntity.getDescription().equals("")){
+						newConfigurationDataEntity.setDescription("");
+					}
+					if(newConfigurationDataEntity.getConfigBody() == null || newConfigurationDataEntity.getConfigBody().isEmpty() ||
+							(!newConfigurationDataEntity.getConfigBody().equals(policy.getConfigBodyData()))){
+						//hopefully one of these won't be null
+						if(policy.getConfigBodyData() == null){
+							newConfigurationDataEntity.setConfigBody(policy.getJsonBody());
+						}else{
+							newConfigurationDataEntity.setConfigBody(policy.getConfigBodyData());
+						}
+					}
+					if(newConfigurationDataEntity.isDeleted() == true){
+						newConfigurationDataEntity.setDeleted(false);
+					}
+
+					em.flush();
+				}else{//newConfigurationDataEntity == null
+					//We have a configurationData body in the policy but we found no configurationData body
+					//in the DB
+					String msg = "\n\nPolicyDBDao.createPolicy - Incoming Config policy had a "
+							+ "configurationData body, but it could not be found in the DB for update."
+							+ "\n  policyScope = " + policyScope
+							+ "\n  policyName = " + policyName + "\n\n";
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(msg);
+					PolicyLogger.error("PolicyDBDao.createPolicy - Incoming Config policy had a configurationData body, but it could not be found in the DB for update: policyName = " + policyName);
+					throw new IllegalArgumentException(msg);
+				}
+
+			} else {
+				newConfigurationDataEntity = null;
+			}
+			if(!update){
+				em.persist(newPolicyEntity);
+			}
+			
+			policyId = newPolicyEntity.getPolicyId();
+			//policy version is now part of policy name
+			/*
+			if(update){
+				try{
+					String versionString = evaluateXPath("Policy/@Version", policyDataString);
+					int versionNum = Integer.parseInt(versionString);
+					if(versionNum < 1){
+						throw new NumberFormatException();
+					}
+					newPolicyEntity.setPolicyVersion(versionNum);
+				} catch(Exception e){
+					if(newPolicyEntity.isDeleted()){
+						newPolicyEntity.resetPolicyVersion();
+					} else {
+						newPolicyEntity.advancePolicyVersion();
+					}
+				}
+				
+
+			}
+			*/
+			if(!stringEquals(newPolicyEntity.getPolicyName(),policyName)){
+				newPolicyEntity.setPolicyName(policyName);
+			}
+			if(!stringEquals(newPolicyEntity.getCreatedBy(),username)){
+				newPolicyEntity.setCreatedBy(username);
+			}
+			if(!stringEquals(newPolicyEntity.getDescription(),policy.getPolicyDescription())){
+				newPolicyEntity.setDescription(policy.getPolicyDescription());
+			}
+			if(!stringEquals(newPolicyEntity.getModifiedBy(),username)){
+				newPolicyEntity.setModifiedBy(username);
+			}
+			if(!stringEquals(newPolicyEntity.getPolicyData(),policyDataString)){
+				newPolicyEntity.setPolicyData(policyDataString);
+			}
+			if(!stringEquals(newPolicyEntity.getScope(),policyScope)){
+				newPolicyEntity.setScope(policyScope);
+			}
+			if(newPolicyEntity.isDeleted() == true){
+				newPolicyEntity.setDeleted(false);
+			}
+			newPolicyEntity.setConfigurationData(newConfigurationDataEntity);
+			newPolicyEntity.setActionBodyEntity(newActionBodyEntity);
+			
+			
+				em.flush();
+				this.policyId = newPolicyEntity.getPolicyId();
+			}
+			
+			return;
+		}
+
+		@SuppressWarnings("unused")
+		public PolicyEntity getPolicy(int policyID){
+			return getPolicy(policyID,null,null);
+		}
+		public PolicyEntity getPolicy(String policyName,String scope){
+			return getPolicy(-1,policyName,scope);
+		}
+		private PolicyEntity getPolicy(int policyID, String policyName,String scope){
+			logger.debug("getPolicy(int policyId, String policyName) as getPolicy("+policyID+","+policyName+") called");
+			if(policyID < 0 && isNullOrEmpty(policyName,scope)){
+				throw new IllegalArgumentException("policyID must be at least 0 or policyName must be not null or blank");
+			}
+
+			synchronized(emLock){
+				checkBeforeOperationRun(true);
+			//check if group exists
+				String policyId;
+				Query policyQuery;
+				if(!isNullOrEmpty(policyName,scope)){
+					policyId = policyName;
+					policyQuery = em.createQuery("SELECT p FROM PolicyEntity p WHERE p.policyName=:name AND p.scope=:scope");
+					policyQuery.setParameter("name", policyId);
+					policyQuery.setParameter("scope", scope);
+				} else{
+					policyId = String.valueOf(policyID);
+					policyQuery = em.createNamedQuery("PolicyEntity.FindById");
+					policyQuery.setParameter("id", policyId);
+				}
+			List<?> policyQueryList;
+			try{
+				policyQueryList = policyQuery.getResultList();
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to get policy with policyQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get policy with policyQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to get policy "+policyId);
+			}
+			if(policyQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy does not exist with id "+policyId);
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one policy with the id "+policyId+" were found in the database");
+				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");
+			}
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+						//+oldPath+", "+newPath);
+				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<GroupEntity>();
+					}
+					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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not get policy record to rename: "
+					//+oldPolicy[1],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) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught FileNotFoundException on new FileInputStream("+policyFilePath+")",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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught IOException on newIOUtils.toString("+fileContentStream+")",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 = getPolicySubType(policyToRename.getConfigurationData().getConfigurationName());
+				String configType = policyToRename.getConfigurationData().getConfigType();
+				policyToRename.getConfigurationData().setConfigurationName(getConfigFile(newPolicy[1], newPolicy[0], 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");
+			if(groupKey < 0){
+				throw new IllegalArgumentException("groupKey must be at least 0");
+			}
+			synchronized(emLock){
+				checkBeforeOperationRun(true);
+			//check if group exists
+			Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupKey=:groupKey");
+			groupQuery.setParameter("groupKey", groupKey);			
+			List<?> groupQueryList;
+			try{
+				groupQueryList = groupQuery.getResultList();
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to get group with groupQuery.getResultList()",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);
+			}
+			if(groupQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Group does not exist with groupKey "+groupKey);
+				PolicyLogger.error("Group does not exist with groupKey "+groupKey);
+				throw new PersistenceException("Group does not exist with groupKey "+groupKey);
+			} else if(groupQueryList.size() > 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("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+" were found in the database");
+				throw new PersistenceException("Somehow, more than one group with the groupKey "+groupKey+" were found in the database");
+			}
+				return (GroupEntity)groupQueryList.get(0);
+			}
+		}
+		
+		@Override
+		public GroupEntity getGroup(String groupId){
+			logger.debug("getGroup(String groupId) as getGroup("+groupId+") called");
+			if(isNullOrEmpty(groupId)){
+				throw new IllegalArgumentException("groupId must not be null or empty");
+			}
+			synchronized(emLock){
+				checkBeforeOperationRun(true);
+			//check if group exists
+			Query groupQuery = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId");
+			groupQuery.setParameter("groupId", groupId);			
+			List<?> groupQueryList;
+			try{
+				groupQueryList = groupQuery.getResultList();
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to get group with groupQuery.getResultList()",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);
+			}
+			if(groupQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Group does not exist with id "+groupId);
+				PolicyLogger.error("Group does not exist with id "+groupId);
+				throw new PersistenceException("Group does not exist with id "+groupId);
+			} else if(groupQueryList.size() > 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one group with the id "+groupId+" were found in the database");
+				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");
+			}
+				return (GroupEntity)groupQueryList.get(0);
+			}
+		}
+		@Override
+		public List<?> getPdpsInGroup(long groupKey){
+			logger.debug("getPdpsInGroup(int groupKey) as getPdpsInGroup("+groupKey+") called");
+			if(groupKey < 0){
+				throw new IllegalArgumentException("groupId must not be < 0");
+			}			
+			synchronized(emLock){
+				checkBeforeOperationRun(true);
+				Query pdpsQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.groupEntity=:group");
+				pdpsQuery.setParameter("group", getGroup(groupKey));
+				return pdpsQuery.getResultList();
+			}
+		}
+		@Override
+		public PdpEntity getPdp(long pdpKey){
+			logger.debug("getPdp(int pdpKey) as getPdp("+pdpKey+") called");
+			if(pdpKey < 0){
+				throw new IllegalArgumentException("pdpKey must be at least 0");
+			}
+			synchronized(emLock){
+				checkBeforeOperationRun(true);
+			//check if group exists
+			Query pdpQuery = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpKey=:pdpKey");
+			pdpQuery.setParameter("pdpKey", pdpKey);			
+			List<?> pdpQueryList;
+			try{
+				pdpQueryList = pdpQuery.getResultList();
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to get pdp with pdpQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get pdp with pdpQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to get pdp "+pdpKey);
+			}
+			if(pdpQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Pdp does not exist with pdpKey "+pdpKey);
+				PolicyLogger.error("Pdp does not exist with pdpKey "+pdpKey);
+				throw new PersistenceException("Pdp does not exist with pdpKey "+pdpKey);
+			} else if(pdpQueryList.size() > 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("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+" were found in the database");
+				throw new PersistenceException("Somehow, more than one pdp with the pdpKey "+pdpKey+" were found in the database");
+			}
+				return (PdpEntity)pdpQueryList.get(0);
+			}
+		}
+		
+		//FIXME: maybe this should be boolean
+		public void deletePolicy(String policyToDeletes){
+			synchronized(emLock){
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}
+				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];
+//				if(isTransactionOpen()){
+//					throw new IllegalStateException("A transaction is already open which has not been committed");
+//				}
+				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){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Somehow, more than one policy with the same scope, name, and deleted status were found in the database");
+					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 {
+					//em.getTransaction().begin();
+					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() {
+			logger.debug("isTransactionOpen() as isTransactionOpen() called");
+			synchronized(emLock){
+			return em.isOpen() && em.getTransaction().isActive();	
+			}
+		}
+
+
+		@Override
+		public void clonePolicy(String oldPolicyPath, String newPolicyPath, String username){
+			String[] oldPolicyData = getScopeAndNameAndType(oldPolicyPath);
+			String[] newPolicyData = getScopeAndNameAndType(newPolicyPath);
+			if(oldPolicyData == null || newPolicyData == null){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not parse one or more of the path names: "
+						//+oldPolicyPath+", "+newPolicyPath);
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW+"Could not get policy record to clone: "
+						//+oldPolicyData[1],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], newPolicyData[0], 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();
+			}			
+			
+			
+		}
+		
+		@Override
+		public void createPolicy(String filePath, String username) {
+			logger.debug("createPolicy(String filePath, String username) as createPolicy("+filePath+","+username+") called");
+			//get just the scope and file name
+			//its actually scope, name, and type now
+			String[] scopeAndName = getScopeAndNameAndType(filePath);
+			if(scopeAndName == null){
+				throw new IllegalArgumentException("The file path could not be parsed");
+			}
+			PolicyRestAdapter policy = new PolicyRestAdapter();
+
+			policy.setPolicyType(scopeAndName[2]);
+			policy.setPolicyDescription("");
+
+			String policyName = scopeAndName[1];
+			try{
+				policyName = stripPolicyName(policyName);
+			}catch(IllegalArgumentException e){
+				if(scopeAndName[2].equals("Config")){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error(e.getMessage());
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Exception calling stripPolicyName with policy name: "+policyName);
+					throw new IllegalArgumentException(e.getMessage(),e);
+				} else {
+					logger.warn(e.getMessage());
+				}
+			}
+			policy.setPolicyName(policyName);
+			String policyDataString = null;
+			InputStream fileContentStream = null;
+			try {
+				fileContentStream = new FileInputStream(filePath);
+				policyDataString = IOUtils.toString(fileContentStream);
+			} catch (FileNotFoundException e) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught FileNotFoundException on new FileInputStream("+filePath+")",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught FileNotFoundException on new FileInputStream("+filePath+")");
+				throw new IllegalArgumentException("The file path does not exist");
+			} catch(IOException e2){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught IOException on newIOUtils.toString("+fileContentStream+")",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");
+			}
+			try{
+			String policyDescription = getElementFromXMLString("/Description", policyDataString);
+			if(policyDescription != null){
+				policy.setPolicyDescription(policyDescription);
+			}
+			} catch(Exception e){
+				logger.warn("Could not get description from the policy file");
+			}
+			if(scopeAndName[2].equals("Config")){
+				//this method is not used for config, since there is no way to get config info (could be modified to)
+				String configPath;
+				try{
+				configPath = evaluateXPath("/Policy/Rule/AdviceExpressions/AdviceExpression[contains(@AdviceId,'ID')]/AttributeAssignmentExpression[@AttributeId='URLID']/AttributeValue/text()", policyDataString);
+				if(configPath == null){
+					throw new NullPointerException("configPath is null");
+				}
+				} catch(Exception e){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Could not get config file path from policy file",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Could not get config file path from policy file");
+					throw new IllegalArgumentException("Could not get config file path from policy file");
+				}
+				configPath = processConfigPath(configPath);
+				logger.debug("The location of our config file is: "+configPath);
+				policy.setConfigType(getPolicySubType(configPath));
+				logger.debug("Config type is: "+policy.getConfigType());
+
+				String configDataString = readConfigFile(configPath);
+				policy.setConfigBodyData(configDataString);
+			}
+			createPolicy(policy,username,scopeAndName[0],scopeAndName[1],policyDataString);			
+		}
+		private String processConfigPath(String configPath){
+			String webappsPath = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WEBAPPS);
+			if(webappsPath == null){
+				logger.error("Webapps property does not exist");
+				throw new IllegalArgumentException("Webapps property does not exist");
+			}
+			configPath = configPath.replace("$URL", webappsPath);
+			//make sure the correct slashes are in
+			try{
+			configPath = Paths.get(configPath).toString();
+			} catch(InvalidPathException e){
+				logger.error("Invalid config path: "+configPath);
+				throw new IllegalArgumentException("Invalid config path: "+configPath);
+			}
+			return configPath;
+		}
+		private String readConfigFile(String configPath){
+			String configDataString = null;
+			InputStream configContentStream = null;
+			try {
+				configContentStream = new FileInputStream(configPath);
+				configDataString = IOUtils.toString(configContentStream);
+			} catch (FileNotFoundException e) {
+				logger.error("Caught FileNotFoundException on new FileInputStream("+configPath+")",e);
+				throw new IllegalArgumentException("The config file path does not exist");
+			} catch(IOException e2){
+				logger.error("Caught IOException on newIOUtils.toString("+configContentStream+")",e2);
+				throw new IllegalArgumentException("The config file path cannot be read");
+			} finally {
+				IOUtils.closeQuietly(configContentStream);
+			}
+			if(configDataString == null){
+				throw new IllegalArgumentException("The config file path cannot be read");
+			}
+			return configDataString;
+		}
+		
+		@Override
+		public void createPolicy(Policy policy, String username){
+			logger.debug("createPolicy(PolicyRestAdapter policy, String username) as createPolicy("+policy+","+username+") called");
+			String policyScope = computeScope(policy.policyAdapter.getParentPath(),policy.policyAdapter.getUserGitPath());
+			
+			//Does not need to be XACMLPolicyWriterWithPapNotify since it is already in the PAP
+			//and this transaction is intercepted up stream.
+			InputStream policyXmlStream = XACMLPolicyWriter.getXmlAsInputStream((PolicyType)policy.getCorrectPolicyDataObject());
+			String policyDataString;
+			try {
+				policyDataString = IOUtils.toString(policyXmlStream);
+			} catch (IOException e) {
+				policyDataString = "could not read";
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught IOException on IOUtils.toString("+policyXmlStream+")",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught IOException on IOUtils.toString("+policyXmlStream+")");
+				throw new IllegalArgumentException("Cannot parse the policy xml from the PolicyRestAdapter.");
+			}
+			IOUtils.closeQuietly(policyXmlStream);
+			String configPath = "";
+			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")) {
+				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")) {
+				
+				prefix = configPath.substring(configPath.indexOf(policyScope+".")+policyScope.concat(".").length(), configPath.indexOf(policy.policyAdapter.getPolicyName()));
+				if(isNullOrEmpty(policy.policyAdapter.getConfigBodyData())){
+					String configData = "";
+					try{
+						String newConfigPath = configPath;
+						try{
+							newConfigPath = processConfigPath(newConfigPath);							
+						}catch(Exception e2){
+							logger.error("Could not process config path: "+newConfigPath,e2);
+						}
+						configData = readConfigFile(newConfigPath);
+					}catch(Exception e){
+						logger.error("Could not read config body data for "+configPath,e);
+					}
+					policy.policyAdapter.setConfigBodyData(configData);
+				}
+				
+			} else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")) {
+				
+				prefix = "Action_";
+				
+			} else if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Decision")) {
+				
+				prefix = "Decision_";
+			}
+			
+			if(!(policy.policyAdapter.getData() instanceof PolicyType)){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The data field is not an instance of PolicyType");
+				PolicyLogger.error("The data field is not an instance of PolicyType");
+				throw new IllegalArgumentException("The data field is not an instance of PolicyType");
+			}
+			String finalName = prefix+policy.policyAdapter.getPolicyName()+"."+((PolicyType)policy.policyAdapter.getData()).getVersion()+".xml";
+			if(policy.policyAdapter.getConfigType() == null || policy.policyAdapter.getConfigType().equals("")){
+				//we need to make it
+				//get the config file extension
+				String ext = "";
+				if (configPath != null) {
+					if (!configPath.equalsIgnoreCase("")) {
+						ext = configPath.substring(configPath.lastIndexOf('.'), configPath.length());;
+					}
+				}
+				
+				if(ext.contains("txt")){
+					policy.policyAdapter.setConfigType(OTHER_CONFIG);
+				} else if(ext.contains("json")){
+					policy.policyAdapter.setConfigType(JSON_CONFIG);
+				} else if(ext.contains("xml")){
+					policy.policyAdapter.setConfigType(XML_CONFIG);
+				} else if(ext.contains("properties")){
+					policy.policyAdapter.setConfigType(PROPERTIES_CONFIG);
+				} else {
+					if (policy.policyAdapter.getPolicyType().equalsIgnoreCase("Action")){
+						policy.policyAdapter.setConfigType(JSON_CONFIG);
+					}
+				}
+			}
+			createPolicy(policy.policyAdapter, username, policyScope,finalName,policyDataString);
+			
+		}
+		
+		@Override
+		public void close(){
+			synchronized(emLock){
+				if(em.isOpen()){
+					if(em.getTransaction().isActive()){
+						em.getTransaction().rollback();
+					}
+					em.close();
+				}
+				if(transactionTimer instanceof Thread){
+					transactionTimer.interrupt();
+				}
+			}
+		}
+
+
+
+		@Override
+		public void createGroup(String groupId, String groupName, String groupDescription, String username) {
+			logger.debug("deletePolicy(String policyToDeletes) as createGroup("+groupId+", "+groupName+", "+groupDescription+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}			
+			//parameter check
+			if(isNullOrEmpty(groupId, groupName, username)){
+				throw new IllegalArgumentException("groupId, groupName, and username must not be null or empty");
+			}
+			if(!(groupDescription instanceof String)){
+				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);
+			List<?> checkGroupQueryList;
+			try{
+				checkGroupQueryList = checkGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on checkGroupQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to check for existing group");
+			}
+			if(checkGroupQueryList.size() > 0){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The group being added already exists with id "+groupId);
+				PolicyLogger.error("The group being added already exists with id "+groupId);
+				throw new PersistenceException("The group being added already exists with id "+groupId);
+			}
+			//em.getTransaction().begin();
+			GroupEntity newGroup = new GroupEntity();
+			em.persist(newGroup);
+			newGroup.setCreatedBy(username);
+			newGroup.setModifiedBy(username);
+			newGroup.setGroupName(groupName);
+			newGroup.setGroupId(groupId);
+			newGroup.setDescription(groupDescription);
+			
+			em.flush();
+			this.groupId = newGroup.getGroupKey();
+			}
+		}
+
+		@Override
+		public void updateGroup(EcompPDPGroup group, String username){
+			logger.debug("updateGroup(PDPGroup group) as updateGroup("+group+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}			
+			
+			//parameter check
+			if(group == null){
+				throw new IllegalArgumentException("PDPGroup group must not be null");
+			}
+			if(isNullOrEmpty(group.getId(), username)){
+				throw new IllegalArgumentException("group.getId() and username must not be null or empty");
+			}
+
+			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);
+			List<?> getGroupQueryList;
+			try{
+				getGroupQueryList = getGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on getGroupQuery.getResultList()",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");
+			}
+			if(getGroupQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The group cannot be found to update with id "+group.getId());
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+				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");
+			}
+			//em.getTransaction().begin();
+			GroupEntity groupToUpdate = (GroupEntity)getGroupQueryList.get(0);
+			if(!stringEquals(groupToUpdate.getModifiedBy(), username)){
+				groupToUpdate.setModifiedBy(username);
+			}
+			if(group.getDescription() != null && !stringEquals(group.getDescription(),groupToUpdate.getDescription())){
+				groupToUpdate.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) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("We cannot get the group from the papEngine to delete policies",e1);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e1, "PolicyDBDao", "We cannot get the group from the papEngine to delete policies");
+			}
+			if(oldGroup == null){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("We cannot get the group from the papEngine to delete policies");
+				PolicyLogger.error("We cannot get the group from the papEngine to delete policies");
+			} else {
+
+				Set<String> newPolicySet = new HashSet<String>(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()){
+					newPolicySet.add(pol.getId());
+				}
+				for(PDPPolicy pol : oldGroup.getPolicies()){
+					//should be fast since getPolicies uses a HashSet in StdPDPGroup
+					if(!newPolicySet.contains(pol.getId())){
+						String[] scopeAndName = getNameScopeAndVersionFromPdpPolicy(pol.getId());
+						PolicyEntity policyToDelete;
+						try{
+						policyToDelete = getPolicy(scopeAndName[0],scopeAndName[1]);
+						}catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Could not get policy to remove: "+pol.getId(),e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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())){
+				//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);
+				List<?> checkGroupQueryList;
+				try{
+					checkGroupQueryList = checkGroupQuery.getResultList();
+				} catch(Exception e){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught Exception on checkGroupQuery.getResultList()",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on checkGroupQuery.getResultList()");
+					throw new PersistenceException("Query failed trying to check for existing group");
+				}
+				if(checkGroupQueryList.size() != 0){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("The new group name already exists, group id "+newGroupId);
+					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());
+				this.newGroupId = group.getId();
+			}
+			
+			em.flush();
+			this.groupId = groupToUpdate.getGroupKey();
+			}
+		}
+
+		@Override
+		public void addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) {
+			logger.debug("addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) as addPdpToGroup("+pdpID+", "+groupID+", "+pdpName+", "+pdpDescription+", "+pdpJmxPort+", "+username+") called");
+			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 = "";
+			}
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}	
+
+			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);
+			List<?> checkGroupQueryList;
+			try{
+				checkGroupQueryList = checkGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to check for existing group on checkGroupQuery.getResultList()",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");
+			}
+			if(checkGroupQueryList.size() != 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The group does not exist");
+				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);
+			List<?> checkDuplicateList;
+			try{
+				checkDuplicateList = checkDuplicateQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to check for duplicate PDP "+pdpID+" on checkDuplicateQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+				logger.warn("PDP already exists with id "+pdpID);				
+				newPdp = (PdpEntity)checkDuplicateList.get(0);
+			} else {
+				newPdp = new PdpEntity();
+		em.persist(newPdp);
+			}			
+
+			newPdp.setCreatedBy(username);
+			newPdp.setDeleted(false);
+			newPdp.setDescription(pdpDescription);
+			newPdp.setGroup((GroupEntity)checkGroupQueryList.get(0));
+			newPdp.setJmxPort(pdpJmxPort);
+			newPdp.setModifiedBy(username);
+			newPdp.setPdpId(pdpID);
+			newPdp.setPdpName(pdpName);
+			
+			em.flush();
+			this.pdpId = newPdp.getPdpKey();
+
+			}
+		}
+
+		
+		@Override
+		public void updatePdp(EcompPDP pdp, String username){
+			logger.debug("updatePdp(PDP pdp, String username) as updatePdp("+pdp+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}
+			//parameter check
+			if(pdp == null){
+				throw new IllegalArgumentException("PDP pdp must not be null");
+			}
+			if(isNullOrEmpty(pdp.getId(),username)){
+				throw new IllegalArgumentException("pdp.getId() and username must not be null or empty");
+			}
+
+			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);
+			List<?> getPdpQueryList;
+			try{
+				getPdpQueryList = getPdpQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on getPdpQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to get PDP "+pdp.getId());
+			}
+			if(getPdpQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The pdp cannot be found to update with id "+pdp.getId());
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+				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");
+			}
+			//em.getTransaction().begin();
+			PdpEntity pdpToUpdate = (PdpEntity)getPdpQueryList.get(0);
+			if(!stringEquals(pdpToUpdate.getModifiedBy(), username)){
+				pdpToUpdate.setModifiedBy(username);
+			}
+			if(pdp.getDescription() != null && !stringEquals(pdp.getDescription(),pdpToUpdate.getDescription())){
+				pdpToUpdate.setDescription(pdp.getDescription());
+			}
+			if(pdp.getName() != null && !stringEquals(pdp.getName(),pdpToUpdate.getPdpName())){
+				pdpToUpdate.setPdpName(pdp.getName());
+			}
+			if(pdp.getJmxPort() != null && !pdp.getJmxPort().equals(pdpToUpdate.getJmxPort())){
+				pdpToUpdate.setJmxPort(pdp.getJmxPort());
+			}
+			
+			em.flush();
+			this.pdpId = pdpToUpdate.getPdpKey();
+			}
+		}
+		
+		@Override
+		public void movePdp(EcompPDP pdp, EcompPDPGroup group, String username){
+			logger.debug("movePdp(PDP pdp, PDPGroup group, String username) as movePdp("+pdp+","+group+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");
+//			}
+			if(pdp == null || group == null){
+				throw new IllegalArgumentException("PDP pdp and PDPGroup group must not be null");
+			}
+			if(isNullOrEmpty(username,pdp.getId(),group.getId())){
+				throw new IllegalArgumentException("pdp.getId(), group.getId(), and username must not be null or empty");
+			}
+			
+			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);
+			List<?> getPdpQueryList;
+			try{
+				getPdpQueryList = getPdpQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on getPdpQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getPdpQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to get pdp to move with id "+pdp.getId());
+			}
+			if(getPdpQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The pdp cannot be found to move with id "+pdp.getId());
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one pdp with the same id "+pdp.getId()+" and deleted status were found in the database");
+				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");
+			}
+			
+			//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);
+			List<?> checkGroupQueryList;
+			try{
+				checkGroupQueryList = checkGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to get group on checkGroupQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The group "+group.getId()+" does not exist");
+				PolicyLogger.error("The group "+group.getId()+" does not exist");
+				throw new PersistenceException("The group "+group.getId()+" does not exist");
+			}
+			GroupEntity groupToMoveInto = (GroupEntity)checkGroupQueryList.get(0);
+			//move it
+			//em.getTransaction().begin();
+			PdpEntity pdpToUpdate = (PdpEntity)getPdpQueryList.get(0);
+			pdpToUpdate.setGroup(groupToMoveInto);
+			if(!stringEquals(pdpToUpdate.getModifiedBy(), username)){
+				pdpToUpdate.setModifiedBy(username);
+			}
+			
+			em.flush();
+			this.pdpId = pdpToUpdate.getPdpKey();
+			}
+		}
+		
+		@Override
+		public void changeDefaultGroup(EcompPDPGroup group, String username){
+			logger.debug("changeDefaultGroup(PDPGroup group, String username) as changeDefaultGroup("+group+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");
+//			}
+			//parameter check
+			if(group == null){
+				throw new IllegalArgumentException("PDPGroup group must not be null");
+			}
+			if(isNullOrEmpty(group.getId(),username)){
+				throw new IllegalArgumentException("group.getId() and username must not be null or empty");
+			}
+			
+			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);
+			List<?> getGroupQueryList;
+			try{
+				getGroupQueryList = getGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on getGroupQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on getGroupQuery.getResultList()");
+				throw new PersistenceException("Query failed trying to get group "+group.getId());
+			}
+			if(getGroupQueryList.size() < 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The group cannot be found to set default with id "+group.getId());
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one group with the same id "+group.getId()+" and deleted status were found in the database");
+				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");
+			}
+			//em.getTransaction().begin();
+			GroupEntity newDefaultGroup = (GroupEntity)getGroupQueryList.get(0);
+			newDefaultGroup.setDefaultGroup(true);
+			if(!stringEquals(newDefaultGroup.getModifiedBy(), username)){
+				newDefaultGroup.setModifiedBy(username);
+			}
+			
+			em.flush();
+			this.groupId = newDefaultGroup.getGroupKey();
+			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("groupKey", newDefaultGroup.getGroupKey());
+			try{
+				logger.info("set " + setAllGroupsNotDefault.executeUpdate() + " groups as not default");
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception on setAllGroupsNotDefault.executeUpdate()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception on setAllGroupsNotDefault.executeUpdate()");
+				throw new PersistenceException("Could not set all other groups default to false");
+			}
+			
+			em.flush();
+			}
+		}
+
+
+		@Override
+		public void deleteGroup(EcompPDPGroup group, EcompPDPGroup moveToGroup, String username) throws PAPException {
+			logger.debug("deleteGroup(PDPGroup group, PDPGroup moveToGroup, String username) as deleteGroup("+group+", "+moveToGroup+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}
+			if(group == null){
+				throw new IllegalArgumentException("PDPGroup group cannot be null");
+			}
+			if(isNullOrEmpty(username,group.getId())){
+				throw new IllegalArgumentException("group.getId() and and username must not be null or empty");
+			}
+
+			if(group.isDefaultGroup()){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("The default group "+group.getId()+" was attempted to be deleted. It cannot be.");
+				PolicyLogger.error("The default group "+group.getId()+" was attempted to be deleted. It cannot be.");
+				throw new PAPException("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);
+			List<?> deleteGroupQueryList;
+			try{
+				deleteGroupQueryList = deleteGroupQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to check if group exists deleteGroupQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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());
+				return;
+			} else if(deleteGroupQueryList.size() > 1){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one group with the id "+group.getId()+" were found in the database that are not deleted");
+				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");
+			}				
+				
+				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);
+				List<?> pdpsInGroupList;
+				try{
+					pdpsInGroupList = pdpsInGroupQuery.getResultList();
+				} catch(Exception e){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught Exception trying to get PDPs in group on pdpsInGroupQuery.getResultList()");
+					throw new PersistenceException("Query failed trying to get PDPs in group");
+				}
+				//em.getTransaction().begin();
+				if(pdpsInGroupList.size() > 0){
+					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);
+						List<?> checkMoveToGroupList;
+						try{
+							checkMoveToGroupList = checkMoveToGroupQuery.getResultList();
+						} catch(Exception e){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Caught Exception trying to check if group exists checkMoveToGroupQuery.getResultList()",e);
+							PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("The group could not be found with id " + moveToGroup.getId());
+							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());
+						} else if(checkMoveToGroupList.size() > 1){
+							//TODO:EELF Cleanup - Remove logger
+							//logger.error("Somehow, more than one group with the id "+moveToGroup.getId()+" were found in the database that are not deleted");
+							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");
+						} else {
+							GroupEntity newGroup = (GroupEntity)checkMoveToGroupList.get(0);
+							for(Object pdpObject : pdpsInGroupList){
+								PdpEntity pdp = (PdpEntity)pdpObject;
+								pdp.setGroup(newGroup);
+								if(!stringEquals(pdp.getModifiedBy(),username)){
+									pdp.setModifiedBy(username);
+								}
+								try{
+									
+								em.flush();
+								this.newGroupId = newGroup.getGroupId();
+								} catch(PersistenceException e){
+									//TODO:EELF Cleanup - Remove logger
+									//logger.error("Caught PersistenceException trying to set pdp group to null on em.flush()",e);
+									PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "Caught PersistenceException trying to set pdp group to null on em.flush()");
+									throw new PersistenceException("Query failed trying to set pdp group to ");
+								}
+							}
+						}
+					} else {
+						//TODO:EELF Cleanup - Remove logger
+						//logger.error("Group "+group.getId()+" is trying to be delted with PDPs. No group was provided to move them to");
+						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");
+					}
+				} 
+				
+				//delete group here
+								
+				GroupEntity groupToDelete = (GroupEntity)deleteGroupQueryList.get(0);
+				groupToDelete.setDeleted(true);
+				if(!stringEquals(groupToDelete.getModifiedBy(), username)){
+					groupToDelete.setModifiedBy(username);
+				}
+				
+				//try{
+								
+				em.flush();
+				this.groupId = groupToDelete.getGroupKey();
+				//return;
+				//} catch(PersistenceException pe){
+					//logger.error("Database error while marking policy or config as deleted");					
+					//throw new PersistenceException("Database error while marking policy or config as deleted");
+				//}	
+			}
+			}
+
+		@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");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}
+			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);
+			List<?> groupQueryList;
+			try{
+				groupQueryList = groupQuery.getResultList();
+			}catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to check if group exists groupQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Group policy is being added to does not exist with id "+groupID);
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one group with the id "+groupID+" were found in the database that are not deleted");
+				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");
+			}
+			//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);			
+			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);
+			List<?> policyQueryList;
+			try{
+				policyQueryList = policyQuery.getResultList();
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Caught Exception trying to check if policy exists policyQuery.getResultList()",e);
+				PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Policy being added to the group does not exist with policy id "+policyNameScopeAndVersion[0]);
+				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){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error("Somehow, more than one policy with the id "+policyNameScopeAndVersion[0]+" were found in the database that are not deleted");
+				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");
+			}
+			//em.getTransaction().begin();
+			GroupEntity group = (GroupEntity)groupQueryList.get(0);
+			PolicyEntity policy = (PolicyEntity)policyQueryList.get(0);
+			group.addPolicyToGroup(policy);
+			em.flush();
+			}
+		}
+
+		//this means delete pdp not just remove from group
+		@Override
+		public void removePdpFromGroup(String pdpID, String username) {
+			logger.debug("removePdpFromGroup(String pdpID, String username) as removePdpFromGroup("+pdpID+","+username+") called");
+//			if(isTransactionOpen()){
+//				logger.error("A transaction is already open which has not been committed");
+//				throw new IllegalStateException("A transaction is already open which has not been committed");				
+//			}
+			if(isNullOrEmpty(pdpID,username)){
+				throw new IllegalArgumentException("pdpID and username must not be null or empty");
+			}
+			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);
+				List<?> pdpList;
+				try{
+					pdpList = pdpQuery.getResultList();
+				} catch(Exception e){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Caught Exception trying to check if pdp exists  pdpQuery.getResultList()",e);
+					PolicyLogger.error(MessageCodes.EXCEPTION_ERROR, e, "PolicyDBDao", "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){
+					//TODO:EELF Cleanup - Remove logger
+					//logger.error("Somehow, more than one pdp with the id "+pdpID+" were found in the database that are not deleted");
+					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){
+					//logger.warn("Pdp being removed does not exist with id "+pdpID);
+					PolicyLogger.error("Pdp being removed does not exist with id "+pdpID);
+					return;
+				}
+				//em.getTransaction().begin();
+				PdpEntity pdp = (PdpEntity)pdpList.get(0);
+				pdp.setGroup(null);
+				if(!stringEquals(pdp.getModifiedBy(),username)){
+					pdp.setModifiedBy(username);
+				}
+				pdp.setDeleted(true);
+				
+				em.flush();
+				this.pdpId = pdp.getPdpKey();
+			}
+		}
+	}
+
+				
+	
+	private static String getDefaultWorkspace(){
+		return "admin";
+	}
+	
+	private PolicyDBDao(){
+		
+	}
+	public static PolicyDBDaoTestClass getPolicyDBDaoTestClass(){
+		return new PolicyDBDao().new PolicyDBDaoTestClass();
+	}
+	final class PolicyDBDaoTestClass {
+		String[] getScopeAndNameAndType(final String path){
+			return PolicyDBDao.getScopeAndNameAndType(path);
+		}
+		String getGitPath(){
+			return PolicyDBDao.getGitPath();
+		}
+		String getConfigFile(String filename, String scope, PolicyRestAdapter policy){
+			return PolicyDBDao.this.getConfigFile(filename, scope, 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);
+		}
+		
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java
new file mode 100644
index 0000000..4e9ddb4
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTransaction.java
@@ -0,0 +1,202 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.PersistenceException;
+
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.xacml.api.pap.EcompPDP;
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+
+import com.att.research.xacml.api.pap.PAPException;
+//import com.att.research.xacml.api.pap.PDP;
+//import com.att.research.xacml.api.pap.PDPGroup;
+
+public interface PolicyDBDaoTransaction {
+
+	/**
+	 * Commits (makes permanent) the current transaction. Also, notifies other PolicyDBDao instances on other PAP servers of the update.
+	 * @throws IllegalStateException if the PolicyDBDao transaction has not been used or has been committed already.
+	 * @throws PersistenceException if the commit fails for some reason
+	 */
+	public void commitTransaction();
+	
+	/**
+	 * Create or update a policy
+	 * @param policy A Policy object representing the policy to store or update
+	 * @param username A string of the username you want to be stored for doing this operation
+	 * @throws IllegalStateException If a transaction is open that has not yet been committed
+	 * @throws PersistenceException If a database error occurs
+	 * @throws IllegalArgumentException If the Policy's PolicyRestAdapter contains incorrect data.
+	 */
+	public void createPolicy(Policy policy, String username) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+	
+	/**
+	 * Create or update a policy
+	 * @param filePath The file path of the policy xml file
+	 * @param username A string of the username you want to be stored for doing this operation
+	 * @throws IllegalStateException If a transaction is open that has not yet been committed
+	 * @throws PersistenceException If a database error occurs
+	 * @throws IllegalArgumentException If the file path is incorrect, or if it refers to a Config policy
+	 */
+	public void createPolicy(String filePath, String username) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+	
+	/**
+	 * Check if the PolicyDBDaoTransaction is currently open
+	 * @return False if the PolicyDBDao transaction has not been used or has been committed already, true if it is open.
+	 */
+	public boolean isTransactionOpen();
+	
+	
+	
+	/**
+	 * Delete an existing policy
+	 * @param policyToDelete The file path of the policy to delete
+	 * @throws IllegalArgumentException If the file path given can not be parsed
+	 * @throws IllegalStateException If a transaction is open that has not yet been committed
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void deletePolicy(String policyToDelete) throws IllegalStateException, PersistenceException, IllegalArgumentException;
+	
+	/**
+	 * Rollback (undo) the current transaction.
+	 */
+	public void rollbackTransaction();
+	
+	/**
+	 * Close the PolicyDBDaoTransaction without rolling back or doing anything. Just used to close the EntityManager
+	 */
+	public void close();
+	
+	
+	/**
+	 * Create a new PDP group in the database
+	 * @param groupID The ID to name the new group (use PolicyDBDao.createNewPDPGroupId)
+	 * @param groupName The name to use for the new group
+	 * @param groupDescription Description of the new group (optional)
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void createGroup(String groupID, String groupName, String groupDescription, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Updates a group in the database with a new name of description
+	 * @param group The group with updated information. The id must match an existing group, but the name and description can be changed.
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs or if the group can not be found
+	 */
+	public void updateGroup(EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Updates a PDP in the database with new information
+	 * @param pdp The PDP to update
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs or if the pdp can not be found
+	 */
+	public void updatePdp(EcompPDP pdp, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Change the default group in the database to the group provided.
+	 * @param group The new group which should be set as default in the database
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void changeDefaultGroup(EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Moves a PDP to a new group.
+	 * @param pdp The PDP which is to be moved to a new group
+	 * @param group The new group which the PDP should be added to
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void movePdp(EcompPDP pdp, EcompPDPGroup group, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Add a new PDP to an existing group
+	 * @param pdpID The ID to name the new PDP
+	 * @param groupID The ID of the existing group to add the PDP to
+	 * @param pdpName The name to use for the new PDP
+	 * @param pdpDescription Description of the new PDP (optional)
+	 * @param pdpJmxPort
+	 * @param username Username of the user performing the operation
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void addPdpToGroup(String pdpID, String groupID, String pdpName, String pdpDescription, int pdpJmxPort, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	/**
+	 * Add an existing policy to an existing group
+	 * @param group The ID of the existing group to add the policy to
+	 * @param policyID The ID of an existing policy
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void addPolicyToGroup(String group, String policyID, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	
+	/**
+	 * Delete an existing PDP group
+	 * @param group A PDPGroup object representing the group to delete
+	 * @param moveToGroup A PDPGroup object representing another existing group which PDPs in the group being deleted should be moved to
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 * @throws PAPException If an error relating to how groups are handled occurs
+	 */
+	public void deleteGroup(EcompPDPGroup group, EcompPDPGroup moveToGroup, String username)throws IllegalArgumentException, IllegalStateException, PersistenceException, PAPException;
+	
+	/**
+	 * Removes an existing PDP from its group and deletes it.
+	 * @param pdpID The ID of the existing PDP which should be deleted
+	 * @throws IllegalArgumentException If non-optional parameters are null or empty strings
+	 * @throws IllegalStateException If a transaction is already open
+	 * @throws PersistenceException If a database error occurs
+	 */
+	public void removePdpFromGroup(String pdpID, String username) throws IllegalArgumentException, IllegalStateException, PersistenceException;
+	
+	public GroupEntity getGroup(long groupKey);
+	public GroupEntity getGroup(String groupId);
+	public List<?> getPdpsInGroup(long groupKey);
+	public PdpEntity getPdp(long pdpKey);
+
+	void renamePolicy(String oldPath, String newPath,String username);
+
+	void clonePolicy(String oldPolicyPath, String newPolicyPath, String username);
+		
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java
new file mode 100644
index 0000000..98e1bd9
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/components/package-info.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * 
+ */
+/**
+ *
+ */
+package org.openecomp.policy.pap.xacml.rest.components;
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ActionPolicyDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ActionPolicyDictionaryController.java
new file mode 100644
index 0000000..fa00fc1
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ActionPolicyDictionaryController.java
@@ -0,0 +1,201 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.ActionPolicyDictDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class ActionPolicyDictionaryController {
+
+	@Autowired
+	ActionPolicyDictDao actionPolicyDictDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+	
+	@RequestMapping(value={"/get_ActionPolicyDictDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getActionEntitybyName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("actionPolicyDictionaryDatas", mapper.writeValueAsString(actionPolicyDictDao.getActionDictDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping(value={"/get_ActionPolicyDictData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getActionPolicyDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("actionPolicyDictionaryDatas", mapper.writeValueAsString(actionPolicyDictDao.getActionDictData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/action_dictionary/save_ActionDict.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveActionPolicyDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ActionPolicyDict actionPolicyDict = (ActionPolicyDict)mapper.readValue(root.get("actionPolicyDictionaryData").toString(), ActionPolicyDict.class);
+			ActionAdapter adapter = mapper.readValue(root.get("actionPolicyDictionaryData").toString(), ActionAdapter.class);
+			String userId = root.get("loginId").textValue();
+			String header = "";
+			int counter = 0;
+			if(adapter.getHeaders().size() > 0){
+				for(Object attribute : adapter.getHeaders()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						String value = ((LinkedHashMap<?, ?>) attribute).get("number").toString();
+						if(counter>0){
+							header = header + ":";
+						}
+						header = header + key + "=";
+						header = header + value;
+						counter ++;
+					}
+				}
+			}
+			actionPolicyDict.setHeader(header);
+			if(actionPolicyDict.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(actionPolicyDict.getAttributeName(), "attributeName", ActionPolicyDict.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					actionPolicyDict.setUserCreatedBy(this.getUserInfo(userId));
+					actionPolicyDict.setUserModifiedBy(this.getUserInfo(userId));
+					actionPolicyDictDao.Save(actionPolicyDict);
+				}
+			}else{
+				actionPolicyDict.setUserModifiedBy(this.getUserInfo(userId));
+				actionPolicyDictDao.update(actionPolicyDict); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.actionPolicyDictDao.getActionDictData());
+			}	 
+			JSONObject j = new JSONObject("{actionPolicyDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/action_dictionary/remove_actionPolicyDict.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeActionPolicyDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ActionPolicyDict actionPolicyDict = (ActionPolicyDict)mapper.readValue(root.get("data").toString(), ActionPolicyDict.class);
+			actionPolicyDictDao.delete(actionPolicyDict);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.actionPolicyDictDao.getActionDictData());
+			JSONObject j = new JSONObject("{actionPolicyDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+}
+
+class ActionAdapter{
+	private ArrayList<Object> headers;
+
+	public ArrayList<Object> getHeaders() {
+		return headers;
+	}
+
+	public void setHeaders(ArrayList<Object> headers) {
+		this.headers = headers;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/BRMSDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/BRMSDictionaryController.java
new file mode 100644
index 0000000..bdf4d2c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/BRMSDictionaryController.java
@@ -0,0 +1,183 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.BRMSParamTemplateDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.BRMSParamTemplate;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+@Controller
+public class BRMSDictionaryController{
+
+	@Autowired
+	BRMSParamTemplateDao brmsParamTemplateDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	private String rule;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+
+	@RequestMapping(value={"/get_BRMSParamDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getBRMSParamDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("brmsParamDictionaryDatas", mapper.writeValueAsString(brmsParamTemplateDao.getBRMSParamDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_BRMSParamData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getBRMSParamDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("brmsParamDictionaryDatas", mapper.writeValueAsString(brmsParamTemplateDao.getBRMSParamTemplateData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/brms_dictionary/set_BRMSParamData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public void SetRuleData(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		StringWriter writer = new StringWriter();
+		IOUtils.copy(request.getInputStream() , writer, StandardCharsets.UTF_8);
+		String cleanStreamBoundary =  writer.toString().replaceFirst("------(.*)(?s).*octet-stream", "");
+		rule = cleanStreamBoundary.substring(0, cleanStreamBoundary.lastIndexOf("end")+4);
+	}
+	
+	@RequestMapping(value={"/brms_dictionary/save_BRMSParam.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveBRMSParamDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			BRMSParamTemplate bRMSParamTemplateData = (BRMSParamTemplate)mapper.readValue(root.get("brmsParamDictionaryData").toString(), BRMSParamTemplate.class);
+			String userId = root.get("loginId").textValue();
+			bRMSParamTemplateData.setRule(rule);
+			if(bRMSParamTemplateData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(bRMSParamTemplateData.getRuleName(), "ruleName", BRMSParamTemplate.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					bRMSParamTemplateData.setUserCreatedBy(this.getUserInfo(userId));
+					brmsParamTemplateDao.Save(bRMSParamTemplateData);
+				}	
+			}else{
+				brmsParamTemplateDao.update(bRMSParamTemplateData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.brmsParamTemplateDao.getBRMSParamTemplateData());
+			} 
+			JSONObject j = new JSONObject("{brmsParamDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/brms_dictionary/remove_brmsParam.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeBRMSParamDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			BRMSParamTemplate bRMSParamTemplateData = (BRMSParamTemplate)mapper.readValue(root.get("data").toString(), BRMSParamTemplate.class);
+			brmsParamTemplateDao.delete(bRMSParamTemplateData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.brmsParamTemplateDao.getBRMSParamTemplateData());
+			JSONObject j = new JSONObject("{brmsParamDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/CheckDictionaryDuplicateEntries.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/CheckDictionaryDuplicateEntries.java
new file mode 100644
index 0000000..e044340
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/CheckDictionaryDuplicateEntries.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+/*
+ * 
+ * 
+ * 
+ * */
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+public class CheckDictionaryDuplicateEntries {
+
+	private static final Log logger = LogFactory.getLog(CheckDictionaryDuplicateEntries.class);
+	
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public List<Object> CheckDuplicateEntry(String value, String columnName, Class class1) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<Object> data = null;
+		try {
+			Criteria cr = session.createCriteria(class1);
+			cr.add(Restrictions.eq(columnName,value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying for Duplicate Entries for Table"+e + class1);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ClosedLoopDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ClosedLoopDictionaryController.java
new file mode 100644
index 0000000..d70661f
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/ClosedLoopDictionaryController.java
@@ -0,0 +1,764 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.adapters.GridData;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.PEPOptionsDao;
+import org.openecomp.policy.rest.dao.ServiceDictionaryDao;
+import org.openecomp.policy.rest.dao.SiteDictionaryDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.dao.VNFTypeDao;
+import org.openecomp.policy.rest.dao.VSCLActionDao;
+import org.openecomp.policy.rest.dao.VarbindDictionaryDao;
+import org.openecomp.policy.rest.jpa.ClosedLoopD2Services;
+import org.openecomp.policy.rest.jpa.ClosedLoopSite;
+import org.openecomp.policy.rest.jpa.PEPOptions;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.jpa.VNFType;
+import org.openecomp.policy.rest.jpa.VSCLAction;
+import org.openecomp.policy.rest.jpa.VarbindDictionary;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class ClosedLoopDictionaryController{
+
+	@Autowired
+	VSCLActionDao vsclActionDao;
+	
+	@Autowired
+	VNFTypeDao vnfTypeDao;
+	
+	@Autowired
+	PEPOptionsDao pepOptionsDao;
+	
+	@Autowired
+	VarbindDictionaryDao varbindDao;
+	
+	@Autowired
+	ServiceDictionaryDao closedLoopServiceDao;
+	
+	@Autowired
+	SiteDictionaryDao closedLoopSiteDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+	
+	
+	@RequestMapping(value={"/get_VSCLActionDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVSCLActionDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("vsclActionDictionaryDatas", mapper.writeValueAsString(vsclActionDao.getVsclActionDataByName()));
+			org.openecomp.policy.pap.xacml.rest.util.JsonMessage msg = new org.openecomp.policy.pap.xacml.rest.util.JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	
+	@RequestMapping(value={"/get_VSCLActionData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVSCLActionDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("vsclActionDictionaryDatas", mapper.writeValueAsString(vsclActionDao.getVSCLActionData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_VNFTypeDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVNFTypeDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("vnfTypeDictionaryDatas", mapper.writeValueAsString(vnfTypeDao.getVNFTypeDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+		
+	@RequestMapping(value={"/get_VNFTypeData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVNFTypeDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("vnfTypeDictionaryDatas", mapper.writeValueAsString(vnfTypeDao.getVNFTypeData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PEPOptionsDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPEPOptionsDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("pepOptionsDictionaryDatas", mapper.writeValueAsString(pepOptionsDao.getPEPOptionsDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PEPOptionsData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPEPOptionsDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("pepOptionsDictionaryDatas", mapper.writeValueAsString(pepOptionsDao.getPEPOptionsData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_VarbindDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVarbindDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("varbindDictionaryDatas", mapper.writeValueAsString(varbindDao.getVarbindDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_VarbindDictionaryData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getVarbindDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("varbindDictionaryDatas", mapper.writeValueAsString(varbindDao.getVarbindDictionaryData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ClosedLoopServicesDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getClosedLoopServiceDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("closedLoopServiceDictionaryDatas", mapper.writeValueAsString(closedLoopServiceDao.getCLServiceDictDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ClosedLoopServicesData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getClosedLoopServiceDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("closedLoopServiceDictionaryDatas", mapper.writeValueAsString(closedLoopServiceDao.getClosedLoopD2ServicesData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ClosedLoopSiteDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getClosedLoopSiteDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("closedLoopSiteDictionaryDatas", mapper.writeValueAsString(closedLoopSiteDao.getCLSiteDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ClosedLoopSiteData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getClosedLoopSiteDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("closedLoopSiteDictionaryDatas", mapper.writeValueAsString(closedLoopSiteDao.getClosedLoopSiteData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/cl_dictionary/save_vsclAction.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView saveVSCLAction(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+		      ObjectMapper mapper = new ObjectMapper();
+		      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		      JsonNode root = mapper.readTree(request.getReader());
+		      VSCLAction vSCLAction = (VSCLAction)mapper.readValue(root.get("vsclActionDictionaryData").toString(), VSCLAction.class);
+		      String userId = root.get("loginId").textValue();
+		      if(vSCLAction.getId() == 0){
+		    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+		    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(vSCLAction.getVsclaction(), "vsclaction", VSCLAction.class);
+		    	  if(!duplicateData.isEmpty()){
+		    		  duplicateflag = true;
+		    	  }else{
+		    		  vSCLAction.setUserCreatedBy(this.getUserInfo(userId));
+		    		  vSCLAction.setUserModifiedBy(this.getUserInfo(userId));
+		    		  vsclActionDao.Save(vSCLAction);
+		    	  }
+		      }else{
+		    	  vSCLAction.setUserModifiedBy(this.getUserInfo(userId));
+		    	  vsclActionDao.update(vSCLAction); 
+		      } 
+		      response.setCharacterEncoding("UTF-8");
+		      response.setContentType("application / json");
+		      request.setCharacterEncoding("UTF-8");
+		      
+		      PrintWriter out = response.getWriter();
+		      String responseString = "";
+			  if(duplicateflag){
+				responseString = "Duplicate";
+			  }else{
+				responseString = mapper.writeValueAsString(this.vsclActionDao.getVSCLActionData());
+			  }	  
+		      JSONObject j = new JSONObject("{vsclActionDictionaryDatas: " + responseString + "}");
+		      
+		      out.write(j.toString());
+		      
+		      return null;
+	    }
+	    catch (Exception e){
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_VsclAction.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removeVSCLAction(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      VSCLAction vSCLAction = (VSCLAction)mapper.readValue(root.get("data").toString(), VSCLAction.class);
+	      vsclActionDao.delete(vSCLAction);
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      
+	      String responseString = mapper.writeValueAsString(this.vsclActionDao.getVSCLActionData());
+	      JSONObject j = new JSONObject("{vsclActionDictionaryDatas: " + responseString + "}");
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      System.out.println(e);
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/save_vnfType.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView saveVnfType(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      VNFType vNFType = (VNFType)mapper.readValue(root.get("vnfTypeDictionaryData").toString(), VNFType.class);
+		  String userId = root.get("loginId").textValue();
+	      if(vNFType.getId() == 0){
+	    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+	    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(vNFType.getVnftype(), "vnftype", VNFType.class);
+	    	  if(!duplicateData.isEmpty()){
+	    	  	duplicateflag = true;
+	    	  }else{
+	    		  vNFType.setUserCreatedBy(this.getUserInfo(userId));
+		    	  vNFType.setUserModifiedBy(this.getUserInfo(userId));
+		    	  vnfTypeDao.Save(vNFType);
+	    	  }  	 
+	      }else{
+	    	  vNFType.setUserModifiedBy(this.getUserInfo(userId));
+	    	  vnfTypeDao.update(vNFType); 
+	      } 
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.vnfTypeDao.getVNFTypeData());
+			} 
+	      JSONObject j = new JSONObject("{vnfTypeDictionaryDatas: " + responseString + "}");
+	      
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_vnfType.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removeVnfType(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+		      ObjectMapper mapper = new ObjectMapper();
+		      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		      JsonNode root = mapper.readTree(request.getReader());
+		      VNFType vNFType = (VNFType)mapper.readValue(root.get("data").toString(), VNFType.class);
+		      vnfTypeDao.delete(vNFType);
+		      response.setCharacterEncoding("UTF-8");
+		      response.setContentType("application / json");
+		      request.setCharacterEncoding("UTF-8");
+		      
+		      PrintWriter out = response.getWriter();
+		      
+		      String responseString = mapper.writeValueAsString(this.vnfTypeDao.getVNFTypeData());
+		      JSONObject j = new JSONObject("{vnfTypeDictionaryDatas: " + responseString + "}");
+		      out.write(j.toString());
+		      
+		      return null;
+		    }
+		    catch (Exception e){
+		      System.out.println(e);
+		      response.setCharacterEncoding("UTF-8");
+		      request.setCharacterEncoding("UTF-8");
+		      PrintWriter out = response.getWriter();
+		      out.write(e.getMessage());
+		    }
+		    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/save_pepOptions.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView savePEPOptions(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+		      ObjectMapper mapper = new ObjectMapper();
+		      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		      JsonNode root = mapper.readTree(request.getReader());
+		      PEPOptions pEPOptions = (PEPOptions)mapper.readValue(root.get("pepOptionsDictionaryData").toString(), PEPOptions.class);
+		      GridData gridData = (GridData)mapper.readValue(root.get("pepOptionsDictionaryData").toString(), GridData.class);
+		      String userId = root.get("loginId").textValue();
+		      String actions = "";
+				int counter = 0;
+				if(gridData.getAttributes().size() > 0){
+					for(Object attribute : gridData.getAttributes()){
+						if(attribute instanceof LinkedHashMap<?, ?>){
+							String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+							String value = ((LinkedHashMap<?, ?>) attribute).get("number").toString();
+							if(counter>0){
+								actions = actions + ":#@";
+							}
+							actions = actions + key + "=#@";
+							actions = actions + value;
+							counter ++;
+						}
+					}
+				}
+				pEPOptions.setActions(actions);
+		      if(pEPOptions.getId() == 0){
+		    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+		    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(pEPOptions.getPepName(), "pepName", PEPOptions.class);
+		    	  if(!duplicateData.isEmpty()){
+		    	  	duplicateflag = true;
+		    	  }else{
+		    		  pEPOptions.setUserCreatedBy(this.getUserInfo(userId));
+			    	  pEPOptions.setUserModifiedBy(this.getUserInfo(userId));
+			    	  pepOptionsDao.Save(pEPOptions);
+		    	  }   	 
+		      }else{
+		    	  pEPOptions.setUserModifiedBy(this.getUserInfo(userId));
+		    	  pepOptionsDao.update(pEPOptions); 
+		      } 
+		      response.setCharacterEncoding("UTF-8");
+		      response.setContentType("application / json");
+		      request.setCharacterEncoding("UTF-8");
+		      
+		      PrintWriter out = response.getWriter();
+		      String responseString = "";
+		      if(duplicateflag){
+		      	responseString = "Duplicate";
+		      }else{
+		    	  responseString = mapper.writeValueAsString(this.pepOptionsDao.getPEPOptionsData());
+		      } 
+		      JSONObject j = new JSONObject("{pepOptionsDictionaryDatas: " + responseString + "}");
+		      
+		      out.write(j.toString());
+		      
+		      return null;
+		    }
+		    catch (Exception e){
+		      response.setCharacterEncoding("UTF-8");
+		      request.setCharacterEncoding("UTF-8");
+		      PrintWriter out = response.getWriter();
+		      out.write(e.getMessage());
+		    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_pepOptions.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removePEPOptions(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      PEPOptions pEPOptions = (PEPOptions)mapper.readValue(root.get("data").toString(), PEPOptions.class);
+	      pepOptionsDao.delete(pEPOptions);
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      
+	      String responseString = mapper.writeValueAsString(this.pepOptionsDao.getPEPOptionsData());
+	      JSONObject j = new JSONObject("{pepOptionsDictionaryDatas: " + responseString + "}");
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      System.out.println(e);
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/save_service.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView saveServiceType(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      ClosedLoopD2Services serviceData = (ClosedLoopD2Services)mapper.readValue(root.get("closedLoopServiceDictionaryData").toString(), ClosedLoopD2Services.class);
+	      String userId = root.get("loginId").textValue();
+	      if(serviceData.getId() == 0){
+	    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+	    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(serviceData.getServiceName(), "serviceName", ClosedLoopD2Services.class);
+	    	  if(!duplicateData.isEmpty()){
+	    	  	duplicateflag = true;
+	    	  }else{
+	    		  serviceData.setUserCreatedBy(this.getUserInfo(userId));
+		    	  serviceData.setUserModifiedBy(this.getUserInfo(userId));
+		    	  closedLoopServiceDao.Save(serviceData);
+	    	  }
+	      }else{
+	    	  serviceData.setUserModifiedBy(this.getUserInfo(userId));
+	    	  closedLoopServiceDao.update(serviceData); 
+	      } 
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      String responseString = "";
+	      if(duplicateflag){
+	      	responseString = "Duplicate";
+	      }else{
+	    	  responseString = mapper.writeValueAsString(this.closedLoopServiceDao.getClosedLoopD2ServicesData());
+	      } 
+	      JSONObject j = new JSONObject("{closedLoopServiceDictionaryDatas: " + responseString + "}");
+	      
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_Service.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removeServiceType(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      ClosedLoopD2Services closedLoopD2Services = (ClosedLoopD2Services)mapper.readValue(root.get("data").toString(), ClosedLoopD2Services.class);
+	      closedLoopServiceDao.delete(closedLoopD2Services);
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      
+	      String responseString = mapper.writeValueAsString(this.closedLoopServiceDao.getClosedLoopD2ServicesData());
+	      JSONObject j = new JSONObject("{closedLoopServiceDictionaryDatas: " + responseString + "}");
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      System.out.println(e);
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/save_siteName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView saveSiteType(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      ClosedLoopSite siteData = (ClosedLoopSite)mapper.readValue(root.get("closedLoopSiteDictionaryData").toString(), ClosedLoopSite.class);
+	      String userId = root.get("loginId").textValue();
+	      if(siteData.getId() == 0){
+	    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+	    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(siteData.getSiteName(), "siteName", ClosedLoopSite.class);
+	    	  if(!duplicateData.isEmpty()){
+	    	  	duplicateflag = true;
+	    	  }else{
+	    		  siteData.setUserCreatedBy(this.getUserInfo(userId));
+		    	  siteData.setUserModifiedBy(this.getUserInfo(userId));
+		    	  closedLoopSiteDao.Save(siteData);
+	    	  }
+	      }else{
+	    	  siteData.setUserModifiedBy(this.getUserInfo(userId));
+	    	  closedLoopSiteDao.update(siteData); 
+	      } 
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      String responseString = "";
+	      if(duplicateflag){
+	      	responseString = "Duplicate";
+	      }else{
+	      	responseString = mapper.writeValueAsString(this.closedLoopSiteDao.getClosedLoopSiteData());
+	      }	
+	      JSONObject j = new JSONObject("{closedLoopSiteDictionaryDatas: " + responseString + "}");
+	      
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_site.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removeSiteType(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      ClosedLoopSite closedLoopSite = (ClosedLoopSite)mapper.readValue(root.get("data").toString(), ClosedLoopSite.class);
+	      closedLoopSiteDao.delete(closedLoopSite);
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      
+	      String responseString = mapper.writeValueAsString(this.closedLoopSiteDao.getClosedLoopSiteData());
+	      JSONObject j = new JSONObject("{closedLoopSiteDictionaryDatas: " + responseString + "}");
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      System.out.println(e);
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/save_varbind.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView saveVarbind(HttpServletRequest request, HttpServletResponse response) throws Exception{
+	    try {
+	    	boolean duplicateflag = false;
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      VarbindDictionary varbindDictionary = (VarbindDictionary)mapper.readValue(root.get("varbindDictionaryData").toString(), VarbindDictionary.class);
+	      String userId = root.get("loginId").textValue();
+	      if(varbindDictionary.getId() == 0){
+	    	  CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+	    	  List<Object> duplicateData =  entry.CheckDuplicateEntry(varbindDictionary.getVarbindName(), "varbindName", VarbindDictionary.class);
+	    	  if(!duplicateData.isEmpty()){
+	    	  	duplicateflag = true;
+	    	  }else{
+	    		  varbindDictionary.setUserCreatedBy(this.getUserInfo(userId));
+		    	  varbindDictionary.setUserModifiedBy(this.getUserInfo(userId));
+		    	  varbindDao.Save(varbindDictionary);
+	    	  }	  
+	      }else{
+	    	  varbindDictionary.setUserModifiedBy(this.getUserInfo(userId));
+	    	  varbindDao.update(varbindDictionary); 
+	      } 
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      String responseString = "";
+	      if(duplicateflag){
+	      	responseString = "Duplicate";
+	      }else{
+	      	responseString = mapper.writeValueAsString(this.varbindDao.getVarbindDictionaryData());
+	      }
+	      JSONObject j = new JSONObject("{varbindDictionaryDatas: " + responseString + "}");
+	      
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+	@RequestMapping(value={"/cl_dictionary/remove_varbindDict.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	  public ModelAndView removeVarbind(HttpServletRequest request, HttpServletResponse response) throws Exception {
+	    try{
+	      ObjectMapper mapper = new ObjectMapper();
+	      mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	      JsonNode root = mapper.readTree(request.getReader());
+	      VarbindDictionary varbindDictionary = (VarbindDictionary)mapper.readValue(root.get("data").toString(), VarbindDictionary.class);
+	      varbindDao.delete(varbindDictionary);
+	      response.setCharacterEncoding("UTF-8");
+	      response.setContentType("application / json");
+	      request.setCharacterEncoding("UTF-8");
+	      
+	      PrintWriter out = response.getWriter();
+	      
+	      String responseString = mapper.writeValueAsString(this.varbindDao.getVarbindDictionaryData());
+	      JSONObject j = new JSONObject("{varbindDictionaryDatas: " + responseString + "}");
+	      out.write(j.toString());
+	      
+	      return null;
+	    }
+	    catch (Exception e){
+	      System.out.println(e);
+	      response.setCharacterEncoding("UTF-8");
+	      request.setCharacterEncoding("UTF-8");
+	      PrintWriter out = response.getWriter();
+	      out.write(e.getMessage());
+	    }
+	    return null;
+	  }
+	
+}
+
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DecisionPolicyDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DecisionPolicyDictionaryController.java
new file mode 100644
index 0000000..3308a99
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DecisionPolicyDictionaryController.java
@@ -0,0 +1,188 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.DecisionPolicyDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class DecisionPolicyDictionaryController {
+
+	@Autowired
+	DecisionPolicyDao decisionPolicyDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+	
+	@RequestMapping(value={"/get_SettingsDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getSettingsDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("settingsDictionaryDatas", mapper.writeValueAsString(decisionPolicyDao.getDecisionDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	
+	@RequestMapping(value={"/get_SettingsDictionaryData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getSettingsDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("settingsDictionaryDatas", mapper.writeValueAsString(decisionPolicyDao.getDecisionSettingsData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/decision_dictionary/save_Settings.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveSettingsDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DecisionSettings decisionSettings = (DecisionSettings)mapper.readValue(root.get("settingsDictionaryData").toString(), DecisionSettings.class);
+		    String userId = root.get("loginId").textValue();
+			if(decisionSettings.getDatatypeBean().getShortName() != null){
+				String datatype = decisionSettings.getDatatypeBean().getShortName();
+				Datatype a = new Datatype();
+				if(datatype.equalsIgnoreCase("string")){
+					a.setId(26);	
+				}else if(datatype.equalsIgnoreCase("integer")){
+					a.setId(12);	
+				}else if(datatype.equalsIgnoreCase("boolean")){
+					a.setId(18);	
+				}else if(datatype.equalsIgnoreCase("double")){
+					a.setId(25);	
+				}else if(datatype.equalsIgnoreCase("user")){
+					a.setId(29);	
+				}
+				decisionSettings.setDatatypeBean(a);
+			}
+			if(decisionSettings.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(decisionSettings.getXacmlId(), "xacmlId", DecisionSettings.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					decisionSettings.setUserCreatedBy(this.getUserInfo(userId));
+					decisionSettings.setUserModifiedBy(this.getUserInfo(userId));
+					decisionPolicyDao.Save(decisionSettings);
+				}
+			}else{
+				decisionSettings.setUserModifiedBy(this.getUserInfo(userId));
+				decisionPolicyDao.update(decisionSettings); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString =  mapper.writeValueAsString(this.decisionPolicyDao.getDecisionSettingsData());
+			}
+			JSONObject j = new JSONObject("{settingsDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/settings_dictionary/remove_settings.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeSettingsDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DecisionSettings decisionSettings = (DecisionSettings)mapper.readValue(root.get("data").toString(), DecisionSettings.class);
+			decisionPolicyDao.delete(decisionSettings);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.decisionPolicyDao.getDecisionSettingsData());
+			JSONObject j = new JSONObject("{settingsDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DescriptiveDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DescriptiveDictionaryController.java
new file mode 100644
index 0000000..c184464
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DescriptiveDictionaryController.java
@@ -0,0 +1,190 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.adapters.GridData;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.DescriptiveScopeDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.DescriptiveScope;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class DescriptiveDictionaryController {
+
+	@Autowired
+	DescriptiveScopeDao descriptiveScopeDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+
+	@RequestMapping(value={"/get_DescriptiveScopeByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getDescriptiveDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("descriptiveScopeDictionaryDatas", mapper.writeValueAsString(descriptiveScopeDao.getDescriptiveScopeDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_DescriptiveScope"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getDescriptiveDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("descriptiveScopeDictionaryDatas", mapper.writeValueAsString(descriptiveScopeDao.getDescriptiveScope()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/descriptive_dictionary/save_descriptive.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveDescriptiveDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DescriptiveScope descriptiveScope = (DescriptiveScope)mapper.readValue(root.get("descriptiveScopeDictionaryData").toString(), DescriptiveScope.class);
+			GridData data = (GridData)mapper.readValue(root.get("descriptiveScopeDictionaryData").toString(), GridData.class);
+		    String userId = root.get("loginId").textValue();
+			String header = "";
+			int counter = 0;
+			if(data.getAttributes().size() > 0){
+				for(Object attribute : data.getAttributes()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						String value = ((LinkedHashMap<?, ?>) attribute).get("number").toString();
+						if(counter>0){
+							header = header + "AND";
+						}
+						header = header + key + ":";
+						header = header + value;
+						counter ++;
+					}
+				}
+			}
+			descriptiveScope.setSearch(header);
+			if(descriptiveScope.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(descriptiveScope.getScopeName(), "descriptiveScopeName", DescriptiveScope.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					descriptiveScope.setUserCreatedBy(this.getUserInfo(userId));
+					descriptiveScope.setUserModifiedBy(this.getUserInfo(userId));
+					descriptiveScopeDao.Save(descriptiveScope);
+				}
+			}else{
+				descriptiveScope.setUserModifiedBy(this.getUserInfo(userId));
+				descriptiveScopeDao.update(descriptiveScope); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString =  mapper.writeValueAsString(this.descriptiveScopeDao.getDescriptiveScope());
+			}
+			JSONObject j = new JSONObject("{descriptiveScopeDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/descriptive_dictionary/remove_descriptiveScope.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeDescriptiveDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DescriptiveScope descriptiveScope = (DescriptiveScope)mapper.readValue(root.get("data").toString(), DescriptiveScope.class);
+			descriptiveScopeDao.delete(descriptiveScope);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.descriptiveScopeDao.getDescriptiveScope());
+			JSONObject j = new JSONObject("{descriptiveScopeDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+}
+
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryController.java
new file mode 100644
index 0000000..aa2fb4a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryController.java
@@ -0,0 +1,366 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.AttributeDao;
+import org.openecomp.policy.rest.dao.CategoryDao;
+import org.openecomp.policy.rest.dao.EcompNameDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.Attribute;
+import org.openecomp.policy.rest.jpa.Category;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.EcompName;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class DictionaryController {
+	
+	private static final Log logger	= LogFactory.getLog(DictionaryController.class);
+
+	@Autowired
+	AttributeDao attributeDao;
+
+	@Autowired
+	EcompNameDao ecompNameDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	@Autowired
+	CategoryDao categoryDao;
+	
+	
+	public Category getCategory(){
+		for (int i = 0; i < categoryDao.getCategoryListData().size() ; i++) {
+			Category value = categoryDao.getCategoryListData().get(i);
+			if (value.getShortName().equals("resource")) {
+				return value;
+			}
+		}
+		return null;	
+	}
+	
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+
+	@RequestMapping(value={"/get_AttributeDatabyAttributeName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getAttributeDictionaryEntityDatabyAttributeName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			System.out.println();
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("attributeDictionaryDatas", mapper.writeValueAsString(attributeDao.getAttributeData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	//Attribute Dictionary
+	@RequestMapping(value="/get_AttributeData", method= RequestMethod.GET , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getAttributeDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			System.out.println();
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("attributeDictionaryDatas", mapper.writeValueAsString(attributeDao.getData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/attribute_dictionary/save_attribute.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveAttributeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			Attribute attributeData = (Attribute)mapper.readValue(root.get("attributeDictionaryData").toString(), Attribute.class);
+			AttributeValues attributeValueData = (AttributeValues)mapper.readValue(root.get("attributeDictionaryData").toString(), AttributeValues.class);
+			String userId = root.get("loginId").textValue();
+			String userValue = "";
+			int counter = 0;
+			if(attributeValueData.getUserDataTypeValues().size() > 0){
+				for(Object attribute : attributeValueData.getUserDataTypeValues()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("attributeValues").toString();
+						if(counter>0){
+							userValue = userValue + ",";
+						}
+						userValue = userValue + key ;
+						counter ++;
+					}
+				}
+			}
+			attributeData.setAttributeValue(userValue);
+			if(attributeData.getDatatypeBean().getShortName() != null){
+				String datatype = attributeData.getDatatypeBean().getShortName();
+				Datatype a = new Datatype();
+				if(datatype.equalsIgnoreCase("string")){
+					a.setId(26);	
+				}else if(datatype.equalsIgnoreCase("integer")){
+					a.setId(12);	
+				}else if(datatype.equalsIgnoreCase("boolean")){
+					a.setId(18);	
+				}else if(datatype.equalsIgnoreCase("double")){
+					a.setId(25);	
+				}else if(datatype.equalsIgnoreCase("user")){
+					a.setId(29);	
+				}
+				attributeData.setDatatypeBean(a);
+			}
+			if(attributeData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(attributeData.getXacmlId(), "xacmlId", Attribute.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					attributeData.setCategoryBean(this.getCategory());
+					attributeData.setUserCreatedBy(this.getUserInfo(userId));
+					attributeData.setUserModifiedBy(this.getUserInfo(userId));
+					attributeDao.Save(attributeData);
+				}
+			}else{
+				attributeData.setUserModifiedBy(this.getUserInfo(userId));
+				attributeDao.update(attributeData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.attributeDao.getData());
+			}
+			JSONObject j = new JSONObject("{attributeDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/attribute_dictionary/remove_attribute.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeAttributeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			Attribute attributeData = (Attribute)mapper.readValue(root.get("data").toString(), Attribute.class);
+			attributeDao.delete(attributeData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.attributeDao.getData());
+			JSONObject j = new JSONObject("{attributeDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	//EcompName Dictionary
+	@RequestMapping(value={"/get_EcompNameDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getEcompNameDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		logger.info("get_EcompNameDataByName is called");
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("ecompNameDictionaryDatas", mapper.writeValueAsString(ecompNameDao.getEcompNameDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_EcompNameData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getEcompNameDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		logger.info("get_EcompNameData is called");
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("ecompNameDictionaryDatas", mapper.writeValueAsString(ecompNameDao.getEcompName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+			logger.error("ERROR While callinge DAO: " + e.getMessage());
+		}
+	}
+
+	@RequestMapping(value={"/ecomp_dictionary/save_ecompName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveEcompDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			System.out.println("DictionaryController:  saveEcompDictionary() is called");
+			logger.debug("DictionaryController:  saveEcompDictionary() is called");
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			EcompName ecompData = (EcompName)mapper.readValue(root.get("ecompNameDictionaryData").toString(), EcompName.class);
+			String userId = root.get("loginId").textValue();
+			System.out.println("the userId from the ecomp portal is: " + userId);
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getEcompName(), "ecompName", EcompName.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					ecompData.setUserCreatedBy(getUserInfo(userId));
+					ecompData.setUserModifiedBy(getUserInfo(userId));
+					System.out.println("DictionaryController:  got the user info now about to call Save() method on ecompNamedao");
+					ecompNameDao.Save(ecompData);
+				}
+			}else{
+				ecompData.setUserModifiedBy(this.getUserInfo(userId));
+				ecompNameDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.ecompNameDao.getEcompName());
+			}
+			JSONObject j = new JSONObject("{ecompNameDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ecomp_dictionary/remove_ecomp.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeEcompDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			EcompName ecompData = (EcompName)mapper.readValue(root.get("data").toString(), EcompName.class);
+			ecompNameDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.ecompNameDao.getEcompName());
+			JSONObject j = new JSONObject("{ecompNameDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+}
+
+class AttributeValues{
+	private ArrayList<Object> userDataTypeValues;
+
+	public ArrayList<Object> getUserDataTypeValues() {
+		return userDataTypeValues;
+	}
+
+	public void setUserDataTypeValues(ArrayList<Object> userDataTypeValues) {
+		this.userDataTypeValues = userDataTypeValues;
+	}
+}
+
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryImportController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryImportController.java
new file mode 100644
index 0000000..3ed8f5d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/DictionaryImportController.java
@@ -0,0 +1,617 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+ /*
+  * 
+  * 
+  * */
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.openecomp.policy.rest.dao.ActionListDao;
+import org.openecomp.policy.rest.dao.ActionPolicyDictDao;
+import org.openecomp.policy.rest.dao.AddressGroupDao;
+import org.openecomp.policy.rest.dao.AttributeDao;
+import org.openecomp.policy.rest.dao.BRMSParamTemplateDao;
+import org.openecomp.policy.rest.dao.DecisionPolicyDao;
+import org.openecomp.policy.rest.dao.DescriptiveScopeDao;
+import org.openecomp.policy.rest.dao.EcompNameDao;
+import org.openecomp.policy.rest.dao.PEPOptionsDao;
+import org.openecomp.policy.rest.dao.PortListDao;
+import org.openecomp.policy.rest.dao.PrefixListDao;
+import org.openecomp.policy.rest.dao.ProtocolListDao;
+import org.openecomp.policy.rest.dao.SecurityZoneDao;
+import org.openecomp.policy.rest.dao.ServiceDictionaryDao;
+import org.openecomp.policy.rest.dao.ServiceGroupDao;
+import org.openecomp.policy.rest.dao.ServiceListDao;
+import org.openecomp.policy.rest.dao.SiteDictionaryDao;
+import org.openecomp.policy.rest.dao.TermListDao;
+import org.openecomp.policy.rest.dao.VNFTypeDao;
+import org.openecomp.policy.rest.dao.VSCLActionDao;
+import org.openecomp.policy.rest.dao.VarbindDictionaryDao;
+import org.openecomp.policy.rest.dao.ZoneDao;
+import org.openecomp.policy.rest.jpa.ActionList;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.AddressGroup;
+import org.openecomp.policy.rest.jpa.Attribute;
+import org.openecomp.policy.rest.jpa.BRMSParamTemplate;
+import org.openecomp.policy.rest.jpa.Category;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.openecomp.policy.rest.jpa.DescriptiveScope;
+import org.openecomp.policy.rest.jpa.EcompName;
+import org.openecomp.policy.rest.jpa.GroupServiceList;
+import org.openecomp.policy.rest.jpa.PEPOptions;
+import org.openecomp.policy.rest.jpa.PREFIXLIST;
+import org.openecomp.policy.rest.jpa.ProtocolList;
+import org.openecomp.policy.rest.jpa.SecurityZone;
+import org.openecomp.policy.rest.jpa.ServiceList;
+import org.openecomp.policy.rest.jpa.TermList;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.jpa.VNFType;
+import org.openecomp.policy.rest.jpa.VSCLAction;
+import org.openecomp.policy.rest.jpa.VarbindDictionary;
+import org.openecomp.policy.rest.jpa.Zone;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import au.com.bytecode.opencsv.CSVReader;
+
+
+@Controller
+public class DictionaryImportController {
+	private String newFile;
+
+	@Autowired
+	AttributeDao attributeDao;
+
+	@Autowired
+	ActionPolicyDictDao  actionPolicyDictDao;
+
+	@Autowired
+	EcompNameDao ecompNameDao;
+
+	@Autowired
+	VNFTypeDao vnfTypeDao;
+
+	@Autowired
+	VSCLActionDao vsclActionDao;
+
+	@Autowired
+	PEPOptionsDao pepOptionsDao;
+
+	@Autowired
+	VarbindDictionaryDao varbindDao;
+
+	@Autowired
+	ServiceDictionaryDao closedLoopServiceDao;
+
+	@Autowired
+	SiteDictionaryDao closedLoopSiteDao;
+
+	@Autowired
+	DescriptiveScopeDao descriptiveScopeDao;
+
+	@Autowired
+	PrefixListDao prefixListDao;
+
+	@Autowired
+	PortListDao portListDao;
+
+	@Autowired
+	ProtocolListDao protocolListDao;
+
+	@Autowired
+	AddressGroupDao addressGroupDao;
+
+	@Autowired
+	ActionListDao actionListDao;
+
+	@Autowired
+	SecurityZoneDao securityZoneDao;
+
+	@Autowired
+	ServiceGroupDao serviceGroupDao;
+
+	@Autowired
+	ServiceListDao serviceListDao;
+
+	@Autowired
+	TermListDao termListDao;
+
+	@Autowired
+	ZoneDao zoneDao;
+
+	@Autowired
+	DecisionPolicyDao decisionSettingsDao;
+
+	@Autowired
+	BRMSParamTemplateDao brmsParamTemplateDao;
+
+	@RequestMapping(value={"/dictionary/import_dictionary.htm/*"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public void ImportDictionaryData(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		//JsonNode root = mapper.readTree(request.getReader());
+		String userId = request.getPathInfo().substring(request.getPathInfo().lastIndexOf("/")+1);
+		List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+		for (FileItem item : items) {
+			File file = new File(item.getName());
+			OutputStream outputStream = new FileOutputStream(file);
+			IOUtils.copy(item.getInputStream(), outputStream);
+			outputStream.close();
+			this.newFile = file.toString();
+			CSVReader csvReader = new CSVReader(new FileReader(this.newFile));
+			List<String[]> dictSheet = csvReader.readAll();
+			if(item.getName().startsWith("Attribute")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					Attribute attribute = new Attribute("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("xacml_id") || dictSheet.get(0)[j].equalsIgnoreCase("Attribute ID")){
+							attribute.setXacmlId(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("priority")){
+							attribute.setPriority(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("datatype") || dictSheet.get(0)[j].equalsIgnoreCase("Data Type")){
+							Datatype dataType = new Datatype();
+							if(rows[j].equalsIgnoreCase("string")){
+								dataType.setId(26);
+							}else if(rows[j].equalsIgnoreCase("integer")){
+								dataType.setId(12);
+							}else if(rows[j].equalsIgnoreCase("double")){
+								dataType.setId(25);
+							}else if(rows[j].equalsIgnoreCase("boolean")){
+								dataType.setId(18);
+							}else if(rows[j].equalsIgnoreCase("user")){
+								dataType.setId(29);
+							}
+							attribute.setDatatypeBean(dataType);
+							Category category = new Category();
+							category.setId(5);
+							attribute.setCategoryBean(category);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("attribute_value") || dictSheet.get(0)[j].equalsIgnoreCase("Attribute Value")){
+							attribute.setAttributeValue(rows[j]);
+						}
+					}
+					attributeDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("ActionPolicyDictionary")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					ActionPolicyDict attribute = new ActionPolicyDict("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("attribute_name") || dictSheet.get(0)[j].equalsIgnoreCase("Attribute Name")){
+							attribute.setAttributeName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("body")){
+							attribute.setBody(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("headers")){
+							attribute.setHeader(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("method")){
+							attribute.setMethod(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("type")){
+							attribute.setMethod(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("url")){
+							attribute.setMethod(rows[j]);
+						}
+					}
+					actionPolicyDictDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("EcompName")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					EcompName attribute = new EcompName("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("ecomp_name") || dictSheet.get(0)[j].equalsIgnoreCase("Ecomp Name")){
+							attribute.setEcompName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					ecompNameDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("VNFType")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					VNFType attribute = new VNFType("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("vnf_type") || dictSheet.get(0)[j].equalsIgnoreCase("VNF Type")){
+							attribute.setVnftype(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					vnfTypeDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("VSCLAction")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					VSCLAction attribute = new VSCLAction("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("vscl_action") || dictSheet.get(0)[j].equalsIgnoreCase("VSCL Action")){
+							attribute.setVsclaction(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					vsclActionDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("PEPOptions")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					PEPOptions attribute = new PEPOptions("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("PEP_NAME") || dictSheet.get(0)[j].equalsIgnoreCase("PEP Name")){
+							attribute.setPepName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("Actions")){
+							attribute.setActions(rows[j]);
+						}
+					}
+					pepOptionsDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("VarbindDictionary")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					VarbindDictionary attribute = new VarbindDictionary("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("varbind_Name") || dictSheet.get(0)[j].equalsIgnoreCase("Varbind Name")){
+							attribute.setVarbindName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("varbind_Description") || dictSheet.get(0)[j].equalsIgnoreCase("Varbind Description")){
+							attribute.setVarbindDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("varbind_oid") || dictSheet.get(0)[j].equalsIgnoreCase("Varbind OID")){
+							attribute.setVarbindOID(rows[j]);
+						}
+					}
+					varbindDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("BRMSParamDictionary")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					BRMSParamTemplate attribute = new BRMSParamTemplate();
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("param_template_name") || dictSheet.get(0)[j].equalsIgnoreCase("Rule Name")){
+							attribute.setRuleName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("DESCRIPTION") || dictSheet.get(0)[j].equalsIgnoreCase("Description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("rule")){
+							attribute.setRule(rows[j]);
+						}
+					}
+					brmsParamTemplateDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("Settings")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					DecisionSettings attribute = new DecisionSettings("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("xacml_id") || dictSheet.get(0)[j].equalsIgnoreCase("Settings ID")){
+							attribute.setXacmlId(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("priority")){
+							attribute.setPriority(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("datatype") || dictSheet.get(0)[j].equalsIgnoreCase("Data Type")){
+							Datatype dataType = new Datatype();
+							if(rows[j].equalsIgnoreCase("string")){
+								dataType.setId(26);
+							}else if(rows[j].equalsIgnoreCase("integer")){
+								dataType.setId(12);
+							}else if(rows[j].equalsIgnoreCase("double")){
+								dataType.setId(25);
+							}else if(rows[j].equalsIgnoreCase("boolean")){
+								dataType.setId(18);
+							}else if(rows[j].equalsIgnoreCase("user")){
+								dataType.setId(29);
+							}
+							attribute.setDatatypeBean(dataType);
+						}
+					}
+					decisionSettingsDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("PrefixList")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					PREFIXLIST attribute = new PREFIXLIST("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("prefixListName") || dictSheet.get(0)[j].equalsIgnoreCase("PrefixList Name")){
+							attribute.setPrefixListName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setPrefixListValue(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("prefixListValue") || dictSheet.get(0)[j].equalsIgnoreCase("PrefixList Value")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					prefixListDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("SecurityZone")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					SecurityZone attribute = new SecurityZone("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("zoneName") || dictSheet.get(0)[j].equalsIgnoreCase("Zone Name")){
+							attribute.setZoneName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("zoneValue")  || dictSheet.get(0)[j].equalsIgnoreCase("Zone Value")){
+							attribute.setZoneValue(rows[j]);
+						}
+					}
+					securityZoneDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("Zone")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					Zone attribute = new Zone("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("zoneName") || dictSheet.get(0)[j].equalsIgnoreCase("Zone Name")){
+							attribute.setZoneName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("zoneValue")  || dictSheet.get(0)[j].equalsIgnoreCase("Zone Value")){
+							attribute.setZoneValue(rows[j]);
+						}
+					}
+					zoneDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("ServiceList")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					ServiceList attribute = new ServiceList("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceName") || dictSheet.get(0)[j].equalsIgnoreCase("Service Name")){
+							attribute.setServiceName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceDesc")  || dictSheet.get(0)[j].equalsIgnoreCase("Description")){
+							attribute.setServiceDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceType")  || dictSheet.get(0)[j].equalsIgnoreCase("Service Type")){
+							attribute.setServiceType(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceTrasProtocol")  || dictSheet.get(0)[j].equalsIgnoreCase("Transport Protocol")){
+							attribute.setServiceTransProtocol(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceAppProtocol")  || dictSheet.get(0)[j].equalsIgnoreCase("APP Protocol")){
+							attribute.setServiceAppProtocol(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("servicePorts")  || dictSheet.get(0)[j].equalsIgnoreCase("Ports")){
+							attribute.setServicePorts(rows[j]);
+						}
+					}
+					serviceListDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("ServiceGroup")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					GroupServiceList attribute = new GroupServiceList("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("name") || dictSheet.get(0)[j].equalsIgnoreCase("Group Name")){
+							attribute.setGroupName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceList")  || dictSheet.get(0)[j].equalsIgnoreCase("Service List")){
+							attribute.setServiceList(rows[j]);
+						}
+					}
+					serviceGroupDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("AddressGroup")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					AddressGroup attribute = new AddressGroup("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("name") || dictSheet.get(0)[j].equalsIgnoreCase("Group Name")){
+							attribute.setGroupName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("serviceList")  || dictSheet.get(0)[j].equalsIgnoreCase("Prefix List")){
+							attribute.setServiceList(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					addressGroupDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("ProtocolList")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					ProtocolList attribute = new ProtocolList("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("protocolName") || dictSheet.get(0)[j].equalsIgnoreCase("Protocol Name")){
+							attribute.setProtocolName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					protocolListDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("ActionList")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					ActionList attribute = new ActionList("",  userId);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("actionName") || dictSheet.get(0)[j].equalsIgnoreCase("Action Name")){
+							attribute.setActionName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+					}
+					actionListDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("TermList")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					TermList attribute = new TermList("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("termName") || dictSheet.get(0)[j].equalsIgnoreCase("Term-Name")){
+							attribute.setTermName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("Term-Description") || dictSheet.get(0)[j].equalsIgnoreCase("termDescription")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("fromZone")  || dictSheet.get(0)[j].equalsIgnoreCase("From Zone")){
+							attribute.setFromZones(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("toZone") || dictSheet.get(0)[j].equalsIgnoreCase("To Zone")){
+							attribute.setToZones(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("srcIPList") || dictSheet.get(0)[j].equalsIgnoreCase("Source-IP-List")){
+							attribute.setSrcIPList(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("destIPList") || dictSheet.get(0)[j].equalsIgnoreCase("Destination-IP-List")){
+							attribute.setDestIPList(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("srcPortList") || dictSheet.get(0)[j].equalsIgnoreCase("Source-Port-List")){
+							attribute.setSrcPortList(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("destPortList") || dictSheet.get(0)[j].equalsIgnoreCase("Destination-Port-List")){
+							attribute.setDestPortList(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("action") || dictSheet.get(0)[j].equalsIgnoreCase("Action List")){
+							attribute.setAction(rows[j]);
+						}
+					}
+					termListDao.Save(attribute);
+				}
+			}
+			if(item.getName().startsWith("SearchCriteria")){
+				for(int i = 1; i< dictSheet.size(); i++){
+					DescriptiveScope attribute = new DescriptiveScope("",  userId);
+					UserInfo userinfo = new UserInfo();
+					userinfo.setUserLoginId(userId);
+					attribute.setUserCreatedBy(userinfo);
+					attribute.setUserModifiedBy(userinfo);
+					String[] rows = dictSheet.get(i);
+					for (int j=0 ; j<rows.length; j++ ){
+						if(dictSheet.get(0)[j].equalsIgnoreCase("descriptiveScopeName") || dictSheet.get(0)[j].equalsIgnoreCase("Descriptive ScopeName")){
+							attribute.setScopeName(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("description")){
+							attribute.setDescription(rows[j]);
+						}
+						if(dictSheet.get(0)[j].equalsIgnoreCase("search") || dictSheet.get(0)[j].equalsIgnoreCase("Search Criteria")){
+							attribute.setSearch(rows[j]);
+						}
+					}
+					descriptiveScopeDao.Save(attribute);
+				}
+			}
+			csvReader.close();
+		}
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/EnforcerDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/EnforcerDictionaryController.java
new file mode 100644
index 0000000..7bdb376
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/EnforcerDictionaryController.java
@@ -0,0 +1,127 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.EnforcerPolicyDao;
+import org.openecomp.policy.rest.jpa.EnforcingType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class EnforcerDictionaryController {
+
+	@Autowired
+	EnforcerPolicyDao enforcerPolicyDao;
+
+	@RequestMapping(value={"/get_EnforcerTypeData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getEnforcerDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("enforcerDictionaryDatas", mapper.writeValueAsString(enforcerPolicyDao.getEnforcingTypeData()));
+			org.openecomp.policy.pap.xacml.rest.util.JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/enforcer_dictionary/save_enforcerType.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveEnforcerDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			EnforcingType enforcingType = (EnforcingType)mapper.readValue(root.get("enforcerDictionaryData").toString(), EnforcingType.class);
+			if(enforcingType.getId() == 0){
+				enforcerPolicyDao.Save(enforcingType);
+			}else{
+				enforcerPolicyDao.update(enforcingType); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = mapper.writeValueAsString(this.enforcerPolicyDao.getEnforcingTypeData());
+			JSONObject j = new JSONObject("{enforcerDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/enforcer_dictionary/remove_enforcer.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeEnforcerDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			EnforcingType enforcingType = (EnforcingType)mapper.readValue(root.get("data").toString(), EnforcingType.class);
+			enforcerPolicyDao.delete(enforcingType);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.enforcerPolicyDao.getEnforcingTypeData());
+			JSONObject j = new JSONObject("{enforcerDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/FirewallDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/FirewallDictionaryController.java
new file mode 100644
index 0000000..d2c3715
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/FirewallDictionaryController.java
@@ -0,0 +1,1578 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jboss.netty.handler.ipfilter.CIDR;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.adapters.GridData;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.ActionListDao;
+import org.openecomp.policy.rest.dao.AddressGroupDao;
+import org.openecomp.policy.rest.dao.FirewallDictionaryListDao;
+import org.openecomp.policy.rest.dao.PortListDao;
+import org.openecomp.policy.rest.dao.PrefixListDao;
+import org.openecomp.policy.rest.dao.ProtocolListDao;
+import org.openecomp.policy.rest.dao.SecurityZoneDao;
+import org.openecomp.policy.rest.dao.ServiceGroupDao;
+import org.openecomp.policy.rest.dao.ServiceListDao;
+import org.openecomp.policy.rest.dao.TermListDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.dao.ZoneDao;
+import org.openecomp.policy.rest.jpa.ActionList;
+import org.openecomp.policy.rest.jpa.AddressGroup;
+import org.openecomp.policy.rest.jpa.FirewallDictionaryList;
+import org.openecomp.policy.rest.jpa.GroupServiceList;
+import org.openecomp.policy.rest.jpa.PREFIXLIST;
+import org.openecomp.policy.rest.jpa.PortList;
+import org.openecomp.policy.rest.jpa.ProtocolList;
+import org.openecomp.policy.rest.jpa.SecurityZone;
+import org.openecomp.policy.rest.jpa.ServiceList;
+import org.openecomp.policy.rest.jpa.TermList;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.jpa.Zone;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+@Controller
+public class FirewallDictionaryController {
+
+	@Autowired
+	PrefixListDao prefixListDao;
+	
+	@Autowired
+	PortListDao portListDao;
+	
+	@Autowired
+	ProtocolListDao protocolListDao;
+	
+	@Autowired
+	AddressGroupDao addressGroupDao;
+	
+	@Autowired
+	ActionListDao actionListDao;
+	
+	@Autowired
+	SecurityZoneDao securityZoneDao;
+	
+	@Autowired
+	ServiceGroupDao serviceGroupDao;
+	
+	@Autowired
+	ServiceListDao serviceListDao;
+	
+	@Autowired
+	TermListDao termListDao;
+	
+	@Autowired
+	ZoneDao zoneDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	@Autowired
+	FirewallDictionaryListDao fwDictionaryListDao;
+	
+
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;		
+	}
+
+	@RequestMapping(value={"/get_PrefixListDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPrefixListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("prefixListDictionaryDatas", mapper.writeValueAsString(prefixListDao.getPrefixListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PrefixListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPrefixListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("prefixListDictionaryDatas", mapper.writeValueAsString(prefixListDao.getPREFIXLISTData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_prefixList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePrefixListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PREFIXLIST prefixList = (PREFIXLIST)mapper.readValue(root.get("prefixListDictionaryData").toString(), PREFIXLIST.class);
+			if(prefixList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(prefixList.getPrefixListName(), "prefixListName", PREFIXLIST.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					prefixListDao.Save(prefixList);
+				}		
+			}else{
+				prefixListDao.update(prefixList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.prefixListDao.getPREFIXLISTData());
+			}
+			JSONObject j = new JSONObject("{prefixListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_PrefixList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePrefixListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PREFIXLIST prefixList = (PREFIXLIST)mapper.readValue(root.get("data").toString(), PREFIXLIST.class);
+			prefixListDao.delete(prefixList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.prefixListDao.getPREFIXLISTData());
+			JSONObject j = new JSONObject("{prefixListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/validate_prefixList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView validatePrefixListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PREFIXLIST prefixList = (PREFIXLIST)mapper.readValue(root.get("prefixListDictionaryData").toString(), PREFIXLIST.class);
+			String responseValidation = "success";
+			 try{
+				 CIDR.newCIDR(prefixList.getPrefixListValue());
+			 }catch(UnknownHostException e){
+				 responseValidation = "error";
+				 //AdminNotification.warn("IP not according to CIDR notation");
+			 }		
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			JSONObject j = new JSONObject("{result: " + responseValidation + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_PortListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPortListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("portListDictionaryDatas", mapper.writeValueAsString(portListDao.getPortListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_portName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePortListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PortList portList = (PortList)mapper.readValue(root.get("portListDictionaryData").toString(), PortList.class);
+			if(portList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(portList.getPortName(), "portName", PortList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					portListDao.Save(portList);
+				}
+			}else{
+				portListDao.update(portList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.portListDao.getPortListData());
+			}
+			JSONObject j = new JSONObject("{portListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_PortList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePortListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PortList portList = (PortList)mapper.readValue(root.get("data").toString(), PortList.class);
+			portListDao.delete(portList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.portListDao.getPortListData());
+			JSONObject j = new JSONObject("{portListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_ProtocolListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getProtocolListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("protocolListDictionaryDatas", mapper.writeValueAsString(protocolListDao.getProtocolListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ProtocolListDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getProtocolListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("protocolListDictionaryDatas", mapper.writeValueAsString(protocolListDao.getProtocolListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_protocolList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveProtocolListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ProtocolList protocolList = (ProtocolList)mapper.readValue(root.get("protocolListDictionaryData").toString(), ProtocolList.class);
+			if(protocolList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(protocolList.getProtocolName(), "protocolName", ProtocolList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					protocolListDao.Save(protocolList);
+				}
+			}else{
+				protocolListDao.update(protocolList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.protocolListDao.getProtocolListData());
+			}
+			JSONObject j = new JSONObject("{protocolListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_protocol.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeProtocolListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ProtocolList protocolList = (ProtocolList)mapper.readValue(root.get("data").toString(), ProtocolList.class);
+			protocolListDao.delete(protocolList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.protocolListDao.getProtocolListData());
+			JSONObject j = new JSONObject("{protocolListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_AddressGroupDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getAddressGroupDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("addressGroupDictionaryDatas", mapper.writeValueAsString(addressGroupDao.getAddressGroupDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_AddressGroupData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getAddressGroupDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("addressGroupDictionaryDatas", mapper.writeValueAsString(addressGroupDao.getAddressGroupData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_addressGroup.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveAddressGroupDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			AddressGroup addressGroup = (AddressGroup)mapper.readValue(root.get("addressGroupDictionaryData").toString(), AddressGroup.class);
+			GridData gridData = (GridData)mapper.readValue(root.get("addressGroupDictionaryData").toString(), GridData.class);
+			if(!addressGroup.getGroupName().startsWith("Group_")){
+				String groupName = "Group_"+addressGroup.getGroupName();
+				addressGroup.setGroupName(groupName);
+			}
+			String userValue = "";
+			int counter = 0;
+			if(gridData.getAttributes().size() > 0){
+				for(Object attribute : gridData.getAttributes()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(counter>0){
+							userValue = userValue + ",";
+						}
+						userValue = userValue + key ;
+						counter ++;
+					}
+				}
+			}
+			addressGroup.setServiceList(userValue);
+			if(addressGroup.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(addressGroup.getGroupName(), "name", AddressGroup.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					addressGroupDao.Save(addressGroup);
+				}
+			}else{
+				addressGroupDao.update(addressGroup); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.addressGroupDao.getAddressGroupData());
+			}
+			JSONObject j = new JSONObject("{addressGroupDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_AddressGroup.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeAddressGroupDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			AddressGroup addressGroup = (AddressGroup)mapper.readValue(root.get("data").toString(), AddressGroup.class);
+			addressGroupDao.delete(addressGroup);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.addressGroupDao.getAddressGroupData());
+			JSONObject j = new JSONObject("{addressGroupDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_ActionListDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getActionListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("actionListDictionaryDatas", mapper.writeValueAsString(actionListDao.getActionListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ActionListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getActionListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("actionListDictionaryDatas", mapper.writeValueAsString(actionListDao.getActionListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_ActionList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveActionListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ActionList actionList = (ActionList)mapper.readValue(root.get("actionListDictionaryData").toString(), ActionList.class);
+			if(actionList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(actionList.getActionName(), "actionName", ActionList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					actionListDao.Save(actionList);
+				}
+			}else{
+				actionListDao.update(actionList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.actionListDao.getActionListData());
+			}
+			JSONObject j = new JSONObject("{actionListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_ActionList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeActionListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ActionList actionList = (ActionList)mapper.readValue(root.get("data").toString(), ActionList.class);
+			actionListDao.delete(actionList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.actionListDao.getActionListData());
+			JSONObject j = new JSONObject("{actionListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_ServiceGroupData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getServiceGroupDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("serviceGroupDictionaryDatas", mapper.writeValueAsString(serviceGroupDao.getGroupServiceListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ServiceGroupDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getServiceGroupDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("serviceGroupDictionaryDatas", mapper.writeValueAsString(serviceGroupDao.getGroupServiceDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_serviceGroup.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveServiceGroupDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			GroupServiceList groupServiceList = (GroupServiceList)mapper.readValue(root.get("serviceGroupDictionaryData").toString(), GroupServiceList.class);
+			GridData gridData = (GridData)mapper.readValue(root.get("serviceGroupDictionaryData").toString(), GridData.class);
+			if(!groupServiceList.getGroupName().startsWith("Group_")){
+				String groupName = "Group_"+groupServiceList.getGroupName();
+				groupServiceList.setGroupName(groupName);
+			}
+			String userValue = "";
+			int counter = 0;
+			if(gridData.getAttributes().size() > 0){
+				for(Object attribute : gridData.getAttributes()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(counter>0){
+							userValue = userValue + ",";
+						}
+						userValue = userValue + key ;
+						counter ++;
+					}
+				}
+			}
+			groupServiceList.setServiceList(userValue);
+			if(groupServiceList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(groupServiceList.getGroupName(), "name", GroupServiceList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					serviceGroupDao.Save(groupServiceList);
+				}
+			}else{
+				serviceGroupDao.update(groupServiceList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.serviceGroupDao.getGroupServiceListData());
+			}
+			JSONObject j = new JSONObject("{serviceGroupDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_serviceGroup.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeServiceGroupDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			GroupServiceList groupServiceList = (GroupServiceList)mapper.readValue(root.get("data").toString(), GroupServiceList.class);
+			serviceGroupDao.delete(groupServiceList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.serviceGroupDao.getGroupServiceListData());
+			JSONObject j = new JSONObject("{serviceGroupDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_SecurityZoneDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getSecurityZoneDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("securityZoneDictionaryDatas", mapper.writeValueAsString(securityZoneDao.getSecurityZoneDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_SecurityZoneData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getSecurityZoneDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("securityZoneDictionaryDatas", mapper.writeValueAsString(securityZoneDao.getSecurityZoneData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_securityZone.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveSecurityZoneDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			SecurityZone securityZone = (SecurityZone)mapper.readValue(root.get("securityZoneDictionaryData").toString(), SecurityZone.class);
+			if(securityZone.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(securityZone.getZoneName(), "zoneName", SecurityZone.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					securityZoneDao.Save(securityZone);
+				}			
+			}else{
+				securityZoneDao.update(securityZone); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.securityZoneDao.getSecurityZoneData());
+			}
+			JSONObject j = new JSONObject("{securityZoneDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_securityZone.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeSecurityZoneDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			SecurityZone securityZone = (SecurityZone)mapper.readValue(root.get("data").toString(), SecurityZone.class);
+			securityZoneDao.delete(securityZone);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.securityZoneDao.getSecurityZoneData());
+			JSONObject j = new JSONObject("{securityZoneDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	
+	@RequestMapping(value={"/get_ServiceListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getServiceListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("serviceListDictionaryDatas", mapper.writeValueAsString(serviceListDao.getServiceListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ServiceListDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getServiceListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("serviceListDictionaryDatas", mapper.writeValueAsString(serviceListDao.getServiceListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_serviceList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveServiceListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ServiceList serviceList = (ServiceList)mapper.readValue(root.get("serviceListDictionaryData").toString(), ServiceList.class);
+			GridData serviceListGridData = (GridData)mapper.readValue(root.get("serviceListDictionaryData").toString(), GridData.class);
+			String tcpValue = "";
+			int counter = 0;
+			if(serviceListGridData.getTransportProtocols().size() > 0){
+				for(Object attribute : serviceListGridData.getTransportProtocols()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(counter>0){
+							tcpValue = tcpValue + ",";
+						}
+						tcpValue = tcpValue + key ;
+						counter ++;
+					}
+				}
+			}
+			serviceList.setServiceTransProtocol(tcpValue);
+			String appValue = "";
+			int counter1 = 0;
+			if(serviceListGridData.getAppProtocols().size() > 0){
+				for(Object attribute : serviceListGridData.getAppProtocols()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(counter1>0){
+							appValue = appValue + ",";
+						}
+						appValue = appValue + key ;
+						counter1 ++;
+					}
+				}
+			}
+			serviceList.setServiceAppProtocol(appValue);
+			serviceList.setServiceType("SERVICE");
+			if(serviceList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(serviceList.getServiceName(), "serviceName", ServiceList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					serviceListDao.Save(serviceList);
+				}
+				
+			}else{
+				serviceListDao.update(serviceList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.serviceListDao.getServiceListData());
+			} 
+			JSONObject j = new JSONObject("{serviceListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_serviceList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeServiceListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			ServiceList serviceList = (ServiceList)mapper.readValue(root.get("data").toString(), ServiceList.class);
+			serviceListDao.delete(serviceList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.serviceListDao.getServiceListData());
+			JSONObject j = new JSONObject("{serviceListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_ZoneData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getZoneDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("zoneDictionaryDatas", mapper.writeValueAsString(zoneDao.getZoneData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_ZoneDictionaryDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getZoneDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("zoneDictionaryDatas", mapper.writeValueAsString(zoneDao.getZoneDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_zoneName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveZoneDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			Zone zone = (Zone)mapper.readValue(root.get("zoneDictionaryData").toString(), Zone.class);
+			if(zone.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(zone.getZoneName(), "zoneName", Zone.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					zoneDao.Save(zone);
+				}	
+			}else{
+				zoneDao.update(zone); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.zoneDao.getZoneData());
+			}
+			JSONObject j = new JSONObject("{zoneDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_zone.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeZoneDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			Zone zone = (Zone)mapper.readValue(root.get("data").toString(), Zone.class);
+			zoneDao.delete(zone);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.zoneDao.getZoneData());
+			JSONObject j = new JSONObject("{zoneDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_TermListDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getTermListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("termListDictionaryDatas", mapper.writeValueAsString(termListDao.getTermListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_TermListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getTermListDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("termListDictionaryDatas", mapper.writeValueAsString(termListDao.getTermListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_termList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveTermListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			TermList termList = (TermList)mapper.readValue(root.get("termListDictionaryData").toString(), TermList.class);
+			TermListData termListDatas = (TermListData)mapper.readValue(root.get("termListDictionaryData").toString(), TermListData.class);
+			String userId = root.get("loginId").textValue();
+			String fromZoneValue = "";
+			int counter = 0;
+			if(termListDatas.getFromZoneDatas().size() > 0){
+				for(Object fromZone : termListDatas.getFromZoneDatas()){
+					if(fromZone instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) fromZone).get("option").toString();
+						if(counter>0){
+							fromZoneValue = fromZoneValue + ",";
+						}
+						fromZoneValue = fromZoneValue + key ;
+						counter ++;
+					}
+				}
+			}
+			termList.setFromZones(fromZoneValue);
+			
+			String toZoneValue = "";
+			int toZonecounter = 0;
+			if(termListDatas.getToZoneDatas().size() > 0){
+				for(Object toZone : termListDatas.getToZoneDatas()){
+					if(toZone instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) toZone).get("option").toString();
+						if(toZonecounter>0){
+							toZoneValue = toZoneValue + ",";
+						}
+						toZoneValue = toZoneValue + key ;
+						toZonecounter ++;
+					}
+				}
+			}
+			termList.setToZones(toZoneValue);
+			
+			String srcListValues = "";
+			int srcListcounter = 0;
+			if(termListDatas.getSourceListDatas().size() > 0){
+				for(Object srcList : termListDatas.getSourceListDatas()){
+					if(srcList instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) srcList).get("option").toString();
+						if(srcListcounter>0){
+							srcListValues = srcListValues + ",";
+						}
+						srcListValues = srcListValues + key ;
+						srcListcounter ++;
+					}
+				}
+			}
+			termList.setSrcIPList(srcListValues);
+			
+			String desListValues = "";
+			int destListcounter = 0;
+			if(termListDatas.getDestinationListDatas().size() > 0){
+				for(Object desList : termListDatas.getDestinationListDatas()){
+					if(desList instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) desList).get("option").toString();
+						if(destListcounter>0){
+							desListValues = desListValues + ",";
+						}
+						desListValues = desListValues + key ;
+						destListcounter ++;
+					}
+				}
+			}
+			termList.setDestIPList(desListValues);
+			
+			String srcSerValue = "";
+			int srcSercounter = 0;
+			if(termListDatas.getSourceServiceDatas().size() > 0){
+				for(Object srcSrc : termListDatas.getSourceServiceDatas()){
+					if(srcSrc instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) srcSrc).get("option").toString();
+						if(srcSercounter>0){
+							srcSerValue = srcSerValue + ",";
+						}
+						srcSerValue = srcSerValue + key ;
+						srcSercounter ++;
+					}
+				}
+			}
+			termList.setSrcPortList(srcSerValue);
+			
+			String desSrcValue = "";
+			int desSrccounter = 0;
+			if(termListDatas.getDestinationServiceDatas().size() > 0){
+				for(Object desSrc : termListDatas.getDestinationServiceDatas()){
+					if(desSrc instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) desSrc).get("option").toString();
+						if(desSrccounter>0){
+							desSrcValue = desSrcValue + ",";
+						}
+						desSrcValue = desSrcValue + key ;
+						desSrccounter ++;
+					}
+				}
+			}
+			termList.setDestPortList(desSrcValue);
+			
+			String actionValue = "";
+			int actioncounter = 0;
+			if(termListDatas.getActionListDatas().size() > 0){
+				for(Object actionList : termListDatas.getActionListDatas()){
+					if(actionList instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) actionList).get("option").toString();
+						if(actioncounter>0){
+							actionValue = actionValue + ",";
+						}
+						actionValue = actionValue + key ;
+						actioncounter ++;
+					}
+				}
+			}
+			termList.setAction(actionValue);
+			
+			if(termList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(termList.getTermName(), "termName", TermList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					termList.setUserCreatedBy(this.getUserInfo(userId));
+					termList.setUserModifiedBy(this.getUserInfo(userId));
+					termListDao.Save(termList);
+				}
+			}else{
+				termList.setUserModifiedBy(this.getUserInfo(userId));
+				termListDao.update(termList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.termListDao.getTermListData());
+			}
+			JSONObject j = new JSONObject("{termListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_termList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeTermListDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			TermList termList = (TermList)mapper.readValue(root.get("data").toString(), TermList.class);
+			termListDao.delete(termList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.termListDao.getTermListData());
+			JSONObject j = new JSONObject("{termListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	//ParentList Dictionary Data
+	@RequestMapping(value={"/get_FWDictionaryListDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getFWDictListDictionaryEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("fwDictListDictionaryDatas", mapper.writeValueAsString(fwDictionaryListDao.getFWDictionaryListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_FWDictionaryListData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getFWDictionaryListEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("fwDictListDictionaryDatas", mapper.writeValueAsString(fwDictionaryListDao.getFWDictionaryListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/fw_dictionary/save_FWDictionaryList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveFWDictionaryList(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			FirewallDictionaryList fwDictList = (FirewallDictionaryList)mapper.readValue(root.get("fwDictListDictionaryData").toString(), FirewallDictionaryList.class);
+			GridData gridData = (GridData)mapper.readValue(root.get("fwDictListDictionaryData").toString(), GridData.class);
+			String userSLValue = "";
+			int slcounter = 0;
+			if(gridData.getAttributes().size() > 0){
+				for(Object attribute : gridData.getAttributes()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(slcounter>0){
+							userSLValue = userSLValue + ",";
+						}
+						userSLValue = userSLValue + key ;
+						slcounter ++;
+					}
+				}
+			}
+			fwDictList.setServiceList(userSLValue);
+			String userALValue = "";
+			int alcounter = 0;
+			if(gridData.getAlAttributes().size() > 0){
+				for(Object attribute : gridData.getAlAttributes()){
+					if(attribute instanceof LinkedHashMap<?, ?>){
+						String key = ((LinkedHashMap<?, ?>) attribute).get("option").toString();
+						if(alcounter>0){
+							userALValue = userALValue + ",";
+						}
+						userALValue = userALValue + key ;
+						alcounter ++;
+					}
+				}
+			}
+			fwDictList.setAddressList(userALValue);
+			if(fwDictList.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(fwDictList.getParentItemName(), "parentItemName", FirewallDictionaryList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					fwDictionaryListDao.Save(fwDictList);
+				}
+			}else{
+				fwDictionaryListDao.update(fwDictList); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.fwDictionaryListDao.getFWDictionaryListData());
+			}
+			JSONObject j = new JSONObject("{fwDictListDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/fw_dictionary/remove_FWDictionaryList.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeFWDictionaryListy(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			FirewallDictionaryList fwDictList = (FirewallDictionaryList)mapper.readValue(root.get("data").toString(), FirewallDictionaryList.class);
+			fwDictionaryListDao.delete(fwDictList);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.fwDictionaryListDao.getFWDictionaryListData());
+			JSONObject j = new JSONObject("{fwDictListDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+}
+
+class AGGridData{
+	private ArrayList<Object> attributes;
+
+	public ArrayList<Object> getAttributes() {
+		return attributes;
+	}
+
+	public void setAttributes(ArrayList<Object> attributes) {
+		this.attributes = attributes;
+	}
+}
+
+class TermListData{
+	private ArrayList<Object> fromZoneDatas;
+	private ArrayList<Object> toZoneDatas;
+	private ArrayList<Object> sourceListDatas;
+	private ArrayList<Object> destinationListDatas;
+	private ArrayList<Object> sourceServiceDatas;
+	private ArrayList<Object> destinationServiceDatas;
+	private ArrayList<Object> actionListDatas;
+	public ArrayList<Object> getFromZoneDatas() {
+		return fromZoneDatas;
+	}
+	public void setFromZoneDatas(ArrayList<Object> fromZoneDatas) {
+		this.fromZoneDatas = fromZoneDatas;
+	}
+	public ArrayList<Object> getToZoneDatas() {
+		return toZoneDatas;
+	}
+	public void setToZoneDatas(ArrayList<Object> toZoneDatas) {
+		this.toZoneDatas = toZoneDatas;
+	}
+	public ArrayList<Object> getSourceListDatas() {
+		return sourceListDatas;
+	}
+	public void setSourceListDatas(ArrayList<Object> sourceListDatas) {
+		this.sourceListDatas = sourceListDatas;
+	}
+	public ArrayList<Object> getDestinationListDatas() {
+		return destinationListDatas;
+	}
+	public void setDestinationListDatas(ArrayList<Object> destinationListDatas) {
+		this.destinationListDatas = destinationListDatas;
+	}
+	public ArrayList<Object> getSourceServiceDatas() {
+		return sourceServiceDatas;
+	}
+	public void setSourceServiceDatas(ArrayList<Object> sourceServiceDatas) {
+		this.sourceServiceDatas = sourceServiceDatas;
+	}
+	public ArrayList<Object> getDestinationServiceDatas() {
+		return destinationServiceDatas;
+	}
+	public void setDestinationServiceDatas(ArrayList<Object> destinationServiceDatas) {
+		this.destinationServiceDatas = destinationServiceDatas;
+	}
+	public ArrayList<Object> getActionListDatas() {
+		return actionListDatas;
+	}
+	public void setActionListDatas(ArrayList<Object> actionListDatas) {
+		this.actionListDatas = actionListDatas;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/MicroServiceDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/MicroServiceDictionaryController.java
new file mode 100644
index 0000000..c3329db
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/MicroServiceDictionaryController.java
@@ -0,0 +1,718 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.DCAEUUIDDao;
+import org.openecomp.policy.rest.dao.MicroServiceConfigNameDao;
+import org.openecomp.policy.rest.dao.MicroServiceLocationDao;
+import org.openecomp.policy.rest.dao.MicroServiceModelsDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.DCAEuuid;
+import org.openecomp.policy.rest.jpa.MicroServiceConfigName;
+import org.openecomp.policy.rest.jpa.MicroServiceLocation;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.util.MSAttributeObject;
+import org.openecomp.policy.rest.util.MSModelUtitils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class MicroServiceDictionaryController {
+	private static final Log logger	= LogFactory.getLog(MicroServiceDictionaryController.class);
+
+	@Autowired
+	MicroServiceConfigNameDao microServiceConfigNameDao;
+	
+	@Autowired
+	MicroServiceLocationDao microServiceLocationDao;
+	
+	@Autowired
+	MicroServiceModelsDao microServiceModelsDao;
+	
+	@Autowired
+	DCAEUUIDDao dcaeUUIDDao;
+	
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+
+	private String newFile;
+	private String directory;
+	private List<String> dirDependencyList = new ArrayList<String>();
+	private HashMap<String,MSAttributeObject > classMap = new HashMap<String,MSAttributeObject>();
+	MSModelUtitils utils = new MSModelUtitils();
+	private MicroServiceModels newModel;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+	
+	@RequestMapping(value={"/get_DCAEUUIDDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getDCAEUUIDDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("dcaeUUIDDictionaryDatas", mapper.writeValueAsString(dcaeUUIDDao.getDCAEuuidDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping(value={"/get_DCAEUUIDData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getDCAEUUIDDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("dcaeUUIDDictionaryDatas", mapper.writeValueAsString(dcaeUUIDDao.getDCAEuuidData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ms_dictionary/save_dcaeUUID.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveDCAEUUIDDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DCAEuuid dCAEuuid = (DCAEuuid)mapper.readValue(root.get("dcaeUUIDDictionaryData").toString(), DCAEuuid.class);
+			if(dCAEuuid.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(dCAEuuid.getName(), "name", DCAEuuid.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					dcaeUUIDDao.Save(dCAEuuid);
+				}
+			}else{
+				dcaeUUIDDao.update(dCAEuuid); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.dcaeUUIDDao.getDCAEuuidData());
+			} 
+			JSONObject j = new JSONObject("{dcaeUUIDDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ms_dictionary/remove_dcaeuuid.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeDCAEUUIDDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			DCAEuuid dCAEuuid = (DCAEuuid)mapper.readValue(root.get("data").toString(), DCAEuuid.class);
+			dcaeUUIDDao.delete(dCAEuuid);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.dcaeUUIDDao.getDCAEuuidData());
+			JSONObject j = new JSONObject("{dcaeUUIDDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	
+	@RequestMapping(value={"/get_MicroServiceConfigNameDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceConfigNameByNameDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceCongigNameDictionaryDatas", mapper.writeValueAsString(microServiceConfigNameDao.getMSConfigDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	
+	
+	@RequestMapping(value={"/get_MicroServiceConfigNameData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceConfigNameDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceCongigNameDictionaryDatas", mapper.writeValueAsString(microServiceConfigNameDao.getMicroServiceConfigNameData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ms_dictionary/save_configName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveMicroServiceConfigNameDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceConfigName microServiceConfigName = (MicroServiceConfigName)mapper.readValue(root.get("microServiceCongigNameDictionaryData").toString(), MicroServiceConfigName.class);
+			if(microServiceConfigName.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(microServiceConfigName.getName(), "name", MicroServiceConfigName.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					microServiceConfigNameDao.Save(microServiceConfigName);
+				}
+			}else{
+				microServiceConfigNameDao.update(microServiceConfigName); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.microServiceConfigNameDao.getMicroServiceConfigNameData());
+			}
+			JSONObject j = new JSONObject("{microServiceCongigNameDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ms_dictionary/remove_msConfigName.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeMicroServiceConfigNameDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceConfigName microServiceConfigName = (MicroServiceConfigName)mapper.readValue(root.get("data").toString(), MicroServiceConfigName.class);
+			microServiceConfigNameDao.delete(microServiceConfigName);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.microServiceConfigNameDao.getMicroServiceConfigNameData());
+			JSONObject j = new JSONObject("{microServiceCongigNameDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_MicroServiceLocationDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceLocationByNameDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceLocationDictionaryDatas", mapper.writeValueAsString(microServiceLocationDao.getMSLocationDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_MicroServiceLocationData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceLocationDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceLocationDictionaryDatas", mapper.writeValueAsString(microServiceLocationDao.getMicroServiceLocationData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ms_dictionary/save_location.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveMicroServiceLocationDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceLocation microServiceLocation = (MicroServiceLocation)mapper.readValue(root.get("microServiceLocationDictionaryData").toString(), MicroServiceLocation.class);
+			if(microServiceLocation.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(microServiceLocation.getName(), "name", MicroServiceLocation.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					microServiceLocationDao.Save(microServiceLocation);
+				}
+			}else{
+				microServiceLocationDao.update(microServiceLocation); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.microServiceLocationDao.getMicroServiceLocationData());
+			}
+			JSONObject j = new JSONObject("{microServiceLocationDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ms_dictionary/remove_msLocation.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeMicroServiceLocationDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceLocation microServiceLocation = (MicroServiceLocation)mapper.readValue(root.get("data").toString(), MicroServiceLocation.class);
+			microServiceLocationDao.delete(microServiceLocation);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.microServiceLocationDao.getMicroServiceLocationData());
+			JSONObject j = new JSONObject("{microServiceLocationDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_MicroServiceModelsDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceModelsDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceModelsDictionaryDatas", mapper.writeValueAsString(microServiceModelsDao.getMSModelsDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_MicroServiceModelsData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getMicroServiceModelsDictionaryEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("microServiceModelsDictionaryDatas", mapper.writeValueAsString(microServiceModelsDao.getMicroServiceModelsData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ms_dictionary/save_model.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView saveMicroServiceModelsDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceModels microServiceModels = (MicroServiceModels)mapper.readValue(root.get("microServiceModelsDictionaryData").toString(), MicroServiceModels.class);
+			String userId = root.get("loginId").textValue();
+			microServiceModels.setAttributes(this.newModel.getAttributes());
+			microServiceModels.setRef_attributes(this.newModel.getRef_attributes());
+			microServiceModels.setDependency(this.newModel.getDependency());
+			microServiceModels.setModelName(this.newModel.getModelName());
+			microServiceModels.setSub_attributes(this.newModel.getSub_attributes());
+			microServiceModels.setVersion(this.newModel.getVersion());
+			if(microServiceModels.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(microServiceModels.getModelName(), "modelName", MicroServiceModels.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					microServiceModels.setUserCreatedBy(this.getUserInfo(userId));
+					microServiceModelsDao.Save(microServiceModels);
+				}
+			}else{
+				microServiceModelsDao.update(microServiceModels); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.microServiceModelsDao.getMicroServiceModelsData());
+			} 
+			JSONObject j = new JSONObject("{microServiceModelsDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ms_dictionary/remove_msModel.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removeMicroServiceModelsDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			MicroServiceModels microServiceModels = (MicroServiceModels)mapper.readValue(root.get("data").toString(), MicroServiceModels.class);
+			microServiceModelsDao.delete(microServiceModels);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.microServiceModelsDao.getMicroServiceModelsData());
+			JSONObject j = new JSONObject("{microServiceModelsDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/ms_dictionary/set_MSModelData.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public void SetRuleData(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
+		for (FileItem item : items) {
+			if(item.getName().endsWith(".zip")){
+				this.newModel = new MicroServiceModels();
+				try{
+					File file = new File(item.getName());
+					OutputStream outputStream = new FileOutputStream(file);
+					IOUtils.copy(item.getInputStream(), outputStream);
+					outputStream.close();
+					this.newFile = file.toString();
+					this.newModel.setModelName(this.newFile.toString().split("-v")[0]);
+					if (this.newFile.toString().contains("-v")){
+						this.newModel.setVersion(this.newFile.toString().split("-v")[1].replace(".zip", ""));
+					}
+				}catch(Exception e){
+					logger.error("Upload error : " + e);
+				}
+			}
+		}
+		extractFolder(this.newFile);
+		List<File> fileList = listModelFiles(this.directory);
+		
+		File folder = new File(this.directory);
+		File[] test = folder.listFiles();
+		
+		//Process Main Model file first
+		String ignoreFile = null;
+		for (File file : test) {
+			if(!file.isDirectory() && file.getName().endsWith(".xmi")){
+            	retreiveDependency(file.toString(), true);
+            	ignoreFile = file.toString();
+            }	
+		}
+		
+		for(File tempFile: fileList){
+			if (!tempFile.toString().contains(ignoreFile)){
+				retreiveDependency(tempFile.toString(), false);
+			}
+		}
+		
+		addValuesToNewModel();
+		
+		File deleteFile = new File(this.newFile);
+		deleteFile.delete();
+	}
+	
+	private void addValuesToNewModel() {
+		//Loop  through the classmap and pull out the required info for the new file.
+		MSAttributeObject mainClass  = null;
+		ArrayList<String> dependency = null;
+		String subAttribute = null;
+		
+		mainClass = classMap.get(this.newModel.getModelName());
+		
+		if (mainClass !=null){
+			String dependTemp = StringUtils.replaceEach(mainClass.getDependency(), new String[]{"[", "]", " "}, new String[]{"", "", ""});
+			dependency = new ArrayList<String>(Arrays.asList(dependTemp.split(",")));	
+			dependency = getFullDependencyList(dependency);
+			for (String element : dependency){
+				MSAttributeObject temp = new MSAttributeObject();
+				temp = classMap.get(element);
+				if (temp!=null){
+					mainClass.addAllRefAttribute(temp.getRefAttribute());
+					mainClass.addAllAttribute(temp.getAttribute());
+				}
+			}
+			subAttribute = utils.createSubAttributes(dependency, classMap, this.newModel.getModelName());
+		}else{
+			subAttribute = "{}";
+			this.newModel.setDependency("");
+		}
+
+		if (mainClass.getDependency()==null){
+			mainClass.setDependency("");
+		}
+
+		this.newModel.setDependency(mainClass.getDependency());
+		this.newModel.setSub_attributes(subAttribute.toString());
+		this.newModel.setAttributes(mainClass.getAttribute().toString().replace("{", "").replace("}", ""));
+		this.newModel.setRef_attributes(mainClass.getRefAttribute().toString().replace("{", "").replace("}", ""));
+	
+	} 
+	
+	private ArrayList<String> getFullDependencyList(ArrayList<String> dependency) {
+		ArrayList<String> returnList = new ArrayList<String>();
+		ArrayList<String> workingList = new ArrayList<String>();
+		returnList.addAll(dependency);
+		for (String element : dependency ){
+			if (classMap.containsKey(element)){
+				MSAttributeObject value = classMap.get(element);			
+				String rawValue = StringUtils.replaceEach(value.getDependency(), new String[]{"[", "]"}, new String[]{"", ""});
+				workingList = new ArrayList<String>(Arrays.asList(rawValue.split(",")));	
+				for(String depend : workingList){
+					if (!returnList.contains(depend) && !depend.isEmpty()){
+						returnList.add(depend.trim());
+						//getFullDepedency(workingList)
+					}
+				}
+			}
+		}
+		
+		return returnList;
+	}
+
+	
+	/*
+	 * Unzip file and store in the model directory for processing
+	 */
+	@SuppressWarnings("rawtypes")
+	private void extractFolder(String zipFile )  {
+	    int BUFFER = 2048;
+	    File file = new File(zipFile);
+
+	    ZipFile zip;
+		try {
+			zip = new ZipFile(file);
+		    String newPath =  "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+		    this.directory = "model" + File.separator + zipFile.substring(0, zipFile.length() - 4);
+		    new File(newPath).mkdir();
+		    Enumeration zipFileEntries = zip.entries();
+	
+		    // Process each entry
+		    while (zipFileEntries.hasMoreElements()){
+		        // grab a zip file entry
+		        ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
+		        String currentEntry = entry.getName();
+		        File destFile = new File("model" + File.separator + currentEntry);
+		        File destinationParent = destFile.getParentFile();
+		        
+		        destinationParent.mkdirs();
+	
+		        if (!entry.isDirectory()){
+		            BufferedInputStream is = new BufferedInputStream(zip.getInputStream(entry));
+		            int currentByte;
+		            byte data[] = new byte[BUFFER];
+		            FileOutputStream fos = new FileOutputStream(destFile);
+		            BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);
+		            while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
+		                dest.write(data, 0, currentByte);
+		            }
+		            dest.flush();
+		            dest.close();
+		            is.close();
+		        }
+	
+		        if (currentEntry.endsWith(".zip")){
+		            extractFolder(destFile.getAbsolutePath());
+		        }
+		    }
+	    } catch (IOException e) {
+			logger.error("Failed to unzip model file " + zipFile);
+		}
+	}
+	
+	private void retreiveDependency(String workingFile, Boolean modelClass) {
+		
+		MSModelUtitils utils = new MSModelUtitils();
+	    HashMap<String, MSAttributeObject> tempMap = new HashMap<String, MSAttributeObject>();
+	    
+	    tempMap = utils.processEpackage(workingFile);
+	    
+	    classMap.putAll(tempMap);
+	    System.out.println(tempMap);
+	    
+	    return;   	}
+		
+	private List<File> listModelFiles(String directoryName) {
+		File directory = new File(directoryName);
+		List<File> resultList = new ArrayList<File>();
+		File[] fList = directory.listFiles();
+		for (File file : fList) {
+			if (file.isFile()) {
+				resultList.add(file);
+			} else if (file.isDirectory()) {
+				dirDependencyList.add(file.getName());
+				resultList.addAll(listModelFiles(file.getAbsolutePath()));
+			}
+		}
+		return resultList;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PolicyScopeDictionaryController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PolicyScopeDictionaryController.java
new file mode 100644
index 0000000..b8803d7
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/PolicyScopeDictionaryController.java
@@ -0,0 +1,667 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.GroupPolicyScopeListDao;
+import org.openecomp.policy.rest.dao.PolicyScopeClosedLoopDao;
+import org.openecomp.policy.rest.dao.PolicyScopeResourceDao;
+import org.openecomp.policy.rest.dao.PolicyScopeServiceDao;
+import org.openecomp.policy.rest.dao.PolicyScopeTypeDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.GroupPolicyScopeList;
+import org.openecomp.policy.rest.jpa.PolicyScopeClosedLoop;
+import org.openecomp.policy.rest.jpa.PolicyScopeResource;
+import org.openecomp.policy.rest.jpa.PolicyScopeService;
+import org.openecomp.policy.rest.jpa.PolicyScopeType;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class PolicyScopeDictionaryController {
+
+	@Autowired
+	GroupPolicyScopeListDao groupPolicyScopeListDao;
+	
+	@Autowired
+	PolicyScopeClosedLoopDao  policyScopeClosedLoopDao;
+	
+	@Autowired
+	PolicyScopeResourceDao PolicyScopeResourceDao;
+	
+	@Autowired
+	PolicyScopeTypeDao policyScopeTypeDao;
+	
+	@Autowired
+	PolicyScopeServiceDao policyScopeServiceDao;
+	
+
+	@Autowired
+	UserInfoDao userInfoDao;
+	
+	public UserInfo getUserInfo(String loginId){
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;	
+	}
+	
+	@RequestMapping(value={"/get_GroupPolicyScopeDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getGroupPolicyScopeEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("groupPolicyScopeListDatas", mapper.writeValueAsString(groupPolicyScopeListDao.getGroupPolicyScopeListDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_GroupPolicyScopeData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getGroupPolicyScopeEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("groupPolicyScopeListDatas", mapper.writeValueAsString(groupPolicyScopeListDao.getGroupPolicyScopeListData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ps_dictionary/save_psGroupPolicyScope.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePSGroupScopeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			GroupPolicyScopeList ecompData = (GroupPolicyScopeList)mapper.readValue(root.get("groupPolicyScopeListData").toString(), GroupPolicyScopeList.class);
+			GroupPolicyScope groupData = null;
+			try{
+				 groupData = (GroupPolicyScope)mapper.readValue(root.get("groupPolicyScopeListData1").toString(), GroupPolicyScope.class);
+			}catch(Exception e){
+				groupData = new GroupPolicyScope();
+				groupData.setResource(root.get("groupPolicyScopeListData1").get("resource").toString().replace("\"", ""));
+				groupData.setClosedloop(root.get("groupPolicyScopeListData1").get("closedloop").toString().replace("\"", ""));
+				groupData.setService(root.get("groupPolicyScopeListData1").get("service").toString().replace("\"", ""));
+				groupData.setType(root.get("groupPolicyScopeListData1").get("type").toString().replace("\"", ""));
+			}
+			
+			ArrayList<String> valueList = new ArrayList<String>();
+			String list = null;
+			String resourceValue = groupData.getResource();
+			String typeValue = groupData.getType();
+			String serviceValue = groupData.getService();
+			String closedLoopValue = groupData.getClosedloop();
+			valueList.add("resource=" + resourceValue);
+			valueList.add("service=" + serviceValue);
+			valueList.add("type=" + typeValue);
+			valueList.add("closedLoopControlName="  + closedLoopValue);
+			list = StringUtils.replaceEach(valueList.toString(), new String[]{"[", "]", " "}, new String[]{"", "", ""});
+			ecompData.setGroupList(list);
+			if(!ecompData.getGroupName().startsWith("PolicyScope")){
+				String name = "PolicyScope_" + ecompData.getGroupName();
+				ecompData.setGroupName(name);
+			}
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getGroupName(), "name", GroupPolicyScopeList.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					groupPolicyScopeListDao.Save(ecompData);
+				}
+			}else{
+				groupPolicyScopeListDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.groupPolicyScopeListDao.getGroupPolicyScopeListData());
+			}
+			JSONObject j = new JSONObject("{groupPolicyScopeListDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ps_dictionary/remove_GroupPolicyScope.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePSGroupScopeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			GroupPolicyScopeList ecompData = (GroupPolicyScopeList)mapper.readValue(root.get("data").toString(), GroupPolicyScopeList.class);
+			groupPolicyScopeListDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.groupPolicyScopeListDao.getGroupPolicyScopeListData());
+			JSONObject j = new JSONObject("{groupPolicyScopeListDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_PSClosedLoopDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSClosedLoopEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psClosedLoopDictionaryDatas", mapper.writeValueAsString(policyScopeClosedLoopDao.getPolicyScopeClosedLoopDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PSClosedLoopData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSClosedLoopEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psClosedLoopDictionaryDatas", mapper.writeValueAsString(policyScopeClosedLoopDao.getPolicyScopeClosedLoopData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ps_dictionary/save_psClosedLoop.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePSClosedLoopDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeClosedLoop ecompData = (PolicyScopeClosedLoop)mapper.readValue(root.get("psClosedLoopDictionaryData").toString(), PolicyScopeClosedLoop.class);
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getName(), "name", PolicyScopeClosedLoop.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					policyScopeClosedLoopDao.Save(ecompData);
+				}
+			}else{
+				policyScopeClosedLoopDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.policyScopeClosedLoopDao.getPolicyScopeClosedLoopData());
+			}	 
+			JSONObject j = new JSONObject("{psClosedLoopDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ps_dictionary/remove_PSClosedLoop.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePSClosedLoopDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeClosedLoop ecompData = (PolicyScopeClosedLoop)mapper.readValue(root.get("data").toString(), PolicyScopeClosedLoop.class);
+			policyScopeClosedLoopDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.policyScopeClosedLoopDao.getPolicyScopeClosedLoopData());
+			JSONObject j = new JSONObject("{psClosedLoopDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_PSServiceDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSServiceEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psServiceDictionaryDatas", mapper.writeValueAsString(policyScopeServiceDao.getPolicyScopeServiceDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PSServiceData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSServiceEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psServiceDictionaryDatas", mapper.writeValueAsString(policyScopeServiceDao.getPolicyScopeServiceData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ps_dictionary/save_psService.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePSServiceDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeService ecompData = (PolicyScopeService)mapper.readValue(root.get("psServiceDictionaryData").toString(), PolicyScopeService.class);
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getName(), "name", PolicyScopeService.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					policyScopeServiceDao.Save(ecompData);
+				}
+			}else{
+				policyScopeServiceDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.policyScopeServiceDao.getPolicyScopeServiceData());
+			}	
+			JSONObject j = new JSONObject("{psServiceDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ps_dictionary/remove_PSService.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePSServiceDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeService ecompData = (PolicyScopeService)mapper.readValue(root.get("data").toString(), PolicyScopeService.class);
+			policyScopeServiceDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.policyScopeServiceDao.getPolicyScopeServiceData());
+			JSONObject j = new JSONObject("{psServiceDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_PSTypeDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSTypeEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psTypeDictionaryDatas", mapper.writeValueAsString(policyScopeTypeDao.getPolicyScopeTypeDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PSTypeData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSTypeEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psTypeDictionaryDatas", mapper.writeValueAsString(policyScopeTypeDao.getPolicyScopeTypeData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ps_dictionary/save_psType.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePSTypeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeType ecompData = (PolicyScopeType)mapper.readValue(root.get("psTypeDictionaryData").toString(), PolicyScopeType.class);
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getName(), "name", PolicyScopeType.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					policyScopeTypeDao.Save(ecompData);
+				}
+			}else{
+				policyScopeTypeDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.policyScopeTypeDao.getPolicyScopeTypeData());
+			} 
+			JSONObject j = new JSONObject("{psTypeDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ps_dictionary/remove_PSType.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePSTypeDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeType ecompData = (PolicyScopeType)mapper.readValue(root.get("data").toString(), PolicyScopeType.class);
+			policyScopeTypeDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.policyScopeTypeDao.getPolicyScopeTypeData());
+			JSONObject j = new JSONObject("{psTypeDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+	
+	@RequestMapping(value={"/get_PSResourceDataByName"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSResourceEntityDataByName(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psResourceDictionaryDatas", mapper.writeValueAsString(PolicyScopeResourceDao.getPolicyScopeResourceDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/get_PSResourceData"}, method={org.springframework.web.bind.annotation.RequestMethod.GET} , produces=MediaType.APPLICATION_JSON_VALUE)
+	public void getPSResourceEntityData(HttpServletRequest request, HttpServletResponse response){
+		try{
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("psResourceDictionaryDatas", mapper.writeValueAsString(PolicyScopeResourceDao.getPolicyScopeResourceData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		}
+		catch (Exception e){
+			e.printStackTrace();
+		}
+	}
+	
+	@RequestMapping(value={"/ps_dictionary/save_psResource.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView savePSResourceDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception{
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeResource ecompData = (PolicyScopeResource)mapper.readValue(root.get("psResourceDictionaryData").toString(), PolicyScopeResource.class);
+			if(ecompData.getId() == 0){
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(ecompData.getName(), "name", PolicyScopeResource.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					PolicyScopeResourceDao.Save(ecompData);
+				}
+			}else{
+				PolicyScopeResourceDao.update(ecompData); 
+			} 
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.PolicyScopeResourceDao.getPolicyScopeResourceData());
+			}	  
+			JSONObject j = new JSONObject("{psResourceDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value={"/ps_dictionary/remove_PSResource.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST})
+	public ModelAndView removePSResourceDictionary(HttpServletRequest request, HttpServletResponse response) throws Exception {
+		try{
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			PolicyScopeResource ecompData = (PolicyScopeResource)mapper.readValue(root.get("data").toString(), PolicyScopeResource.class);
+			PolicyScopeResourceDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.PolicyScopeResourceDao.getPolicyScopeResourceData());
+			JSONObject j = new JSONObject("{psResourceDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		}
+		catch (Exception e){
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+}
+
+	class GroupPolicyScope{
+	String resource;
+	String type;
+	String service;
+	String closedloop;
+	public String getResource() {
+		return resource;
+	}
+	public void setResource(String resource) {
+		this.resource = resource;
+	}
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getService() {
+		return service;
+	}
+	public void setService(String service) {
+		this.service = service;
+	}
+	public String getClosedloop() {
+		return closedloop;
+	}
+	public void setClosedloop(String closedloop) {
+		this.closedloop = closedloop;
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/SafePolicyController.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/SafePolicyController.java
new file mode 100644
index 0000000..5ee72f4
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/SafePolicyController.java
@@ -0,0 +1,319 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.controller;
+
+import java.io.PrintWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.JSONObject;
+import org.openecomp.policy.pap.xacml.rest.util.JsonMessage;
+import org.openecomp.policy.rest.dao.CategoryDao;
+import org.openecomp.policy.rest.dao.RiskTypeDao;
+import org.openecomp.policy.rest.dao.SafePolicyWarningDao;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.Category;
+import org.openecomp.policy.rest.jpa.RiskType;
+import org.openecomp.policy.rest.jpa.SafePolicyWarning;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Controller
+public class SafePolicyController {
+
+	private static final Log logger = LogFactory.getLog(SafePolicyController.class);
+
+	@Autowired
+	SafePolicyWarningDao safePolicyWarningDao;
+
+	@Autowired
+	RiskTypeDao riskTypeDao;
+
+	@Autowired
+	UserInfoDao userInfoDao;
+
+	@Autowired
+	CategoryDao categoryDao;
+	
+
+	public Category getCategory() {
+		for (int i = 0; i < categoryDao.getCategoryListData().size(); i++) {
+			Category value = categoryDao.getCategoryListData().get(i);
+			if (value.getShortName().equals("resource")) {
+				return value;
+			}
+		}
+		return null;
+	}
+
+	public UserInfo getUserInfo(String loginId) {
+		UserInfo name = userInfoDao.getUserInfoByLoginId(loginId);
+		return name;
+	}
+
+	// EcompName Dictionary
+	@RequestMapping(value = { "/get_RiskTypeDataByName" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.GET }, produces = MediaType.APPLICATION_JSON_VALUE)
+	public void getRiskTypeDictionaryByNameEntityData(HttpServletRequest request, HttpServletResponse response) {
+		logger.info("get_RiskTypeDataByName is called");
+		try {
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("riskTypeDictionaryDatas", mapper.writeValueAsString(riskTypeDao.getRiskTypeDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping(value = { "/get_RiskTypeData" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.GET }, produces = MediaType.APPLICATION_JSON_VALUE)
+	public void getEcompNameDictionaryEntityData(HttpServletRequest request, HttpServletResponse response) {
+		logger.info("get_RiskTypeData is called");
+		try {
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("riskTypeDictionaryDatas", mapper.writeValueAsString(riskTypeDao.getRiskName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+			logger.error("ERROR While callinge DAO: " + e.getMessage());
+		}
+	}
+
+	@RequestMapping(value = { "/sp_dictionary/save_riskType.htm" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.POST })
+	public ModelAndView saveRiskTypeDictionary(HttpServletRequest request, HttpServletResponse response)
+			throws Exception {
+		try {
+			boolean duplicateflag = false;
+			System.out.println("SafePolicyController:  saveRiskTypeDictionary() is called");
+			logger.debug("SafePolicyController:  saveRiskTypeDictionary() is called");
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			RiskType riskTypeData = (RiskType) mapper.readValue(root.get("riskTypeDictionaryData").toString(),
+					RiskType.class);
+			String userId = root.get("loginId").textValue();
+			System.out.println("the userId from the ecomp portal is: " + userId);
+			if (riskTypeData.getId() == 0) {
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(riskTypeData.getRiskName(), "name", RiskType.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					riskTypeData.setUserCreatedBy(getUserInfo(userId));
+					riskTypeData.setUserModifiedBy(getUserInfo(userId));
+					System.out.println(
+							"SafePolicyController:  got the user info now about to call Save() method on riskTypedao");
+					riskTypeDao.Save(riskTypeData);
+				}
+			} else {
+				riskTypeData.setUserModifiedBy(this.getUserInfo(userId));
+				riskTypeDao.update(riskTypeData);
+			}
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.riskTypeDao.getRiskName());
+			}
+			JSONObject j = new JSONObject("{riskTypeDictionaryDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		} catch (Exception e) {
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value = { "/sp_dictionary/remove_riskType.htm" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.POST })
+	public ModelAndView removeEcompDictionary(HttpServletRequest request, HttpServletResponse response)
+			throws Exception {
+		try {
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			RiskType ecompData = (RiskType) mapper.readValue(root.get("data").toString(), RiskType.class);
+			riskTypeDao.delete(ecompData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.riskTypeDao.getRiskName());
+			JSONObject j = new JSONObject("{riskTypeDictionaryDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		} catch (Exception e) {
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value = { "/get_SafePolicyWarningDataByName" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.GET }, produces = MediaType.APPLICATION_JSON_VALUE)
+	public void getSafePolicyWarningEntityDataByName(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("safePolicyWarningDatas",
+					mapper.writeValueAsString(safePolicyWarningDao.getSafePolicyWarningDataByName()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping(value = { "/get_SafePolicyWarningData" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.GET }, produces = MediaType.APPLICATION_JSON_VALUE)
+	public void getSafePolicyWarningeEntityData(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			Map<String, Object> model = new HashMap<String, Object>();
+			ObjectMapper mapper = new ObjectMapper();
+			model.put("safePolicyWarningDatas",
+					mapper.writeValueAsString(safePolicyWarningDao.getSafePolicyWarningData()));
+			JsonMessage msg = new JsonMessage(mapper.writeValueAsString(model));
+			JSONObject j = new JSONObject(msg);
+			response.getWriter().write(j.toString());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping(value = { "/sp_dictionary/save_safePolicyWarning.htm" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.POST })
+	public ModelAndView saveSafePolicyWarningDictionary(HttpServletRequest request, HttpServletResponse response)
+			throws Exception {
+		try {
+			boolean duplicateflag = false;
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			SafePolicyWarning safePolicyWarning = (SafePolicyWarning) mapper
+					.readValue(root.get("safePolicyWarningData").toString(), SafePolicyWarning.class);
+
+			if (safePolicyWarning.getId() == 0) {
+				CheckDictionaryDuplicateEntries entry = new CheckDictionaryDuplicateEntries();
+				List<Object> duplicateData =  entry.CheckDuplicateEntry(safePolicyWarning.getName(), "name", SafePolicyWarning.class);
+				if(!duplicateData.isEmpty()){
+					duplicateflag = true;
+				}else{
+					safePolicyWarningDao.Save(safePolicyWarning);
+				}
+			} else {
+				safePolicyWarningDao.update(safePolicyWarning);
+			}
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+			String responseString = "";
+			if(duplicateflag){
+				responseString = "Duplicate";
+			}else{
+				responseString = mapper.writeValueAsString(this.safePolicyWarningDao.getSafePolicyWarningData());
+			}
+			JSONObject j = new JSONObject("{safePolicyWarningDatas: " + responseString + "}");
+
+			out.write(j.toString());
+
+			return null;
+		} catch (Exception e) {
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+	@RequestMapping(value = { "/sp_dictionary/remove_SafePolicyWarning.htm" }, method = {
+			org.springframework.web.bind.annotation.RequestMethod.POST })
+	public ModelAndView removeSafePolicyWarningDictionary(HttpServletRequest request, HttpServletResponse response)
+			throws Exception {
+		try {
+			ObjectMapper mapper = new ObjectMapper();
+			mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+			JsonNode root = mapper.readTree(request.getReader());
+			SafePolicyWarning safePolicyWarningData = (SafePolicyWarning) mapper.readValue(root.get("data").toString(),
+					SafePolicyWarning.class);
+			safePolicyWarningDao.delete(safePolicyWarningData);
+			response.setCharacterEncoding("UTF-8");
+			response.setContentType("application / json");
+			request.setCharacterEncoding("UTF-8");
+
+			PrintWriter out = response.getWriter();
+
+			String responseString = mapper.writeValueAsString(this.safePolicyWarningDao.getSafePolicyWarningData());
+			JSONObject j = new JSONObject("{groupPolicyScopeListDatas: " + responseString + "}");
+			out.write(j.toString());
+
+			return null;
+		} catch (Exception e) {
+			System.out.println(e);
+			response.setCharacterEncoding("UTF-8");
+			request.setCharacterEncoding("UTF-8");
+			PrintWriter out = response.getWriter();
+			out.write(e.getMessage());
+		}
+		return null;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/package-info.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/package-info.java
new file mode 100644
index 0000000..df0e40a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/controller/package-info.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * 
+ */
+/**
+ *
+ */
+package org.openecomp.policy.pap.xacml.rest.controller;
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionListDaoImpl.java
new file mode 100644
index 0000000..ba6c2c4
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionListDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ActionListDao;
+import org.openecomp.policy.rest.jpa.ActionList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ActionListDao")
+public class ActionListDaoImpl implements ActionListDao{
+
+	private static final Log logger = LogFactory.getLog(ActionListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ActionList> getActionListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<ActionList> actionListData = null;
+		try {
+			Criteria cr = session.createCriteria(ActionList.class);
+			actionListData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ActionList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return actionListData;
+
+	}
+
+	@Override
+	public void Save(ActionList actionList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(actionList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ActionList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(ActionList actionList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(actionList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ActionList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ActionList actionList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(actionList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ActionList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getActionListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+		try {
+			Criteria cr = session.createCriteria(ActionList.class);
+			List<ActionList> actionListData = cr.list();
+			for(int i = 0; i < actionListData.size(); i++){
+				data.add(actionListData.get(i).getActionName());
+			}
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ActionList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionPolicyDictDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionPolicyDictDaoImpl.java
new file mode 100644
index 0000000..50d41fd
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ActionPolicyDictDaoImpl.java
@@ -0,0 +1,185 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ActionPolicyDictDao;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+@Service("ActionPolicyDictDao")
+public class ActionPolicyDictDaoImpl implements ActionPolicyDictDao {
+	private static final Log logger = LogFactory.getLog(ActionPolicyDictDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ActionPolicyDict> getActionDictData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		
+        List<ActionPolicyDict> actionDictData = null;
+        try {
+        	Criteria cr = session.createCriteria(ActionPolicyDict.class);
+        	actionDictData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ActionDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return actionDictData;
+	}
+
+	@Override
+	public void Save(ActionPolicyDict action) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(action);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ActionDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void delete(ActionPolicyDict action) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(action);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ActionDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ActionPolicyDict action) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(action);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ActionDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getActionDictDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+		try {
+			Criteria cr = session.createCriteria(ActionPolicyDict.class);
+			List<ActionPolicyDict> attributeData = cr.list();  
+			for(int i = 0; i < attributeData.size(); i++){
+				data.add(attributeData.get(i).getAttributeName());
+			}	
+			tx.commit();			
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ActionDictionary Table"+e);			
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public ActionPolicyDict getActionEntityDatabyId(String action) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		ActionPolicyDict data = null;
+		try {
+			Criteria cr = session.createCriteria(ActionPolicyDict.class);	
+			List<ActionPolicyDict> attributeData = cr.add(Restrictions.eq("attributeName", action)).list();
+			for(Object entity : attributeData){
+				data = (ActionPolicyDict) entity;
+			}		
+			tx.commit();			
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ActionDictionary Table"+e);		
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AddressGroupDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AddressGroupDaoImpl.java
new file mode 100644
index 0000000..951a38a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AddressGroupDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.AddressGroupDao;
+import org.openecomp.policy.rest.jpa.AddressGroup;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("AddressGroupDao")
+public class AddressGroupDaoImpl implements AddressGroupDao{
+	private static final Log logger = LogFactory.getLog(AddressGroupDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<AddressGroup> getAddressGroupData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<AddressGroup> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(AddressGroup.class);
+			attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying AddressGroup Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(AddressGroup attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving AddressGroup Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(AddressGroup attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting AddressGroup Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(AddressGroup attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating AddressGroup Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getAddressGroupDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();   
+        try {
+        	Criteria cr = session.createCriteria(AddressGroup.class);
+        	 List<AddressGroup> attributeData = cr.list();
+        	 for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getGroupName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying AddressGroup Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AttributeDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AttributeDaoImpl.java
new file mode 100644
index 0000000..7eb51d3
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/AttributeDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.AttributeDao;
+import org.openecomp.policy.rest.jpa.Attribute;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("AttributeDao")
+public class AttributeDaoImpl implements AttributeDao {
+	private static final Log logger = LogFactory.getLog(AttributeDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<Attribute> getData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<Attribute> attributeData = null;
+		try {
+			Criteria cr = session.createCriteria(Attribute.class);
+			attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(Attribute attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(Attribute attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(Attribute attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getAttributeData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+		try {
+			Criteria cr = session.createCriteria(Attribute.class);
+			List<Attribute> attributeData = cr.list();
+			for(int i = 0; i < attributeData.size(); i++){
+				data.add(attributeData.get(i).getXacmlId());
+			}
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/BRMSParamTemplateDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/BRMSParamTemplateDaoImpl.java
new file mode 100644
index 0000000..4f8478d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/BRMSParamTemplateDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.BRMSParamTemplateDao;
+import org.openecomp.policy.rest.jpa.BRMSParamTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("BRMSParamTemplateDao")
+public class BRMSParamTemplateDaoImpl implements BRMSParamTemplateDao{
+	private static final Log logger = LogFactory.getLog(BRMSParamTemplateDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<BRMSParamTemplate> getBRMSParamTemplateData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+        List<BRMSParamTemplate> attributeData =null;
+        try {
+			Criteria cr = session.createCriteria(BRMSParamTemplate.class);
+			attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying BRMSParamTemplate Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(BRMSParamTemplate attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving BRMSParamTemplate Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(BRMSParamTemplate attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting BRMSParamTemplate Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(BRMSParamTemplate attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating BRMSParamTemplate Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getBRMSParamDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();     
+		List<String> data = new ArrayList<String>();  
+		try {
+			Criteria cr = session.createCriteria(BRMSParamTemplate.class);
+			List<BRMSParamTemplate> attributeData = cr.list();
+			for(int i = 0; i < attributeData.size(); i++){
+				data.add(attributeData.get(i).getRuleName());
+			}
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying BRMSParamTemplate Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/CategoryDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/CategoryDaoImpl.java
new file mode 100644
index 0000000..f3fcbf1
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/CategoryDaoImpl.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.CategoryDao;
+import org.openecomp.policy.rest.jpa.Category;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("CategoryDao")
+public class CategoryDaoImpl implements CategoryDao {
+	private static final Log logger = LogFactory.getLog(CategoryDaoImpl.class);
+
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<Category> getCategoryListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();		
+		List<Category> categoryListData = null;
+		try {
+			Criteria cr = session.createCriteria(Category.class);
+			categoryListData = cr.list();	
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying Category Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return categoryListData;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DCAEUUIDDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DCAEUUIDDaoImpl.java
new file mode 100644
index 0000000..ddd4606
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DCAEUUIDDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.DCAEUUIDDao;
+import org.openecomp.policy.rest.jpa.DCAEuuid;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("DCAEUUIDDao")
+public class DCAEUUIDDaoImpl implements DCAEUUIDDao{
+	private static final Log logger = LogFactory.getLog(DCAEUUIDDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<DCAEuuid> getDCAEuuidData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<DCAEuuid> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(DCAEuuid.class);
+			attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DCAEUUID Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(DCAEuuid attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving DCAEUUID Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(DCAEuuid attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting DCAEUUID Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(DCAEuuid attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating DCAEUUID Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getDCAEuuidDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();  
+        List<String> data = new ArrayList<String>(); 
+        try {
+        	Criteria cr = session.createCriteria(DCAEuuid.class);
+        	 List<DCAEuuid> attributeData = cr.list();
+        	 for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DCAEUUID Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DecisionPolicyDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DecisionPolicyDaoImpl.java
new file mode 100644
index 0000000..9762e1d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DecisionPolicyDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.DecisionPolicyDao;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("DecisionSettingsDao")
+public class DecisionPolicyDaoImpl implements DecisionPolicyDao{
+	private static final Log logger = LogFactory.getLog(DecisionPolicyDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<DecisionSettings> getDecisionSettingsData() {
+			Session session = HibernateSession.getSessionFactory();
+			Transaction tx = session.beginTransaction();	
+	        List<DecisionSettings> decisionSettingsData = null;
+	        try {
+	        	Criteria cr = session.createCriteria(DecisionSettings.class);
+	        	decisionSettingsData = cr.list();
+				tx.commit();
+			} catch (Exception e) {
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DecisionSettings Table"+e);	
+			}finally{
+				try{
+					session.close();
+				}catch(Exception e1){
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+				}
+			}
+			return decisionSettingsData;
+			
+		}
+
+		@Override
+		public void Save(DecisionSettings decisionSettings) {
+			Session session = HibernateSession.getSessionFactory();
+			Transaction tx = session.beginTransaction();
+			try {
+				session.persist(decisionSettings);
+				tx.commit();	
+			}catch(Exception e){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving DecisionSettings Table"+e);	
+			}finally{
+				try{
+					session.close();
+				}catch(Exception e1){
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+				}
+			}
+			
+		}
+
+		@Override
+		public void delete(DecisionSettings decisionSettings) {
+			Session session = HibernateSession.getSessionFactory();
+			Transaction tx = session.beginTransaction();
+			try {
+				session.delete(decisionSettings);
+				tx.commit();	
+			}catch(Exception e){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting DecisionSettings Table"+e);	
+			}finally{
+				try{
+					session.close();
+				}catch(Exception e1){
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+				}
+			}
+		}
+
+		@Override
+		public void update(DecisionSettings decisionSettings) {
+			Session session = HibernateSession.getSessionFactory();
+			Transaction tx = session.beginTransaction();
+			try {
+				session.update(decisionSettings);
+				tx.commit();	
+			}catch(Exception e){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating DecisionSettings Table"+e);	
+			}finally{
+				try{
+					session.close();
+				}catch(Exception e1){
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+				}
+			}
+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		public List<String> getDecisionDataByName() {
+			Session session = HibernateSession.getSessionFactory();
+			Transaction tx = session.beginTransaction();		
+			List<String> data = new ArrayList<String>();
+			try {
+				Criteria cr = session.createCriteria(DecisionSettings.class);
+				List<DecisionSettings> decisionSettingsData = cr.list();
+				for(int i = 0; i < decisionSettingsData.size(); i++){
+					data.add(decisionSettingsData.get(i).getXacmlId());
+				}
+				tx.commit();
+			} catch (Exception e) {
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DecisionSettings Table"+e);	
+			}finally{
+				try{
+					session.close();
+				}catch(Exception e1){
+					logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+				}
+			}
+			return data;
+		}
+
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DescriptiveScopeDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DescriptiveScopeDaoImpl.java
new file mode 100644
index 0000000..8d28685
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/DescriptiveScopeDaoImpl.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.DescriptiveScopeDao;
+import org.openecomp.policy.rest.jpa.DescriptiveScope;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("DescriptiveScopeDao")
+public class DescriptiveScopeDaoImpl implements DescriptiveScopeDao{
+	private static final Log logger = LogFactory.getLog(DescriptiveScopeDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<DescriptiveScope> getDescriptiveScope() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+        List<DescriptiveScope> descriptiveScopeData = null;
+        try {
+        	Criteria cr = session.createCriteria(DescriptiveScope.class);
+        	descriptiveScopeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return descriptiveScopeData;
+	}
+
+	@Override
+	public void Save(DescriptiveScope descriptiveScope) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(descriptiveScope);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(DescriptiveScope descriptiveScope) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(descriptiveScope);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(DescriptiveScope descriptiveScope) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(descriptiveScope);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getDescriptiveScopeDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<String> data = new ArrayList<String>();  
+    	try {
+    		Criteria cr = session.createCriteria(DescriptiveScope.class);
+            List<DescriptiveScope> descriptiveScopeData = cr.list();
+            for(int i = 0; i < descriptiveScopeData.size(); i++){
+           	 data.add(descriptiveScopeData.get(i).getScopeName());
+           }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public DescriptiveScope getDescriptiveScopeById(String name) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		DescriptiveScope data = null;
+		try {
+			Criteria cr = session.createCriteria(DescriptiveScope.class);
+			cr.add(Restrictions.eq("scopename",name));
+			data = (DescriptiveScope) cr.list().get(0);
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying DescriptiveScope Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EcompNameDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EcompNameDaoImpl.java
new file mode 100644
index 0000000..9bafc3a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EcompNameDaoImpl.java
@@ -0,0 +1,167 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.EcompNameDao;
+import org.openecomp.policy.rest.jpa.EcompName;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("EcompNameDao")
+public class EcompNameDaoImpl implements EcompNameDao {
+	private static final Log logger = LogFactory.getLog(EcompNameDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<EcompName> getEcompName() {
+		System.out.println("EcompNameDaoImpl:  getEcompName() is called");
+		logger.debug("EcompNameDaoImpl:  getEcompName() is called");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<EcompName> ecompNameData = null;
+        try {
+        	Criteria cr = session.createCriteria(EcompName.class);
+			ecompNameData = cr.list();
+			System.out.println("Data returned from ecompname table"+ecompNameData.toString());
+			logger.debug("Data returned from ecompname table:  " + ecompNameData.toString());
+			tx.commit();
+		} catch (Exception e) {
+			System.out.println("Exception Occured while Querying ecompname"+e);
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying EcompName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return ecompNameData;
+	}
+
+	@Override
+	public void Save(EcompName ecompName) {
+		System.out.println("EcompNameDaoImpl:  Save() is called");
+		logger.debug("EcompNameDaoImpl:  Save() is called");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(ecompName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving EcompName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(EcompName ecompName) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(ecompName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting EcompName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(EcompName ecompName) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(ecompName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating EcompName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getEcompNameDataByName() {
+		logger.info("getEcompNameDataByName is call from the DAO implementation class.");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<String> data = new ArrayList<String>();    
+        try {
+        	Criteria cr = session.createCriteria(EcompName.class);
+            List<EcompName> ecompNameData = cr.list();
+            for(int i = 0; i < ecompNameData.size(); i++){
+           	 data.add(ecompNameData.get(i).getEcompName());
+           }
+            logger.info("data retrieved: " + data.toString());
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying EcompName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EnforcerPolicyDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EnforcerPolicyDaoImpl.java
new file mode 100644
index 0000000..ba621ab
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/EnforcerPolicyDaoImpl.java
@@ -0,0 +1,132 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.EnforcerPolicyDao;
+import org.openecomp.policy.rest.jpa.EnforcingType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("EnforcerPolicyDao")
+public class EnforcerPolicyDaoImpl implements EnforcerPolicyDao {
+	private static final Log logger = LogFactory.getLog(EnforcerPolicyDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<EnforcingType> getEnforcingTypeData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<EnforcingType> enforcingTypeData = null;
+        try {
+        	Criteria cr = session.createCriteria(EnforcingType.class);
+            enforcingTypeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying EnforcingType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return enforcingTypeData;
+		
+	}
+
+	@Override
+	public void Save(EnforcingType enforcingType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(enforcingType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving EnforcingType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(EnforcingType enforcingType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(enforcingType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting EnforcingType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(EnforcingType enforcingType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(enforcingType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating EnforcingType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/FirewallDictionaryListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/FirewallDictionaryListDaoImpl.java
new file mode 100644
index 0000000..b19a58b
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/FirewallDictionaryListDaoImpl.java
@@ -0,0 +1,202 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.Criteria;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.FirewallDictionaryListDao;
+import org.openecomp.policy.rest.jpa.FirewallDictionaryList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+@Service("FirewallDictionaryListDao")
+public class FirewallDictionaryListDaoImpl implements FirewallDictionaryListDao {
+	private static final Log logger = LogFactory.getLog(FirewallDictionaryListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@Override
+	public List<FirewallDictionaryList> getFWDictionaryListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<FirewallDictionaryList> attributeData =  null;
+        try {
+        	Criteria cr = session.createCriteria(FirewallDictionaryList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+
+	}
+
+	@Override
+	public List<String> getFWDictionaryListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(FirewallDictionaryList.class);
+            List<FirewallDictionaryList> attributeData = cr.list();    
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getParentItemName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(FirewallDictionaryList firewallDictionaryList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(firewallDictionaryList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(FirewallDictionaryList firewallDictionaryList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(firewallDictionaryList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(FirewallDictionaryList firewallDictionaryList) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(firewallDictionaryList);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void updateQuery(String query) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+		try {
+			Query hbquery = session.createQuery(query);
+			hbquery.executeUpdate();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public FirewallDictionaryList getFWDictionaryDataById(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		FirewallDictionaryList data = null;
+        try {
+        	Criteria cr = session.createCriteria(FirewallDictionaryList.class);
+        	cr = cr.add(Restrictions.eq("parentItemName",value));
+        	data = (FirewallDictionaryList) cr.list().get(0);
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying FirewallDictionaryList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/GroupPolicyScopeListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/GroupPolicyScopeListDaoImpl.java
new file mode 100644
index 0000000..edc147f
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/GroupPolicyScopeListDaoImpl.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.GroupPolicyScopeListDao;
+import org.openecomp.policy.rest.jpa.GroupPolicyScopeList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("GroupPolicyScopeListDao")
+public class GroupPolicyScopeListDaoImpl implements GroupPolicyScopeListDao {
+	private static final Log logger = LogFactory.getLog(GroupPolicyScopeListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<GroupPolicyScopeList> getGroupPolicyScopeListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		 List<GroupPolicyScopeList> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(GroupPolicyScopeList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying GroupPolicyScopeList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getGroupPolicyScopeListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+		try {
+			Criteria cr = session.createCriteria(GroupPolicyScopeList.class);
+			List<GroupPolicyScopeList> attributeData = cr.list();           
+			for(int i = 0; i < attributeData.size(); i++){
+				data.add(attributeData.get(i).getGroupName());
+			}
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying GroupPolicyScopeList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(GroupPolicyScopeList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving GroupPolicyScopeList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(GroupPolicyScopeList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(GroupPolicyScopeList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<GroupPolicyScopeList> CheckDuplicateEntry(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<GroupPolicyScopeList> data = null;
+		try {
+			Criteria cr = session.createCriteria(GroupPolicyScopeList.class);
+			cr.add(Restrictions.eq("name",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying GroupPolicyScopeList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceConfigNameDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceConfigNameDaoImpl.java
new file mode 100644
index 0000000..fdee32c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceConfigNameDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.MicroServiceConfigNameDao;
+import org.openecomp.policy.rest.jpa.MicroServiceConfigName;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("MicroServiceConfigNameDao")
+public class MicroServiceConfigNameDaoImpl implements MicroServiceConfigNameDao{
+	private static final Log logger = LogFactory.getLog(MicroServiceConfigNameDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<MicroServiceConfigName> getMicroServiceConfigNameData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		 List<MicroServiceConfigName> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceConfigName.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceConfigName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(MicroServiceConfigName attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving MicroServiceConfigName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(MicroServiceConfigName attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting MicroServiceConfigName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(MicroServiceConfigName attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating MicroServiceConfigName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getMSConfigDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceConfigName.class);
+            List<MicroServiceConfigName> attributeData = cr.list();            
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceConfigName Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceLocationDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceLocationDaoImpl.java
new file mode 100644
index 0000000..91a2f42
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceLocationDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.MicroServiceLocationDao;
+import org.openecomp.policy.rest.jpa.MicroServiceLocation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("MicroServiceLocationDao")
+public class MicroServiceLocationDaoImpl implements MicroServiceLocationDao{
+	private static final Log logger = LogFactory.getLog(MicroServiceLocationDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<MicroServiceLocation> getMicroServiceLocationData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<MicroServiceLocation> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceLocation.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceLocation Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(MicroServiceLocation attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving MicroServiceLocation Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(MicroServiceLocation attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting MicroServiceLocation Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(MicroServiceLocation attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating MicroServiceLocation Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getMSLocationDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceLocation.class);
+            List<MicroServiceLocation> attributeData = cr.list();
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceLocation Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceModelsDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceModelsDaoImpl.java
new file mode 100644
index 0000000..c4e66b5
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/MicroServiceModelsDaoImpl.java
@@ -0,0 +1,161 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.MicroServiceModelsDao;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("MicroServiceModelsDao")
+public class MicroServiceModelsDaoImpl implements MicroServiceModelsDao{
+	private static final Log logger = LogFactory.getLog(MicroServiceModelsDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<MicroServiceModels> getMicroServiceModelsData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<MicroServiceModels> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceModels.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceModels Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(MicroServiceModels attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving MicroServiceModels Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(MicroServiceModels attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting MicroServiceModels Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(MicroServiceModels attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating MicroServiceModels Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getMSModelsDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(MicroServiceModels.class);
+            List<MicroServiceModels> attributeData = cr.list();         
+            for(int i = 0; i < attributeData.size(); i++){
+            	if(attributeData.get(i).getVersion() == null || attributeData.get(i).getVersion().equals("")){
+            		data.add(attributeData.get(i).getModelName());
+            	}else{
+            		data.add(attributeData.get(i).getModelName() + "-v" + attributeData.get(i).getVersion());
+            	}
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying MicroServiceModels Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PEPOptionsDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PEPOptionsDaoImpl.java
new file mode 100644
index 0000000..92b89e9
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PEPOptionsDaoImpl.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PEPOptionsDao;
+import org.openecomp.policy.rest.jpa.PEPOptions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PEPOptionsDao")
+public class PEPOptionsDaoImpl implements PEPOptionsDao{
+	private static final Log logger = LogFactory.getLog(PEPOptionsDaoImpl.class);
+
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PEPOptions> getPEPOptionsData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PEPOptions> pepOptionsData = null;
+        try {
+        	Criteria cr = session.createCriteria(PEPOptions.class);
+            pepOptionsData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PEPOptions Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return pepOptionsData;
+		
+	}
+
+	@Override
+	public void Save(PEPOptions pepOptions) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(pepOptions);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PEPOptions Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PEPOptions pepOptions) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(pepOptions);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PEPOptions Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(PEPOptions pepOptions) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(pepOptions);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PEPOptions Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPEPOptionsDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PEPOptions.class);
+            List<PEPOptions> pepOptionsData = cr.list();  
+            for(int i = 0; i < pepOptionsData.size(); i++){
+            	 data.add(pepOptionsData.get(i).getPepName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PEPOptions Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeClosedLoopDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeClosedLoopDaoImpl.java
new file mode 100644
index 0000000..6ac3e5b
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeClosedLoopDaoImpl.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PolicyScopeClosedLoopDao;
+import org.openecomp.policy.rest.jpa.PolicyScopeClosedLoop;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PolicyScopeClosedLoopDao")
+public class PolicyScopeClosedLoopDaoImpl implements PolicyScopeClosedLoopDao{
+	private static final Log logger = LogFactory.getLog(PolicyScopeClosedLoopDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeClosedLoop> getPolicyScopeClosedLoopData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeClosedLoop> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeClosedLoop.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPolicyScopeClosedLoopDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeClosedLoop.class);
+            List<PolicyScopeClosedLoop> attributeData = cr.list();            
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(PolicyScopeClosedLoop attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PolicyScopeClosedLoop attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(PolicyScopeClosedLoop attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeClosedLoop> CheckDuplicateEntry(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeClosedLoop> data = null;
+		try {
+			Criteria cr = session.createCriteria(PolicyScopeClosedLoop.class);
+			cr.add(Restrictions.eq("name",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeClosedLoop Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeResourceDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeResourceDaoImpl.java
new file mode 100644
index 0000000..6fe91b1
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeResourceDaoImpl.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PolicyScopeResourceDao;
+import org.openecomp.policy.rest.jpa.PolicyScopeResource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PolicyScopeResourceDao")
+public class PolicyScopeResourceDaoImpl implements PolicyScopeResourceDao{
+	private static final Log logger = LogFactory.getLog(PolicyScopeResourceDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeResource> getPolicyScopeResourceData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeResource> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeResource.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPolicyScopeResourceDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeResource.class);
+            List<PolicyScopeResource> attributeData = cr.list();     
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(PolicyScopeResource attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void delete(PolicyScopeResource attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(PolicyScopeResource attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeResource> CheckDuplicateEntry(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeResource> data = null;
+		try {
+			Criteria cr = session.createCriteria(PolicyScopeResource.class);
+			cr.add(Restrictions.eq("name",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeResource Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+  
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeServiceDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeServiceDaoImpl.java
new file mode 100644
index 0000000..d90d5a0
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeServiceDaoImpl.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PolicyScopeServiceDao;
+import org.openecomp.policy.rest.jpa.PolicyScopeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PolicyScopeServiceDao")
+public class PolicyScopeServiceDaoImpl implements PolicyScopeServiceDao{
+	private static final Log logger = LogFactory.getLog(PolicyScopeServiceDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeService> getPolicyScopeServiceData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeService> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeService.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPolicyScopeServiceDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeService.class);
+            List<PolicyScopeService> attributeData = cr.list();     
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(PolicyScopeService attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PolicyScopeService attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(PolicyScopeService attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeService> CheckDuplicateEntry(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeService> data = null;
+		try {
+			Criteria cr = session.createCriteria(PolicyScopeService.class);
+			cr.add(Restrictions.eq("name",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeService Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeTypeDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeTypeDaoImpl.java
new file mode 100644
index 0000000..66317a4
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PolicyScopeTypeDaoImpl.java
@@ -0,0 +1,182 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PolicyScopeTypeDao;
+import org.openecomp.policy.rest.jpa.PolicyScopeType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PolicyScopeTypeDao")
+public class PolicyScopeTypeDaoImpl implements  PolicyScopeTypeDao{
+	private static final Log logger = LogFactory.getLog(PolicyScopeTypeDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeType> getPolicyScopeTypeData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeType> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeType.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPolicyScopeTypeDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PolicyScopeType.class);
+            List<PolicyScopeType> attributeData = cr.list();     
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(PolicyScopeType attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PolicyScopeType attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(PolicyScopeType attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PolicyScopeType> CheckDuplicateEntry(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PolicyScopeType> data = null;
+		try {
+			Criteria cr = session.createCriteria(PolicyScopeType.class);
+			cr.add(Restrictions.eq("name",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PolicyScopeType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PortListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PortListDaoImpl.java
new file mode 100644
index 0000000..a3139b2
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PortListDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PortListDao;
+import org.openecomp.policy.rest.jpa.PortList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PortListDao")
+public class PortListDaoImpl implements PortListDao {
+	private static final Log logger = LogFactory.getLog(PortListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PortList> getPortListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PortList> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PortList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PortList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(PortList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PortList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PortList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PortList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(PortList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PortList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPortListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PortList.class);
+            List<PortList> attributeData = cr.list();      
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getPortName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PortList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PrefixListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PrefixListDaoImpl.java
new file mode 100644
index 0000000..2fecc7d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/PrefixListDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.PrefixListDao;
+import org.openecomp.policy.rest.jpa.PREFIXLIST;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("PrefixListDao")
+public class PrefixListDaoImpl implements PrefixListDao{
+	private static final Log logger = LogFactory.getLog(PrefixListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<PREFIXLIST> getPREFIXLISTData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<PREFIXLIST> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(PREFIXLIST.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PREFIXLIST Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(PREFIXLIST attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving PREFIXLIST Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(PREFIXLIST attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting PREFIXLIST Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(PREFIXLIST attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating PREFIXLIST Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getPrefixListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(PREFIXLIST.class);
+            List<PREFIXLIST> attributeData = cr.list();    
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getPrefixListName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying PREFIXLIST Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ProtocolListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ProtocolListDaoImpl.java
new file mode 100644
index 0000000..7d78d38
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ProtocolListDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ProtocolListDao;
+import org.openecomp.policy.rest.jpa.ProtocolList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ProtocolListDao")
+public class ProtocolListDaoImpl implements ProtocolListDao {
+	private static final Log logger = LogFactory.getLog(ProtocolListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ProtocolList> getProtocolListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<ProtocolList> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(ProtocolList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ProtocolList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(ProtocolList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ProtocolList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(ProtocolList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ProtocolList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ProtocolList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ProtocolList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getProtocolListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(ProtocolList.class);
+            List<ProtocolList> attributeData = cr.list();     
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getProtocolName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ProtocolList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/RiskTypeDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/RiskTypeDaoImpl.java
new file mode 100644
index 0000000..1318f82
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/RiskTypeDaoImpl.java
@@ -0,0 +1,167 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.EcompNameDao;
+import org.openecomp.policy.rest.dao.RiskTypeDao;
+import org.openecomp.policy.rest.jpa.EcompName;
+import org.openecomp.policy.rest.jpa.RiskType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("RiskTypeDao")
+public class RiskTypeDaoImpl implements RiskTypeDao {
+	private static final Log logger = LogFactory.getLog(RiskTypeDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<RiskType> getRiskName() {
+		System.out.println("RiskTypeDaoImpl:  getRiskName() is called");
+		logger.debug("RiskTypeDaoImpl:  getRiskName() is called");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<RiskType> riskTypeData = null;
+        try {
+        	Criteria cr = session.createCriteria(RiskType.class);
+        	riskTypeData = cr.list();
+			logger.debug("Data returned from RiskType table:  " + riskTypeData.toString());
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying RiskType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return riskTypeData;
+	}
+
+	@Override
+	public void Save(RiskType riskName) {
+		System.out.println("RiskTypeDaoImpl:  Save() is called");
+		logger.debug("RiskTypeDaoImpl:  Save() is called");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(riskName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving RiskType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(RiskType riskName) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(riskName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting RiskType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(RiskType riskName) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(riskName);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating RiskType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getRiskTypeDataByName() {
+		logger.info("getRiskTypeDataByName is call from the DAO implementation class.");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();	
+        List<String> data = new ArrayList<String>();    
+        try {
+        	Criteria cr = session.createCriteria(RiskType.class);
+            List<RiskType> riskTypeData = cr.list();
+            for(int i = 0; i < riskTypeData.size(); i++){
+           	 data.add(riskTypeData.get(i).getRiskName());
+           }
+            logger.info("data retrieved: " + data.toString());
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying RiskType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SafePolicyWarningDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SafePolicyWarningDaoImpl.java
new file mode 100644
index 0000000..37a77f9
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SafePolicyWarningDaoImpl.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.SafePolicyWarningDao;
+import org.openecomp.policy.rest.jpa.SafePolicyWarning;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("SafePolicyWarningDao")
+public class SafePolicyWarningDaoImpl implements SafePolicyWarningDao {
+	private static final Log logger = LogFactory.getLog(SafePolicyWarningDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<SafePolicyWarning> getSafePolicyWarningData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		 List<SafePolicyWarning> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(SafePolicyWarning.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying SafePolicyWarning Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getSafePolicyWarningDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+		try {
+			Criteria cr = session.createCriteria(SafePolicyWarning.class);
+			List<SafePolicyWarning> attributeData = cr.list();           
+			for(int i = 0; i < attributeData.size(); i++){
+				data.add(attributeData.get(i).getName());
+			}
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying SafePolicyWarning Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public void Save(SafePolicyWarning attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving SafePolicyWarning Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(SafePolicyWarning attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void update(SafePolicyWarning attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating Attribute Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public SafePolicyWarning getSafePolicyWarningDataById(String riskType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		SafePolicyWarning data = null;
+		try {
+		Criteria cr = session.createCriteria(SafePolicyWarning.class);
+		cr.add(Restrictions.eq("name",riskType));
+		data = (SafePolicyWarning) cr.list().get(0);
+		tx.commit();
+		} catch (Exception e) {
+		logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying SafePolicyWarning Table"+e);
+		}finally{
+		try{
+		session.close();
+		}catch(Exception e1){
+		logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+		}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SecurityZoneDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SecurityZoneDaoImpl.java
new file mode 100644
index 0000000..9c79773
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SecurityZoneDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.SecurityZoneDao;
+import org.openecomp.policy.rest.jpa.SecurityZone;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("SecurityZoneDao")
+public class SecurityZoneDaoImpl implements SecurityZoneDao{
+	private static final Log logger = LogFactory.getLog(SecurityZoneDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<SecurityZone> getSecurityZoneData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<SecurityZone> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(SecurityZone.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying SecurityZone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(SecurityZone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving SecurityZone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void delete(SecurityZone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting SecurityZone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(SecurityZone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating SecurityZone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getSecurityZoneDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(SecurityZone.class);
+            List<SecurityZone> attributeData = cr.list();     
+            for(int i = 0; i < attributeData.size(); i++){
+           	 data.add(attributeData.get(i).getZoneName());
+           }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying SecurityZone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceDictionaryDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceDictionaryDaoImpl.java
new file mode 100644
index 0000000..226c500
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceDictionaryDaoImpl.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ServiceDictionaryDao;
+import org.openecomp.policy.rest.jpa.ClosedLoopD2Services;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ServiceDictionaryDao")
+public class ServiceDictionaryDaoImpl implements ServiceDictionaryDao {
+	private static final Log logger = LogFactory.getLog(ServiceDictionaryDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ClosedLoopD2Services> getClosedLoopD2ServicesData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<ClosedLoopD2Services> closedLoopD2ServicesData = null;
+        try {
+        	Criteria cr = session.createCriteria(ClosedLoopD2Services.class);
+            closedLoopD2ServicesData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ClosedLoopD2Services Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return closedLoopD2ServicesData;
+		
+	}
+
+	@Override
+	public void Save(ClosedLoopD2Services closedLoopD2Services) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(closedLoopD2Services);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ClosedLoopD2Services Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(ClosedLoopD2Services closedLoopD2Services) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(closedLoopD2Services);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ClosedLoopD2Services Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ClosedLoopD2Services closedLoopD2Services) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(closedLoopD2Services);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ClosedLoopD2Services Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getCLServiceDictDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(ClosedLoopD2Services.class);
+            List<ClosedLoopD2Services> closedLoopD2ServicesData = cr.list();      
+            for(int i = 0; i < closedLoopD2ServicesData.size(); i++){
+            	 data.add(closedLoopD2ServicesData.get(i).getServiceName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ClosedLoopD2Services Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceGroupDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceGroupDaoImpl.java
new file mode 100644
index 0000000..7256313
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceGroupDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ServiceGroupDao;
+import org.openecomp.policy.rest.jpa.GroupServiceList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ServiceGroupDao")
+public class ServiceGroupDaoImpl implements ServiceGroupDao{
+	private static final Log logger = LogFactory.getLog(ServiceGroupDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<GroupServiceList> getGroupServiceListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<GroupServiceList> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(GroupServiceList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying GroupServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(GroupServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving GroupServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(GroupServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting GroupServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(GroupServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating GroupServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getGroupServiceDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(GroupServiceList.class);
+            List<GroupServiceList> attributeData = cr.list();      
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getGroupName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying GroupServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceListDaoImpl.java
new file mode 100644
index 0000000..01ff3e4
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ServiceListDaoImpl.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ServiceListDao;
+import org.openecomp.policy.rest.jpa.ServiceList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ServiceListDao")
+public class ServiceListDaoImpl implements ServiceListDao {
+	private static final Log logger = LogFactory.getLog(ServiceListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ServiceList> getServiceListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<ServiceList> attributeData =  null;
+        try {
+        	Criteria cr = session.createCriteria(ServiceList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(ServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(ServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ServiceList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getServiceListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(ServiceList.class);
+            List<ServiceList> attributeData = cr.list();    
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getServiceName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ServiceList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+		
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SiteDictionaryDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SiteDictionaryDaoImpl.java
new file mode 100644
index 0000000..3b2a751
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/SiteDictionaryDaoImpl.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.SiteDictionaryDao;
+import org.openecomp.policy.rest.jpa.ClosedLoopSite;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+@Service("SiteDictionaryDao")
+public class SiteDictionaryDaoImpl implements SiteDictionaryDao {
+	private static final Log logger = LogFactory.getLog(SiteDictionaryDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<ClosedLoopSite> getClosedLoopSiteData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<ClosedLoopSite> closedLoopSiteData = null;
+        try {
+        	Criteria cr = session.createCriteria(ClosedLoopSite.class);
+            closedLoopSiteData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ClosedLoopSite Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return closedLoopSiteData;
+		
+	}
+
+	@Override
+	public void Save(ClosedLoopSite closedLoopSite) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(closedLoopSite);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving ClosedLoopSite Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(ClosedLoopSite closedLoopSite) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(closedLoopSite);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting ClosedLoopSite Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(ClosedLoopSite closedLoopSite) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(closedLoopSite);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating ClosedLoopSite Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getCLSiteDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(ClosedLoopSite.class);
+            List<ClosedLoopSite> closedLoopSiteData = cr.list();        
+            for(int i = 0; i < closedLoopSiteData.size(); i++){
+            	 data.add(closedLoopSiteData.get(i).getSiteName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying ClosedLoopSite Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/TermListDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/TermListDaoImpl.java
new file mode 100644
index 0000000..7568d60
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/TermListDaoImpl.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.TermListDao;
+import org.openecomp.policy.rest.jpa.TermList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("TermListDao")
+public class TermListDaoImpl implements TermListDao{
+	private static final Log logger = LogFactory.getLog(TermListDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<TermList> getTermListData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<TermList> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(TermList.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(TermList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(TermList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(TermList attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getTermListDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(TermList.class);
+            List<TermList> attributeData = cr.list();   
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getTermName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+	
+	@Override
+	public TermList getTermListValueByName(String name) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		TermList data = null;
+		try {
+			Criteria cr = session.createCriteria(TermList.class);
+			cr.add(Restrictions.eq("termName",name));
+			data = (TermList) cr.list().get(0);
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying TermList Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/UserInfoDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/UserInfoDaoImpl.java
new file mode 100644
index 0000000..04ad69c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/UserInfoDaoImpl.java
@@ -0,0 +1,138 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.UserInfoDao;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+
+@Service("UserInfoDao")
+public class UserInfoDaoImpl implements UserInfoDao{
+	private static final Log logger = LogFactory.getLog(UserInfoDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@Override
+	public void save(UserInfo userInfo) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(userInfo);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving UserInfo Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}	
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<UserInfo> getUserInfo() {
+		System.out.println("UserInfoDaoImpl:  getUserInfo().. getting user info before save()");
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<UserInfo> userData = null;
+        try {
+        	Criteria cr = session.createCriteria(UserInfo.class);
+            userData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying UserInfo Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return userData;
+	}
+
+	@Override
+	public String getUserName(String loginid) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		UserInfo user = null;
+		try {
+			user = (UserInfo) session.get(UserInfo.class, loginid);
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying UserInfo Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return user.getUserName().toString();
+	}
+
+	@Override
+	public UserInfo getUserInfoByLoginId(String loginid) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		UserInfo userData = null;
+        try {
+        	Criteria cr = session.createCriteria(UserInfo.class);
+        	cr.add(Restrictions.eq("userLoginId", loginid));
+            userData = (UserInfo) cr.list().get(0);
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying UserInfo Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return userData;
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VNFTypeDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VNFTypeDaoImpl.java
new file mode 100644
index 0000000..4d424fa
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VNFTypeDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.VNFTypeDao;
+import org.openecomp.policy.rest.jpa.VNFType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("VNFTypeDao")
+public class VNFTypeDaoImpl implements VNFTypeDao {
+	private static final Log logger = LogFactory.getLog(VNFTypeDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<VNFType> getVNFTypeData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<VNFType> vnfTypeData = null;
+        try {
+        	Criteria cr = session.createCriteria(VNFType.class);
+            vnfTypeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VNFType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return vnfTypeData;
+		
+	}
+
+	@Override
+	public void Save(VNFType vnfType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(vnfType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving VNFType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(VNFType vnfType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(vnfType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting VNFType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(VNFType vnfType) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(vnfType);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating VNFType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getVNFTypeDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(VNFType.class);
+            List<VNFType> vnfTypeData = cr.list();    
+            for(int i = 0; i < vnfTypeData.size(); i++){
+            	 data.add(vnfTypeData.get(i).getVnftype());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VNFType Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+		
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VSCLActionDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VSCLActionDaoImpl.java
new file mode 100644
index 0000000..8ab6bfd
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VSCLActionDaoImpl.java
@@ -0,0 +1,158 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.VSCLActionDao;
+import org.openecomp.policy.rest.jpa.VSCLAction;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("VSCLActionDao")
+public class VSCLActionDaoImpl implements VSCLActionDao{
+	private static final Log logger = LogFactory.getLog(VSCLActionDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<VSCLAction> getVSCLActionData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<VSCLAction> vSCLActionData = null;
+        try {
+        	Criteria cr = session.createCriteria(VSCLAction.class);
+            vSCLActionData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VSCLAction Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return vSCLActionData;
+		
+	}
+
+	@Override
+	public void Save(VSCLAction vSCLAction) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(vSCLAction);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving VSCLAction Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(VSCLAction vSCLAction) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(vSCLAction);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting VSCLAction Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(VSCLAction vSCLAction) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(vSCLAction);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating VSCLAction Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getVsclActionDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(VSCLAction.class);
+            List<VSCLAction> vSCLActionData = cr.list();     
+            for(int i = 0; i < vSCLActionData.size(); i++){
+            	 data.add(vSCLActionData.get(i).getVsclaction());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VSCLAction Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VarbindDictionaryDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VarbindDictionaryDaoImpl.java
new file mode 100644
index 0000000..dba3a0d
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/VarbindDictionaryDaoImpl.java
@@ -0,0 +1,181 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.VarbindDictionaryDao;
+import org.openecomp.policy.rest.jpa.VarbindDictionary;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("VarbindDictionaryDao")
+public class VarbindDictionaryDaoImpl implements VarbindDictionaryDao {
+	private static final Log logger = LogFactory.getLog(VarbindDictionaryDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<VarbindDictionary> getVarbindDictionaryData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<VarbindDictionary> varbindDictionaryData = null;
+        try {
+        	Criteria cr = session.createCriteria(VarbindDictionary.class);
+            varbindDictionaryData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return varbindDictionaryData;
+		
+	}
+
+	@Override
+	public void Save(VarbindDictionary varbindDictionary) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(varbindDictionary);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(VarbindDictionary varbindDictionary) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(varbindDictionary);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(VarbindDictionary varbindDictionary) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(varbindDictionary);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getVarbindDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(VarbindDictionary.class);
+            List<VarbindDictionary> varbindDictionaryData = cr.list();
+            for(int i = 0; i < varbindDictionaryData.size(); i++){
+            	 data.add(varbindDictionaryData.get(i).getVarbindName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+	@Override
+	public List<VarbindDictionary> getVarbindEntityByName(String value) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<VarbindDictionary> data = null;
+		try {
+			Criteria cr = session.createCriteria(VarbindDictionary.class);
+			cr.add(Restrictions.eq("varbindName",value));
+			data = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying VarbindDictionary Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ZoneDaoImpl.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ZoneDaoImpl.java
new file mode 100644
index 0000000..865a085
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/daoimpl/ZoneDaoImpl.java
@@ -0,0 +1,159 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.daoimpl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.openecomp.policy.pap.xacml.rest.HibernateSession;
+import org.openecomp.policy.rest.dao.ZoneDao;
+import org.openecomp.policy.rest.jpa.Zone;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+@Service("ZoneDao")
+public class ZoneDaoImpl implements ZoneDao{
+	private static final Log logger = LogFactory.getLog(ZoneDaoImpl.class);
+	@Autowired
+	SessionFactory sessionfactory;
+	
+	public SessionFactory getSessionfactory() {
+		return sessionfactory;
+	}
+
+	public void setSessionfactory(SessionFactory sessionfactory) {
+		this.sessionfactory = sessionfactory;
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<Zone> getZoneData() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<Zone> attributeData = null;
+        try {
+        	Criteria cr = session.createCriteria(Zone.class);
+            attributeData = cr.list();
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying Zone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return attributeData;
+		
+	}
+
+	@Override
+	public void Save(Zone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.persist(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Saving Zone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@Override
+	public void delete(Zone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.delete(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Deleting Zone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+	}
+
+	@Override
+	public void update(Zone attribute) {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		try {
+			session.update(attribute);
+			tx.commit();	
+		}catch(Exception e){
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Updating Zone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public List<String> getZoneDataByName() {
+		Session session = HibernateSession.getSessionFactory();
+		Transaction tx = session.beginTransaction();
+		List<String> data = new ArrayList<String>();
+        try {
+        	Criteria cr = session.createCriteria(Zone.class);
+            List<Zone> attributeData = cr.list();
+            
+            for(int i = 0; i < attributeData.size(); i++){
+            	 data.add(attributeData.get(i).getZoneName());
+            }
+			tx.commit();
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Querying Zone Table"+e);	
+		}finally{
+			try{
+				session.close();
+			}catch(Exception e1){
+				logger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error While Closing Connection/Statement"+e1);
+			}
+		}
+		return data;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/PDPPolicyContainer.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/PDPPolicyContainer.java
new file mode 100644
index 0000000..e91c79a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/PDPPolicyContainer.java
@@ -0,0 +1,349 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.model;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.openecomp.policy.pap.xacml.rest.util.PolicyContainer;
+import org.openecomp.policy.pap.xacml.rest.util.PolicyItemSetChangeNotifier;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.api.pap.PDP;
+import com.att.research.xacml.api.pap.PDPGroup;
+import com.att.research.xacml.api.pap.PDPPolicy;
+import org.openecomp.policy.xacml.std.pap.StdPDPPolicy;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class PDPPolicyContainer extends PolicyItemSetChangeNotifier implements PolicyContainer.Indexed {
+	private static final long serialVersionUID = 1L;
+	private static Logger logger	= FlexLogger.getLogger(PDPPolicyContainer.class);
+	
+	 /**
+     * String identifier of a file's "Id" property.
+     */
+    public static String PROPERTY_ID = "Id";
+
+   /**
+     * String identifier of a file's "name" property.
+     */
+    public static String PROPERTY_NAME = "Name";
+
+    /**
+      * String identifier of a file's "name" property.
+      */
+     public static String PROPERTY_VERSION = "Version";
+     
+    /**
+     * String identifier of a file's "Description" property.
+     */
+    public static String PROPERTY_DESCRIPTION = "Description";
+    
+    /**
+     * String identifier of a file's "IsRoot" property.
+     */
+    public static String PROPERTY_ISROOT = "Root";
+
+    /**
+     * List of the string identifiers for the available properties.
+     */
+    public static Collection<String> PDPPOLICY_PROPERTIES;
+ 
+    private final Object data;
+    private List<PDPPolicy> policies;
+    
+	@SuppressWarnings("unchecked")
+	public PDPPolicyContainer(Object data) {
+		super();
+		this.data = data;
+		if (this.data instanceof PDPGroup) {
+			policies = new ArrayList<PDPPolicy> (((PDPGroup) this.data).getPolicies());
+		}
+		if (this.data instanceof PDP) {
+			policies = new ArrayList<PDPPolicy> (((PDP) this.data).getPolicies());
+		}
+		if (this.data instanceof Set) {
+			policies = new ArrayList<PDPPolicy> ((Set<PDPPolicy>)data);
+		}
+		if (this.policies == null) {
+			logger.info("NULL policies");
+			throw new NullPointerException("PDPPolicyContainer created with unexpected Object type '" + data.getClass().getName() + "'");
+		}
+		this.setContainer(this);
+	}
+	
+	@Override
+	public Object nextItemId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("nextItemId: " + itemId);
+		}
+		int index = this.policies.indexOf(itemId);
+		if (index == -1 || ((index + 1) >= this.policies.size())) {
+			return null;
+		}		
+		return new PDPPolicyItem(this.policies.get(index + 1));
+	}
+
+	@Override
+	public Object prevItemId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("prevItemId: " + itemId);
+		}
+		int index = this.policies.indexOf(itemId);
+		if (index <= 0) {
+			return null;
+		}
+		return new PDPPolicyItem(this.policies.get(index - 1));
+	}
+
+	@Override
+	public Object firstItemId() {
+		if (logger.isTraceEnabled()) {
+			logger.trace("firstItemId: ");
+		}
+		if (this.policies.isEmpty()) {
+			return null;
+		}
+		return new PDPPolicyItem(this.policies.get(0));
+	}
+
+	@Override
+	public Object lastItemId() {
+		if (logger.isTraceEnabled()) {
+			logger.trace("lastItemid: ");
+		}
+		if (this.policies.isEmpty()) {
+			return null;
+		}
+		return new PDPPolicyItem(this.policies.get(this.policies.size() - 1));
+	}
+
+	@Override
+	public boolean isFirstId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("isFirstId: " + itemId);
+		}
+		if (this.policies.isEmpty()) {
+			return false;
+		}
+		return (itemId.equals(this.policies.get(0)));
+	}
+
+	@Override
+	public boolean isLastId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("isLastId: " + itemId);
+		}
+		if (this.policies.isEmpty()) {
+			return false;
+		}
+		return (itemId.equals(this.policies.get(this.policies.size() - 1)));
+	}
+
+	@Override
+	public Object addItemAfter(Object previousItemId)
+			throws UnsupportedOperationException {
+		return null;
+	}
+
+	@Override
+	public Collection<?> getContainerPropertyIds() {
+		return PDPPOLICY_PROPERTIES;
+	}
+
+	@Override
+	public Collection<?> getItemIds() {
+		final Collection<Object> items = new ArrayList<Object>();
+		items.addAll(this.policies);
+		return Collections.unmodifiableCollection(items);
+	}
+	
+	
+	@Override
+	public Class<?> getType(Object propertyId) {
+        if (propertyId.equals(PROPERTY_ID)) {
+            return String.class;
+        }
+        if (propertyId.equals(PROPERTY_NAME)) {
+            return String.class;
+        }
+        if (propertyId.equals(PROPERTY_VERSION)) {
+            return String.class;
+        }
+        if (propertyId.equals(PROPERTY_DESCRIPTION)) {
+            return String.class;
+        }
+        if (propertyId.equals(PROPERTY_ISROOT)) {
+            return Boolean.class;
+        }
+		return null;
+	}
+
+	@Override
+	public int size() {
+		if (logger.isTraceEnabled()) {
+			logger.trace("size: " + this.policies.size());
+		}
+		return this.policies.size();
+	}
+
+	@Override
+	public boolean containsId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("containsId: " + itemId);
+		}
+		return this.policies.contains(itemId);
+	}
+
+	@Override
+	public Object addItem() throws UnsupportedOperationException {
+		throw new UnsupportedOperationException("Cannot add an empty policy.");
+	}
+
+	@Override
+	public boolean removeItem(Object itemId)
+			throws UnsupportedOperationException {
+		if (logger.isTraceEnabled()) {
+			logger.trace("removeItem: " + itemId);
+		}
+		ObjectMapper mapper = new ObjectMapper();
+		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+		StdPDPPolicy pdpPolicy = null;
+		try {
+			pdpPolicy = mapper.readValue(itemId.toString() , StdPDPPolicy.class);
+			for(int i = 0; i< policies.size(); i++){
+				if(policies.get(i).getId().equalsIgnoreCase(pdpPolicy.getId())){
+					return this.policies.remove(this.policies.get(i));
+				}
+			}
+		} catch (Exception e) {
+			logger.error(XACMLErrorConstants.ERROR_DATA_ISSUE + "Exception Occured While Mapping the Removing Policy from PDP Group to Std Policy"+e);
+		}	
+		return this.policies.remove(itemId);
+	}
+
+	@Override
+	public boolean addContainerProperty(Object propertyId, Class<?> type,
+			Object defaultValue) throws UnsupportedOperationException {
+		return false;
+	}
+
+	@Override
+	public boolean removeContainerProperty(Object propertyId)
+			throws UnsupportedOperationException {
+		return false;
+	}
+
+	@Override
+	public boolean removeAllItems() throws UnsupportedOperationException {
+		return false;
+	}
+
+	@Override
+	public int indexOfId(Object itemId) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("indexOfId: " + itemId);
+		}
+		return this.policies.indexOf(itemId);
+	}
+
+	@Override
+	public Object getIdByIndex(int index) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("getIdByIndex: " + index);
+		}
+		return this.policies.get(index);
+	}
+
+	@Override
+	public List<?> getItemIds(int startIndex, int numberOfItems) {
+		if (logger.isTraceEnabled()) {
+			logger.trace("getItemIds: " + startIndex + " " + numberOfItems);
+		}
+		if (numberOfItems < 0) {
+			throw new IllegalArgumentException();
+		}
+		return this.policies.subList(startIndex, startIndex + numberOfItems);
+	}
+
+	@Override
+	public Object addItemAt(int index) throws UnsupportedOperationException {
+		if (logger.isTraceEnabled()) {
+			logger.trace("addItemAt: " + index);
+		}
+		return null;
+	}
+
+	public class PDPPolicyItem {
+		private final PDPPolicy policy;
+		
+		public PDPPolicyItem(PDPPolicy itemId) {
+			this.policy = itemId;
+		}
+
+		public String getId() {
+			if (logger.isTraceEnabled()) {
+				logger.trace("getId: " + this.policy);
+			}
+			return this.policy.getId();
+		}
+		
+		public String getName() {
+			if (logger.isTraceEnabled()) {
+				logger.trace("getName: " + this.policy);
+			}
+			return this.policy.getName();
+		}
+		
+		public String getVersion() {
+			if (logger.isTraceEnabled()) {
+				logger.trace("getVersion: " + this.policy);
+			}
+			return this.policy.getVersion();
+		}
+		
+		public String getDescription() {
+			if (logger.isTraceEnabled()) {
+				logger.trace("getDescription: " + this.policy);
+			}
+			return this.policy.getDescription();
+		}
+		
+		public boolean getRoot() {
+			if (logger.isTraceEnabled()) {
+				logger.trace("isRoot: " + this.policy);
+			}
+			return this.policy.isRoot();
+		}
+		
+		public void setRoot(Boolean root) {
+			((StdPDPPolicy)this.policy).setRoot(root);
+		}
+	
+	}
+}
\ No newline at end of file
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/RemoveGroupPolicy.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/RemoveGroupPolicy.java
new file mode 100644
index 0000000..bb6e118
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/RemoveGroupPolicy.java
@@ -0,0 +1,105 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.model;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.openecomp.policy.pap.xacml.rest.model.PDPPolicyContainer;
+
+import com.att.research.xacml.api.pap.PDPGroup;
+import com.att.research.xacml.api.pap.PDPPolicy;
+
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+
+public class RemoveGroupPolicy {
+
+	
+	//Container from where we are fetching the policies
+	private static PDPPolicyContainer policyContainer;
+		
+	private final RemoveGroupPolicy self = this;
+	private StdPDPGroup updatedObject;
+	private final StdPDPGroup group;
+	private boolean isSaved = false;
+	
+	public RemoveGroupPolicy(StdPDPGroup group) {
+		
+		this.group = group;
+		
+	}
+	
+	public void prepareToRemove(PDPPolicy policy) {
+		
+		if (this.group == null) {
+			return;
+		}
+
+		RemoveGroupPolicy.policyContainer = new PDPPolicyContainer(group);
+
+		RemoveGroupPolicy.policyContainer.removeItem(policy);
+									
+		self.doSave();
+		
+		self.isSaved = true;
+		
+	}
+	
+	@SuppressWarnings("unchecked")
+	protected void doSave() {
+		if (this.group == null) {
+			return;
+		}
+		
+		//StdPDPGroup pdpGroup = (StdPDPGroup) group;
+		StdPDPGroup updatedGroupObject = new StdPDPGroup(
+				group.getId(), 
+				group.isDefaultGroup(), 
+				group.getName(), 
+				group.getDescription(), 
+				null);
+		
+		// replace the original set of Policies with the set from the container (possibly modified by the user)
+		Set<PDPPolicy> changedPolicies = new HashSet<PDPPolicy>();
+		changedPolicies.addAll((Collection<PDPPolicy>) RemoveGroupPolicy.policyContainer.getItemIds());
+		updatedGroupObject.setPolicies(changedPolicies);
+		updatedGroupObject.setEcompPdps(this.group.getEcompPdps());
+		
+		// replace the original set of PIP Configs with the set from the container
+		updatedGroupObject.setPipConfigs(this.group.getPipConfigs());
+		
+		// copy those things that the user cannot change from the original to the new object
+		updatedGroupObject.setStatus(this.group.getStatus());
+		
+		this.updatedObject = updatedGroupObject;			
+	}
+	
+	public boolean isRemoved() {
+		return this.isSaved;
+	}
+		
+	public EcompPDPGroup getUpdatedObject() {
+		return this.updatedObject;
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/package-info.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/package-info.java
new file mode 100644
index 0000000..4f7d76a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/model/package-info.java
@@ -0,0 +1,27 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * 
+ */
+/**
+ *
+ */
+package org.openecomp.policy.pap.xacml.rest.model;
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JPAUtils.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JPAUtils.java
new file mode 100644
index 0000000..5326cb2
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JPAUtils.java
@@ -0,0 +1,242 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+import javax.servlet.ServletException;
+
+import org.openecomp.policy.rest.XacmlAdminAuthorization;
+import org.openecomp.policy.rest.jpa.Attribute;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+import org.openecomp.policy.rest.jpa.GlobalRoleSettings;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+public class JPAUtils {
+	private static Logger logger	= FlexLogger.getLogger(JPAUtils.class);
+	
+	private EntityManagerFactory emf;
+	private static final Object mapAccess = new Object();
+	private static Map<Datatype, List<FunctionDefinition>> mapDatatype2Function = null;
+	private static Map<String, FunctionDefinition> mapID2Function = null;
+	private static JPAUtils currentInstance = null;
+	
+	//private static List<LockdownListener> lockdownListeners = new ArrayList<LockdownListener>();
+	
+	/**
+	 * Get an instance of a JPAUtils. It creates one if it does not exist.
+	 * Only one instance is allowed to be created per server.
+	 * @param emf The EntityFactoryManager to be used for database connections
+	 * @return The new instance of JPAUtils or throw exception if the given emf is null.
+	 * @throws IllegalStateException if a JPAUtils has already been constructed. Call getJPAUtilsInstance() to get this.
+	 */
+	public static JPAUtils getJPAUtilsInstance(EntityManagerFactory emf) throws Exception{
+		logger.debug("getJPAUtilsInstance(EntityManagerFactory emf) as getJPAUtilsInstance("+emf+") called");
+		if(currentInstance == null){
+			if(emf != null){
+				currentInstance = new JPAUtils(emf);
+				return currentInstance;
+			}
+			throw new IllegalStateException("The EntityManagerFactory is Null");
+		}
+		return currentInstance;
+	}
+	
+	private JPAUtils(EntityManagerFactory emf){
+		logger.debug("JPAUtils(EntityManagerFactory emf) as JPAUtils("+emf+") called");
+		this.emf = emf;	
+	}
+	
+	/**
+	 * Gets the current instance of JPAUtils. 
+	 * @return The instance of JPAUtils or throws exception if the given instance is null.
+	 * @throws IllegalStateException if a JPAUtils instance is null. Call getJPAUtilsInstance(EntityManagerFactory emf) to get this.
+	 */
+	public static JPAUtils getJPAUtilsInstance() throws Exception{
+		logger.debug("getJPAUtilsInstance() as getJPAUtilsInstance() called");
+		if(currentInstance != null){
+			return currentInstance;
+		}
+		throw new IllegalStateException("The JPAUtils.currentInstance is Null.  Use getJPAUtilsInstance(EntityManagerFactory emf)");
+	}
+	
+	public static AttributeDesignatorType	createDesignator(Attribute attribute) {
+		AttributeDesignatorType designator = new AttributeDesignatorType();
+		designator.setAttributeId(attribute.getXacmlId());
+		if (attribute.getCategoryBean() != null) {
+			designator.setCategory(attribute.getCategoryBean().getXacmlId());
+		} else {
+			logger.warn("No category bean");
+		}
+		if (attribute.getDatatypeBean() != null) {
+			designator.setDataType(attribute.getDatatypeBean().getXacmlId());
+		} else {
+			logger.warn("No datatype bean");
+		}
+		designator.setIssuer(attribute.getIssuer());
+		designator.setMustBePresent(attribute.isMustBePresent());
+		return designator;
+	}
+		
+	public static AttributeSelectorType	createSelector(Attribute attribute) {
+		AttributeSelectorType selector = new AttributeSelectorType();
+		selector.setContextSelectorId(attribute.getXacmlId());
+		selector.setPath(attribute.getSelectorPath());
+		if (attribute.getCategoryBean() != null) {
+			selector.setCategory(attribute.getCategoryBean().getXacmlId());
+		} else {
+			logger.warn("No category bean");
+		}
+		if (attribute.getDatatypeBean() != null) {
+			selector.setDataType(attribute.getDatatypeBean().getXacmlId());
+		} else {
+			logger.warn("No datatype bean");
+		}
+		selector.setMustBePresent(attribute.isMustBePresent());
+		return selector;
+	}
+	
+	/**
+	 * Builds a map in memory of a functions return datatype to function definition. Useful in limiting the number
+	 * of SQL calls to DB especially when we don't expect these to change much.
+	 * 
+	 * @return - A HashMap of Datatype JPA Container ID's to FunctionDefinition objects
+	 */
+	public Map<Datatype, List<FunctionDefinition>>	getFunctionDatatypeMap() {		
+		
+		synchronized(mapAccess) {
+			if (mapDatatype2Function == null||mapDatatype2Function.isEmpty()) {
+				try {
+					buildFunctionMaps();
+				} catch (ServletException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+		return mapDatatype2Function;
+	}
+	
+	public Map<String, FunctionDefinition> getFunctionIDMap() {
+		synchronized(mapAccess) {
+			if (mapID2Function == null||mapID2Function.equals("{}")) {
+				try {
+					buildFunctionMaps();
+				} catch (ServletException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+		return mapID2Function;
+	}
+	
+	private void buildFunctionMaps() throws ServletException {
+		mapDatatype2Function = new HashMap<Datatype, List<FunctionDefinition>>();
+		mapID2Function = new HashMap<String, FunctionDefinition>();
+
+		EntityManager em = emf.createEntityManager();
+		Query getFunctionDefinitions = em.createNamedQuery("FunctionDefinition.findAll");	
+		List<?> functionList = getFunctionDefinitions.getResultList(); 	
+		
+		for (Object id : functionList) {
+			FunctionDefinition value = (FunctionDefinition)id;
+			mapID2Function.put(value.getXacmlid(), value);
+			if (mapDatatype2Function.containsKey(value.getDatatypeBean()) == false) {
+				mapDatatype2Function.put(value.getDatatypeBean(), new ArrayList<FunctionDefinition>());
+			}
+			mapDatatype2Function.get(value.getDatatypeBean()).add(value);
+		}
+
+		em.close();
+		
+	}
+	
+	/**
+	 * Returns the lockdown value, in case of exception it is assumed that lockdown functionality
+	 * is not supported and returns false.
+	 * 
+	 * 
+	 * @throws ReadOnlyException
+	 * @throws ConversionException
+	 */
+	public boolean dbLockdownIgnoreErrors() {
+		if (logger.isTraceEnabled())
+			logger.trace("ENTER");
+		
+		boolean lockdown = false;
+		try {
+			lockdown = dbLockdown();
+		} catch (Exception e) {
+			logger.warn("Cannot access DB lockdown value", e);
+		}
+		return lockdown;
+	}
+	
+	/**
+	 * Returns the lockdown value from the database.
+	 * 
+	 * @throws ReadOnlyException
+	 * @throws ConversionException
+	 */
+	public boolean dbLockdown() 
+			throws  IllegalAccessException {
+		if (logger.isTraceEnabled())
+			logger.trace("ENTER");
+		
+		EntityManager em = emf.createEntityManager();
+		Query globalRoleSettingsJPA = em.createNamedQuery("GlobalRoleSettings.findAll");	
+		
+		GlobalRoleSettings globalRoleSettings = (GlobalRoleSettings) globalRoleSettingsJPA.getSingleResult();
+		
+		if (globalRoleSettings == null) {
+			// this should not happen
+			String msg = "NO GlobalSetttings for " + XacmlAdminAuthorization.Role.ROLE_SUPERADMIN.toString();
+			if (logger.isErrorEnabled())
+				logger.error(msg);
+			throw new IllegalAccessException(msg);
+		}
+		
+		if (!globalRoleSettings.getRole().equals(XacmlAdminAuthorization.Role.ROLE_SUPERADMIN.toString())) {
+			String msg = "NOT FOUND db data for " + XacmlAdminAuthorization.Role.ROLE_SUPERADMIN.toString();
+			if (logger.isErrorEnabled())
+				logger.error(msg);
+			throw new IllegalAccessException(msg);
+		}
+		
+		return globalRoleSettings.isLockdown();
+	}
+	
+	
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JsonMessage.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JsonMessage.java
new file mode 100644
index 0000000..3e93510
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/JsonMessage.java
@@ -0,0 +1,67 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.util;
+
+public class JsonMessage {
+
+	private String data;
+	private String data2;
+	private String data3;
+	public JsonMessage(String data) {
+		super();
+		this.data = data;
+	}
+	public JsonMessage(String data,String data2) {
+		super();
+		this.data = data;
+		this.data2 = data2;
+	}
+
+	public JsonMessage(String data,String data2,String data3) {
+		super();
+		this.data = data;
+		this.data2 = data2;
+		this.data3 = data3;
+	}
+	
+	public String getData() {
+		return data;
+	}
+
+	public void setData(String data) {
+		this.data = data;
+	}
+	public String getData2() {
+		return data2;
+	}
+	public void setData2(String data2) {
+		this.data2 = data2;
+	}
+	public String getData3() {
+		return data3;
+	}
+	public void setData3(String data3) {
+		this.data3 = data3;
+	}
+	
+	
+}
+
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyContainer.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyContainer.java
new file mode 100644
index 0000000..3741dbd
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyContainer.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.util;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+
+
+public interface PolicyContainer extends Serializable{
+	
+    public Collection<?> getContainerPropertyIds();
+    
+    public Collection<?> getItemIds();
+
+    public Class<?> getType(Object propertyId);
+
+    public int size();
+  
+    public boolean containsId(Object itemId);
+
+    public Object addItem() throws UnsupportedOperationException;
+    
+    public boolean removeItem(Object itemId)
+            throws UnsupportedOperationException;
+
+    public boolean addContainerProperty(Object propertyId, Class<?> type,
+            Object defaultValue) throws UnsupportedOperationException;
+   
+    public boolean removeContainerProperty(Object propertyId)
+            throws UnsupportedOperationException;
+
+    public boolean removeAllItems() throws UnsupportedOperationException;
+
+    public interface Ordered extends PolicyContainer {
+
+        public Object nextItemId(Object itemId);
+
+        public Object prevItemId(Object itemId);
+
+        public Object firstItemId();
+
+        public Object lastItemId();
+
+        public boolean isFirstId(Object itemId);
+
+        public boolean isLastId(Object itemId);
+
+        public Object addItemAfter(Object previousItemId)
+                throws UnsupportedOperationException;
+        
+    }
+
+    
+    public interface Indexed extends Ordered {
+
+        public int indexOfId(Object itemId);
+
+        public Object getIdByIndex(int index);
+
+        public List<?> getItemIds(int startIndex, int numberOfItems);
+        
+        public Object addItemAt(int index) throws UnsupportedOperationException;
+
+        public interface ItemAddEvent extends ItemSetChangeEvent {
+
+            public Object getFirstItemId();
+
+            public int getFirstIndex();
+
+            public int getAddedItemsCount();
+        }
+
+     
+        public interface ItemRemoveEvent extends ItemSetChangeEvent {
+          
+            public Object getFirstItemId();
+
+            public int getFirstIndex();
+
+            public int getRemovedItemsCount();
+        }
+    }
+  
+    public interface ItemSetChangeEvent extends Serializable {
+
+        public PolicyContainer getContainer();
+    }
+
+    public interface ItemSetChangeListener extends Serializable {
+
+        public void containerItemSetChange(PolicyContainer.ItemSetChangeEvent event);
+    }
+
+    public interface ItemSetChangeNotifier extends Serializable {
+
+        public void addItemSetChangeListener(
+                PolicyContainer.ItemSetChangeListener listener);
+
+        public void removeItemSetChangeListener(
+                PolicyContainer.ItemSetChangeListener listener);
+    }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyItemSetChangeNotifier.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyItemSetChangeNotifier.java
new file mode 100644
index 0000000..da92784
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/rest/util/PolicyItemSetChangeNotifier.java
@@ -0,0 +1,96 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP Policy Engine
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.util;
+
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.EventObject;
+import java.util.LinkedList;
+
+import org.openecomp.policy.pap.xacml.rest.util.PolicyContainer.ItemSetChangeEvent;
+import org.openecomp.policy.pap.xacml.rest.util.PolicyContainer.ItemSetChangeListener;
+
+
+
+
+public class PolicyItemSetChangeNotifier implements PolicyContainer.ItemSetChangeNotifier {
+	private static final long serialVersionUID = 1L;
+    private Collection<PolicyContainer.ItemSetChangeListener> itemSetChangeListeners = null;
+    private PolicyContainer container = null;
+    
+    public PolicyItemSetChangeNotifier() {
+    }
+    
+    protected void setContainer(PolicyContainer c) {
+    	this.container = c;
+    }
+
+	@Override
+	public void addItemSetChangeListener(ItemSetChangeListener listener) {
+        if (getItemSetChangeListeners() == null) {
+            setItemSetChangeListeners(new LinkedList<PolicyContainer.ItemSetChangeListener>());
+        }
+        getItemSetChangeListeners().add(listener);	}
+
+	@Override
+	public void removeItemSetChangeListener(ItemSetChangeListener listener) {
+        if (getItemSetChangeListeners() != null) {
+            getItemSetChangeListeners().remove(listener);
+        }
+    }
+	
+	protected static class BaseItemSetChangeEvent extends EventObject implements
+	    PolicyContainer.ItemSetChangeEvent, Serializable {
+		private static final long serialVersionUID = 1L;
+
+		protected BaseItemSetChangeEvent(PolicyContainer source) {
+		    super(source);
+		}
+		
+		@Override
+		public PolicyContainer getContainer() {
+		    return (PolicyContainer) getSource();
+		}
+	}
+
+    protected void setItemSetChangeListeners(
+            Collection<PolicyContainer.ItemSetChangeListener> itemSetChangeListeners) {
+        this.itemSetChangeListeners = itemSetChangeListeners;
+    }
+    protected Collection<PolicyContainer.ItemSetChangeListener> getItemSetChangeListeners() {
+        return itemSetChangeListeners;
+    }
+  
+    protected void fireItemSetChange() {
+        fireItemSetChange(new BaseItemSetChangeEvent(this.container));
+    }
+
+    protected void fireItemSetChange(ItemSetChangeEvent event) {
+        if (getItemSetChangeListeners() != null) {
+            final Object[] l = getItemSetChangeListeners().toArray();
+            for (int i = 0; i < l.length; i++) {
+                ((PolicyContainer.ItemSetChangeListener) l[i])
+                        .containerItemSetChange(event);
+            }
+        }
+    }
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/AuthenticationService.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/AuthenticationService.java
new file mode 100644
index 0000000..003585b
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/AuthenticationService.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.restAuth;
+
+import java.util.Base64;
+import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.rest.XACMLRestProperties;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class AuthenticationService {
+	private String papID = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_USERID);
+	private String papPass = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_PASS);
+	private static final Logger logger = FlexLogger.getLogger(AuthenticationService.class);
+	
+	public boolean authenticate(String authCredentials) {
+
+		if (null == authCredentials)
+			return false;
+		// header value format will be "Basic encodedstring" for Basic authentication. 
+		final String encodedUserPassword = authCredentials.replaceFirst("Basic"	+ " ", "");
+		String usernameAndPassword = null;
+		try {
+			byte[] decodedBytes = Base64.getDecoder().decode(encodedUserPassword);
+			usernameAndPassword = new String(decodedBytes, "UTF-8");
+		} catch (Exception e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "AuthenticationService", "Exception decoding username and password");
+			return false;
+		}
+		try {
+			final StringTokenizer tokenizer = new StringTokenizer(usernameAndPassword, ":");
+			final String username = tokenizer.nextToken();
+			final String password = tokenizer.nextToken();
+
+			boolean authenticationStatus = papID.equals(username)	&& papPass.equals(password);
+			return authenticationStatus;
+		} catch (Exception e){
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "AuthenticationService", "Exception authenticating user");
+			return false;
+		}
+	}
+	
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/CheckPDP.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/CheckPDP.java
new file mode 100644
index 0000000..ce35a70
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/CheckPDP.java
@@ -0,0 +1,203 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.restAuth;
+
+import org.openecomp.policy.common.logging.eelf.MessageCodes;
+import org.openecomp.policy.common.logging.eelf.PolicyLogger;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+
+import org.openecomp.policy.xacml.api.XACMLErrorConstants;
+
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class CheckPDP {
+
+	private static Path pdpPath = null;
+	private static Properties pdpProp = null;
+	private static Long oldModified = null;
+	private static Long newModified = null;
+	private static HashMap<String, String> pdpMap = null;
+	private static final Logger logger = FlexLogger.getLogger(CheckPDP.class);
+
+	public static boolean validateID(String id) {
+		// ReadFile
+		try {
+			readFile();
+		} catch (Exception e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CheckPDP", "Exception reading file");
+			return false;
+		}
+		// Check ID
+		if (pdpMap.containsKey(id)) {
+			return true;
+		}
+		return false;
+	}
+
+	private static void readFile() throws Exception {
+		String pdpFile = XACMLPapServlet.getPDPFile();
+		if (pdpFile == null) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "PDP File name not Valid : " + pdpFile);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + "PDP File name is undefined");
+			throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"PDP File name not Valid : " + pdpFile);
+		}
+		if (pdpPath == null) {
+			pdpPath = Paths.get(pdpFile);
+			if (Files.notExists(pdpPath)) {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "File doesn't exist in the specified Path : "	+ pdpPath.toString());
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + "File doesn't exist in the specified Path");
+				throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"File doesn't exist in the specified Path : "+ pdpPath.toString());
+			} 
+			if (pdpPath.toString().endsWith(".properties")) {
+				readProps();
+			} else {
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Not a .properties file " + pdpFile);
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR + "Not a .properties file");
+				throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"Not a .properties file");
+			}
+		}
+		// Check if File is updated recently
+		else {
+			newModified = pdpPath.toFile().lastModified();
+			if (newModified != oldModified) {
+				// File has been updated.
+				readProps();
+			}
+		}
+	}
+
+	private static void readProps() throws Exception {
+		InputStream in;
+		pdpProp = new Properties();
+		try {
+			in = new FileInputStream(pdpPath.toFile());
+			oldModified = pdpPath.toFile().lastModified();
+			pdpProp.load(in);
+		} catch (IOException e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CheckPDP", "Cannot load the Properties file");
+			throw new Exception("Cannot Load the Properties file", e);
+		}
+		// Read the Properties and Load the PDPs and encoding.
+		pdpMap = new HashMap<String, String>();
+		// Check the Keys for PDP_URLs
+		Collection<Object> unsorted = pdpProp.keySet();
+		List<String> sorted = new ArrayList(unsorted);
+		Collections.sort(sorted);
+		for (String propKey : sorted) {
+			if (propKey.startsWith("PDP_URL")) {
+				String check_val = pdpProp.getProperty(propKey);
+				if (check_val == null) {
+					throw new Exception("Properties file doesn't have the PDP_URL parameter");
+				}
+				if (check_val.contains(";")) {
+					List<String> pdp_default = new ArrayList<String>(Arrays.asList(check_val.split("\\s*;\\s*")));
+					int pdpCount = 0;
+					while (pdpCount < pdp_default.size()) {
+						String pdpVal = pdp_default.get(pdpCount);
+						readPDPParam(pdpVal);
+						pdpCount++;
+					}
+				} else {
+					readPDPParam(check_val);
+				}
+			}
+		}
+		if (pdpMap == null || pdpMap.isEmpty()) {
+			logger.debug(XACMLErrorConstants.ERROR_SYSTEM_ERROR + "Cannot Proceed without PDP_URLs");
+			throw new Exception(XACMLErrorConstants.ERROR_SYSTEM_ERROR +"Cannot Proceed without PDP_URLs");
+		}
+	}
+
+	private static void readPDPParam(String pdpVal) throws Exception{
+		if(pdpVal.contains(",")){
+			List<String> pdpValues = new ArrayList<String>(Arrays.asList(pdpVal.split("\\s*,\\s*")));
+			if(pdpValues.size()==3){
+				// 1:2 will be UserID:Password
+				String userID = pdpValues.get(1);
+				String pass = pdpValues.get(2);
+				Base64.Encoder encoder = Base64.getEncoder();
+				// 0 - PDPURL
+				pdpMap.put(pdpValues.get(0), encoder.encodeToString((userID+":"+pass).getBytes(StandardCharsets.UTF_8)));
+			}else{
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_PERMISSIONS + "No Credentials to send Request: " + pdpValues);
+				PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + "No Credentials to send Request");
+				throw new Exception(XACMLErrorConstants.ERROR_PERMISSIONS + "No enough Credentials to send Request. " + pdpValues);
+			}
+		}else{
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_PERMISSIONS + "No Credentials to send Request: " + pdpVal);
+			PolicyLogger.error(MessageCodes.ERROR_PERMISSIONS + "No Credentials to send Request: " + pdpVal);
+			throw new Exception(XACMLErrorConstants.ERROR_PERMISSIONS +"No enough Credentials to send Request.");
+		}
+	}
+	
+	public static String getEncoding(String pdpID){
+		try {
+			readFile();
+		} catch (Exception e) {
+			//TODO:EELF Cleanup - Remove logger
+			//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+			PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CheckPDP", "Exeption reading Properties file");
+		}
+		String encoding = null;
+		if(pdpMap!=null && (!pdpMap.isEmpty())){
+			try{
+				encoding = pdpMap.get(pdpID);
+			} catch(Exception e){
+				//TODO:EELF Cleanup - Remove logger
+				//logger.error(XACMLErrorConstants.ERROR_SYSTEM_ERROR + e);
+				PolicyLogger.error(MessageCodes.ERROR_SYSTEM_ERROR, e, "CheckPDP", "Exception encoding");
+			}
+			return encoding;
+		}else{
+			return null;
+		}
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/PAPAuthenticationFilter.java b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/PAPAuthenticationFilter.java
new file mode 100644
index 0000000..8176294
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/java/org/openecomp/policy/pap/xacml/restAuth/PAPAuthenticationFilter.java
@@ -0,0 +1,130 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.restAuth;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+
+/**
+ * Servlet Filter implementation class PAPAuthenticationFilter
+ */
+@WebFilter("/*")
+public class PAPAuthenticationFilter implements Filter {
+
+	private static final Log logger	= LogFactory.getLog(PAPAuthenticationFilter.class);
+	public static final String AUTHENTICATION_HEADER = "Authorization";
+
+	@Override
+	public void doFilter(ServletRequest request, ServletResponse response,
+			FilterChain filter) throws IOException, ServletException {
+		
+		
+		if (request instanceof HttpServletRequest) {
+			HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+
+			String authCredentials = null;
+			String url = httpServletRequest.getRequestURI();
+			
+			logger.info("Request URI: " + url);
+			System.out.println("Request URI: " + url);
+			
+			//getting authentication credentials
+			if(url.contains("@Auth@")){
+				int authIndex = url.lastIndexOf("@");
+				int endAuthIndex = url.indexOf("/ecomp");
+				authCredentials = "Basic " + url.substring(authIndex+1, endAuthIndex);
+				
+				//parse the url for /pap/ecomp/
+				String url1 = url.substring(0, 4);
+				String url2 = url.substring(endAuthIndex, url.length());
+				url = url1 + url2;
+
+			} else {
+				authCredentials = httpServletRequest.getHeader(AUTHENTICATION_HEADER);
+			}
+			
+			// Check Authentication credentials
+			AuthenticationService authenticationService = new AuthenticationService();
+			boolean authenticationStatus = authenticationService.authenticate(authCredentials);
+			
+			if (authenticationStatus) {
+				//indicates the request comes from Traditional Admin Console or PolicyEngineAPI
+				if (url.equals("/pap/")){
+					logger.info("Request comes from Traditional Admin Console or PolicyEngineAPI");						
+					
+					//forward request to the XACMLPAPServlet if authenticated
+					request.getRequestDispatcher("/pap/pap/").forward(request, response);
+					
+				}else if (url.startsWith("/pap/ecomp/")){
+					
+					//indicates the request comes from the ECOMP Portal ecomp-sdk-app
+					if(response instanceof HttpServletResponse) {
+						HttpServletResponse alteredResponse = ((HttpServletResponse)response);
+						addCorsHeader(alteredResponse);
+						logger.info("Request comes from Ecomp Portal");
+						//Spring dispatcher servlet is at the end of the filter chain at /pap/ecomp/ path
+						System.out.println("New Request URI: " + url);
+						//request.getRequestDispatcher(url).forward(request, alteredResponse);
+						filter.doFilter(request, response);
+					}
+					
+				}
+				
+			} else {
+				if (response instanceof HttpServletResponse) {
+					HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+					httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+				}
+			}
+
+		}
+	}
+	
+	//method to add CorsHeaders for ecomp portal rest call
+	private void addCorsHeader(HttpServletResponse response) {
+		logger.info("Adding Cors Response Headers!!!");
+		response.addHeader("Access-Control-Allow-Origin", "*");
+        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
+        response.addHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
+        response.addHeader("Access-Control-Max-Age", "1728000");	
+	}
+
+	@Override
+	public void destroy() {
+	}
+
+	@Override
+	public void init(FilterConfig arg0) throws ServletException {
+	}
+}
diff --git a/ECOMP-PAP-REST/src/main/resources/META-INF/drop.ddl b/ECOMP-PAP-REST/src/main/resources/META-INF/drop.ddl
new file mode 100644
index 0000000..f7138ad
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/resources/META-INF/drop.ddl
@@ -0,0 +1,7 @@
+DROP TABLE IF EXISTS ConfigurationDataEntity
+DROP TABLE IF EXISTS PolicyEntity
+DROP TABLE IF EXISTS PolicyDBDaoEntity
+DROP TABLE IF EXISTS ActionBodyEntity
+DROP SEQUENCE IF EXISTS seqPolicy
+DROP SEQUENCE IF EXISTS seqConfig
+DROP SEQUENCE IF EXISTS seqActBody
diff --git a/ECOMP-PAP-REST/src/main/resources/META-INF/persistence.xml b/ECOMP-PAP-REST/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..1d7692a
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP-PAP-REST
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
+	<persistence-unit name="XACML-PAP-REST">
+		<class>org.openecomp.policy.rest.jpa.PolicyEntity</class>
+		<class>org.openecomp.policy.rest.jpa.ConfigurationDataEntity</class>		
+		<class>org.openecomp.policy.rest.jpa.PolicyDBDaoEntity</class>
+		<class>org.openecomp.policy.rest.jpa.GroupEntity</class>
+		<class>org.openecomp.policy.rest.jpa.PdpEntity</class>
+		<class>org.openecomp.policy.rest.jpa.ActionBodyEntity</class>
+		<class>org.openecomp.policy.rest.jpa.DatabaseLockEntity</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyVersion</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScore</class>
+		<class>org.openecomp.policy.rest.jpa.FunctionDefinition</class>
+		<class>org.openecomp.policy.rest.jpa.Attribute</class>
+		<class>org.openecomp.policy.rest.jpa.Category</class>
+		<class>org.openecomp.policy.rest.jpa.ConstraintType</class>
+		<class>org.openecomp.policy.rest.jpa.ConstraintValue</class>
+		<class>org.openecomp.policy.rest.jpa.Datatype</class>
+		<class>org.openecomp.policy.rest.jpa.FunctionArgument</class>
+		<class>org.openecomp.policy.rest.jpa.UserInfo</class>
+		<class>org.openecomp.policy.rest.jpa.ActionPolicyDict</class>
+		<class>org.openecomp.policy.rest.jpa.DecisionSettings</class>
+		<class>org.openecomp.policy.rest.jpa.MicroServiceModels</class>
+		<class>org.openecomp.policy.rest.jpa.BRMSParamTemplate</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyEditorScopes</class>
+		<!-- unique to PolicyEngineUtils - will be audited from PAP -->
+		<class>org.openecomp.policy.jpa.BackUpMonitorEntity</class>
+		<!-- unique to integrity-monitor - will be audited from PAP -->
+		<class>org.openecomp.policy.common.im.jpa.StateManagementEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ForwardProgressEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ResourceRegistrationEntity</class>
+		<!-- unique to integrity-audit - will be audited from PAP -->
+		<class>org.openecomp.policy.common.ia.jpa.IntegrityAuditEntity</class>
+		<exclude-unlisted-classes>false</exclude-unlisted-classes>
+		<shared-cache-mode>NONE</shared-cache-mode>
+		<properties>
+	<!--	The properties defined below are the default settings to be used when someone initially
+				wants to start working with the XACML-PAP-ADMIN web gui. They are not intended for production
+				use.
+				
+				They are setup to drop and create the tables and then load an initial set of data into the database
+				every time the application is deployed. So if you add anything to the dictionaries or PIP
+				configuration, they will get lost upon each deployment. It uses an H2 database engine configured
+				for a local file so you don't have to setup you're own SQL database environment to start.
+				
+				Instead of modifying this file directly, please refer to the xacml.admin.properties file for
+				customizing the application settings.
+				
+			 -->
+	<!--     <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
+			<property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/>
+			<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/views.sql" />
+			<property name="javax.persistence.schema-generation.drop-source" value="script"/>
+			<property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop.sql" />
+			<property name="javax.persistence.sql-load-script-source" value="META-INF/data.sql" />-->
+			
+			
+			
+		<!-- 	These properties should be set in the xacml.admin.properties file, so they can be re-used by non-JPA
+			database functionality.	 -->
+		<!-- 	
+			<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
+			<property name="javax.persistence.jdbc.url" value="jdbc:h2:file:sql/xacml"/>
+			<property name="javax.persistence.jdbc.user" value="sa"/>
+			<property name="javax.persistence.jdbc.password" value=""/>
+ 			-->
+		</properties>
+	</persistence-unit>
+
+<persistence-unit name="auditPapPU">
+		<!-- This is the persistence unit used by IntegrityAudit to determine
+		which classes to audit.  All the PAP classes are also included in 
+		XACML-PAP-ADMIN, so they will be audited there rather than having a
+		duplicate audit run from the XACL-PAP-REST node -->
+		<!-- unique to PolicyEngineUtils - will be audited from PAP -->
+		<class>org.openecomp.policy.jpa.BackUpMonitorEntity</class>
+		<!-- unique to integrity-monitor - will be audited from PAP -->
+		<class>org.openecomp.policy.common.im.jpa.StateManagementEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ForwardProgressEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ResourceRegistrationEntity</class>
+		<!-- unique to integrity-audit - will be audited from PAP -->
+		<class>org.openecomp.policy.common.ia.jpa.IntegrityAuditEntity</class>
+		<exclude-unlisted-classes>true</exclude-unlisted-classes>
+		<shared-cache-mode>NONE</shared-cache-mode>
+	</persistence-unit>
+
+	<persistence-unit name="testPapPU" transaction-type="RESOURCE_LOCAL">
+	<!-- This tests all the classes that will be audited in the XACML-PAP-REST and the XACML-PAP_ADMIN -->
+		<!-- XACML-PAP-REST -->
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+		<class>org.openecomp.policy.rest.jpa.PolicyEntity</class>
+		<class>org.openecomp.policy.rest.jpa.ConfigurationDataEntity</class>		
+		<class>org.openecomp.policy.rest.jpa.PolicyDBDaoEntity</class>
+		<class>org.openecomp.policy.rest.jpa.GroupEntity</class>
+		<class>org.openecomp.policy.rest.jpa.PdpEntity</class>
+		<class>org.openecomp.policy.rest.jpa.ActionBodyEntity</class>
+		<class>org.openecomp.policy.rest.jpa.DatabaseLockEntity</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyVersion</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScore</class>
+		<class>org.openecomp.policy.rest.jpa.FunctionDefinition</class>
+		<class>org.openecomp.policy.rest.jpa.Attribute</class>
+		<class>org.openecomp.policy.rest.jpa.Category</class>
+		<class>org.openecomp.policy.rest.jpa.ConstraintType</class>
+		<class>org.openecomp.policy.rest.jpa.ConstraintValue</class>
+		<class>org.openecomp.policy.rest.jpa.Datatype</class>
+		<class>org.openecomp.policy.rest.jpa.FunctionArgument</class>
+		<class>org.openecomp.policy.rest.jpa.UserInfo</class>
+		<class>org.openecomp.policy.rest.jpa.ActionPolicyDict</class>
+		<class>org.openecomp.policy.rest.jpa.DecisionSettings</class>
+		<class>org.openecomp.policy.rest.jpa.MicroServiceModels</class>
+		<!-- unique to XACML-PAP-ADMIN -->
+		<class>org.openecomp.policy.rest.jpa.ActionList</class>
+		<class>org.openecomp.policy.rest.jpa.AddressGroup</class>
+		<class>org.openecomp.policy.rest.jpa.AttributeAssignment</class>
+		<class>org.openecomp.policy.rest.jpa.BRMSParamTemplate</class>
+		<class>org.openecomp.policy.rest.jpa.ClosedLoopD2Services</class>
+		<class>org.openecomp.policy.rest.jpa.ClosedLoopSite</class>
+		<class>org.openecomp.policy.rest.jpa.DCAEUsers</class>
+		<class>org.openecomp.policy.rest.jpa.DCAEuuid</class>
+		<class>org.openecomp.policy.rest.jpa.DescriptiveScope</class>
+		<class>org.openecomp.policy.rest.jpa.EcompName</class>
+		<class>org.openecomp.policy.rest.jpa.EnforcingType</class>
+		<class>org.openecomp.policy.rest.jpa.GlobalRoleSettings</class>
+		<class>org.openecomp.policy.rest.jpa.GroupPolicyScopeList</class>
+		<class>org.openecomp.policy.rest.jpa.GroupServiceList</class>
+		<class>org.openecomp.policy.rest.jpa.MicroServiceConfigName</class>
+		<class>org.openecomp.policy.rest.jpa.MicroServiceLocation</class>
+		<class>org.openecomp.policy.rest.jpa.Obadvice</class>
+		<class>org.openecomp.policy.rest.jpa.ObadviceExpression</class>
+		<class>org.openecomp.policy.rest.jpa.PEPOptions</class>
+		<class>org.openecomp.policy.rest.jpa.PIPConfigParam</class>
+		<class>org.openecomp.policy.rest.jpa.PIPConfiguration</class>
+		<class>org.openecomp.policy.rest.jpa.PIPResolver</class>
+		<class>org.openecomp.policy.rest.jpa.PIPResolverParam</class>
+		<class>org.openecomp.policy.rest.jpa.PIPType</class>	
+		<class>org.openecomp.policy.rest.jpa.PolicyAlgorithms</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyManagement</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScopeService</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScopeType</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScopeResource</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyScopeClosedLoop</class>
+		<class>org.openecomp.policy.rest.jpa.PortList</class>
+		<class>org.openecomp.policy.rest.jpa.PREFIXLIST</class>
+		<class>org.openecomp.policy.rest.jpa.ProtocolList</class>
+		<class>org.openecomp.policy.rest.jpa.RemoteCatalogValues</class>
+		<class>org.openecomp.policy.rest.jpa.PolicyRoles</class>
+		<class>org.openecomp.policy.rest.jpa.RuleAlgorithms</class>
+		<class>org.openecomp.policy.rest.jpa.SecurityZone</class>
+		<class>org.openecomp.policy.rest.jpa.ServiceList</class>
+		<class>org.openecomp.policy.rest.jpa.SystemLogDB</class>
+		<class>org.openecomp.policy.rest.jpa.TermList</class>
+		<class>org.openecomp.policy.rest.jpa.VarbindDictionary</class>
+		<class>org.openecomp.policy.rest.jpa.VMType</class>
+		<class>org.openecomp.policy.rest.jpa.VNFType</class>
+		<class>org.openecomp.policy.rest.jpa.VSCLAction</class>
+		<class>org.openecomp.policy.rest.jpa.Zone</class>
+		<!-- unique to PolicyEngineUtils -->
+		<class>org.openecomp.policy.jpa.BackUpMonitorEntity</class>
+		<!-- unique to integrity-monitor -->
+		<class>org.openecomp.policy.common.im.jpa.StateManagementEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ForwardProgressEntity</class>
+		<class>org.openecomp.policy.common.im.jpa.ResourceRegistrationEntity</class>
+		<!-- unique to integrity-audit -->
+		<class>org.openecomp.policy.common.ia.jpa.IntegrityAuditEntity</class>
+		
+		<exclude-unlisted-classes>false</exclude-unlisted-classes>
+		<shared-cache-mode>NONE</shared-cache-mode>	        
+        <properties>
+            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
+            <property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./sql/xacmlTest"/> <!-- ;MODE=MySQL"/> -->
+            <property name="javax.persistence.jdbc.user" value="sa"/>
+            <property name="javax.persistence.jdbc.password" value=""/>
+            <property name="javax.persistence.schema-generation.scripts.action" value="drop-and-create"/>
+            <property name="javax.persistence.schema-generation.scripts.create-target" value="./src/main/resources/META-INF/generatedCreate.ddl"/>
+            <property name="javax.persistence.schema-generation.scripts.drop-target" value="./src/main/resources/META-INF/generatedDrop.ddl"/>
+            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
+			<property name="javax.persistence.schema-generation.create-source" value="metadata-then-script"/>
+			<property name="javax.persistence.schema-generation.drop-source" value="script"/>
+			<property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/drop.ddl" />
+        </properties>
+    </persistence-unit>	
+</persistence>
diff --git a/ECOMP-PAP-REST/src/main/resources/log4j.properties b/ECOMP-PAP-REST/src/main/resources/log4j.properties
new file mode 100644
index 0000000..80f85e9
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/resources/log4j.properties
@@ -0,0 +1,71 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+#
+# Use this properties for deployments.
+#
+#
+# Set root logger level to DEBUG and its only appender to FILE.
+#log4j.rootLogger=DEBUG, FILE, CONSOLE
+log4j.rootLogger=INFO, FILE
+
+# FILE appender
+log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.FILE.File=${catalina.base}/logs/pap-rest.log
+log4j.appender.FILE.ImmediateFlush=true
+log4j.appender.FILE.Threshold=debug
+log4j.appender.FILE.append=true
+log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
+log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss}{GMT+0}+00:00|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{server}|%X{clientIpAddress}|%l||%m%n
+
+# for Developments and Debugging
+#log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+#log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy_MM_dd_HH_mm_ss_SSS} [%t] %-5p %l- %m%n
+
+#
+# This is specifically for Xacml request/response logging
+#
+log4j.logger.xacml.request=INFO, REQUEST_LOG
+
+log4j.appender.REQUEST_LOG=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.REQUEST_LOG.File=${catalina.base}/logs/pap-rest-reqres.log
+log4j.appender.REQUEST_LOG.ImmediateFlush=true
+log4j.appender.REQUEST_LOG.Threshold=debug
+log4j.appender.REQUEST_LOG.append=true
+log4j.appender.REQUEST_LOG.DatePattern='.'yyyy-MM-dd
+
+log4j.appender.REQUEST_LOG.layout=org.apache.log4j.PatternLayout
+log4j.appender.REQUEST_LOG.layout.ConversionPattern=%d{yyyy_MM_dd_HH_mm_ss_SSS} %m%n
+
+#
+# audit (transaction) logging
+#
+log4j.logger.auditLogger=INFO,AUDIT_LOG
+log4j.additivity.auditLogger=false
+
+log4j.appender.AUDIT_LOG=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.AUDIT_LOG.File=${catalina.base}/logs/audit.log
+log4j.appender.AUDIT_LOG.Append=true
+log4j.appender.AUDIT_LOG.DatePattern='.'yyyy-MM-dd
+log4j.appender.AUDIT_LOG.threshold=INFO
+log4j.appender.AUDIT_LOG.layout=org.apache.log4j.EnhancedPatternLayout
+log4j.appender.AUDIT_LOG.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss}{GMT+0}+00:00|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{server}|%X{clientIpAddress}|%X{className}|%X{timer}|%m%n
diff --git a/ECOMP-PAP-REST/src/main/resources/logback.xml b/ECOMP-PAP-REST/src/main/resources/logback.xml
new file mode 100644
index 0000000..7c328c5
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/resources/logback.xml
@@ -0,0 +1,253 @@
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP-PAP-REST
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+  <!--<jmxConfigurator /> -->
+  <!-- directory path for all other type logs -->
+  <property name="logDir" value="logs" />
+  
+  <!-- directory path for debugging type logs -->
+  <property name="debugDir" value="logs" />
+  
+  <!--  specify the component name 
+    <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC"  -->
+  <property name="componentName" value="Policy"></property>
+  <property name="subComponentName" value="XACML-PAP-REST"></property>
+  
+  <!--  log file names -->
+  <property name="errorLogName" value="error" />
+  <property name="metricsLogName" value="metrics" />
+  <property name="auditLogName" value="audit" />
+  <property name="debugLogName" value="debug" />
+  
+  
+      <!-- modified time stamp format -->
+ 
+   <!--    A U D I T 
+           <property name="defaultAuditPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+           <property name="defaultAuditPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{ElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+   -->
+   <property name="defaultAuditPattern" value="%X{TransactionBeginTimestamp}|%X{TransactionEndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{TransactionElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+  
+  
+  
+   <!--    M E T R I C 
+          <property name="defaultMetricPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+   -->
+   <property name="defaultMetricPattern" value="%X{MetricBeginTimestamp}|%X{MetricEndTimestamp}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%p|%X{severity}|%X{serverIpAddress}|%X{MetricElapsedTime}|%X{server}|%X{clientIpAddress}|%c||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+  
+     
+   
+   <!--   E R R O R
+          <property name="defaultErrorPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
+   -->
+   <property name="defaultErrorPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{requestId}|%t|%X{serviceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
+  
+  
+  
+   <!--   D E B U G
+          <property name="debugLoggerPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
+          <property name="debugLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" /> -->
+   -->
+   <property name="debugLoggerPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%msg%n" />  
+   
+ 
+   
+   <!--   D E F A U L T 
+          <property name="defaultPatternOld" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}|%msg%n" />
+          <property name="defaultPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
+   -->
+   <property name="defaultPattern" value="%d{&quot;yyyy-MM-dd'T'HH:mm:ss.SSSXXX&quot;, UTC}|%X{requestId}|%X{serviceInstanceId}|%t|%X{serverName}|%X{serviceName}|%X{instanceUuid}|%p|%X{severity}|%X{serverIpAddress}|%X{server}|%X{clientIpAddress}|%c||%msg%n" />
+   
+ 
+ 
+   <!--   P A T H
+          <property name="logDirectory" value="${logDir}/${componentName}/${subComponentName}" />
+          <property name="debugLogDirectory" value="${debugDir}/${componentName}/${subComponentName}" />
+
+   -->   
+   <property name="logDirectory" value="${catalina.base}/${logDir}/${componentName}/${subComponentName}" />
+   <property name="debugLogDirectory" value="${catalina.base}/${debugDir}/${componentName}/${subComponentName}" />
+   
+
+ 
+ 
+  <!-- Example evaluator filter applied against console appender -->
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${defaultPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- ============================================================================ -->
+  <!-- EELF Appenders -->
+  <!-- ============================================================================ -->
+
+  <!-- The EELFAppender is used to record events to the general application 
+    log -->
+        
+  <!-- EELF Audit Appender. This appender is used to record audit engine 
+    related logging events. The audit logger and appender are specializations 
+    of the EELF application root logger and appender. This can be used to segregate 
+    Policy engine events from other components, or it can be eliminated to record 
+    these events as part of the application root log. -->
+    
+  <appender name="EELFAudit"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${auditLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+         <pattern>${defaultAuditPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFAudit" />
+  </appender>
+
+
+
+
+<appender name="EELFMetrics"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${metricsLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - 
+        %msg%n"</pattern> -->
+      <pattern>${defaultMetricPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFMetrics"/>
+  </appender>
+
+
+
+   
+  <appender name="EELFError"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${errorLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+     <level>ERROR</level>
+     </filter>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <pattern>${defaultErrorPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFError"/>
+  </appender>
+
+
+  
+  <appender name="EELFDebug"
+    class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${debugLogDirectory}/${debugLogName}.log</file>
+    <rollingPolicy
+      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+      <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+      </fileNamePattern>
+      <minIndex>1</minIndex>
+      <maxIndex>9</maxIndex>
+    </rollingPolicy>
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+     <level>INFO</level>
+     </filter>
+    <triggeringPolicy
+      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+      <maxFileSize>5MB</maxFileSize>
+    </triggeringPolicy>
+    <encoder>
+      <pattern>${debugLoggerPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFDebug" />
+    <includeCallerData>true</includeCallerData>
+  </appender>
+ 
+  
+  <!-- ============================================================================ -->
+  <!--  EELF loggers -->
+  <!-- ============================================================================ -->
+ 
+  <logger name="com.att.eelf.audit" level="info" additivity="false">
+    <appender-ref ref="asyncEELFAudit" />
+  </logger>
+  
+  <logger name="com.att.eelf.metrics" level="info" additivity="false">
+        <appender-ref ref="asyncEELFMetrics" />
+  </logger>
+ 
+    <logger name="com.att.eelf.error" level="error" additivity="false">
+  <appender-ref ref="asyncEELFError" />
+  </logger>
+  
+   <logger name="com.att.eelf.debug" level="info" additivity="false">
+        <appender-ref ref="asyncEELFDebug" />
+  </logger>
+  
+  
+  
+  <root level="INFO">
+        <appender-ref ref="asyncEELFDebug" />
+        <appender-ref ref="asyncEELFError" />
+  </root>
+
+</configuration>
diff --git a/ECOMP-PAP-REST/src/main/resources/spring.xml b/ECOMP-PAP-REST/src/main/resources/spring.xml
new file mode 100644
index 0000000..20414fa
--- /dev/null
+++ b/ECOMP-PAP-REST/src/main/resources/spring.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ECOMP-PAP-REST
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  ============LICENSE_END=========================================================
+  -->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
+        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
+        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
+
+	<context:annotation-config />
+	<context:component-scan base-package="org.openecomp" />
+	<!-- Hibernate 4 SessionFactory Bean definition -->
+	<bean id="hibernate4AnnotatedSessionFactory"
+		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
+		<property name="configLocation">
+			<value>classpath:hibernate.cfg.xml</value>
+		</property>
+		<property name="hibernateProperties">
+			<props>
+				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
+				<prop key="hibernate.current_session_context_class">thread</prop>
+				<prop key="hibernate.show_sql">false</prop>
+			</props>
+		</property>
+	</bean>
+</beans>
diff --git a/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/ia/DbAuditCompareEntriesTest.java b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/ia/DbAuditCompareEntriesTest.java
new file mode 100644
index 0000000..c5fa379
--- /dev/null
+++ b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/ia/DbAuditCompareEntriesTest.java
@@ -0,0 +1,519 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.ia;
+
+import static org.junit.Assert.*;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Properties;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.openecomp.policy.jpa.BackUpMonitorEntity;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.ActionList;
+import org.openecomp.policy.rest.jpa.ActionPolicyDict;
+import org.openecomp.policy.rest.jpa.AddressGroup;
+import org.openecomp.policy.rest.jpa.Attribute;
+import org.openecomp.policy.rest.jpa.AttributeAssignment;
+import org.openecomp.policy.rest.jpa.BRMSParamTemplate;
+import org.openecomp.policy.rest.jpa.Category;
+import org.openecomp.policy.rest.jpa.ClosedLoopD2Services;
+import org.openecomp.policy.rest.jpa.ClosedLoopSite;
+import org.openecomp.policy.rest.jpa.ConfigurationDataEntity;
+import org.openecomp.policy.rest.jpa.ConstraintType;
+import org.openecomp.policy.rest.jpa.ConstraintValue;
+import org.openecomp.policy.rest.jpa.DCAEUsers;
+import org.openecomp.policy.rest.jpa.DCAEuuid;
+import org.openecomp.policy.rest.jpa.DatabaseLockEntity;
+import org.openecomp.policy.rest.jpa.Datatype;
+import org.openecomp.policy.rest.jpa.DecisionSettings;
+import org.openecomp.policy.rest.jpa.DescriptiveScope;
+import org.openecomp.policy.rest.jpa.EcompName;
+import org.openecomp.policy.rest.jpa.EnforcingType;
+import org.openecomp.policy.rest.jpa.FunctionArgument;
+import org.openecomp.policy.rest.jpa.FunctionDefinition;
+import org.openecomp.policy.rest.jpa.GlobalRoleSettings;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.GroupPolicyScopeList;
+import org.openecomp.policy.rest.jpa.GroupServiceList;
+import org.openecomp.policy.rest.jpa.MicroServiceConfigName;
+import org.openecomp.policy.rest.jpa.MicroServiceLocation;
+import org.openecomp.policy.rest.jpa.MicroServiceModels;
+import org.openecomp.policy.rest.jpa.Obadvice;
+import org.openecomp.policy.rest.jpa.ObadviceExpression;
+import org.openecomp.policy.rest.jpa.PEPOptions;
+import org.openecomp.policy.rest.jpa.PIPConfigParam;
+import org.openecomp.policy.rest.jpa.PIPConfiguration;
+import org.openecomp.policy.rest.jpa.PIPResolver;
+import org.openecomp.policy.rest.jpa.PIPResolverParam;
+import org.openecomp.policy.rest.jpa.PIPType;
+import org.openecomp.policy.rest.jpa.PREFIXLIST;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.rest.jpa.PolicyAlgorithms;
+import org.openecomp.policy.rest.jpa.PolicyDBDaoEntity;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.jpa.PolicyManagement;
+import org.openecomp.policy.rest.jpa.PolicyRoles;
+import org.openecomp.policy.rest.jpa.PolicyScopeClosedLoop;
+import org.openecomp.policy.rest.jpa.PolicyScopeResource;
+import org.openecomp.policy.rest.jpa.PolicyScopeService;
+import org.openecomp.policy.rest.jpa.PolicyScopeType;
+import org.openecomp.policy.rest.jpa.PolicyScore;
+import org.openecomp.policy.rest.jpa.PolicyVersion;
+import org.openecomp.policy.rest.jpa.PortList;
+import org.openecomp.policy.rest.jpa.ProtocolList;
+import org.openecomp.policy.rest.jpa.RemoteCatalogValues;
+import org.openecomp.policy.rest.jpa.RuleAlgorithms;
+import org.openecomp.policy.rest.jpa.SecurityZone;
+import org.openecomp.policy.rest.jpa.ServiceList;
+import org.openecomp.policy.rest.jpa.SystemLogDB;
+import org.openecomp.policy.rest.jpa.TermList;
+import org.openecomp.policy.rest.jpa.UserInfo;
+import org.openecomp.policy.rest.jpa.VMType;
+import org.openecomp.policy.rest.jpa.VNFType;
+import org.openecomp.policy.rest.jpa.VSCLAction;
+import org.openecomp.policy.rest.jpa.VarbindDictionary;
+import org.openecomp.policy.rest.jpa.Zone;
+
+import org.openecomp.policy.common.ia.DbAudit;
+import org.openecomp.policy.common.ia.DbDAO;
+import org.openecomp.policy.common.ia.IntegrityAuditProperties;
+import org.openecomp.policy.common.ia.jpa.IntegrityAuditEntity;
+import org.openecomp.policy.common.im.jpa.ForwardProgressEntity;
+import org.openecomp.policy.common.im.jpa.ResourceRegistrationEntity;
+import org.openecomp.policy.common.im.jpa.StateManagementEntity;
+
+import org.apache.commons.lang3.SerializationUtils;
+
+@Ignore
+public class DbAuditCompareEntriesTest {
+
+	private static Log logger = LogFactory.getLog(DbAuditCompareEntriesTest.class);
+	private DbDAO dbDAO;
+	private String persistenceUnit;
+	private Properties properties;
+	private String resourceName;
+	private String dbDriver;
+	private String dbUrl;
+	private String dbUser;
+	private String dbPwd;
+	private String siteName;
+	private String nodeType;
+	
+	@Before
+	public void setUp() throws Exception {
+		logger.info("setUp: Entering");
+
+		properties = new Properties();
+		properties.put(IntegrityAuditProperties.DB_DRIVER, IntegrityAuditProperties.DEFAULT_DB_DRIVER);
+		properties.put(IntegrityAuditProperties.DB_URL, "jdbc:h2:file:./sql/xacmlTest");
+		properties.put(IntegrityAuditProperties.DB_USER, IntegrityAuditProperties.DEFAULT_DB_USER);
+		properties.put(IntegrityAuditProperties.DB_PWD, IntegrityAuditProperties.DEFAULT_DB_PWD);
+		properties.put(IntegrityAuditProperties.SITE_NAME, "SiteA");
+		properties.put(IntegrityAuditProperties.NODE_TYPE, "pap");
+
+		dbDriver = IntegrityAuditProperties.DEFAULT_DB_DRIVER;
+		dbUrl = "jdbc:h2:file:./sql/xacmlTest";
+		dbUser = IntegrityAuditProperties.DEFAULT_DB_USER;
+		dbPwd = IntegrityAuditProperties.DEFAULT_DB_PWD;
+		siteName = "SiteA";
+		nodeType = "pap";
+		persistenceUnit = "testPapPU";
+		resourceName = "siteA.pap1";
+		
+		//Clean the iaTest DB table for IntegrityAuditEntity entries
+		cleanDb(persistenceUnit, properties);
+		
+		logger.info("setUp: Exiting");
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		logger.info("tearDown: Entering");
+		//nothing to do
+		logger.info("tearDown: Exiting");
+	}
+	
+	public void cleanDb(String persistenceUnit, Properties properties){
+		logger.debug("cleanDb: enter");
+
+		EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnit, properties);
+		
+		EntityManager em = emf.createEntityManager();
+		// Start a transaction
+		EntityTransaction et = em.getTransaction();
+
+		et.begin();
+
+		// Clean up the DB
+		em.createQuery("Delete from IntegrityAuditEntity").executeUpdate();
+
+		// commit transaction
+		et.commit();
+		em.close();
+		logger.debug("cleanDb: exit");
+	}
+	
+
+	/*
+	 * Tests that a comparison between hashsets is successful if
+	 * the entries match
+	 */
+	//@Ignore
+	@Test
+	public void runAllTests() throws Exception {
+		logger.info("runAllTests: Entering");
+		
+		
+		testIntegrityAuditEntity();
+		testBackupMonitorEntity();
+		testStateManagementEntity();
+		testForwardProgressEntity();
+		testResourceRegistrationEntity();
+		
+		//clean up the IntegrityAuditEntity table
+		cleanDb(persistenceUnit, properties);
+		
+		logger.info("runAllTests: Exit");
+	}
+
+
+	public void testIntegrityAuditEntity() throws Exception {
+		logger.info("testIntegrityAuditEntity: Entering");
+		
+		dbDAO = new DbDAO(resourceName, persistenceUnit, properties);
+		DbAudit dbAudit = new DbAudit(dbDAO);
+		
+		String className = null;
+		//There is only one entry IntegrityAuditEntity, but we will check anyway
+		HashSet<String> classNameSet = dbDAO.getPersistenceClassNames();
+		for(String c : classNameSet){
+			if (c.equals("org.openecomp.policy.common.ia.IntegrityAuditEntity")){
+				className = c;
+			}
+		}
+		String resourceName1 = resourceName;
+		String resourceName2 = resourceName;
+		
+		IntegrityAuditEntity entry1 = new IntegrityAuditEntity();
+		IntegrityAuditEntity entry2 = new IntegrityAuditEntity();
+		Date date = new Date();
+		
+		/*
+		 * Two entries with the same field values
+		 */
+		entry1.setDesignated(false);
+		entry1.setJdbcDriver(dbDriver);
+		entry1.setJdbcPassword(dbPwd);
+		entry1.setJdbcUrl(dbUrl);
+		entry1.setJdbcUser(dbUser);
+		entry1.setLastUpdated(date);
+		entry1.setNodeType(nodeType);
+		entry1.setPersistenceUnit(persistenceUnit);
+		entry1.setResourceName(resourceName1);
+		entry1.setSite(siteName);
+		
+		entry2 = SerializationUtils.clone(entry1);
+		
+		dbAudit.writeAuditDebugLog(className, resourceName1, resourceName2, entry1, entry2);
+		
+		HashMap<Object, Object> myEntries = new HashMap<Object, Object>();
+		HashMap<Object, Object> theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+				
+		HashSet<Object> result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		/*
+		 * Assert that there are no mismatches returned
+		 */
+		assertTrue(result.isEmpty());
+		
+		/*
+		 * ************************************
+		 * Now test with a mis-matched entry
+		 * ************************************
+		 */
+		
+		/*
+		 * Change the entry2 to different designated value
+		 */
+		entry2.setDesignated(true);
+				
+		myEntries = new HashMap<Object, Object>();
+		theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+		
+		result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		/*
+		 * Assert that there was one mismatch
+		 */
+		assertEquals(1, result.size());
+		logger.info("testIntegrityAuditEntity: Exit");
+	}
+	
+	void testBackupMonitorEntity() throws Exception {
+		logger.info("testBackupMonitorEntity: Entering");
+		
+		dbDAO = new DbDAO(resourceName, persistenceUnit, properties);
+		DbAudit dbAudit = new DbAudit(dbDAO);
+		
+		BackUpMonitorEntity entry1 = new BackUpMonitorEntity();
+		BackUpMonitorEntity entry2 = new BackUpMonitorEntity();
+		
+		// Two entries with the same field values
+		 
+		
+		entry1.setFlag("flag1");
+		entry1.setResoruceNodeName("node1");
+		entry1.setResourceName("resourceName");
+		entry1.setTimeStamp(new Date());
+		
+		// Clone the first entry
+		entry2 = SerializationUtils.clone(entry1);
+		
+		HashMap<Object, Object> myEntries = new HashMap<Object, Object>();
+		HashMap<Object, Object> theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+				
+		HashSet<Object> result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		// Assert that there are no mismatches returned
+		 
+		assertTrue(result.isEmpty());
+		
+		
+		 /* ************************************
+		 * Now test with a mis-matched entry
+		 * ************************************/
+		 
+		
+		
+		// Change a field on entry2
+		 
+		entry2.setFlag("flag2");
+				
+		myEntries = new HashMap<Object, Object>();
+		theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+		
+		result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		//Assert that there was one mismatch
+		 
+		assertEquals(1, result.size());
+		logger.info("testBackupMonitorEntity: Exit");
+	}
+
+	void testStateManagementEntity() throws Exception {
+		logger.info("testStateManagementEntity: Entering");
+		
+		dbDAO = new DbDAO(resourceName, persistenceUnit, properties);
+		DbAudit dbAudit = new DbAudit(dbDAO);
+		
+		StateManagementEntity entry1 = new StateManagementEntity();
+		StateManagementEntity entry2 = new StateManagementEntity();
+		
+		// Two entries with the same field values
+		
+		entry1.setAdminState("locked");
+		entry1.setAvailStatus("null");
+		entry1.setModifiedDate(new Date());
+		entry1.setOpState("enabled");
+		entry1.setResourceName("myResource");
+		entry1.setStandbyStatus("coldstandby");
+		
+		// Clone the first entry
+		entry2 = SerializationUtils.clone(entry1);
+		
+		HashMap<Object, Object> myEntries = new HashMap<Object, Object>();
+		HashMap<Object, Object> theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+				
+		HashSet<Object> result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		// Assert that there are no mismatches returned
+		 
+		assertTrue(result.isEmpty());
+		
+		
+		 /* ************************************
+		 * Now test with a mis-matched entry
+		 * ************************************/
+		 
+		
+		
+		// Change a field on entry2
+		 
+		entry2.setAdminState("unlocked");
+				
+		myEntries = new HashMap<Object, Object>();
+		theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+		
+		result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		//Assert that there was one mismatch
+		 
+		assertEquals(1, result.size());
+		logger.info("testStateManagementEntity: Exit");
+	}
+	
+	void testForwardProgressEntity() throws Exception {
+		logger.info("testForwardProgressEntity: Entering");
+		
+		dbDAO = new DbDAO(resourceName, persistenceUnit, properties);
+		DbAudit dbAudit = new DbAudit(dbDAO);
+		
+		ForwardProgressEntity entry1 = new ForwardProgressEntity();
+		ForwardProgressEntity entry2 = new ForwardProgressEntity();
+
+		// Two entries with the same field values
+		
+		entry1.setFpcCount(123L);
+		entry1.setLastUpdated(new Date());
+		entry1.setResourceName("myResource");
+		
+		// Clone the first entry
+		entry2 = SerializationUtils.clone(entry1);
+		
+		HashMap<Object, Object> myEntries = new HashMap<Object, Object>();
+		HashMap<Object, Object> theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+				
+		HashSet<Object> result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		// Assert that there are no mismatches returned
+		 
+		assertTrue(result.isEmpty());
+		
+		
+		 /* ************************************
+		 * Now test with a mis-matched entry
+		 * ************************************/
+		
+		// Change a field on entry2
+		 
+		entry2.setFpcCount(321L);
+				
+		myEntries = new HashMap<Object, Object>();
+		theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+		
+		result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		//Assert that there was one mismatch
+		 
+		assertEquals(1, result.size());
+		logger.info("testForwardProgressEntity: Exit");
+	}
+
+	void testResourceRegistrationEntity() throws Exception {
+		logger.info("testResourceRegistrationEntity: Entering");
+		
+		dbDAO = new DbDAO(resourceName, persistenceUnit, properties);
+		DbAudit dbAudit = new DbAudit(dbDAO);
+		
+		ResourceRegistrationEntity entry1 = new ResourceRegistrationEntity();
+		ResourceRegistrationEntity entry2 = new ResourceRegistrationEntity();
+		
+		// Two entries with the same field values
+		
+		entry1.setNodeType("pap");
+		entry1.setLastUpdated(new Date());
+		entry1.setResourceName("myResource");
+		entry1.setResourceUrl("http://nowhere.com");
+		entry1.setSite("site_1");
+		
+		// Clone the first entry
+		entry2 = SerializationUtils.clone(entry1);
+		
+		HashMap<Object, Object> myEntries = new HashMap<Object, Object>();
+		HashMap<Object, Object> theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+				
+		HashSet<Object> result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		// Assert that there are no mismatches returned
+		 
+		assertTrue(result.isEmpty());
+		
+		
+		 /* ************************************
+		 * Now test with a mis-matched entry
+		 * ************************************/
+		
+		// Change a field on entry2
+		 
+		entry2.setSite("site_1a");
+				
+		myEntries = new HashMap<Object, Object>();
+		theirEntries = new HashMap<Object, Object>();
+		
+		myEntries.put("pdp1", entry1);
+		theirEntries.put("pdp1", entry2);
+		
+		result = dbAudit.compareEntries(myEntries, theirEntries);
+		
+		
+		//Assert that there was one mismatch
+		 
+		assertEquals(1, result.size());
+		logger.info("testResourceRegistrationEntity: Exit");
+	}
+}
diff --git a/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServletTest.java b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServletTest.java
new file mode 100644
index 0000000..da11d72
--- /dev/null
+++ b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/XACMLPapServletTest.java
@@ -0,0 +1,368 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.openecomp.policy.pap.xacml.rest.XACMLPapServlet;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.mock.web.MockServletConfig;
+
+import org.openecomp.policy.common.ia.IntegrityAudit;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger; 
+
+public class XACMLPapServletTest extends TestCase{
+	private static Logger logger	= FlexLogger.getLogger(XACMLPapServletTest.class);
+	
+	private List<String> headers = new ArrayList<String>();
+	
+	private HttpServletRequest httpServletRequest;
+	private HttpServletResponse httpServletResponse;
+	private ServletOutputStream mockOutput;
+	private ServletConfig servletConfig; 
+	private XACMLPapServlet papServlet;
+
+	 
+    @Before
+   
+    public void setUp() throws IOException {
+    	httpServletRequest = Mockito.mock(HttpServletRequest.class);
+    	Mockito.when(httpServletRequest.getMethod()).thenReturn("POST");
+    	Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn(null);
+    	Mockito.when(httpServletRequest.getHeaderNames()).thenReturn(Collections.enumeration(headers));
+    	Mockito.when(httpServletRequest.getAttributeNames()).thenReturn(Collections.enumeration(headers));
+    	
+    	
+    	mockOutput = Mockito.mock(ServletOutputStream.class);
+    	
+    	//when(httpServletRequest.getPathInfo()).thenReturn("/lineup/world.xml");
+    	//HttpServletResponse httpResponse = new HttpServletResponse();
+    	httpServletResponse = Mockito.mock(MockHttpServletResponse.class);
+    	
+    	Mockito.when(httpServletResponse.getOutputStream()).thenReturn(mockOutput);
+
+    	
+    	//when(httpServletResponse.getOutputStream()).thenReturn(servletOutputStream);
+    	servletConfig = Mockito.mock(MockServletConfig.class);
+    	//Mockito.when(servletConfig.getInitParameterNames()).thenReturn(Collections.enumeration(headers));
+    	//servletConfig
+    	Mockito.when(servletConfig.getInitParameterNames()).thenReturn(Collections.enumeration(headers));
+    	papServlet = new XACMLPapServlet();
+    	
+    	Mockito.when(servletConfig.getInitParameter("XACML_PROPERTIES_NAME")).thenReturn("xacml.pap.test.properties");
+    	
+		System.setProperty("xacml.PAP.papEngineFactory", "org.openecomp.policy.xacml.std.pap.StdEngineFactory");
+		System.setProperty("xacml.pap.pdps", "pdps");
+		System.setProperty("xacml.rest.pap.url", "http://localhost:8070/pap/");
+		System.setProperty("xacml.rest.pap.initiate.pdp", "false");
+		System.setProperty("xacml.rest.pdp.idfile", "testpdp.properties");
+		System.setProperty("xacml.rest.pep.idfile", "client.properties");
+		System.setProperty("javax.persistence.jdbc.driver", "org.h2.Driver");
+		System.setProperty("javax.persistence.jdbc.url", "jdbc:h2:file:./sql/xacmlTest");
+		System.setProperty("javax.persistence.jdbc.user", "sa");
+		System.setProperty("javax.persistence.jdbc.password", "");
+		System.setProperty("xacml.rest.pap.jmx.url", "service:jmx:rmi:///jndi/rmi://localhost:9990/jmxrmi");
+		System.setProperty("xacml.rest.pap.resource.name", "site_1.pap_1");
+		System.setProperty("fp_monitor_interval", "30");
+		System.setProperty("failed_counter_threshold", "3");
+		System.setProperty("test_trans_interval", "10");
+		System.setProperty("write_fpc_interval", "5");
+		System.setProperty("com.sun.management.jmxremote.port", "9999");
+		System.setProperty("dependency_groups", "site_1.logparser_1;site_1.adminconsole_1;site_1.elk_1");
+		System.setProperty("site_name", "site_1");
+		System.setProperty("node_type", "pap"); 
+    }
+	
+    /*
+     * This method initializes and cleans the DB so the XACMLPapServlet will be able to instantiate an
+     * IntegrityAudit object which will use the DB.
+     */
+	public void initializeDb(){
+		logger.debug("initializeDb: enter");
+    	Properties cleanProperties = new Properties();
+    	cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_DRIVER,"org.h2.Driver");
+    	cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_URL, "jdbc:h2:file:./sql/xacmlTest");
+    	cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_USER, "sa");
+    	cleanProperties.put(XACMLRestProperties.PROP_PAP_DB_PASSWORD, "");
+    	EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPapPU", cleanProperties);
+		
+		EntityManager em = emf.createEntityManager();
+		// Start a transaction
+		EntityTransaction et = em.getTransaction();
+
+		et.begin();
+
+		// Clean up the DB
+		em.createQuery("Delete from IntegrityAuditEntity").executeUpdate();
+
+		// commit transaction
+		et.commit();
+		em.close();
+		logger.debug("initializeDb: exit");
+	}
+	
+    @Test
+	public void testInit() throws Exception{
+    	System.setProperty("integrity_audit_period_seconds", "0");
+    	initializeDb();
+		try {	
+			papServlet.init(servletConfig);
+			IntegrityAudit ia = papServlet.getIa();
+			if(ia.isThreadInitialized()){
+				assertTrue(true);
+			}else{
+				fail();
+			}
+			ia.stopAuditThread();
+			// Allow time for the thread to stop
+			Thread.sleep(1000);
+			if(!ia.isThreadInitialized()){
+				assertTrue(true);
+			}else{
+				fail();
+			}
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			fail();
+		}
+	}
+	
+/*	public void testDoGetPapTest(){
+		try{
+			Mockito.when(httpServletRequest.getRequestURI()).thenReturn("/pap/test");
+			papServlet.init(servletConfig);
+			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();
+			papServlet.doGet(httpServletRequest, httpServletResponse);		
+			logger.info(httpServletResponse.getStatus());
+
+			//Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
+		}catch (Exception e){
+			logger.info("testDoGetPapTest failed with message: " + e.getMessage());
+			fail();
+		}
+		assertTrue(true);
+	}*/
+
+/*	
+ * Need to figure a way to get it to match any message string
+ * public void testDoGetPapTestFpcFailure(){
+		try{
+			Mockito.when(httpServletRequest.getRequestURI()).thenReturn("/pap/test");
+			Mockito.when(httpServletRequest.getHeader("THIS-IS-A-TEST")).thenReturn("FPC");
+			papServlet.init(servletConfig);
+			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();
+			papServlet.doGet(httpServletRequest, httpServletResponse);		
+			Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, Mockito.anyString());
+		}catch (Exception e){
+			logger.info("testDoGetPapTestFpcFailure failed with message: " + e.getMessage());
+			fail();
+		}
+		assertTrue(true);
+	}*/
+	
+	public void testDoGetLocal(){
+		try{
+			Mockito.when(httpServletRequest.getRemoteHost()).thenReturn("localhost");
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();
+			papServlet.doGet(httpServletRequest, httpServletResponse);		
+			
+			logger.info(httpServletResponse.getStatus());
+			Mockito.verify(httpServletResponse).setHeader("content-type", "application/json");
+			Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
+		}catch (Exception e){
+			fail();
+		}
+
+		assertTrue(true);
+	}
+	
+	public void testDoGetNonLocal(){
+		//return non-local host remote address, which is invalid
+		Mockito.when(httpServletRequest.getRemoteHost()).thenReturn("0.0.0.0");	
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doGet(httpServletRequest, httpServletResponse);		
+			logger.info(httpServletResponse.getStatus());	
+			String message = "Unknown PDP:  from 0.0.0.0 us: null";
+			
+			Mockito.verify(httpServletResponse).sendError(401, message);
+			
+		}catch (Exception e){
+			fail();
+		}
+	}
+	
+	public void testDoGetWithGroup() throws Exception{
+		Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
+		//Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-ID")).thenReturn("default");
+		papServlet.init(servletConfig);
+		IntegrityAudit ia = papServlet.getIa();
+		ia.stopAuditThread();		
+		papServlet.doGet(httpServletRequest, httpServletResponse);
+		Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
+	}
+	
+	public void testDoPostWithGroup(){
+		Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
+		Mockito.when(httpServletRequest.getParameter("policyId")).thenReturn("default");
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doPost(httpServletRequest, httpServletResponse);
+			//Mockito.verify(httpServletResponse).sendError(500, "Policy 'default' not copied to group 'default': java.lang.NullPointerException");
+			//Mockito.verify(httpServletResponse).sendError(500, "Policy 'default' not copied to group 'default': javax.persistence.PersistenceException: Group policy is being added to does not exist with id default");
+			
+		}catch (Exception e){
+			fail();
+		}
+	}
+	//why is this test trying to send no pdp id and expecting a 200 response?
+	/*
+	public void testDoPost(){
+		final ByteArrayOutputStream os = new ByteArrayOutputStream ();
+		ByteArrayOutputStream multiPartResponse = new ByteArrayOutputStream();
+		Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-JMX-PORT")).thenReturn("0");
+		
+		try{
+			multiPartResponse.writeTo(os);
+			final ByteArrayInputStream is = new ByteArrayInputStream (os.toByteArray ());
+			Mockito.when(httpServletRequest.getInputStream()).thenReturn(new ServletInputStream() {
+		        @Override
+		        public int read() throws IOException {
+		            return is.read();
+		        }
+		    });
+			
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doPost(httpServletRequest, httpServletResponse);
+			Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_OK);
+		}catch (Exception e){
+			fail();
+		}
+	}	
+	*/
+		
+	public void testDoPostPDPId(){
+		String groupId = "newPDP";
+		Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn(groupId);		
+		Mockito.when(httpServletRequest.getHeader("X-XACML-PDP-ID")).thenReturn(groupId);
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doPut(httpServletRequest, httpServletResponse);
+			Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_NOT_FOUND, "Unknown groupId '" + groupId +"'");
+		}catch(Exception e){
+			fail();
+		}
+	}
+	
+	public void testDoPutInvalidAdminConsoleURL(){
+		Mockito.when(httpServletRequest.getParameter("adminConsoleURL")).thenReturn("wwww.adminConsole.com");
+		//204
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doPut(httpServletRequest,  httpServletResponse);
+			Mockito.verify(httpServletResponse).setStatus(HttpServletResponse.SC_NO_CONTENT);
+		}catch (Exception e){
+			fail();
+		}
+	}
+	
+	public void testDoPutWithGroupIdAndUnimplimentedPipId(){
+		Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
+		Mockito.when(httpServletRequest.getParameter("pipId")).thenReturn("default");
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doPut(httpServletRequest,  httpServletResponse);
+			Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_BAD_REQUEST, "UNIMPLEMENTED");
+		}catch (Exception e){
+			fail();
+		}
+	}	
+	
+	public void testDoDeleteNoGroup(){
+		Mockito.when(httpServletRequest.getParameter("groupdId")).thenReturn(null);
+		
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doDelete(httpServletRequest, httpServletResponse);
+			Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_BAD_REQUEST, "Request does not have groupId");
+		}catch (Exception e){
+			fail();			
+		}
+	}
+	
+	public void testDoDeleteWithDefaultGroup(){
+		Mockito.when(httpServletRequest.getParameter("groupId")).thenReturn("default");
+		
+		try{
+			papServlet.init(servletConfig);
+  			IntegrityAudit ia = papServlet.getIa();
+  			ia.stopAuditThread();			
+			papServlet.doDelete(httpServletRequest, httpServletResponse);
+			Mockito.verify(httpServletResponse).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"You cannot delete the default group.");
+		}catch(Exception e){
+			fail();
+		}
+	}
+}
diff --git a/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTest.java b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTest.java
new file mode 100644
index 0000000..81f33c9
--- /dev/null
+++ b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/components/PolicyDBDaoTest.java
@@ -0,0 +1,823 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.components;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Paths;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.PersistenceException;
+import javax.persistence.Query;
+
+import org.junit.Test;
+import org.openecomp.policy.pap.xacml.rest.adapters.PolicyRestAdapter;
+import org.openecomp.policy.pap.xacml.rest.components.ConfigPolicy;
+import org.openecomp.policy.pap.xacml.rest.components.Policy;
+import org.openecomp.policy.pap.xacml.rest.components.PolicyDBDao;
+import org.openecomp.policy.pap.xacml.rest.components.PolicyDBDaoTransaction;
+import org.openecomp.policy.pap.xacml.rest.components.PolicyDBDao.PolicyDBDaoTestClass;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.GroupEntity;
+import org.openecomp.policy.rest.jpa.PdpEntity;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+import org.openecomp.policy.rest.util.Webapps;
+
+import com.att.research.xacml.api.pap.PAPException;
+
+import org.openecomp.policy.xacml.api.pap.EcompPDPGroup;
+import org.openecomp.policy.xacml.std.pap.StdPDPGroup;
+import org.openecomp.policy.xacml.util.XACMLPolicyWriter;
+import com.att.research.xacml.util.XACMLProperties;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+//import org.apache.commons.logging.Log;
+//import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.After;
+import org.junit.Ignore;
+
+import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
+
+import org.junit.Assert;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+@Ignore //only run locally as timing sometimes causes failures on Jenkins
+public class PolicyDBDaoTest {
+
+	private static Logger logger = FlexLogger.getLogger(PolicyDBDaoTest.class);
+	
+	PolicyDBDaoTestClass d;
+	PolicyDBDao dbd;
+	PolicyDBDao dbd2;
+	EntityManagerFactory emf;
+	@Before
+	public void init(){
+		System.setProperty(XACMLProperties.XACML_PROPERTIES_NAME,"xacml.pap.properties");
+		emf = Persistence.createEntityManagerFactory("testPapPU");
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+		try{	
+		em.createQuery("DELETE FROM PolicyDBDaoEntity").executeUpdate();
+		em.createQuery("DELETE FROM PolicyEntity").executeUpdate();
+		em.createQuery("DELETE FROM ConfigurationDataEntity").executeUpdate();
+		em.createQuery("DELETE FROM ActionBodyEntity").executeUpdate();
+		em.createQuery("DELETE FROM PdpEntity").executeUpdate();
+		em.createQuery("DELETE FROM GroupEntity").executeUpdate();
+
+		em.getTransaction().commit();
+		} catch(Exception e){
+			e.printStackTrace();
+			em.getTransaction().rollback();
+		}
+		em.close();
+		try {
+			dbd = PolicyDBDao.getPolicyDBDaoInstance(emf);
+			dbd2 = PolicyDBDao.getPolicyDBDaoInstance(emf);
+		} catch (Exception e) {
+			//e.printStackTrace();
+			Assert.fail();
+		}
+
+		d = PolicyDBDao.getPolicyDBDaoTestClass();
+	}
+	
+	@After
+	public void cleanUp(){
+		EntityManager em = emf.createEntityManager();
+		em.getTransaction().begin();
+		try{	
+		em.createQuery("DELETE FROM PolicyDBDaoEntity").executeUpdate(); 
+		em.createQuery("DELETE FROM PolicyEntity").executeUpdate(); 
+		em.createQuery("DELETE FROM ConfigurationDataEntity").executeUpdate();
+		em.createQuery("DELETE FROM ActionBodyEntity").executeUpdate();
+		em.createQuery("DELETE FROM PdpEntity").executeUpdate();
+		em.createQuery("DELETE FROM GroupEntity").executeUpdate();
+
+		em.getTransaction().commit();
+		} catch(Exception e){
+			em.getTransaction().rollback();
+		}
+		em.close();
+		try {
+			FileUtils.forceDelete(new File("src/test/resources/junitTestCreatedDirectory"));
+		} catch (IOException e) {
+			//could not delete
+		}
+
+	}
+	
+	@Test
+	public void getScopeAndNameAndTypeTest(){
+
+		String s = d.getGitPath();
+		String pathIwantToUse;
+		if(s.contains("/")){
+			pathIwantToUse = "/root/users/" + s + "/org/openecomp/Config_mypolicy.xml";
+		} else {
+			pathIwantToUse = "C:\\root\\users\\" + s + "\\org\\openecomp\\Config_mypolicy.xml";
+		}
+		String[] snt = d.getScopeAndNameAndType(pathIwantToUse);
+		Assert.assertEquals("Scope was parsed wrong","org.openecomp", snt[0]);
+		Assert.assertEquals("Policy name was parsed wrong","Config_mypolicy.xml", snt[1]);
+		Assert.assertEquals("Policy type was parsed wrong","Config", snt[2]);
+	}
+	@Test
+	public void computeScopeTest(){
+		Assert.assertEquals("com",d.computeScope("C:\\Users\\testuser\\admin\\repo\\com\\", "C:\\Users\\testuser\\admin\\repo"));
+		Assert.assertEquals("org.openecomp.policy",d.computeScope("/Users/testuser/admin/repo/org/openecomp/policy", "/Users/testuser/admin/repo"));
+	}
+	@Test
+	public void getConfigFileTest(){
+		PolicyRestAdapter pra = new PolicyRestAdapter();
+		pra.setConfigType(ConfigPolicy.JSON_CONFIG);
+		String configFile = d.getConfigFile("Config_mypolicy.xml", "org.openecomp", pra);
+		Assert.assertEquals("org.openecomp.Config_mypolicy.json", configFile);
+		//yes, we can do action files too even though they don't have configs
+		configFile = d.getConfigFile("Action_mypolicy.xml", "org.openecomp", pra);
+		Assert.assertEquals("org.openecomp.Action_mypolicy.json", configFile);
+	}
+	
+	@Test
+	public void transactionTests(){
+		
+		
+//		try{
+//			transac.commitTransaction();
+//			Assert.fail();
+//		} catch(IllegalStateException e){
+//			//worked
+//		} catch(Exception e2){
+//			Assert.fail();
+//		}
+		String filePath = null;
+		String xmlFile = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Policy xmlns=\"urn:oasis:names:tc:xacml:3.0:core:schema:wd-17\" PolicyId=\"urn:com:xacml:policy:id:eaa4bb64-59cf-4517-bb44-b2eeabd50b11\" Version=\"1\" RuleCombiningAlgId=\"urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides\">\n    <Description></Description>\n    <Target>\n        <AnyOf>\n            <AllOf>\n                <Match MatchId=\"org.openecomp.function.regex-match\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#integer\">99</AttributeValue>\n                    <AttributeDesignator Category=\"urn:oasis:names:tc:xacml:3.0:attribute-category:resource\" AttributeId=\"cpu\" DataType=\"http://www.w3.org/2001/XMLSchema#integer\" MustBePresent=\"false\"/>\n                </Match>\n            </AllOf>\n        </AnyOf>\n    </Target>\n    <Rule RuleId=\"urn:com:xacml:rule:id:3350bf37-43d0-4a94-a317-febec81150d8\" Effect=\"Permit\">\n        <Target/>\n        <ObligationExpressions>\n            <ObligationExpression ObligationId=\"test\" FulfillOn=\"Permit\">\n                <AttributeAssignmentExpression AttributeId=\"performer\" Category=\"urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">PDPAction</AttributeValue>\n                </AttributeAssignmentExpression>\n                <AttributeAssignmentExpression AttributeId=\"type\" Category=\"urn:oasis:names:tc:xacml:3.0:attribute-category:resource\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">REST</AttributeValue>\n                </AttributeAssignmentExpression>\n                <AttributeAssignmentExpression AttributeId=\"url\" Category=\"urn:oasis:names:tc:xacml:3.0:attribute-category:resource\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#anyURI\">http://localhost:8056/pcd</AttributeValue>\n                </AttributeAssignmentExpression>\n                <AttributeAssignmentExpression AttributeId=\"method\" Category=\"urn:oasis:names:tc:xacml:3.0:attribute-category:resource\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#string\">GET</AttributeValue>\n                </AttributeAssignmentExpression>\n                <AttributeAssignmentExpression AttributeId=\"body\" Category=\"urn:oasis:names:tc:xacml:3.0:attribute-category:resource\">\n                    <AttributeValue DataType=\"http://www.w3.org/2001/XMLSchema#anyURI\">$URLaction/com.Action_patbaction7.json</AttributeValue>\n                </AttributeAssignmentExpression>\n            </ObligationExpression>\n        </ObligationExpressions>\n    </Rule>\n</Policy>\n";
+		String jsonFile = "{\"actionAttribute\":\"Memory\"}";
+		
+		try{
+			//policy file
+			InputStream in = new ByteArrayInputStream(xmlFile.getBytes());
+			String workspaceDir = "src/test/resources/junitTestCreatedDirectory/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE)+"/admin/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY);
+			FileUtils.forceMkdir(new File(workspaceDir+"/org/openecomp"));
+			File outFile = new File(workspaceDir+"/org/openecomp/Action_mypol.xml");
+			OutputStream out = new FileOutputStream(outFile);
+			IOUtils.copy(in, out);
+			filePath = outFile.getAbsolutePath();	
+			out.close();
+			
+			//action body file
+			InputStream actionIn = new ByteArrayInputStream(jsonFile.getBytes());
+			String webappDir = "src/test/resources/junitTestCreatedDirectory/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE);
+			XACMLProperties.setProperty(XACMLRestProperties.PROP_PAP_WEBAPPS, webappDir);
+			String actionDir = Webapps.getActionHome();
+			FileUtils.forceMkdir(new File(actionDir));
+			File actionOutFile = new File(actionDir+"/org.openecomp.Action_mypol.json");
+			OutputStream actionOut = new FileOutputStream(actionOutFile);
+			IOUtils.copy(actionIn, actionOut);
+			actionOut.close();
+			
+		}catch(Exception e){
+			//could not run test
+		}
+		PolicyDBDaoTransaction transac = dbd.getNewTransaction();
+		if(filePath != null){
+			try{
+				transac.createPolicy(filePath, "tester");
+				transac.commitTransaction();
+			} catch(Exception e){
+				Assert.fail();
+			}
+			EntityManager getData = emf.createEntityManager();
+			Query getDataQuery = getData.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:name");
+			getDataQuery.setParameter("scope", "org.openecomp");
+			getDataQuery.setParameter("name","Action_mypol.xml");
+			PolicyEntity result = null;
+			try{
+				result = (PolicyEntity)getDataQuery.getSingleResult();
+			} catch(Exception e){
+				e.printStackTrace();
+				Assert.fail();
+			}
+			Assert.assertEquals(xmlFile, result.getPolicyData());
+			getData.close();
+			result = null;
+			xmlFile = null;
+			try{
+				transac = dbd.getNewTransaction();
+				transac.deletePolicy(filePath);
+			} catch(Exception e){
+				e.printStackTrace();
+				Assert.fail();
+			}
+			Assert.assertTrue(transac.isTransactionOpen());
+			try{				
+				transac.deletePolicy(filePath);
+				Assert.fail();
+			} catch(IllegalStateException e){
+				//pass
+			} catch(Exception e){
+				Assert.fail();
+			}
+			transac.commitTransaction();
+			//Assert.assertFalse(transac.isTransactionOpen());
+			try{
+				transac = dbd.getNewTransaction();
+				transac.deletePolicy(filePath);
+			} catch(Exception e){
+				e.printStackTrace();
+				Assert.fail();
+			}
+			transac.commitTransaction();
+			//Assert.assertFalse(transac.isTransactionOpen());
+			String workspaceDir = "src/test/resources/junitTestCreatedDirectory/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE)+"/admin/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY);
+			PolicyDBDaoTransaction willFail = dbd.getNewTransaction();
+			File fakeFile = new File("directorythatdoesnotexist/"+workspaceDir);
+			try{
+			willFail.createPolicy(fakeFile.getAbsolutePath(), "user1");
+			Assert.fail();
+			} catch(IllegalArgumentException e){
+				if(!e.getMessage().equals("The file path could not be parsed")){
+					Assert.fail();
+				}
+			}			
+			willFail.close();
+			
+			fakeFile = new File("directorythatdoesnotexist/"+workspaceDir+"/Action_mypol2.xml");
+			willFail = dbd.getNewTransaction();
+			try{
+			willFail.createPolicy(fakeFile.getAbsolutePath(), "user1");
+			Assert.fail();
+			} catch(IllegalArgumentException e){
+				if(!e.getMessage().equals("The file path could not be parsed")){
+					Assert.fail();
+				}
+			}
+			willFail.close();
+			
+			fakeFile = new File("directorythatdoesnotexist/"+workspaceDir+"org/openecomp/Action_mypol2.xml");
+			willFail = dbd.getNewTransaction();
+			try{
+			willFail.createPolicy(fakeFile.getAbsolutePath(), "user1");
+			Assert.fail();
+			} catch(IllegalArgumentException e){
+				if(!e.getMessage().equals("The file path does not exist")){
+					Assert.fail();
+				}
+			}
+			willFail.close();
+			
+			emf = Persistence.createEntityManagerFactory("testPU");
+			EntityManager aem = emf.createEntityManager();
+			Query actionQuery = aem.createQuery("SELECT a FROM ActionBodyEntity a WHERE a.actionBodyName=:actionBodyName");
+			actionQuery.setParameter("actionBodyName", "org.openecomp.Action_mypol.json");
+			List<?> actionQueryList = actionQuery.getResultList();
+			if(actionQueryList.size() < 1){
+				Assert.fail("ActionBodyEntity not found with actionBodyName=: org.openecomp.Action_mypol.json"  );
+			} else if(actionQueryList.size() > 1){
+				//something went wrong
+				Assert.fail("Somehow, more than one ActionBodyEntity with the actionBodyName = org.openecomp.Action_mypol.json");
+			} else {
+				ActionBodyEntity abe = (ActionBodyEntity)actionQueryList.get(0);
+				logger.debug("\n\nPolicyDBDaoTest.transactionTests() Assert.assertEquals"
+						+ "\n   abe.getActionBody() = " + abe.getActionBody()
+						+ "\n   jsonFile = " + jsonFile
+						+ "\n\n");
+				Assert.assertEquals(abe.getActionBody(),jsonFile);				
+			}
+		}
+	}
+	
+	@Test
+	public void createFromPolicyObject(){
+		String workspaceDir = "src/test/resources/junitTestCreatedDirectory/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE)+"/admin/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY);
+		File parentPath = new File(workspaceDir+"/org/openecomp");
+		File scope = new File(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_WORKSPACE)+"/admin/"+XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_REPOSITORY));
+		Policy policyObject = new ConfigPolicy();
+		policyObject.policyAdapter = new PolicyRestAdapter();
+		policyObject.policyAdapter.setConfigName("testpolicy1");
+		policyObject.policyAdapter.setParentPath(parentPath.getAbsolutePath());
+		policyObject.policyAdapter.setUserGitPath(scope.getPath());
+		policyObject.policyAdapter.setPolicyDescription("my description");
+		policyObject.policyAdapter.setConfigBodyData("this is my test config file");
+		policyObject.policyAdapter.setPolicyName("testpolicy1");
+		policyObject.policyAdapter.setConfigType(ConfigPolicy.OTHER_CONFIG);
+		policyObject.policyAdapter.setPolicyType("Config");
+		PolicyType policyTypeObject = new PolicyType();
+		policyObject.policyAdapter.setPolicyData(policyTypeObject);
+		PolicyDBDaoTransaction transaction = dbd.getNewTransaction();
+		try{
+		transaction.createPolicy(policyObject, "testuser1");
+		transaction.commitTransaction();
+		} catch(Exception e){
+			transaction.rollbackTransaction();
+			Assert.fail();
+		}
+		
+		EntityManager getData = emf.createEntityManager();
+		Query getDataQuery = getData.createQuery("SELECT p FROM PolicyEntity p WHERE p.scope=:scope AND p.policyName=:name");
+		getDataQuery.setParameter("scope", "org.openecomp");
+		getDataQuery.setParameter("name","Config_testpolicy1.xml");
+		PolicyEntity result = null;
+		try{
+		result = (PolicyEntity)getDataQuery.getSingleResult();
+		} catch(Exception e){
+			e.printStackTrace();
+			Assert.fail();
+		}
+		String expectedData;
+		try {
+			expectedData = IOUtils.toString(XACMLPolicyWriter.getXmlAsInputStream(policyTypeObject));
+		} catch (IOException e1) {
+			expectedData = "";
+		}
+		Assert.assertEquals(expectedData, result.getPolicyData());
+		getData.close();
+		result = null;
+		File policyFile = new File(workspaceDir+"/org/openecomp/Config_testpolicy1.xml");
+		try{
+			transaction = dbd.getNewTransaction();
+			transaction.deletePolicy(policyFile.getAbsolutePath());
+		} catch(Exception e){
+			e.printStackTrace();
+			Assert.fail();
+		}
+		Assert.assertTrue(transaction.isTransactionOpen());
+		try{				
+			transaction.deletePolicy(policyFile.getAbsolutePath());
+			Assert.fail();
+		} catch(IllegalStateException e){
+			//pass
+		} catch(Exception e){
+			Assert.fail();
+		}
+		transaction.commitTransaction();
+		Assert.assertFalse(transaction.isTransactionOpen());
+		try{
+			transaction = dbd.getNewTransaction();
+			transaction.deletePolicy(policyFile.getAbsolutePath());
+		} catch(Exception e){
+			e.printStackTrace();
+			Assert.fail();
+		}
+		//Assert.assertFalse(transaction.isTransactionOpen());
+		transaction.commitTransaction();
+	}
+
+	@Test
+	public void groupTransactions(){		
+		PolicyDBDaoTransaction group = dbd.getNewTransaction();
+		String groupName = "test group 1";
+		try{
+			group.createGroup(PolicyDBDao.createNewPDPGroupId(groupName), groupName, "this is a test group","testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		EntityManager em = emf.createEntityManager();
+		Query getGroup = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+		getGroup.setParameter("groupId", PolicyDBDao.createNewPDPGroupId(groupName));
+		getGroup.setParameter("deleted", false);
+		List<?> groups = getGroup.getResultList();
+		if(groups.size() != 1){
+			Assert.fail();
+		}
+		GroupEntity groupEntity = (GroupEntity)groups.get(0);
+		em.close();
+		Assert.assertEquals(groupName, groupEntity.getgroupName());
+		Assert.assertEquals("this is a test group", groupEntity.getDescription());
+		group = dbd.getNewTransaction();
+		try{
+			EcompPDPGroup groupToDelete = new StdPDPGroup(PolicyDBDao.createNewPDPGroupId(groupName),Paths.get("/"));			
+			group.deleteGroup(groupToDelete, null,"testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		getGroup = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+		getGroup.setParameter("groupId", PolicyDBDao.createNewPDPGroupId(groupName));
+		getGroup.setParameter("deleted", false);
+		groups = getGroup.getResultList();
+		if(groups.size() != 0){
+			System.out.println("Group size: "+groups.size());
+			Assert.fail();
+		}
+		em.close();
+		//add a pdp to a group
+		group = dbd.getNewTransaction();
+		try{
+			group.createGroup(PolicyDBDao.createNewPDPGroupId(groupName), groupName, "test group", "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		group = dbd.getNewTransaction();
+		try{
+			group.addPdpToGroup("http://localhost:4344/pdp/", PolicyDBDao.createNewPDPGroupId(groupName), "primary", "the main pdp", 3232, "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		Query getPdp = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+		getPdp.setParameter("pdpId", "http://localhost:4344/pdp/");
+		getPdp.setParameter("deleted", false);
+		List<?> pdps = getPdp.getResultList();
+		if(pdps.size() != 1){
+			System.out.println("Group size: "+pdps.size());
+			Assert.fail();
+		}
+		PdpEntity pdp = (PdpEntity)pdps.get(0);
+		Assert.assertEquals(groupName, pdp.getGroup().getgroupName());
+		Assert.assertEquals(pdp.getPdpName(), "primary");
+		em.close();
+		group = dbd.getNewTransaction();
+		try{
+			group.removePdpFromGroup("http://localhost:4344/pdp/","testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		getPdp = em.createQuery("SELECT p FROM PdpEntity p WHERE p.pdpId=:pdpId AND p.deleted=:deleted");
+		getPdp.setParameter("pdpId", "http://localhost:4344/pdp/");
+		getPdp.setParameter("deleted", false);
+		pdps = getPdp.getResultList();
+		if(pdps.size() != 0){
+			System.out.println("Group size: "+pdps.size());
+			Assert.fail();
+		}
+		em.close();
+		
+		//add some pdps to groups
+		group = dbd.getNewTransaction();
+		try{
+			group.createGroup(PolicyDBDao.createNewPDPGroupId("testgroup1"), "testgroup1", "test group", "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		group = dbd.getNewTransaction();
+		try{
+			group.createGroup(PolicyDBDao.createNewPDPGroupId("testgroup2"), "testgroup2", "test group", "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		
+		group = dbd.getNewTransaction();
+		try{
+			group.addPdpToGroup("http://localhost:4344/pdp/", PolicyDBDao.createNewPDPGroupId("testgroup1"), "primary", "the main pdp", 3232, "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		group = dbd.getNewTransaction();
+		try{
+			group.addPdpToGroup("http://localhost:4345/pdp/", PolicyDBDao.createNewPDPGroupId("testgroup1"), "secondary", "the second pdp", 3233, "testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		getPdp = em.createQuery("SELECT p FROM PdpEntity p WHERE p.deleted=:deleted");
+		getPdp.setParameter("deleted", false);
+		pdps = getPdp.getResultList();
+		for(Object o : pdps){
+			Assert.assertEquals("testgroup1",((PdpEntity)o).getGroup().getgroupName());
+		}
+		em.close();
+		
+		group = dbd.getNewTransaction();
+		try{
+			EcompPDPGroup groupToDelete = new StdPDPGroup(PolicyDBDao.createNewPDPGroupId("testgroup1"),Paths.get("/"));
+			EcompPDPGroup groupToMoveTo = new StdPDPGroup(PolicyDBDao.createNewPDPGroupId("testgroup2"),Paths.get("/"));	
+			group.deleteGroup(groupToDelete, groupToMoveTo,"testuser");
+			group.commitTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		getGroup = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+		getGroup.setParameter("groupId", "testgroup1");
+		getGroup.setParameter("deleted", false);
+		groups = getGroup.getResultList();
+		if(groups.size() != 0){
+			System.out.println("Group size: "+groups.size());
+			Assert.fail();
+		}
+		em.close();
+		
+		em = emf.createEntityManager();
+		getPdp = em.createQuery("SELECT p FROM PdpEntity p WHERE p.deleted=:deleted");
+		getPdp.setParameter("deleted", false);
+		pdps = getPdp.getResultList();
+		for(Object o : pdps){
+			Assert.assertEquals("testgroup2",((PdpEntity)o).getGroup().getgroupName());
+		}
+		em.close();
+		
+		group = dbd.getNewTransaction();
+		try{
+			EcompPDPGroup groupToDelete = new StdPDPGroup(PolicyDBDao.createNewPDPGroupId("testgroup2"),Paths.get("/"));
+			EcompPDPGroup groupToMoveTo = null;	
+			group.deleteGroup(groupToDelete, groupToMoveTo,"testuser");
+			group.commitTransaction();
+			Assert.fail();
+		} catch(PAPException pe){
+			//good, can't delete group with pdps
+			group.rollbackTransaction();
+		} catch(Exception e){
+			group.rollbackTransaction();
+			e.printStackTrace();
+			Assert.fail();
+		}
+		
+		
+		//add policy to group
+		
+		//update group
+		EcompPDPGroup pdpGroup = new StdPDPGroup("testgroup2", false, "newtestgroup2", "this is my new description", Paths.get("/"));
+		group = dbd.getNewTransaction();
+		try{
+			group.updateGroup(pdpGroup, "testuser");
+			group.commitTransaction();
+		}catch (Exception e){
+			e.printStackTrace();
+			group.rollbackTransaction();
+			Assert.fail();
+		}
+		em = emf.createEntityManager();
+		getGroup = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+		getGroup.setParameter("groupId", "newtestgroup2");
+		getGroup.setParameter("deleted", false);
+		groups = getGroup.getResultList();
+		if(groups.size() != 1){
+			System.out.println("Group size: "+groups.size());
+			Assert.fail();
+		}
+		em.close();
+		em = emf.createEntityManager();
+		getGroup = em.createQuery("SELECT g FROM GroupEntity g WHERE g.groupId=:groupId AND g.deleted=:deleted");
+		getGroup.setParameter("groupId", "testgroup2");
+		getGroup.setParameter("deleted", false);
+		groups = getGroup.getResultList();
+		if(groups.size() != 0){
+			System.out.println("Group size: "+groups.size());
+			Assert.fail();
+		}
+		em.close();
+		//update pdp
+
+		//set group as default
+
+		//move pdp to new group
+
+
+	}
+	
+	@Test
+	public void encryptionTest(){
+		try {
+			String encr = d.encryptPassword("testpassword");
+			System.out.println("original password: "+"testpassword");
+			System.out.println("Encrypted password: "+encr);
+			String decr = d.decryptPassword(encr);
+			System.out.println("Decrypted password: "+decr);
+			Assert.assertEquals("testpassword", decr);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			Assert.fail();
+		}
+		
+	}
+	@Test
+	public void getDescriptionFromXacmlTest(){
+		String myTestDesc = "hello this is a test";
+		String desc = d.getDescriptionFromXacml("<Description>"+myTestDesc+"</Description>");
+		Assert.assertEquals(myTestDesc, desc);
+	}
+
+	@Test
+	public void threadingStabilityTest(){
+		if(logger.isDebugEnabled()){
+			logger.debug("\n\n****************************"
+					+ "threadingStabilityTest() entry"
+					+ "******************************\n\n");
+		}
+			
+		PolicyDBDaoTransaction t = dbd.getNewTransaction();
+		Assert.assertTrue(t.isTransactionOpen());
+		try {
+			//Add 1000 ms to the timeout just to be sure it actually times out
+			int sleepTime = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT)) + 1000;
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+						+ "\n   sleepTime =  " + sleepTime 
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+			Thread.sleep(sleepTime);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   Assert.assertFalse(t.isTransactionOpen() = " + t.isTransactionOpen() + ")"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		Assert.assertFalse(t.isTransactionOpen());
+		
+		
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   a = dbd.getNewTransaction() " 
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		PolicyDBDaoTransaction a = dbd.getNewTransaction();
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   Assert.assertTrue(a.isTransactionOpen() = " + a.isTransactionOpen() + ")"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		Assert.assertTrue(a.isTransactionOpen());
+
+		try {
+			//Add 1000 ms to the timeout just to be sure it actually times out
+			int sleepTime = Integer.parseInt(XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT)) + 1000;
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+						+ "\n   sleepTime =  " + sleepTime 
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+			Thread.sleep(sleepTime);
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   b = dbd.getNewTransaction() " 
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		PolicyDBDaoTransaction b = dbd.getNewTransaction();
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   Assert.assertFalse(a.isTransactionOpen() = " + a.isTransactionOpen() + ")"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		Assert.assertFalse(a.isTransactionOpen());
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   Assert.assertTrue(b.isTransactionOpen() = " + b.isTransactionOpen() + ")"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		Assert.assertTrue(b.isTransactionOpen());
+		b.close();
+		
+		
+				
+		//Now let's test the transaction wait time timeout. Shorten the wait time to 1000 ms
+		System.setProperty(XACMLRestProperties.PROP_PAP_TRANS_WAIT,"1000");
+		//And let's lengthen the transaction timeout to 5000 ms
+		System.setProperty(XACMLRestProperties.PROP_PAP_TRANS_TIMEOUT,"5000");
+		//get a transacton
+		PolicyDBDaoTransaction t1 = dbd.getNewTransaction();
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+					+ "\n   Assert.assertTrue(t1.isTransactionOpen() = " + t1.isTransactionOpen() + ")"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+		Assert.assertTrue(t1.isTransactionOpen());
+		//while it is open, get another from a different DB Dao so it will not collide on the synchronized code segment
+		//but will collide at the DB. Remember that the wait time is only 1000 ms
+		try {
+			//Now the 2nd transaction has a wait timeout in 1000 ms
+			PolicyDBDaoTransaction t2 = dbd2.getNewTransaction();
+			/* 
+			 * Give it plenty of time to time out the second transaction
+			 * It will actually hang right here until it either gets the lock from the DB or the
+			 * request for the DB lock times out. The timers are very sloppy so, I have given
+			 * this plenty of leeway.
+			 */
+			
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+						+ "\n   Thread.sleep(3000)" 
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+			Thread.sleep(3000);
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+						+ "\n   Assert.assertTrue(t1.isTransactionOpen() = " + t1.isTransactionOpen() + ")"
+						+ "\n   Assert.assertFalse(t2.isTransactionOpen() = " + t2.isTransactionOpen() + ")"
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+			//Assert.assertTrue(t1.isTransactionOpen());
+			//Assert.assertFalse(t2.isTransactionOpen());
+			
+			Assert.fail("\n\nTransaction timeout of 1000 ms exceeded without a PersistenceException\n\n");
+		} catch (PersistenceException e) {
+			//success
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() "
+						+ "\n   SUCCESS! Transaction Wait Timeout worked!"
+						+ "\n   Caught PersistenceException = " + e
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+		} catch (Exception e) {
+			// failure due to some other reason
+			if(logger.isDebugEnabled()){
+				Date date= new java.util.Date();
+				logger.debug("\n\nPolicyDBDaoTest.threadingStabilityTest() FAILURE"
+						+ "\n   Caught Exception = " + e
+						+ "\n   TimeStamp = " + date.getTime()
+						+ "\n\n");
+			}
+			e.printStackTrace();
+			Assert.fail();
+		}
+		
+		if(logger.isDebugEnabled()){
+			Date date= new java.util.Date();
+			logger.debug("\n\nthreadingStabilityTest() exit"
+					+ "\n   TimeStamp = " + date.getTime()
+					+ "\n\n");
+		}
+	}
+
+}
diff --git a/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/jpa/PolicyEntityTest.java b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/jpa/PolicyEntityTest.java
new file mode 100644
index 0000000..f71026c
--- /dev/null
+++ b/ECOMP-PAP-REST/src/test/java/org/openecomp/policy/pap/xacml/rest/jpa/PolicyEntityTest.java
@@ -0,0 +1,802 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ECOMP-PAP-REST
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.policy.pap.xacml.rest.jpa;
+
+import static org.junit.Assert.*;
+
+//import org.apache.commons.logging.Log;
+//import org.apache.commons.logging.LogFactory;
+import org.junit.*;
+import org.openecomp.policy.rest.XACMLRestProperties;
+import org.openecomp.policy.rest.jpa.ActionBodyEntity;
+import org.openecomp.policy.rest.jpa.ConfigurationDataEntity;
+import org.openecomp.policy.rest.jpa.PolicyDBDaoEntity;
+import org.openecomp.policy.rest.jpa.PolicyEntity;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.persistence.Query;
+
+import java.util.Date;
+import java.util.List;
+import org.openecomp.policy.common.logging.flexlogger.FlexLogger; 
+import org.openecomp.policy.common.logging.flexlogger.Logger;
+
+import java.util.Properties;
+
+public class PolicyEntityTest {
+	
+	private static Logger logger = FlexLogger.getLogger(PolicyEntityTest.class);
+	
+//    @Ignore
+    @Test
+    public void testAllOps(){
+    	Properties properties = new Properties();
+    	properties.put(XACMLRestProperties.PROP_PAP_DB_DRIVER,"org.h2.Driver");
+    	properties.put(XACMLRestProperties.PROP_PAP_DB_URL, "jdbc:h2:file:./sql/xacmlTest");
+    	properties.put(XACMLRestProperties.PROP_PAP_DB_USER, "sa");
+    	properties.put(XACMLRestProperties.PROP_PAP_DB_PASSWORD, "");
+    	EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPapPU", properties);
+    	EntityManager em = emf.createEntityManager();
+        // Start a transaction
+        EntityTransaction et = em.getTransaction();
+
+        et.begin();
+        //Make sure the DB is clean
+        em.createQuery("DELETE FROM PolicyDBDaoEntity").executeUpdate();
+        em.createQuery("DELETE FROM PolicyEntity").executeUpdate();
+        em.createQuery("DELETE FROM ConfigurationDataEntity").executeUpdate();
+        em.createQuery("DELETE FROM ActionBodyEntity").executeUpdate();
+
+        //Create a policy object
+        PolicyEntity p1 = new PolicyEntity();
+        
+        //persist the policy    
+        em.persist(p1);
+
+        long policyId1 = p1.getPolicyId();
+        
+        String policyName1 = p1.getPolicyName();
+        
+        int version1 = p1.getVersion();
+        
+        String policyData1 = p1.getPolicyData();
+        
+        ConfigurationDataEntity configData1 = p1.getConfigurationData();
+        String configDataStr1 = (configData1!=null ? "configurationDataId = " + configData1.getConfigurationDataId() : "configurationData is null");
+        
+        ActionBodyEntity actionBody1 = p1.getActionBodyEntity();
+        String actionBodyStr1 = (actionBody1!=null ? "actionBodyId = " + actionBody1.getActionBodyId() : "actionBody is null");
+        
+        String createdBy1 = p1.getCreatedBy();
+        
+        Date createdDate1 = p1.getCreatedDate();
+        String createdDateStr1 = (createdDate1 != null ? createdDate1.toString() : "createdDate is null");
+        
+        String description = p1.getDescription();
+        
+        String modifiedBy1 = p1.getModifiedBy();
+        
+        Date modifiedDate1 = p1.getModifiedDate();
+        String modifiedDateStr1 = (modifiedDate1 != null ? modifiedDate1.toString() : "modifiedDate is null");
+        
+        
+        logger.debug("\n\n********PolicyEntityTest: Local PolicyEntity and Configuration objects before persist*********"
+        		+ "\npolicyId1 = " + policyId1
+        		+ "\npolicyName1 = " + policyName1
+        		+ "\nversion1 = " + version1
+        		+ "\npolicyData1 = " + policyData1
+        		+ "\nconfigDataStr1 = " + configDataStr1
+        		+ "\nactionBodyStr1 = " + actionBodyStr1
+           		+ "\nscope = " + p1.getScope()
+        		+ "\ncreatedBy1 = " + createdBy1
+        		+ "\ncreatedDateStr1 = " + createdDateStr1
+        		+ "\ndescription = " + description
+        		+ "\nmodifiedBy1 = " + modifiedBy1
+        		+ "\nmodifiedDateStr1 = " + modifiedDateStr1
+        		+ "\ndeleted = " + p1.isDeleted());
+        
+        //Set policyID
+        p1.setPolicyName("testPID2");
+        
+        //Set policyData
+        p1.setPolicyData("<policy>PolicyData</policy>");
+        
+        //We will NOT set the ConfigurationDataEntity or ActionBodyEntity object just to test that it is optional
+        
+        //set createdBy
+        p1.setCreatedBy("super-admin");
+        
+        //createdDate will be set when it is persisted
+        
+        //set scope
+        p1.setScope("com.test");
+        
+        //set description
+        p1.setDescription("PolicyEntity Description");
+        
+        //set modifiedBy
+        p1.setModifiedBy("super-admin");
+        
+        //modifiedDate will be set when it is persisted
+      
+        //Flush to the DB
+        em.flush();
+        
+        //Now lets get some attribute values
+  
+        policyId1 = p1.getPolicyId();
+        
+        policyName1 = p1.getPolicyName();
+        
+        version1 = p1.getVersion();
+        
+        policyData1 = p1.getPolicyData();
+        
+        configData1 = p1.getConfigurationData();
+        configDataStr1 = (configData1!=null ?  "configurationDataId = " + configData1.getConfigurationDataId() : "configurationData is null");
+        
+        actionBody1 = p1.getActionBodyEntity();
+        actionBodyStr1 = (actionBody1!=null ? "actionBodyId = " + actionBody1.getActionBodyId() : "actionBody is null");
+        
+        createdBy1 = p1.getCreatedBy();
+        
+        createdDate1 = p1.getCreatedDate();
+        createdDateStr1 = (createdDate1 != null ? createdDate1.toString() : "createdDate is null");
+        
+        description = p1.getDescription();
+        
+        modifiedBy1 = p1.getModifiedBy();
+        
+        modifiedDate1 = p1.getModifiedDate();
+        modifiedDateStr1 = (modifiedDate1 != null ? modifiedDate1.toString() : "modifiedDate is null");
+        
+        logger.debug("\n\n********PolicyEntityTest: Local PolicyEntity and Configuration objects after persist*********"
+        		+ "\npolicyId1 = " + policyId1
+        		+ "\npolicyName1 = " + policyName1
+        		+ "\nversion1 = " + version1
+        		+ "\npolicyData1 = " + policyData1
+        		+ "\nconfigDataStr1 = " + configDataStr1
+        		+ "\nactionBodyStr1 = " + actionBodyStr1
+        		+ "\nscopeId = " + p1.getScope()
+        		+ "\ncreatedBy1 = " + createdBy1
+        		+ "\ncreatedDateStr1 = " + createdDateStr1
+        		+ "\ndescription = " + description
+        		+ "\nmodifiedBy1 = " + modifiedBy1
+        		+ "\nmodifiedDateStr1 = " + modifiedDateStr1
+        		+ "\ndeleted = " + p1.isDeleted());
+
+        //Now lets fully configure the configurationData and actionBody
+        
+        //Create a ConfigurationDataEntity object and set ID
+      ConfigurationDataEntity c1 = new ConfigurationDataEntity();      
+      
+      ActionBodyEntity a1 = new ActionBodyEntity();
+      
+        //persist the configuration Data
+      	em.persist(c1);        
+        
+        c1.setConfigType("OTHER");
+        
+        c1.setConfigBody("ABC");
+        
+        c1.setDescription("ConfigurationDataEntity Description");
+        
+        c1.setCreatedBy("super-admin");
+        
+        c1.setDeleted(true);
+        
+        //persist the action Body
+        
+        em.persist(a1);
+        
+        a1.setActionBody("myActionBody");
+        
+        a1.setActionBodyName("myActionBodyName");
+        
+        a1.setCreatedBy("super-admin");
+        
+        a1.setModifiedBy("super-admin");
+        
+        a1.setDeleted(false);
+        
+        
+        long configurationDataId = c1.getConfigurationDataId();
+        
+        int cdVersion = c1.getVersion();
+        
+        String cdConfigType = c1.getConfigType();
+        
+        String cdConfigBody = c1.getConfigBody();
+        
+        String cdCreatedBy = c1.getCreatedBy();
+        
+        Date cdCreatedDate = c1.getCreatedDate();
+        
+        String cdDescription = c1.getDescription();
+        
+        String cdModifiedBy = c1.getModifiedBy();
+        
+        Date cdModifiedDate = c1.getModifiedDate();
+        
+        logger.debug("\n\n********PolicyEntityTest: Local Configuration object after setting values *********"
+        		+ "\nconfigurationDataId = " + configurationDataId
+        		+ "\ncdVersion = " + cdVersion
+        		+ "\ncdConfigType = " + cdConfigType
+        		+ "\ncdConfigBody = " + cdConfigBody
+        		+ "\ncdCreatedBy = " + cdCreatedBy
+        		+ "\ncdCreatedDate = " + cdCreatedDate
+        		+ "\ncdDescription = " + cdDescription
+        		+ "\ncdModifiedBy = " + cdModifiedBy
+        		+ "\ncdModifiedDate = " + cdModifiedDate
+        		+ "\ndeleted = " + c1.isDeleted());        
+        
+
+        
+        logger.debug("\n\n********PolicyEntityTest: Local Action Body object after setting values *********"
+        		+ "\nactionBodyId = " + a1.getActionBodyId()
+        		+ "\nactionBodyVersion = " + a1.getVersion()
+        		+ "\nactionBody = " + a1.getActionBody()
+        		+ "\nactionBodyCeatedBy = " + a1.getCreatedBy()
+        		+ "\nactionBodyCreatedDate = " + a1.getCreatedDate()
+        		+ "\nactionBodyModifiedBy = " + a1.getModifiedBy()
+        		+ "\nactionBodyModifiedDate = " + a1.getModifiedDate()
+        		+ "\nactionBodyDeleted = " + a1.isDeleted());        
+
+        p1.setScope("mckiou.kevin.kim");        
+        
+        //flush to the db
+        em.flush();
+        
+        //Perform policy selects
+        
+        Query query = em.createQuery("Select p from PolicyEntity p where p.policyId=:pid");
+        Query queryscope = em.createQuery("Select p from PolicyEntity p where p.scope=:s");
+        
+        query.setParameter("pid", p1.getPolicyId());
+        queryscope.setParameter("s", "com.user");
+        
+        //Just test that we are retrieving the right object
+        @SuppressWarnings("rawtypes")
+        List psList = queryscope.getResultList();
+        PolicyEntity px = null;
+        if(!psList.isEmpty()){
+        	//ignores multiple results
+        	px = (PolicyEntity) psList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No PolicyEntity using scope DB entry found");
+        }
+        
+        //The scope object on the retrieved policy object should be same as the one we used to find it
+        assertSame(p1,px);
+        
+       
+        //Because getSingleResult() throws an unchecked exception which is an indication of a 
+        //programming error, we are not going to use it.
+        @SuppressWarnings("rawtypes")
+		List resultList = query.getResultList();
+        PolicyEntity p2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            p2 = (PolicyEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No PolicyEntity DB entry found");
+        }
+        
+        logger.debug("\n\n********PolicyEntityTest: PolicyEntity object after retrieving from DB BEFORE assigning configurationData*********"
+        		+ "\npolicyId2 = " + p2.getPolicyId()
+        		+ "\npolicyName2 = " + p2.getPolicyName()
+        		+ "\nversion2 = " + p2.getVersion()
+        		+ "\npolicyData2 = " + p2.getPolicyData()
+        		+ "\nconfigurationData2 = " + (p2.getConfigurationData()!=null ? "configurationDataId = " + p2.getConfigurationData().getConfigurationDataId() : "configurationData is null")
+        		+ "\nactionBody2 = " + (p2.getActionBodyEntity()!=null ? "actionBodyId = " + p2.getActionBodyEntity().getActionBodyId() : "actionBody is null")
+        		+ "\nscope2 = " + p2.getScope()
+        		+ "\ncreatedBy2 = " + p2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + p2.getCreatedDate()
+        		+ "\ndescription2 = " + p2.getDescription()
+        		+ "\nmodifiedBy2 = " + p2.getModifiedBy()
+        		+ "\nmodifiedDate2 = " + p2.getModifiedDate()
+        		+ "\ndeleted2 = " + p2.isDeleted());
+
+        //Confirm that the retrieved policy object is the same as the persisted object
+        assertSame(p1,p2);
+        
+        //Perform configurationData selects
+        Query query2 = em.createQuery("Select c from ConfigurationDataEntity c where c.configurationDataId=:cid");
+        
+        query2.setParameter("cid", c1.getConfigurationDataId());
+        
+        //Get the database version of the Configuration Data
+		resultList = query2.getResultList();
+        ConfigurationDataEntity c2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            c2 = (ConfigurationDataEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No ConfigurationDataEntity DB entry found");
+        }
+        
+        logger.debug("\n\n********PolicyEntityTest: Configuration object after retrieving from DB BEFORE assigning to policy*********"
+        		+ "\nconfigurationDataId2 = " + c2.getConfigurationDataId()
+        		+ "\nversion2 = " + c2.getVersion()
+        		+ "\nconfigType2 = " + c2.getConfigType()
+        		+ "\nconfigBody2 = " + c2.getConfigBody()
+        		+ "\ncreatedBy2 = " + c2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + c2.getCreatedDate()
+        		+ "\ndescription2 = " + c2.getDescription()
+        		+ "\nmodifiedBy2 = " + c2.getModifiedBy()
+        		+ "\nmodifiedDate2 = " + c2.getModifiedDate()
+        		+ "\ndeleted2 = " + c2.isDeleted());
+        
+        //Confirm the retrieved ConfigurationDataEntity object is the same as the persisted
+        assertSame(c1,c2);
+        
+        //Now assign the configurationData to the policy 
+        p1.setConfigurationData(c1);
+        
+        //Perform actionBody selects
+        Query querya2 = em.createQuery("Select a from ActionBodyEntity a where a.actionBodyId=:aid");
+        
+        querya2.setParameter("aid", a1.getActionBodyId());
+        
+        //Get the database version of the Action Body
+		resultList = querya2.getResultList();
+        ActionBodyEntity a2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            a2 = (ActionBodyEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No ActionBodyEntity DB entry found");
+        }
+        
+        
+        logger.debug("\n\n********PolicyEntityTest: Local Action Body object after retrieving from DB BEFORE assigning to policy *********"
+        		+ "\nactionBodyId2 = " + a2.getActionBodyId()
+        		+ "\nactionBodyVersion2 = " + a2.getVersion()
+        		+ "\nactionBody2 = " + a2.getActionBody()
+        		+ "\nactionBodyCeatedBy2 = " + a2.getCreatedBy()
+        		+ "\nactionBodyCreatedDate2 = " + a2.getCreatedDate()
+        		+ "\nactionBodyModifiedBy2 = " + a2.getModifiedBy()
+        		+ "\nactionBodyModifiedDate2 = " + a2.getModifiedDate()
+        		+ "\nactionBodyDeleted2 = " + a2.isDeleted());        
+
+        
+        //Confirm the retrieved ActionBodyEntity object is the same as the persisted
+        assertSame(a1,a2);
+        
+        //Now assign the ActionBodyEntity to the policy 
+        p1.setActionBodyEntity(a1);
+
+        em.flush();
+        
+        //Let's retrieve the policy, configurationData and actionBody from the DB and look at them
+        //Here is the policy object
+        resultList = query.getResultList();
+        p2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            p2 = (PolicyEntity) resultList.get(0);
+        }else{
+        	fail("PolicyEntityTest: No PolicyEntity DB entry found");
+        }
+        
+        logger.debug("\n\n********PolicyEntityTest: PolicyEntity object after retrieving from DB AFTER assigning configurationData*********"
+        		+ "\npolicyId2 = " + p2.getPolicyId()
+        		+ "\npolicyName2 = " + p2.getPolicyName()
+        		+ "\nversion2 = " + p2.getVersion()
+        		+ "\npolicyData2 = " + p2.getPolicyData()
+        		+ "\nconfigurationData2 = " + (p2.getConfigurationData()!=null ? "configurationDataId = " + p2.getConfigurationData().getConfigurationDataId() : "configurationData is null")
+        		+ "\nactionBody2 = " + (p2.getActionBodyEntity()!=null ? "actionBodyId = " + p2.getActionBodyEntity().getActionBodyId() : "actionBody is null")
+        		+ "\nscope2 = " + p2.getScope()
+        		+ "\ncreatedBy2 = " + p2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + p2.getCreatedDate()
+        		+ "\ndescription2 = " + p2.getDescription()
+        		+ "\nmodifiedBy2 = " + p2.getModifiedBy()
+        		+ "\nmodifiedDate2 = " + p2.getModifiedDate()
+        		+ "\ndeleted2 = " + p2.isDeleted());
+
+        //And now the ConfigurationDataEntity object
+		resultList = query2.getResultList();
+        c2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            c2 = (ConfigurationDataEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No ConfigurationDataEntity DB entry found");
+        }
+        
+        logger.debug("\n\n********PolicyEntityTest: Configuration object after retrieving from DB AFTER assigning to policy*********"
+        		+ "\nconfigurationDataId2 = " + c2.getConfigurationDataId()
+        		+ "\nversion2 = " + c2.getVersion()
+        		+ "\nconfigType2 = " + c2.getConfigType()
+        		+ "\nconfigBody2 = " + c2.getConfigBody()
+        		+ "\ncreatedBy2 = " + c2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + c2.getCreatedDate()
+        		+ "\ndescription2 = " + c2.getDescription()
+        		+ "\nmodifiedBy = " + c2.getModifiedBy()
+        		+ "\nmodifiedDate = " + c2.getModifiedDate()
+        		+ "\ndeleted2 = " + c2.isDeleted());
+        
+        
+        //Get the database version of the Action Body
+		resultList = querya2.getResultList();
+        a2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            a2 = (ActionBodyEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No ActionBodyEntity DB entry found");
+        }
+        
+        
+        logger.debug("\n\n********PolicyEntityTest: Local Action Body object after retrieving from DB AFTER assigning to policy *********"
+        		+ "\nactionBodyId2 = " + a2.getActionBodyId()
+        		+ "\nactionBodyVersion2 = " + a2.getVersion()
+        		+ "\nactionBody2 = " + a2.getActionBody()
+        		+ "\nactionBodyCeatedBy2 = " + a2.getCreatedBy()
+        		+ "\nactionBodyCreatedDate2 = " + a2.getCreatedDate()
+        		+ "\nactionBodyModifiedBy2 = " + a2.getModifiedBy()
+        		+ "\nactionBodyModifiedDate2 = " + a2.getModifiedDate()
+        		+ "\nactionBodyDeleted2 = " + a2.isDeleted());        
+
+        
+        //****Now lets see if the orphanRemoval=true does anything useful***
+        //Remove the configurationData from the policy relationship
+        
+        p1.setConfigurationData(null);
+        
+        p1.setActionBodyEntity(null);
+        
+        //flush the update to the DB
+        em.flush();
+        
+        //Attempt to retrieve the configuration data object from the db. It should not be there
+        //Reusing the previous query
+		resultList = query2.getResultList();
+        c2 = null;
+        if(resultList.isEmpty()){
+        	logger.debug("\n\n********PolicyEntityTest: orphanRemoval=true******"
+        			+ "\n Success!! No ConfigurationDataEntity DB entry found");
+            
+        }else{
+        	c2 = (ConfigurationDataEntity) resultList.get(0);
+        	fail("\nPolicyEntityTest: ConfigurationDataEntity DB entry found - and none should exist"
+        			+ "\nconfigurationDataId = " + c2.getConfigurationDataId());
+        }
+        
+        //Attempt to retrieve the actionBody data object from the db. It should not be there
+        //Reusing the previous query
+		resultList = querya2.getResultList();
+        a2 = null;
+        if(resultList.isEmpty()){
+        	logger.debug("\n\n********PolicyEntityTest: orphanRemoval=true******"
+        			+ "\n Success!! No ActionBodyEntity DB entry found");
+            
+        }else{
+        	a2 = (ActionBodyEntity) resultList.get(0);
+        	fail("\nPolicyEntityTest: ActionBodyEntity DB entry found - and none should exist"
+        			+ "\nactionBodyId = " + a2.getActionBodyId());
+        }
+        
+        //Now lets put the configurationData and actionBody back into the policy object and see what appears
+        //in the DB after a flush
+        
+        //put c1 back into the persistence context since the orphanRemoval removed it.
+        em.persist(c1);
+        p1.setConfigurationData(c1);
+        
+        em.persist(a1);
+        p1.setActionBodyEntity(a1);
+        
+        em.flush();
+        
+        //retrieve the policy object
+		resultList = query.getResultList();
+        p2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            p2 = (PolicyEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest: No PolicyEntity DB entry found");
+        }
+        
+        //output what we policy object found
+        logger.debug("\n\n********PolicyEntityTest: PolicyEntity object after again adding ConfigurationDataEntity and retrieving from DB*********"
+        		+ "\npolicyId2 = " + p2.getPolicyId()
+        		+ "\npolicyName2 = " + p2.getPolicyName()
+        		+ "\nversion2 = " + p2.getVersion()
+        		+ "\npolicyData2 = " + p2.getPolicyData()
+        		+ "\nconfigurationData2 = " + (p2.getConfigurationData()!=null ? "configurationDataId = " + p2.getConfigurationData().getConfigurationDataId() : "configurationData is null")
+        		+ "\nactionBody2 = " + (p2.getActionBodyEntity()!=null ? "actionBodyId = " + p2.getActionBodyEntity().getActionBodyId() : "actionBody is null")
+        		+  "\nscope2 = " + p2.getScope()
+        		+ "\ncreatedBy2 = " + p2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + p2.getCreatedDate()
+        		+ "\ndescription2 = " + p2.getDescription()
+        		+ "\nmodifiedBy2 = " + p2.getModifiedBy()
+        		+ "\nmodifiedDate2 = " + p2.getModifiedDate()
+        		+ "\ndeleted2 = " + p2.isDeleted());
+
+
+        //now lets see if it put the configurationData c1 back into the table
+		resultList = query2.getResultList();
+        c2 = null;
+        if(!resultList.isEmpty()){
+            // ignores multiple results
+            c2 = (ConfigurationDataEntity) resultList.get(0);
+        }else{
+        	fail("\nPolicyEntityTest - Check re-entry of configurationData into DB"
+        			+ "No ConfigurationDataEntity DB entry found");
+        }
+        
+        //output what configurationData object we found
+        logger.debug("\n\n********PolicyEntityTest: Configuration object after re-enter into policy object and retrieving from DB *********"
+        		+ "\nconfigurationDataId2 = " + c2.getConfigurationDataId()
+        		+ "\nversion2 = " + c2.getVersion()
+        		+ "\nconfigType2 = " + c2.getConfigType()
+        		+ "\nconfigBody2 = " + c2.getConfigBody()
+        		+ "\ncreatedBy2 = " + c2.getCreatedBy()
+        		+ "\ncreatedDate2 = " + c2.getCreatedDate()
+        		+ "\ndescription2 = " + c2.getDescription()
+        		+ "\nmodifiedBy = " + c2.getModifiedBy()
+        		+ "\nmodifiedDate = " + c2.getModifiedDate()
+        		+ "\ndeleted2 = " + c2.isDeleted());
+
+        //now lets see if it put the actionBody a1 back into the table
+        //Get the database version of the Action Body
+ 		resultList = querya2.getResultList();
+         a2 = null;
+         if(!resultList.isEmpty()){
+             // ignores multiple results
+             a2 = (ActionBodyEntity) resultList.get(0);
+         }else{
+         	fail("\nPolicyEntityTest - Check re-entry of actionBody into DB"
+        			+ "No ActionBodyEntity DB entry found");
+         }
+         
+         logger.debug("\n\n********PolicyEntityTest: Local Action Body object after re-enter into policy object and retrieving from DB *********"
+         		+ "\nactionBodyId2 = " + a2.getActionBodyId()
+         		+ "\nactionBodyVersion2 = " + a2.getVersion()
+         		+ "\nactionBody2 = " + a2.getActionBody()
+         		+ "\nactionBodyCeatedBy2 = " + a2.getCreatedBy()
+         		+ "\nactionBodyCreatedDate2 = " + a2.getCreatedDate()
+         		+ "\nactionBodyModifiedBy2 = " + a2.getModifiedBy()
+         		+ "\nactionBodyModifiedDate2 = " + a2.getModifiedDate()
+         		+ "\nactionBodyDeleted2 = " + a2.isDeleted());        
+
+        //I want to save all the above in the DB
+        try{
+        	et.commit();
+        	logger.debug("\n\n***********PolicyEntityTest: et.commit Succeeded********");
+        }catch(Exception e){
+        	logger.debug("\n\n***********PolicyEntityTest: et.commit Failed********"
+        			+ "\nTRANSACTION ROLLBACK "
+        			+ "\n   with exception: " + e);
+        }
+
+        // Start a new transaction
+        EntityTransaction et2 = em.getTransaction();
+
+        et2.begin();
+        
+        //Let's test if the PolicyEntity uniqueConstraint for policyName and scopeId hold
+        PolicyEntity p3 = new PolicyEntity();
+        em.persist(p3);
+
+    	
+    	//first let's assure that you can save with the same name but a different scope
+    	p3.setPolicyName(p1.getPolicyName());
+    	p3.setScope("mckiou.kevin.kory");
+    	em.flush();
+    	logger.debug("\n\n***********PolicyEntityTest: PolicyEntity Unique test for policyName and scope********"
+    			+ "\nSuccess!  PolicyEntity uniqueness constraint allowed "
+    			+ "\n   policyId1 " + p1.getPolicyId() 
+    			+ "\n   policyName1 " + p1.getPolicyName() 
+    			+ "\n   scope1 = " + p1.getScope()
+    			+ "\n   policyId3 " + p3.getPolicyId() 
+    			+ "\n   policyName3 " + p3.getPolicyName() 
+    			+ "\n   scope3 = " + p3.getScope());
+
+    	//Assert that the policyIds are NOT the same to show that the automatic sequencing is working
+    	assert(p1.getPolicyId() != p3.getPolicyId());
+
+    	try{
+        	//Now set the scope the same to verify the uniqueness constraint will be enforced
+        	p3.setScope(p1.getScope());
+        	
+        	em.flush();
+        	fail("\n\n***********PolicyEntityTest: PolicyEntity Unique test for policyName and scope********"
+        			+ "\nFailed! PolicyEntity Uniqueness constraint FAILED and DID allow "
+        			+ "\n   policyId1 " + p1.getPolicyId() 
+        			+ "\n   policyName1 " + p1.getPolicyName() 
+        			+ "\n   scope1 = " + p1.getScope()
+        			+ "\n   policyId3 " + p3.getPolicyId() 
+        			+ "\n   policyName3 " + p3.getPolicyName() 
+        			+ "\n   scope3 = " + p3.getScope());;
+        }
+        catch(Exception e){
+        	//Success
+        	logger.debug("\n\n***********PolicyEntityTest: PolicyEntity Unique test for policyName and scope********"
+        			+ "\nSuccess!  PolicyEntity Uniqueness constraint SUCCEEDED and did NOT allow "
+        			+ "\n   policyId1 " + p1.getPolicyId() 
+        			+ "\n   policyName1 " + p1.getPolicyName() 
+        			+ "\n   scope1 = " + p1.getScope()
+        			+ "\n   policyId3 " + p3.getPolicyId() 
+        			+ "\n   policyName3 " + p3.getPolicyName() 
+        			+ "\n   scope3 = " + p3.getScope()
+        			+ "\n   with excpetion: " + e);
+        }
+
+    	
+        try{
+        	et2.commit();
+        	logger.debug("\n\n***********PolicyEntityTest: et2.commit Succeeded********");
+        }catch(Exception e){
+        	logger.debug("\n\n***********PolicyEntityTest: et2.commit Failed********"
+        			+ "\nTRANSACTION ROLLBACK "
+        			+ "\n   with exception: " + e);
+        }
+        
+        //****************Test the PolicyDBDaoEntity************************
+        
+        //Create a transaction
+        EntityTransaction et3 = em.getTransaction();
+
+        et3.begin();
+        
+        //create one 
+        PolicyDBDaoEntity pe1 = new PolicyDBDaoEntity();
+        em.persist(pe1);
+        
+        pe1.setDescription("This is pe1");
+        
+        pe1.setPolicyDBDaoUrl("http://10.11.12.13:2345");
+        
+        //push it to the DB
+        em.flush();
+        
+        //create another
+        PolicyDBDaoEntity pe2 = new PolicyDBDaoEntity();
+        em.persist(pe2);
+        
+        pe2.setDescription("This is pe2");
+        
+        pe2.setPolicyDBDaoUrl("http://10.11.12.13:2345");
+        
+        //Print them to the log before flushing
+        logger.debug("\n\n***********PolicyEntityTest: PolicyDBDaoEntity objects before flush********"
+    			+ "\n   policyDBDaoUrl-1 = " + pe1.getPolicyDBDaoUrl()
+    			+ "\n   description-1 = " + pe1.getDescription()
+    			+ "\n   createdDate-1 = " + pe1.getCreatedDate()
+    			+ "\n   modifiedDate-1 " + pe1.getModifiedDate()
+    			+ "\n*****************************************"
+    			+ "\n   policyDBDaoUrl-2 = " + pe2.getPolicyDBDaoUrl()
+    			+ "\n   description-2 = " + pe2.getDescription()
+    			+ "\n   createdDate-2 = " + pe2.getCreatedDate()
+    			+ "\n   modifiedDate-2 " + pe2.getModifiedDate()
+        		);
+        
+        //push it to the DB
+        em.flush();
+        
+        //Now let's retrieve them from the DB using the named query
+        
+		resultList = em.createNamedQuery("PolicyDBDaoEntity.findAll").getResultList();
+
+		PolicyDBDaoEntity pex = null;
+		PolicyDBDaoEntity pey = null;
+		
+        if(!resultList.isEmpty()){
+        	if (resultList.size() != 2){
+        		fail("\nPolicyEntityTest: Number of PolicyDBDaoEntity entries = " + resultList.size() + " instead of 2");
+        	}
+        	for(Object policyDBDaoEntity: resultList){
+        		PolicyDBDaoEntity pdbdao = (PolicyDBDaoEntity)policyDBDaoEntity;
+        		if(pdbdao.getPolicyDBDaoUrl().equals("http://10.11.12.13:2345")){
+        			pex = pdbdao;
+        		}else if(pdbdao.getPolicyDBDaoUrl().equals("http://10.11.12.13:2345")){
+        			pey = pdbdao;
+        		}
+        	}
+        	
+            //Print them to the log before flushing
+            logger.debug("\n\n***********PolicyEntityTest: PolicyDBDaoEntity objects retrieved from DB********"
+        			+ "\n   policyDBDaoUrl-x = " + pex.getPolicyDBDaoUrl()
+        			+ "\n   description-x = " + pex.getDescription()
+        			+ "\n   createdDate-x = " + pex.getCreatedDate()
+        			+ "\n   modifiedDate-x " + pex.getModifiedDate()
+        			+ "\n*****************************************"
+        			+ "\n   policyDBDaoUrl-y = " + pey.getPolicyDBDaoUrl()
+        			+ "\n   description-y = " + pey.getDescription()
+        			+ "\n   createdDate-y = " + pey.getCreatedDate()
+        			+ "\n   modifiedDate-y " + pey.getModifiedDate()
+            		);
+        	//Verify the retrieved objects are the same as the ones we stored in the DB
+        	if(pex.getPolicyDBDaoUrl().equals("http://10.11.12.13:2345")){
+        		assertSame(pe1,pex);
+        		assertSame(pe2,pey);
+        	}else{
+        		assertSame(pe2,pex);
+        		assertSame(pe1,pey);
+        	}
+            
+        }else{
+        	fail("\nPolicyEntityTest: No PolicyDBDaoEntity DB entry found");
+        }
+       
+        //Now let's see if we can do an update on the PolicyDBDaoEntity which we retrieved.
+        //em.persist(pex);
+        pex.setDescription("This is pex");
+        em.flush();
+        
+        //retrieve it
+        Query createPolicyQuery = em.createQuery("SELECT p FROM PolicyDBDaoEntity p WHERE p.description=:desc");
+		resultList = createPolicyQuery.setParameter("desc", "This is pex").getResultList();
+		
+		PolicyDBDaoEntity pez = null;
+        
+        if(!resultList.isEmpty()){
+        	if (resultList.size() != 1){
+        		fail("\nPolicyEntityTest: Update Test - Number of PolicyDBDaoEntity entries = " + resultList.size() + " instead of 1");
+        	}
+        	pez = (PolicyDBDaoEntity) resultList.get(0);
+        	
+            //Print them to the log before flushing
+            logger.debug("\n\n***********PolicyEntityTest: Update Test - PolicyDBDaoEntity objects retrieved from DB********"
+        			+ "\n   policyDBDaoUrl-x = " + pex.getPolicyDBDaoUrl()
+        			+ "\n   description-x = " + pex.getDescription()
+        			+ "\n   createdDate-x = " + pex.getCreatedDate()
+        			+ "\n   modifiedDate-x " + pex.getModifiedDate()
+        			+ "\n*****************************************"
+        			+ "\n   policyDBDaoUrl-z = " + pez.getPolicyDBDaoUrl()
+        			+ "\n   description-z = " + pez.getDescription()
+        			+ "\n   createdDate-z = " + pez.getCreatedDate()
+        			+ "\n   modifiedDate-z " + pez.getModifiedDate()
+            		);
+        	//Verify the retrieved objects are the same as the ones we stored in the DB
+       		assertSame(pex,pez);
+        }else{
+        	fail("\nPolicyEntityTest: Update Test - No PolicyDBDaoEntity DB updated entry found");
+        }
+        
+        //Clean up the DB
+        em.createQuery("DELETE FROM PolicyDBDaoEntity").executeUpdate();
+        em.createQuery("DELETE FROM PolicyEntity").executeUpdate();
+        em.createQuery("DELETE FROM ConfigurationDataEntity").executeUpdate();
+        em.createQuery("DELETE FROM ActionBodyEntity").executeUpdate();
+        
+        //Wrap up the transaction
+        try{
+        	et3.commit();
+        	logger.debug("\n\n***********PolicyEntityTest: et3.commit Succeeded********");
+        }catch(Exception e){
+        	logger.debug("\n\n***********PolicyEntityTest: et3.commit Failed********"
+        			+ "\nTRANSACTION ROLLBACK "
+        			+ "\n   with exception: " + e);
+        }
+         
+        
+        //Tidy up
+        em.close();
+    }
+    
+}
diff --git a/ECOMP-PAP-REST/test.properties b/ECOMP-PAP-REST/test.properties
new file mode 100644
index 0000000..a459f3e
--- /dev/null
+++ b/ECOMP-PAP-REST/test.properties
@@ -0,0 +1,22 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+PDP_URL=http://localhost:9091/pdp/, testpdp, alpha456
+#PAP_URL=http://localhost:8070/pap/, testpap, alpha123
diff --git a/ECOMP-PAP-REST/xacml.pap.properties b/ECOMP-PAP-REST/xacml.pap.properties
new file mode 100644
index 0000000..91e393d
--- /dev/null
+++ b/ECOMP-PAP-REST/xacml.pap.properties
@@ -0,0 +1,155 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+#
+# This is our factory that will create our engine
+#
+xacml.PAP.papEngineFactory=org.openecomp.policy.xacml.std.pap.StdEngineFactory
+
+#
+# Where we store our PAP PDP Group/Node information
+#
+xacml.pap.pdps=pdps
+#
+# Need the PAP's url (how PDPs will reach it) configured here
+# because we need it to generate the URLs of the Policy Files
+# sent to the PDPs in the configuration when the PAP is first brought up.
+# (In other cases, such as the PDP calling the PAP, we could generate this URL, 
+# but for startup there is no other way to get it.)
+#
+#
+
+xacml.rest.pap.url=http://localhost:8070/pap/
+
+#
+# Upon startup, have the PAP servlet send latest configuration information to all
+# the PDP nodes it knows about.
+#
+xacml.rest.pap.initiate.pdp=true
+#
+# Heartbeat from PAP to PDPs
+#
+# How much time (in milliseconds) between heartbeats
+# (i.e. the time between completing the heartbeat with all PDPs and starting the next cycle)
+#
+xacml.rest.pap.heartbeat.interval=100000
+#
+# Heartbeat connection timeout (in milliseconds)
+#
+xacml.rest.pap.heartbeat.timeout=100000
+
+################################################################################################
+# Adding properties for getting properties previously used by PAP-ADMIN for creating Policies
+# THis is part of the Policy Creation API project
+################################################################################################
+
+# Set your domain here:
+xacml.rest.pap.domain=com
+
+# Location where all the user workspaces are located.
+xacml.rest.pap.workspace=workspace
+
+# Location where the GIT repository is located
+xacml.rest.pap.repository=repository
+
+# new Property Please mention your PAP-REST webapps Location here. 
+xacml.rest.config.webapps=C:\\Second Tomcat\\apache-tomcat-8.0.23\\webapps\\ConfigPAP\\
+
+#Turn the audit on to synchronize the DB/file system
+#xacml.rest.pap.run.audit.flag=true
+#Turn the audit off to not synchronize the DB/file system
+#xacml.rest.pap.run.audit.flag=false
+xacml.rest.pap.run.audit.flag=false
+
+#Audit will synchronize the file system to match the contents of the DB
+#xacml.rest.pap.filesystem.audit=true
+#Audit will synchronize the DB to match the contents of the file system 
+#xacml.rest.pap.filesystem.audit=false
+xacml.rest.pap.filesystem.audit=false
+xacm.xcor.required.pattern=1,1
+# id
+xacml.rest.pap.userid=testpap
+# pass
+xacml.rest.pap.password=alpha123
+# pdps file
+xacml.rest.pdp.idfile=test.properties
+
+
+#properties for MySql xacml database:  PLEASE DO NOT REMOVE... NEEDED FOR APIs
+javax.persistence.jdbc.driver=com.mysql.jdbc.Driver
+javax.persistence.jdbc.url=jdbc:mysql://localhost:3306/ecomp_sdk
+javax.persistence.jdbc.user=root
+javax.persistence.jdbc.password=
+
+#Time in ms which a Policy DB transaction will wait to get the transaction lock object
+xacml.rest.pap.transaction.waitms=500000
+	
+#Policy DB transaction timeout in ms after it has obtained the transaction lock object
+xacml.rest.pap.transaction.timeoutms=500000
+
+#Policy Audit timeout in ms after it has obtained the transaction lock object
+xacml.rest.pap.audit.timeoutms=500000
+
+#controls how long the pap will wait before giving up when sending notifications to other paps
+xacml.rest.pap.notify.timeoutms=10000
+
+#AutoPush Policy Flag
+xacml.rest.pap.autopush.flag=false
+#AutoPush Policy 
+xacml.rest.pap.autopush.file=autopush.properties
+
+#***Properties for IntegrityMonitor integration defined in XACMLRestProperties.java***
+
+#The name of the PAP.  Must be unique across the system
+xacml.rest.pap.resource.name=site_1.pap_1
+
+#***Properties for IntegrityMonitor integration defined in IntegrityMonitorProperties.java***
+
+#Interval between forward progress counter updates in seconds
+fp_monitor_interval=30
+
+#Number of forward progress counter failures before failover
+failed_counter_threshold=3
+
+#Interval in seconds between test transactions if there is no other traffic
+test_trans_interval=10
+
+#Interval in seconds between updates of the forward progress counter in the DB
+write_fpc_interval=5
+
+#Name of the site 
+site_name=site_1
+
+#Node type. Can take values of: pdp-xacml, pdp-drools, pap, pap-admin, logparser, brms-gateway, 
+#astra-gateway, elk-server and pypdp
+node_type=pap
+
+#Dependency groups are groups of resources upon which a node operational state is dependent upon (dependency_groups). 
+#Each group is a comma-separated list of resource names and groups are separated by a semicolon. A group may contain
+#one or more members.
+dependency_groups=site_1.logparser_1;site_1.adminconsole_1;site_1.elk_1
+
+# The (optional) period of time in seconds between executions of the integrity audit.
+# Value < 0 : Audit does not run (default value if property is not present = -1)
+# Value = 0 : Audit runs continuously
+# Value > 0 : The period of time in seconds between execution of the audit on a particular node
+integrity_audit_period_seconds=-1
+
+ENVIRONMENT=DEVL
diff --git a/ECOMP-PAP-REST/xacml.pap.test.properties b/ECOMP-PAP-REST/xacml.pap.test.properties
new file mode 100644
index 0000000..78a2c40
--- /dev/null
+++ b/ECOMP-PAP-REST/xacml.pap.test.properties
@@ -0,0 +1,151 @@
+###
+# ============LICENSE_START=======================================================
+# ECOMP-PAP-REST
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+#
+# This is our factory that will create our engine
+#
+xacml.PAP.papEngineFactory=org.openecomp.policy.xacml.std.pap.StdEngineFactory
+
+#
+# Where we store our PAP PDP Group/Node information
+#
+xacml.pap.pdps=pdps
+#
+# Need the PAP's url (how PDPs will reach it) configured here
+# because we need it to generate the URLs of the Policy Files
+# sent to the PDPs in the configuration when the PAP is first brought up.
+# (In other cases, such as the PDP calling the PAP, we could generate this URL, 
+# but for startup there is no other way to get it.)
+#
+#
+
+xacml.rest.pap.url=http://localhost:8070/pap/
+
+#
+# Upon startup, have the PAP servlet send latest configuration information to all
+# the PDP nodes it knows about.
+#
+xacml.rest.pap.initiate.pdp=true
+#
+# Heartbeat from PAP to PDPs
+#
+# How much time (in milliseconds) between heartbeats
+# (i.e. the time between completing the heartbeat with all PDPs and starting the next cycle)
+#
+xacml.rest.pap.heartbeat.interval=10000
+#
+# Heartbeat connection timeout (in milliseconds)
+#
+xacml.rest.pap.heartbeat.timeout=10000
+
+################################################################################################
+# Adding properties for getting properties previously used by PAP-ADMIN for creating Policies
+# THis is part of the Policy Creation API project
+################################################################################################
+
+# Set your domain here:
+xacml.rest.pap.domain=com
+
+# Location where all the user workspaces are located.
+xacml.rest.pap.workspace=workspace
+
+# Location where the GIT repository is located
+xacml.rest.pap.repository=repository
+
+# new Property Please mention your PAP-REST webapps Location here. 
+xacml.rest.config.webapps=C:\\Second Tomcat\\apache-tomcat-8.0.23\\webapps\\ConfigPAP\\
+
+#Turn the audit on to synchronize the DB/file system
+#xacml.rest.pap.run.audit.flag=true
+#Turn the audit off to not synchronize the DB/file system
+#xacml.rest.pap.run.audit.flag=false
+xacml.rest.pap.run.audit.flag=false
+
+#Audit will synchronize the file system to match the contents of the DB
+#xacml.rest.pap.filesystem.audit=true
+#Audit will synchronize the DB to match the contents of the file system 
+#xacml.rest.pap.filesystem.audit=false
+xacml.rest.pap.filesystem.audit=false
+
+# id
+xacml.rest.pap.userid=testpap
+# pass
+xacml.rest.pap.password=alpha123
+# pdps file
+xacml.rest.pdp.idfile=test.properties
+
+#Properties for db access
+javax.persistence.jdbc.driver=org.h2.Driver
+#javax.persistence.jdbc.url=jdbc:h2:tcp://localhost/xacmlpolicy
+javax.persistence.jdbc.url=jdbc:h2:file:./sql/xacmlTest
+javax.persistence.jdbc.user=sa
+javax.persistence.jdbc.password=
+
+#Time in ms which a Policy DB transaction will wait to get the transaction lock object
+xacml.rest.pap.transaction.waitms=1000
+	
+#Policy DB transaction timeout in ms after it has obtained the transaction lock object
+xacml.rest.pap.transaction.timeoutms=500
+	
+#Policy Audit timeout in ms after it has obtained the transaction lock object
+xacml.rest.pap.audit.timeoutms=5000
+
+#***Properties for IntegrityMonitor integration defined in IntegrityMonitorProperties.java***
+
+#JMX URL for the PAP-REST.  Need to update to real IP and port
+xacml.rest.pap.jmx.url=service:jmx:rmi:///jndi/rmi://localhost:9990/jmxrmi
+
+#The name of the PAP.  Must be unique across the system
+xacml.rest.pap.resource.name=site_1.pap_1
+
+#***Properties for IntegrityMonitor integration defined in IntegrityMonitorProperties.java***
+
+#Interval between forward progress counter updates in seconds
+fp_monitor_interval=30
+
+#Number of forward progress counter failures before failover
+failed_counter_threshold=3
+
+#Interval in seconds between test transactions if there is no other traffic
+test_trans_interval=10
+
+#Interval in seconds between updates of the forward progress counter in the DB
+write_fpc_interval=5
+
+#Name of the site
+site_name=site_1
+
+#Node type. Can take values of: pdp-xacml, pdp-drools, pap, pap-admin, logparser, brms-gateway, 
+#astra-gateway, elk-server and pypdp
+node_type=pap
+ 
+#Dependency groups are groups of resources upon which a node operational state is dependent upon (dependency_groups). 
+#Each group is a comma-separated list of resource names and groups are separated by a semicolon. A group may contain
+#one or more members.
+dependency_groups=site_1.logparser_1;site_1.adminconsole_1;site_1.elk_1
+
+# The (optional) period of time in seconds between executions of the integrity audit.
+# Value < 0 : Audit does not run (default value if property is not present = -1)
+# Value = 0 : Audit runs continuously
+# Value > 0 : The period of time in seconds between execution of the audit on a particular node
+#integrity_audit_period_seconds=-1
+integrity_audit_period_seconds=0
+
+ENVIRONMENT=DEVL