diff --git a/openaz-xacml-pap-admin/pom.xml b/openaz-xacml-pap-admin/pom.xml
index c494f77..b027045 100644
--- a/openaz-xacml-pap-admin/pom.xml
+++ b/openaz-xacml-pap-admin/pom.xml
@@ -23,284 +23,4 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <artifactId>openaz-xacml-pap-admin</artifactId>
-    <packaging>war</packaging>
-
-    <repositories>
-        <repository>
-            <id>vaadin-addons</id>
-            <url>http://maven.vaadin.com/vaadin-addons</url>
-        </repository>
-        <repository>
-            <id>vaadin-snapshots</id>
-            <url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </repository>
-    </repositories>
-
-    <!--
-    <pluginRepositories>
-        <pluginRepository>
-            <id>vaadin-snapshots</id>
-            <url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-            </snapshots>
-        </pluginRepository>
-    </pluginRepositories>
-    -->
-
-    <properties>
-        <vaadin.version>7.1.11</vaadin.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.openaz</groupId>
-            <artifactId>openaz-xacml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.openaz</groupId>
-            <artifactId>openaz-xacml-pdp</artifactId>
-        </dependency>
-
-
-        <!-- The core server part of Vaadin -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-server</artifactId>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <!-- Vaadin themes -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-themes</artifactId>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <!-- Push support -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-push</artifactId>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <!--
-            Use the appropriate javax.servlet version for your
-            version of Jetty and other considerations.
-
-            Jetty 6 - Servlet API 2.4
-
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-                <version>2.4</version>
-                <scope>provided</scope>
-            </dependency>
-
-            Jetty 7 - Servlet API 2.5 / Standard Location
-
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-                <version>2.5</version>
-                <scope>provided</scope>
-            </dependency>
-
-            Jetty 7 - Servlet API 2.5 / OSGi bundle ready
-
-            <dependency>
-                <groupId>org.eclipse.jetty.orbit</groupId>
-                <artifactId>javax.servlet</artifactId>
-                <version>2.5.0.v201103041518</version>
-                <scope>provided</scope>
-            </dependency>
-
-            Jetty 8 - Servlet API 3.0 / Standard Location / OSGi bundle ready
-
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>3.0.1</version>
-                <scope>provided</scope>
-            </dependency>
-
-            Jetty 9 - Servlet API 3.1 / Standard Location / OSGi bundle ready
-
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>javax.servlet-api</artifactId>
-                <version>3.1.0</version>
-                <scope>provided</scope>
-            </dependency>
-        -->
-
-        <!-- Jetty 8 - Servlet API 3.0 / Standard Location / OSGi bundle ready -->
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.0.1</version>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- Precompiled DefaultWidgetSet -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-client-compiled</artifactId>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <!-- Vaadin client side, needed for widget set compilation -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-client</artifactId>
-            <scope>provided</scope>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <!-- Compiler for custom widget sets. Should not be deployed -->
-        <dependency>
-            <groupId>com.vaadin</groupId>
-            <artifactId>vaadin-client-compiler</artifactId>
-            <scope>provided</scope>
-            <version>${vaadin.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.vaadin.addon</groupId>
-            <artifactId>jpacontainer</artifactId>
-            <version>3.1.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.vaadin.addon</groupId>
-            <artifactId>confirmdialog</artifactId>
-            <version>2.0.5</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.openaz</groupId>
-            <artifactId>openaz-xacml</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.openaz</groupId>
-            <artifactId>openaz-xacml-rest</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>log4j</groupId>
-            <artifactId>log4j</artifactId>
-            <version>1.2.17</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.eclipse.jetty</groupId>
-            <artifactId>jetty-continuation</artifactId>
-            <version>9.0.0.v20130308</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>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-            <version>1.8</version>
-        </dependency>
-        <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <version>2.3.0-rc1</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>14.0.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jgit</groupId>
-            <artifactId>org.eclipse.jgit</artifactId>
-            <version>3.2.0.201312181205-r</version>
-        </dependency>
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-            <version>1.3.174</version>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-            <version>5.1.30</version>
-        </dependency>
-        <dependency>
-            <groupId>postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>9.1-901.jdbc4</version>
-        </dependency>
-        <dependency>
-            <groupId>org.hsqldb</groupId>
-            <artifactId>hsqldb</artifactId>
-            <version>2.3.2</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>4.11</version>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.persistence</groupId>
-            <artifactId>eclipselink</artifactId>
-            <version>2.5.2</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>            
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-war-plugin</artifactId>
-                    <configuration>
-                        <webXml>src\main\webapp\WEB-INF\web.xml</webXml>        
-                        <resource>
-                            <directory>src/META-INF</directory>
-                            <targetPath>META-INF</targetPath>
-                            <includes>
-                                <include>persistence.xml</include>
-                                <include>data.sql</include>
-                                <include>drop.sql</include>
-                                <include>empty.sql</include>
-                                <include>views.sql</include>
-                            </includes>
-                        </resource>
-                    </configuration>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
 </project>
diff --git a/openaz-xacml-pap-admin/src/META-INF/data.sql b/openaz-xacml-pap-admin/src/META-INF/data.sql
deleted file mode 100644
index a679b4d..0000000
--- a/openaz-xacml-pap-admin/src/META-INF/data.sql
+++ /dev/null
@@ -1,723 +0,0 @@
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (1,'Range','Set a range of min and/or max integer/double values the attribute can be set to during policy creation.');
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (2,'Regular Expression','Define a regular expression the attribute must match against during policy creation.');
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (3,'Enumeration','Enumerate a set of values that the attribute may be set to during policy creation.');
-
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (4,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject','intermediary-subject');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (5,'resource','S','urn:oasis:names:tc:xacml:3.0:attribute-category:resource','resource');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (6,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:codebase','codebase');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (7,'action','S','urn:oasis:names:tc:xacml:3.0:attribute-category:action','action');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (8,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:access-subject','access-subject');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (9,'environment','S','urn:oasis:names:tc:xacml:3.0:attribute-category:environment','environment');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (10,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:requesting-machine','requesting-machine');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (11,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject','recipient-subject');
-
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (12,'S','integer','http://www.w3.org/2001/XMLSchema#integer');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (13,'S','base64Binary','http://www.w3.org/2001/XMLSchema#base64Binary');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (14,'S','x500Name','urn:oasis:names:tc:xacml:1.0:data-type:x500Name');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (15,'S','dayTimeDuration','http://www.w3.org/2001/XMLSchema#dayTimeDuration');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (16,'S','time','http://www.w3.org/2001/XMLSchema#time');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (17,'S','dnsName','urn:oasis:names:tc:xacml:2.0:data-type:dnsName');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (18,'S','boolean','http://www.w3.org/2001/XMLSchema#boolean');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (19,'S','dateTime','http://www.w3.org/2001/XMLSchema#dateTime');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (20,'S','rfc822Name','urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (21,'S','date','http://www.w3.org/2001/XMLSchema#date');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (22,'S','ipAddress','urn:oasis:names:tc:xacml:2.0:data-type:ipAddress');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (23,'S','yearMonthDuration','http://www.w3.org/2001/XMLSchema#yearMonthDuration');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (24,'S','hexBinary','http://www.w3.org/2001/XMLSchema#hexBinary');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (25,'S','double','http://www.w3.org/2001/XMLSchema#double');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (26,'S','string','http://www.w3.org/2001/XMLSchema#string');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (27,'S','anyURI','http://www.w3.org/2001/XMLSchema#anyURI');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (28,'S','xpathExpression','urn:oasis:names:tc:xacml:3.0:data-type:xpathExpression');
-
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (29,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (30,'S','on-permit-apply-second','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (31,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (32,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (33,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (34,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (35,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (36,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (37,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides');
-
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (38,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (39,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (40,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (41,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (42,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (43,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (44,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:only-one-applicable');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (45,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable');
-
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (1,'integer-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (2,'integer-subtract','urn:oasis:names:tc:xacml:1.0:function:integer-subtract',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (3,'double-to-integer','urn:oasis:names:tc:xacml:1.0:function:double-to-integer',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (4,'integer-one-and-only','urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (5,'double-one-and-only','urn:oasis:names:tc:xacml:1.0:function:double-one-and-only',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (6,'string-equal','urn:oasis:names:tc:xacml:1.0:function:string-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (7,'string-equal-ignore-case','urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (8,'string-starts-with','urn:oasis:names:tc:xacml:3.0:function:string-starts-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (9,'string-ends-with','urn:oasis:names:tc:xacml:3.0:function: string-ends-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (10,'string-concatenate','urn:oasis:names:tc:xacml:2.0:function:string-concatenate',26,0,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (11,'boolean-from-string','urn:oasis:names:tc:xacml:3.0:function:boolean-from-string',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (12,'string-from-boolean','urn:oasis:names:tc:xacml:3.0:function:string-from-boolean',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (13,'integer-from-string','urn:oasis:names:tc:xacml:3.0:function:integer-from-string',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (14,'string-from-integer','urn:oasis:names:tc:xacml:3.0:function:string-from-integer',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (15,'double-from-string','urn:oasis:names:tc:xacml:3.0:function:double-from-string',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (16,'string-from-double','urn:oasis:names:tc:xacml:3.0:function:string-from-double',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (17,'time-from-string','urn:oasis:names:tc:xacml:3.0:function:time-from-string',16,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (18,'string-from-time','urn:oasis:names:tc:xacml:3.0:function:string-from-time',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (19,'date-from-string','urn:oasis:names:tc:xacml:3.0:function:date-from-string',21,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (20,'string-from-date','urn:oasis:names:tc:xacml:3.0:function:string-from-date',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (21,'dateTime-from-string','urn:oasis:names:tc:xacml:3.0:function:dateTime-from-string',19,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (22,'string-from-dateTime','urn:oasis:names:tc:xacml:3.0:function:string-from-dateTime',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (23,'anyURI-from-string','urn:oasis:names:tc:xacml:3.0:function:anyURI-from-string',27,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (24,'string-from-anyURI','urn:oasis:names:tc:xacml:3.0:function:string-from-anyURI',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (25,'dayTimeDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-from-string',15,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (26,'string-from-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-dayTimeDuration',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (27,'yearMonthDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-from-string',23,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (28,'string-from-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-yearMonthDuration',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (29,'x500Name-from-string','urn:oasis:names:tc:xacml:3.0:function:x500Name-from-string',14,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (30,'string-from-x500Name','urn:oasis:names:tc:xacml:3.0:function:string-from-x500Name',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (31,'rfc822Name-from-string','urn:oasis:names:tc:xacml:3.0:function:rfc822Name-from-string',20,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (32,'string-from-rfc822Name','urn:oasis:names:tc:xacml:3.0:function:string-from-rfc822Name',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (33,'ipAddress-from-string','urn:oasis:names:tc:xacml:3.0:function:ipAddress-from-string',22,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (34,'string-from-ipAddress','urn:oasis:names:tc:xacml:3.0:function:string-from-ipAddress',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (35,'dnsName-from-string','urn:oasis:names:tc:xacml:3.0:function:dnsName-from-string',17,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (36,'string-from-dnsName','urn:oasis:names:tc:xacml:3.0:function:string-from-dnsName',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (37,'anyURI-starts-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-starts-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (38,'anyURI-ends-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-ends-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (39,'string-contains','urn:oasis:names:tc:xacml:3.0:function:string-contains',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (40,'anyURI-contains','urn:oasis:names:tc:xacml:3.0:function:anyURI-contains',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (41,'string-substring','urn:oasis:names:tc:xacml:3.0:function:string-substring',26,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (42,'anyURI-substring','urn:oasis:names:tc:xacml:3.0:function:anyURI-substring',26,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (43,'boolean-equal','urn:oasis:names:tc:xacml:1.0:function:boolean-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (44,'integer-equal','urn:oasis:names:tc:xacml:1.0:function:integer-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (45,'double-equal','urn:oasis:names:tc:xacml:1.0:function:double-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (46,'date-equal','urn:oasis:names:tc:xacml:1.0:function:date-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (47,'time-equal','urn:oasis:names:tc:xacml:1.0:function:time-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (48,'dateTime-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (49,'dayTimeDuration-equal','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (50,'yearMonthDuration-equal','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (51,'anyURI-equal','urn:oasis:names:tc:xacml:1.0:function:anyURI-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (52,'x500Name-equal','urn:oasis:names:tc:xacml:1.0:function:x500Name-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (53,'rfc822Name-equal','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (54,'hexBinary-equal','urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (55,'base64Binary-equal','urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (56,'integer-add','urn:oasis:names:tc:xacml:1.0:function:integer-add',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (57,'double-add','urn:oasis:names:tc:xacml:1.0:function:double-add',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (58,'double-subtract','urn:oasis:names:tc:xacml:1.0:function:double-subtract',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (59,'integer-multiply','urn:oasis:names:tc:xacml:1.0:function:integer-multiply',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (60,'double-multiply','urn:oasis:names:tc:xacml:1.0:function:double-multiply',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (61,'integer-divide','urn:oasis:names:tc:xacml:1.0:function:integer-divide',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (62,'double-divide','urn:oasis:names:tc:xacml:1.0:function:double-divide',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (63,'integer-mod','urn:oasis:names:tc:xacml:1.0:function:integer-mod',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (64,'integer-abs','urn:oasis:names:tc:xacml:1.0:function:integer-abs',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (65,'double-abs','urn:oasis:names:tc:xacml:1.0:function:double-abs',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (66,'round','urn:oasis:names:tc:xacml:1.0:function:round',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (67,'floor','urn:oasis:names:tc:xacml:1.0:function:floor',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (68,'string-normalize-space','urn:oasis:names:tc:xacml:1.0:function:string-normalize-space',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (69,'string-normalize-to-lower-case','urn:oasis:names:tc:xacml:1.0:function:string-normalize-to-lower-case',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (70,'integer-to-double','urn:oasis:names:tc:xacml:1.0:function:integer-to-double',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (71,'integer-greater-than','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (72,'integer-less-than','urn:oasis:names:tc:xacml:1.0:function:integer-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (73,'integer-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (74,'double-greater-than','urn:oasis:names:tc:xacml:1.0:function:double-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (75,'double-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (76,'double-less-than','urn:oasis:names:tc:xacml:1.0:function:double-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (77,'double-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (78,'dateTime-add-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (79,'dateTime-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (80,'dateTime-subtract-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (81,'dateTime-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (82,'date-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-add-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (83,'date-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-subtract-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (84,'string-greater-than','urn:oasis:names:tc:xacml:1.0:function:string-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (85,'string-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (86,'string-less-than','urn:oasis:names:tc:xacml:1.0:function:string-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (87,'string-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (88,'time-greater-than','urn:oasis:names:tc:xacml:1.0:function:time-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (89,'time-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (90,'time-less-than','urn:oasis:names:tc:xacml:1.0:function:time-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (91,'time-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (92,'time-in-range','urn:oasis:names:tc:xacml:2.0:function:time-in-range',18,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (93,'dateTime-greater-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (94,'dateTime-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (95,'dateTime-less-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (96,'dateTime-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (97,'date-greater-than','urn:oasis:names:tc:xacml:1.0:function:date-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (98,'date-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (99,'date-less-than','urn:oasis:names:tc:xacml:1.0:function:date-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (100,'date-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (101,'string-one-and-only','urn:oasis:names:tc:xacml:1.0:function:string-one-and-only',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (102,'string-bag-size','urn:oasis:names:tc:xacml:1.0:function:string-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (103,'string-is-in','urn:oasis:names:tc:xacml:1.0:function:string-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (104,'string-bag','urn:oasis:names:tc:xacml:1.0:function:string-bag',26,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (105,'integer-bag-size','urn:oasis:names:tc:xacml:1.0:function:integer-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (106,'integer-is-in','urn:oasis:names:tc:xacml:1.0:function:integer-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (107,'integer-bag','urn:oasis:names:tc:xacml:1.0:function:integer-bag',12,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (108,'double-bag-size','urn:oasis:names:tc:xacml:1.0:function:double-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (109,'double-is-in','urn:oasis:names:tc:xacml:1.0:function:double-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (110,'double-bag','urn:oasis:names:tc:xacml:1.0:function:double-bag',25,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (111,'boolean-one-and-only','urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (112,'boolean-bag-size','urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (113,'boolean-is-in','urn:oasis:names:tc:xacml:1.0:function:boolean-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (114,'boolean-bag','urn:oasis:names:tc:xacml:1.0:function:boolean-bag',18,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (115,'time-one-and-only','urn:oasis:names:tc:xacml:1.0:function:time-one-and-only',16,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (116,'time-bag-size','urn:oasis:names:tc:xacml:1.0:function:time-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (117,'time-is-in','urn:oasis:names:tc:xacml:1.0:function:time-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (118,'time-bag','urn:oasis:names:tc:xacml:1.0:function:time-bag',16,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (119,'date-one-and-only','urn:oasis:names:tc:xacml:1.0:function:date-one-and-only',21,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (120,'date-bag-size','urn:oasis:names:tc:xacml:1.0:function:date-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (121,'date-is-in','urn:oasis:names:tc:xacml:1.0:function:date-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (122,'date-bag','urn:oasis:names:tc:xacml:1.0:function:date-bag',21,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (123,'dateTime-one-and-only','urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only',19,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (124,'dateTime-bag-size','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (125,'dateTime-is-in','urn:oasis:names:tc:xacml:1.0:function:dateTime-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (126,'dateTime-bag','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag',19,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (127,'anyURI-one-and-only','urn:oasis:names:tc:xacml:1.0:function:anyURI-one-and-only',27,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (128,'anyURI-bag-size','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (129,'anyURI-is-in','urn:oasis:names:tc:xacml:1.0:function:anyURI-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (130,'anyURI-bag','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag',27,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (131,'hexBinary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:hexBinary-one-and-only',24,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (132,'hexBinary-bag-size','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (133,'hexBinary-is-in','urn:oasis:names:tc:xacml:1.0:function:hexBinary-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (134,'hexBinary-bag','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag',24,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (135,'base64Binary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:base64Binary-one-and-only',13,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (136,'base64Binary-bag-size','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (137,'base64Binary-is-in','urn:oasis:names:tc:xacml:1.0:function:base64Binary-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (138,'base64Binary-bag','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag',13,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (139,'dayTimeDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-one-and-only',15,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (140,'dayTimeDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (141,'dayTimeDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (142,'dayTimeDuration-bag','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag',15,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (143,'yearMonthDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-one-and-only',23,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (144,'yearMonthDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (145,'yearMonthDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (146,'yearMonthDuration-bag','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag',23,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (147,'x500Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:x500Name-one-and-only',14,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (148,'x500Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (149,'x500Name-is-in','urn:oasis:names:tc:xacml:1.0:function:x500Name-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (150,'x500Name-bag','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag',14,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (151,'rfc822Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-one-and-only',20,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (152,'rfc822Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (153,'rfc822Name-is-in','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (154,'rfc822Name-bag','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag',20,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (155,'ipAddress-one-and-only','urn:oasis:names:tc:xacml:2.0:function:ipAddress-one-and-only',22,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (156,'ipAddress-bag-size','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (157,'ipAddress-is-in','urn:oasis:names:tc:xacml:2.0:function:ipAddress-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (158,'ipAddress-bag','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag',22,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (159,'dnsName-one-and-only','urn:oasis:names:tc:xacml:2.0:function:dnsName-one-and-only',17,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (160,'dnsName-bag-size','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (161,'dnsName-is-in','urn:oasis:names:tc:xacml:2.0:function:dnsName-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (162,'dnsName-bag','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag',17,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (163,'string-regexp-match','urn:oasis:names:tc:xacml:1.0:function:string-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (164,'anyURI-regexp-match','urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (165,'ipAddress-regexp-match','urn:oasis:names:tc:xacml:2.0:function:ipAddress-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (166,'dnsName-regexp-match','urn:oasis:names:tc:xacml:2.0:function:dnsName-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (167,'rfc822Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:rfc822Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (168,'x500Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:x500Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (169,'string-intersection','urn:oasis:names:tc:xacml:1.0:function:string-intersection',26,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (170,'string-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (171,'string-union','urn:oasis:names:tc:xacml:1.0:function:string-union',26,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (172,'string-subset','urn:oasis:names:tc:xacml:1.0:function:string-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (173,'string-set-equals','urn:oasis:names:tc:xacml:1.0:function:string-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (174,'integer-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:integer-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (175,'integer-union','urn:oasis:names:tc:xacml:1.0:function:integer-union',12,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (176,'integer-subset','urn:oasis:names:tc:xacml:1.0:function:integer-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (177,'integer-set-equals','urn:oasis:names:tc:xacml:1.0:function:integer-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (178,'double-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:double-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (179,'double-union','urn:oasis:names:tc:xacml:1.0:function:double-union',25,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (180,'double-subset','urn:oasis:names:tc:xacml:1.0:function:double-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (181,'double-set-equals','urn:oasis:names:tc:xacml:1.0:function:double-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (182,'boolean-intersection','urn:oasis:names:tc:xacml:1.0:function:boolean-intersection',18,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (183,'boolean-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:boolean-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (184,'boolean-union','urn:oasis:names:tc:xacml:1.0:function:boolean-union',18,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (185,'boolean-subset','urn:oasis:names:tc:xacml:1.0:function:boolean-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (186,'boolean-set-equals','urn:oasis:names:tc:xacml:1.0:function:boolean-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (187,'time-intersection','urn:oasis:names:tc:xacml:1.0:function:time-intersection',16,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (188,'time-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:time-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (189,'time-union','urn:oasis:names:tc:xacml:1.0:function:time-union',16,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (190,'time-subset','urn:oasis:names:tc:xacml:1.0:function:time-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (191,'time-set-equals','urn:oasis:names:tc:xacml:1.0:function:time-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (192,'date-intersection','urn:oasis:names:tc:xacml:1.0:function:date-intersection',21,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (193,'date-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:date-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (194,'date-union','urn:oasis:names:tc:xacml:1.0:function:date-union',21,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (195,'date-subset','urn:oasis:names:tc:xacml:1.0:function:date-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (196,'date-set-equals','urn:oasis:names:tc:xacml:1.0:function:date-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (197,'dateTime-intersection','urn:oasis:names:tc:xacml:1.0:function:dateTime-intersection',19,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (198,'dateTime-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:dateTime-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (199,'dateTime-union','urn:oasis:names:tc:xacml:1.0:function:dateTime-union',19,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (200,'dateTime-subset','urn:oasis:names:tc:xacml:1.0:function:dateTime-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (201,'dateTime-set-equals','urn:oasis:names:tc:xacml:1.0:function:dateTime-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (202,'anyURI-intersection','urn:oasis:names:tc:xacml:1.0:function:anyURI-intersection',27,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (203,'anyURI-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (204,'anyURI-union','urn:oasis:names:tc:xacml:1.0:function:anyURI-union',27,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (205,'anyURI-subset','urn:oasis:names:tc:xacml:1.0:function:anyURI-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (206,'anyURI-set-equals','urn:oasis:names:tc:xacml:1.0:function:anyURI-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (207,'hexBinary-intersection','urn:oasis:names:tc:xacml:1.0:function:hexBinary-intersection',24,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (208,'hexBinary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:hexBinary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (209,'hexBinary-union','urn:oasis:names:tc:xacml:1.0:function:hexBinary-union',24,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (210,'hexBinary-subset','urn:oasis:names:tc:xacml:1.0:function:hexBinary-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (211,'hexBinary-set-equals','urn:oasis:names:tc:xacml:1.0:function:hexBinary-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (212,'base64Binary-intersection','urn:oasis:names:tc:xacml:1.0:function:base64Binary-intersection',13,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (213,'base64Binary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:base64Binary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (214,'base64Binary-union','urn:oasis:names:tc:xacml:1.0:function:base64Binary-union',13,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (215,'base64Binary-subset','urn:oasis:names:tc:xacml:1.0:function:base64Binary-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (216,'base64Binary-set-equals','urn:oasis:names:tc:xacml:1.0:function:base64Binary-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (217,'dayTimeDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-intersection',15,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (218,'dayTimeDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (219,'dayTimeDuration-union','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-union',15,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (220,'dayTimeDuration-subset','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (221,'dayTimeDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (222,'yearMonthDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-intersection',23,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (223,'yearMonthDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (224,'yearMonthDuration-union','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-union',23,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (225,'yearMonthDuration-subset','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (226,'yearMonthDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (227,'x500Name-intersection','urn:oasis:names:tc:xacml:1.0:function:x500Name-intersection',14,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (228,'x500Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:x500Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (229,'x500Name-union','urn:oasis:names:tc:xacml:1.0:function:x500Name-union',14,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (230,'x500Name-subset','urn:oasis:names:tc:xacml:1.0:function:x500Name-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (231,'x500Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:x500Name-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (232,'rfc822Name-intersection','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-intersection',20,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (233,'rfc822Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (234,'rfc822Name-union','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-union',20,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (235,'rfc822Name-subset','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (236,'rfc822Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (237,'x500Name-match','urn:oasis:names:tc:xacml:1.0:function:x500Name-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (238,'rfc822Name-match','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (239,'integer-intersection','urn:oasis:names:tc:xacml:1.0:function:integer-intersection',12,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (240,'double-intersection','urn:oasis:names:tc:xacml:1.0:function:double-intersection',25,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (241,'or','urn:oasis:names:tc:xacml:1.0:function:or',18,0,0,0,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (242,'and','urn:oasis:names:tc:xacml:1.0:function:and',18,0,0,0,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (243,'n-of','urn:oasis:names:tc:xacml:1.0:function:n-of',18,0,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (244,'not','urn:oasis:names:tc:xacml:1.0:function:not',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (245,'any-of','urn:oasis:names:tc:xacml:3.0:function:any-of',18,0,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (246,'all-of','urn:oasis:names:tc:xacml:3.0:function:all-of',18,0,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (247,'any-of-any','urn:oasis:names:tc:xacml:3.0:function:any-of-any',18,0,1,2,-1,1,-1,0);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (248,'all-of-any','urn:oasis:names:tc:xacml:1.0:function:all-of-any',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (249,'any-of-all','urn:oasis:names:tc:xacml:1.0:function:any-of-all',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (250,'all-of-all','urn:oasis:names:tc:xacml:1.0:function:all-of-all',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (251,'map','urn:oasis:names:tc:xacml:3.0:function:map',NULL,1,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (252,'xpath-node-count','urn:oasis:names:tc:xacml:3.0:function:xpath-node-count',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (253,'xpath-node-equal','urn:oasis:names:tc:xacml:3.0:function:xpath-node-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (254,'xpath-node-match','urn:oasis:names:tc:xacml:3.0:function:xpath-node-match',18,0,0,2,2,NULL,NULL,NULL);
-
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (1,0,1,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (2,0,1,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (3,0,2,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (4,0,2,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (5,0,3,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (6,1,4,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (7,1,5,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (8,0,6,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (9,0,6,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (10,0,7,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (11,0,7,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (12,0,8,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (13,0,8,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (14,0,9,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (15,0,9,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (16,0,10,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (17,0,11,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (18,0,12,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (19,0,13,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (20,0,14,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (21,0,15,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (22,0,16,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (23,0,17,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (24,0,18,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (25,0,19,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (26,0,20,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (27,0,21,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (28,0,22,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (29,0,23,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (30,0,24,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (31,0,25,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (32,0,26,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (33,0,27,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (34,0,28,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (35,0,29,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (36,0,30,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (37,0,31,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (38,0,32,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (39,0,33,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (40,0,34,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (41,0,35,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (42,0,36,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (43,0,37,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (44,0,37,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (45,0,38,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (46,0,38,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (47,0,39,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (48,0,39,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (49,0,40,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (50,0,40,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (51,0,41,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (52,0,41,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (53,0,41,3,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (54,0,42,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (55,0,42,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (56,0,42,3,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (57,0,43,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (58,0,43,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (59,0,44,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (60,0,44,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (61,0,45,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (62,0,45,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (63,0,46,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (64,0,46,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (65,0,47,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (66,0,47,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (67,0,48,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (68,0,48,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (69,0,49,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (70,0,49,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (71,0,50,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (72,0,50,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (73,0,51,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (74,0,51,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (75,0,52,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (76,0,52,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (77,0,53,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (78,0,53,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (79,0,54,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (80,0,54,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (81,0,55,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (82,0,55,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (83,0,56,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (84,0,56,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (85,0,57,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (86,0,57,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (89,0,58,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (90,0,58,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (91,0,59,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (92,0,59,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (93,0,60,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (94,0,60,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (95,0,61,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (96,0,61,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (97,0,62,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (98,0,62,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (99,0,63,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (100,0,63,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (101,0,64,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (102,0,65,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (103,0,66,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (104,0,67,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (125,0,68,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (126,0,69,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (128,0,70,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (129,0,71,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (130,0,71,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (131,0,72,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (132,0,72,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (133,0,73,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (134,0,73,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (135,0,74,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (136,0,74,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (137,0,75,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (138,0,75,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (139,0,76,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (140,0,76,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (141,0,77,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (142,0,77,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (143,0,78,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (144,0,78,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (145,0,79,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (146,0,79,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (147,0,80,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (148,0,80,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (149,0,81,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (150,0,81,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (151,0,82,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (152,0,82,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (153,0,83,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (154,0,83,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (155,0,84,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (156,0,84,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (157,0,85,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (158,0,85,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (159,0,86,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (160,0,86,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (161,0,87,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (162,0,87,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (163,0,88,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (164,0,88,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (165,0,89,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (166,0,89,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (167,0,90,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (168,0,90,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (169,0,91,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (170,0,91,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (171,0,92,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (172,0,92,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (173,0,93,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (174,0,93,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (175,0,94,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (176,0,94,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (177,0,95,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (178,0,95,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (179,0,96,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (180,0,96,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (181,0,97,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (182,0,97,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (183,0,98,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (184,0,98,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (185,0,99,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (186,0,99,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (187,0,100,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (188,0,100,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (189,1,101,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (190,1,102,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (191,0,103,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (192,1,103,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (193,0,104,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (194,1,105,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (195,0,106,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (196,1,106,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (197,0,107,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (198,1,108,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (199,0,109,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (200,1,109,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (201,0,110,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (202,1,111,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (203,1,112,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (204,0,113,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (205,1,113,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (206,0,114,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (207,1,115,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (208,1,116,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (209,0,117,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (210,1,117,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (211,0,118,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (212,1,119,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (213,1,120,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (214,0,121,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (215,1,121,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (216,0,122,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (217,1,123,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (218,1,124,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (219,0,125,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (220,1,125,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (221,0,126,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (222,1,127,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (223,1,128,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (224,0,129,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (225,1,129,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (226,0,130,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (227,1,131,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (228,1,132,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (229,0,133,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (230,1,133,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (231,0,134,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (232,1,135,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (233,1,136,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (234,0,137,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (235,1,137,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (236,0,138,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (237,1,139,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (238,1,140,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (239,0,141,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (240,1,141,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (241,0,142,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (242,1,143,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (243,1,144,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (244,1,145,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (245,0,145,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (246,0,146,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (247,1,147,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (248,1,148,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (249,0,149,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (250,1,149,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (251,0,150,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (252,1,151,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (253,1,152,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (254,0,153,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (255,1,153,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (256,0,154,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (257,1,155,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (258,1,156,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (259,0,157,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (260,1,157,2,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (261,0,158,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (262,1,159,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (263,1,160,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (264,0,161,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (265,1,161,2,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (266,0,162,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (267,0,163,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (268,0,163,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (269,0,164,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (270,0,164,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (271,0,165,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (272,0,165,2,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (273,0,166,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (274,0,166,2,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (275,0,167,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (276,0,167,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (277,0,168,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (278,0,168,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (279,1,169,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (280,1,169,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (281,1,170,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (282,1,170,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (283,1,171,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (284,1,172,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (285,1,172,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (286,1,173,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (287,1,173,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (288,1,174,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (289,1,174,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (290,1,175,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (292,1,176,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (293,1,176,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (294,1,177,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (295,1,177,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (296,1,178,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (297,1,178,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (298,1,179,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (299,1,180,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (300,1,180,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (301,1,181,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (302,1,181,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (303,1,182,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (304,1,182,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (305,1,183,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (306,1,183,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (307,1,184,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (308,1,185,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (309,1,185,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (310,1,186,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (311,1,186,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (312,1,187,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (313,1,187,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (314,1,188,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (315,1,188,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (316,1,189,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (317,1,190,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (318,1,190,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (319,1,191,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (320,1,191,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (321,1,192,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (322,1,192,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (323,1,193,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (324,1,193,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (325,1,194,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (326,1,195,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (327,1,195,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (328,1,196,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (329,1,196,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (330,1,197,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (331,1,197,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (332,1,198,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (333,1,198,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (334,1,199,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (335,1,200,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (336,1,200,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (337,1,201,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (338,1,201,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (339,1,202,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (340,1,202,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (341,1,203,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (342,1,203,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (343,1,204,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (344,1,205,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (345,1,205,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (346,1,206,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (347,1,206,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (348,1,207,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (349,1,207,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (350,1,208,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (351,1,208,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (352,1,209,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (353,1,210,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (354,1,210,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (355,1,211,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (356,1,211,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (357,1,212,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (358,1,212,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (359,1,213,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (360,1,213,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (361,1,214,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (362,1,215,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (363,1,215,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (364,1,216,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (365,1,216,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (366,1,217,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (367,1,217,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (368,1,218,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (369,1,218,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (370,1,219,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (371,1,220,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (372,1,220,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (373,1,221,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (374,1,221,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (375,1,222,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (376,1,222,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (377,1,223,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (378,1,223,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (380,1,224,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (381,1,225,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (382,1,225,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (383,1,226,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (384,1,226,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (385,1,227,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (386,1,227,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (387,1,228,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (388,1,228,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (389,1,229,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (390,1,230,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (391,1,230,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (392,1,231,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (393,1,231,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (394,1,232,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (395,1,232,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (396,1,233,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (397,1,233,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (398,1,234,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (399,1,235,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (400,1,235,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (401,1,236,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (402,1,236,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (403,0,237,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (404,0,237,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (405,0,238,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (406,0,238,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (407,1,239,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (408,1,239,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (409,1,240,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (410,1,240,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (411,0,241,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (412,0,242,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (413,0,243,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (414,0,243,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (415,0,244,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (416,0,245,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (417,0,245,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (418,1,245,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (419,0,246,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (420,0,246,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (421,1,246,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (422,0,247,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (423,1,247,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (424,1,247,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (433,0,248,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (434,1,248,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (435,1,248,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (436,0,249,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (437,1,249,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (438,1,249,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (439,0,250,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (440,1,250,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (441,1,250,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (442,0,251,1,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (447,1,251,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (448,0,252,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (449,0,253,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (450,0,253,2,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (451,0,254,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (452,0,254,2,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (453,0,92,3,16);
-
-INSERT INTO PIPType VALUES (500,'SQL'), (501,'LDAP'), (502,'CSV'), (503,'Hyper-CSV'), (504,'Custom');
diff --git a/openaz-xacml-pap-admin/src/META-INF/drop.sql b/openaz-xacml-pap-admin/src/META-INF/drop.sql
deleted file mode 100644
index 8aee7ee..0000000
--- a/openaz-xacml-pap-admin/src/META-INF/drop.sql
+++ /dev/null
@@ -1,21 +0,0 @@
-DROP TABLE IF EXISTS AttributeAssignment;
-DROP TABLE IF EXISTS ConstraintValues;
-DROP TABLE IF EXISTS ObadviceExpressions;
-DROP TABLE IF EXISTS Attribute;
-DROP TABLE IF EXISTS Category;
-DROP TABLE IF EXISTS ConstraintType;
-DROP VIEW IF EXISTS match_functions;
-DROP VIEW IF EXISTS higherorder_bag_functions;
-DROP VIEW IF EXISTS function_flattener;
-DROP TABLE IF EXISTS FunctionArguments;
-DROP TABLE IF EXISTS FunctionDefinition;
-DROP TABLE IF EXISTS Datatype;
-DROP TABLE IF EXISTS Obadvice;
-DROP TABLE IF EXISTS PIPConfigParams;
-DROP TABLE IF EXISTS PIPResolverParams;
-DROP TABLE IF EXISTS PIPResolver;
-DROP TABLE IF EXISTS PIPConfiguration;
-DROP TABLE IF EXISTS PIPType;
-DROP TABLE IF EXISTS PolicyAlgorithms;
-DROP TABLE IF EXISTS RuleAlgorithms;
-DROP TABLE IF EXISTS SEQUENCE;
\ No newline at end of file
diff --git a/openaz-xacml-pap-admin/src/META-INF/empty.sql b/openaz-xacml-pap-admin/src/META-INF/empty.sql
deleted file mode 100644
index e69de29..0000000
--- a/openaz-xacml-pap-admin/src/META-INF/empty.sql
+++ /dev/null
diff --git a/openaz-xacml-pap-admin/src/META-INF/persistence.xml b/openaz-xacml-pap-admin/src/META-INF/persistence.xml
deleted file mode 100644
index 79594a9..0000000
--- a/openaz-xacml-pap-admin/src/META-INF/persistence.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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-ADMIN">
-		<class>org.apache.openaz.xacml.admin.jpa.Attribute</class>
-		<class>org.apache.openaz.xacml.admin.jpa.AttributeAssignment</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Category</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ConstraintType</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ConstraintValue</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Datatype</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Obadvice</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ObadviceExpression</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms</class>
-		<class>org.apache.openaz.xacml.admin.jpa.RuleAlgorithms</class>
-		<class>org.apache.openaz.xacml.admin.jpa.FunctionArgument</class>
-		<class>org.apache.openaz.xacml.admin.jpa.FunctionDefinition</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPConfigParam</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPConfiguration</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPResolver</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPResolverParam</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPType</class>
-		<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>
diff --git a/openaz-xacml-pap-admin/src/META-INF/views.sql b/openaz-xacml-pap-admin/src/META-INF/views.sql
deleted file mode 100644
index 7c4a820..0000000
--- a/openaz-xacml-pap-admin/src/META-INF/views.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-
-CREATE VIEW match_functions AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.XACML_ID AS xacmlid,	D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return,	D.ARG_LB AS arg_lb,	D.ARG_UB AS arg_ub,	A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag,	A2.DATATYPE_ID AS arg2_datatype FROM (FunctionDefinition D left join FunctionArguments A1 on (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 on (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2)) where (D.ARG_LB = 2 and D.ARG_UB = 2 and D.RETURN_DATATYPE = 18 and A1.IS_BAG = 0) order by D.SHORT_NAME;
-
-CREATE VIEW function_flattener AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.IS_HIGHER_ORDER AS is_higher_order, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype, A3.IS_BAG AS arg3_isbag, A3.DATATYPE_ID AS arg3_datatype FROM (FunctionDefinition D left join FunctionArguments A1 ON (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 ON (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2) LEFT JOIN FunctionArguments A3 ON (A3.FUNCTION_ID = D.ID and A3.ARG_INDEX = 3)) ORDER BY D.ID;
-
-CREATE VIEW higherorder_bag_functions AS SELECT * FROM function_flattener WHERE is_higher_order = 1 AND is_bag_return = 1 AND return_datatype=18 AND arg_lb=2 AND arg_ub=2 AND arg1_isbag = 1 AND (arg2_isbag = 1 OR arg2_isbag IS NULL);
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java
deleted file mode 100644
index b2deda7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/PAPNotificationBroadcaster.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import java.io.Serializable;
-import java.util.LinkedList;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Handle Notifications from the PAP that the PDP Groups have been changed.
- * We need a Server Push Broadcaster because there may be multiple Vaadin instances (i.e. Users) that need to be told when a change occurs.
- * 
- * Initially we only update the entire set of PDPGroups in one shot.
- * 
- * (Code copied from Book of Vaadin chapter on Server Push
- * @author glenngriffin
- *
- */
-public class PAPNotificationBroadcaster implements Serializable {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = -2539940306348821754L;
-
-
-	private static Log logger	= LogFactory.getLog(PAPNotificationBroadcaster.class);
-
-	
-    static ExecutorService executorService = Executors.newSingleThreadExecutor();
-
-    /**
-     * Interface used by all classes that need to be notified when PAP sends an update message.
-     * 
-     * @author glenngriffin
-     *
-     */
-    public interface PAPNotificationBroadcastListener {
-        void updateAllGroups();
-    }
-    
-    
-    
-    /*
-     * list of registered listeners
-     */
-    private static LinkedList<PAPNotificationBroadcastListener> listeners =
-        new LinkedList<PAPNotificationBroadcastListener>();
-    
-    /**
-     * Listener registers to hear about updates.
-     * @param listener
-     */
-    public static synchronized void register(
-    		PAPNotificationBroadcastListener listener) {
-        listeners.add(listener);
-    }
-    
-    
-    /**
-     * Listener is going away.
-     * 
-     * @param listener
-     */
-    public static synchronized void unregister(
-    		PAPNotificationBroadcastListener listener) {
-        listeners.remove(listener);
-    }
-    
-    
-    
-    /**
-     * Tell all listeners about an update.
-     * 
-     * @param message
-     */
-    public static synchronized void updateAllGroups() {
-        for (final PAPNotificationBroadcastListener listener: listeners) {
-  // Original code copied from example:
-  //          executorService.execute(new Runnable() {
-  //              @Override
-  //              public void run() {
-  // The problem with this is that the execute starts a new Thread, but the thing we are calling (the listener.updateAllGroups)
-  // happens in this case to ALSO create a new thread, and it locks up because the shared threadpool queue is already locked by this method.
-  // On application shutdown that left us with a blocked thread, so the process never goes away.
-  // Since the listener.updateAllGroups does ALL of its work inside a new Runnable thread, there should be no need for this method to also create a thread.
-  
-        	/*
-        	 * IMPORTANT:
-        	 * All listeners MUST either execute with no possibility of blocking
-        	 * OR must start their own threads to handle blocking and concurrent operations.
-        	 */
-        	if (logger.isDebugEnabled()) {
-        		logger.debug("updateAllGroups");
-        	}
-            listener.updateAllGroups();
-        }
-    }
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java
deleted file mode 100644
index 2a065d5..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminAuthorization.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.std.annotations.XACMLRequest;
-import org.apache.openaz.xacml.std.annotations.RequestParser;
-import org.apache.openaz.xacml.std.annotations.XACMLSubject;
-import org.apache.openaz.xacml.std.annotations.XACMLAction;
-import org.apache.openaz.xacml.std.annotations.XACMLResource;
-import org.apache.openaz.xacml.api.DataTypeException;
-import org.apache.openaz.xacml.api.Decision;
-import org.apache.openaz.xacml.api.Request;
-import org.apache.openaz.xacml.api.Response;
-import org.apache.openaz.xacml.api.Result;
-import org.apache.openaz.xacml.api.pdp.PDPEngine;
-import org.apache.openaz.xacml.api.pdp.PDPEngineFactory;
-import org.apache.openaz.xacml.api.pdp.PDPException;
-import org.apache.openaz.xacml.util.FactoryException;
-
-public class XacmlAdminAuthorization {
-	private static Log logger	= LogFactory.getLog(XacmlAdminAuthorization.class);
-	
-	public enum AdminAction {
-		ACTION_ACCESS("access"),
-		ACTION_READ("read"),
-		ACTION_WRITE("write"),
-		ACTION_ADMIN("admin");
-		
-		String action;
-		AdminAction(String a) {
-			this.action = a;
-		}
-		public String toString() {
-			return this.action;
-		}
-	}
-	
-	public enum AdminResource {
-		RESOURCE_APPLICATION("application"),
-		RESOURCE_POLICY_WORKSPACE("workspace"),
-		RESOURCE_POLICY_EDITOR("editor"),
-		RESOURCE_DICTIONARIES("dictionaries"),
-		RESOURCE_PDP_ADMIN("pdp_admin"),
-		RESOURCE_PIP_ADMIN("pip_admin");
-		
-		String resource;
-		AdminResource(String r) {
-			this.resource = r;
-		}
-		public String toString() {
-			return this.resource;
-		}
-	}
-	
-	@XACMLRequest(ReturnPolicyIdList=true)
-	public class AuthorizationRequest {
-		
-		@XACMLSubject(includeInResults=true)
-		String	userID;
-		
-		@XACMLAction()
-		String	action;
-		
-		@XACMLResource()
-		String	resource;
-		
-		public AuthorizationRequest(String userId, String action, String resource) {
-			this.userID = userId;
-			this.action = action;
-			this.resource = resource;
-		}
-
-		public String getUserID() {
-			return userID;
-		}
-
-		public void setUserID(String userID) {
-			this.userID = userID;
-		}
-
-		public String getAction() {
-			return action;
-		}
-
-		public void setAction(String action) {
-			this.action = action;
-		}
-
-		public String getResource() {
-			return resource;
-		}
-
-		public void setResource(String resource) {
-			this.resource = resource;
-		}
-	}
-	
-	//
-	// The PDP Engine
-	//
-	protected PDPEngine pdpEngine;
-
-	public XacmlAdminAuthorization() {
-		PDPEngineFactory pdpEngineFactory	= null;
-		try {
-			pdpEngineFactory	= PDPEngineFactory.newInstance();
-			if (pdpEngineFactory == null) {
-				logger.error("Failed to create PDP Engine Factory");
-			}
-			this.pdpEngine = pdpEngineFactory.newEngine();
-		} catch (FactoryException e) {
-			logger.error("Exception create PDP Engine: " + e.getLocalizedMessage());
-		}
-	}
-	
-	public boolean	isAuthorized(String userid, AdminAction action, AdminResource resource) {
-		logger.info("authorize: " + userid + " to " + action + " with " + resource);
-		if (this.pdpEngine == null) {
-			logger.warn("no pdp engine available to authorize");
-			return false;
-		}
-		Request request;
-		try {
-			request = RequestParser.parseRequest(new AuthorizationRequest(userid, action.toString(), resource.toString()));
-		} catch (IllegalArgumentException | IllegalAccessException | DataTypeException e) {
-			logger.error("Failed to create request: " + e.getLocalizedMessage());
-			return false;
-		}
-		if (request == null) {
-			logger.error("Failed to parse request.");
-			return false;
-		}
-		logger.info("Request: " + request);
-		//
-		// Ask the engine
-		//
-		try {
-			Response response = this.pdpEngine.decide(request);
-			if (response == null) {
-				logger.error("Null response from PDP decide");
-			}
-			//
-			// Should only be one result
-			//
-			for (Result result : response.getResults()) {
-				Decision decision = result.getDecision();
-				logger.info("Decision: " + decision);
-				if (decision.equals(Decision.PERMIT)) {
-					return true;
-				}
-			}
-		} catch (PDPException e) {
-			logger.error("PDP Decide failed: " + e.getLocalizedMessage());
-		}
-		return false;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java
deleted file mode 100644
index 91e831b..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminConsole.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.components.AttributeDictionary;
-import org.apache.openaz.xacml.admin.components.ObadviceDictionary;
-import org.apache.openaz.xacml.admin.components.PDPManagement;
-import org.apache.openaz.xacml.admin.components.PIPManagement;
-import org.apache.openaz.xacml.admin.components.PolicyWorkspace;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.navigator.View;
-import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
-import com.vaadin.server.ThemeResource;
-import com.vaadin.shared.ui.label.ContentMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Embedded;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-
-public class XacmlAdminConsole extends CustomComponent implements View {
-	private static final long serialVersionUID = 1L;
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Label labelCopyright;
-	@AutoGenerated
-	private TabSheet tabSheet;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private Label labelWelcome;
-	@AutoGenerated
-	private Label caption;
-	@AutoGenerated
-	private Embedded embedded_1;
-
-	private static Log logger	= LogFactory.getLog(XacmlAdminConsole.class);
-	
-	private final PolicyWorkspace policyWorkspace;
-	private final AttributeDictionary attributeDictionary;
-	private final ObadviceDictionary obadvice;
-	private final PDPManagement pdp;
-	private final PIPManagement pip;
-//	private final UserManagement user;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public XacmlAdminConsole() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		
-		if (logger.isDebugEnabled()) {
-			logger.debug("Creating tabs...");
-		}
-		
-		this.labelWelcome.setValue("Welcome " + ((XacmlAdminUI)UI.getCurrent()).getUserName());
-		this.labelCopyright.setContentMode(ContentMode.HTML);
-		
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) {
-			this.policyWorkspace = new PolicyWorkspace();
-			this.tabSheet.addComponent(this.policyWorkspace);
-			this.tabSheet.getTab(this.policyWorkspace).setCaption("Policy Workspace");
-		} else {
-			this.policyWorkspace = null;
-		}
-		
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) {
-			this.attributeDictionary = new AttributeDictionary();
-			this.tabSheet.addComponent(this.attributeDictionary);
-			this.tabSheet.getTab(this.attributeDictionary).setCaption("Attribute Dictionary");
-
-			this.obadvice = new ObadviceDictionary(); 
-			this.tabSheet.addComponent(this.obadvice);
-			this.tabSheet.getTab(this.obadvice).setCaption("Obligation/Advice Dictionary");
-		} else {
-			this.attributeDictionary = null;
-			this.obadvice = null;
-		}
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-									XacmlAdminAuthorization.AdminAction.ACTION_READ, 
-									XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN)) {
-			this.pdp = new PDPManagement(((XacmlAdminUI)UI.getCurrent()).getPAPEngine());
-			this.tabSheet.addComponent(this.pdp);
-			this.tabSheet.getTab(this.pdp).setCaption("PDP Management");
-		} else {
-			this.pdp = null;
-		}
-		
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_PIP_ADMIN)) {
-			this.pip = new PIPManagement();
-			this.tabSheet.addComponent(this.pip);
-			this.tabSheet.getTab(this.pip).setCaption("PIP Management");
-		} else {
-			this.pip = null;
-		}
-		/*
-		 * TODO  - figure out how to add this in
-		 *
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_READ, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) {
-			this.user = new UserManagement();
-			this.tabSheet.addComponent(this.user);
-			this.tabSheet.getTab(this.user).setCaption("User Management");
-		}
-		*/
-		
-		if (logger.isDebugEnabled()) {
-			logger.debug("Done creating tabs.");
-		}
-	}
-	
-	public void refreshAttributes() {
-		this.attributeDictionary.refreshContainer();
-	}
-	public void refreshObadvice() {
-		this.obadvice.refreshContainer();
-	}
-
-	public void refreshPIPConfiguration() {
-		this.pip.refreshContainer();
-	}
-
-	public void refreshPDPGroups() {
-		this.pdp.refreshContainer();
-	}
-
-	public TabSheet getTabSheet() { return tabSheet;}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("100%");
-		mainLayout.setMargin(true);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("100.0%");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		// tabSheet
-		tabSheet = new TabSheet();
-		tabSheet.setImmediate(false);
-		tabSheet.setWidth("100.0%");
-		tabSheet.setHeight("100.0%");
-		mainLayout.addComponent(tabSheet);
-		mainLayout.setExpandRatio(tabSheet, 1.0f);
-		
-		// labelCopyright
-		labelCopyright = new Label();
-		labelCopyright.setImmediate(false);
-		labelCopyright.setWidth("-1px");
-		labelCopyright.setHeight("40px");
-		labelCopyright
-				.setValue("<center>Copyright &copy; 2015 The Apache Software Foundation, Licensed under the Apache License, Version 2.0.</center>");
-		mainLayout.addComponent(labelCopyright);
-		mainLayout.setComponentAlignment(labelCopyright, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("100.0%");
-		horizontalLayout_1.setHeight("40px");
-		horizontalLayout_1.setMargin(false);
-		
-		// embedded_1
-		embedded_1 = new Embedded();
-		embedded_1.setImmediate(false);
-		embedded_1.setWidth("30px");
-		embedded_1.setHeight("30px");
-		embedded_1.setSource(new ThemeResource("img/att.png"));
-		embedded_1.setType(1);
-		embedded_1.setMimeType("image/png");
-		horizontalLayout_1.addComponent(embedded_1);
-		horizontalLayout_1.setComponentAlignment(embedded_1, new Alignment(33));
-		
-		// caption
-		caption = new Label();
-		caption.setImmediate(false);
-		caption.setWidth("-1px");
-		caption.setHeight("-1px");
-		caption.setValue("Apache OpenAZ Admin Console");
-		horizontalLayout_1.addComponent(caption);
-		horizontalLayout_1.setExpandRatio(caption, 1.0f);
-		horizontalLayout_1.setComponentAlignment(caption, new Alignment(33));
-		
-		// labelWelcome
-		labelWelcome = new Label();
-		labelWelcome.setImmediate(false);
-		labelWelcome.setWidth("-1px");
-		labelWelcome.setHeight("40px");
-		labelWelcome.setValue("Label");
-		horizontalLayout_1.addComponent(labelWelcome);
-		horizontalLayout_1.setComponentAlignment(labelWelcome,
-				new Alignment(34));
-		
-		return horizontalLayout_1;
-	}
-
-	@Override
-	public void enter(ViewChangeEvent event) {
-		//
-		// This needs to be implemented
-		//
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java
deleted file mode 100644
index fa48543..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminServlet.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import java.io.IOException;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-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 com.vaadin.annotations.Push;
-import com.vaadin.annotations.VaadinServletConfiguration;
-import com.vaadin.server.VaadinServlet;
-
-import org.apache.openaz.xacml.rest.XACMLRest;
-
-
-//
-// The Servlet underlying the Vaadin Servlet
-//
-@Push
-@WebServlet(
-		value = "/*",
-		description = "XACML Admin Console",
-		asyncSupported = true, 
-		loadOnStartup=1,
-		initParams = { 
-		@WebInitParam(name = "XACML_PROPERTIES_NAME", value = "xacml.admin.properties", description = "The location of the properties file holding configuration information.")
-})
-@VaadinServletConfiguration(productionMode = false, ui = XacmlAdminUI.class)
-public class XacmlAdminServlet extends VaadinServlet {
-	//
-	// All static declarations
-	//
-	private static Log logger	= LogFactory.getLog(XacmlAdminServlet.class); //NOPMD
-
-	@Override
-	public void init(ServletConfig servletConfig) throws ServletException {
-		super.init(servletConfig);
-		//
-		// Common initialization
-		//
-		XACMLRest.xacmlInit(servletConfig);
-
-		// Initialization
-		XacmlAdminUI.servletInit();
-	}
-	
-	@Override
-	public void destroy() {
-		XacmlAdminUI.servletDestroy();
-		super.destroy();
-	}
-	
-	/**
-	 * 
-	 * Called by:
-	 * 	- PAP to notify Vaadin GUIs that something has changed
-	 * 
-	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
-	 */
-	@Override
-	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-		// watch for notifications from the PAP
-		if (request.getMethod().equals("PUT") && request.getParameter("PAPNotification") != null) {
-			XacmlAdminUI.doPAPNotification(request, response);
-			return;
-		}
-
-		// not a PAP notification, so let Vaadin handle normally
-		super.service(request,response);
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java
deleted file mode 100644
index e553749..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlAdminUI.java
+++ /dev/null
@@ -1,801 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import java.io.IOException;
-import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.sql.SQLException;
-import java.util.Properties;
-import java.util.UUID;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.api.errors.InvalidRemoteException;
-import org.eclipse.jgit.api.errors.TransportException;
-import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
-import org.eclipse.persistence.config.PersistenceUnitProperties;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization.AdminAction;
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization.AdminResource;
-import org.apache.openaz.xacml.admin.converters.XacmlConverterFactory;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.jpa.ObadviceExpression;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.jpa.PIPType;
-import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms;
-import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms;
-import org.apache.openaz.xacml.admin.model.MatchFunctionQueryDelegate;
-import org.apache.openaz.xacml.admin.util.RESTfulPAPEngine;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PAPException;
-import org.apache.openaz.xacml.rest.XACMLRestProperties;
-import org.apache.openaz.xacml.util.XACMLProperties;
-import com.google.gwt.thirdparty.guava.common.base.Joiner;
-import com.google.gwt.thirdparty.guava.common.base.Splitter;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.annotations.Push;
-import com.vaadin.annotations.Theme;
-import com.vaadin.data.util.sqlcontainer.SQLContainer;
-import com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool;
-import com.vaadin.data.util.sqlcontainer.query.FreeformQuery;
-import com.vaadin.navigator.Navigator;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.server.VaadinServletService;
-import com.vaadin.ui.UI;
-
-@Push
-@SuppressWarnings("serial")
-@Theme("xacml_pap_admin")
-public class XacmlAdminUI extends UI implements PAPNotificationBroadcaster.PAPNotificationBroadcastListener {
-	//
-	// All static declarations
-	//
-	public static final String PERSISTENCE_UNIT = "XACML-PAP-ADMIN";
-	private static Log logger	= LogFactory.getLog(XacmlAdminUI.class); //NOPMD
-	
-	/*
-	 * These objects are shared amongst sessions.
-	 */
-	private static Path repositoryPath;
-	private static Repository repository;
-	private static EntityManagerFactory emf;
-	private static JDBCConnectionPool pool;
-	
-	/*
-	 * These objects are created each session.
-	 */
-	private Path workspacePath;
-	private Path gitPath;
-	//
-	// Our Persistence Fields. For general use. NOTE: Be careful applying
-	// filters to these container objects. If one window applies a filter, then
-	// when another window uses the object, that filter will show up and cause confusion.
-	// If filters are needed within a window, then create another instance instead of
-	// using one of these pointers.
-	//
-	private EntityManager em;
-	private JPAContainer<Attribute> 			attributes;
-	private JPAContainer<ConstraintType> 		constraintTypes;
-	private JPAContainer<Obadvice> 				obadvice;
-	private JPAContainer<ObadviceExpression> 	obadviceExpressions;
-	private JPAContainer<Category> 				categories;
-	private JPAContainer<Datatype> 				datatypes;
-	private JPAContainer<PolicyAlgorithms> 		policyAlgorithms;
-	private JPAContainer<RuleAlgorithms> 		ruleAlgorithms;
-	private JPAContainer<PIPConfiguration>		pipConfigurations;
-	private JPAContainer<PIPResolver>			pipResolvers;
-	private JPAContainer<PIPType>				pipTypes;
-	private JPAContainer<FunctionDefinition>	functionDefinitions;
-	private JPAContainer<FunctionArgument>		functionArguments;
-	private SQLContainer matchFunctionContainer;
-	private SQLContainer higherorderBagContainer;
-	//
-	// Our authorization object
-	//
-	XacmlAdminAuthorization authorizer = new XacmlAdminAuthorization();
-	//
-	// The PAP Engine
-	//
-	private PAPEngine papEngine;
-	//
-	// GUI navigation
-	//
-	private Navigator navigator = null;
-	private XacmlAdminConsole console = null;
-	//
-	// Vaadin Init
-	//
-	@Override
-	protected void init(VaadinRequest request) {
-		//
-		// Set our title
-		//
-		this.getPage().setTitle("Apache OpenAZ Admin Console");
-		//
-		// Create our authorization object
-		//
-		this.authorizer = new XacmlAdminAuthorization();
-		//
-		// Is the user authorized to use the application?
-		//
-		if (this.authorizer.isAuthorized(this.getUserid(), 
-									XacmlAdminAuthorization.AdminAction.ACTION_ACCESS, 
-									XacmlAdminAuthorization.AdminResource.RESOURCE_APPLICATION) == false) {
-			logger.error("user " + this.getUserid() + " is not authorized.");
-			//
-			// Create a navigator to manage all our views
-			//
-			this.navigator = new Navigator(this, this);
-			//
-			// Redirect to an error page
-			//
-			this.navigator.addView(XacmlErrorHandler.VIEWNAME, new XacmlErrorHandler("User " + this.getUserid() + " is not authorized to access application", null));
-			this.navigator.navigateTo(XacmlErrorHandler.VIEWNAME);
-			return;
-		}
-		try {
-			//
-			// Initialize user's Git repository
-			//
-			this.workspacePath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_WORKSPACE), this.getUserid());
-			this.gitPath = XacmlAdminUI.initializeUserRepository(this.workspacePath, this.getUserid(), this.getUserEmail());
-		} catch (Exception e) {
-			logger.error("Git Setup failure", e);
-			//
-			// Create a navigator to manage all our views
-			//
-			this.navigator = new Navigator(this, this);
-			//
-			// Redirect to an error page
-			//
-			this.navigator.addView(XacmlErrorHandler.VIEWNAME, new XacmlErrorHandler(e.getMessage(), null));
-			this.navigator.navigateTo(XacmlErrorHandler.VIEWNAME);
-			return;
-		}
-		//
-		// Create a navigator to manage all our views
-		//
-		this.navigator = new Navigator(this, this);
-		//
-		// Set our converter factory
-		//
-		this.getSession().setConverterFactory(new XacmlConverterFactory());
-		//
-		// Initialize our data objects
-		//
-		try {
-			//
-			// Initialize JPA and SQL. Create our custom entity manager.
-			//
-			logger.info("Creating Persistence Entity Manager");
-			//
-			// Now create the entity manager. This is used throughout the application to create JPA
-			// containers of the entities located in the database.
-			//
-			this.em = XacmlAdminUI.emf.createEntityManager();
-			//
-			// Our Read-Only containers
-			//
-			logger.info("Creating JPA read-only containers");
-			this.constraintTypes = new JPAContainer<ConstraintType>(ConstraintType.class);
-			this.constraintTypes.setEntityProvider(new CachingLocalEntityProvider<ConstraintType>(ConstraintType.class, this.em));
-			
-			this.categories = new JPAContainer<Category>(Category.class);
-			this.categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, this.em));
-
-			this.datatypes = new JPAContainer<Datatype>(Datatype.class);
-			this.datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, this.em));
-			
-			this.policyAlgorithms = new JPAContainer<PolicyAlgorithms>(PolicyAlgorithms.class);
-			this.policyAlgorithms.setEntityProvider(new CachingLocalEntityProvider<PolicyAlgorithms>(PolicyAlgorithms.class, this.em));
-			
-			this.ruleAlgorithms = new JPAContainer<RuleAlgorithms>(RuleAlgorithms.class);
-			this.ruleAlgorithms.setEntityProvider(new CachingLocalEntityProvider<RuleAlgorithms>(RuleAlgorithms.class, this.em));
-			
-			this.pipTypes = new JPAContainer<PIPType>(PIPType.class);
-			this.pipTypes.setEntityProvider(new CachingLocalEntityProvider<PIPType>(PIPType.class, this.em));
-			
-			this.functionDefinitions = new JPAContainer<FunctionDefinition>(FunctionDefinition.class);
-			this.functionDefinitions.setEntityProvider(new CachingLocalEntityProvider<FunctionDefinition>(FunctionDefinition.class, this.em));
-
-			this.functionArguments = new JPAContainer<FunctionArgument>(FunctionArgument.class);
-			this.functionArguments.setEntityProvider(new CachingLocalEntityProvider<FunctionArgument>(FunctionArgument.class, this.em));
-			//
-			// Our writable containers. NOTE: The dictionaries have their own JPA instance since they can
-			// apply filters to their table views. If you update these, then refresh the dictionary containers
-			// by calling the appropriate refresh method defined in XacmlAdminUI.
-			//
-			logger.info("Creating JPA writable containers");
-			this.attributes = new JPAContainer<Attribute>(Attribute.class);
-			this.attributes.setEntityProvider(new CachingMutableLocalEntityProvider<Attribute>(Attribute.class, this.em));
-
-			this.obadvice = new JPAContainer<Obadvice>(Obadvice.class);
-			this.obadvice.setEntityProvider(new CachingMutableLocalEntityProvider<Obadvice>(Obadvice.class, this.em));
-
-			this.obadviceExpressions = new JPAContainer<ObadviceExpression>(ObadviceExpression.class);
-			this.obadviceExpressions.setEntityProvider(new CachingMutableLocalEntityProvider<ObadviceExpression>(ObadviceExpression.class, this.em));
-
-			this.pipConfigurations = new JPAContainer<PIPConfiguration>(PIPConfiguration.class);
-			this.pipConfigurations.setEntityProvider(new CachingMutableLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, this.em));
-			
-			this.pipResolvers = new JPAContainer<PIPResolver>(PIPResolver.class);
-			this.pipResolvers.setEntityProvider(new CachingMutableLocalEntityProvider<PIPResolver>(PIPResolver.class, this.em));
-			//
-			// Sort our persistence data
-			//
-			logger.info("Sorting containers");
-			this.categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
-			this.datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
-			this.policyAlgorithms.sort(new String[]{"xacmlId"}, new boolean[]{true});
-			this.ruleAlgorithms.sort(new String[]{"xacmlId"}, new boolean[]{true});
-			this.functionDefinitions.sort(new String[]{"xacmlid"}, new boolean[]{true});
-			//this.functionArguments.sort(new String[]{"datatypeBean"}, new boolean[]{true});
-			//
-			// Create our special query for MatchType functions. We need a custom
-			// QueryDelegate because these functions are accessible via a View (vs a Table).
-			// The basic FreeformQuery does not work with filters on a View (via Vaadin).
-			//
-			// TODO: Consider putting this into a couple of Map's. Doing so would speed up
-			// access. However, if we want to support custom functions, then there needs to
-			// be a way for those custom functions to get into the Map. This is why a database
-			// is being used to store ALL the functions, both standard and custom.
-			//
-			logger.info("Creating SQL Queries");
-			MatchFunctionQueryDelegate delegate = new MatchFunctionQueryDelegate();
-			FreeformQuery query = new FreeformQuery("SELECT * FROM match_functions", XacmlAdminUI.pool, new String[] {});
-			query.setDelegate(delegate);
-			this.matchFunctionContainer = new SQLContainer(query);
-			//
-			// Same for this one
-			//
-			delegate = new MatchFunctionQueryDelegate();
-			query = new FreeformQuery("SELECT * FROM higherorder_bag_functions", XacmlAdminUI.pool, new String[] {});
-			query.setDelegate(delegate);
-			this.higherorderBagContainer = new SQLContainer(query);
-			//
-			// Load our PAP engine
-			//
-			logger.info("Creating PAP engine");
-			String myRequestURL = VaadinServletService.getCurrentServletRequest().getRequestURL().toString();
-			try {
-				//
-				// Set the URL for the RESTful PAP Engine
-				//
-				papEngine = new RESTfulPAPEngine(myRequestURL);
-			} catch (PAPException e  ) {
-				logger.error("Failed to create PAP engine", e);
-			} catch (Exception e) {
-				logger.error("Failed to create PAP engine", e);
-			}
-			logger.info("done creating connections");
-		} catch(Exception e) {
-			//
-			// Redirect to an error page
-			//
-			logger.error(e);
-			e.printStackTrace();
-			this.navigator.addView("", new XacmlErrorHandler(e.getMessage(), null));
-			this.navigator.navigateTo("");
-			return;
-		}
-		logger.info("Creating main layout");
-		//
-		// Create our main component layout
-		//
-		this.console = new XacmlAdminConsole();
-		this.navigator.addView("", console);
-		this.navigator.setErrorView(new XacmlErrorHandler(null, null));
-		//
-		// Navigate to our view
-		//
-		this.navigator.navigateTo("");
-		//
-		// Register to receive PAP change notifications broadcasts
-		//
-		PAPNotificationBroadcaster.register(this);
-	}
-	
-	public static void servletInit() throws ServletException {
-		//
-		// Initialize GIT repository.
-		//
-		XacmlAdminUI.initializeGitRepository();
-		//
-		// Initialize Entity Factory
-		//
-		XacmlAdminUI.initializeEntityFactory();
-		//
-		// If we get here, then the configuration information
-		// seems ok.
-		//
-	}
-
-	public static void servletDestroy() {
-		if (XacmlAdminUI.repository != null) {
-			XacmlAdminUI.repository.close();
-		}
-	}
-	
-	/**
-	 * An Update Notification has arrived from the PAP.
-	 * Tell the Vaadin users to change their data.
-	 * 
-	 * @param request
-	 * @param response
-	 * @throws ServletException
-	 * @throws IOException
-	 */
-	public static void doPAPNotification(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-		try {
-			//
-			// Notify all user instances to update groups
-			//
-			PAPNotificationBroadcaster.updateAllGroups();
-		} catch (Exception e) {
-			logger.error("Unable to process PAP request: "+e, e);
-			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
-		}
-		response.setStatus(HttpServletResponse.SC_NO_CONTENT);
-	}
-
-	// Must unregister when the UI expires
-	@Override
-	public void detach() {
-		PAPNotificationBroadcaster.unregister(this);
-		super.detach();
-	}
-	
-	/**
-	 * This will initialize the JPA Entity Manager Factory. This will determine if
-	 * the database connection settings are correct.
-	 * 
-	 * @throws ServletException
-	 */
-	private static void initializeEntityFactory() throws ServletException {
-		logger.info("intializing Persistence Entity Factory");
-		//
-		// Pull custom persistence settings
-		//
-		Properties properties;
-		try {
-			properties = XACMLProperties.getProperties();
-		} catch (IOException e) {
-			throw new ServletException(e.getMessage(), e.getCause());
-		}
-		//
-		// Create the factory
-		//
-		emf = Persistence.createEntityManagerFactory(XacmlAdminUI.PERSISTENCE_UNIT, properties);
-		//
-		// Did it get created?
-		//
-		if (emf == null) {
-			throw new ServletException("Unable to create Entity Manager Factory");
-		}
-		//
-		// Create our JDBC connection pool
-		//
-		try {
-			logger.info("intializing JDBC Connection Pool");
-			XacmlAdminUI.pool = new XacmlJDBCConnectionPool(
-					properties.getProperty(PersistenceUnitProperties.JDBC_DRIVER),
-					properties.getProperty(PersistenceUnitProperties.JDBC_URL),
-					properties.getProperty(PersistenceUnitProperties.JDBC_USER),
-					properties.getProperty(PersistenceUnitProperties.JDBC_PASSWORD));
-		} catch (SQLException e) {
-			throw new ServletException(e.getMessage(), e.getCause());
-		}
-	}
-
-	private static void initializeGitRepository() throws ServletException {
-		XacmlAdminUI.repositoryPath = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_REPOSITORY));
-		FileRepositoryBuilder builder = new FileRepositoryBuilder();
-		try {
-			XacmlAdminUI.repository = builder.setGitDir(XacmlAdminUI.repositoryPath.toFile()).readEnvironment().findGitDir().setBare().build();
-			if (Files.notExists(XacmlAdminUI.repositoryPath) || Files.notExists(Paths.get(XacmlAdminUI.repositoryPath.toString(), "HEAD"))) {
-				//
-				// Create it if it doesn't exist. As a bare repository
-				//
-				logger.info("Creating bare git repository: " + XacmlAdminUI.repositoryPath.toString());
-				XacmlAdminUI.repository.create();
-				//
-				// Add the magic file so remote works.
-				//
-				Path daemon = Paths.get(XacmlAdminUI.repositoryPath.toString(), "git-daemon-export-ok");
-				Files.createFile(daemon);					
-			}
-		} catch (IOException e) {
-			logger.error("Failed to build repository: " + repository, e);
-			throw new ServletException(e.getMessage(), e.getCause());
-		}
-		//
-		// Make sure the workspace directory is created
-		//
-		Path workspace = Paths.get(XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_WORKSPACE));
-		workspace = workspace.toAbsolutePath();
-		if (Files.notExists(workspace)) {
-			try {
-				Files.createDirectory(workspace);
-			} catch (IOException e) {
-				logger.error("Failed to build workspace: " + workspace, e);
-				throw new ServletException(e.getMessage(), e.getCause());
-			}
-		}
-		//
-		// Create the user workspace directory
-		//
-		workspace = Paths.get(workspace.toString(), "pe");
-		if (Files.notExists(workspace)) {
-			try {
-				Files.createDirectory(workspace);
-			} catch (IOException e) {
-				logger.error("Failed to create directory: " + workspace, e);
-				throw new ServletException(e.getMessage(), e.getCause());
-			}
-		}
-		//
-		// Get the path to where the repository is going to be
-		//
-		Path gitPath = Paths.get(workspace.toString(), XacmlAdminUI.repositoryPath.getFileName().toString());
-		if (Files.notExists(gitPath)) {
-			try {
-				Files.createDirectory(gitPath);
-			} catch (IOException e) {
-				logger.error("Failed to create directory: " + gitPath, e);
-				throw new ServletException(e.getMessage(), e.getCause());
-			}
-		}
-		//
-		// Initialize the domain structure
-		//
-		String base = null;
-		String domain = XacmlAdminUI.getDomain();
-		if (domain != null) {
-			for (String part : Splitter.on(':').trimResults().split(domain)) {
-				if (base == null) {
-					base = part;
-				}
-				Path subdir = Paths.get(gitPath.toString(), part);
-				if (Files.notExists(subdir)) {
-					try {
-						Files.createDirectory(subdir);
-						Files.createFile(Paths.get(subdir.toString(), ".svnignore"));
-					} catch (IOException e) {
-						logger.error("Failed to create: " + subdir, e);
-						throw new ServletException(e.getMessage(), e.getCause());
-					}
-				}
-			}
-		} else {
-			try {
-				Files.createFile(Paths.get(workspace.toString(), ".svnignore"));
-				base = ".svnignore";
-			} catch (IOException e) {
-				logger.error("Failed to create file", e);
-				throw new ServletException(e.getMessage(), e.getCause());
-			}
-		}
-		try {
-			//
-			// These are the sequence of commands that must be done initially to
-			// finish setting up the remote bare repository.
-			//
-			Git git = Git.init().setDirectory(gitPath.toFile()).setBare(false).call();
-			git.add().addFilepattern(base).call();
-			git.commit().setMessage("Initialize Bare Repository").call();
-			StoredConfig config = git.getRepository().getConfig();
-			config.setString("remote", "origin", "url", XacmlAdminUI.repositoryPath.toAbsolutePath().toString());
-			config.setString("remote", "origin", "fetch", "+refs/heads/*:refs/remotes/origin/*");
-			config.save();
-			git.push().setRemote("origin").add("master").call();
-			/*
-			 * This will not work unless git.push().setRemote("origin").add("master").call();
-			 * is called first. Otherwise it throws an exception. However, if the push() is
-			 * called then calling this function seems to add nothing.
-			 * 
-			git.branchCreate().setName("master")
-				.setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM)
-				.setStartPoint("origin/master").setForce(true).call();
-			*/
-		} catch (GitAPIException | IOException e) {
-			logger.error(e);
-			throw new ServletException(e.getMessage(), e.getCause());
-		}
-	}
-
-	/**
-	 * Initializes a user's git repository.
-	 * 
-	 * 
-	 * @param workspacePath
-	 * @param userId
-	 * @param email
-	 * @return
-	 * @throws IOException
-	 * @throws InvalidRemoteException
-	 * @throws TransportException
-	 * @throws GitAPIException
-	 */
-	private static Path initializeUserRepository(Path workspacePath, String userId, URI email) throws IOException, InvalidRemoteException, TransportException, GitAPIException {
-		Path gitPath = null;
-		//
-		// Initialize the User's Git repository
-		//
-		if (Files.notExists(workspacePath)) {
-			logger.info("Creating user workspace: " + workspacePath.toAbsolutePath().toString());
-			//
-			// Create our user's directory
-			//
-			Files.createDirectory(workspacePath);
-		}
-		gitPath = Paths.get(workspacePath.toString(), XacmlAdminUI.repositoryPath.getFileName().toString());
-		if (Files.notExists(gitPath)) {
-			//
-			// It doesn't exist yet, so Clone it and check it out
-			//
-			logger.info("Cloning user git directory: " + gitPath.toAbsolutePath().toString());
-			Git.cloneRepository().setURI(XacmlAdminUI.repositoryPath.toUri().toString())
-							.setDirectory(gitPath.toFile())
-							.setNoCheckout(false)
-							.call();
-			//
-			// Set userid
-			//
-			Git git = Git.open(gitPath.toFile());
-			StoredConfig config = git.getRepository().getConfig();
-			config.setString("user", null, "name", userId);
-			if (email != null && email.getPath() != null) {
-				config.setString("user", null, "email", email.toString());
-			}
-			config.save();
-		}
-		return gitPath;
-	}
-
-
-	public static String	getDomain() {
-		return XACMLProperties.getProperty(XACMLRestProperties.PROP_ADMIN_DOMAIN, "urn");
-	}
-	
-	public static JDBCConnectionPool	getConnectionPool() {
-		return pool;
-	}
-	
-	public SQLContainer	getMatchFunctionContainer() {
-		return this.matchFunctionContainer;
-	}
-	
-	public SQLContainer getHigherOrderBagContainer() {
-		return this.higherorderBagContainer;
-	}
-	
-	public EntityManager getEntityManager() {
-		return this.em;
-	}
-	
-	public JPAContainer<Attribute>	getAttributes() {
-		return this.attributes;
-	}
-	
-	public void refreshAttributes() {
-		this.attributes.refresh();
-		this.console.refreshAttributes();
-	}
-
-	public JPAContainer<ConstraintType>	getConstraintTypes() {
-		return this.constraintTypes;
-	}
-	
-	public JPAContainer<Category>	getCategories() {
-		return this.categories;
-	}
-	
-	public JPAContainer<Datatype>	getDatatypes() {
-		return this.datatypes;
-	}
-
-	public JPAContainer<PolicyAlgorithms> getPolicyAlgorithms() {
-		return this.policyAlgorithms;
-	}
-	
-	public JPAContainer<RuleAlgorithms> getRuleAlgorithms() {
-		return this.ruleAlgorithms;
-	}
-
-	public JPAContainer<Obadvice> getObadvice() {
-		return this.obadvice;
-	}
-
-	public JPAContainer<ObadviceExpression> getObadviceExpressions() {
-		return this.obadviceExpressions;
-	}
-	
-	public void refreshObadvice() {
-		this.obadvice.refresh();
-		this.obadviceExpressions.refresh();
-		this.console.refreshObadvice();
-	}
-
-	public JPAContainer<FunctionDefinition>	getFunctionDefinitions() {
-		return this.functionDefinitions;
-	}
-	
-	public JPAContainer<FunctionArgument> getFunctionArguments() {
-		return this.functionArguments;
-	}
-	
-	public JPAContainer<PIPConfiguration> getPIPConfigurations() {
-		return this.pipConfigurations;
-	}
-	
-	public JPAContainer<PIPResolver>	getPIPResolvers() {
-		return this.pipResolvers;
-	}
-	
-	public JPAContainer<PIPType>	getPIPTypes() {
-		return this.pipTypes;
-	}
-
-	public void refreshPIPConfiguration() {
-		this.pipConfigurations.refresh();
-		this.console.refreshPIPConfiguration();
-	}
-	
-	public Category	getDefaultCategory() throws Exception {
-		for (Object id : categories.getItemIds()) {
-			Category cat = categories.getItem(id).getEntity();
-			if (cat.getIdentifer().equals(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT)) {
-				return cat;
-			}
-		}
-		throw new Exception("There is no default category.");
-	}
-	
-	public Datatype getDefaultDatatype() throws Exception {
-		for (Object id: this.datatypes.getItemIds()) {
-			Datatype dt = this.datatypes.getItem(id).getEntity();
-			if (dt.getIdentifer().equals(XACML3.ID_DATATYPE_STRING)) {
-				return dt;
-			}
-		}
-		throw new Exception("There is no default datatype.");
-	}
-	
-	public XacmlAdminAuthorization getAuthorizer() {
-		return this.authorizer;
-	}
-	
-	public boolean	isAuthorized(AdminAction action, AdminResource resource) {
-		return this.authorizer.isAuthorized(this.getUserid(), action, resource);
-	}
-	
-	public String	getUserid() {
-		Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.id");
-		if (id == null) {
-			return XACMLProperties.getProperty("xacml.rest.admin.user.id", "guest");
-		}
-		String str = id.toString();
-		if (str == null || str.isEmpty()) {
-			return "guest";
-		}
-		return str;
-	}
-	
-	public String 	getUserName() {
-		Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.name");
-		if (id == null) {
-			return XACMLProperties.getProperty("xacml.rest.admin.user.name", "guest");
-		}
-		String str = id.toString();
-		if (str == null || str.isEmpty()) {
-			return "guest";
-		}
-		return str;
-	}
-	
-	public URI		getUserEmail() {
-		Object id = this.getSession().getSession().getAttribute("xacml.rest.admin.user.email");
-		if (id == null) {
-			return URI.create(XACMLProperties.getProperty("xacml.rest.admin.user.email", "guest"));
-		}
-		String str = id.toString();
-		if (str == null || str.isEmpty()) {
-			return null;
-		}
-		return URI.create(str);
-	}
-	
-	public Path		getUserWorkspace() {
-		return this.workspacePath;
-	}
-	
-	public Path		getUserGitPath() {
-		return this.gitPath;
-	}
-	
-	public PAPEngine	getPAPEngine() {
-		return this.papEngine;
-	}
-	
-	public String	newPolicyID() {
-		return Joiner.on(':').skipNulls().join((XacmlAdminUI.getDomain().startsWith("urn") ? null : "urn"),
-												XacmlAdminUI.getDomain().replaceAll("[/\\\\.]", ":"), 
-												"xacml", "policy", "id", UUID.randomUUID());
-	}
-
-	public String	newRuleID() {
-		return Joiner.on(':').skipNulls().join((XacmlAdminUI.getDomain().startsWith("urn") ? null : "urn"),
-												XacmlAdminUI.getDomain().replaceAll("[/\\\\.]", ":"), 
-												"xacml", "rule", "id", UUID.randomUUID());
-	}
-	//
-	// PAPNotificationBroadcaster Interface implementation
-	//
-	/**
-	 * Got a notification that the PAP has changed the PDP data,
-	 * so update ALL PDPGroups.
-	 * This is called once for each Vaadin instance for each PAP change Notification.
-	 */
-	public void updateAllGroups() {
-		access(new Runnable() {
-			@Override
-			public void run() {
-				//
-				// locking is needed to avoid race conditions.
-				// Shows up as Exception: "A connector should not be marked as dirty while a response is being written."
-				//
-				getUI().getSession().lock();
-				try {
-					//
-					// Tell the console to refresh its PDP group information
-					//
-					console.refreshPDPGroups();
-				} finally {
-					getUI().getSession().unlock();
-				}
-			}
-		});
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java
deleted file mode 100644
index dd014dd..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlErrorHandler.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.navigator.View;
-import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.VerticalLayout;
-
-public class XacmlErrorHandler extends CustomComponent implements View {
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Button buttonGo;
-
-	@AutoGenerated
-	private Label labelError;
-
-	public static String VIEWNAME="ErrorHandler.View";
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public XacmlErrorHandler(String message, String button) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		this.labelError.setValue(message);
-		if (button != null) {
-			this.buttonGo.setCaption(button);
-		} else {
-			this.buttonGo.setVisible(false);
-		}
-	}
-
-	@Override
-	public void enter(ViewChangeEvent event) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("-1px");
-		
-		// labelError
-		labelError = new Label();
-		labelError.setImmediate(false);
-		labelError.setWidth("100.0%");
-		labelError.setHeight("80px");
-		labelError.setValue("This holds error messages.");
-		mainLayout.addComponent(labelError);
-		
-		// buttonGo
-		buttonGo = new Button();
-		buttonGo.setCaption("Ok");
-		buttonGo.setImmediate(true);
-		buttonGo.setWidth("-1px");
-		buttonGo.setHeight("-1px");
-		mainLayout.addComponent(buttonGo);
-		mainLayout.setComponentAlignment(buttonGo, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java
deleted file mode 100644
index a11707d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/XacmlJDBCConnectionPool.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin;
-
-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.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.data.util.sqlcontainer.connection.JDBCConnectionPool;
-
-public class XacmlJDBCConnectionPool implements JDBCConnectionPool {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(XacmlJDBCConnectionPool.class);
-
-    private int initialConnections = 5;
-    private int maxConnections = 300;
-
-    private String driverName;
-    private String connectionUri;
-    private String userName;
-    private String password;
-
-    private transient Set<Connection> availableConnections;
-    private transient Set<Connection> reservedConnections;
-
-    private boolean initialized;
-
-    public XacmlJDBCConnectionPool(String driverName, String connectionUri, String userName, String password) throws SQLException {
-        if (driverName == null) {
-            throw new IllegalArgumentException(
-                    "JDBC driver class name must be given.");
-        }
-        if (connectionUri == null) {
-            throw new IllegalArgumentException(
-                    "Database connection URI must be given.");
-        }
-        if (userName == null) {
-            throw new IllegalArgumentException(
-                    "Database username must be given.");
-        }
-        if (password == null) {
-            throw new IllegalArgumentException(
-                    "Database password must be given.");
-        }
-        this.driverName = driverName;
-        this.connectionUri = connectionUri;
-        this.userName = userName;
-        this.password = password;
-
-        /* Initialize JDBC driver */
-        try {
-            Class.forName(driverName).newInstance();
-        } catch (Exception ex) {
-            throw new RuntimeException("Specified JDBC Driver: " + driverName
-                    + " - initialization failed.", ex);
-        }
-    }
-
-    public XacmlJDBCConnectionPool(String driverName, String connectionUri,
-            String userName, String password, int initialConnections,
-            int maxConnections) throws SQLException {
-        this(driverName, connectionUri, userName, password);
-        this.initialConnections = initialConnections;
-        this.maxConnections = maxConnections;
-    }
-
-    private void initializeConnections() throws SQLException {
-        availableConnections = new HashSet<Connection>(initialConnections);
-        reservedConnections = new HashSet<Connection>(initialConnections);
-        for (int i = 0; i < initialConnections; i++) {
-            availableConnections.add(createConnection());
-        }
-        initialized = true;
-    }
-
-    @Override
-    public synchronized Connection reserveConnection() throws SQLException {
-        if (!initialized) {
-            initializeConnections();
-        }
-        Connection c = null;
-        do {
-	        if (availableConnections.isEmpty()) {
-	            if (reservedConnections.size() < maxConnections) {
-	            	logger.info("creating new connection");
-	                availableConnections.add(createConnection());
-	            } else {
-	                throw new SQLException("Connection limit has been reached.");
-	            }
-	        }
-	        //
-	        // Get first available
-	        //
-	        c = availableConnections.iterator().next();
-	        //
-	        // It is still valid?
-	        //
-	        if (!this.isValid(c)) {
-	        	try {
-	        		logger.warn("Removing invalid connection.");
-		        	//
-		        	// No close it
-		        	//
-	        		c.close();
-	        		//
-	        		// Remove from our list
-	        		//
-	        		this.availableConnections.remove(c);
-	        		//
-	        		// Try again
-	        		//
-	        		c = null;
-	        	} catch (SQLException e) { // NOPMD
-	        		// If removing the connection fails, ignore
-	        	}
-	        } else {
-	        	//
-	        	// Yes
-	        	//
-		        availableConnections.remove(c);
-	        	break;
-	        }
-        } while (c == null);
-        //
-        // Add it to our reserved list
-        //
-        reservedConnections.add(c);
-        return c;
-    }
-
-    @Override
-    public synchronized void releaseConnection(Connection conn) {
-        if (conn == null || !initialized) {
-            return;
-        }
-        /* Try to roll back if necessary */
-        try {
-            if (!conn.getAutoCommit()) {
-                conn.rollback();
-            }
-        } catch (SQLException e) {
-            /* Roll back failed, close and discard connection */
-            try {
-                conn.close();
-            } catch (SQLException e1) { // NOPMD
-                /* Nothing needs to be done */
-            }
-            reservedConnections.remove(conn);
-            return;
-        }
-        reservedConnections.remove(conn);
-        availableConnections.add(conn);
-    }
-
-    private Connection createConnection() throws SQLException {
-        Connection c = DriverManager.getConnection(connectionUri, userName,
-                password);
-        c.setAutoCommit(false);
-        if (driverName.toLowerCase().contains("mysql")) {
-            try {
-                Statement s = c.createStatement();
-                s.execute("SET SESSION sql_mode = 'ANSI'");
-                s.close();
-            } catch (Exception e) { // NOPMD
-                // Failed to set ansi mode; continue
-            }
-        }
-        return c;
-    }
-
-    @Override
-    public void destroy() {
-        for (Connection c : availableConnections) {
-            try {
-                c.close();
-            } catch (SQLException e) { // NOPMD
-                // No need to do anything
-            }
-        }
-        for (Connection c : reservedConnections) {
-            try {
-                c.close();
-            } catch (SQLException e) { // NOPMD
-                // No need to do anything
-            }
-        }
-
-    }
-
-    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
-        initialized = false;
-        out.defaultWriteObject();
-    }
-
-	private final boolean isValid(final Connection con) throws SQLException {
-		final String bogusQuery = "SELECT 1";
-		
-		try (Statement st = con.createStatement(); ResultSet res = st.executeQuery(bogusQuery)) {
-			return true;
-		} catch (final SQLException sqlx) {
-			return false;
-		}
-	}
-
-	@Override
-	public String toString() {
-		return "XacmlJDBCConnectionPool [initialConnections="
-				+ initialConnections + ", maxConnections=" + maxConnections
-				+ ", driverName=" + driverName + ", connectionUri="
-				+ connectionUri + ", userName=" + userName + ", password="
-				+ password + ", initialized=" + initialized + "]";
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java
deleted file mode 100644
index f0069a7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/AttributeDictionary.java
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.view.windows.AttributeEditorWindow;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Container.Filter;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class AttributeDictionary extends CustomComponent {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table table;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-	@AutoGenerated
-	private ComboBox comboBoxFilterDatatype;
-	@AutoGenerated
-	private ComboBox comboBoxFilterCategory;
-	@AutoGenerated
-	private Button buttonClone;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonNew;
-	private static final long serialVersionUID = 4553719412188869190L;
-	private static final Log logger	= LogFactory.getLog(AttributeDictionary.class);
-	private static final Object[] visibleColumns = new Object[] { "xacmlId", "description", "categoryBean", "datatypeBean", "constraintType", "modifiedBy", "modifiedDate", "createdBy", "createdDate"};
-	private static final String[] columnHeaders = new String[] { "Attribute ID", "Description", "Category", "DataType", "Constraint", "Modified By", "Modified Date", "Created By", "Created Date"};
-	
-	private AttributeDictionary self = this;
-
-	private final JPAContainer<Attribute> attributes = new JPAContainer<Attribute>(Attribute.class);
-	private final JPAContainer<Category> categories = new JPAContainer<Category>(Category.class);
-	private final JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class);
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeDictionary() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Finish initializing the container
-		//
-		boolean isReadOnly;
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_WRITE, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) {
-			if (logger.isDebugEnabled()) {
-				logger.debug("write access");
-			}
-			//
-			// Make it mutable
-			//
-			isReadOnly = false;
-			this.attributes.setEntityProvider(new CachingMutableLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		} else {
-			if (logger.isDebugEnabled()) {
-				logger.debug("read access");
-			}
-			//
-			// Make it read-only
-			//
-			isReadOnly = true;
-			this.attributes.setEntityProvider(new CachingLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		}
-		this.categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		this.categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
-		this.datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		this.datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
-		//
-		// Initialize
-		//
-		this.initializeTable(isReadOnly);
-		this.initializeButtons(isReadOnly);
-		this.initializeCategoryComboFilter();
-		this.initializeDatatypeComboFilter();
-	}
-	
-	protected void initializeTable(boolean isReadOnly) {
-		//
-		// This is the data source
-		//
-		this.table.setContainerDataSource(this.attributes);
-		//
-		// Setup table
-		//
-		this.table.setVisibleColumns(visibleColumns);
-		this.table.setColumnHeaders(columnHeaders);
-		this.table.setImmediate(true);
-		this.table.setColumnCollapsingAllowed(true);
-		//
-		// Read only?
-		//
-		if (isReadOnly) {
-			if (logger.isDebugEnabled()) {
-				logger.debug("read only table");
-			}
-			return;
-		}
-		this.table.setSelectable(true);
-		//
-		// Respond to clicks
-		//
-		this.table.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					//
-					// Create our editor window
-					//
-					final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(self.attributes.getItem(event.getItemId()));
-					attributeEditor.setCaption("Edit Attribute");
-					attributeEditor.setModal(true);
-					attributeEditor.center();
-					UI.getCurrent().addWindow(attributeEditor);
-				}
-			}
-		});
-		//
-		// Respond to selections
-		//
-		this.table.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object value = self.table.getValue();
-				if (value == null) {
-					self.buttonRemove.setEnabled(false);
-					self.buttonClone.setEnabled(false);
-				} else {
-					self.buttonRemove.setEnabled(true);
-					self.buttonClone.setEnabled(true);
-				}
-			}
-		});
-	}
-	
-	protected void initializeButtons(boolean isReadOnly) {
-		if (isReadOnly) {
-			this.buttonNew.setVisible(false);
-			this.buttonRemove.setVisible(false);
-			this.buttonClone.setVisible(false);
-			return;
-		}
-		this.buttonNew.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				AttributeDictionary.createNewAttributeWindow();
-			}
-			
-		});
-		
-		this.buttonRemove.setEnabled(false);
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Get the selected item
-				//
-				Object id = self.table.getValue();
-				//
-				// Sanity check
-				//
-				if (id == null) {
-					return;
-				}
-				//
-				// Remove the attribute
-				//
-				self.attributes.removeItem(id);
-				//
-				// Unfortunately, removing the item does NOT result
-				// in a ValueChange event being generated. So we must
-				// trigger it ourselves.
-				//
-				self.table.select(self.table.getNullSelectionItemId());
-			}	
-		});
-		
-		this.buttonClone.setEnabled(false);
-		this.buttonClone.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object id = self.table.getValue();
-				if (id == null) {
-					return;
-				}
-				Item item = self.table.getItem(id);
-				if (item instanceof EntityItem) {
-					@SuppressWarnings("unchecked")
-					//
-					// Get the entity
-					//
-					EntityItem<Attribute> entityItem = (EntityItem<Attribute>) item;
-					//
-					// Clone it
-					//
-					Attribute newAttribute = new Attribute(entityItem.getEntity(), ((XacmlAdminUI)UI.getCurrent()).getUserid());
-					//
-					// Add it to the database
-					//
-					id = self.attributes.addEntity(newAttribute);
-					//
-					// Now select it
-					//
-					self.table.select(id);
-					//
-					// Refresh it to get the latest modified date
-					//
-					self.attributes.refreshItem(id);
-				}
-			}
-		});
-	}
-
-	protected void initializeCategoryComboFilter() {
-		//
-		// Set data source
-		//
-		this.comboBoxFilterCategory.setContainerDataSource(self.categories);
-		this.comboBoxFilterCategory.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxFilterCategory.setItemCaptionPropertyId("xacmlId");
-		//
-		// Initialize GUI properties
-		//
-		this.comboBoxFilterCategory.setNullSelectionAllowed(true);
-		this.comboBoxFilterCategory.setImmediate(true);
-		//
-		// Respond to value changes
-		//
-		this.comboBoxFilterCategory.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-			Filter currentFilter = null;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Remove filter
-				//
-				if (currentFilter != null) {
-					self.attributes.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Set the new one
-				//
-				Object id = self.comboBoxFilterCategory.getValue();
-				if (id == null) {
-					return;
-				}
-				Category cat = self.categories.getItem(id).getEntity();
-				this.currentFilter = new Compare.Equal("categoryBean", cat);
-				self.attributes.addContainerFilter(this.currentFilter);
-			}
-		});
-	}
-	
-	protected void initializeDatatypeComboFilter() {
-		//
-		// Set data source
-		//
-		this.comboBoxFilterDatatype.setContainerDataSource(self.datatypes);
-		this.comboBoxFilterDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxFilterDatatype.setItemCaptionPropertyId("xacmlId");
-		//
-		// Initialize GUI properties
-		//
-		this.comboBoxFilterDatatype.setNullSelectionAllowed(true);
-		this.comboBoxFilterDatatype.setImmediate(true);
-		//
-		// Respond to value changes
-		//
-		this.comboBoxFilterDatatype.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-			Filter currentFilter = null;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Remove filter
-				//
-				if (currentFilter != null) {
-					self.attributes.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Set the new one
-				//
-				Object id = self.comboBoxFilterDatatype.getValue();
-				if (id == null) {
-					return;
-				}
-				Datatype cat = self.datatypes.getItem(id).getEntity();
-				this.currentFilter = new Compare.Equal("datatypeBean", cat);
-				self.attributes.addContainerFilter(this.currentFilter);
-			}
-		});
-	}
-	
-	public void refreshContainer() {
-		this.attributes.refresh();
-		this.categories.refresh();
-		this.datatypes.refresh();
-	}
-	
-	public static void createNewAttributeWindow() {
-		//
-		// Create our new attribute
-		//
-		String domain = XacmlAdminUI.getDomain();
-		String userid = ((XacmlAdminUI)UI.getCurrent()).getUserid();
-		final Attribute newAttribute = new Attribute(domain, userid);
-		try {
-			newAttribute.setCategoryBean(((XacmlAdminUI)UI.getCurrent()).getDefaultCategory());
-			newAttribute.setDatatypeBean(((XacmlAdminUI)UI.getCurrent()).getDefaultDatatype());
-		} catch (Exception e) {
-			logger.error(e);
-			return;
-		}
-		//
-		// Create our editor window
-		//
-		final AttributeEditorWindow attributeEditor = new AttributeEditorWindow(((XacmlAdminUI)UI.getCurrent()).getAttributes().createEntityItem(newAttribute));
-		attributeEditor.setCaption("Add New Attribute");
-		attributeEditor.setModal(true);
-		attributeEditor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user hit save?
-				//
-				if (attributeEditor.isSaved()) {
-					//
-					// Add the new attribute
-					//
-					((XacmlAdminUI)UI.getCurrent()).getAttributes().addEntity(newAttribute);
-					((XacmlAdminUI)UI.getCurrent()).refreshAttributes();
-				}
-			}
-			
-		});
-		attributeEditor.center();
-		UI.getCurrent().addWindow(attributeEditor);
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		
-		// table
-		table = new Table();
-		table.setImmediate(false);
-		table.setWidth("100.0%");
-		table.setHeight("-1px");
-		mainLayout.addComponent(table);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(false);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// buttonNew
-		buttonNew = new Button();
-		buttonNew.setCaption("New");
-		buttonNew.setImmediate(true);
-		buttonNew.setDescription("Create a new attribute");
-		buttonNew.setWidth("70px");
-		buttonNew.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonNew);
-		horizontalLayoutToolbar.setComponentAlignment(buttonNew, new Alignment(
-				9));
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove");
-		buttonRemove.setImmediate(true);
-		buttonRemove.setDescription("Remove the selected attribute(s)");
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonRemove);
-		horizontalLayoutToolbar.setComponentAlignment(buttonRemove,
-				new Alignment(9));
-		
-		// buttonClone
-		buttonClone = new Button();
-		buttonClone.setCaption("Clone");
-		buttonClone.setImmediate(true);
-		buttonClone.setDescription("Clone an attribute.");
-		buttonClone.setWidth("-1px");
-		buttonClone.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonClone);
-		horizontalLayoutToolbar.setComponentAlignment(buttonClone,
-				new Alignment(9));
-		
-		// comboBoxFilterCategory
-		comboBoxFilterCategory = new ComboBox();
-		comboBoxFilterCategory.setCaption("Filter By Category");
-		comboBoxFilterCategory.setImmediate(false);
-		comboBoxFilterCategory.setWidth("-1px");
-		comboBoxFilterCategory.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(comboBoxFilterCategory);
-		
-		// comboBoxFilterDatatype
-		comboBoxFilterDatatype = new ComboBox();
-		comboBoxFilterDatatype.setCaption("Filter By Data Type");
-		comboBoxFilterDatatype.setImmediate(false);
-		comboBoxFilterDatatype.setWidth("-1px");
-		comboBoxFilterDatatype.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(comboBoxFilterDatatype);
-		
-		return horizontalLayoutToolbar;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java
deleted file mode 100644
index 1b1edd4..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/ObadviceDictionary.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.view.windows.ObadviceEditorWindow;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class ObadviceDictionary extends CustomComponent {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table table;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-	@AutoGenerated
-	private ComboBox comboBoxFilter;
-	@AutoGenerated
-	private Button buttonClone;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonNew;
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(ObadviceDictionary.class);
-	private final ObadviceDictionary self = this;
-	
-	private static final Object[] visibleColumns = new Object[] { "type", "xacmlId", "description", "fulfillOn", "modifiedBy", "modifiedDate", "createdBy", "createdDate"};
-	private static final String[] columnHeaders = new String[] { "Type", "Attribute ID", "Description", "FulFill/Apply", "Modified By", "Modified Date", "Created By", "Created Date"};
-	
-	private final JPAContainer<Obadvice>	obadvice  = new JPAContainer<Obadvice>(Obadvice.class);
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param jpaContainer 
-	 */
-	public ObadviceDictionary() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Setup container
-		//
-		boolean isReadOnly;
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_WRITE, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_DICTIONARIES)) {
-			if (logger.isDebugEnabled()) {
-				logger.debug("write access");
-			}
-			isReadOnly = false;
-			this.obadvice.setEntityProvider(new CachingMutableLocalEntityProvider<Obadvice>(Obadvice.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		} else {
-			if (logger.isDebugEnabled()) {
-				logger.debug("read only access");
-			}
-			isReadOnly = true;
-			this.obadvice.setEntityProvider(new CachingLocalEntityProvider<Obadvice>(Obadvice.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		}
-		//
-		// initialize
-		//
-		this.initializeTable(isReadOnly);
-		this.initializeButtons(isReadOnly);
-		this.initializeCombo();
-	}
-	
-	protected void initializeTable(boolean isReadOnly) {
-		//
-		// Set our container
-		//
-		this.table.setContainerDataSource(this.obadvice);
-		//
-		// Initialize GUI properties
-		//
-		this.table.setVisibleColumns(visibleColumns);
-		this.table.setColumnHeaders(columnHeaders);
-		this.table.setImmediate(true);
-		this.table.setColumnCollapsingAllowed(true);
-		//
-		// Is read only
-		//
-		if (isReadOnly) {
-			return;
-		}
-		this.table.setSelectable(true);
-		//
-		// Respond to selections
-		//
-		this.table.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.buttonRemove.setEnabled(self.table.getValue() != null);
-				self.buttonClone.setEnabled(self.table.getValue() != null);
-			}			
-		});
-	}
-	
-	protected void initializeButtons(boolean isReadOnly) {
-		if (isReadOnly) {
-			this.buttonNew.setVisible(false);
-			this.buttonRemove.setVisible(false);
-			this.buttonClone.setVisible(false);
-			return;
-		}
-		//
-		// NEW button
-		//
-		this.buttonNew.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Create window
-				//
-				String domain = XacmlAdminUI.getDomain();
-				String userid = ((XacmlAdminUI)UI.getCurrent()).getUserid();
-				final Obadvice oa = new Obadvice(domain, userid);
-				final EntityItem<Obadvice> entity = self.obadvice.createEntityItem(oa);
-				final ObadviceEditorWindow editor = new ObadviceEditorWindow(entity);
-				editor.setCaption("Add New Obligation/Advice");
-				editor.setCloseShortcut(KeyCode.ESCAPE);
-				editor.setModal(true);
-				editor.addCloseListener(new CloseListener() {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public void windowClose(CloseEvent e) {
-						if (editor.isSaved()) {
-							self.obadvice.addEntity(oa);
-							logger.info("Added new obligation/advice: " + oa);
-						}
-					}
-				});
-				editor.center();
-				UI.getCurrent().addWindow(editor);
-			}
-		});
-		//
-		// Disable remove/clone buttons to start
-		//
-		this.buttonRemove.setEnabled(false);
-		this.buttonClone.setEnabled(false);
-		//
-		// REMOVE button
-		//
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.obadvice.removeItem(self.table.getValue());
-			}
-		});
-		//
-		// CLONE button
-		//
-		this.buttonClone.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				// TODO
-			}
-		});
-	}
-	
-	protected void initializeCombo() {
-		//
-		// Add filter values
-		//
-		this.comboBoxFilter.addItem(Obadvice.OBLIGATION);
-		this.comboBoxFilter.addItem(Obadvice.ADVICE);
-		//
-		// Initialize GUI properties
-		//
-		this.comboBoxFilter.setImmediate(true);
-		this.comboBoxFilter.setNullSelectionAllowed(true);
-		//
-		//
-		this.comboBoxFilter.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Remove filters
-				//
-				self.obadvice.removeAllContainerFilters();
-				//
-				// What was selected?
-				//
-				Object id = self.comboBoxFilter.getValue();
-				if (id != null) {
-					//
-					// Add filter
-					//
-					if (id.equals(Obadvice.OBLIGATION)) {
-						self.obadvice.addContainerFilter(new Compare.Equal("type", Obadvice.OBLIGATION));
-					} else if (id.equals(Obadvice.ADVICE)) {
-						self.obadvice.addContainerFilter(new Compare.Equal("type", Obadvice.ADVICE));
-					}
-				}
-			}
-		});
-	}
-
-	public void refreshContainer() {
-		this.obadvice.refresh();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("-1px");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		
-		// table
-		table = new Table();
-		table.setImmediate(true);
-		table.setWidth("-1px");
-		table.setHeight("-1px");
-		mainLayout.addComponent(table);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(false);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// buttonNew
-		buttonNew = new Button();
-		buttonNew.setCaption("New");
-		buttonNew.setImmediate(true);
-		buttonNew
-				.setDescription("Add a new advice or obligation to the dictionary.");
-		buttonNew.setWidth("-1px");
-		buttonNew.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonNew);
-		horizontalLayoutToolbar.setComponentAlignment(buttonNew, new Alignment(
-				24));
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove");
-		buttonRemove.setImmediate(true);
-		buttonRemove
-				.setDescription("Remove the selected advice or obligation from the dictionary.");
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonRemove);
-		horizontalLayoutToolbar.setComponentAlignment(buttonRemove,
-				new Alignment(24));
-		
-		// buttonClone
-		buttonClone = new Button();
-		buttonClone.setCaption("Clone");
-		buttonClone.setImmediate(true);
-		buttonClone.setDescription("Clone the selected obligation/advice.");
-		buttonClone.setWidth("-1px");
-		buttonClone.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonClone);
-		horizontalLayoutToolbar.setComponentAlignment(buttonClone,
-				new Alignment(24));
-		
-		// comboBoxFilter
-		comboBoxFilter = new ComboBox();
-		comboBoxFilter.setCaption("Filter By Type");
-		comboBoxFilter.setImmediate(false);
-		comboBoxFilter.setWidth("-1px");
-		comboBoxFilter.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(comboBoxFilter);
-		
-		return horizontalLayoutToolbar;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java
deleted file mode 100644
index 56fd9cd..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PDPManagement.java
+++ /dev/null
@@ -1,862 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.vaadin.dialogs.ConfirmDialog;
-import org.vaadin.dialogs.ConfirmDialog.ContentMode;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.model.PDPContainer;
-import org.apache.openaz.xacml.admin.model.PDPGroupContainer;
-import org.apache.openaz.xacml.admin.model.PDPPIPContainer;
-import org.apache.openaz.xacml.admin.model.PDPPolicyContainer;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.view.windows.EditPDPGroupWindow;
-import org.apache.openaz.xacml.admin.view.windows.EditPDPWindow;
-import org.apache.openaz.xacml.admin.view.windows.PDPStatusWindow;
-import org.apache.openaz.xacml.admin.view.windows.SelectPDPGroupWindow;
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PAPException;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPGroupStatus;
-import org.apache.openaz.xacml.api.pap.PDPStatus;
-import org.apache.openaz.xacml.std.pap.StdPDPGroup;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.Table.ColumnGenerator;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-
-public class PDPManagement extends CustomComponent {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Table table;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-
-	@AutoGenerated
-	private Button buttonRemove;
-
-	@AutoGenerated
-	private Button buttonCreate;
-
-	private static final long serialVersionUID = 1L;
-	private final PDPManagement self = this;
-	private static final Log logger	= LogFactory.getLog(PDPManagement.class);
-	
-	private PDPGroupContainer container;
-	
-	private static final Action CREATE_GROUP = 	new Action ("Create Group");
-	private static final Action REPAIR_GROUP = 	new Action ("Repair Group");
-	private static final Action EDIT_GROUP = 	new Action ("Edit Group");
-	private static final Action DELETE_GROUP = 	new Action ("Delete Group");
-	private static final Action SYNCHRONIZE = 	new Action ("Synchronize");
-	private static final Action MAKE_DEFAULT = 	new Action ("Make Default");
-	private static final Action CREATE_PDP = 	new Action ("Create PDP");
-	private static final Action EDIT_PDP = 		new Action ("Edit PDP");
-	private static final Action DELETE_PDP = 	new Action ("Delete PDP");
-	private static final Action MOVE_PDP = 		new Action ("Move PDP");
-	private static final Action GET_PDP_STATUS = new Action ("View Status");
-	
-	private PAPEngine papEngine;
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PDPManagement(PAPEngine engine) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Initialize
-		//
-		this.papEngine = engine;
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// setup the buttons
-		//
-		this.setupButtons();
-	}
-	
-	protected void initialize() {
-		//
-		// Don't create a container if the engine doesn't exist
-		//
-		if (this.papEngine == null) {
-			//
-			// remove all the components
-			//
-			this.mainLayout.removeAllComponents();
-			//
-			// Add a label
-			//
-			this.mainLayout.addComponent(new Label("PDP Management unavailable - PAP servlet unavailable."));
-			//
-			// done
-			//
-			return;
-		}
-		//
-		// Create our container
-		//
-		this.container = new PDPGroupContainer(this.papEngine);
-		//
-		// Determine authorization level
-		//
-		boolean isAdmin = ((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_ADMIN, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN);
-		try {
-			this.initializeTree(isAdmin);
-			this.initializeButtons(isAdmin);
-		} catch (Exception e) {
-			logger.error("UNABLE TO START PDPManagement: " + e, e);
-			// check if PAP servlet is up
-			try {
-				Set<PDPGroup> groups = this.papEngine.getPDPGroups();
-				if (groups == null) {
-					throw new PAPException("PAP not running");
-				}
-			} catch (PAPException | NullPointerException e1) {
-				setCompositionRoot(new Label("Cannot use PDP Management because the PAP servlet was not running when Admin Console Servlet first initialized."));
-				return;
-			}
-			setCompositionRoot(new Label("Cannot use PDP Management because of error during initialization: " + e.getMessage()));
-		}
-	}
-	
-	protected void initializeTree(final boolean isAdmin) {
-		//
-		// Set the data source
-		//
-		this.table.setContainerDataSource(this.container);
-		//
-		// Setup the GUI properties
-		//
-		this.table.setVisibleColumns("Name", "Description", "Status", "Default", "PDPs", "Policies", "PIP Configurations");
-		this.table.setColumnHeaders("Name", "Description", "Status", "Default", "PDP's", "Policies", "PIP Configurations");
-		//
-		// The description should be a text area
-		//
-		this.table.addGeneratedColumn("Description", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				TextArea area = new TextArea();
-				area.setValue(((PDPGroup) itemId).getDescription());
-				area.setReadOnly(true);
-				return area;
-			}
-			
-		});
-		//
-		// Generate a GUI element for the PDP's
-		//
-		this.table.addGeneratedColumn("PDPs", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-	        	final Table table = new Table();
-	        	final PDPContainer container = new PDPContainer((PDPGroup) itemId);
-	        	//
-	        	// Setup the container data
-	        	//
-	        	table.setContainerDataSource(container);
-	        	//
-	        	// Save the group for easy access
-	        	//
-	        	table.setData(itemId);
-	        	//
-	        	// GUI properties
-	        	//
-	        	table.setPageLength(table.getContainerDataSource().size() + 2);
-	        	table.setVisibleColumns("Name", "Status", "Description");
-				table.setColumnCollapsingAllowed(true);
-				table.setColumnCollapsed("Description", true);
-				table.setWidth("100%");
-				//
-				// If an admin, then it is editable
-				//
-				if (isAdmin) {
-					//
-					// Set it as selectable
-					//
-					table.setSelectable(true);
-					//
-					// Add actions
-					//
-					table.addActionHandler(new Handler() {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public Action[] getActions(Object target, Object sender) {
-							if (target == null) {
-								return new Action[] {CREATE_PDP};
-							}
-							if (target instanceof PDP) {
-								if (self.container.size() > 1) {
-									return new Action[] {EDIT_PDP, GET_PDP_STATUS, MOVE_PDP, DELETE_PDP};
-								} else {
-									return new Action[] {EDIT_PDP, GET_PDP_STATUS, DELETE_PDP};
-								}
-							}
-							return null;
-						}
-
-						@Override
-						public void handleAction(Action action, Object sender, Object target) {
-							if (action == CREATE_PDP) {
-								self.editPDP(null, (PDPGroup) table.getData());
-								return;
-							}
-							if (action == EDIT_PDP) {
-								assert target instanceof PDP;
-								self.editPDP((PDP) target, (PDPGroup) table.getData());
-								return;
-							}
-							if (action == MOVE_PDP) {
-								assert target instanceof PDP;
-								self.movePDP((PDP) target, (PDPGroup) table.getData());
-								return;
-							}
-							if (action == DELETE_PDP) {
-								assert target instanceof PDP;
-								self.deletePDP((PDP) target, (PDPGroup) table.getData());
-								return;
-							}
-							if (action == GET_PDP_STATUS) {
-								assert target instanceof PDP;
-								self.getPDPStatus((PDP) target, (PDPGroup) table.getData());
-							}
-						}
-					});
-					//
-					// Respond to events
-					//
-					table.addItemClickListener(new ItemClickListener() {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public void itemClick(ItemClickEvent event) {
-							if (event.isDoubleClick()) {
-								self.editPDP((PDP) event.getItemId(), (PDPGroup) table.getData());
-							}
-						}
-					});
-				}
-	        	return table;
-			}
-		});
-		//
-		// Generate a GUI element for the policies
-		//
-		this.table.addGeneratedColumn("Policies", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-	        	Table table = new Table();
-	        	table.setContainerDataSource(new PDPPolicyContainer((PDPGroup) itemId));
-	        	table.setPageLength(table.getContainerDataSource().size() + 2);
-
-	        	table.setVisibleColumns("Root", "Name", "Version", "Description");
-				table.setColumnCollapsingAllowed(true);
-				table.setColumnCollapsed("Description", true);
-
-				table.setWidth("100%");
-
-	        	return table;
-			}
-		});
-		//
-		// Generate a GUI element for the PIP configurations
-		//
-		this.table.addGeneratedColumn("PIP Configurations", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-	        	Table table = new Table();
-				if (itemId instanceof PDPGroup) {
-		        	table.setContainerDataSource(new PDPPIPContainer((PDPGroup) itemId));
-		        	table.setPageLength(table.getContainerDataSource().size() + 2);
-				}
-				if (itemId instanceof PDP) {
-		        	table.setContainerDataSource(new PDPPIPContainer((PDP) itemId));
-		        	table.setVisible(false);
-		        	table.setPageLength(0);
-				}
-				table.setVisibleColumns("Name", "Description");
-				table.setColumnCollapsingAllowed(true);
-				table.setColumnCollapsed("Description", true);
-				
-				table.setWidth("100%");
-
-	        	return table;
-			}
-		});
-		//
-		// Check the user's authorization level
-		//
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_ADMIN, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_PDP_ADMIN)) {
-			this.table.setSelectable(true);
-		} else {
-			if (logger.isDebugEnabled()) {
-				logger.debug("No admin access to pdp management");
-			}
-			return;
-		}
-		//
-		// Setup Action Handlers
-		//
-		this.table.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					//
-					// Nothing is selected, they right-clicked empty space.
-					// Only one action.
-					//
-					return new Action[] {CREATE_GROUP};
-				}
-				if (target instanceof PDPGroup) {
-					List<Action> actions = new ArrayList<Action>();
-					PDPGroupStatus.Status status = ((PDPGroup)target).getStatus().getStatus();
-					if (status == PDPGroupStatus.Status.LOAD_ERRORS) {
-						actions.add(REPAIR_GROUP);
-					}
-					if (((PDPGroup)target).isDefaultGroup() == false) {
-						actions.add(MAKE_DEFAULT);
-					}
-					actions.add(EDIT_GROUP);
-					if (status == PDPGroupStatus.Status.OUT_OF_SYNCH) {
-						actions.add(SYNCHRONIZE);
-					}
-					if (((PDPGroup)target).isDefaultGroup() == false) {
-						actions.add(DELETE_GROUP);
-					}
-					actions.add(CREATE_PDP);
-					// Throws a class cast exception
-//					return (Action[]) actions.toArray();
-					Action[] actions2 = new Action[actions.size()];
-					int index = 0;
-					for (Action a : actions) {
-						actions2[index++] = a;
-					}
-					return actions2;
-				}
-				return null;
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == CREATE_GROUP) {
-					self.editPDPGroup(null);
-					return;
-				}
-				if (action == EDIT_GROUP) {
-					assert target instanceof PDPGroup;
-					self.editPDPGroup((PDPGroup) target);
-					return;
-				}
-				if (action == DELETE_GROUP) {
-					self.deleteGroup((PDPGroup) target);
-					return;
-				}
-				if (action == REPAIR_GROUP) {
-					if (target instanceof PDPGroup) {
-						((PDPGroup) target).repair();
-					} else {
-						String message = "Action '" + REPAIR_GROUP.getCaption() + "' called on non-group target '" + target + "'";
-						logger.error(message);
-						AdminNotification.error(message);
-					}
-					return;
-				}
-				if (action == MAKE_DEFAULT) {
-					if (target instanceof PDPGroup) {
-						try {
-							self.container.makeDefault((PDPGroup) target);
-						} catch (Exception e) {
-							AdminNotification.error("Make Default failed. Reason:\n" + e.getMessage());
-						}
-					} else {
-						String message = "Action '" + MAKE_DEFAULT.getCaption() + "' called on non-group target '" + target + "'";
-						logger.error(message);
-						AdminNotification.error(message);
-					}
-					return;
-				}
-				if (action == SYNCHRONIZE) {
-					if (target instanceof PDPGroup) {
-logger.error("SYNCHRONIZE NOT YET IMPLMENTED");
-AdminNotification.error("Synchronize not yet implemented");
-					} else {
-						String message = "Action '" + SYNCHRONIZE.getCaption() + "' called on non-group target '" + target + "'";
-						logger.error(message);
-						AdminNotification.error(message);
-					}
-					return;
-				}
-				if (action == CREATE_PDP) {
-					if (target instanceof PDPGroup) {
-						self.editPDP(null, ((PDPGroup)target));
-					} else {
-						String message = "Action '" + CREATE_PDP.getCaption() + "' called on non-group target '" + target + "'";
-						logger.error(message);
-						AdminNotification.error(message);
-					}
-					return;
-				}
-			}
-		});
-		//
-		// Listen for item change notifications
-		//
-		this.table.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					assert event.getItemId() instanceof PDPGroup;
-					self.editPDPGroup((PDPGroup) event.getItemId());
-				}
-			}
-		});
-		//
-		// Respond to selection events
-		//
-		this.table.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object id = self.table.getValue();
-				if (id == null) {
-					self.buttonRemove.setEnabled(false);
-				} else {
-					//
-					// Make sure its not the default group
-					//
-					if (((PDPGroup) id).isDefaultGroup()) {
-						self.buttonRemove.setEnabled(false);
-					} else {
-						self.buttonRemove.setEnabled(true);
-					}
-				}
-			}
-		});
-		//
-		// Maximize the table
-		//
-		this.table.setSizeFull();
-	}
-	
-	protected void initializeButtons(final boolean isAdmin) {
-		if (isAdmin == false) {
-			return;
-		}
-		this.buttonCreate.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.editPDPGroup(null);
-			}
-		});
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object id = self.table.getValue();
-				assert id != null;
-				assert id instanceof PDPGroup;
-				self.deleteGroup((PDPGroup) id);
-				self.table.select(self.table.getNullSelectionItemId());
-			}
-		});
-	}
-	
-	protected void setupButtons() {
-		if (this.table.getValue() == null) {
-			this.buttonRemove.setEnabled(false);
-		} else {
-			this.buttonRemove.setEnabled(true);
-		}		
-	}
-		
-	protected void editPDP(final PDP pdp, final PDPGroup group) {
-		final EditPDPWindow editor = new EditPDPWindow(pdp, this.container.getGroups());
-		if (pdp == null) {
-			editor.setCaption("Create New PDP");
-		} else {
-			editor.setCaption("Edit PDP " + pdp.getId());
-		}
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				if (editor.isSaved() == false) {
-					return;
-				}
-				try {
-					//
-					// Adding a new PDP?
-					//
-					if (pdp == null) {
-						//
-						// Yes tell the container to add it
-						//
-						self.container.addNewPDP(editor.getPDPId(), group, editor.getPDPName(), editor.getPDPDescription());
-					} else {
-						//
-						// No tell the container to update it
-						//
-						pdp.setName(editor.getPDPName());
-						pdp.setDescription(editor.getPDPDescription());
-						self.container.updatePDP(pdp);
-					}
-				} catch (Exception e) {
-					String message = "Unable to create PDP.  Reason:\n" + e.getMessage();
-					logger.error(message);
-					AdminNotification.error(message);
-				}
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-	
-	protected void editPDPGroup(final PDPGroup group) {
-		//
-		// copy the group
-		//
-		final StdPDPGroup copyGroup = (group == null ? null : new StdPDPGroup(group));
-		//
-		//
-		//
-		final EditPDPGroupWindow editor = new EditPDPGroupWindow(copyGroup, this.container.getGroups(), papEngine);
-		if (group == null) {
-			editor.setCaption("Create PDP Group");
-		} else {
-			editor.setCaption("Edit PDP Group " + ((PDPGroup) group).getName());
-		}
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				if (editor.isSaved() == false) {
-					return;
-				}
-				if (group == null) {
-					//
-					// Creating a new group
-					//
-					try {
-						self.container.addNewGroup(editor.getGroupName(), editor.getGroupDescription());
-					} catch (Exception e) {
-						String message = "Unable to create Group.  Reason:\n" + e.getMessage();
-						logger.error(message);
-						AdminNotification.error(message);
-					}
-				} else {
-					//
-					// Update group
-					//
-					self.container.updateGroup(editor.getUpdatedObject());
-				}
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-	
-	protected void deletePDP(final PDP pdp, final PDPGroup pdpGroup) {
-		String message = "Are you sure you want to delete <B>" + (pdp.getName() == null ? "" : pdp.getName()) + "</B> group?";
-		ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm PDP Deletion", message, "Delete", "Cancel");
-		dialog.setContentMode(ContentMode.HTML);
-		dialog.show(getUI(), new ConfirmDialog.Listener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClose(ConfirmDialog dialog) {
-				if (dialog.isConfirmed()) {
-					try {
-						self.container.removePDP(pdp, pdpGroup);
-					} catch (PAPException e) {
-						logger.warn("Failed to remove pdp");
-						AdminNotification.warn("Failed to remove PDP");
-					}
-				}
-			}
-		}, true);
-	}
-	
-	protected void movePDP(final PDP pdp, final PDPGroup currentGroup) {
-		List<PDPGroup> currentGroups = this.container.getGroups();
-		Set<PDPGroup> otherGroups = new HashSet<PDPGroup>(currentGroups);
-		if (otherGroups.remove(currentGroup) == false) {
-			logger.warn("Group list inconsistency - failed to move pdp to selected group");
-			return;
-		}
-		final SelectPDPGroupWindow editor = new SelectPDPGroupWindow(otherGroups, "What was this?");
-		editor.setCaption("Move PDP to group");
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				if (editor.isSaved()) {
-					self.container.movePDP((PDP) pdp, editor.selectedGroup());
-				}
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-	
-	protected void getPDPStatus(final PDP pdp, final PDPGroup group) {
-		PDPStatus status;
-		try {
-			status = papEngine.getStatus(pdp);
-		} catch (Exception e) {
-			AdminNotification.error("Unable to get details for pdp '" + pdp.getId() + "' with summary status: " + pdp.getStatus().getStatus());
-			return;
-		}
-		logger.info(status);
-		PDPStatusWindow window = new PDPStatusWindow(status);
-		window.setCaption("Status for PDP " + pdp.getName());
-		window.setModal(true);
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	private void deleteGroup(final PDPGroup group) {
-		//
-		// Cannot be the default group
-		//
-		if (group.isDefaultGroup()) {
-			logger.error("Cannot delete the Default group");
-			return;
-		}
-		//
-		// Any PDPs in the group?
-		//
-		Set<PDP> pdps = group.getPdps();
-		if (pdps.isEmpty()) {
-			//
-			// There are no PDP's, so just prompt to remove it
-			//
-			String message = "Are you sure you want to delete <B>" + (group.getName() == null ? "" : group.getName()) + "</B> group?";
-			ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Group Deletion", message, "Delete", "Cancel");
-			dialog.setContentMode(ContentMode.HTML);
-			dialog.show(getUI(), new ConfirmDialog.Listener() {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public void onClose(ConfirmDialog dialog) {
-					if (dialog.isConfirmed()) {
-						try {
-							self.container.removeGroup(group, null);
-						} catch (Exception e1) {
-							logger.warn("Container failed to remove group");
-							AdminNotification.error("Unable to delete group '" + group.getId() + "'.  Reason:\n" + e1.getMessage());
-						}
-						return;
-					}
-				}
-			}, true);
-			return;
-		}
-		//
-		// Get our set of groups
-		//
-		List<PDPGroup> currentGroups = this.container.getGroups();
-		Set<PDPGroup> otherGroups = new HashSet<PDPGroup>(currentGroups);
-		if (otherGroups.remove(group) == false) {
-			logger.warn("Group list inconsistency - failed to remove group we are attempting to delete");
-			return;
-		}
-		//
-		// We should have at least one group
-		//
-		if (otherGroups.isEmpty()) {
-			logger.error("Group list inconsistency - no other groups to choose from.");
-			return;
-		}
-		//
-		// If there is only one group, it SHOULD be the default group
-		//
-		if (otherGroups.size() == 1) {
-			PDPGroup loneGroup = otherGroups.iterator().next();
-			if (loneGroup.isDefaultGroup() == false) {
-				logger.error("Group list inconsistency - lone group is NOT default.");
-				return;
-			}
-		}
-		//
-		// Create our confirmation window
-		//
-		final SelectPDPGroupWindow window = new SelectPDPGroupWindow(otherGroups, "Select New Group for PDPs");
-		window.setCaption("Confirm Group " + group.getName() + " Deletion");
-		window.setCloseShortcut(KeyCode.ESCAPE);
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				if (window.isSaved()) {
-					PDPGroup newGroup = window.selectedGroup();
-					if (newGroup == null) {
-						logger.warn("No group selected for moving PDPs into");
-						AdminNotification.warn("No group selected for moving PDPs into.  Group '" + group.getId() + "' not deleted");
-						return;
-					}
-					try {
-						self.container.removeGroup(group, newGroup);
-					} catch (Exception e1) {
-						logger.warn("Container failed to remove group: " + e1, e1);
-						AdminNotification.error("Unable to delete group '" + group.getId() + "'.  Reason:\n" + e1.getMessage());
-					}
-				}
-			}
-			
-		});
-		getUI().addWindow(window);
-	}
-
-	public void refreshContainer() {
-		if (this.container != null) {
-			this.container.refreshGroups();
-		}
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("100%");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("100.0%");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		
-		// tree
-		table = new Table();
-		table.setImmediate(false);
-		table.setWidth("-1px");
-		table.setHeight("-1px");
-		mainLayout.addComponent(table);
-		mainLayout.setExpandRatio(table, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(true);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// buttonCreate
-		buttonCreate = new Button();
-		buttonCreate.setCaption("Create Group");
-		buttonCreate.setImmediate(false);
-		buttonCreate.setWidth("-1px");
-		buttonCreate.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonCreate);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove Group");
-		buttonRemove.setImmediate(false);
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonRemove);
-		
-		return horizontalLayoutToolbar;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java
deleted file mode 100644
index c25f018..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PIPManagement.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.vaadin.dialogs.ConfirmDialog;
-import org.vaadin.dialogs.ConfirmDialog.ContentMode;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.view.components.PIPResolverComponent;
-import org.apache.openaz.xacml.admin.view.windows.PIPConfigurationEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.PIPImportWindow;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.Table.ColumnGenerator;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class PIPManagement extends CustomComponent {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table tablePIP;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-	@AutoGenerated
-	private Button buttonImport;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonClone;
-	@AutoGenerated
-	private Button buttonAdd;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPManagement.class);
-	private static final Object[] visibleColumns = new Object[] { "name", "description", "piptype", "issuer"};
-	private static final String[] columnHeaders = new String[] { "Name", "Description", "Type", "Issuer"};
-	
-	private final Action ADD_CONFIGURATION = new Action("Add Configuration");
-	private final Action EDIT_CONFIGURATION = new Action("Edit Configuration");
-	private final Action CLONE_CONFIGURATION = new Action("Clone Configuration");
-	private final Action REMOVE_CONFIGURATION = new Action("Remove Configuration");
-	private final Action ADD_RESOLVER = new Action("Add Resolver");
-	private final Action PUBLISH_CONFIGURATION = new Action("Publish Configuration");
-
-	private final PIPManagement self = this;
-	private final JPAContainer<PIPConfiguration>	container = new JPAContainer<PIPConfiguration>(PIPConfiguration.class);
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPManagement() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Setup containers
-		//
-		boolean isReadOnly;
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_WRITE, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_PIP_ADMIN)) {
-			//
-			// Writable container
-			//
-			container.setEntityProvider(new CachingMutableLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-			isReadOnly = false;
-		} else {
-			//
-			// Read only container
-			//
-			container.setEntityProvider(new CachingLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-			isReadOnly = true;
-		}
-		//
-		// Finish initialization
-		//
-		this.initializeTree(isReadOnly);
-		this.initializeButtons(isReadOnly);
-		//
-		// Setup
-		//
-		this.setupButtons();
-	}
-	
-	protected void initializeTree(boolean isReadOnly) {
-		//
-		// Initialize GUI properties
-		//
-		this.tablePIP.setImmediate(true);
-		this.tablePIP.setContainerDataSource(this.container);
-		this.tablePIP.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.tablePIP.setItemCaptionPropertyId("name");
-		this.tablePIP.setVisibleColumns(visibleColumns);
-		this.tablePIP.setColumnHeaders(columnHeaders);
-		this.tablePIP.setSizeFull();
-		//
-		// Access?
-		//
-		if (isReadOnly) {
-			if (logger.isDebugEnabled()) {
-				logger.debug("read only pip access");
-			}
-			return;
-		}
-		this.tablePIP.setSelectable(true);
-		//
-		// Setup click handler
-		//
-		this.tablePIP.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					PIPManagement.editConfiguration(self.container.getItem(event.getItemId()));
-				}				
-			}
-		});
-		//
-		// Setup action handler
-		//
-		this.tablePIP.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					return new Action[] {ADD_CONFIGURATION};
-				}
-				//
-				// Target is an Object ID
-				//
-				EntityItem<PIPConfiguration> config = self.container.getItem(target);
-				if (config != null && config.getEntity().isReadOnly() == false) {
-					if (config.getEntity().requiresResolvers()) {
-						return new Action[] {EDIT_CONFIGURATION, CLONE_CONFIGURATION, REMOVE_CONFIGURATION, PUBLISH_CONFIGURATION, ADD_RESOLVER};
-					} else {
-						return new Action[] {EDIT_CONFIGURATION, CLONE_CONFIGURATION, REMOVE_CONFIGURATION, PUBLISH_CONFIGURATION};							
-					}
-				}
-				if (logger.isDebugEnabled()) {
-					logger.debug("Could not find item: " + target);
-				}
-				return null;
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				EntityItem<PIPConfiguration> config = self.container.getItem(target);
-				if (config == null) {
-					if (logger.isDebugEnabled()) {
-						logger.debug("Could not find item: " + target);
-					}
-					return;
-				}
-				if (action == ADD_CONFIGURATION) {
-					PIPManagement.editConfiguration(self.container.createEntityItem(new PIPConfiguration()));
-					return;
-				}
-				if (action == EDIT_CONFIGURATION) {
-					PIPManagement.editConfiguration(config);
-					return;
-				}
-				if (action == CLONE_CONFIGURATION) {
-					self.cloneConfiguration(config);
-					return;
-				}
-				if (action == REMOVE_CONFIGURATION) {
-					self.removeConfiguration(config);
-					return;
-				}
-				if (action == ADD_RESOLVER) {
-					PIPResolverComponent.addResolver(config.getEntity(), null);
-					return;
-				}
-				if (action == PUBLISH_CONFIGURATION) {
-					PIPResolverComponent.publishConfiguration(config);
-					return;
-				}
-			}
-		});
-		//
-		// When a selection changes listener
-		//
-		this.tablePIP.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupButtons();
-			}			
-		});
-		this.tablePIP.addGeneratedColumn("description", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				EntityItem<PIPConfiguration> entity = self.container.getItem(itemId);
-				if (entity != null && entity.getEntity() != null) {
-					TextArea area = new TextArea();
-					area.setValue(entity.getEntity().getDescription());
-					area.setNullRepresentation("");
-					area.setSizeFull();
-					area.setReadOnly(true);
-					return area;
-				}
-				return null;
-			}
-		});
-		this.tablePIP.addGeneratedColumn("piptype", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				EntityItem<PIPConfiguration> entity = self.container.getItem(itemId);
-				if (entity != null && entity.getEntity() != null) {
-					return entity.getEntity().getPiptype().getType();
-				}
-				return null;
-			}
-		});
-		//
-		// Customize the resolver column
-		//
-		this.tablePIP.addGeneratedColumn("Resolvers", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				EntityItem<PIPConfiguration> entity = self.container.getItem(itemId);
-				if (entity != null && entity.getEntity() != null && entity.getEntity().requiresResolvers()) {
-					PIPResolverComponent component = new PIPResolverComponent(entity.getEntity());
-					return component;
-				}
-				return null;
-			}			
-		});
-	}
-	
-	protected void initializeButtons(boolean isReadOnly) {
-		if (isReadOnly) {
-			this.buttonAdd.setVisible(false);
-			this.buttonRemove.setVisible(false);
-			this.buttonClone.setVisible(false);
-			return;
-		}
-		this.buttonAdd.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				PIPManagement.editConfiguration(self.container.createEntityItem(new PIPConfiguration()));
-			}
-			
-		});
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.removeConfiguration(self.container.getItem(self.tablePIP.getValue()));
-			}
-			
-		});
-		this.buttonClone.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.cloneConfiguration(self.container.getItem(self.tablePIP.getValue()));
-			}
-		});
-		this.buttonImport.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				final PIPImportWindow window = new PIPImportWindow();
-				window.setCaption("Import PIP Configuration");
-				window.setModal(true);
-				window.center();
-				window.addCloseListener(new CloseListener() {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public void windowClose(CloseEvent e) {
-						String file = window.getUploadedFile();
-						if (file == null) {
-							return;
-						}
-						self.importConfiguration(file);
-					}
-				});
-				UI.getCurrent().addWindow(window);
-			}
-		});
-	}
-	
-	protected void importConfiguration(String file) {
-		Properties properties = new Properties();
-		try {
-			properties.load(new FileInputStream(file));
-			Collection<PIPConfiguration> configs = PIPConfiguration.importPIPConfigurations(properties);
-			if (configs == null || configs.isEmpty()) {
-				AdminNotification.warn("There were no PIP Engine configurations found.");
-			} else {
-				for (PIPConfiguration config : configs) {
-					this.container.addEntity(config);
-				}
-			}
-		} catch (IOException e) {
-			String message = "Failed to load properties: " + e.getLocalizedMessage();
-			logger.error(message);
-			AdminNotification.error(message);
-		}
-	}
-
-	public static void editConfiguration(final EntityItem<PIPConfiguration> entity) {
-		final PIPConfigurationEditorWindow editor = new PIPConfigurationEditorWindow(entity);
-		if (entity.isPersistent()) {
-			editor.setCaption("Edit PIP Configuration " + entity.getEntity().getName());
-		} else {
-			editor.setCaption("Create New PIP Configuration");
-		}
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				if (editor.isSaved()) {
-					if (entity.isPersistent() == false) {
-						((XacmlAdminUI)UI.getCurrent()).getPIPConfigurations().addEntity(entity.getEntity());
-					}
-					((XacmlAdminUI)UI.getCurrent()).refreshPIPConfiguration();
-				}
-			}					
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-	
-	protected void removeConfiguration(final EntityItem<PIPConfiguration> entity) {
-		//
-		// Sanity checks
-		//
-		if (entity == null || entity.getEntity() == null) {
-			logger.error("Removing a null entity");
-			return;
-		}
-		String message = "Are you sure you want to remove the " + entity.getEntity().getName() + " configuration?";
-		ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm PIP Configuration Deletion", message, "Remove", "Cancel");
-		dialog.setContentMode(ContentMode.HTML);
-		dialog.show(getUI(), new ConfirmDialog.Listener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClose(ConfirmDialog dialog) {
-				if (dialog.isConfirmed()) {
-					if (self.container.removeItem(entity.getItemId()) == false) {
-						logger.warn("Failed to remove PIP configuration");
-						AdminNotification.warn("Failed to remove PIP configuration.");
-					} else {
-						self.setupButtons();
-					}
-				}
-			}
-		}, true);
-	}
-	
-	protected void cloneConfiguration(final EntityItem<PIPConfiguration> entity) {
-		//
-		// Sanity checks
-		//
-		if (entity == null || entity.getEntity() == null) {
-			logger.warn("Cloning a null entity, the buttons were not reset. Resetting them.");
-			this.setupButtons();
-			return;
-		}
-		//
-		// Clone it
-		//
-		PIPManagement.editConfiguration(this.container.createEntityItem(new PIPConfiguration(entity.getEntity(), ((XacmlAdminUI)UI.getCurrent()).getUserid())));
-	}
-	
-	protected void setupButtons() {
-		if (this.tablePIP.getValue() != null) {
-			Object id = this.tablePIP.getValue();
-			EntityItem<PIPConfiguration> entity = this.container.getItem(id);
-			if (entity == null || entity.getEntity().isReadOnly()) {
-				this.buttonRemove.setEnabled(false);
-				this.buttonClone.setEnabled(false);
-			} else {
-				this.buttonRemove.setEnabled(true);
-				this.buttonClone.setEnabled(true);
-			}
-		} else {
-			this.buttonRemove.setEnabled(false);
-			this.buttonClone.setEnabled(false);
-		}
-	}
-
-	public void refreshContainer() {
-		this.container.refresh();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("-1px");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		
-		// tablePIP
-		tablePIP = new Table();
-		tablePIP.setCaption("PIP Configurations");
-		tablePIP.setImmediate(false);
-		tablePIP.setWidth("100.0%");
-		tablePIP.setHeight("-1px");
-		mainLayout.addComponent(tablePIP);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(false);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// buttonAdd
-		buttonAdd = new Button();
-		buttonAdd.setCaption("Add Configuration");
-		buttonAdd.setImmediate(true);
-		buttonAdd.setWidth("-1px");
-		buttonAdd.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonAdd);
-		
-		// buttonClone
-		buttonClone = new Button();
-		buttonClone.setCaption("Clone Configuration");
-		buttonClone.setImmediate(true);
-		buttonClone.setWidth("-1px");
-		buttonClone.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonClone);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove Configuration");
-		buttonRemove.setImmediate(true);
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonRemove);
-		
-		// buttonImport
-		buttonImport = new Button();
-		buttonImport.setCaption("Import Configuration");
-		buttonImport.setImmediate(false);
-		buttonImport
-				.setDescription("Imports a configuration from a properties file.");
-		buttonImport.setWidth("-1px");
-		buttonImport.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonImport);
-		
-		return horizontalLayoutToolbar;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java
deleted file mode 100644
index f6ab0f8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyEditor.java
+++ /dev/null
@@ -1,1679 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-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.AttributeValueType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
-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.PolicySetType;
-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 org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.model.GitRepositoryContainer;
-import org.apache.openaz.xacml.admin.model.PolicyContainer;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.windows.AttributeSelectionWindow;
-import org.apache.openaz.xacml.admin.view.windows.AttributeValueEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.ExpressionBuilderComponent;
-import org.apache.openaz.xacml.admin.view.windows.MatchEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.ObligationAdviceEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.PolicyEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.PolicySetEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.RuleEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.VariableDefinitionEditorWindow;
-import org.apache.openaz.xacml.util.XACMLObjectCopy;
-import org.apache.openaz.xacml.util.XACMLPolicyWriter;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Container.ItemSetChangeEvent;
-import com.vaadin.data.Container.ItemSetChangeListener;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.DataBoundTransferable;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction;
-import com.vaadin.event.dd.DragAndDropEvent;
-import com.vaadin.event.dd.DropHandler;
-import com.vaadin.event.dd.acceptcriteria.AcceptAll;
-import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
-import com.vaadin.server.BrowserWindowOpener;
-import com.vaadin.server.FileDownloader;
-import com.vaadin.server.StreamResource;
-import com.vaadin.shared.ui.dd.VerticalDropLocation;
-import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.TabSheet.Tab;
-import com.vaadin.ui.Table.TableDragMode;
-import com.vaadin.ui.TreeTable;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class PolicyEditor extends CustomComponent {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private TreeTable tree;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-
-	@AutoGenerated
-	private Button buttonExport;
-
-	@AutoGenerated
-	private Button buttonViewXML;
-
-	@AutoGenerated
-	private Button buttonSave;
-
-	@AutoGenerated
-	private CheckBox checkBoxAutoSave;
-
-	@AutoGenerated
-	private CheckBox checkBoxReadOnly;
-
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(PolicyEditor.class);
-	private final PolicyEditor self = this;
-
-	private static final Action CREATE_POLICY =			new Action ("New Policy");
-	private static final Action CREATE_POLICYSET =		new Action ("New Policy Set");
-	private static final Action CREATE_RULE =			new Action ("New Rule");
-	private static final Action EDIT_POLICY =			new Action ("Edit Policy");
-	private static final Action EDIT_POLICYSET =		new Action ("Edit Policy Set");
-	private static final Action EDIT_RULE =				new Action ("Edit Rule");
-	private static final Action DELETE_POLICYSET =		new Action ("Delete Policy Set");
-	private static final Action DELETE_POLICY = 		new Action ("Delete Policy");
-	private static final Action DELETE_RULE = 			new Action ("Delete Rule");
-	private static final Action CREATE_NEWANYOF =		new Action ("New Any Of (Match)");
-	private static final Action CREATE_NEWALLOF =		new Action ("New All Of (Match)");
-	private static final Action CREATE_NEWMATCH =		new Action ("New Match");
-	private static final Action DELETE_ANYOF =			new Action ("Delete Any Of");
-	private static final Action DELETE_ALLOF =			new Action ("Delete All Of");
-	private static final Action DELETE_MATCH =			new Action ("Delete Match");
-	private static final Action EDIT_MATCH =			new Action ("Edit Match");
-	private static final Action EDIT_OBLIGATIONS =		new Action ("Edit Obligations");
-	private static final Action DELETE_OBLIGATIONS = 	new Action ("Delete Obligations");
-	private static final Action EDIT_ADVICE =			new Action ("Edit Advice");
-	private static final Action DELETE_ADVICE = 		new Action ("Delete Advice");
-	private static final Action CREATE_VARIABLE =		new Action ("Create Variable");
-	private static final Action EDIT_VARIABLE =			new Action ("Edit Variable");
-	private static final Action DELETE_VARIABLE =		new Action ("Delete Variable");
-	private static final Action CREATE_TARGET = 		new Action ("Create Target");
-	private static final Action CREATE_CONDITION =		new Action ("Create Condition");
-	private static final Action EDIT_CONDITION =		new Action ("Edit Condition");
-	private static final Action DELETE_CONDITION =		new Action ("Delete Condition");
-	private static final Action EDIT_EXPRESSIONS =		new Action ("Edit Expressions");
-	
-	private static final Action CLIPBOARD_CUT =			new ShortcutAction ("Cut", ShortcutAction.KeyCode.S, new int[] {ShortcutAction.ModifierKey.CTRL});
-	private static final Action CLIPBOARD_COPY =		new ShortcutAction ("Copy", ShortcutAction.KeyCode.C, new int[] {ShortcutAction.ModifierKey.CTRL});
-	private static final Action CLIPBOARD_PASTE = 		new ShortcutAction ("Paste", ShortcutAction.KeyCode.V, new int[] {ShortcutAction.ModifierKey.CTRL});
-
-	private static final Object[] VISIBLE_COLUMNS = new Object[] {PolicyContainer.PROPERTY_NAME, PolicyContainer.PROPERTY_SHORTALGORITHM, PolicyContainer.PROPERTY_DESCRIPTION};
-	private static final String[] COLUMN_HEADERS = new String[] { "Name", "Algorithm or Effect", "Description"};
-
-	private final File file;
-	private final GitRepositoryContainer gitContainer;
-	private final PolicyContainer policyContainer;
-	private Tab tab = null;
-	private boolean isModified = false;
-	
-	private Object clipboardObject = null;
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @throws IOException 
-	 */
-	public PolicyEditor(File policyFile, GitRepositoryContainer gitContainer, boolean readOnly) throws IOException {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		this.mainLayout.setSizeFull();
-		//
-		// Save
-		//
-		this.file = policyFile;
-		this.gitContainer = gitContainer;
-		this.policyContainer = new PolicyContainer(this.file);
-		//
-		// Its our data also
-		//
-		this.setData(policyFile);
-		//
-		// Initialize GUI
-		//
-		this.initializeCheckboxes(readOnly);
-		this.initializeButtons();
-		this.initializeDownload();
-		this.initializeTree();
-// PLD TODO next release		this.initializeContextMenu();
-		//
-		// setup the caption etc.
-		//
-		this.setupCaption();
-		this.resetComponents();
-	}
-	
-	protected void initializeCheckboxes(boolean readOnly) {
-		//
-		// The readonly check box
-		//
-		this.checkBoxReadOnly.setImmediate(true);
-		this.checkBoxReadOnly.setValue(readOnly);
-		this.checkBoxReadOnly.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.resetComponents();
-				self.setupCaption();
-			}
-			
-		});
-		//
-		// The autosave check box
-		//
-		this.checkBoxAutoSave.setImmediate(true);
-		this.checkBoxAutoSave.setValue(true);
-	}
-	
-	protected void initializeButtons() {
-		//
-		// The Save button
-		//
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.savePolicy();
-			}
-		});
-		//
-		// Attach a window opener to the View XML button
-		//
-		BrowserWindowOpener opener = new BrowserWindowOpener(new StreamResource(new StreamResource.StreamSource() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public InputStream getStream() {
-				try {
-					if (logger.isDebugEnabled()) {
-						logger.debug("Setting view xml button to: " + self.file.getAbsolutePath());
-					}
-					return new FileInputStream(self.file);
-				} catch (Exception e) {
-					logger.error("Failed to open input stream " + self.file);
-				}
-				return null;
-			}
-		}, self.file.getName()));
-		opener.setWindowName("_new");
-		opener.extend(this.buttonViewXML);
-	}
-	
-	protected void initializeDownload() {
-		//
-		// Create a stream resource pointing to the file
-		//
-		StreamResource r = new StreamResource(new StreamResource.StreamSource() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public InputStream getStream() {
-				try {
-					return new FileInputStream(self.file);
-				} catch (Exception e) {
-					logger.error("Failed to open input stream " + self.file);
-				}
-				return null;
-			}
-		}, self.file.getName());
-		r.setCacheTime(-1);
-		r.setMIMEType("application/xml");
-		//
-		// Extend a downloader to attach to the Export Button
-		//
-		FileDownloader downloader = new FileDownloader(r);
-		downloader.extend(this.buttonExport);
-	}
-	
-	public void setTab(Tab tab) {
-		this.tab = tab;
-		this.setupCaption();
-	}
-	
-	public boolean isAutoSave() {
-		if (this.checkBoxAutoSave.isEnabled() == false) {
-			return false;
-		}
-		return this.checkBoxAutoSave.getValue();
-	}
-	
-	public boolean isReadOnly() {
-		return this.checkBoxReadOnly.getValue();
-	}
-
-	protected void initializeTree() {
-		//
-		// Create our container and set it as the tree's data source
-		//
-		this.tree.setContainerDataSource(this.policyContainer);
-		this.tree.setItemIconPropertyId("Icon");
-		this.tree.setVisibleColumns(VISIBLE_COLUMNS);
-		this.tree.setColumnHeaders(COLUMN_HEADERS);
-		this.tree.setSelectable(true);
-		this.tree.setSizeFull();
-		//
-		// Expand it down a few items
-		//
-		for (Object id : this.tree.getItemIds()) {
-			this.tree.setCollapsed(id, false);
-			for (Object child : this.tree.getChildren(id)) {
-				this.tree.setCollapsed(child, false);
-			}
-		}
-		//
-		// Respond to double-click's
-		//
-		this.tree.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					if (self.isReadOnly()) {
-						AdminNotification.info("You are in read-only mode.");
-						return;
-					}
-					Object target = event.getItemId();
-					if (target instanceof PolicySetType) {
-						self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target));
-					} else if (target instanceof PolicyType) {
-						self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target));
-					} else if (target instanceof RuleType) {
-						self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target));
-					} else if (target instanceof ConditionType) {
-						self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target));
-					} else if (target instanceof VariableDefinitionType) {
-						self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target));
-					} else if (target instanceof MatchType) {
-						self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match");
-					} else if (target instanceof ObligationExpressionType) {
-						self.editObAdvice(true, self.policyContainer.getParent(target));
-					} else if (target instanceof AdviceExpressionType) {
-						self.editObAdvice(false, self.policyContainer.getParent(target));
-					}
-				}
-			}
-			
-		});
-		//
-		// Respond to container changes
-		//
-		this.policyContainer.addItemSetChangeListener(new ItemSetChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void containerItemSetChange(ItemSetChangeEvent event) {
-				self.isModified = true;
-				if (self.isAutoSave()) {
-					self.savePolicy();
-				} else {
-					self.setupCaption();
-					self.buttonSave.setEnabled(true);
-				}
-			}
-		});
-		//
-		// Implement drag-n-drop
-		//
-		this.tree.setDropHandler(new DropHandler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void drop(DragAndDropEvent event) {
-				DataBoundTransferable t = (DataBoundTransferable) event.getTransferable();
-			    AbstractSelectTargetDetails target = (AbstractSelectTargetDetails) event.getTargetDetails();
-			    
-			    //
-			    // Get ids of the dragged item and the target item
-			    //
-			    Object sourceItemId = t.getData("itemId");
-				Object targetItemId = target.getItemIdOver();
-				VerticalDropLocation location = target.getDropLocation();
-				if (logger.isDebugEnabled()) {
-					logger.debug("Drop " + sourceItemId + " target " + targetItemId + " location " + location);
-				}
-				//
-				// Tell our container what to do
-				//
-				try {
-					if (location == VerticalDropLocation.MIDDLE) {
-						//
-						// Drop right on top of item making it a child
-						//
-						self.policyContainer.setParent(sourceItemId, targetItemId);
-					}
-
-					/*
-					} else if (location == VerticalDropLocation.TOP) {
-						//
-						// Drop at the top of the tree making it the previous
-						//
-						Object parent = self.policyContainer.getParent(targetItemId);
-						self.policyContainer.setParent(sourceItemId, parent);
-						self.policyContainer.moveAfterSibling(sourceItemId, targetItemId);
-						self.policyContainer.moveAfterSibling(targetItemId, sourceItemId);
-					} else if (location == VerticalDropLocation.BOTTOM) {
-						//
-						// Drop below another item
-						//
-						Object parent = self.policyContainer.getParent(targetItemId);
-						self.policyContainer.setParent(sourceItemId, targetItemId);
-						self.policyContainer.moveAfterSibling(sourceItemId, targetItemId);
-					}
-					*/
-				} catch (UnsupportedOperationException e) {
-					logger.error("Unsupported " + e.getLocalizedMessage());
-				}
-			}
-
-			@Override
-			public AcceptCriterion getAcceptCriterion() {
-				return AcceptAll.get();
-			}
-		});
-	}
-	
-	protected void removeObject(Object target) {
-		if (target instanceof PolicySetType) {
-			this.removePolicySet((PolicySetType) target);
-		} else if (target instanceof PolicyType) {
-			this.removePolicy((PolicyType) target);
-		} else if (target instanceof RuleType) {
-			this.removeRule((RuleType) target);
-		} else if (target instanceof ConditionType) {
-			this.removeCondition((ConditionType) target);
-		} else if (target instanceof VariableDefinitionType) {
-			this.removeVariable((VariableDefinitionType) target);
-		} else if (target instanceof AdviceExpressionType) {
-			this.removeAdvice((AdviceExpressionType) target);
-		} else if (target instanceof ObligationExpressionType) {
-			this.removeObligations((ObligationExpressionType) target);
-		}
-	}
-
-	protected void removeAdvice(AdviceExpressionType target) {
-		if (this.tree.removeItem(target) == false) {
-			logger.error("Failed to remove advice.");
-		}
-	}
-
-	protected void removeVariable(VariableDefinitionType target) {
-		if (this.tree.removeItem(target) == false) {
-			logger.error("Failed to remove variable.");
-		}
-	}
-
-	protected void removeCondition(ConditionType target) {
-		if (this.tree.removeItem(target) == false) {
-			logger.error("Failed to remove condition.");
-		}
-	}
-
-	protected void removeObligations(ObligationExpressionType target) {
-		if (this.tree.removeItem(target) == false) {
-			logger.error("Failed to remove obligations.");
-		}
-	}
-
-	protected void removeRule(RuleType target) {
-		if (this.tree.removeItem(target) == false) {
-			logger.error("Failed to remove rule.");
-		}
-	}
-
-	protected void removePolicy(PolicyType target) {
-		Object parent = this.tree.getParent(target);
-		if (parent == null) {
-			this.deleteRoot(target);
-		} else {
-			if (this.tree.removeItem(target) == false) {
-				logger.error("Failed to remove policy.");
-			}
-		}
-	}
-
-	protected void removePolicySet(PolicySetType target) {
-		Object parent = this.tree.getParent(target);
-		if (parent == null) {
-			this.deleteRoot(target);
-		} else {
-			if (this.tree.removeItem(target) == false) {
-				logger.error("Failed to remove policy set.");
-			}
-		}
-	}
-
-	/*
-	protected void initializeContextMenu() {
-		ContextMenu menu = new ContextMenu();
-		menu.setAsTableContextMenu(this.tree);
-		menu.addContextMenuTableListener(new TableListener() {
-
-			@Override
-			public void onContextMenuOpenFromFooter(
-					ContextMenuOpenedOnTableFooterEvent event) {
-				// TODO Auto-generated method stub
-				
-			}
-
-			@Override
-			public void onContextMenuOpenFromHeader(
-					ContextMenuOpenedOnTableHeaderEvent event) {
-				// TODO Auto-generated method stub
-				
-			}
-
-			@Override
-			public void onContextMenuOpenFromRow(ContextMenuOpenedOnTableRowEvent event) {
-				logger.info("context menu row");
-			}
-		});
-		menu.addItem("test");
-	}
-	*/
-	
-	protected void savePolicy() {
-		if (this.isReadOnly()) {
-			logger.warn("Should not call savePolicy when in read only mode.");
-			return;
-		}
-		Collection<?> roots = this.policyContainer.rootItemIds();
-		if (roots.size() > 1) {
-			logger.warn("More than one root policy.");
-		}
-		//
-		// There should only be one root
-		// Save the policy to disk.
-		//
-		for (Object root : roots) {
-			logger.info("Saving policy: " + this.file.getName());
-			//
-			// TODO - Bump the version?
-			//
-			if (root instanceof PolicySetType) {
-				XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicySetType) root);
-			} else if (root instanceof PolicyType) {
-				XACMLPolicyWriter.writePolicyFile(Paths.get(this.file.getAbsolutePath()), (PolicyType) root);
-			}
-			//
-			// TODO ????
-			//
-			this.gitContainer.updateItem(this.file);
-			break; // NOPMD
-		}
-		//
-		// No longer modified
-		//
-		this.isModified = false;
-		this.setupCaption();
-		this.resetComponents();
-	}
-	
-	protected void installTreeActionHandler() {
-		//
-		// Remove any existing action handlers
-		//
-		this.tree.removeAllActionHandlers();
-		//
-		// Are we read-only?
-		//
-		if (this.isReadOnly()) {
-			//
-			// Yes - no action handler's allowed
-			//
-			return;
-		}
-		//
-		// Setup our action handlers
-		//
-		this.tree.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				//
-				// Are we read-only?
-				//
-				if (self.isReadOnly()) {
-					if (logger.isDebugEnabled()) {
-						logger.debug("Policy is read-only");
-					}
-					return null;
-				}
-				if (target == null) {
-					//
-					// Nothing is selected, they right-clicked empty space
-					//
-					if (logger.isDebugEnabled()) {
-						logger.debug("action tree target is null");
-					}
-					return null;
-				}
-				if (target instanceof PolicySetType) {
-					List<Action> actions = new ArrayList<Action>();
-					actions.add(EDIT_POLICYSET);
-					if (((PolicySetType) target).getTarget() == null) {
-						actions.add(CREATE_TARGET);
-					}
-					/*
-					actions.add(CLIPBOARD_CUT);
-					actions.add(CLIPBOARD_COPY);
-					actions.add(CLIPBOARD_PASTE);
-					*/
-					actions.add(CREATE_POLICYSET);
-					actions.add(CREATE_POLICY);
-					actions.add(EDIT_OBLIGATIONS);
-					actions.add(EDIT_ADVICE);
-					actions.add(DELETE_POLICYSET);
-					return (Action[]) actions.toArray(new Action[0]);
-				}
-				if (target instanceof PolicyType) {
-					List<Action> actions = new ArrayList<Action>();
-					actions.add(EDIT_POLICY);
-					if (((PolicyType) target).getTarget() ==  null) {
-						actions.add(CREATE_TARGET);
-					}
-					/*
-					actions.add(CLIPBOARD_CUT);
-					actions.add(CLIPBOARD_COPY);
-					actions.add(CLIPBOARD_PASTE);
-					*/
-					actions.add(CREATE_RULE);
-					actions.add(CREATE_VARIABLE);
-					actions.add(EDIT_OBLIGATIONS);
-					actions.add(EDIT_ADVICE);
-					actions.add(DELETE_POLICY);
-					return (Action[]) actions.toArray(new Action[0]);
-				}
-				if (target instanceof RuleType) {
-					List<Action> actions = new ArrayList<Action>();
-					actions.add(EDIT_RULE);
-					if (((RuleType) target).getTarget() == null) {
-						actions.add(CREATE_TARGET);
-					}
-					/*
-					actions.add(CLIPBOARD_CUT);
-					actions.add(CLIPBOARD_COPY);
-					actions.add(CLIPBOARD_PASTE);
-					*/
-					if (((RuleType)target).getCondition() == null) {
-						actions.add(CREATE_CONDITION);
-					}
-					actions.add(EDIT_OBLIGATIONS);
-					actions.add(EDIT_ADVICE);
-					actions.add(DELETE_RULE);
-					return (Action[]) actions.toArray(new Action[0]);
-				}
-				if (target instanceof TargetType) {
-					return new Action[] {CREATE_NEWANYOF};
-				}
-				if (target instanceof AnyOfType) {
-					return new Action[] {CREATE_NEWALLOF, DELETE_ANYOF};
-				}
-				if (target instanceof AllOfType) {
-					return new Action[] {CREATE_NEWMATCH, DELETE_ALLOF};
-				}
-				if (target instanceof MatchType) {
-					return new Action[] {EDIT_MATCH, DELETE_MATCH};
-				}
-				if (target instanceof ConditionType) {
-					return new Action[] {EDIT_CONDITION, DELETE_CONDITION};
-				}
-				if (target instanceof VariableDefinitionType) {
-					return new Action[] {EDIT_VARIABLE, DELETE_VARIABLE};
-				}
-				if (target instanceof ObligationExpressionType) {
-					return new Action[] {EDIT_OBLIGATIONS, DELETE_OBLIGATIONS};
-				}
-				if (target instanceof AdviceExpressionType) {
-					return new Action[] {EDIT_ADVICE, DELETE_ADVICE};
-				}
-				return null;
-			}
-			
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == CLIPBOARD_CUT) {
-					assert target != null;
-					self.clipboardObject = XACMLObjectCopy.deepCopy(target);
-					self.removeObject(target);
-					return;
-				}
-				if (action == CLIPBOARD_COPY) {
-					assert target != null;
-					self.clipboardObject = XACMLObjectCopy.deepCopy(target);
-					return;
-				}
-				if (action == CLIPBOARD_PASTE) {
-					assert target != null;
-					self.clipboardPaste(target, true);
-					return;
-				}
-				if (action == CREATE_POLICYSET) {
-					assert target instanceof PolicySetType;
-					self.editPolicySet(null, (PolicySetType) target);
-					return;
-				}
-				if (action == CREATE_POLICY) {
-					assert target instanceof PolicySetType;
-					self.editPolicy(null, (PolicySetType) target);
-					return;
-				}
-				if (action == CREATE_RULE) {
-					assert target instanceof PolicyType;
-					self.editRule(null, (PolicyType) target);
-					return;
-				}
-				if (action == CREATE_TARGET) {
-					assert target instanceof RuleType || target instanceof PolicyType || target instanceof PolicySetType;
-					TargetType newTarget = new TargetType();
-					self.policyContainer.addItem(newTarget, target);
-					return;
-				}
-				if (action == EDIT_POLICYSET) {
-					assert target instanceof PolicySetType;
-					self.editPolicySet((PolicySetType) target, (PolicySetType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == EDIT_POLICY) {
-					assert target instanceof PolicyType;
-					self.editPolicy((PolicyType) target, (PolicySetType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == EDIT_RULE) {
-					assert target instanceof RuleType;
-					self.editRule((RuleType) target, (PolicyType) self.policyContainer.getParent(target));
-					return;
-				}				
-				if (action == DELETE_POLICYSET) {
-					assert target instanceof PolicySetType;
-					self.removePolicySet((PolicySetType) target);
-					return;
-				}
-				if (action == DELETE_POLICY) {
-					assert target instanceof PolicyType;
-					self.removePolicy((PolicyType) target);
-					return;
-				}
-				if (action == DELETE_RULE) {
-					assert target instanceof RuleType;
-					self.removeRule((RuleType) target);
-					return;
-				}
-				if (action == CREATE_NEWANYOF) {
-					assert target instanceof TargetType;
-					self.editMatch(null, null, null, (TargetType) target, "Create New Match");
-					return;
-				}
-				if (action == CREATE_NEWALLOF) {
-					assert target instanceof AnyOfType;
-					self.editMatch(null, null, (AnyOfType) target, null, "Create New Match");
-					return;
-				}
-				if (action == CREATE_NEWMATCH) {
-					if (target instanceof AllOfType) {
-						self.editMatch(null, (AllOfType) target, null, null, "Create New Match");
-					} else if (target instanceof TargetType) {
-						self.editMatch(null, null, null, (TargetType) target, "Create New Match");
-					} else {
-						assert false;
-					}
-					return;
-				}
-				if (action == DELETE_ANYOF) {
-					assert target instanceof AnyOfType;
-					self.removeAnyOf((AnyOfType) target, (TargetType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == DELETE_ALLOF) {
-					assert target instanceof AllOfType;
-					self.removeAllOf((AllOfType) target, (AnyOfType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == DELETE_MATCH) {
-					assert target instanceof MatchType;
-					self.removeMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == EDIT_MATCH) {
-					assert target instanceof MatchType;
-					self.editMatch((MatchType) target, (AllOfType) self.policyContainer.getParent(target), null, null, "Edit Match");
-					return;
-				}
-				if (action == EDIT_OBLIGATIONS) {
-					assert target instanceof RuleType || 
-							target instanceof PolicyType || 
-							target instanceof PolicySetType ||
-							target instanceof ObligationExpressionType;
-					if (target instanceof ObligationExpressionType) {
-						self.editObAdvice(true, self.policyContainer.getParent(target));
-					} else {
-						self.editObAdvice(true, target);
-					}
-					return;
-				}
-				if (action == DELETE_OBLIGATIONS) {
-					assert target instanceof ObligationExpressionType;
-					self.removeObligations((ObligationExpressionType) target);
-					return;
-				}
-				if (action == EDIT_ADVICE) {
-					assert target instanceof RuleType || 
-							target instanceof PolicyType || 
-							target instanceof PolicySetType ||
-							target instanceof AdviceExpressionType;
-					if (target instanceof AdviceExpressionType) {
-						self.editObAdvice(false, self.policyContainer.getParent(target));
-					} else {
-						self.editObAdvice(false, target);
-					}
-					return;
-				}
-				if (action == DELETE_ADVICE) {
-					assert target instanceof AdviceExpressionType;
-					self.removeAdvice((AdviceExpressionType) target);
-					return;
-				}
-				if (action == CREATE_VARIABLE) {
-					assert target instanceof PolicyType;
-					self.editVariable(null, (PolicyType) target);
-					return;
-				}
-				if (action == CREATE_CONDITION) {
-					assert target instanceof RuleType;
-					self.editCondition(null, (RuleType) target);
-					return;
-				}
-				if (action == EDIT_CONDITION) {
-					assert target instanceof ConditionType;
-					self.editCondition((ConditionType) target, (RuleType) self.policyContainer.getParent(target));
-					return;
-				}
-				if (action == DELETE_CONDITION) {
-					assert target instanceof ConditionType;
-					self.removeCondition((ConditionType) target);
-					return;
-				}
-				if (action == EDIT_EXPRESSIONS) {
-					return;
-				}
-				if (action == DELETE_VARIABLE) {
-					assert target instanceof VariableDefinitionType;
-					self.removeVariable((VariableDefinitionType) target);
-					return;
-				}
-				if (action == EDIT_VARIABLE) {
-					assert target instanceof VariableDefinitionType;
-					self.editVariable((VariableDefinitionType) target, (PolicyType) self.policyContainer.getParent(target));
-					return;
-				}
-			}
-		});		
-	}
-	
-	protected void resetComponents() {
-		if (this.isReadOnly()) {
-			this.checkBoxAutoSave.setEnabled(false);
-			this.buttonSave.setEnabled(false);
-			this.tree.setDragMode(TableDragMode.NONE);
-			this.tree.removeAllActionHandlers();
-			this.tree.setReadOnly(true);
-		} else {
-			this.checkBoxAutoSave.setEnabled(true);
-			this.buttonSave.setEnabled(this.isModified);
-			this.tree.setReadOnly(false);
-			this.tree.setDragMode(TableDragMode.ROW);
-			this.installTreeActionHandler();
-		}
-	}
-		
-	public void	setupCaption() {
-		String caption = this.file.getName();
-		if (this.isModified) {
-			caption = caption + " *";
-		}
-		if (this.isReadOnly()) {
-			caption = caption + " (Read-Only)";
-		}
-		if (this.tab != null) {
-			this.tab.setCaption(caption);
-		}
-	}
-	
-	protected void editPolicySet(final PolicySetType policy, final PolicySetType parent) {
-		logger.info("editPolicySet: " + policy + " parent " + parent);
-		//
-		// Create a copy
-		//
-		final PolicySetType newPolicySet = (policy == null ? new PolicySetType() : XACMLObjectCopy.copy(policy));
-		//
-		// Create window
-		//
-		final PolicySetEditorWindow window = new PolicySetEditorWindow(newPolicySet);
-		window.setCaption(policy == null ? "Create New Policy Set" : "Edit Policy Set");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					if (logger.isDebugEnabled()) {
-						logger.debug("user did NOT save");
-					}
-					return;
-				}
-				//
-				// Was it a new Policy Set?
-				//
-				if (policy == null) {
-					logger.info("adding new policy set " + newPolicySet.getPolicySetId());
-					//
-					// Yes - new add it in
-					//
-					if (newPolicySet.getTarget() == null) {
-						newPolicySet.setTarget(new TargetType());
-					}
-					if (self.policyContainer.addItem(newPolicySet, parent) == null) {
-						logger.error("Failed to add new policy set");
-					} else {
-						self.tree.setCollapsed(parent, false);
-						self.tree.setCollapsed(newPolicySet, false);
-						self.tree.select(newPolicySet);
-					}
-				} else {
-					logger.info("updating new policy set " + newPolicySet.getPolicySetId());
-					//
-					// No - copy everything
-					//
-					policy.setDescription(newPolicySet.getDescription());
-					policy.setVersion(newPolicySet.getVersion());
-					policy.setPolicyCombiningAlgId(newPolicySet.getPolicyCombiningAlgId());
-					//
-					// Update
-					//
-					self.policyContainer.updateItem(policy);
-				}
-			}			
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void editPolicy(final PolicyType policy, final PolicySetType parent) {
-		//
-		// Create a copy
-		//
-		final PolicyType newPolicy = (policy == null ? new PolicyType() : XACMLObjectCopy.copy(policy));
-		//
-		// Create window
-		//
-		final PolicyEditorWindow window = new PolicyEditorWindow(newPolicy);
-		window.setCaption(policy == null ? "Create New Policy" : "Edit Policy");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Was it a new Policy?
-				//
-				if (policy == null) {
-					//
-					// Yes - new add it in
-					//
-					if (newPolicy.getTarget() == null) {
-						newPolicy.setTarget(new TargetType());
-					}
-					if (self.policyContainer.addItem(newPolicy, parent) == null) {
-						logger.error("Failed to add policy");
-					} else {
-						self.tree.setCollapsed(parent, false);
-						self.tree.setCollapsed(newPolicy, false);
-						self.tree.select(newPolicy);
-					}
-				} else {
-					//
-					// No - copy everything
-					//
-					policy.setDescription(newPolicy.getDescription());
-					policy.setVersion(newPolicy.getVersion());
-					policy.setRuleCombiningAlgId(newPolicy.getRuleCombiningAlgId());
-					//
-					// Update
-					//
-					self.policyContainer.updateItem(policy);
-				}
-			}			
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void editRule(final RuleType rule, final PolicyType parent) {
-		//
-		// Create a copy
-		//
-		final RuleType newRule = (rule == null ? new RuleType() : XACMLObjectCopy.copy(rule));
-		//
-		// Create window
-		//
-		final RuleEditorWindow window = new RuleEditorWindow(newRule);
-		window.setCaption(rule == null ? "Create New Rule" : "Edit Rule");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Was this a new rule?
-				//
-				if (rule == null) {
-					//
-					// Yes a new rule
-					//
-					if (newRule.getTarget() == null) {
-						newRule.setTarget(new TargetType());
-					}
-					if (self.policyContainer.addItem(newRule, parent) == null) {
-						logger.error("Failed to add new rule");
-					} else {
-						self.tree.setCollapsed(parent, false);
-						self.tree.setCollapsed(newRule, false);
-						self.tree.select(newRule);
-					}
-				} else {
-					//
-					// No - editing existing rule. Copy everything
-					//
-					rule.setEffect(newRule.getEffect());
-					rule.setDescription(newRule.getDescription());
-					self.policyContainer.updateItem(rule);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editCondition(final ConditionType condition, final RuleType rule) {
-		//
-		// Make a copy of it first, in case the user manipulates it
-		// and then decides to NOT save it
-		//
-		final ConditionType copyCondition = (condition == null ? new ConditionType() : XACMLObjectCopy.copy(condition));
-		//
-		// Create the window
-		//
-		final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyCondition, 
-											(copyCondition.getExpression() != null ? copyCondition.getExpression().getValue() : null), 
-											null,
-											self.policyContainer.getVariables());
-		if (condition == null) {
-			expression.setCaption("Create An Expression For The Condition");
-		} else {
-			expression.setCaption("Edit The Condition Expression");
-		}
-		expression.setModal(true);
-		//
-		// Add the close listener
-		//
-		expression.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user hit save?
-				//
-				if (expression.isSaved() == false) {
-					return;
-				}
-				//
-				// Were we creating something new?
-				//
-				if (condition == null) {
-					//
-					// Yes add the new one into the container
-					//
-					if (self.policyContainer.addItem(copyCondition, rule) == null) {
-						logger.error("Failed to add condition");
-					} else {
-						self.tree.setCollapsed(rule, false);
-						self.tree.setCollapsed(copyCondition, false);
-						self.tree.select(copyCondition);
-					}
-				} else {
-					//
-					// We were editing an existing condition, so copy
-					// over the new edited expression.
-					//
-					condition.setExpression(copyCondition.getExpression());
-					//
-					// Update the container
-					//
-					self.policyContainer.updateItem(condition);
-				}
-			}			
-		});
-		expression.center();
-		UI.getCurrent().addWindow(expression);
-	}
-
-	protected void editVariable(final VariableDefinitionType variable, final PolicyType parent) {
-		//
-		// Make a copy of it first, in case the user manipulates it
-		// and then decides to NOT save it
-		//
-		final VariableDefinitionType copyVariable = (variable == null ? new VariableDefinitionType(): XACMLObjectCopy.copy(variable));
-		//
-		// Have the user create or edit the Variables ID
-		//
-		final VariableDefinitionEditorWindow editor = new VariableDefinitionEditorWindow(copyVariable);
-		if (variable == null) {
-			editor.setCaption("Create Variable");			
-		} else {
-			editor.setCaption("Edit Variable" + (copyVariable.getVariableId() == null ? "" : copyVariable.getVariableId()));
-		}
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save button?
-				//
-				if (editor.isSaved() == false) {
-					return;
-				}
-				//
-				// Create the window
-				//
-				final ExpressionBuilderComponent expression = new ExpressionBuilderComponent(copyVariable, 
-													(copyVariable.getExpression() != null ? copyVariable.getExpression().getValue() : null), 
-													null, 
-													self.policyContainer.getVariables());
-				expression.setCaption("Edit The Variable \"" + copyVariable.getVariableId() + "\" Expression");
-				//
-				// Add the close listener
-				//
-				expression.addCloseListener(new CloseListener() {
-					private static final long serialVersionUID = 1L;
-		
-					@Override
-					public void windowClose(CloseEvent e) {
-						//
-						// Did the user click save button?
-						//
-						if (expression.isSaved() == false) {
-							return;
-						}
-						//
-						// Was it a new variable or were we editing an existing one?
-						//
-						if (variable == null) {
-							//
-							// New one, add it to the container
-							//
-							if (self.policyContainer.addItem(copyVariable, parent) == null) {
-								logger.error("Failed to add variable");
-							} else {
-								self.tree.setCollapsed(parent, false);
-								self.tree.setCollapsed(copyVariable, false);
-								self.tree.select(copyVariable);
-							}
-						} else {
-							//
-							// We were editing one, copy it back over.
-							//
-							variable.setVariableId(copyVariable.getVariableId());
-							variable.setExpression(copyVariable.getExpression());
-							//
-							// Update the container
-							//
-							self.policyContainer.updateItem(variable);
-						}
-					}
-				});
-				expression.center();
-				UI.getCurrent().addWindow(expression);
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-
-	protected void editMatch(final MatchType match, final AllOfType allOf, final AnyOfType anyOf, final TargetType target, final String caption) {
-		//
-		// Create an empty match or copy the one we are going to edit.
-		//
-		final MatchType newMatch = (match == null ? new MatchType() : XACMLObjectCopy.copy(match));
-		//
-		// Have user select an attribute
-		//
-		final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, 
-									(newMatch.getAttributeDesignator() != null ? newMatch.getAttributeDesignator() : newMatch.getAttributeSelector()));
-		selection.setCaption("Select Attribute To Match Against");
-		selection.setModal(true);
-		selection.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-			
-			@Override
-			public void windowClose(CloseEvent event) {
-				//
-				// Did the user save anything?
-				//
-				if (selection.isSaved() == false) {
-					return;
-				}
-				//
-				// Save the selected attribute
-				//
-				final Attribute attribute = selection.getAttribute();
-				if (attribute.isDesignator()) {
-					newMatch.setAttributeDesignator(JPAUtils.createDesignator(attribute));
-				} else {
-					newMatch.setAttributeSelector(JPAUtils.createSelector(attribute));
-				}
-				//
-				// Yes - now match it up to a function
-				//
-				final MatchEditorWindow editor = new MatchEditorWindow(newMatch, attribute.getDatatypeBean());
-				editor.setCaption(caption);
-				editor.setModal(true);
-				editor.addCloseListener(new CloseListener() {
-					private static final long serialVersionUID = 1L;
-					
-					@Override
-					public void windowClose(CloseEvent event) {
-						//
-						// Did the user hit save?
-						//
-						if (editor.isSaved() == false) {
-							return;
-						}
-						//
-						// Yes - now we need the value to check the attribute against
-						//
-						final AttributeValueType copyAttributeValue = (newMatch.getAttributeValue() == null ? new AttributeValueType() : newMatch.getAttributeValue());
-//						String currentValue = null;
-//						if (newMatch.getAttributeValue() != null) {
-//							currentValue = XACMLObjectCopy.getContent(newMatch.getAttributeValue().getContent());
-//						}
-						final AttributeValueEditorWindow value = new AttributeValueEditorWindow(copyAttributeValue, attribute.getDatatypeBean());
-						value.setCaption("Set the value the attribute should match against.");
-						value.setModal(true);
-						value.addCloseListener(new CloseListener() {
-							private static final long serialVersionUID = 1L;
-							
-							@Override
-							public void windowClose(CloseEvent event) {
-								//
-								// Did the user save?
-								//
-								if (value.isSaved() == false) {
-									return;
-								}
-								//
-								// Yes - copy the value into the match
-								//
-								AttributeValueType val = new AttributeValueType();
-								val.getContent().add(value.getValue());
-								val.setDataType(value.getDatatype().getXacmlId());
-								newMatch.setAttributeValue(val);
-								//
-								// Was this a new match or were we editing an
-								// existing match?
-								//
-								if (match != null) {
-									//
-									// Editing - now we can save it
-									//
-									match.setAttributeDesignator(newMatch.getAttributeDesignator());
-									match.setAttributeSelector(newMatch.getAttributeSelector());
-									match.setAttributeValue(newMatch.getAttributeValue());
-									match.setMatchId(newMatch.getMatchId());
-									//
-									// Update the container
-									//
-									self.policyContainer.updateItem(match);
-								} else {
-									//
-									// Do we have a parent(s)?
-									//
-									AllOfType allOfParent = allOf;
-									AnyOfType anyOfParent = anyOf;
-									if (allOfParent == null) {
-										//
-										// No direct AllOfParent
-										//
-										if (anyOfParent == null) {
-											//
-											// No AnyOfParent
-											//
-											if (target == null) {
-												logger.error("We should NOT get this");
-												return;
-											}
-											anyOfParent = new AnyOfType();
-											if (self.policyContainer.addItem(anyOfParent, target) == null) {
-												logger.error("Failed to add anyOf parent");
-												assert false;
-											}
-											self.tree.setCollapsed(anyOfParent, false);
-										}
-										allOfParent = new AllOfType();
-										if (self.policyContainer.addItem(allOfParent, anyOfParent) == null) {
-											logger.error("Failed to add allOf parent");
-											assert false;
-										}
-										self.tree.setCollapsed(allOfParent, false);
-									}
-									//
-									// Add the MatchType into the Tree
-									//
-									if (self.policyContainer.addItem(newMatch, allOfParent) == null) {
-										logger.error("Failed to add match");
-										assert false;
-									}
-									self.tree.select(newMatch);
-								}
-							}								
-						});
-						value.center();
-						UI.getCurrent().addWindow(value);
-					}
-				});
-				editor.center();
-				UI.getCurrent().addWindow(editor);
-			}
-		});
-		selection.center();
-		UI.getCurrent().addWindow(selection);
-	}
-	
-	protected void deleteRoot(Object root) {
-		//
-		// TODO - prompt user for new root object
-		//
-		
-	}
-	
-	protected void editObAdvice(boolean isObligation, final Object target) {
-		//
-		// Get the object
-		//
-		String caption;
-		Object expressionsObject = null;
-		if (target instanceof RuleType) {
-			if (isObligation) {
-				expressionsObject = ((RuleType) target).getObligationExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Obligation for Rule";
-				} else {
-					caption = "Edit Obligations for Rule"; 
-				}
-			} else {
-				expressionsObject = ((RuleType) target).getAdviceExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Advice for Rule";
-				} else {
-					caption = "Edit Advice for Rule"; 
-				}
-			}
-		} else if (target instanceof PolicyType) {
-			if (isObligation) {
-				expressionsObject = ((PolicyType) target).getObligationExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Obligation for Policy";
-				} else {
-					caption = "Edit Obligations for Policy"; 
-				}
-			} else {
-				expressionsObject = ((PolicyType) target).getAdviceExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Advice for Policy";
-				} else {
-					caption = "Edit Advice for Policy"; 
-				}
-			}
-		} else if (target instanceof PolicySetType) {
-			if (isObligation) {
-				expressionsObject = ((PolicySetType) target).getObligationExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Obligation for Policy Set";
-				} else {
-					caption = "Edit Obligation for Policy Set"; 
-				}
-			} else {
-				expressionsObject = ((PolicySetType) target).getAdviceExpressions();
-				if (expressionsObject == null) {
-					caption = "Create New Advice for Policy Set";
-				} else {
-					caption = "Edit Advice for Policy Set"; 
-				}
-			}
-		} else {
-			throw new IllegalArgumentException("Expected a rule/policy/policyset.");
-		}
-		//
-		// Make a copy
-		//
-		final Object originalExpressions = expressionsObject;
-		final Object copyExpression = (originalExpressions == null 
-										? (isObligation ? new ObligationExpressionsType() : new AdviceExpressionsType())
-										: originalExpressions instanceof ObligationExpressionsType 
-												? XACMLObjectCopy.copy((ObligationExpressionsType) originalExpressions)
-												: XACMLObjectCopy.copy((AdviceExpressionsType) originalExpressions))
-										;
-		//
-		// Invoke the editor window
-		//
-		final ObligationAdviceEditorWindow window = new ObligationAdviceEditorWindow(copyExpression, this.policyContainer.getVariables());
-		window.setCaption(caption);
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// It was saved - is this a new object?
-				//
-				if (originalExpressions == null) {
-					//
-					// New object
-					//
-					if (self.policyContainer.addItem(copyExpression, target) == null) {
-						logger.error("Failed to add expression");
-						assert false;
-					}
-				} else {
-					//
-					// Editing an existing object.
-					//
-					if (originalExpressions instanceof ObligationExpressionsType) {
-						//
-						// Remove old obligations
-						//
-						while (((ObligationExpressionsType) originalExpressions).getObligationExpression().isEmpty() == false) {
-//						for (ObligationExpressionType old : ((ObligationExpressionsType) originalExpressions).getObligationExpression()) {
-							ObligationExpressionType old  = ((ObligationExpressionsType) originalExpressions).getObligationExpression().get(0);
-							self.policyContainer.removeItem(old);
-						}
-						//
-						// Copy new ones in
-						//
-						for (ObligationExpressionType newObligation : ((ObligationExpressionsType) copyExpression).getObligationExpression()) {
-							self.policyContainer.addItem(newObligation, (ObligationExpressionsType) originalExpressions);
-						}
-					} else if (originalExpressions instanceof AdviceExpressionsType) {
-						((AdviceExpressionsType) originalExpressions).getAdviceExpression().clear();
-						((AdviceExpressionsType) originalExpressions).getAdviceExpression().addAll(((AdviceExpressionsType) copyExpression).getAdviceExpression());
-					}
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void removeMatch(MatchType match, AllOfType parent) {
-		assert match != null && parent != null;
-		if (self.policyContainer.removeItem(match) == false) {
-			logger.error("Failed to remove match");
-			assert false;
-		}
-		//
-		// Check for empty AllOf's
-		//
-		if (parent.getMatch().isEmpty()) {
-			this.removeAllOf(parent, (AnyOfType) this.policyContainer.getParent(parent));
-		}
-	}
-
-	protected void removeAllOf(AllOfType allOf, AnyOfType parent) {
-		assert allOf != null && parent != null;
-		if (self.policyContainer.removeItem(allOf) == false) {
-			logger.error("Failed to remove AllOf");
-			assert false;
-		}
-		//
-		// Check for empty AnyOf's
-		//
-		if (parent.getAllOf().isEmpty()) {
-			this.removeAnyOf(parent, (TargetType) this.policyContainer.getParent(parent));
-		}
-	}
-
-	protected void removeAnyOf(AnyOfType anyOf, TargetType parent) {
-		assert anyOf != null && parent != null;
-		if (self.policyContainer.removeItem(anyOf) == false) {
-			logger.error("Failed to remove anyOf");
-			assert false;
-		}
-	}
-
-	protected boolean clipboardPaste(final Object target, boolean performPaste) {
-		if (this.clipboardObject == null) {
-			if (logger.isDebugEnabled()) {
-				logger.debug("nothing in clipboard.");
-			}
-			return false;
-		}
-		boolean doPaste = false;
-		if (this.clipboardObject instanceof PolicySetType && target instanceof PolicySetType) {
-			doPaste = true;
-		}
-		if (this.clipboardObject instanceof PolicyType && target instanceof PolicySetType) {
-			doPaste = true;
-		}
-		if (this.clipboardObject instanceof RuleType && target instanceof PolicyType) {
-			doPaste = true;
-		}
-		if (doPaste == false) {
-			//
-			// Pasting clipboard object onto target not
-			// possible.
-			//
-			return false;
-		}
-		if (performPaste == false) {
-			//
-			// They did not ask to do the actual paste,
-			// but the called wanted to know if it was
-			// possible.
-			//
-			return true;
-		}
-		//
-		// Do the actual paste
-		//
-		Item item = this.policyContainer.addItem(XACMLObjectCopy.deepCopy(this.clipboardObject), target);
-		assert item != null;
-		this.tree.select(this.clipboardObject);
-		
-		return true;
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("100.0%");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("100.0%");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		mainLayout.setExpandRatio(horizontalLayoutToolbar, 1.0f);
-		
-		// tree
-		tree = new TreeTable();
-		tree.setImmediate(true);
-		tree.setWidth("100.0%");
-		tree.setHeight("100.0%");
-		mainLayout.addComponent(tree);
-		mainLayout.setExpandRatio(tree, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(true);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// checkBoxReadOnly
-		checkBoxReadOnly = new CheckBox();
-		checkBoxReadOnly.setCaption("Read Only");
-		checkBoxReadOnly.setImmediate(false);
-		checkBoxReadOnly
-				.setDescription("Check this to turn-off policy editing.");
-		checkBoxReadOnly.setWidth("-1px");
-		checkBoxReadOnly.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(checkBoxReadOnly);
-		
-		// checkBoxAutoSave
-		checkBoxAutoSave = new CheckBox();
-		checkBoxAutoSave.setCaption("Auto Save");
-		checkBoxAutoSave.setImmediate(false);
-		checkBoxAutoSave
-				.setDescription("Check this to turn-on automatic saving of policy when a change occurs.");
-		checkBoxAutoSave.setWidth("-1px");
-		checkBoxAutoSave.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(checkBoxAutoSave);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setDescription("Click to save the policy.");
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonSave);
-		
-		// buttonViewXML
-		buttonViewXML = new Button();
-		buttonViewXML.setCaption("View XML");
-		buttonViewXML.setImmediate(true);
-		buttonViewXML.setWidth("-1px");
-		buttonViewXML.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonViewXML);
-		
-		// buttonExport
-		buttonExport = new Button();
-		buttonExport.setCaption("Export Policy");
-		buttonExport.setImmediate(false);
-		buttonExport.setWidth("-1px");
-		buttonExport.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonExport);
-		
-		return horizontalLayoutToolbar;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java
deleted file mode 100644
index 8e006d1..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/PolicyWorkspace.java
+++ /dev/null
@@ -1,1640 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.Collection;
-import java.util.Iterator;
-
-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 oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
-
-import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
-import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
-import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
-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.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.Status;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.errors.NoWorkTreeException;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.PushResult;
-import org.vaadin.dialogs.ConfirmDialog;
-import org.vaadin.dialogs.ConfirmDialog.ContentMode;
-
-import org.apache.openaz.xacml.admin.XacmlAdminAuthorization;
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.model.GitRepositoryContainer;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.util.OnDemandFileDownloader;
-import org.apache.openaz.xacml.admin.util.OnDemandFileDownloader.OnDemandStreamResource;
-import org.apache.openaz.xacml.admin.util.XACMLPolicyImporter;
-import org.apache.openaz.xacml.admin.view.windows.GitPushWindow;
-import org.apache.openaz.xacml.admin.view.windows.GitSynchronizeWindow;
-import org.apache.openaz.xacml.admin.view.windows.PolicyNameEditorWindow;
-import org.apache.openaz.xacml.admin.view.windows.PolicyUploadWindow;
-import org.apache.openaz.xacml.admin.view.windows.RenamePolicyFileWindow;
-import org.apache.openaz.xacml.admin.view.windows.SubDomainEditorWindow;
-import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
-import org.apache.openaz.xacml.util.XACMLPolicyScanner;
-import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult;
-import org.apache.openaz.xacml.util.XACMLPolicyWriter;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Item;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.event.Transferable;
-import com.vaadin.event.dd.DragAndDropEvent;
-import com.vaadin.event.dd.DropHandler;
-import com.vaadin.event.dd.acceptcriteria.AcceptAll;
-import com.vaadin.event.dd.acceptcriteria.AcceptCriterion;
-import com.vaadin.ui.AbstractSelect.AbstractSelectTargetDetails;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.HorizontalSplitPanel;
-import com.vaadin.ui.Notification;
-import com.vaadin.ui.TabSheet;
-import com.vaadin.ui.TabSheet.CloseHandler;
-import com.vaadin.ui.TabSheet.Tab;
-import com.vaadin.ui.Table.TableDragMode;
-import com.vaadin.ui.Table.TableTransferable;
-import com.vaadin.ui.TreeTable;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-/**
- * The class represents Policy Editor in Policy Authoring Tool
- */
-public class PolicyWorkspace extends CustomComponent implements DropHandler, OnDemandStreamResource {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private HorizontalSplitPanel horizontalSplitPanel;
-
-	@AutoGenerated
-	private VerticalLayout verticalLayoutRightPanel;
-
-	@AutoGenerated
-	private TabSheet tabSheet;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutRightToolbar;
-
-	@AutoGenerated
-	private Button buttonRight;
-
-	@AutoGenerated
-	private VerticalLayout verticalLayoutLeftPanel;
-
-	@AutoGenerated
-	private TreeTable treeWorkspace;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutLeftToolbar;
-
-	@AutoGenerated
-	private Button buttonLeft;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutLeftToolbarLeft;
-
-	@AutoGenerated
-	private Button buttonExport;
-
-	@AutoGenerated
-	private Button buttonSynchronize;
-
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PolicyWorkspace.class);
-	private final PolicyWorkspace self = this;
-	private final OnDemandFileDownloader downloader = new OnDemandFileDownloader(this);
-	
-	private GitRepositoryContainer treeContainer;
-	
-	private static final Action EXPORT_REPOSITORY = 	new Action ("Export Repository");
-	private static final Action SYNCHRONIZE_REPOSITORY =new Action ("Synchronize");
-	private static final Action PUSH_CHANGES = 			new Action ("Push Changes");
-	private static final Action CREATE_SUBDOMAIN = 		new Action("Create Sub Domain");
-	private static final Action RENAME_SUBDOMAIN = 		new Action("Rename Sub Domain");
-	private static final Action CREATE_NEWPOLICY =		new Action ("Create New Policy");
-	private static final Action RENAME_POLICY =			new Action ("Rename Policy");
-	private static final Action IMPORT_POLICY = 		new Action ("Import Policy");
-	private static final Action DELETE_SUBDOMAIN = 		new Action ("Delete Sub Domain");
-	private static final Action CLONE_POLICY = 			new Action ("Clone Policy");
-	private static final Action VIEW_POLICY = 			new Action ("View Policy");
-	private static final Action EDIT_POLICY = 			new Action ("Edit Policy");
-	private static final Action EXPORT_POLICY = 		new Action ("Export Policy");
-	private static final Action DELETE_POLICY = 		new Action ("Delete Policy");
-	
-	public static final String VIEWNAME = PolicyWorkspace.class.getCanonicalName();
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PolicyWorkspace() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Initialize GUI
-		//
-		this.initializeTree();
-		this.initializeButtons();
-	}
-	
-	protected void initializeButtons() {
-		buttonLeft.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				if (horizontalSplitPanel.getSplitPosition() == 100.0)
-					horizontalSplitPanel.setSplitPosition(36, Unit.PERCENTAGE);
-				else
-					horizontalSplitPanel.setSplitPosition(0);
-			}
-		});
-		buttonRight.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				if (horizontalSplitPanel.getSplitPosition() == 0.0)
-					horizontalSplitPanel.setSplitPosition(36, Unit.PERCENTAGE);
-				else
-					horizontalSplitPanel.setSplitPosition(100, Unit.PERCENTAGE);
-			}
-		});
-		//
-		// Check user write-access
-		//
-		if (((XacmlAdminUI)UI.getCurrent()).isAuthorized( 
-				XacmlAdminAuthorization.AdminAction.ACTION_WRITE, 
-				XacmlAdminAuthorization.AdminResource.RESOURCE_POLICY_WORKSPACE)) {
-			this.buttonSynchronize.addClickListener(new ClickListener() {
-				private static final long serialVersionUID = 1L;
-	
-				@Override
-				public void buttonClick(ClickEvent event) {
-					self.synchronizeRepository();
-				}			
-			});
-		} else {
-			logger.info("user not authorized to write, removing synchronize button.");
-			this.buttonSynchronize.setVisible(false);
-		}
-		//
-		// The export button is attached to dynamic downloader
-		//
-		downloader.extend(this.buttonExport);
-	}
-	
-	protected void initializeTree() {
-		//
-		// This is where the user's Git repository is located
-		//
-		final Path gitPath = ((XacmlAdminUI)UI.getCurrent()).getUserGitPath();
-		//
-		// Create our Git file system container
-		//
-		this.treeContainer = new GitRepositoryContainer(gitPath, gitPath.toFile());
-		//
-		// Create our own filter to filter out File extensions and
-		// also the Git directory.
-		//
-		this.treeContainer.setFilter(new FilenameFilter() {
-
-			@Override
-			public boolean accept(File dir, String name) {
-				//
-				// We don't want any of the hidden files
-				//
-				if (name.startsWith(".git") || name.equals(".DS_Store")) {
-					return false;
-				}
-				//
-				// We definitely want xml files
-				//
-				if (name.endsWith(".xml")) {
-					return true;
-				}
-				//
-				// We should test if its a directory, we want those
-				// included.
-				//
-				Path path = Paths.get(dir.getAbsolutePath(), name);
-				if (Files.isDirectory(path)) {
-					return true;
-				}
-				logger.warn("Filtering out: " + path.toString());
-				return false;
-			}
-			
-		});
-		//
-		// Set TreeTables datasource as our git container
-		//
-		this.treeWorkspace.setContainerDataSource(this.treeContainer);
-		//
-		// Setup other properties etc.
-		//
-		this.treeWorkspace.setItemIconPropertyId("Icon");
-		this.treeWorkspace.setVisibleColumns(new Object[]{"Name", "Version", "Size", "Last Modified", "Status"});
-		this.treeWorkspace.setSizeFull();
-		this.treeWorkspace.setSelectable(true);
-		this.treeWorkspace.setEditable(false);
-		//
-		// Expand the first couple of directories
-		//
-		for (Object id : this.treeWorkspace.getItemIds()) {
-			this.treeWorkspace.setCollapsed(id, false);
-			for (Object child : this.treeWorkspace.getChildren(id)) {
-				this.treeWorkspace.setCollapsed(child, false);
-			}
-		}
-		//
-		// Respond to table selections
-		//
-		/*
-		this.treeWorkspace.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				File selection = (File) self.treeWorkspace.getValue();
-				if (selection != null) {
-					self.buttonImport.setEnabled(selection.isDirectory());
-					self.buttonExport.setEnabled(selection.isFile());
-				} else {
-					
-				}
-			}
-			
-		});
-		*/
-		this.treeWorkspace.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick() && 
-					event.getItemId() instanceof File &&
-					((File) event.getItemId()).isFile()) {
-					self.openPolicyTab((File) event.getItemId(), true);
-				}				
-			}
-		});
-		//
-		// Setup our action handlers
-		//
-		this.treeWorkspace.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					//
-					// Nothing is selected, they right-clicked empty space
-					//
-					return new Action[] {SYNCHRONIZE_REPOSITORY, EXPORT_REPOSITORY, CREATE_SUBDOMAIN};
-				}
-				if (! (target instanceof File)) {
-					return null;
-				}
-				if (((File)target).isDirectory()) {
-					//
-					// Selected a directory
-					//
-					return new Action[] {CREATE_SUBDOMAIN, RENAME_SUBDOMAIN, DELETE_SUBDOMAIN, CREATE_NEWPOLICY, IMPORT_POLICY, PUSH_CHANGES};
-				}
-				if (((File)target).isFile()) {
-					//
-					// Selected a policy file
-					//
-					return new Action[] {VIEW_POLICY, EDIT_POLICY, CLONE_POLICY, EXPORT_POLICY, RENAME_POLICY, DELETE_POLICY, PUSH_CHANGES};
-				}
-				return null;
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == SYNCHRONIZE_REPOSITORY) {
-					self.synchronizeRepository();
-					return;
-				}
-				if (action == EXPORT_REPOSITORY) {
-					self.exportRepository();
-					return;
-				}
-				if (action == PUSH_CHANGES) {
-					self.pushChanges((File) target);
-					return;
-				}
-				if (action == CREATE_SUBDOMAIN) {
-					self.editSubDomain((File) target, null);
-					return;
-				}
-				if (action == RENAME_SUBDOMAIN) {
-					self.editSubDomain((File) self.treeWorkspace.getParent(target), ((File)target).getName());
-					return;
-				}
-				if (action == CREATE_NEWPOLICY) {
-					self.createPolicy((File) target);
-					return;
-				}
-				if (action == RENAME_POLICY) {
-					self.renamePolicy((File) target);
-					return;
-					
-				}
-				if (action == IMPORT_POLICY) {
-					self.importPolicy((File) target);
-					return;
-				}
-				if (action == DELETE_SUBDOMAIN) {
-					self.deleteSubDomain((File) target);
-					return;
-				}
-				if (action == CLONE_POLICY) {
-					self.clonePolicy((File) target);
-					return;
-				}
-				if (action == VIEW_POLICY) {
-					self.openPolicyTab((File) target, true);
-					return;
-				}
-				if (action == EDIT_POLICY) {
-					self.openPolicyTab((File) target, false);
-					return;
-				}
-				if (action == EXPORT_POLICY) {
-					return;
-
-				}
-				if (action == DELETE_POLICY) {
-					self.deletePolicy((File) target);
-					return;
-				}
-			}
-		});
-		//
-		// Set the drop handler
-		//
-		this.treeWorkspace.setDragMode(TableDragMode.ROW);
-		this.treeWorkspace.setDropHandler(this);
-		//
-		// Detect when a tab closes and remove it from the
-		// tab sheet.
-		//
-		this.tabSheet.setCloseHandler(new CloseHandler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onTabClose(TabSheet tabsheet, Component tabContent) {
-				logger.info("tabsheet closing: " + tabsheet.getCaption());
-				tabsheet.removeTab(tabsheet.getTab(tabContent));
-			}
-			
-		});
-	}
-
-	protected void	editSubDomain(final File parent, final String subdomain) {
-		final SubDomainEditorWindow editor = new SubDomainEditorWindow(null);
-		editor.setCaption((subdomain == null ? "Create New SubDomain" : "Edit SubDomain"));
-		editor.setCloseShortcut(KeyCode.ESCAPE);
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				//
-				// Did the user save it
-				//
-				if (editor.isSaved() == false) {
-					return;
-				}
-				String newSubDomain = editor.getSubDomain();
-				if (newSubDomain == null) {
-					logger.warn("Shouldn't have a null subdomain if the user clicked save button");
-					return;
-				}
-				//
-				// New subdomain?
-				//
-				if (subdomain == null) {
-					//
-					// Create new one
-					//
-					Path createDir;
-					if (parent == null) {
-						//
-						// New Root domain
-						//
-						createDir = Paths.get(((XacmlAdminUI)UI.getCurrent()).getUserGitPath().toAbsolutePath().toString(), newSubDomain);
-					} else {
-						//
-						// New subdomain
-						//
-						createDir = Paths.get(parent.getAbsolutePath(), newSubDomain);
-					}
-					try {
-						//
-						// Does the new subdomain exist?
-						//
-						Path newDir;
-						if (Files.exists(createDir)) {
-							//
-							// It already exists
-							//
-							newDir = createDir;
-						} else {
-							//
-							// Create it
-							//
-							newDir = Files.createDirectory(createDir);
-							//
-							// Create empty .gitignore file
-							//
-							Files.createFile(Paths.get(newDir.toString(), ".gitignore"));
-						}
-						//
-						// Setup the TreeTable
-						//
-						File file = newDir.toFile();
-						if (parent == null) {
-							Item item = self.treeWorkspace.addItem(file);
-							if (item != null) {
-								self.treeWorkspace.setCollapsed(file, false);
-								self.treeWorkspace.select(file);
-							}
-						} else {
-							Item item = self.treeWorkspace.addItem(file);
-							if (item != null) {
-								self.treeWorkspace.setParent(file, parent);
-								self.treeWorkspace.setCollapsed(parent, false);
-								self.treeWorkspace.select(file);
-							}
-						}
-					} catch (IOException e) {
-						logger.error("Failed to create subdomain: " + createDir.toString(), e);
-					}
-				} else {
-					//
-					// Get our paths
-					//
-					Path oldDir = Paths.get(parent.getAbsolutePath(), subdomain);
-					Path newDir = Paths.get(parent.getAbsolutePath(), newSubDomain);
-					try {
-						//
-						// Rename the subdomain
-						//
-						Files.move(oldDir, newDir);
-						//
-						// Add to the TreeTable
-						//
-						File newFile = newDir.toFile();
-						File oldFile = oldDir.toFile();
-						Item item = self.treeWorkspace.addItem(newFile);
-						if (item != null) {
-							self.treeWorkspace.setChildrenAllowed(newFile, true);
-							//
-							// Make sure its parent is the same as the old one, unless they
-							// renamed the top-level.
-							//
-							Object parent = self.treeWorkspace.getParent(oldFile);
-							if (parent != null) {
-								self.treeWorkspace.setParent(newFile, parent);
-							}
-							//
-							// Make any children of the old subdomain now children
-							// of the new subdomain.
-							//
-							Collection<?> children = self.treeWorkspace.getChildren(oldFile);
-							Iterator<?> iter = children.iterator();
-							while (iter.hasNext()) {
-								Object child = iter.next();
-								self.treeWorkspace.setParent(child, newFile);
-							}
-							//
-							// Finally remove the old subdomain
-							//
-							self.treeWorkspace.removeItem(oldFile);
-						}
-					} catch (IOException e) {
-						logger.error("Failed to rename subdomain: " + oldDir.toString() + " to: " + newDir.toString(), e);
-					}
-				}
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-	
-	protected void	deleteSubDomain(final File subdomain) {
-		String message = "Are you sure you want to delete subdomain\n" + subdomain.getName() + "\nThis will remove <B>ALL</B> of its subdomains and policy files.";
-		ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm SubDomain Deletion", message, "Delete", "Cancel");
-		dialog.setContentMode(ContentMode.HTML);
-		dialog.show(getUI(), new ConfirmDialog.Listener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClose(ConfirmDialog dialog) {
-				if (dialog.isConfirmed()) {
-					//
-					// Iterate the subdomain
-					//
-					try {
-						Files.walkFileTree(Paths.get(subdomain.getAbsolutePath()), new SimpleFileVisitor<Path>() {
-							@Override
-							public FileVisitResult visitFile(Path deleteFile, BasicFileAttributes attrs)
-									throws IOException {
-								try {
-									boolean removeFromTree = deleteFile.getFileName().toString().endsWith(".xml");
-									Files.delete(deleteFile);									
-									if (removeFromTree) {
-										self.treeWorkspace.removeItem(deleteFile.toFile());
-									}
-									if (logger.isDebugEnabled()) {
-										logger.debug("Deleted file: " + deleteFile.toString());
-									}
-								} catch (IOException e) {
-									logger.error("Failed to delete file: " + deleteFile.toString(), e);
-									return FileVisitResult.TERMINATE;
-								}
-								return super.visitFile(deleteFile, attrs);
-							}
-
-							@Override
-							public FileVisitResult postVisitDirectory(Path dir, IOException exc)
-									throws IOException {
-								try {
-									Files.delete(dir);									
-									self.treeWorkspace.removeItem(dir.toFile());
-									if (logger.isDebugEnabled()) {
-										logger.debug("Deleted dir: " + dir.toString());
-									}
-								} catch (IOException e) {
-									logger.error("Failed to delete directory: " + dir.toString(), e);
-									return FileVisitResult.TERMINATE;
-								}
-								return super.postVisitDirectory(dir, exc);
-							}
-							
-						});
-					} catch (IOException e) {
-						logger.error("Failed to walk subdomain: " + subdomain.getAbsolutePath(), e);
-					}
-				}
-			}
-			
-		}, true);
-		
-	}
-	
-	protected void	createPolicy(final File parentDirectory) {
-		//
-		// Construct our parameters
-		//
-		Path parent = Paths.get(parentDirectory.getAbsolutePath());
-		Path newFile = this.getNextFilename(parent, "Policy");
-		//
-		// Run the window
-		//
-		this.runPolicyWindow("Create New Policy", parent, newFile, null, null);
-	}
-	
-	protected void	renamePolicy(final File policy) {
-		//
-		// Run the rename window
-		//
-		final RenamePolicyFileWindow window = new RenamePolicyFileWindow(policy.getName());
-		window.setCaption("Rename Policy");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-			
-			@Override
-			public void windowClose(CloseEvent event) {
-				String newFilename = window.getNewFilename();
-				if (newFilename == null) {
-					//
-					// User cancelled
-					//
-					return;
-				}
-				Path newPolicy = Paths.get(policy.getParent(), newFilename);
-				if (Files.exists(newPolicy)) {
-					Notification.show("Cannot rename to an existing file", Notification.Type.ERROR_MESSAGE);
-					return;
-				}
-				try {
-					if (policy.renameTo(newPolicy.toFile()) == false) {
-						throw new Exception("No known error, rename failed");
-					}
-					self.treeContainer.updateItem(newPolicy.getParent().toFile());
-				} catch (Exception e) {
-					Notification.show("Failed to rename file: " + e.getLocalizedMessage());
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void	clonePolicy(final File policy) {
-		//
-		// Figure out a new name for the cloned policy
-		//
-		Path policyClone = Paths.get(policy.getAbsolutePath());
-		Path newFile = this.getNextFilename(policyClone.getParent(), policy.getName());
-		if (newFile == null) {
-			return;
-		}
-		//
-		// Scan the policy in, replace policy ID's and rule ID's
-		//
-		Object policyData = new XACMLPolicyScanner(policyClone, new XACMLPolicyScanner.SimpleCallback() {
-
-			@Override
-			public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) {
-				rule.setRuleId(((XacmlAdminUI)getUI()).newRuleID());
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicySet(PolicySetType parent, PolicySetType policySet) {
-				policySet.setPolicySetId(((XacmlAdminUI)getUI()).newPolicyID());
-				policySet.setVersion("1");
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicy(PolicySetType parent, PolicyType policy) {
-				policy.setPolicyId(((XacmlAdminUI)getUI()).newPolicyID());
-				policy.setVersion("1");
-				return CallbackResult.CONTINUE;
-			}
-			
-		}).scan();
-		//
-		// Run the window
-		//
-		this.runPolicyWindow("Clone Policy", newFile.getParent(), newFile.getFileName(), policyData, null);
-	}
-	
-	protected void	runPolicyWindow(String caption, final Path parentPath, final Path policyPath, final Object policyData, final Path oldPolicyFile) {
-		//
-		// Create our editor window
-		//
-		final PolicyNameEditorWindow editor = new PolicyNameEditorWindow((policyPath != null ? policyPath.getFileName().toString() : null), 
-															policyData, 
-															((XacmlAdminUI)getUI()).getPolicyAlgorithms(),
-															((XacmlAdminUI)getUI()).getRuleAlgorithms());
-		editor.setCaption(caption);
-		editor.setCloseShortcut(KeyCode.ESCAPE);
-		editor.setModal(true);
-		editor.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-			
-			@Override
-			public void windowClose(CloseEvent event) {
-				//
-				// Did the user hit save button or esc?
-				//
-				if (editor.isSaved() == false) {
-					return;
-				}
-				final Object data = editor.getPolicyData();
-				String filename = editor.getPolicyFilename();
-				if (filename == null || data == null) {
-					logger.warn("Editor said is was saved but filename/data is null.");
-					return;
-				}
-				//
-				// Determine new path
-				//
-				final Path newPolicyPath = Paths.get(parentPath.toString(), filename);
-				//
-				// Is it ok to overwrite the new file?
-				//
-				try {
-					//
-					// Handle if we are not replacing an old file and we are overwriting
-					// an existing file.
-					//
-					if (self.isOverwritingAPolicy(newPolicyPath, oldPolicyFile) == false && Files.exists(newPolicyPath)) {
-						//
-						// Confirm they wanted to do this, and figure out
-						// new version number.
-						//
-						String message = "You are overwriting a file: " + newPolicyPath.getFileName().toString();
-						ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Policy File Overwriting", message, "Overwrite", "Cancel");
-						dialog.setData(false);
-						dialog.setContentMode(ContentMode.HTML);
-						dialog.setModal(true);
-						dialog.show(getUI(), new ConfirmDialog.Listener() {
-							private static final long serialVersionUID = 1L;
-
-							@Override
-							public void onClose(ConfirmDialog dialog) {
-								if (dialog.isConfirmed()) {
-									//
-									// Yep the user wants to overwrite it
-									//
-									self.savePolicy(newPolicyPath, data, oldPolicyFile);
-									//
-									// Open it for editing
-									//
-									self.openPolicyTab(newPolicyPath.toFile(), false);
-								}
-							}
-							
-						}, true);
-						//
-						// Exit out of this thread
-						//
-						return;
-					}
-				} catch (Exception e) {
-					logger.error(e);
-					return;
-				}
-				//
-				// Save it off
-				//
-				self.savePolicy(newPolicyPath, data, oldPolicyFile);
-				//
-				// Open it for editing
-				//
-				self.openPolicyTab(newPolicyPath.toFile(), false);
-			}
-		});
-		editor.center();
-		UI.getCurrent().addWindow(editor);
-	}
-
-	protected Path	getNextFilename(Path parent, String filename) {
-		filename = FilenameUtils.removeExtension(filename);
-		Path newFile = null;
-		int i = 0;
-		while (true) {
-			newFile = Paths.get(parent.toString(), String.format("%s(%02d)", filename, i++) + ".xml");
-			if (Files.notExists(newFile)) {
-				return newFile;
-			}
-			if (i == 100) {
-				logger.error("Could not construct a new name for cloned policy.");
-				return null;
-			}
-		}
-		
-	}
-	
-	protected boolean isOverwritingAPolicy(Path newPolicyPath, Path oldPolicyPath) throws Exception {
-		//
-		// Check to see if we were editing an existing file. Then check if the
-		// new file actually exists. Then check if we are overwriting the original old file
-		//
-		if (oldPolicyPath != null && Files.exists(newPolicyPath) && Files.isSameFile(newPolicyPath, oldPolicyPath)) {
-			//
-			// Yes its the same, overwriting it is expected.
-			//
-			logger.info("isOverwritingAPolicy");
-			return true;
-		}
-		return false;
-	}
-
-	protected void	savePolicy(final Path newPolicyPath, final Object policyData, Path oldPolicyPath) {
-		//
-		// Are they overwriting another policy?
-		//
-		String version = "1.0";
-		boolean delete = false;
-		if (oldPolicyPath != null) {
-			//
-			// This policy name was being edited. Is it still the same?
-			//
-			try {
-				delete = true;
-				if (Files.exists(newPolicyPath) && Files.isSameFile(newPolicyPath, oldPolicyPath)) {
-					delete = false;
-				}
-			} catch (Exception e) {
-				logger.error("Could not determine if same file", e);
-				return;
-			}
-			logger.info("Deleting old file: " + delete);
-		}
-		//
-		// Are we now overwriting another file?
-		//
-		if (Files.exists(newPolicyPath)) {
-			//
-			// Yes
-			//
-			logger.info("Overwriting file");
-			//
-			// Overwrite is happening. Bump the version (IF WE CAN)
-			//
-//TODO - What if user wants to change something other than the last number?  For example, changing 1.5.23 to 2.0.0.
-//TODO	  We need a mechanism that allows the user to specify the new policy version (disallowing backtracking) if they desire
-//TODO	  and get that new number (if any) passed down to here.  This code then becomes the "then" branch of "If new version has been specified..."
-			try {
-				int[] versionArray = StdPDPPolicy.versionStringToArray(XACMLPolicyScanner.getVersion(newPolicyPath));
-				// increment the right-most digit
-				versionArray[versionArray.length - 1]++;
-				version = StdPDPPolicy.versionArrayToString(versionArray);
-			} catch (NumberFormatException | IOException e) {
-				try {
-					logger.warn("Previous version '" + XACMLPolicyScanner.getVersion(newPolicyPath) + "' not a series of itegers");
-				} catch (IOException e1) {
-					logger.error("could not get previous version");
-				}
-//TODO - This may not be wise since the intent is to increase the version number.  Perhaps we should abort this an go back to the user?
-				version = "1.0";
-			}
-			if (policyData instanceof PolicySetType) {
-				((PolicySetType) policyData).setVersion(version);
-			} else if (policyData instanceof PolicyType) {
-				((PolicyType) policyData).setVersion(version);
-			}
-		} else {
-			//
-			// Nope, a completely new file
-			//
-			logger.info("New file");
-		}
-		//
-		// Is the root a PolicySet or Policy?
-		//
-		Path finalPolicyPath;
-		if (policyData instanceof PolicySetType) {
-			//
-			// Write it out
-			//
-			finalPolicyPath = XACMLPolicyWriter.writePolicyFile(newPolicyPath, (PolicySetType) policyData);
-		} else if (policyData instanceof PolicyType) {
-			//
-			// Write it out
-			//
-			finalPolicyPath = XACMLPolicyWriter.writePolicyFile(newPolicyPath, (PolicyType) policyData);
-		} else {
-			logger.error("Unknown data type sent back.");
-			return;
-		}
-		//
-		// Did it get written?
-		//
-		if (finalPolicyPath == null || ! Files.exists(finalPolicyPath)) {
-			logger.error("Failed to write policy file.");
-			return;
-		}
-		//
-		// Add it into our tree
-		//
-		this.addPolicyFileToTree(finalPolicyPath.getParent().toFile(), finalPolicyPath.toFile());
-		//
-		// Do we need to delete the old file?
-		//
-		if (oldPolicyPath != null && delete) {
-			try {
-				Files.delete(oldPolicyPath);
-			} catch (Exception e) {
-				logger.error("Failed to delete old policy", e);
-			}
-			if (self.treeWorkspace.removeItem(oldPolicyPath.toFile()) == false) {
-				logger.warn("Failed to remove old policy path");
-			}
-		}
-	}	
-
-	protected void	deletePolicy(final File policy) {
-		String message = "Are you sure you want to delete policy: " + policy.getName();
-		ConfirmDialog dialog = ConfirmDialog.getFactory().create("Confirm Policy File Deletion", message, "Delete", "Cancel");
-		dialog.setContentMode(ContentMode.HTML);
-		dialog.show(getUI(), new ConfirmDialog.Listener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClose(ConfirmDialog dialog) {
-				if (dialog.isConfirmed() && policy.delete()) {
-					self.treeWorkspace.removeItem(policy);
-					if (logger.isDebugEnabled()) {
-						logger.debug("Deleted file: " + policy.toString());
-					}
-				}
-			}
-			
-		}, true);
-		
-	}
-
-	protected void	importPolicy(final File domain) {
-		//
-		// Get the current domain
-		//
-		if (! domain.isDirectory()) {
-			logger.error("Table must have a directory selected to import the file.");
-			return;
-		}
-		//
-		// Create the upload window
-		//
-		final PolicyUploadWindow upload = new PolicyUploadWindow(Paths.get(domain.toURI()));
-		upload.setCaption("Import Xacml 3.0 Policy File");
-		upload.setCloseShortcut(KeyCode.ESCAPE);
-		upload.setModal(true);
-		upload.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Was it successful?
-				//
-				Path newFile = upload.getUploadedFile();
-				if (newFile == null) {
-					return;
-				}
-				//
-				// Add it
-				//
-				self.addPolicyFileToTree(domain, newFile.toFile());
-				//
-				// Are we importing anything in the policy file?
-				//
-				boolean importAttributes = upload.importAttributes();
-				boolean importObligations = upload.importObligations();
-				boolean importAdvice = upload.importAdvice();
-				if (importAttributes || importObligations || importAdvice) {
-					//
-					// Create our importer
-					//
-					XACMLPolicyImporter importer = new XACMLPolicyImporter();
-					importer.setImportAttributes(importAttributes);
-					importer.setImportObligations(importObligations);
-					importer.setImportAdvice(importAdvice);		
-					importer.setIgnoreStandardAttributes(upload.ignoreStandard());
-					//
-					// Yes load and scan the policy
-					//
-					new XACMLPolicyScanner(newFile, importer).scan();
-				}
-			}
-		});
-		upload.center();
-		UI.getCurrent().addWindow(upload);
-	}
-	
-	protected	void	addPolicyFileToTree(File domain, File file) {
-		//
-		// Add it into our tree
-		//
-		if (this.treeWorkspace.addItem(file) != null) {
-			//
-			// Make sure it has the right parent
-			//
-			this.treeWorkspace.setParent(file, domain);
-			//
-			// Select our new policy
-			//
-			self.treeWorkspace.select(file);
-		} else {
-			logger.error("Failed to add policy to workspace tree");
-		}
-	}
-	
-	/*
-	protected void	publishPolicy(final File policy) {
-		//
-		// Get its ID
-		//
-		Item item = this.treeContainer.getItem(policy);
-		if (item == null) {
-			logger.error("Failed to get the item");
-			return;
-		}
-		Object policyData = item.getItemProperty("Data");
-		if (policyData == null) {
-			logger.error("Failed to get item data property.");
-			return;
-		}
-		String fullId = XACMLPolicyScanner.getID(policyData);
-		String version = XACMLPolicyScanner.getVersion(policyData);
-		if (fullId == null || version == null) {
-			logger.error("Failed to get policy Id");
-			return;
-		}
-		List<String> ids = Lists.newArrayList(Splitter.on(':').split(fullId));
-		if (ids.isEmpty()) {
-			logger.error("Couldn't parse policy Id");
-			return;
-		}
-		final String id = ids.get(ids.size() - 1) + "." + version;
-		//
-		// Is there only one group?
-		//
-		PAPEngine engine = ((XacmlAdminUI)getUI()).getPAPEngine();
-		Set<PDPGroup> groups;
-		PDPGroup defaultGroup;
-		try {
-			groups = engine.getPDPGroups();
-		} catch (PAPException e) {
-			String message = "Unable to retrieve Groups from server: " + e;
-			logger.error(message, e);
-			throw new RuntimeException(message);
-		}
-		try {
-			defaultGroup = engine.getDefaultGroup();
-		} catch (PAPException e) {
-			String message = "Unable to retrieve Default Group from server: " + e;
-			logger.error(message, e);
-			throw new RuntimeException(message);
-		}
-		if (groups.size() == 1) {
-			this.doPublish(id, policy, defaultGroup);
-			return;
-		}
-		//
-		// Have user select a group
-		//
-		final SelectPDPGroupWindow window = new SelectPDPGroupWindow(groups, "Select PDP Group to publish in");
-		window.setCaption("Select PDP Group");
-		window.setCloseShortcut(KeyCode.ESCAPE);
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-			
-			@Override
-			public void windowClose(CloseEvent event) {
-				PDPGroup group = window.selectedGroup();
-				if (group != null) {
-					self.doPublish(id, policy, group);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-
-	}
-	
-	protected void	doPublish(String id, File policy, PDPGroup group) {
-		//
-		// The policy status must be up-to-date
-		//
-		// TODO
-		
-		//
-		// TODO - get list of referenced policies and publish
-		// them first.
-		//
-		
-		//
-		// Publish the policy
-		//
-		
-		PAPEngine engine = ((XacmlAdminUI)getUI()).getPAPEngine();
-		try (InputStream is = new FileInputStream(policy)) {
-			engine.publishPolicy(id, policy.getName(), true, is, group);
-		} catch (PAPException | IOException e) {
-			logger.error("Failed to publish policy: ", e);
-		}
-	}
-	*/
-	
-	protected void	pushChanges(final File target) {
-		try {
-			//
-			// Grab our working repository
-			//
-    		Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
-			final Git git = Git.open(repoPath.toFile());
-			//
-			// Get our status
-			//
-			final String base;
-			Status status;
-			if (target == null) {
-				base = ".";
-			} else {
-				Path relativePath = repoPath.relativize(Paths.get(target.getPath()));
-				base = relativePath.toString();
-			}
-			if (logger.isDebugEnabled()) {
-				logger.debug("Status on base: " + base);
-			}
-			status = git.status().addPath(base).call();
-			//
-			// Check if its clean
-			//
-			if (status.isClean()) {
-				//
-				// Its clean
-				//
-				AdminNotification.warn(target.getName() + " is clean!");
-				return;
-			}
-			//
-			// Create the window
-			//
-			final GitPushWindow window = new GitPushWindow(git, target, status);
-			window.setCaption("Push Changes");
-			window.setModal(true);
-			window.addCloseListener(new CloseListener() {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public void windowClose(CloseEvent e) {
-					if (window.isSaved() == false) {
-						return;
-					}
-					try {
-						//
-						// Needs to be added first
-						//
-						DirCache cache = git.add().addFilepattern(base).call();
-						for (int i = 0; i < cache.getEntryCount(); i++) {
-							DirCacheEntry entry = cache.getEntry(i);
-							if (logger.isDebugEnabled()) {
-								logger.debug("Entry: " + entry);
-							}
-						}
-						//
-						// Next they need to be committed
-						//
-						RevCommit rev = git.commit().setMessage(window.getComment()).call();
-						if (logger.isDebugEnabled()) {
-							logger.debug("RevCommit: " + rev);
-						}
-						//
-						// Now we can push changes to the Git repository
-						//
-						Iterable<PushResult> results = git.push().call();
-						for (PushResult result : results) {
-							logger.info(result);
-						}
-						//
-						// Have the container fire an item set change notification
-						//
-						self.treeContainer.updateItem(target);
-					} catch (NoWorkTreeException | GitAPIException e1) {
-						logger.error(e);
-						AdminNotification.error("Exception occurred while trying to push: " + e1);
-					}
-				}
-				
-			});
-			window.center();
-			UI.getCurrent().addWindow(window);
-		} catch (IOException | GitAPIException e) {
-			logger.error(e);
-			AdminNotification.error("Exception occurred while trying to get status: " + e);
-		}
-	}
-	
-	protected void synchronizeRepository() {
-		final GitSynchronizeWindow window = new GitSynchronizeWindow();
-		window.setCaption("Synchronize with server repository?");
-		window.setModal(true);
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void exportRepository() {
-		this.buttonExport.click();
-	}
-	
-	@Override
-	public String getFilename() {
-		return "Repository.tgz";
-	}
-
-	@Override
-	public InputStream getStream() {
-		//
-		// Grab our working repository
-		//
-		final Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
-		Path workspacePath = ((XacmlAdminUI)getUI()).getUserWorkspace();
-		final Path tarFile = Paths.get(workspacePath.toString(), "Repository.tgz");
-		
-		try (OutputStream os = Files.newOutputStream(tarFile)) {
-			try (GzipCompressorOutputStream gzOut = new GzipCompressorOutputStream(os)) {
-				try (TarArchiveOutputStream tarOut = new TarArchiveOutputStream(gzOut)) {
-					
-					tarOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
-					
-					Files.walkFileTree(repoPath, new SimpleFileVisitor<Path>() {
-
-						@Override
-						public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
-							if (dir.getFileName().toString().startsWith(".git")) {
-								return FileVisitResult.SKIP_SUBTREE;
-							}
-							Path relative = repoPath.relativize(dir);
-							if (relative.toString().isEmpty()) {
-								return super.preVisitDirectory(dir, attrs);
-							}
-							TarArchiveEntry entry = new TarArchiveEntry(relative.toFile());
-							tarOut.putArchiveEntry(entry);
-							tarOut.closeArchiveEntry();
-							return super.preVisitDirectory(dir, attrs);
-						}
-
-						@Override
-						public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-							if (file.getFileName().toString().endsWith(".xml") == false) {
-								return super.visitFile(file, attrs);
-							}
-							Path relative = repoPath.relativize(file);
-							TarArchiveEntry entry = new TarArchiveEntry(relative.toFile());
-							entry.setSize(Files.size(file));
-							tarOut.putArchiveEntry(entry);
-							try {
-								IOUtils.copy(Files.newInputStream(file), tarOut);
-							} catch (IOException e) {
-								logger.error(e);
-							}
-							tarOut.closeArchiveEntry();
-							return super.visitFile(file, attrs);
-						}
-						
-					});
-					tarOut.finish();
-				}				
-			}
-		} catch (IOException e) {
-			logger.error(e);
-		}
-		try {
-			return Files.newInputStream(tarFile);
-		} catch (IOException e) {
-			logger.error(e);
-		}
-		return null;
-	}
-
-	protected void openPolicyTab(File policy, boolean readOnly) {
-		//
-		// Sanity check
-		//
-		assert policy != null;
-		assert policy.isFile();
-		if (policy == null || ! policy.isFile()) {
-			throw new IllegalArgumentException("You must specify a file.");
-		}
-		Status status;
-		Path relativePath;
-		String base;
-		try {
-			//
-			// Grab our working repository
-			//
-			Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
-			final Git git = Git.open(repoPath.toFile());
-			//
-			// Get our status
-			//
-			relativePath = repoPath.relativize(Paths.get(policy.getPath()));
-			base = relativePath.toString();
-			if (logger.isDebugEnabled()) {
-				logger.debug("Status on base: " + base);
-			}
-			status = git.status().addPath(base).call();
-		} catch (NoWorkTreeException | IOException | GitAPIException e) {
-			logger.error("Failed to get status on " + policy + " " + e);
-			AdminNotification.error("Could not get Git status on the file.");
-			return;
-		}
-		//
-		// Check if its clean
-		//
-		if (status.isClean() == false) {
-			//
-			// Check if its conflicting
-			//
-			for (String conflict : status.getConflicting()) {
-				if (conflict.equals(base)) {
-					//
-					// Yes - we won't be able to edit it
-					//
-					AdminNotification.error("Policy has conflicts with master, please synchronize the repository.");
-					return;
-				}
-			}
-		}
-		//
-		// Check to see if there already is a tab open
-		//
-		Iterator<Component> iter = self.tabSheet.iterator();
-		while (iter.hasNext()) {
-			Component c = iter.next();
-			if (c instanceof PolicyEditor) {
-				Object data = ((PolicyEditor) c).getData();
-				if (data != null && data instanceof File && ((File)data).equals(policy)) {
-					self.tabSheet.setSelectedTab(c);
-					return;
-				}
-			}
-		}
-		//
-		// No tab is open, create a new one
-		//
-		PolicyEditor editor = null;
-		try {
-			editor = new PolicyEditor(policy, this.treeContainer, readOnly);
-		} catch (IOException e) {
-			logger.error("Failed to open policy");
-			editor = null;
-		}
-		if (editor != null) {
-			editor.setWidth("100%");
-			Tab tab = self.tabSheet.addTab(editor);
-			editor.setTab(tab);
-			tab.setClosable(true);
-			
-			self.tabSheet.setSelectedTab(editor);
-		} else {
-			AdminNotification.error("The Policy File is not a Xacml 3.0 policy.");
-		}
-	}
-
-	@Override
-	public void drop(DragAndDropEvent event) {
-		Transferable t = event.getTransferable();
-		Component source = t.getSourceComponent();
-		if (source != this.treeWorkspace) {
-			assert false;
-			throw new IllegalArgumentException();
-		}
-		TableTransferable tt = (TableTransferable) t;
-		File sourceFile = (File) tt.getItemId();
-		
-		AbstractSelectTargetDetails target = (AbstractSelectTargetDetails)event.getTargetDetails();
-		File targetFile = (File) target.getItemIdOver();
-		
-		if (sourceFile.isFile() && targetFile != null && targetFile.isDirectory()) {
-			//
-			// Construct destination filename
-			//
-			Path dest = targetFile.toPath().resolve(sourceFile.getName());
-			//
-			// Check if the target domain exists
-			//
-			if (Files.exists(dest)) {
-				//
-				// Prompt the user
-				//
-				Notification.show("A policy file with that name already exists in that directory.", Notification.Type.ERROR_MESSAGE);
-			} else {
-				//
-				// Go ahead and rename it
-				//
-				this.renamePolicyFile(sourceFile, dest.toFile(), targetFile);
-			}
-		}
-	}
-	
-	protected void renamePolicyFile(File sourceFile, File dest, File parent) {
-		try {
-			if (sourceFile.renameTo(dest)) {
-				this.treeContainer.setParent(sourceFile, parent);
-				this.treeContainer.updateItem(parent);
-			}
-		} catch (Exception e) {
-			String error = "Failed to rename " + sourceFile + " to: " + dest + System.lineSeparator() + e.getLocalizedMessage();
-			logger.error(error);
-			AdminNotification.error(error);
-		}
-	}
-
-	@Override
-	public AcceptCriterion getAcceptCriterion() {
-        return AcceptAll.get();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("100%");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("100.0%");
-		
-		// horizontalSplitPanel
-		horizontalSplitPanel = buildHorizontalSplitPanel();
-		mainLayout.addComponent(horizontalSplitPanel);
-		mainLayout.setExpandRatio(horizontalSplitPanel, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalSplitPanel buildHorizontalSplitPanel() {
-		// common part: create layout
-		horizontalSplitPanel = new HorizontalSplitPanel();
-		horizontalSplitPanel.setImmediate(false);
-		horizontalSplitPanel.setWidth("100.0%");
-		horizontalSplitPanel.setHeight("100.0%");
-		
-		// verticalLayoutLeftPanel
-		verticalLayoutLeftPanel = buildVerticalLayoutLeftPanel();
-		horizontalSplitPanel.addComponent(verticalLayoutLeftPanel);
-		
-		// verticalLayoutRightPanel
-		verticalLayoutRightPanel = buildVerticalLayoutRightPanel();
-		horizontalSplitPanel.addComponent(verticalLayoutRightPanel);
-		
-		return horizontalSplitPanel;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildVerticalLayoutLeftPanel() {
-		// common part: create layout
-		verticalLayoutLeftPanel = new VerticalLayout();
-		verticalLayoutLeftPanel.setImmediate(false);
-		verticalLayoutLeftPanel.setWidth("100.0%");
-		verticalLayoutLeftPanel.setHeight("100.0%");
-		verticalLayoutLeftPanel.setMargin(true);
-		verticalLayoutLeftPanel.setSpacing(true);
-		
-		// horizontalLayoutLeftToolbar
-		horizontalLayoutLeftToolbar = buildHorizontalLayoutLeftToolbar();
-		verticalLayoutLeftPanel.addComponent(horizontalLayoutLeftToolbar);
-		
-		// treeWorkspace
-		treeWorkspace = new TreeTable();
-		treeWorkspace.setImmediate(true);
-		treeWorkspace.setWidth("100.0%");
-		treeWorkspace.setHeight("100.0%");
-		verticalLayoutLeftPanel.addComponent(treeWorkspace);
-		verticalLayoutLeftPanel.setExpandRatio(treeWorkspace, 1.0f);
-		
-		return verticalLayoutLeftPanel;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutLeftToolbar() {
-		// common part: create layout
-		horizontalLayoutLeftToolbar = new HorizontalLayout();
-		horizontalLayoutLeftToolbar.setImmediate(false);
-		horizontalLayoutLeftToolbar.setWidth("100.0%");
-		horizontalLayoutLeftToolbar.setHeight("-1px");
-		horizontalLayoutLeftToolbar.setMargin(false);
-		horizontalLayoutLeftToolbar.setSpacing(true);
-		
-		// horizontalLayoutLeftToolbarLeft
-		horizontalLayoutLeftToolbarLeft = buildHorizontalLayoutLeftToolbarLeft();
-		horizontalLayoutLeftToolbar
-				.addComponent(horizontalLayoutLeftToolbarLeft);
-		
-		// buttonLeft
-		buttonLeft = new Button();
-		buttonLeft.setCaption("<<");
-		buttonLeft.setImmediate(true);
-		buttonLeft.setDescription("Minimize left panel.");
-		buttonLeft.setWidth("-1px");
-		buttonLeft.setHeight("-1px");
-		horizontalLayoutLeftToolbar.addComponent(buttonLeft);
-		horizontalLayoutLeftToolbar.setComponentAlignment(buttonLeft,
-				new Alignment(34));
-		
-		return horizontalLayoutLeftToolbar;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutLeftToolbarLeft() {
-		// common part: create layout
-		horizontalLayoutLeftToolbarLeft = new HorizontalLayout();
-		horizontalLayoutLeftToolbarLeft.setImmediate(false);
-		horizontalLayoutLeftToolbarLeft.setWidth("-1px");
-		horizontalLayoutLeftToolbarLeft.setHeight("-1px");
-		horizontalLayoutLeftToolbarLeft.setMargin(false);
-		horizontalLayoutLeftToolbarLeft.setSpacing(true);
-		
-		// buttonSynchronize
-		buttonSynchronize = new Button();
-		buttonSynchronize.setCaption("Synchronize Repository");
-		buttonSynchronize.setImmediate(true);
-		buttonSynchronize
-				.setDescription("Synchronize local repository with main branch.");
-		buttonSynchronize.setWidth("-1px");
-		buttonSynchronize.setHeight("-1px");
-		horizontalLayoutLeftToolbarLeft.addComponent(buttonSynchronize);
-		
-		// buttonExport
-		buttonExport = new Button();
-		buttonExport.setCaption("Export Workspace");
-		buttonExport.setImmediate(true);
-		buttonExport.setDescription("Export your workspace to your local drive.");
-		buttonExport.setWidth("-1px");
-		buttonExport.setHeight("-1px");
-		horizontalLayoutLeftToolbarLeft.addComponent(buttonExport);
-		
-		return horizontalLayoutLeftToolbarLeft;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildVerticalLayoutRightPanel() {
-		// common part: create layout
-		verticalLayoutRightPanel = new VerticalLayout();
-		verticalLayoutRightPanel.setImmediate(false);
-		verticalLayoutRightPanel.setWidth("100.0%");
-		verticalLayoutRightPanel.setHeight("-1px");
-		verticalLayoutRightPanel.setMargin(true);
-		verticalLayoutRightPanel.setSpacing(true);
-		
-		// horizontalLayoutRightToolbar
-		horizontalLayoutRightToolbar = buildHorizontalLayoutRightToolbar();
-		verticalLayoutRightPanel.addComponent(horizontalLayoutRightToolbar);
-		
-		// tabSheet
-		tabSheet = new TabSheet();
-		tabSheet.setImmediate(true);
-		tabSheet.setWidth("100.0%");
-		tabSheet.setHeight("-1px");
-		verticalLayoutRightPanel.addComponent(tabSheet);
-		verticalLayoutRightPanel.setExpandRatio(tabSheet, 1.0f);
-		
-		return verticalLayoutRightPanel;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutRightToolbar() {
-		// common part: create layout
-		horizontalLayoutRightToolbar = new HorizontalLayout();
-		horizontalLayoutRightToolbar.setImmediate(false);
-		horizontalLayoutRightToolbar.setWidth("100.0%");
-		horizontalLayoutRightToolbar.setHeight("-1px");
-		horizontalLayoutRightToolbar.setMargin(false);
-		horizontalLayoutRightToolbar.setSpacing(true);
-		
-		// buttonRight
-		buttonRight = new Button();
-		buttonRight.setCaption(">>");
-		buttonRight.setImmediate(true);
-		buttonRight.setDescription("Restore left panel.");
-		buttonRight.setWidth("-1px");
-		buttonRight.setHeight("-1px");
-		horizontalLayoutRightToolbar.addComponent(buttonRight);
-		
-		return horizontalLayoutRightToolbar;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java
deleted file mode 100644
index c554568..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/Simulator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.annotations.Theme;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.ui.AbsoluteLayout;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.UI;
-
-public class Simulator extends CustomComponent {
-
-	@AutoGenerated
-	private AbsoluteLayout mainLayout;
-
-	private static final long serialVersionUID = 1L;
-
-	@Theme("xacml_pap_admin")
-	public static class SimulatorUI extends UI {
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		protected void init(VaadinRequest request) {
-			// TODO Auto-generated method stub
-
-		}
-
-	}
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public Simulator() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-
-		// TODO add user code here
-	}
-
-	@AutoGenerated
-	private void buildMainLayout() {
-		// the main layout and components will be created here
-		mainLayout = new AbsoluteLayout();
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java
deleted file mode 100644
index a883dec..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/UserManagement.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.components;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.VerticalLayout;
-
-public class UserManagement extends CustomComponent {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table tableUsers;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutToolbar;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonAdd;
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public UserManagement() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-
-		// TODO add user code here
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("100.0%");
-		setHeight("-1px");
-		
-		// horizontalLayoutToolbar
-		horizontalLayoutToolbar = buildHorizontalLayoutToolbar();
-		mainLayout.addComponent(horizontalLayoutToolbar);
-		
-		// tableUsers
-		tableUsers = new Table();
-		tableUsers.setImmediate(false);
-		tableUsers.setWidth("100.0%");
-		tableUsers.setHeight("-1px");
-		mainLayout.addComponent(tableUsers);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayoutToolbar() {
-		// common part: create layout
-		horizontalLayoutToolbar = new HorizontalLayout();
-		horizontalLayoutToolbar.setImmediate(false);
-		horizontalLayoutToolbar.setWidth("-1px");
-		horizontalLayoutToolbar.setHeight("-1px");
-		horizontalLayoutToolbar.setMargin(true);
-		horizontalLayoutToolbar.setSpacing(true);
-		
-		// buttonAdd
-		buttonAdd = new Button();
-		buttonAdd.setCaption("Add User");
-		buttonAdd.setImmediate(false);
-		buttonAdd.setWidth("-1px");
-		buttonAdd.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonAdd);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove User");
-		buttonRemove.setImmediate(false);
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayoutToolbar.addComponent(buttonRemove);
-		
-		return horizontalLayoutToolbar;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java
deleted file mode 100644
index 947702e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/components/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.
- *
- */
-
-/**
- * 
- */
-/**
- * @author pameladragosh
- *
- */
-package org.apache.openaz.xacml.admin.components;
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java
deleted file mode 100644
index 4229a4e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/CategoryConverter.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import java.util.Locale;
-
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.api.Identifier;
-import com.vaadin.data.util.converter.Converter;
-
-public class CategoryConverter implements Converter<Object, Category> {
-	private static final long serialVersionUID = 1L;
-
-	@Override
-	public Category convertToModel(Object value,
-			Class<? extends Category> targetType, Locale locale)
-			throws Converter.ConversionException {
-		Category category = new Category();
-		if (value == null) {
-			return category;
-		}
-		if (value instanceof Identifier) {
-			category.setXacmlId(((Identifier)value).stringValue());
-		} else {
-			category.setXacmlId(value.toString());
-		}
-		return category;
-	}
-
-	@Override
-	public Object convertToPresentation(Category value,
-			Class<? extends Object> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (targetType.getName().equals(String.class.getName())) {
-			return value.getXacmlId();
-		}
-		if (targetType.getName().equals(Identifier.class.getName())) {
-			return value.getIdentifer();
-		}
-		return value.getIdentifer();
-	}
-
-	@Override
-	public Class<Category> getModelType() {
-		return Category.class;
-	}
-
-	@Override
-	public Class<Object> getPresentationType() {
-		return Object.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java
deleted file mode 100644
index c6705ca..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintTypeConverter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import java.util.Locale;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import com.vaadin.data.util.converter.Converter;
-
-public class ConstraintTypeConverter  implements Converter<Object, ConstraintType> {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(ConstraintTypeConverter.class);
-
-	@Override
-	public ConstraintType convertToModel(Object value,
-			Class<? extends ConstraintType> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("convertToModel:" + value + " target " + targetType);
-		}
-		ConstraintType constraintValue = new ConstraintType();
-		if (value == null) {
-			return constraintValue;
-		}
-		// PLD TODO??
-		return constraintValue;
-	}
-
-	@Override
-	public Object convertToPresentation(ConstraintType value,
-			Class<? extends Object> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("convertToPresentation:" + value + " target " + targetType);
-		}
-		if (value == null) {
-			return null;
-		}
-		if (targetType.isAssignableFrom(String.class)) {
-			return value.getConstraintType();
-		}
-		if (targetType.isInstance(Integer.class)) {
-			return value.getId();
-		}
-		return null;
-	}
-
-	@Override
-	public Class<ConstraintType> getModelType() {
-		return ConstraintType.class;
-	}
-
-	@Override
-	public Class<Object> getPresentationType() {
-		return Object.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java
deleted file mode 100644
index 03c76be..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/ConstraintValueConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import java.util.Locale;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import com.vaadin.data.util.converter.Converter;
-
-public class ConstraintValueConverter implements Converter<Object, ConstraintValue> {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(ConstraintValueConverter.class);
-	
-	@Override
-	public ConstraintValue convertToModel(Object value,
-			Class<? extends ConstraintValue> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("convertToModel:" + value + " target " + targetType);
-		}
-		ConstraintValue newValue = new ConstraintValue();
-		if (value == null) {
-			return newValue;
-		}
-		// PLD TODO?
-		return newValue;
-	}
-
-	@Override
-	public Object convertToPresentation(ConstraintValue value,
-			Class<? extends Object> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("convertToPresentation:" + value + " target " + targetType);
-		}
-		if (value == null) {
-			return null;
-		}
-		return value.getProperty();
-	}
-
-	@Override
-	public Class<ConstraintValue> getModelType() {
-		return ConstraintValue.class;
-	}
-
-	@Override
-	public Class<Object> getPresentationType() {
-		return Object.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java
deleted file mode 100644
index 8817428..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/DatatypeConverter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import java.util.Locale;
-
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.api.Identifier;
-import com.vaadin.data.util.converter.Converter;
-
-public class DatatypeConverter implements Converter<Object, Datatype> {
-	private static final long serialVersionUID = 1L;
-
-	@Override
-	public Datatype convertToModel(Object value,
-			Class<? extends Datatype> targetType, Locale locale)
-			throws Converter.ConversionException {
-		Datatype datatype = new Datatype();
-		if (value == null) {
-			return datatype;
-		}
-		if (value instanceof Identifier) {
-			datatype.setXacmlId(((Identifier)value).stringValue());
-		} else {
-			datatype.setXacmlId(value.toString());
-		}
-		return datatype;
-	}
-
-	@Override
-	public Object convertToPresentation(Datatype value,
-			Class<? extends Object> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (value == null) {
-			return null;
-		}
-		if (targetType.isInstance(String.class) ||
-			targetType.getName().equals(String.class.getName())) {
-			return value.getXacmlId();
-		}
-		if (targetType.isInstance(Identifier.class) ||
-			targetType.getName().equals(Identifier.class.getName())) {
-			return value.getIdentifer();
-		}
-		return value.getIdentifer();
-	}
-
-	@Override
-	public Class<Datatype> getModelType() {
-		return Datatype.class;
-	}
-
-	@Override
-	public Class<Object> getPresentationType() {
-		return Object.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java
deleted file mode 100644
index 07b810d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/IdentifierConverter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import java.util.Locale;
-
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.std.IdentifierImpl;
-import com.vaadin.data.util.converter.Converter;
-
-
-public class IdentifierConverter implements Converter<Object, Identifier> {
-	private static final long serialVersionUID = 1L;
-
-	@Override
-	public Identifier convertToModel(Object value,
-			Class<? extends Identifier> targetType, Locale locale)
-			throws Converter.ConversionException {
-		return new IdentifierImpl(value.toString());
-	}
-
-	@Override
-	public Object convertToPresentation(Identifier value,
-			Class<? extends Object> targetType, Locale locale)
-			throws Converter.ConversionException {
-		if (targetType.isInstance(String.class) ||
-			targetType.getName().equals(String.class.getName())) {
-			return value.stringValue();
-		}
-		return null;
-	}
-
-	@Override
-	public Class<Identifier> getModelType() {
-		return Identifier.class;
-	}
-
-	@Override
-	public Class<Object> getPresentationType() {
-		return Object.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java
deleted file mode 100644
index 32fb8bf..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/converters/XacmlConverterFactory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.converters;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.api.Identifier;
-import com.vaadin.data.util.converter.Converter;
-import com.vaadin.data.util.converter.DefaultConverterFactory;
-
-public class XacmlConverterFactory extends DefaultConverterFactory {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(XacmlConverterFactory.class);
-	
-    @SuppressWarnings("unchecked")
-	@Override
-    public <PRESENTATION, MODEL> Converter<PRESENTATION, MODEL>
-            createConverter(Class<PRESENTATION> presentationType,
-                            Class<MODEL> modelType) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("createConverter: " + presentationType + " from model " + modelType);
-    	}
-    	//
-        // Handle one particular type conversion for Categories
-    	//
-        if (Category.class == modelType) {
-            return (Converter<PRESENTATION, MODEL>) new CategoryConverter();
-        }
-        //
-        // Handle one particular type conversion for Datatypes
-        //
-        if (Datatype.class == modelType) {
-            return (Converter<PRESENTATION, MODEL>) new DatatypeConverter();
-        }
-        //
-        // Handle one particular type conversion for ConstraintType
-        //
-        if (ConstraintType.class == modelType) {
-        	return (Converter<PRESENTATION, MODEL>) new ConstraintTypeConverter();
-        }
-        //
-        // Handle one particular type conversion for ConstraintType
-        //
-        if (ConstraintValue.class == modelType) {
-        	return (Converter<PRESENTATION, MODEL>) new ConstraintValueConverter();
-        }
-        //
-        // Handle one particular type conversion for Identifiers
-        //
-        if (Identifier.class == modelType) {
-        	return (Converter<PRESENTATION, MODEL>) new IdentifierConverter();
-        }
-        //
-        // Default to the supertype
-        //
-        return super.createConverter(presentationType,
-                                     modelType);
-    }
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java
deleted file mode 100644
index 84ec82a..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Attribute.java
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.std.IdentifierImpl;
-
-
-/**
- * The persistent class for the Attribute database table.
- * 
- */
-@Entity
-@Table(name="Attribute")
-@NamedQuery(name="Attribute.findAll", query="SELECT a FROM Attribute a")
-public class Attribute implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static String	ATTRIBUTE_DESIGNATOR = "Attribute Designator";
-	public static String	ATTRIBUTE_SELECTOR = "Attribute Selector";
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	//bi-directional many-to-one association to Category
-	@ManyToOne
-	@JoinColumn(name="constraint_type", nullable=true)
-	private ConstraintType constraintType;
-
-	@Column(name="created_by", nullable=false, length=255)
-	private String createdBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="created_date", updatable=false)
-	private Date createdDate;
-
-	@Column(name="description", nullable=true, length=2048)
-	private String description;
-
-	@Column(name="modified_by", nullable=false, length=255)
-	private String modifiedBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="modified_date", nullable=false)
-	private Date modifiedDate;
-
-	@Column(name="xacml_id", nullable=false)
-	private String xacmlId = "urn";
-
-	//bi-directional many-to-one association to ConstraintValue
-	@OneToMany(mappedBy="attribute", orphanRemoval=true, cascade=CascadeType.REMOVE)
-	private Set<ConstraintValue> constraintValues = new HashSet<ConstraintValue>();
-
-	//bi-directional many-to-one association to Category
-	@ManyToOne
-	@JoinColumn(name="category")
-	private Category categoryBean;
-
-	//bi-directional many-to-one association to Datatype
-	@ManyToOne
-	@JoinColumn(name="datatype")
-	private Datatype datatypeBean;
-
-	@Column(name="is_designator", nullable=false)
-	private char isDesignator = '1';
-
-	@Column(name="selector_path", nullable=true, length=2048)
-	private String selectorPath;
-	
-	@Transient
-	private String issuer = null;
-	
-	@Transient
-	private boolean mustBePresent = false;
-
-	public Attribute() {
-	}
-	
-	public Attribute(String domain) {
-		this.xacmlId = domain;
-	}
-	
-	public Attribute(String domain, String user) {
-		this(domain);
-		this.createdBy = user;
-		this.modifiedBy = user;
-	}
-	public Attribute(Attribute copy, String user) {
-		this(copy.getXacmlId() + ":(0)", user);
-		this.constraintType = copy.getConstraintType();
-		this.categoryBean = copy.getCategoryBean();
-		this.datatypeBean = copy.getDatatypeBean();
-		this.description = copy.getDescription();
-		for (ConstraintValue value : copy.getConstraintValues()) {
-			ConstraintValue newValue = new ConstraintValue(value);
-			newValue.setAttribute(this);
-			this.addConstraintValue(newValue);
-		}
-	}
-
-	@PrePersist
-	public void	prePersist() {
-		Date date = new Date();
-		this.createdDate = date;
-		this.modifiedDate = date;
-	}
-	
-	@PreUpdate
-	public void preUpdate() {
-		this.modifiedDate = new Date();
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public ConstraintType getConstraintType() {
-		return this.constraintType;
-	}
-
-	public void setConstraintType(ConstraintType constraintType) {
-		this.constraintType = constraintType;
-	}
-
-	public String getCreatedBy() {
-		return this.createdBy;
-	}
-
-	public void setCreatedBy(String createdBy) {
-		this.createdBy = createdBy;
-	}
-
-	public Date getCreatedDate() {
-		return this.createdDate;
-	}
-
-	public void setCreatedDate(Date createdDate) {
-		this.createdDate = createdDate;
-	}
-
-	public String getDescription() {
-		return this.description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getModifiedBy() {
-		return this.modifiedBy;
-	}
-
-	public void setModifiedBy(String modifiedBy) {
-		this.modifiedBy = modifiedBy;
-	}
-
-	public Date getModifiedDate() {
-		return this.modifiedDate;
-	}
-
-	public void setModifiedDate(Date modifiedDate) {
-		this.modifiedDate = modifiedDate;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-	
-	@Transient
-	public Identifier getXacmlIdentifier() {
-		return new IdentifierImpl(this.xacmlId);
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public Set<ConstraintValue> getConstraintValues() {
-		return this.constraintValues;
-	}
-
-	public void setConstraintValues(Set<ConstraintValue> constraintValues) {
-		for (ConstraintValue value : this.constraintValues) {
-			value.setAttribute(this);
-		}
-		this.constraintValues = constraintValues;
-	}
-
-	public ConstraintValue addConstraintValue(ConstraintValue constraintValue) {
-		if (this.constraintValues == null) {
-			this.constraintValues = new HashSet<ConstraintValue>();
-		}
-		this.constraintValues.add(constraintValue);
-		constraintValue.setAttribute(this);
-
-		return constraintValue;
-	}
-
-	public ConstraintValue removeConstraintValue(ConstraintValue constraintValue) {
-		this.constraintValues.remove(constraintValue);
-		constraintValue.setAttribute(null);
-
-		return constraintValue;
-	}
-	
-	public void removeAllConstraintValues() {
-		if (this.constraintValues == null) {
-			return;
-		}
-		for (ConstraintValue value : this.constraintValues) {
-			value.setAttribute(null);
-		}
-		this.constraintValues.clear();
-	}
-
-	public Category getCategoryBean() {
-		return this.categoryBean;
-	}
-
-	public void setCategoryBean(Category categoryBean) {
-		this.categoryBean = categoryBean;
-	}
-
-	public Datatype getDatatypeBean() {
-		return this.datatypeBean;
-	}
-
-	public void setDatatypeBean(Datatype datatypeBean) {
-		this.datatypeBean = datatypeBean;
-	}
-
-	public char getIsDesignator() {
-		return this.isDesignator;
-	}
-	
-	public void setIsDesignator(char is) {
-		this.isDesignator = is;
-	}
-	
-	public String getSelectorPath() {
-		return this.selectorPath;
-	}
-	
-	public void setSelectorPath(String path) {
-		this.selectorPath = path;
-	}
-	
-	@Transient
-	public String getIssuer() {
-		return issuer;
-	}
-
-	@Transient
-	public void setIssuer(String issuer) {
-		this.issuer = issuer;
-	}
-
-	@Transient
-	public boolean isMustBePresent() {
-		return mustBePresent;
-	}
-
-	@Transient
-	public void setMustBePresent(boolean mustBePresent) {
-		this.mustBePresent = mustBePresent;
-	}
-
-	@Transient
-	public boolean isDesignator() {
-		return this.isDesignator == '1';
-	}
-	
-	@Transient
-	public void setIsDesignator(boolean is) {
-		if (is) {
-			this.isDesignator = '1';
-		} else {
-			this.isDesignator = '0';
-		}
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java
deleted file mode 100644
index 344b7f8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/AttributeAssignment.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-
-
-/**
- * The persistent class for the ObadviceExpressions database table.
- * 
- */
-@Entity
-@Table(name="AttributeAssignment")
-@NamedQuery(name="AttributeAssignment.findAll", query="SELECT a FROM AttributeAssignment a")
-public class AttributeAssignment implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	public static final String EXPRESSION_APPLY = "Apply";
-	public static final String EXPRESSION_SELECTOR = "AttributeSelector";
-	public static final String EXPRESSION_VALUE = "AttributeValue";
-	public static final String EXPRESSION_FUNCTION = "Function";
-	public static final String EXPRESSION_REFERENCE = "VarableReference";
-	public static final String EXPRESSION_DESIGNATOR = "AttributeDesignator";
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="attribute_id")
-	private int attributeId;
-
-	//bi-directional many-to-one association to Obadvice
-	@Column(name="expression", nullable=false)
-	private String expression;
-
-	//bi-directional many-to-one association to Obadvice
-	@ManyToOne
-	private Obadvice obadvice; //NOPMD
-
-	public AttributeAssignment() {
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public int getAttributeId() {
-		return this.attributeId;
-	}
-
-	public void setAttributeId(int attributeId) {
-		this.attributeId = attributeId;
-	}
-
-	public String getExpression() {
-		return expression;
-	}
-
-	public void setExpression(String expression) {
-		this.expression = expression;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java
deleted file mode 100644
index fdcbd3d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Category.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.std.IdentifierImpl;
-
-
-/**
- * The persistent class for the Categories database table.
- * 
- */
-@Entity
-@Table(name="Category")
-@NamedQuery(name="Category.findAll", query="SELECT c FROM Category c")
-public class Category implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static final char STANDARD = 'S';
-	public static final char CUSTOM = 'C';
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="grouping", nullable=false, length=64)
-	private String grouping;
-
-	@Column(name="is_standard", nullable=false)
-	private char isStandard;
-
-	@Column(name="xacml_id", nullable=false, unique=true, length=255)
-	private String xacmlId;
-	
-	@Column(name="short_name", nullable=false, length=64)
-	private String shortName;
-	
-	//bi-directional many-to-one association to Attribute
-	@OneToMany(mappedBy="categoryBean")
-	private Set<Attribute> attributes = new HashSet<>();
-
-	public Category() {
-		this.xacmlId = XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue();
-		this.grouping = "subject";
-		this.isStandard = Category.STANDARD;
-		this.shortName = "subject";
-	}
-
-	public Category(Identifier cat, String grouping, char isStandard) {
-		if (cat != null) {
-			this.xacmlId = cat.stringValue();
-		}
-		this.isStandard = isStandard;
-		if (grouping != null) {
-			this.grouping = grouping;
-		} else {
-			this.grouping = Category.extractGrouping(this.xacmlId);
-		}
-	}
-
-	public Category(Identifier cat, String grouping) {
-		this(cat, grouping, Category.STANDARD);
-	}
-
-	public Category(Identifier cat, char standard) {
-		this(cat, null, standard);
-	}
-
-	public Category(Identifier cat) {
-		this(cat, Category.STANDARD);
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getGrouping() {
-		return this.grouping;
-	}
-
-	public void setGrouping(String grouping) {
-		this.grouping = grouping;
-	}
-
-	public char getIsStandard() {
-		return this.isStandard;
-	}
-
-	public void setIsStandard(char isStandard) {
-		this.isStandard = isStandard;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public String getShortName() {
-		return this.shortName;
-	}
-
-	public void setShortName(String shortName) {
-		this.shortName = shortName;
-	}
-
-	public Set<Attribute> getAttributes() {
-		return this.attributes;
-	}
-
-	public void setAttributes(Set<Attribute> attributes) {
-		this.attributes = attributes;
-	}
-
-	public Attribute addAttribute(Attribute attribute) {
-		getAttributes().add(attribute);
-		attribute.setCategoryBean(this);
-
-		return attribute;
-	}
-
-	public Attribute removeAttribute(Attribute attribute) {
-		getAttributes().remove(attribute);
-		attribute.setCategoryBean(null);
-
-		return attribute;
-	}
-
-	@Transient
-	public boolean isStandard() {
-		return this.isStandard == Category.STANDARD;
-	}
-	
-	@Transient
-	public boolean isCustom() {
-		return this.isStandard == Category.CUSTOM;
-	}
-	
-	@Transient
-	public static String	extractGrouping(String xacmlId) {
-		if (xacmlId == null) {
-			return null;
-		}
-		if (xacmlId.matches(".*:attribute\\-category:.*")) {
-			String[] parts = xacmlId.split("[:]");
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-		} else if (xacmlId.matches(".*:[a-zA-Z]+[\\-]category:.*")) {
-			String[] parts = xacmlId.split("[:]");
-			if (parts != null && parts.length > 0) {
-				for (String part : parts) {
-					int index = part.indexOf("-category");
-					if (index > 0) {
-						return part.substring(0, index);
-					}
-				}
-			}
-		}
-		return null;
-	}
-	
-	@Transient
-	public Identifier getIdentifer() {
-		return new IdentifierImpl(this.xacmlId);
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "Category [id=" + id + ", grouping=" + grouping
-				+ ", isStandard=" + isStandard + ", xacmlId=" + xacmlId
-				+ ", attributes=" + attributes + "]";
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java
deleted file mode 100644
index 14b9008..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintType.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-
-@Entity
-@Table(name="ConstraintType")
-@NamedQuery(name="ConstraintType.findAll", query="SELECT a FROM ConstraintType a")
-public class ConstraintType implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static String ENUMERATION_TYPE = "Enumeration";
-	public static String RANGE_TYPE = "Range";
-	public static String REGEXP_TYPE = "Regular Expression";
-	
-	public static Map<String, String> defaults = new HashMap<String, String>();
-	static {
-		defaults.put(ENUMERATION_TYPE, "Enumerate a set of values that the attribute may be set to during policy creation.");
-		defaults.put(RANGE_TYPE, "Set a range of min and/or max integer/double values the attribute can be set to during policy creation.");
-		defaults.put(REGEXP_TYPE, "Define a regular expression the attribute must match against during policy creation.");
-	}
-	public static final String[] RANGE_TYPES = {"minExclusive", "minInclusive", "maxExclusive", "maxInclusive"};
-	
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="constraint_type", nullable=false, length=64)
-	private String constraintType;
-	
-	@Column(name="description", nullable=false, length=255)
-	private String description;
-
-	//bi-directional many-to-one association to Attribute
-	@OneToMany(mappedBy="constraintType")
-	private Set<Attribute> attributes = new HashSet<>();
-
-	public ConstraintType() {
-		
-	}
-
-	public ConstraintType(String constraintType) {
-		this();
-		this.constraintType = constraintType;
-	}
-	
-	public ConstraintType(String constraintType, String description) {
-		this(constraintType);
-		this.description = description;
-	}
-
-	public int getId() {
-		return id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getConstraintType() {
-		return constraintType;
-	}
-
-	public void setConstraintType(String constraintType) {
-		this.constraintType = constraintType;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public Set<Attribute> getAttributes() {
-		return attributes;
-	}
-
-	public void setAttributes(Set<Attribute> attributes) {
-		this.attributes = attributes;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java
deleted file mode 100644
index e1f66d4..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ConstraintValue.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-
-
-/**
- * The persistent class for the ConstraintValues database table.
- * 
- */
-@Entity
-@Table(name="ConstraintValues")
-@NamedQuery(name="ConstraintValue.findAll", query="SELECT c FROM ConstraintValue c")
-public class ConstraintValue implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="property")
-	private String property;
-
-	@Column(name="value")
-	private String value;
-
-	//bi-directional many-to-one association to Attribute
-	@ManyToOne
-	@JoinColumn(name="attribute_id")
-	private Attribute attribute;
-
-	public ConstraintValue() {
-	}
-
-	public ConstraintValue(String property, String value) {
-		this.property = property;
-		this.value = value;
-	}
-	
-	public ConstraintValue(ConstraintValue value) {
-		this.property = value.getProperty();
-		this.value = value.getValue();
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getProperty() {
-		return this.property;
-	}
-
-	public void setProperty(String property) {
-		this.property = property;
-	}
-
-	public String getValue() {
-		return this.value;
-	}
-
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-	public Attribute getAttribute() {
-		return this.attribute;
-	}
-
-	public void setAttribute(Attribute attribute) {
-		this.attribute = attribute;
-	}
-	
-	public ConstraintValue clone() {
-		ConstraintValue constraint = new ConstraintValue();
-		
-		constraint.property = this.property;
-		constraint.value = this.value;
-		constraint.attribute = this.attribute;
-		
-		return constraint;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java
deleted file mode 100644
index 50d4488..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Datatype.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.std.IdentifierImpl;
-
-
-/**
- * The persistent class for the Datatype database table.
- * 
- */
-@Entity
-@Table(name="Datatype")
-@NamedQuery(name="Datatype.findAll", query="SELECT d FROM Datatype d")
-public class Datatype implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static final char STANDARD = 'S';
-	public static final char CUSTOM = 'C';
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="is_standard", nullable=false)
-	private char isStandard;
-
-	@Column(name="xacml_id", nullable=false, unique=true, length=255)
-	private String xacmlId;
-
-	@Column(name="short_name", nullable=false, length=64)
-	private String shortName;
-
-	//bi-directional many-to-one association to Attribute
-	@OneToMany(mappedBy="datatypeBean")
-	private Set<Attribute> attributes = new HashSet<>();
-
-	//bi-directional many-to-one association to Attribute
-	@OneToMany(mappedBy="datatypeBean")
-	private Set<FunctionDefinition> functions = new HashSet<>();
-
-	//bi-directional many-to-one association to Attribute
-	@OneToMany(mappedBy="datatypeBean")
-	private Set<FunctionArgument> arguments = new HashSet<>();
-
-	public Datatype() {
-		this.xacmlId = XACML3.ID_DATATYPE_STRING.stringValue();
-		this.isStandard = Datatype.STANDARD;
-	}
-	
-	public Datatype(int id, Datatype dt) {
-		this.id = id;
-		this.isStandard = dt.isStandard;
-		this.xacmlId = dt.xacmlId;
-		this.shortName = dt.shortName;
-		//
-		// Make a copy?
-		//
-		this.attributes = new HashSet<>();
-	}
-	
-	public Datatype(Identifier identifier, char standard) {
-		if (identifier != null) {
-			this.xacmlId = identifier.stringValue();
-		}
-		this.isStandard = standard;
-	}
-	
-	public Datatype(Identifier identifier) {
-		this(identifier, Datatype.STANDARD);
-	}
-	
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public char getIsStandard() {
-		return this.isStandard;
-	}
-
-	public void setIsStandard(char isStandard) {
-		this.isStandard = isStandard;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public String getShortName() {
-		return shortName;
-	}
-
-	public void setShortName(String shortName) {
-		this.shortName = shortName;
-	}	
-
-	public Set<Attribute> getAttributes() {
-		return this.attributes;
-	}
-
-	public void setAttributes(Set<Attribute> attributes) {
-		this.attributes = attributes;
-	}
-
-	public Attribute addAttribute(Attribute attribute) {
-		getAttributes().add(attribute);
-		attribute.setDatatypeBean(this);
-
-		return attribute;
-	}
-
-	public Attribute removeAttribute(Attribute attribute) {
-		getAttributes().remove(attribute);
-		attribute.setDatatypeBean(null);
-
-		return attribute;
-	}
-
-	public Set<FunctionDefinition> getFunctions() {
-		return this.functions;
-	}
-
-	public void setFunctions(Set<FunctionDefinition> functions) {
-		this.functions = functions;
-	}
-
-	public FunctionDefinition addFunction(FunctionDefinition function) {
-		getFunctions().add(function);
-		function.setDatatypeBean(this);
-
-		return function;
-	}
-
-	public FunctionDefinition removeAttribute(FunctionDefinition function) {
-		getFunctions().remove(function);
-		function.setDatatypeBean(null);
-
-		return function;
-	}
-
-	public Set<FunctionArgument> getArguments() {
-		return this.arguments;
-	}
-
-	public void setArguments(Set<FunctionArgument> argument) {
-		this.arguments = argument;
-	}
-
-	public FunctionArgument addArgument(FunctionArgument argument) {
-		getArguments().add(argument);
-		argument.setDatatypeBean(this);
-
-		return argument;
-	}
-
-	public FunctionArgument removeArgument(FunctionArgument argument) {
-		getArguments().remove(argument);
-		argument.setDatatypeBean(null);
-
-		return argument;
-	}
-
-	@Transient
-	public Identifier getIdentifer() {
-		return new IdentifierImpl(this.xacmlId);
-	}
-
-	@Transient
-	public boolean isStandard() {
-		return this.isStandard == Datatype.STANDARD;
-	}
-	
-	@Transient
-	public boolean isCustom() {
-		return this.isStandard == Datatype.CUSTOM;
-	}
-	
-	@Transient
-	@Override
-	public String toString() {
-		return "Datatype [id=" + id + ", isStandard=" + isStandard
-				+ ", xacmlId=" + xacmlId + ", shortName=" + shortName
-				+ ", attributes=" + attributes + ", functions=" + functions
-				+ ", arguments=" + arguments + "]";
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java
deleted file mode 100644
index 109e26d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionArgument.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.*;
-
-
-/**
- * The persistent class for the FunctionArguments database table.
- * 
- */
-@Entity
-@Table(name="FunctionArguments")
-@NamedQuery(name="FunctionArgument.findAll", query="SELECT f FROM FunctionArgument f")
-public class FunctionArgument implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="is_bag", nullable=false)
-	private int isBag;
-
-	//bi-directional many-to-one association to FunctionDefinition
-	@ManyToOne
-	@JoinColumn(name="function_id")
-	private FunctionDefinition functionDefinition;
-
-	@Column(name="arg_index", nullable=false)
-	private int argIndex;
-
-	//bi-directional many-to-one association to Datatype
-	@ManyToOne
-	@JoinColumn(name="datatype_id")
-	private Datatype datatypeBean;
-
-	public FunctionArgument() {
-	}
-
-	public FunctionArgument(final FunctionArgument argument) {
-		this.argIndex = argument.argIndex;
-		this.datatypeBean = argument.datatypeBean;
-		this.isBag = argument.isBag;
-		this.functionDefinition = argument.functionDefinition;
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public int getArgIndex() {
-		return this.argIndex;
-	}
-
-	public void setArgIndex(int argIndex) {
-		this.argIndex = argIndex;
-	}
-
-	public Datatype getDatatypeBean() {
-		return this.datatypeBean;
-	}
-
-	public void setDatatypeBean(Datatype datatypeBean) {
-		this.datatypeBean = datatypeBean;
-	}
-
-	public FunctionDefinition getFunctionDefinition() {
-		return this.functionDefinition;
-	}
-
-	public int getIsBag() {
-		return isBag;
-	}
-
-	public void setIsBag(int isBag) {
-		this.isBag = isBag;
-	}
-
-	public void setFunctionDefinition(FunctionDefinition functionDefinition) {
-		this.functionDefinition = functionDefinition;
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "FunctionArgument [id=" + id + ", argIndex=" + argIndex
-				+ ", datatypeBean=" + datatypeBean + ", isBag=" + isBag
-				+ ", functionDefinition=" + functionDefinition + "]";
-	}
-	
-	@Transient
-	public boolean isBag() {
-		return this.isBag == 1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java
deleted file mode 100644
index fc0cc91..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/FunctionDefinition.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.*;
-
-import java.util.List;
-
-
-/**
- * The persistent class for the FunctionDefinition database table.
- * 
- */
-@Entity
-@Table(name="FunctionDefinition")
-@NamedQuery(name="FunctionDefinition.findAll", query="SELECT f FROM FunctionDefinition f")
-public class FunctionDefinition implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="short_name", nullable=false, length=64)
-	private String shortname;
-
-	@Column(name="xacml_id", nullable=false, length=255)
-	private String xacmlid;
-	
-	//bi-directional many-to-one association to Datatype
-	@ManyToOne
-	@JoinColumn(name="return_datatype", nullable=true)
-	private Datatype datatypeBean;
-
-	@Column(name="is_bag_return", nullable=false)
-	private int isBagReturn;
-	
-	@Column(name="is_higher_order", nullable=false)
-	private int isHigherOrder;
-
-	@Column(name="arg_lb", nullable=false)
-	private int argLb;
-
-	@Column(name="arg_ub", nullable=false)
-	private int argUb;
-
-	@Column(name="ho_arg_lb", nullable=true)
-	private int higherOrderArg_LB;
-	
-	@Column(name="ho_arg_ub", nullable=true)
-	private int higherOrderArg_UB;
-	
-	@Column(name="ho_primitive", nullable=true)
-	private char higherOrderIsPrimitive;
-
-	//bi-directional many-to-one association to FunctionArgument
-	@OneToMany(mappedBy="functionDefinition")
-	private List<FunctionArgument> functionArguments;
-
-	public FunctionDefinition() {
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public int getArgLb() {
-		return this.argLb;
-	}
-
-	public void setArgLb(int argLb) {
-		this.argLb = argLb;
-	}
-
-	public int getArgUb() {
-		return this.argUb;
-	}
-
-	public void setArgUb(int argUb) {
-		this.argUb = argUb;
-	}
-
-	public int getIsBagReturn() {
-		return isBagReturn;
-	}
-
-	public void setIsBagReturn(int isBagReturn) {
-		this.isBagReturn = isBagReturn;
-	}
-
-	public int getIsHigherOrder() {
-		return isHigherOrder;
-	}
-
-	public void setIsHigherOrder(int isHigherOrder) {
-		this.isHigherOrder = isHigherOrder;
-	}
-
-	public Datatype getDatatypeBean() {
-		return this.datatypeBean;
-	}
-
-	public void setDatatypeBean(Datatype datatypeBean) {
-		this.datatypeBean = datatypeBean;
-	}
-
-	public String getShortname() {
-		return this.shortname;
-	}
-
-	public void setShortname(String shortname) {
-		this.shortname = shortname;
-	}
-
-	public String getXacmlid() {
-		return this.xacmlid;
-	}
-
-	public void setXacmlid(String xacmlid) {
-		this.xacmlid = xacmlid;
-	}
-
-	public int getHigherOrderArg_LB() {
-		return higherOrderArg_LB;
-	}
-
-	public void setHigherOrderArg_LB(int higherOrderArg_LB) {
-		this.higherOrderArg_LB = higherOrderArg_LB;
-	}
-
-	public int getHigherOrderArg_UB() {
-		return higherOrderArg_UB;
-	}
-
-	public void setHigherOrderArg_UB(int higherOrderArg_UB) {
-		this.higherOrderArg_UB = higherOrderArg_UB;
-	}
-
-	public char getHigherOrderIsPrimitive() {
-		return higherOrderIsPrimitive;
-	}
-
-	public void setHigherOrderIsPrimitive(char higherOrderIsPrimitive) {
-		this.higherOrderIsPrimitive = higherOrderIsPrimitive;
-	}
-
-	public List<FunctionArgument> getFunctionArguments() {
-		return this.functionArguments;
-	}
-
-	public void setFunctionArguments(List<FunctionArgument> functionArguments) {
-		this.functionArguments = functionArguments;
-	}
-
-	public FunctionArgument addFunctionArgument(FunctionArgument functionArgument) {
-		getFunctionArguments().add(functionArgument);
-		functionArgument.setFunctionDefinition(this);
-
-		return functionArgument;
-	}
-
-	public FunctionArgument removeFunctionArgument(FunctionArgument functionArgument) {
-		getFunctionArguments().remove(functionArgument);
-		functionArgument.setFunctionDefinition(null);
-
-		return functionArgument;
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "FunctionDefinition [id=" + id + ", argLb=" + argLb + ", argUb="
-				+ argUb + ", isBagReturn=" + isBagReturn + ", isHigherOrder="
-				+ isHigherOrder + ", datatypeBean=" + datatypeBean
-				+ ", shortname=" + shortname + ", xacmlid=" + xacmlid
-				+ ", higherOrderArg_LB=" + higherOrderArg_LB
-				+ ", higherOrderArg_UB=" + higherOrderArg_UB
-				+ ", higherOrderIsPrimitive=" + higherOrderIsPrimitive
-				+ ", functionArguments=" + functionArguments + "]";
-	}
-
-	@Transient
-	public boolean isBagReturn() {
-		return this.isBagReturn == 1;
-	}
-
-	@Transient
-	public boolean isHigherOrder() {
-		return this.isHigherOrder == 1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java
deleted file mode 100644
index cda5802..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/Obadvice.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-
-/**
- * The persistent class for the Obadvice database table.
- * 
- */
-@Entity
-@Table(name="Obadvice")
-@NamedQuery(name="Obadvice.findAll", query="SELECT o FROM Obadvice o")
-public class Obadvice implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	public static final String OBLIGATION = "Obligation";
-	public static final String ADVICE = "Advice";
-	public static final String EFFECT_PERMIT = "Permit";
-	public static final String EFFECT_DENY = "Deny";
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="type", nullable=false)
-	private String type;
-
-	@Column(name="xacml_id", nullable=false, length=255)
-	private String xacmlId;
-
-	@Column(name="fulfill_on", nullable=true, length=32)
-	private String fulfillOn;
-
-	@Column(name="description", nullable=true, length=2048)
-	private String description;
-
-	//bi-directional one-to-many association to Attribute Assignment
-	@OneToMany(mappedBy="obadvice", orphanRemoval=true, cascade=CascadeType.REMOVE)
-	private Set<ObadviceExpression> obadviceExpressions = new HashSet<ObadviceExpression>(2);
-
-	@Column(name="created_by", nullable=false, length=255)
-	private String createdBy;
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="created_date", nullable=false, updatable=false)
-	private Date createdDate; //NOPMD
-
-	@Column(name="modified_by", nullable=false, length=255)
-	private String modifiedBy;
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="modified_date", nullable=false)
-	private Date modifiedDate; //NOPMD
-
-	public Obadvice() {
-		this.type = Obadvice.OBLIGATION;
-		this.fulfillOn = Obadvice.EFFECT_PERMIT;
-	}
-	
-	public Obadvice(String domain, String userid) {
-		this.xacmlId = domain;
-		this.type = Obadvice.OBLIGATION;
-		this.fulfillOn = Obadvice.EFFECT_PERMIT;
-		this.createdBy = userid;
-		this.modifiedBy = userid;
-	}
-
-	public Obadvice(Identifier id, String userid) {
-		this(id.stringValue(), userid);
-	}
-
-	@PrePersist
-	public void	prePersist() {
-		Date date = new Date();
-		this.createdDate = date;
-		this.modifiedDate = date;
-	}
-	
-	@PreUpdate
-	public void preUpdate() {
-		this.modifiedDate = new Date();
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getCreatedBy() {
-		return this.createdBy;
-	}
-
-	public void setCreatedBy(String createdBy) {
-		this.createdBy = createdBy;
-	}
-
-	public String getDescription() {
-		return this.description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getFulfillOn() {
-		return this.fulfillOn;
-	}
-
-	public void setFulfillOn(String fulfillOn) {
-		this.fulfillOn = fulfillOn;
-	}
-
-	public String getModifiedBy() {
-		return this.modifiedBy;
-	}
-
-	public void setModifiedBy(String modifiedBy) {
-		this.modifiedBy = modifiedBy;
-	}
-
-	public String getType() {
-		return this.type;
-	}
-
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public Set<ObadviceExpression> getObadviceExpressions() {
-		return this.obadviceExpressions;
-	}
-
-	public void setObadviceExpressions(Set<ObadviceExpression> obadviceExpressions) {
-		this.obadviceExpressions = obadviceExpressions;
-	}
-
-	public ObadviceExpression addObadviceExpression(ObadviceExpression obadviceExpression) {
-		this.obadviceExpressions.add(obadviceExpression);
-		obadviceExpression.setObadvice(this);
-
-		return obadviceExpression;
-	}
-
-	public ObadviceExpression removeObadviceExpression(ObadviceExpression obadviceExpression) {
-		this.obadviceExpressions.remove(obadviceExpression);
-		obadviceExpression.setObadvice(null);
-
-		return obadviceExpression;
-	}
-	
-	public void removeAllExpressions() {
-		if (this.obadviceExpressions == null) {
-			return;
-		}
-		for (ObadviceExpression expression : this.obadviceExpressions) {
-			expression.setObadvice(null);
-		}
-		this.obadviceExpressions.clear();
-	}
-
-	@Transient
-	public Obadvice clone() {
-		Obadvice obadvice = new Obadvice();
-		
-		obadvice.type = this.type;
-		obadvice.xacmlId = this.xacmlId;
-		obadvice.fulfillOn = this.fulfillOn;
-		obadvice.description = this.description;
-		obadvice.createdBy = this.createdBy;
-		obadvice.modifiedBy = this.modifiedBy;
-		for (ObadviceExpression exp: this.obadviceExpressions) {
-			obadvice.addObadviceExpression(exp.clone());
-		}
-
-		return obadvice;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java
deleted file mode 100644
index 2a79639..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/ObadviceExpression.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-// import javax.persistence.Lob;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-
-/**
- * The persistent class for the ObadviceExpressions database table.
- * 
- */
-@Entity
-@Table(name="ObadviceExpressions")
-@NamedQuery(name="ObadviceExpression.findAll", query="SELECT o FROM ObadviceExpression o")
-public class ObadviceExpression implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	public static final String EXPRESSION_APPLY = "Apply";
-	public static final String EXPRESSION_SELECTOR = "Attribute Selector";
-	public static final String EXPRESSION_VALUE = "Attribute Value";
-	public static final String EXPRESSION_FUNCTION = "Function";
-	public static final String EXPRESSION_REFERENCE = "Varable Reference";
-	public static final String EXPRESSION_DESIGNATOR = "Attribute Designator";
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	//unidirectional one-to-one association to Attribute
-	@OneToOne
-	@JoinColumn(name="attribute_id")
-	private Attribute attribute;
-
-	@Column(name="type", nullable=false)
-	private String type;
-	
-	/*
-	@Lob
-	@Column(name="expression", nullable=false)
-	private byte[] expression;
-	*/
-
-	//bi-directional many-to-one association to Obadvice
-	@ManyToOne
-	@JoinColumn(name="obadvice_id")
-	private Obadvice obadvice;
-
-	public ObadviceExpression() {
-		type = EXPRESSION_VALUE;
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public Attribute getAttribute() {
-		return this.attribute;
-	}
-
-	public void setAttribute(Attribute attribute) {
-		this.attribute = attribute;
-	}
-
-	public String getType() {
-		return this.type;
-	}
-
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	public Obadvice getObadvice() {
-		return this.obadvice;
-	}
-
-	public void setObadvice(Obadvice obadvice) {
-		this.obadvice = obadvice;
-	}
-
-	public ObadviceExpression clone() {
-		ObadviceExpression expression = new ObadviceExpression();
-		
-		expression.attribute = this.attribute;
-		expression.type = this.type;
-		expression.obadvice = this.obadvice;
-		
-		return expression;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java
deleted file mode 100644
index a4c4a16..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfigParam.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.*;
-
-
-/**
- * The persistent class for the PIPConfigParams database table.
- * 
- */
-@Entity
-@Table(name="PIPConfigParams")
-@NamedQuery(name="PIPConfigParam.findAll", query="SELECT p FROM PIPConfigParam p")
-public class PIPConfigParam implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="PARAM_NAME", nullable=false, length=1024)
-	private String paramName;
-
-	@Column(name="PARAM_VALUE", nullable=false, length=2048)
-	private String paramValue;
-
-	@Column(name="PARAM_DEFAULT", nullable=true, length=2048)
-	private String paramDefault = null;
-	
-	@Column(name="REQUIRED", nullable=false)
-	private char required = '0';
-
-	//bi-directional many-to-one association to PIPConfiguration
-	@ManyToOne
-	@JoinColumn(name="PIP_ID")
-	private PIPConfiguration pipconfiguration;
-
-	public PIPConfigParam() {
-	}
-
-	public PIPConfigParam(String param) {
-		this.paramName = param;
-	}
-
-	public PIPConfigParam(String param, String value) {
-		this(param);
-		this.paramValue = value;
-	}
-
-	public PIPConfigParam(PIPConfigParam param) {
-		this(param.getParamName(), param.getParamValue());
-		this.paramDefault = param.getParamDefault();
-		this.required = param.required;
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getParamName() {
-		return this.paramName;
-	}
-
-	public void setParamName(String paramName) {
-		this.paramName = paramName;
-	}
-
-	public String getParamValue() {
-		return this.paramValue;
-	}
-
-	public void setParamValue(String paramValue) {
-		this.paramValue = paramValue;
-	}
-
-	public String getParamDefault() {
-		return paramDefault;
-	}
-
-	public void setParamDefault(String paramDefault) {
-		this.paramDefault = paramDefault;
-	}
-
-	public char getRequired() {
-		return required;
-	}
-
-	public void setRequired(char required) {
-		this.required = required;
-	}
-
-	public PIPConfiguration getPipconfiguration() {
-		return this.pipconfiguration;
-	}
-
-	public void setPipconfiguration(PIPConfiguration pipconfiguration) {
-		this.pipconfiguration = pipconfiguration;
-	}
-
-	@Transient
-	public boolean isRequired() {
-		return this.required == '1';
-	}
-	
-	@Transient
-	public void setRequired(boolean required) {
-		if (required) {
-			this.setRequired('1');
-		} else {
-			this.setRequired('0');
-		}
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "PIPConfigParam [id=" + id + ", paramName=" + paramName
-				+ ", paramValue=" + paramValue + ", required=" + required + "]";
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java
deleted file mode 100644
index d540e2b..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPConfiguration.java
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-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 javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.api.pip.PIPException;
-import org.apache.openaz.xacml.std.pip.engines.StdConfigurableEngine;
-import org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine;
-import org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine;
-import org.apache.openaz.xacml.std.pip.engines.jdbc.JDBCEngine;
-import org.apache.openaz.xacml.std.pip.engines.ldap.LDAPEngine;
-import org.apache.openaz.xacml.util.XACMLProperties;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.vaadin.ui.UI;
-
-
-/**
- * The persistent class for the PIPConfiguration database table.
- * 
- */
-@Entity
-@Table(name="PIPConfiguration")
-@NamedQuery(name="PIPConfiguration.findAll", query="SELECT p FROM PIPConfiguration p")
-public class PIPConfiguration implements Serializable {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPConfiguration.class);
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="DESCRIPTION", nullable=true, length=2048)
-	private String description;
-
-	@Column(name="NAME", nullable=false, length=255)
-	private String name;
-
-	@Column(name="CLASSNAME", nullable=false, length=2048)
-	private String classname;
-
-	@Column(name="ISSUER", nullable=true, length=1024)
-	private String issuer;
-
-	@Column(name="READ_ONLY", nullable=false)
-	private char readOnly = '0';
-
-	@Column(name="REQUIRES_RESOLVER", nullable=false)
-	private char requiresResolvers;
-
-	@Column(name="CREATED_BY", nullable=false, length=255)
-	private String createdBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="CREATED_DATE", nullable=false, updatable=false)
-	private Date createdDate;
-
-	@Column(name="MODIFIED_BY", nullable=false, length=255)
-	private String modifiedBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="MODIFIED_DATE", nullable=false)
-	private Date modifiedDate;
-
-	//bi-directional many-to-one association to PIPConfigParam
-	@OneToMany(mappedBy="pipconfiguration", orphanRemoval=true, cascade=CascadeType.REMOVE)
-	private Set<PIPConfigParam> pipconfigParams = new HashSet<PIPConfigParam>();
-
-	//bi-directional many-to-one association to PIPType
-	@ManyToOne
-	@JoinColumn(name="TYPE")
-	private PIPType piptype;
-
-	//bi-directional many-to-one association to PIPResolver
-	@OneToMany(mappedBy="pipconfiguration", orphanRemoval=true, cascade=CascadeType.REMOVE)
-	private Set<PIPResolver> pipresolvers = new HashSet<PIPResolver>();
-
-	public PIPConfiguration() {
-	}
-	
-	public PIPConfiguration(PIPConfiguration config, String user) { //NOPMD
-		this.description = config.description;
-		this.name = config.name;
-		this.classname = config.classname;
-		this.issuer = config.issuer;
-		this.requiresResolvers = config.requiresResolvers;
-		this.readOnly = config.readOnly;
-		this.piptype = config.piptype;
-		for (PIPConfigParam param : config.pipconfigParams) {
-			this.addPipconfigParam(new PIPConfigParam(param));
-		}
-		for (PIPResolver resolver : config.pipresolvers) {
-			this.addPipresolver(new PIPResolver(resolver));
-		}
-	}
-	
-	public PIPConfiguration(String id, Properties properties) throws PIPException {
-		this.readProperties(id, properties);
-	}
-	
-	public PIPConfiguration(String id, Properties properties, String user) throws PIPException {
-		this.createdBy = user;
-		this.modifiedBy = user;
-		this.readProperties(id, properties);
-	}
-
-	@PrePersist
-	public void	prePersist() {
-		Date date = new Date();
-		this.createdDate = date;
-		this.modifiedDate = date;
-	}
-	
-	@PreUpdate
-	public void preUpdate() {
-		this.modifiedDate = new Date();
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getDescription() {
-		return this.description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getName() {
-		return this.name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getClassname() {
-		return classname;
-	}
-
-	public void setClassname(String classname) {
-		this.classname = classname;
-	}
-
-	public String getIssuer() {
-		return issuer;
-	}
-
-	public void setIssuer(String issuer) {
-		this.issuer = issuer;
-	}
-
-	public char getReadOnly() {
-		return readOnly;
-	}
-
-	public void setReadOnly(char readOnly) {
-		this.readOnly = readOnly;
-	}
-
-	public char getRequiresResolvers() {
-		return requiresResolvers;
-	}
-
-	public void setRequiresResolvers(char requireResolvers) {
-		this.requiresResolvers = requireResolvers;
-	}
-
-	public Set<PIPConfigParam> getPipconfigParams() {
-		return this.pipconfigParams;
-	}
-
-	public void setPipconfigParams(Set<PIPConfigParam> pipconfigParams) {
-		this.pipconfigParams = pipconfigParams;
-	}
-
-	public PIPConfigParam addPipconfigParam(PIPConfigParam pipconfigParam) {
-		getPipconfigParams().add(pipconfigParam);
-		pipconfigParam.setPipconfiguration(this);
-
-		return pipconfigParam;
-	}
-
-	public PIPConfigParam removePipconfigParam(PIPConfigParam pipconfigParam) {
-		if (pipconfigParam == null) {
-			return pipconfigParam;
-		}
-		getPipconfigParams().remove(pipconfigParam);
-		pipconfigParam.setPipconfiguration(null);
-
-		return pipconfigParam;
-	}
-	
-	@Transient
-	public void clearConfigParams() {
-		while (this.pipconfigParams.isEmpty() == false) {
-			this.removePipconfigParam(this.pipconfigParams.iterator().next());
-		}
-	}
-
-	public PIPType getPiptype() {
-		return this.piptype;
-	}
-
-	public void setPiptype(PIPType piptype) {
-		this.piptype = piptype;
-	}
-
-	public Set<PIPResolver> getPipresolvers() {
-		return this.pipresolvers;
-	}
-
-	public void setPipresolvers(Set<PIPResolver> pipresolvers) {
-		this.pipresolvers = pipresolvers;
-	}
-
-	public PIPResolver addPipresolver(PIPResolver pipresolver) {
-		getPipresolvers().add(pipresolver);
-		pipresolver.setPipconfiguration(this);
-
-		return pipresolver;
-	}
-
-	public PIPResolver removePipresolver(PIPResolver pipresolver) {
-		getPipresolvers().remove(pipresolver);
-		pipresolver.setPipconfiguration(null);
-
-		return pipresolver;
-	}
-
-	public String getCreatedBy() {
-		return createdBy;
-	}
-
-	public void setCreatedBy(String createdBy) {
-		this.createdBy = createdBy;
-	}
-
-	public Date getCreatedDate() {
-		return createdDate;
-	}
-
-	public void setCreatedDate(Date createdDate) {
-		this.createdDate = createdDate;
-	}
-
-	public String getModifiedBy() {
-		return modifiedBy;
-	}
-
-	public void setModifiedBy(String modifiedBy) {
-		this.modifiedBy = modifiedBy;
-	}
-
-	public Date getModifiedDate() {
-		return modifiedDate;
-	}
-
-	public void setModifiedDate(Date modifiedDate) {
-		this.modifiedDate = modifiedDate;
-	}
-
-	@Transient
-	public boolean isReadOnly() {
-		return this.readOnly == '1';
-	}
-	
-	@Transient
-	public void setReadOnly(boolean readOnly) {
-		if (readOnly) {
-			this.readOnly = '1';
-		} else {
-			this.readOnly = '0';
-		}
-	}
-	
-	@Transient
-	public boolean requiresResolvers() {
-		return this.requiresResolvers == '1';
-	}
-	
-	@Transient
-	public void	setRequiresResolvers(boolean requires) {
-		if (requires) {
-			this.requiresResolvers = '1';
-		} else {
-			this.requiresResolvers = '0';
-		}
-	}
-	
-	@Transient
-	public static Collection<PIPConfiguration>		importPIPConfigurations(Properties properties) {
-		Collection<PIPConfiguration> configurations = new ArrayList<PIPConfiguration>();
-		String engines = properties.getProperty(XACMLProperties.PROP_PIP_ENGINES);
-		if (engines == null || engines.isEmpty()) {
-			return configurations;
-		}
-		for (String id : Splitter.on(',').trimResults().omitEmptyStrings().split(engines)) {
-			PIPConfiguration configuration;
-			try {
-				String user = ((XacmlAdminUI)UI.getCurrent()).getUserid();
-				configuration = new PIPConfiguration(id, properties, user);
-				configuration.setCreatedBy(user);
-				configuration.setModifiedBy(user);
-				configurations.add(configuration);
-			} catch (PIPException e) {
-				logger.error("Import failed: " + e.getLocalizedMessage());
-			}
-		}
-		
-		return configurations;
-	}
-	
-	@Transient
-	protected	void		readProperties(String id, Properties properties) throws PIPException {
-		//
-		// Save the id if we don't have one already
-		//
-		if (this.id == 0) {
-			try {
-				this.id = Integer.parseInt(id);
-			} catch (NumberFormatException e) {
-				logger.error("Convert id to integer failed: " + id);
-			}
-		}
-		//
-		// Get its classname, this MUST exist.
-		//
-		this.classname = properties.getProperty(id + ".classname");
-		if (this.classname == null) {
-			throw new PIPException("PIP Engine defined without a classname");
-		}
-		//
-		// These classes we know for sure require resolvers.
-		//
-		if (this.classname.equals(JDBCEngine.class.getCanonicalName())) {
-			this.setRequiresResolvers(true);
-			this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_SQL));
-		} else if (this.classname.equals(LDAPEngine.class.getCanonicalName())) {
-			this.setRequiresResolvers(true);
-			this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_LDAP));
-		} else if (this.classname.equals(HyperCSVEngine.class.getCanonicalName())) {
-			this.setRequiresResolvers(true);
-			this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_HYPERCSV));
-		} else if (this.classname.equals(CSVEngine.class.getCanonicalName())) {
-			this.setRequiresResolvers(true);
-			this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_CSV));
-		} else {
-			//
-			// Assume it does not require resolvers for now, if we encounter
-			// one then we will change it. The user can always change it via the gui.
-			// 
-			this.setRequiresResolvers(false);
-			this.setPiptype(JPAUtils.getPIPType(PIPType.TYPE_CUSTOM));
-		}
-		//
-		// Go through each property
-		//
-		for (Object name : properties.keySet()) {
-			if (name.toString().startsWith(id) == false || name.equals(id + ".classname")) {
-				continue;
-			}
-			if (name.equals(id + "." + StdConfigurableEngine.PROP_NAME)) {
-				this.name = properties.getProperty(name.toString());
-			} else if (name.equals(id + "." + StdConfigurableEngine.PROP_DESCRIPTION)) {
-				this.description = properties.getProperty(name.toString());
-			} else if (name.equals(id + "." + StdConfigurableEngine.PROP_ISSUER)) {
-				this.issuer = properties.getProperty(name.toString());
-			} else if (name.equals(id + ".resolvers")) {
-				//
-				// It has resolvers, make sure this is set to true if
-				// it has been already.
-				//
-				this.setRequiresResolvers(true);
-				//
-				// Parse the resolvers
-				//
-				Collection<PIPResolver> resolvers = PIPResolver.importResolvers(id + ".resolver",
-																		properties.getProperty(name.toString()),
-																		properties,
-																		((XacmlAdminUI)UI.getCurrent()).getUserid());
-				for (PIPResolver resolver : resolvers) {
-					this.addPipresolver(resolver);
-				}
-			// Ignore {id}.resolver: the PIPResolver will parse these values
-			} else if (! name.toString().startsWith(id + ".resolver")) {
-				//
-				// Config Parameter
-				//
-				this.addPipconfigParam(new PIPConfigParam(name.toString().substring(id.length() + 1), 
-													properties.getProperty(name.toString())));
-			}
-		}
-		//
-		// Make sure we have a name at least
-		//
-		if (this.name == null) {
-			this.name = id;
-		}
-	}
-	
-
-	@Transient
-	public Map<String, String> getConfiguration(String name) {
-		String prefix;
-		if (name == null) {
-			prefix = Integer.toString(this.id);
-		} else {
-			prefix = name;
-		}
-		if (prefix.endsWith(".") == false) {
-			prefix = prefix + ".";
-		}
-		Map<String, String> map = new HashMap<String, String>();
-		map.put(prefix + "classname", this.classname);
-		map.put(prefix + "name", this.name);
-		if (this.description != null) {
-			map.put(prefix + "description", this.description);
-		}
-		if (this.issuer != null) {
-			map.put(prefix + "issuer", this.issuer);
-		}
-		
-		for (PIPConfigParam param : this.pipconfigParams) {
-			map.put(prefix + param.getParamName(), param.getParamValue());
-		}
-		
-		List<String> ids = new ArrayList<String>();
-		Iterator<PIPResolver> iter = this.pipresolvers.iterator();
-		while (iter.hasNext()) {
-			PIPResolver resolver = iter.next();
-			String id = Integer.toString(resolver.getId());
-			Map<String, String> resolverMap = resolver.getConfiguration(prefix + "resolver." + id);
-			map.putAll(resolverMap);
-			ids.add(id);
-		}
-		if (ids.size() > 0) {
-			map.put(prefix + "resolvers", Joiner.on(',').join(ids));
-		}
-		return map;
-	}
-	
-	@Transient
-	public Properties	generateProperties(String name) {
-		String prefix;
-		if (name == null) {
-			prefix = Integer.toString(this.id);
-		} else {
-			if (name.endsWith(".")) {
-				prefix = name;
-			} else {
-				prefix = name + ".";
-			}
-		}
-		Properties props = new Properties();
-		props.setProperty("xacml.pip.engines", name);
-		props.setProperty(prefix + "classname", this.classname);
-		props.setProperty(prefix + "name", this.name);
-		if (this.description != null) {
-			props.setProperty(prefix + "description", this.description);
-		}
-		if (this.issuer != null && this.issuer.isEmpty() == false) {
-			props.setProperty(prefix + "issuer", this.issuer);
-		}
-		
-		for (PIPConfigParam param : this.pipconfigParams) {
-			props.setProperty(prefix + param.getParamName(), param.getParamValue());
-		}
-		
-		List<String> ids = new ArrayList<String>();
-		Iterator<PIPResolver> iter = this.pipresolvers.iterator();
-		while (iter.hasNext()) {
-			PIPResolver resolver = iter.next();
-			String id = Integer.toString(resolver.getId());
-			resolver.generateProperties(props, prefix + "resolver." + id);
-			ids.add(id);
-		}
-		if (ids.size() > 0) {
-			props.setProperty(prefix + "resolvers", Joiner.on(',').join(ids));
-		}
-		return props;
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "PIPConfiguration [id=" + id + ", piptype=" + piptype
-				+ ", classname=" + classname + ", name=" + name
-				+ ", description=" + description + ", issuer=" + issuer
-				+ ", readOnly=" + readOnly + ", requiresResolvers="
-				+ requiresResolvers + ", createdBy=" + createdBy
-				+ ", createdDate=" + createdDate + ", modifiedBy=" + modifiedBy
-				+ ", modifiedDate=" + modifiedDate + ", pipconfigParams="
-				+ pipconfigParams + ", pipresolvers=" + pipresolvers + "]";
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java
deleted file mode 100644
index 59c9307..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolver.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.pip.PIPException;
-import org.apache.openaz.xacml.std.pip.engines.StdConfigurableEngine;
-import com.google.common.base.Splitter;
-
-
-/**
- * The persistent class for the PIPResolver database table.
- * 
- */
-@Entity
-@Table(name="PIPResolver")
-@NamedQuery(name="PIPResolver.findAll", query="SELECT p FROM PIPResolver p")
-public class PIPResolver implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="DESCRIPTION", nullable=true, length=2048)
-	private String description;
-
-	@Column(name="NAME", nullable=false, length=255)
-	private String name;
-
-	@Column(name="ISSUER", nullable=true, length=1024)
-	private String issuer;
-
-	@Column(name="CLASSNAME", nullable=false, length=2048)
-	private String classname;
-
-	@Column(name="READ_ONLY", nullable=false)
-	private char readOnly = '0';
-
-	@Column(name="CREATED_BY", nullable=false, length=255)
-	private String createdBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="CREATED_DATE", nullable=false, updatable=false)
-	private Date createdDate;
-
-	@Column(name="MODIFIED_BY", nullable=false, length=255)
-	private String modifiedBy = "guest";
-
-	@Temporal(TemporalType.TIMESTAMP)
-	@Column(name="MODIFIED_DATE", nullable=false)
-	private Date modifiedDate;
-
-	//bi-directional many-to-one association to PIPConfiguration
-	@ManyToOne
-	@JoinColumn(name="PIP_ID")
-	private PIPConfiguration pipconfiguration;
-
-	//bi-directional many-to-one association to PIPResolverParam
-	@OneToMany(mappedBy="pipresolver", orphanRemoval=true, cascade=CascadeType.REMOVE)
-	private Set<PIPResolverParam> pipresolverParams = new HashSet<PIPResolverParam>();
-
-	public PIPResolver() {
-	}
-	
-	public PIPResolver(String prefix, Properties properties, String user) throws PIPException {
-		this.createdBy = user;
-		this.modifiedBy = user;
-		this.readOnly = '0';
-		this.readProperties(prefix, properties);
-	}
-	
-	public PIPResolver(PIPResolver resolver) {
-		this.name = resolver.name;
-		this.description = resolver.description;
-		this.issuer = resolver.issuer;
-		this.classname = resolver.classname;
-		this.readOnly = resolver.readOnly;
-		for (PIPResolverParam param : this.pipresolverParams) {
-			this.addPipresolverParam(new PIPResolverParam(param));
-		}
-	}
-
-	@PrePersist
-	public void	prePersist() {
-		Date date = new Date();
-		this.createdDate = date;
-		this.modifiedDate = date;
-	}
-	
-	@PreUpdate
-	public void preUpdate() {
-		this.modifiedDate = new Date();
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getDescription() {
-		return this.description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public String getName() {
-		return this.name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getIssuer() {
-		return issuer;
-	}
-
-	public void setIssuer(String issuer) {
-		this.issuer = issuer;
-	}
-
-	public String getClassname() {
-		return classname;
-	}
-
-	public void setClassname(String classname) {
-		this.classname = classname;
-	}
-
-	public char getReadOnly() {
-		return readOnly;
-	}
-
-	public void setReadOnly(char readOnly) {
-		this.readOnly = readOnly;
-	}
-
-	public String getCreatedBy() {
-		return createdBy;
-	}
-
-	public void setCreatedBy(String createdBy) {
-		this.createdBy = createdBy;
-	}
-
-	public Date getCreatedDate() {
-		return createdDate;
-	}
-
-	public void setCreatedDate(Date createdDate) {
-		this.createdDate = createdDate;
-	}
-
-	public String getModifiedBy() {
-		return modifiedBy;
-	}
-
-	public void setModifiedBy(String modifiedBy) {
-		this.modifiedBy = modifiedBy;
-	}
-
-	public Date getModifiedDate() {
-		return modifiedDate;
-	}
-
-	public void setModifiedDate(Date modifiedDate) {
-		this.modifiedDate = modifiedDate;
-	}
-
-	public PIPConfiguration getPipconfiguration() {
-		return this.pipconfiguration;
-	}
-
-	public void setPipconfiguration(PIPConfiguration pipconfiguration) {
-		this.pipconfiguration = pipconfiguration;
-	}
-
-	public Set<PIPResolverParam> getPipresolverParams() {
-		return this.pipresolverParams;
-	}
-
-	public void setPipresolverParams(Set<PIPResolverParam> pipresolverParams) {
-		this.pipresolverParams = pipresolverParams;
-	}
-
-	public PIPResolverParam addPipresolverParam(PIPResolverParam pipresolverParam) {
-		getPipresolverParams().add(pipresolverParam);
-		pipresolverParam.setPipresolver(this);
-
-		return pipresolverParam;
-	}
-
-	public PIPResolverParam removePipresolverParam(PIPResolverParam pipresolverParam) {
-		if (pipresolverParam == null) {
-			return pipresolverParam;
-		}
-		getPipresolverParams().remove(pipresolverParam);
-		pipresolverParam.setPipresolver(null);
-
-		return pipresolverParam;
-	}
-	
-	@Transient
-	public void clearParams() {
-		while (this.pipresolverParams.isEmpty() == false) {
-			this.removePipresolverParam(this.pipresolverParams.iterator().next());
-		}
-	}
-
-	@Transient
-	public boolean isReadOnly() {
-		return this.readOnly == '1';
-	}
-	
-	@Transient
-	public void setReadOnly(boolean readOnly) {
-		if (readOnly) {
-			this.readOnly = '1';
-		} else {
-			this.readOnly = '0';
-		}
-	}
-	
-	@Transient
-	public static Collection<PIPResolver>	importResolvers(String prefix, String list, Properties properties, String user) throws PIPException {
-		Collection<PIPResolver> resolvers = new ArrayList<PIPResolver>();
-		for (String id : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) {
-			resolvers.add(new PIPResolver(prefix + "." + id, properties, user));
-		}		
-		return resolvers;
-	}
-
-	@Transient
-	protected void readProperties(String prefix, Properties properties) throws PIPException {
-		//
-		// Get its classname, this MUST exist.
-		//
-		this.classname = properties.getProperty(prefix + ".classname");
-		if (this.classname == null) {
-			throw new PIPException("PIP Engine defined without a classname");
-		}
-		//
-		// Go through each property
-		//
-		for (Object name : properties.keySet()) {
-			if (name.toString().startsWith(prefix) == false || name.equals(prefix + ".classname")) {
-				continue;
-			}
-
-			if (name.equals(prefix + "." + StdConfigurableEngine.PROP_NAME)) {
-				this.name = properties.getProperty(name.toString());
-			} else if (name.equals(prefix + "." + StdConfigurableEngine.PROP_DESCRIPTION)) {
-				this.description = properties.getProperty(name.toString());
-			} else if (name.equals(prefix + "." + StdConfigurableEngine.PROP_ISSUER)) {
-				this.issuer = properties.getProperty(name.toString());
-			} else {
-				this.addPipresolverParam(new PIPResolverParam(name.toString().substring(prefix.length() + 1),
-															properties.getProperty(name.toString())));
-			}
-		}
-	}
-
-	@Transient
-	public Map<String, String> getConfiguration(String prefix) {
-		Map<String, String> map = new HashMap<String, String>();
-		if (prefix.endsWith(".") == false) {
-			prefix = prefix + ".";
-		}
-		map.put(prefix + "classname", this.classname);
-		map.put(prefix + "name", this.name);
-		if (this.description != null) {
-			map.put(prefix + "description", this.description);
-		}
-		if (this.issuer != null && this.issuer.isEmpty() != false) {
-			map.put(prefix + "issuer", this.issuer);
-		}
-		for (PIPResolverParam param : this.pipresolverParams) {
-			map.put(prefix + param.getParamName(), param.getParamValue());
-		}
-		return map;
-	}
-
-	@Transient
-	public void	generateProperties(Properties props, String prefix) {
-		if (prefix.endsWith(".") == false) {
-			prefix = prefix + ".";
-		}
-		props.setProperty(prefix + "classname", this.classname);
-		props.setProperty(prefix + "name", this.name);
-		if (this.description != null) {
-			props.setProperty(prefix + "description", this.description);
-		}
-		if (this.issuer != null && this.issuer.isEmpty() != false) {
-			props.setProperty(prefix + "issuer", this.issuer);
-		}
-		for (PIPResolverParam param : this.pipresolverParams) {
-			props.setProperty(prefix + param.getParamName(), param.getParamValue());
-		}
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "PIPResolver [id=" + id + ", classname=" + classname + ", name="
-				+ name + ", description=" + description + ", issuer=" + issuer
-				+ ", readOnly=" + readOnly + ", createdBy=" + createdBy
-				+ ", createdDate=" + createdDate + ", modifiedBy=" + modifiedBy
-				+ ", modifiedDate=" + modifiedDate + ", pipresolverParams="
-				+ pipresolverParams + "]";
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java
deleted file mode 100644
index 917ce5b..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPResolverParam.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.*;
-
-
-/**
- * The persistent class for the PIPResolverParams database table.
- * 
- */
-@Entity
-@Table(name="PIPResolverParams")
-@NamedQuery(name="PIPResolverParam.findAll", query="SELECT p FROM PIPResolverParam p")
-public class PIPResolverParam implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="PARAM_NAME", nullable=false, length=1024)
-	private String paramName;
-
-	@Column(name="PARAM_VALUE", nullable=false, length=2048)
-	private String paramValue;
-
-	@Column(name="PARAM_DEFAULT", nullable=true, length=2048)
-	private String paramDefault;
-		
-	@Column(name="REQUIRED", nullable=false)
-	private char required = '0';
-
-	//bi-directional many-to-one association to PIPResolver
-	@ManyToOne
-	@JoinColumn(name="ID_RESOLVER")
-	private PIPResolver pipresolver;
-
-	public PIPResolverParam() {
-	}
-
-	public PIPResolverParam(String name) {
-		this.paramName = name;
-	}
-
-	public PIPResolverParam(String name, String value) {
-		this(name);
-		this.paramValue = value;
-	}
-
-	public PIPResolverParam(PIPResolverParam param) {
-		this(param.getParamName(), param.getParamValue());
-		this.paramDefault = param.getParamDefault();
-		this.required = param.required;
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getParamName() {
-		return this.paramName;
-	}
-
-	public void setParamName(String paramName) {
-		this.paramName = paramName;
-	}
-
-	public String getParamValue() {
-		return this.paramValue;
-	}
-
-	public void setParamValue(String paramValue) {
-		this.paramValue = paramValue;
-	}
-
-	public String getParamDefault() {
-		return paramDefault;
-	}
-
-	public void setParamDefault(String paramDefault) {
-		this.paramDefault = paramDefault;
-	}
-
-	public char getRequired() {
-		return required;
-	}
-
-	public void setRequired(char required) {
-		this.required = required;
-	}
-
-	public PIPResolver getPipresolver() {
-		return this.pipresolver;
-	}
-
-	public void setPipresolver(PIPResolver pipresolver) {
-		this.pipresolver = pipresolver;
-	}
-
-	@Transient
-	public boolean isRequired() {
-		return this.required == '1';
-	}
-	
-	@Transient
-	public void setRequired(boolean required) {
-		if (required) {
-			this.required = '1';
-		} else {
-			this.required = '0';
-		}
-	}
-
-	@Transient
-	@Override
-	public String toString() {
-		return "PIPResolverParam [id=" + id + ", paramName=" + paramName
-				+ ", paramValue=" + paramValue + ", required=" + required + "]";
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java
deleted file mode 100644
index 7208b76..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PIPType.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-
-/**
- * The persistent class for the PIPType database table.
- * 
- */
-@Entity
-@Table(name="PIPType")
-@NamedQuery(name="PIPType.findAll", query="SELECT p FROM PIPType p")
-public class PIPType implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static final String TYPE_SQL = "SQL";
-	public static final String TYPE_LDAP = "LDAP";
-	public static final String TYPE_CSV = "CSV";
-	public static final String TYPE_HYPERCSV = "Hyper-CSV";
-	public static final String TYPE_CUSTOM = "Custom";
-
-	@Id
-	@GeneratedValue(strategy=GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="type", nullable=false, length=45)
-	private String type;
-
-	//bi-directional many-to-one association to PIPConfiguration
-	@OneToMany(mappedBy="piptype")
-	private Set<PIPConfiguration> pipconfigurations;
-
-	public PIPType() {
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public String getType() {
-		return this.type;
-	}
-
-	public void setType(String type) {
-		this.type = type;
-	}
-
-	public Set<PIPConfiguration> getPipconfigurations() {
-		return this.pipconfigurations;
-	}
-
-	public void setPipconfigurations(Set<PIPConfiguration> pipconfigurations) {
-		this.pipconfigurations = pipconfigurations;
-	}
-
-	public PIPConfiguration addPipconfiguration(PIPConfiguration pipconfiguration) {
-		getPipconfigurations().add(pipconfiguration);
-		pipconfiguration.setPiptype(this);
-
-		return pipconfiguration;
-	}
-
-	public PIPConfiguration removePipconfiguration(PIPConfiguration pipconfiguration) {
-		getPipconfigurations().remove(pipconfiguration);
-		pipconfiguration.setPiptype(null);
-
-		return pipconfiguration;
-	}
-	
-	@Transient
-	public boolean	isSQL() {
-		return this.type.equals(TYPE_SQL);
-	}
-
-	@Transient
-	public boolean	isLDAP() {
-		return this.type.equals(TYPE_LDAP);
-	}
-
-	@Transient
-	public boolean	isCSV() {
-		return this.type.equals(TYPE_CSV);
-	}
-
-	@Transient
-	public boolean	isHyperCSV() {
-		return this.type.equals(TYPE_HYPERCSV);
-	}
-
-	@Transient
-	public boolean	isCustom() {
-		return this.type.equals(TYPE_CUSTOM);
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java
deleted file mode 100644
index d91e221..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/PolicyAlgorithms.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-
-@Entity
-@Table(name="PolicyAlgorithms")
-@NamedQuery(name="PolicyAlgorithms.findAll", query="SELECT d FROM PolicyAlgorithms d")
-public class PolicyAlgorithms implements Serializable {
-	private static final long serialVersionUID = 1L;
-	
-	public static final char STANDARD = 'S';
-	public static final char CUSTOM = 'C';
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="is_standard", nullable=false)
-	private char isStandard;
-
-	@Column(name="xacml_id", nullable=false, unique=true, length=255)
-	private String xacmlId;
-	
-	@Column(name="short_name", nullable=false, length=64)
-	private String shortName;
-
-	public PolicyAlgorithms(Identifier identifier, char standard) {
-		this.isStandard = standard;
-		if (identifier != null) {
-			this.xacmlId = identifier.stringValue();
-		}
-	}
-	
-	public PolicyAlgorithms(Identifier identifier) {
-		this(identifier, PolicyAlgorithms.STANDARD);
-	}
-
-	public PolicyAlgorithms() {
-		this(null, PolicyAlgorithms.STANDARD);
-	}
-	
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public char getIsStandard() {
-		return this.isStandard;
-	}
-
-	public void setIsStandard(char isStandard) {
-		this.isStandard = isStandard;
-	}
-
-	@Transient
-	public boolean isStandard() {
-		return this.isStandard == PolicyAlgorithms.STANDARD;
-	}
-	
-	@Transient
-	public boolean isCustom() {
-		return this.isStandard == PolicyAlgorithms.CUSTOM;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public String getShortName() {
-		return shortName;
-	}
-
-	public void setShortName(String shortName) {
-		this.shortName = shortName;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java
deleted file mode 100644
index 961984e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/RuleAlgorithms.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.jpa;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-import org.apache.openaz.xacml.api.Identifier;
-
-@Entity
-@Table(name="RuleAlgorithms")
-@NamedQuery(name="RuleAlgorithms.findAll", query="SELECT d FROM RuleAlgorithms d")
-public class RuleAlgorithms implements Serializable {
-	private static final long serialVersionUID = 1L;
-
-	public static final char STANDARD = 'S';
-	public static final char CUSTOM = 'C';
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.AUTO)
-	@Column(name="id")
-	private int id;
-
-	@Column(name="is_standard", nullable=false)
-	private char isStandard;
-
-	@Column(name="xacml_id", nullable=false, unique=true, length=255)
-	private String xacmlId;
-	
-	@Column(name="short_name", nullable=false, length=64)
-	private String shortName;
-
-	public RuleAlgorithms(Identifier id, char standard) {
-		if (id != null) {
-			this.xacmlId = id.stringValue();
-		}
-		this.isStandard = standard;
-	}
-	public RuleAlgorithms(Identifier id) {
-		this(id, RuleAlgorithms.STANDARD);
-	}
-
-	public RuleAlgorithms() {
-		this(null, RuleAlgorithms.STANDARD);
-	}
-
-	public int getId() {
-		return this.id;
-	}
-
-	public void setId(int id) {
-		this.id = id;
-	}
-
-	public char getIsStandard() {
-		return this.isStandard;
-	}
-
-	public void setIsStandard(char isStandard) {
-		this.isStandard = isStandard;
-	}
-	
-	@Transient
-	public boolean isStandard() {
-		return this.isStandard == RuleAlgorithms.STANDARD;
-	}
-	
-	@Transient
-	public boolean isCustom() {
-		return this.isStandard == RuleAlgorithms.CUSTOM;
-	}
-
-	public String getXacmlId() {
-		return this.xacmlId;
-	}
-
-	public void setXacmlId(String xacmlId) {
-		this.xacmlId = xacmlId;
-	}
-
-	public String getShortName() {
-		return shortName;
-	}
-
-	public void setShortName(String shortName) {
-		this.shortName = shortName;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java
deleted file mode 100644
index 85d06f5..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/jpa/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.
- *
- */
-
-/**
- * 
- */
-/**
- * @author pameladragosh
- *
- */
-package org.apache.openaz.xacml.admin.jpa;
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java
deleted file mode 100644
index 37d2fd4..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeContainer.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.api.AttributeValue;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.util.XACMLPolicyAggregator;
-import org.apache.openaz.xacml.util.XACMLPolicyScanner;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-import com.vaadin.ui.Table;
-
-public class AttributeContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(AttributeContainer.class);
-	//private final AttributeContainer self = this;
-	private final Map<Category, Map<Datatype, Map<String, Set<ContainerAttribute>>>> mapAttributes = new HashMap<Category, Map<Datatype, Map<String, Set<ContainerAttribute>>>>();
-
-	class ContainerAttribute {
-		Path				policy;
-		boolean				isRoot;
-		AttributeValue<?>	value;
-		
-		public ContainerAttribute(Path policy, boolean isRoot, AttributeValue<?> value) {
-			this.policy = policy;
-			this.isRoot = isRoot;
-			this.value = value;
-		}
-
-		public Path getPolicy() {
-			return policy;
-		}
-
-		public boolean isRoot() {
-			return isRoot;
-		}
-
-		public AttributeValue<?> getValue() {
-			return value;
-		}
-		
-		public boolean isCustom() {
-			return this.policy == null;
-		}
-	}
-    /**
-     * String identifier of an object's "id" property.
-     */
-    public static String PROPERTY_ID = "Id";
-
-    /**
-     * String identifier of an object's "category" property.
-     */
-    public static String PROPERTY_CATEGORY = "Category";
-
-    /**
-     * String identifier of an object's "datatype" property.
-     */
-    public static String PROPERTY_DATATYPE = "Datatype";
-
-    /**
-     * String identifier of an object's "value" property.
-     */
-    public static String PROPERTY_VALUES = "Values";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> ATTRIBUTE_PROPERTIES;
-
-    private final static Method ATTRIBUTEITEM_ID;
-    private final static Method ATTRIBUTEITEM_CATEGORY;
-    private final static Method ATTRIBUTEITEM_DATATYPE;
-    private final static Method ATTRIBUTEITEM_VALUES;
-    static {
-    	ATTRIBUTE_PROPERTIES = new ArrayList<String>();
-    	ATTRIBUTE_PROPERTIES.add(PROPERTY_ID);
-    	ATTRIBUTE_PROPERTIES.add(PROPERTY_CATEGORY);
-    	ATTRIBUTE_PROPERTIES.add(PROPERTY_DATATYPE);
-    	ATTRIBUTE_PROPERTIES.add(PROPERTY_VALUES);
-    	ATTRIBUTE_PROPERTIES =  Collections.unmodifiableCollection(ATTRIBUTE_PROPERTIES);
-    	try {
-    		ATTRIBUTEITEM_ID = AttributeItem.class.getMethod("getId", new Class[]{});
-    		ATTRIBUTEITEM_CATEGORY = AttributeItem.class.getMethod("getCategory", new Class[]{});
-    		ATTRIBUTEITEM_DATATYPE = AttributeItem.class.getMethod("getDatatype", new Class[]{});
-    		ATTRIBUTEITEM_VALUES = AttributeItem.class.getMethod("getValues", new Class[]{});
-    	} catch (final NoSuchMethodException e) {
-            throw new RuntimeException("Internal error finding methods in AttributeContainer");
-        }
-    }
-    
-	public AttributeContainer(Path rootPolicy, Collection<Path> referencedPolicies) {
-		super();
-		this.setContainer(this);
-		this.initialize(rootPolicy, referencedPolicies);
-	}
-	
-	protected void initialize(Path rootPolicy, Collection<Path> referencedPolicies) {
-		XACMLPolicyAggregator aggregator = new XACMLPolicyAggregator();
-		//
-		// Scan the policy
-		//
-		new XACMLPolicyScanner(rootPolicy, aggregator).scan();
-		this.addAttributes(aggregator, rootPolicy, true);
-		aggregator = new XACMLPolicyAggregator();
-		//
-		// Scan the referenced policies
-		//
-		for (Path policy : referencedPolicies) {
-			new XACMLPolicyScanner(policy, aggregator).scan();
-			this.addAttributes(aggregator, policy, false);
-			aggregator = new XACMLPolicyAggregator();
-		}
-	}
-	
-	protected void addAttributes(XACMLPolicyAggregator aggregator, Path policy, boolean isRoot) {
-		for (Identifier cat : aggregator.getAttributeMap().keySet()) {
-			Category category = JPAUtils.findCategory(cat);
-			if (category == null) {
-				logger.warn("Could not find category: " + cat);
-				continue;
-			}
-			if (this.mapAttributes.containsKey(category) == false) {
-				this.mapAttributes.put(category, new HashMap<Datatype, Map<String, Set<ContainerAttribute>>>());
-			}
-			Map<Datatype, Map<String, Set<ContainerAttribute>>> datatypeMap = this.mapAttributes.get(category);
-			for (Identifier dt : aggregator.getAttributeMap().get(cat).keySet()) {
-				Datatype datatype = JPAUtils.findDatatype(dt);
-				if (datatype == null) {
-					logger.warn("Could not find datatype: " + dt);
-				}
-				//
-				// Need a unique datatype object
-				//
-				datatype = new Datatype((int) System.currentTimeMillis(), datatype);
-				if (datatypeMap.containsKey(datatype) == false) {
-					datatypeMap.put(datatype, new HashMap<String, Set<ContainerAttribute>>());
-				}
-				Map<String, Set<ContainerAttribute>> attributeMap = datatypeMap.get(datatype);
-				for (Identifier id : aggregator.getAttributeMap().get(cat).get(dt).keySet()) {
-					if (attributeMap.containsKey(id.stringValue()) == false) {
-						attributeMap.put(id.stringValue(), new HashSet<ContainerAttribute>());
-					}
-					for (AttributeValue<?> attribute : aggregator.getAttributeMap().get(cat).get(dt).get(id)) {
-						attributeMap.get(id.stringValue()).add(new ContainerAttribute(policy, isRoot, attribute));
-					}
-				}
-			}
-		}
-	}
-	
-	protected boolean isObjectSupported(Object itemId) {
-		if (itemId instanceof Category ||
-			itemId instanceof Datatype ||
-			itemId instanceof String ||
-			itemId instanceof ContainerAttribute) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (this.isObjectSupported(itemId)) {
-			return new AttributeItem(itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return ATTRIBUTE_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		for (Category category : this.mapAttributes.keySet()) {
-			items.add(category);
-			for (Datatype datatype : this.mapAttributes.get(category).keySet()) {
-				items.add(datatype);
-				for (String id : this.mapAttributes.get(category).get(datatype).keySet()) {
-					items.add(id);
-					for (ContainerAttribute attribute : this.mapAttributes.get(category).get(datatype).get(id)) {
-						items.add(attribute);
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId), 
-            						new AttributeItem(itemId), ATTRIBUTEITEM_ID, null);
-        }
-        if (propertyId.equals(PROPERTY_CATEGORY)) {
-            return new MethodProperty<Object>(getType(propertyId), 
-            						new AttributeItem(itemId), ATTRIBUTEITEM_CATEGORY, null);
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return new MethodProperty<Object>(getType(propertyId), 
-            						new AttributeItem(itemId), ATTRIBUTEITEM_DATATYPE, null);
-        }
-        if (propertyId.equals(PROPERTY_VALUES)) {
-            return new MethodProperty<Object>(getType(propertyId), 
-            						new AttributeItem(itemId), ATTRIBUTEITEM_VALUES, null);
-        }
-		return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-        if (propertyId.equals(PROPERTY_ID)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_CATEGORY)) {
-            return Category.class;
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return Datatype.class;
-        }
-        if (propertyId.equals(PROPERTY_VALUES)) {
-            return Table.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return this.mapAttributes.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return false;
-		}
-		if (itemId instanceof Category) {
-			return this.mapAttributes.containsKey(itemId);
-		}
-		for (Category category : this.mapAttributes.keySet()) {
-			if (itemId instanceof Datatype) {
-				return this.mapAttributes.get(category).containsKey(itemId);
-			}
-			for (Datatype datatype : this.mapAttributes.get(category).keySet()) {
-				if (itemId instanceof String) {
-					return this.mapAttributes.get(category).get(datatype).containsKey(itemId);
-				}
-				for (String id : this.mapAttributes.get(category).get(datatype).keySet()) {
-					if (itemId instanceof ContainerAttribute) {
-						return this.mapAttributes.get(category).get(datatype).get(id).contains(itemId);
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Use addItem(Category, Datatype, AttributeValue<?>) instead.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Use addItem(Category, Datatype, AttributeValue<?>) instead.");
-	}
-
-	@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 {
-		throw new UnsupportedOperationException("Can't remove all the items. You can remove custom user attributes.");
-	}
-
-	@Override
-	public Collection<?> getChildren(Object itemId) {
-		//
-		// PLD TODO - this may not work for Datatype
-		//
-		final Collection<Object> items = new ArrayList<Object>();
-		for (Category category : this.mapAttributes.keySet()) {
-			for (Datatype datatype : this.mapAttributes.get(category).keySet()) {
-				if (itemId instanceof Category) {
-					items.add(datatype);
-				}
-				for (String id : this.mapAttributes.get(category).get(datatype).keySet()) {
-					if (itemId instanceof Category ||
-						itemId instanceof Datatype) {
-						items.add(id);
-						items.addAll(this.mapAttributes.get(category).get(datatype).get(id));
-					} else if (itemId instanceof String) {
-						items.addAll(this.mapAttributes.get(category).get(datatype).get(id));
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Object getParent(Object itemId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Collection<?> rootItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		items.add(this.mapAttributes.keySet());
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't move attributes around. Use addItem(Category, Datatype, Attribute).");
-	}
-
-	@Override
-	public boolean areChildrenAllowed(Object itemId) {
-		if (itemId instanceof Category ||
-			itemId instanceof Datatype ||
-			itemId instanceof String) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed)
-			throws UnsupportedOperationException {
-		if (itemId instanceof Category ||
-			itemId instanceof Datatype ||
-			itemId instanceof String) {
-			if (areChildrenAllowed) {
-				return true;
-			}
-			return false;
-		}
-		if (areChildrenAllowed == false) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isRoot(Object itemId) {
-		return this.mapAttributes.containsKey(itemId);
-	}
-
-	@Override
-	public boolean hasChildren(Object itemId) {
-		if (itemId instanceof ContainerAttribute) {
-			return false;
-		}
-		if (itemId instanceof Category) {
-			if (this.mapAttributes.containsKey(itemId)) {
-				return this.mapAttributes.get(itemId).size() > 0;
-			}
-			return false;
-		}
-		//
-		// PLD TODO - this may not work. Datatype may prove difficult
-		// to distinguish which category it is in.
-		//
-		for (Category category : this.mapAttributes.keySet()) {
-			if (itemId instanceof Datatype) {
-				if (this.mapAttributes.get(category).containsKey(itemId)) {
-					return this.mapAttributes.get(category).get(itemId).size() > 0;
-				}
-				continue;
-			}
-			for (Datatype datatype : this.mapAttributes.get(category).keySet()) {
-				if (itemId instanceof String) {
-					if (this.mapAttributes.get(category).get(datatype).containsKey(itemId)) {
-						return this.mapAttributes.get(category).get(datatype).get(itemId).size() > 0;
-					}
-					continue;
-				}
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (! (itemId instanceof ContainerAttribute)) {
-			return false;
-		}
-		for (Category category : this.mapAttributes.keySet()) {
-			for (Datatype datatype : this.mapAttributes.get(category).keySet()) {
-				for (String id : this.mapAttributes.get(category).get(datatype).keySet()) {
-					if (this.mapAttributes.get(category).get(datatype).get(id).contains(itemId)) {
-						return this.mapAttributes.get(category).get(datatype).get(id).remove(itemId);
-					}
-				}
-			}
-		}
-		return false;
-	}
-	
-	public class AttributeItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final Object data;
-		
-		public AttributeItem(Object data) {
-			this.data = data;
-		}
-		
-		public String getId() {
-			return null;
-		}
-		
-		public Category getCategory() {
-			return null;
-		}
-		
-		public Datatype getDatatype() {
-			return null;
-		}
-		
-		public Table	getValues() {
-			return null;
-		}
-
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.data, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-	          return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Attribute container does not support adding new properties");
-		}
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Attribute container does not support removing properties");
-		}
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java
deleted file mode 100644
index 1074936..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/AttributeValueContainer.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.model.AttributeContainer.ContainerAttribute;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class AttributeValueContainer extends ItemSetChangeNotifier implements Container.Ordered, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private final Datatype datatype; //NOPMD
-	private final List<ContainerAttribute> attributes;
-
-    /**
-     * String identifier of an object's "Value" property.
-     */
-    public static String PROPERTY_VALUE = "Value";
-
-    /**
-     * String identifier of an object's "Source" property.
-     */
-    public static String PROPERTY_SOURCE = "Source";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> ATTRIBUTEVALUE_PROPERTIES;
-
-    private final static Method ATTRIBUTEVALUEITEM_VALUE;
-    private final static Method ATTRIBUTEVALUEITEM_SOURCE;
-    static {
-    	ATTRIBUTEVALUE_PROPERTIES = new ArrayList<String>();
-    	ATTRIBUTEVALUE_PROPERTIES.add(PROPERTY_VALUE);
-    	ATTRIBUTEVALUE_PROPERTIES.add(PROPERTY_SOURCE);
-    	ATTRIBUTEVALUE_PROPERTIES =  Collections.unmodifiableCollection(ATTRIBUTEVALUE_PROPERTIES);
-    	try {
-    		ATTRIBUTEVALUEITEM_VALUE = AttributeValueItem.class.getMethod("getValue", new Class[]{});
-    		ATTRIBUTEVALUEITEM_SOURCE = AttributeValueItem.class.getMethod("getSource", new Class[]{});
-    	} catch (final NoSuchMethodException e) {
-            throw new RuntimeException("Internal error finding methods in AttributeValueContainer");
-        }
-    }
-    
-    public AttributeValueContainer(Datatype datatype, List<ContainerAttribute> attributes) {
-		this.datatype = datatype;
-		this.attributes = attributes;
-	}
-    
-    public boolean isObjectSupported(Object itemId) {
-    	return itemId instanceof ContainerAttribute;
-    }
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (itemId instanceof ContainerAttribute) {
-			return new AttributeValueItem((ContainerAttribute) itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return ATTRIBUTEVALUE_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		return Collections.unmodifiableList(this.attributes);
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-        if (propertyId.equals(PROPERTY_VALUE)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new AttributeValueItem((ContainerAttribute) itemId), ATTRIBUTEVALUEITEM_VALUE, null);
-        }
-
-        if (propertyId.equals(PROPERTY_SOURCE)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new AttributeValueItem((ContainerAttribute) itemId), ATTRIBUTEVALUEITEM_SOURCE, null);
-        }
-		return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-        if (propertyId.equals(PROPERTY_VALUE)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_SOURCE)) {
-            return String.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return this.attributes.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		return this.attributes.contains(itemId);
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		return new AttributeValueItem((ContainerAttribute) itemId);
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Please use addItem(Object itemId) - setup the container attribute first.");
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (this.isObjectSupported(itemId) == false) {
-			return false;
-		}
-		throw new UnsupportedOperationException("TODO");
-//		return this.attributes.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 {
-		throw new UnsupportedOperationException("TODO");
-//		this.attributes.clear();
-//		return true;
-	}
-
-	@Override
-	public Object nextItemId(Object itemId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		int index = this.getItemIndex((ContainerAttribute) itemId);
-		if (index == -1 || index >= this.attributes.size()) {
-			return null;
-		}
-		return this.attributes.get(index + 1);
-	}
-
-	@Override
-	public Object prevItemId(Object itemId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		int index = this.getItemIndex((ContainerAttribute) itemId);
-		if (index == -1 || index == 0) {
-			return null;
-		}
-		return this.attributes.get(index - 1);
-	}
-
-	@Override
-	public Object firstItemId() {
-		if (this.attributes.size() > 0) {
-			return this.attributes.get(0);
-		}
-		return null;
-	}
-
-	@Override
-	public Object lastItemId() {
-		if (this.attributes.size() > 0) {
-			return this.attributes.get(this.attributes.size() - 1);
-		}
-		return null;
-	}
-
-	@Override
-	public boolean isFirstId(Object itemId) {
-		if (this.attributes.size() > 0) {
-			return this.attributes.get(0).equals(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isLastId(Object itemId) {
-		if (this.attributes.size() > 0) {
-			return this.attributes.get(this.attributes.size() - 1).equals(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Use addItemAfter(Object previousItemId, Object newItemId) - please create the object yourself.");
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException {
-		if (this.isObjectSupported(previousItemId) == false || this.isObjectSupported(newItemId) == false) {
-			return null;
-		}
-		int index = this.getItemIndex((ContainerAttribute) previousItemId);
-		if (index >= 0) {
-			this.attributes.add(index, (ContainerAttribute) newItemId);
-		}
-		return null;
-	}
-	
-	protected int	getItemIndex(ContainerAttribute itemId) {
-		int index;
-		for (index = 0; index < this.attributes.size(); index++) {
-			if (this.attributes.get(index).equals(itemId)) {
-				return index;
-			}
-		}
-		return -1;
-	}
-	
-	public class AttributeValueItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final ContainerAttribute attribute;
-		
-		public AttributeValueItem(ContainerAttribute attribute) {
-			this.attribute = attribute;
-		}
-
-		public String getValue() {
-			if (this.attribute == null) {
-				return null;
-			}
-			return this.attribute.value.toString();
-		}
-
-		public String getSource() {
-			if (this.attribute == null) {
-				return null;
-			}
-			return this.attribute.value.toString();
-		}
-
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.attribute, id);
-		}
-		@Override
-		public Collection<?> getItemPropertyIds() {
-           return getContainerPropertyIds();
-		}
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Attribute Value container does not support adding new properties");
-		}
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Attribute Value container does not support removing properties");
-		}
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java
deleted file mode 100644
index 30c8670..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ExpressionContainer.java
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.bind.JAXBElement;
-
-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.AttributeSelectorType;
-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.ExpressionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.FunctionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObjectFactory;
-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.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.util.XACMLFunctionValidator;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class ExpressionContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(ExpressionContainer.class);
-	
-	/**
-     * String identifier of a file's "name" property.
-     */
-    public static String PROPERTY_NAME = "Name";
-
-    /**
-     * String identifier of an object's "id" property.
-     */
-    public static String PROPERTY_ID = "Id";
-
-    /**
-     * String identifier of an object's "datatype" property.
-     */
-    public static String PROPERTY_DATATYPE_SHORT = "shortDatatype";
-
-    /**
-     * String identifier of an object's "id" property.
-     */
-    public static String PROPERTY_ID_SHORT = "shortId";
-
-    /**
-     * String identifier of an object's "datatype" property.
-     */
-    public static String PROPERTY_DATATYPE = "Datatype";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> EXPRESSION_PROPERTIES;
-
-    private final static Method EXPRESSIONITEM_NAME;
-    
-    private final static Method EXPRESSIONITEM_ID;
-
-    private final static Method EXPRESSIONITEM_DATATYPE;
-
-    private final static Method EXPRESSIONITEM_ID_SHORT;
-
-    private final static Method EXPRESSIONITEM_DATATYPE_SHORT;
-
-    static {
-    	EXPRESSION_PROPERTIES = new ArrayList<String>();
-    	EXPRESSION_PROPERTIES.add(PROPERTY_NAME);
-    	EXPRESSION_PROPERTIES.add(PROPERTY_ID);
-    	EXPRESSION_PROPERTIES.add(PROPERTY_DATATYPE);
-    	EXPRESSION_PROPERTIES.add(PROPERTY_ID_SHORT);
-    	EXPRESSION_PROPERTIES.add(PROPERTY_DATATYPE_SHORT);
-    	EXPRESSION_PROPERTIES = Collections.unmodifiableCollection(EXPRESSION_PROPERTIES);
-    	try {
-    		EXPRESSIONITEM_NAME = ExpressionItem.class.getMethod("getName", new Class[]{});
-    		EXPRESSIONITEM_ID = ExpressionItem.class.getMethod("getId", new Class[]{});
-    		EXPRESSIONITEM_DATATYPE = ExpressionItem.class.getMethod("getDatatype", new Class[]{});
-    		EXPRESSIONITEM_ID_SHORT = ExpressionItem.class.getMethod("getIdShort", new Class[]{});
-    		EXPRESSIONITEM_DATATYPE_SHORT = ExpressionItem.class.getMethod("getDatatypeShort", new Class[]{});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PolicyContainer");
-        }
-    }
-    
-    protected class ApplyParent {
-    	ApplyType apply;
-    	FunctionArgument argument;
-    	
-    	public ApplyParent(ApplyType apply, FunctionArgument argument) {
-    		this.apply = apply;
-    		this.argument = argument;
-    	}
-
-		public ApplyType getApply() {
-			return apply;
-		}
-
-		public void setApply(ApplyType apply) {
-			this.apply = apply;
-		}
-
-		public FunctionArgument getArgument() {
-			return argument;
-		}
-
-		public void setArgument(FunctionArgument argument) {
-			this.argument = argument;
-		}
-    }
-    //
-    // Our parent object information and which argument we are
-    // from our parent (relevant to the Apply).
-    //
-    private final Object parent;
-    private final FunctionArgument argument;
-    //
-    // The root object of the expression
-    //
-    private Object root;
-    //
-    // Our helper tables for organization purposes and to
-    // make sure the correct functions/datatypes are being
-    // setup.
-    //
-    private Map<ApplyType, ApplyParent>					applys = new HashMap<ApplyType, ApplyParent>();
-    private Map<FunctionType, ApplyParent>				functions = new HashMap<FunctionType, ApplyParent>();
-    private Map<AttributeValueType, ApplyParent>		values = new HashMap<AttributeValueType, ApplyParent>();
-    private Map<AttributeDesignatorType, ApplyParent>	designators = new HashMap<AttributeDesignatorType, ApplyParent>();
-    private Map<AttributeSelectorType, ApplyParent>		selectors = new HashMap<AttributeSelectorType, ApplyParent>();
-    private Map<VariableReferenceType, ApplyParent>		variables = new HashMap<VariableReferenceType, ApplyParent>();
-    private Map<ExpressionType, ApplyParent>			expressions = new HashMap<ExpressionType, ApplyParent>();
-    	
-    public ExpressionContainer(Object parent, Object root, FunctionArgument argument) {
-		super();
-		this.setContainer(this);
-		this.parent = parent;
-		this.root = root;
-		this.argument = argument;
-		this.initialize();
-	}
-    
-    private void initialize() {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("Initializing: " + this.parent + " " + this.argument + " " + this.root);
-    	}
-    	//
-    	// Make sure we support the parent object
-    	//
-    	@SuppressWarnings("unused")
-		JAXBElement<?> rootElement = null;
-    	if (this.parent instanceof ConditionType) {
-    		rootElement = ((ConditionType) this.parent).getExpression();
-    	} else if (this.parent instanceof VariableDefinitionType) {
-    		rootElement = ((VariableDefinitionType) this.parent).getExpression();
-    	} else if (this.parent instanceof AttributeAssignmentExpressionType) {
-    		rootElement = ((AttributeAssignmentExpressionType) this.parent).getExpression();
-    	} else if (this.parent instanceof ApplyType) {
-    		//
-    		// They must tell us which argument we are
-    		//
-    		if (this.argument == null) {
-        		throw new IllegalArgumentException("Must supply Argument object when editing a parent ApplyType's child node");
-    		}
-    		//
-    		// Finish the initialization
-    		//
-    		this.initializeRoot();
-    	} else {
-    		throw new IllegalArgumentException("Unsupported Parent Object: " + this.parent.getClass().getCanonicalName());
-    	}
-    	/*
-    	//
-    	// Check if there actually is a root
-    	//
-    	if (rootElement == null || rootElement.getValue() == null) {
-    		//
-    		// Creating a new one
-    		//
-    		return;
-    	}
-		//
-		// Save the root
-		//
-		this.root = rootElement.getValue();
-		*/
-		//
-		// Finish initializing
-		//
-		this.initializeRoot();
-   }
-
-    private void initializeRoot() {
-    	//
-    	// Sanity check
-    	//
-    	if (this.root == null) {
-    		return;
-    	}
-		//
-		// Figure out the expression type
-		//
-		if (this.root instanceof ApplyType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Apply");
-		   	}
-		   	//
-			// Save it
-			//
-			this.applys.put((ApplyType) this.root, null);
-			//
-			// Determine the function for this Apply
-			//
-			Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap();
-			FunctionDefinition function  = functions.get(((ApplyType) this.root).getFunctionId());
-			if (function == null) {
-				logger.warn("root apply does not have a function defined");
-				return;
-			}
-			//
-			// Bring in its children
-			//
-			this.initializeChildren((ApplyType) this.root, function);
-		} else if (this.root instanceof AttributeValueType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Attribute Value");
-		   	}
-			//
-			// Save it
-			//
-			this.values.put((AttributeValueType) this.root, null);
-		} else if (this.root instanceof AttributeDesignatorType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Attribute Designator");
-		   	}
-			//
-			// Save it
-			//
-			this.designators.put((AttributeDesignatorType) this.root, null);
-		} else if (this.root instanceof AttributeSelectorType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Attribute Selector");
-		   	}
-			//
-			// Save it
-			//
-			this.selectors.put((AttributeSelectorType) this.root, null);
-		} else if (this.root instanceof VariableReferenceType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Variable Reference");
-		   	}
-			//
-			// Save it
-			//
-			this.variables.put((VariableReferenceType) this.root, null);
-		} else if (this.root instanceof FunctionType) {
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Root Is Function");
-		   	}
-			//
-			// Save it - Really? I don't think the root would ever be a function.
-			//
-			this.functions.put((FunctionType) this.root, null);
-		} else {
-			throw new IllegalArgumentException("Unsupported Expression Root Item: " + this.root.getClass().getCanonicalName());
-		}
-    }
-    
-    private void initializeChildren(ApplyType apply, FunctionDefinition function) {
-    	int index = 1;
-    	for (JAXBElement<?> child : apply.getExpression()) {
-    		//
-    		// Validate the child
-    		//
-    		if (child.getValue() == null) {
-    			logger.warn("child element " + index + "has a null object.");
-    			index++;
-    			continue;
-    		}
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Child " + index + " is " + child.getValue());
-		   	}
-    		//
-    		// Get the argument for this child
-    		//
-    		if (function == null) {
-    			throw new IllegalArgumentException("Apply has children but no function defined.");
-    		}
-    		FunctionArgument argument = XACMLFunctionValidator.getFunctionArgument(index, function);
-		   	if (logger.isTraceEnabled()) {
-		   		logger.trace("Child's argument is: " + argument);
-		   	}
-    		if (argument == null) {
-    			//throw new Exception("Unable to find function argument: " + index + " " + function.getId() + " " + function.getShortname());
-    			return;
-    		}
-			//
-			// See if its another apply type
-			//
-    		if (child.getValue() instanceof ApplyType) {
-    			//
-    			// Save it
-    			//
-    			this.applys.put((ApplyType) child.getValue(), new ApplyParent(apply, argument));
-    			//
-    			// Get its function information
-    			//
-    			Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap();
-    			FunctionDefinition childFunction  = functions.get(((ApplyType) child.getValue()).getFunctionId());
-    			if (childFunction == null) {
-    				logger.warn("Apply object " + index + " does not have a function defined");
-    			} else {
-	    			//
-	    			// Bring in its children
-	    			//
-	    			this.initializeChildren((ApplyType) child.getValue(), childFunction);
-    			}
-    		} else if (child.getValue() instanceof AttributeValueType) {
-    			//
-    			// Save it
-    			//
-    			this.values.put((AttributeValueType) child.getValue(), new ApplyParent(apply, argument));
-    		} else if (child.getValue() instanceof AttributeDesignatorType) {
-    			//
-    			// Save it
-    			//
-    			this.designators.put((AttributeDesignatorType) child.getValue(), new ApplyParent(apply, argument));
-    		} else if (child.getValue() instanceof AttributeSelectorType) {
-    			//
-    			// Save it
-    			//
-    			this.selectors.put((AttributeSelectorType) child.getValue(), new ApplyParent(apply, argument));
-    		} else if (child.getValue() instanceof VariableReferenceType) {
-    			//
-    			// Save it
-    			//
-    			this.variables.put((VariableReferenceType) child.getValue(), new ApplyParent(apply, argument));
-    		} else if (child.getValue() instanceof FunctionType) {
-    			//
-    			// Save it
-    			//
-    			this.functions.put((FunctionType) child.getValue(), new ApplyParent(apply, argument));
-    		} else if (child.getValue() instanceof ExpressionType) {
-    			//
-    			// Save it
-    			//
-    			this.expressions.put((ExpressionType) child.getValue(), new ApplyParent(apply, argument));
-    		} else {
-    			logger.error("Unknown child type: " + child.getClass().getCanonicalName());
-    		}
-    		index++;
-    	}
-    }
-    
-    protected boolean	isObjectSupported(Object itemId) {
-		if (itemId instanceof ApplyType ||
-			itemId instanceof AttributeValueType ||
-			itemId instanceof AttributeDesignatorType ||
-			itemId instanceof AttributeSelectorType ||
-			itemId instanceof VariableReferenceType ||
-			itemId instanceof FunctionType ||
-			itemId instanceof ExpressionType) {
-			return true;
-		}
-		return false;
-    }
-    
-    protected boolean isParentObjectSupport(Object parent) {
-		if (parent instanceof ApplyType ||
-			parent instanceof ConditionType ||
-			parent instanceof VariableDefinitionType ||
-			parent instanceof AttributeAssignmentExpressionType) {
-			return true;
-		}
-		return false;
-    }
-    
-	public void updateItem(Object itemId) {
-		//
-		// Sanity check
-		//
-		if (this.isObjectSupported(itemId) == false) {
-			return;// null;
-		}
-		//
-		// Notify - the real reason for this function
-		//
-		this.fireItemSetChange();
-		//
-		// Return the item
-		//
-		//return new ExpressionItem(itemId);
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		return new ExpressionItem(itemId);
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return EXPRESSION_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (this.root != null) {
-			//
-			// Add the root object
-			//
-			items.add(this.root);
-			//
-			// If its an apply, it could have children
-			//
-			if (this.root instanceof ApplyType) {
-				items.add(this.getChildrenIds((ApplyType) this.root, true));
-			}
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItemIds (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-	
-	protected Collection<?> getChildrenIds(ApplyType apply, boolean recursive) {
-		Collection<Object> items = new ArrayList<Object>();
-    	for (JAXBElement<?> child : apply.getExpression()) {
-    		//
-    		// Make sure there's a value
-    		//
-    		if (child.getValue() == null) {
-    			continue;
-    		}
-    		//
-    		// What kind is it?
-    		//
-    		if (child.getValue() instanceof ApplyType) {
-    			items.add(child.getValue());
-    			//
-    			// Do we add its children?
-    			//
-    			if (recursive) {
-        			items.addAll(this.getChildrenIds((ApplyType) child.getValue(), true));
-    			}
-    		} else if (child.getValue() instanceof AttributeValueType) {
-    			items.add(child.getValue());
-    		} else if (child.getValue() instanceof AttributeDesignatorType) {
-    			items.add(child.getValue());
-    		} else if (child.getValue() instanceof AttributeSelectorType) {
-    			items.add(child.getValue());
-    		} else if (child.getValue() instanceof VariableReferenceType) {
-    			items.add(child.getValue());
-    		} else if (child.getValue() instanceof FunctionType) {
-    			items.add(child.getValue());
-    		} else if (child.getValue() instanceof ExpressionType) {
-    			items.add(child.getValue());
-    		}
-    	}		
-		if (logger.isTraceEnabled()) {
-			logger.trace("getChildrenIds " + apply.getFunctionId() + " (" + items.size() + "):" + items);
-		}
-		return items;
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ExpressionItem(itemId), EXPRESSIONITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ExpressionItem(itemId), EXPRESSIONITEM_ID, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ExpressionItem(itemId), EXPRESSIONITEM_DATATYPE, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_ID_SHORT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ExpressionItem(itemId), EXPRESSIONITEM_ID_SHORT, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ExpressionItem(itemId), EXPRESSIONITEM_DATATYPE_SHORT, null);
-        }
-		
-		return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ID)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ID_SHORT)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) {
-            return String.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		int size = 0;
-		size += this.applys.size();
-		size += this.designators.size();
-		size += this.functions.size();
-		size += this.selectors.size();
-		size += this.values.size();
-		size += this.variables.size();
-		size += this.expressions.size();
-		return size;
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("containsId: " + itemId);
-		}
-		if (itemId instanceof ApplyType) {
-			return this.applys.containsKey(itemId);
-		}
-		if (itemId instanceof AttributeValueType) {
-			return this.values.containsKey(itemId);
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return this.designators.containsKey(itemId);
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return this.selectors.containsKey(itemId);
-		}
-		if (itemId instanceof VariableReferenceType) {
-			return this.variables.containsKey(itemId);
-		}
-		if (itemId instanceof FunctionType) {
-			return this.functions.containsKey(itemId);
-		}
-		if (itemId instanceof ExpressionType) {
-			return this.expressions.containsKey(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Please use the addItem(Object, Object) method instead.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("use addItem(Object itemId)");
-	}
-	
-	public Item addItem(Object itemId, ApplyType parent, FunctionArgument argument) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItem: " + itemId + " " + parent + " " + argument);
-		}
-		//
-		// Make sure we support the object
-		//
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		//
-		// Is is a root?
-		//
-		if (parent == null) {
-			//
-			// Setting root
-			//
-			if (this.root != null) {
-				throw new UnsupportedOperationException("Cannot add another root item. Remove the current root first.");
-			}
-			//
-			// Save the root information
-			//
-			this.root = itemId;
-			//
-			// Add its children
-			//
-			this.initializeRoot();
-			//
-			// Add it to our root container
-			//
-			if (this.parent instanceof ApplyType) {
-				((ApplyType) this.parent).getExpression().add(this.createElement(this.root));
-			} else if (this.parent instanceof ConditionType) {
-				((ConditionType) this.parent).setExpression(this.createElement(this.root));
-			} else if (this.parent instanceof VariableDefinitionType) {
-				((VariableDefinitionType) this.parent).setExpression(this.createElement(this.root));
-			} else if (this.parent instanceof AttributeAssignmentExpressionType) {
-				((AttributeAssignmentExpressionType) this.parent).setExpression(this.createElement(this.root));
-			} else {
-				logger.error("unknown parent class: " + this.parent.getClass().getCanonicalName());
-			}
-			//
-			// Notify that we changed
-			//
-			this.fireItemSetChange();
-			//
-			// Return new item
-			//
-			return new ExpressionItem(this.root);
-		}
-		//
-		// Check what kind of item this is
-		//
-		if (itemId instanceof ApplyType) {
-			//
-			this.applys.put((ApplyType) itemId, new ApplyParent(parent, argument));
-			((ApplyType) parent).getExpression().add(new ObjectFactory().createApply((ApplyType) itemId));
-			//
-			// Get its function information
-			//
-			Map<String, FunctionDefinition> functions = JPAUtils.getFunctionIDMap();
-			FunctionDefinition childFunction  = functions.get(((ApplyType) itemId).getFunctionId());
-			if (childFunction == null) {
-				//
-				// NO function defined
-				//
-				logger.warn("no function defined for apply being added.");
-			} else {
-				//
-				// Add its children
-				//
-				this.initializeChildren((ApplyType) itemId, childFunction);
-			}
-		} else if (itemId instanceof AttributeValueType) {
-			//
-			this.values.put((AttributeValueType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createAttributeValue((AttributeValueType) itemId));
-			//
-		} else if (itemId instanceof AttributeDesignatorType) {
-			//
-			this.designators.put((AttributeDesignatorType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) itemId));
-			//
-		} else if (itemId instanceof AttributeSelectorType) {
-			//
-			this.selectors.put((AttributeSelectorType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createAttributeSelector((AttributeSelectorType) itemId));
-			//
-		} else if (itemId instanceof VariableReferenceType) {
-			//
-			this.variables.put((VariableReferenceType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createVariableReference((VariableReferenceType) itemId));
-			//
-		} else if (itemId instanceof FunctionType) {
-			//
-			this.functions.put((FunctionType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createFunction((FunctionType) itemId));
-			//
-		} else if (itemId instanceof ExpressionType) {
-			//
-			this.expressions.put((ExpressionType) itemId, new ApplyParent(parent, argument));
-			parent.getExpression().add(new ObjectFactory().createExpression((ExpressionType) itemId));
-		} else {
-			logger.error("unknown itemId class: " + itemId.getClass().getCanonicalName());
-			return null;
-		}
-		//
-		// Notify
-		//
-		this.fireItemSetChange();
-		return new ExpressionItem(itemId);
-	}
-	
-	private JAXBElement<?> createElement(Object item) {
-		if (item instanceof ApplyType) {
-			return new ObjectFactory().createApply((ApplyType) item);
-		} else if (item instanceof AttributeValueType) {
-			return new ObjectFactory().createAttributeValue((AttributeValueType) item);
-		} else if (item instanceof AttributeDesignatorType) {
-			return new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) item);
-		} else if (item instanceof AttributeSelectorType) {
-			return new ObjectFactory().createAttributeSelector((AttributeSelectorType) item);
-		} else if (item instanceof VariableReferenceType) {
-			return new ObjectFactory().createVariableReference((VariableReferenceType) item);
-		} else if (item instanceof FunctionType) {
-			return new ObjectFactory().createFunction((FunctionType) item);
-		} else if (item instanceof ExpressionType) {
-			return new ObjectFactory().createExpression((ExpressionType) item);
-		}
-		return null;
-	}
-	
-	@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 {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeAllItems: ");
-		}
-		boolean result = this.doRemoveAllItems();
-		if (result == false) {
-			return false;
-		}
-		//
-		// Notify
-		//
-		this.fireItemSetChange();
-		//
-		// Done
-		//
-		return true;
-	}
-
-	public boolean doRemoveAllItems() throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("doRemoveAllItems: ");
-		}
-		//
-		// Removing the root item, make sure its removed from
-		// the parent.
-		//
-		if (this.parent instanceof ConditionType) {
-			((ConditionType) this.parent).setExpression(null);
-		} else if (this.parent instanceof VariableDefinitionType) {
-			((VariableDefinitionType) this.parent).setExpression(null);
-		} else if (this.parent instanceof AttributeAssignmentExpressionType) {
-			((AttributeAssignmentExpressionType) this.parent).setExpression(null);
-		} else if (this.parent instanceof ApplyType) {
-			//
-			// TODO ?? Special case
-			//
-			return false;
-		} else {
-			return false;
-		}
-		//
-		// Null our root
-		//
-		this.root = null;
-		//
-		// Clear out our maps
-		//
-		this.applys.clear();
-		this.designators.clear();
-		this.functions.clear();
-		this.values.clear();
-		this.selectors.clear();
-		this.variables.clear();
-		this.expressions.clear();
-		//
-		// Done
-		//
-		return true;
-	}
-
-	@Override
-	public Collection<?> getChildren(Object itemId) {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (itemId instanceof ApplyType) {
-			items.addAll(this.getChildrenIds((ApplyType) itemId, false));
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("getChildren " + itemId + " (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-	
-	public FunctionArgument getArgument(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getArgument: " + itemId);
-		}
-		//
-		// First check if its a root
-		//
-		if (this.isRoot(itemId)) {
-			return null;
-		}
-		//
-		// Not a root - should be in the maps
-		//
-		if (itemId instanceof ApplyType) {
-			return this.applys.get(itemId).getArgument();
-		}
-		if (itemId instanceof AttributeValueType) {
-			return this.values.get(itemId).getArgument();
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return this.designators.get(itemId).getArgument();
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return this.selectors.get(itemId).getArgument();
-		}
-		if (itemId instanceof VariableReferenceType) {
-			return this.variables.get(itemId).getArgument();
-		}
-		if (itemId instanceof FunctionType) {
-			return this.functions.get(itemId).getArgument();
-		}
-		if (itemId instanceof ExpressionType) {
-			return this.expressions.get(itemId).getArgument();
-		}
-		return null;
-	}
-
-	@Override
-	public Object getParent(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getParent: " + itemId);
-		}
-		//
-		// First check if its a root
-		//
-		if (this.isRoot(itemId)) {
-			return null;
-		}
-		//
-		// Not a root - should be in the maps
-		//
-		if (itemId instanceof ApplyType) {
-			return this.applys.get(itemId).getApply();
-		}
-		if (itemId instanceof AttributeValueType) {
-			return this.values.get(itemId).getApply();
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return this.designators.get(itemId).getApply();
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return this.selectors.get(itemId).getApply();
-		}
-		if (itemId instanceof VariableReferenceType) {
-			return this.variables.get(itemId).getApply();
-		}
-		if (itemId instanceof FunctionType) {
-			return this.functions.get(itemId).getApply();
-		}
-		if (itemId instanceof ExpressionType) {
-			return this.expressions.get(itemId).getApply();
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> rootItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (this.root != null) {
-			items.add(this.root);
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("rootItemIds " + " (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		//
-		// TODO we can support this later
-		//
-		throw new UnsupportedOperationException("Should we support this? Can be tricky. Most likely user dragging an item from one area to another. For now, use removeItem, addItem.");
-	}
-
-	@Override
-	public boolean areChildrenAllowed(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("areChildrenAllowed: " + itemId);
-		}
-		if (itemId instanceof ApplyType) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed)
-			throws UnsupportedOperationException {
-		if (itemId instanceof ApplyType && areChildrenAllowed) {
-			return true;
-		}
-		if (! areChildrenAllowed) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isRoot(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("isRoot: " + itemId);
-		}
-		if (itemId == null) {
-			logger.error("isRoot itemId is NULL");
-		}
-		return this.root == itemId;
-	}
-
-	@Override
-	public boolean hasChildren(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("hasChildren: " + itemId);
-		}
-		if (itemId instanceof ApplyType) {
-			return ((ApplyType)itemId).getExpression().size() > 0;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeItem: " + itemId);
-		}
-		//
-		// Check if they are removing the root
-		//
-		if (this.root == itemId) {
-			//
-			// Removing the root item, make sure its removed from
-			// the parent.
-			//
-			boolean result = this.doRemoveAllItems();
-			if (result == false) {
-				return false;
-			}
-			//
-			// Notify
-			//
-			this.fireItemSetChange();
-			return true;
-		}
-		//
-		// There should be a parent
-		//
-		ApplyParent parent = null;
-		//
-		// Remove the item from the maps
-		//
-		if (itemId instanceof ApplyType) {
-			parent = this.applys.get(itemId);
-			if (parent == null) {
-				return false;
-			}
-			if (this.applys.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof AttributeValueType) {
-			parent = this.values.get(itemId);
-			if (this.values.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof AttributeDesignatorType) {
-			parent = this.designators.get(itemId);
-			if (this.designators.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof AttributeSelectorType) {
-			parent = this.selectors.get(itemId);
-			if (this.selectors.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof VariableReferenceType) {
-			parent = this.variables.get(itemId);
-			if (this.variables.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof FunctionType) {
-			parent = this.functions.get(itemId);
-			if (this.functions.remove(itemId) == null) {
-				return false;
-			}
-		} else if (itemId instanceof ExpressionType) {
-			parent = this.expressions.get(itemId);
-			if (this.expressions.remove(itemId) != null) {
-				return false;
-			}
-		} else {
-			return false;
-		}
-		//
-		// Remove it from the parent Apply
-		//
-		boolean removed = false;
-		for (JAXBElement<?> element : parent.getApply().getExpression()) {
-			if (element.getValue().equals(itemId)) {
-				if (parent.getApply().getExpression().remove(element)) {
-					removed = true;
-					break;
-				}
-				break;
-			}
-		}
-		if (! removed) {
-			//
-			// Out of sync
-			//
-			logger.warn("Removing item from parent returned false, although we were able to remove it from our maps.");
-		}
-		//
-		// Notify
-		//
-		this.fireItemSetChange();
-		return true;
-	}
-
-	public class ExpressionItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final Object data;
-		
-		public ExpressionItem(Object data) {
-			this.data = data;
-		}
-		
-		public String getName() {
-			if (this.data instanceof ApplyType) {
-				if (((ApplyType) this.data).getDescription() != null) {
-					return "Apply - " + ((ApplyType) this.data).getDescription();
-				}
-				return "Apply";
-			}
-			if (this.data instanceof AttributeValueType) {
-				return "Attribute Value";
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return "Attribute Designator";
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return "Attribute Selector";
-			}
-			if (this.data instanceof VariableReferenceType) {
-				return "Variable Reference";
-			}
-			if (this.data instanceof FunctionType) {
-				return "Function";
-			}
-			if (this.data instanceof ExpressionType) {
-				return "<Argument Placeholder>";
-			}
-			return null;
-		}
-		
-		public String getId() {
-			if (this.data instanceof ApplyType) {
-				return ((ApplyType) this.data).getFunctionId();
-			}
-			if (this.data instanceof AttributeValueType) {
-				StringBuilder builder = new StringBuilder();
-				for (Object content : ((AttributeValueType) this.data).getContent()) {
-					builder.append(content);
-				}
-				return builder.toString();
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return ((AttributeDesignatorType) this.data).getAttributeId();
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return ((AttributeSelectorType) this.data).getPath();
-			}
-			if (this.data instanceof VariableReferenceType) {
-				return ((VariableReferenceType) this.data).getVariableId();
-			}
-			if (this.data instanceof FunctionType) {
-				return ((FunctionType) this.data).getFunctionId();
-			}
-			return null;
-		}
-		
-		public String getIdShort() {
-			String id = this.getId();
-			if (id == null) {
-				return id;
-			}
-			//
-			// Make it short
-			//
-			String[] parts = id.split("[:]");
-			
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-			return id;
-		}
-		
-		public String getDatatype() {
-			if (this.data instanceof ApplyType) {
-				
-				Map<String, FunctionDefinition> map = JPAUtils.getFunctionIDMap();
-				FunctionDefinition function = map.get(((ApplyType) this.data).getFunctionId());
-				if (function != null) {
-					return function.getDatatypeBean().getXacmlId();
-				}
-			}
-			if (this.data instanceof AttributeValueType) {
-				return ((AttributeValueType) this.data).getDataType();
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return ((AttributeDesignatorType) this.data).getDataType();
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return ((AttributeSelectorType) this.data).getDataType();
-			}
-
-			/*
-			if (this.data instanceof VariableReferenceType) {
-				if (this.function instanceof FunctionArgument) {
-					return ((FunctionArgument) this.function).getDatatypeBean().getXacmlId();
-				}
-			}
-			*/
-			/*
-			if (this.data instanceof FunctionType) {
-				if (this.function instanceof FunctionArgument) {
-					return ((FunctionArgument) this.function).getDatatypeBean().getXacmlId();
-				}
-			}
-			*/
-			return null;
-		}
-
-		public String getDatatypeShort() {
-			String dt = this.getDatatype();
-			if (dt == null) {
-				return dt;
-			}
-			//
-			// Get short part
-			//
-			int index = dt.lastIndexOf('#');
-			if (index == -1) {
-				String[] parts = dt.split("[:]");
-				
-				if (parts != null && parts.length > 0) {
-					return parts[parts.length - 1];
-				}
-			} else {
-				return dt.substring(index + 1);
-			}
-			return dt;
-		}
-		
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.data, id);
-		}
-		@Override
-		public Collection<?> getItemPropertyIds() {
-           return getContainerPropertyIds();
-		}
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Expression container does not support adding new properties");
-		}
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Expression container does not support removing properties");
-		}		
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java
deleted file mode 100644
index 8cecf31..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitRepositoryContainer.java
+++ /dev/null
@@ -1,1210 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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.
- *
- */
-
-/*
- * Copyright 2000-2013 Vaadin Ltd.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.Status;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.errors.NoWorkTreeException;
-
-import org.apache.openaz.xacml.util.XACMLPolicyScanner;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-import com.vaadin.server.Resource;
-import com.vaadin.ui.TextArea;
-import com.vaadin.util.FileTypeResolver;
-
-/**
- * A hierarchical container wrapper for a filesystem.
- * 
- * @author Vaadin Ltd.
- * @since 3.0
- */
-@SuppressWarnings("serial")
-public class GitRepositoryContainer extends ItemSetChangeNotifier implements Container.Hierarchical {
-	private Log logger	= LogFactory.getLog(GitRepositoryContainer.class);
-	
-    /**
-     * String identifier of a file's "name" property.
-     */
-    public static String PROPERTY_NAME = "Name";
-
-    /**
-     * String identifier of a file's "size" property.
-     */
-    public static String PROPERTY_SIZE = "Size";
-
-    /**
-     * String identifier of a file's "icon" property.
-     */
-    public static String PROPERTY_ICON = "Icon";
-
-    /**
-     * String identifier of a file's "last modified" property.
-     */
-    public static String PROPERTY_LASTMODIFIED = "Last Modified";
-
-    /**
-     * String identifier of a file's "version" property.
-     */
-    public static String PROPERTY_VERSION = "Version";
-    
-    /**
-     * String identifier of a file's "status" property.
-     */
-    public static String PROPERTY_STATUS = "Status";
-    
-    /**
-     * String identifier of a file's "data" property.
-     */
-    public static String PROPERTY_DATA = "Data";
- 
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> FILE_PROPERTIES;
-
-    private final static Method FILEITEM_LASTMODIFIED;
-
-    private final static Method FILEITEM_NAME;
-
-    private final static Method FILEITEM_ICON;
-
-    private final static Method FILEITEM_SIZE;
-    
-    private final static Method FILEITEM_VERSION;
-    
-    private final static Method FILEITEM_STATUS;
-    
-    private final static Method FILEITEM_DATA;
-
-    static {
-
-        FILE_PROPERTIES = new ArrayList<String>();
-        FILE_PROPERTIES.add(PROPERTY_NAME);
-        FILE_PROPERTIES.add(PROPERTY_ICON);
-        FILE_PROPERTIES.add(PROPERTY_SIZE);
-        FILE_PROPERTIES.add(PROPERTY_LASTMODIFIED);
-        FILE_PROPERTIES.add(PROPERTY_VERSION);
-        FILE_PROPERTIES.add(PROPERTY_STATUS);
-        FILE_PROPERTIES.add(PROPERTY_DATA);
-        FILE_PROPERTIES = Collections.unmodifiableCollection(FILE_PROPERTIES);
-        try {
-        	FILEITEM_VERSION = FileItem.class.getMethod("getVersion", new Class[]{});
-            FILEITEM_LASTMODIFIED = FileItem.class.getMethod("lastModified", new Class[] {});
-            FILEITEM_NAME = FileItem.class.getMethod("getName", new Class[] {});
-            FILEITEM_ICON = FileItem.class.getMethod("getIcon", new Class[] {});
-            FILEITEM_SIZE = FileItem.class.getMethod("getSize", new Class[] {});
-            FILEITEM_STATUS = FileItem.class.getMethod("getStatus", new Class[] {});
-            FILEITEM_DATA = FileItem.class.getMethod("getData", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in FilesystemContainer");
-        }
-    }
-
-    private File[] roots = new File[] {};
-    
-    private FilenameFilter filter = null;
-
-    private boolean recursive = true;
-    
-    private Path repository = null;
-
-    /**
-     * Constructs a new <code>FileSystemContainer</code> with the specified file
-     * as the root of the filesystem. The files are included recursively.
-     * 
-     * @param root
-     *            the root file for the new file-system container. Null values
-     *            are ignored.
-     */
-    public GitRepositoryContainer(Path repository, File root) {
-    	super();
-    	this.repository = repository;
-        if (root != null) {
-            roots = new File[] { root };
-        }
-        this.setContainer(this);
-    }
-
-    /**
-     * Constructs a new <code>FileSystemContainer</code> with the specified file
-     * as the root of the filesystem. The files are included recursively.
-     * 
-     * @param root
-     *            the root file for the new file-system container.
-     * @param recursive
-     *            should the container recursively contain subdirectories.
-     */
-    public GitRepositoryContainer(Path repository, File root, boolean recursive) {
-        this(repository, root);
-        setRecursive(recursive);
-        this.setContainer(this);
-   }
-
-    /**
-     * Constructs a new <code>FileSystemContainer</code> with the specified file
-     * as the root of the filesystem.
-     * 
-     * @param root
-     *            the root file for the new file-system container.
-     * @param extension
-     *            the Filename extension (w/o separator) to limit the files in
-     *            container.
-     * @param recursive
-     *            should the container recursively contain subdirectories.
-     */
-    public GitRepositoryContainer(Path repository, File root, String extension, boolean recursive) {
-        this(repository, root);
-        this.setFilter(extension);
-        setRecursive(recursive);
-        this.setContainer(this);
-    }
-
-    /**
-     * Constructs a new <code>FileSystemContainer</code> with the specified root
-     * and recursivity status.
-     * 
-     * @param root
-     *            the root file for the new file-system container.
-     * @param filter
-     *            the Filename filter to limit the files in container.
-     * @param recursive
-     *            should the container recursively contain subdirectories.
-     */
-    public GitRepositoryContainer(Path repository, File root, FilenameFilter filter, boolean recursive) {
-        this(repository, root);
-        this.setFilter(filter);
-        setRecursive(recursive);
-    }
-
-    /**
-     * Adds new root file directory. Adds a file to be included as root file
-     * directory in the <code>FilesystemContainer</code>.
-     * 
-     * @param root
-     *            the File to be added as root directory. Null values are
-     *            ignored.
-     */
-    public void addRoot(File root) {
-        if (root != null) {
-            final File[] newRoots = new File[roots.length + 1];
-            for (int i = 0; i < roots.length; i++) {
-                newRoots[i] = roots[i];
-            }
-            newRoots[roots.length] = root;
-            roots = newRoots;
-        }
-    }
-
-    /**
-     * Tests if the specified Item in the container may have children. Since a
-     * <code>FileSystemContainer</code> contains files and directories, this
-     * method returns <code>true</code> for directory Items only.
-     * 
-     * @param itemId
-     *            the id of the item.
-     * @return <code>true</code> if the specified Item is a directory,
-     *         <code>false</code> otherwise.
-     */
-    @Override
-    public boolean areChildrenAllowed(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("areChildrenAllowed: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-        return itemId instanceof File && ((File) itemId).canRead()
-                && ((File) itemId).isDirectory();
-    }
-
-    /*
-     * Gets the ID's of all Items who are children of the specified Item. Don't
-     * add a JavaDoc comment here, we use the default documentation from
-     * implemented interface.
-     */
-    @Override
-    public Collection<File> getChildren(Object itemId) {
-
-        if (!(itemId instanceof File)) {
-            return Collections.unmodifiableCollection(new LinkedList<File>());
-        }
-        File[] f;
-        if (filter != null) {
-            f = ((File) itemId).listFiles(filter);
-        } else {
-            f = ((File) itemId).listFiles();
-        }
-
-        if (f == null) {
-            return Collections.unmodifiableCollection(new LinkedList<File>());
-        }
-
-        final List<File> l = Arrays.asList(f);
-        Collections.sort(l);
-
-        return Collections.unmodifiableCollection(l);
-    }
-
-    /*
-     * Gets the parent item of the specified Item. Don't add a JavaDoc comment
-     * here, we use the default documentation from implemented interface.
-     */
-    @Override
-    public Object getParent(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("getParent: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-        if (!(itemId instanceof File)) {
-            return null;
-        }
-        return ((File) itemId).getParentFile();
-    }
-
-    /*
-     * Tests if the specified Item has any children. Don't add a JavaDoc comment
-     * here, we use the default documentation from implemented interface.
-     */
-    @Override
-    public boolean hasChildren(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("hasChildren: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-        if (!(itemId instanceof File)) {
-            return false;
-        }
-        String[] l;
-        if (filter != null) {
-            l = ((File) itemId).list(filter);
-        } else {
-            l = ((File) itemId).list();
-        }
-        return l != null && l.length > 0;
-    }
-
-    /*
-     * Tests if the specified Item is the root of the filesystem. Don't add a
-     * JavaDoc comment here, we use the default documentation from implemented
-     * interface.
-     */
-    @Override
-    public boolean isRoot(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("isRoot: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-        if (!(itemId instanceof File)) {
-            return false;
-        }
-        for (int i = 0; i < roots.length; i++) {
-            if (roots[i].equals(itemId)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /*
-     * Gets the ID's of all root Items in the container. Don't add a JavaDoc
-     * comment here, we use the default documentation from implemented
-     * interface.
-     */
-    @Override
-    public Collection<File> rootItemIds() {
-
-        File[] f;
-
-        // in single root case we use children
-        if (roots.length == 1) {
-            if (filter != null) {
-                f = roots[0].listFiles(filter);
-            } else {
-                f = roots[0].listFiles();
-            }
-        } else {
-            f = roots;
-        }
-
-        if (f == null) {
-            return Collections.unmodifiableCollection(new LinkedList<File>());
-        }
-
-        final List<File> l = Arrays.asList(f);
-        Collections.sort(l);
-
-        return Collections.unmodifiableCollection(l);
-    }
-
-    /**
-     * Returns <code>false</code> when conversion from files to directories is
-     * not supported.
-     * 
-     * @param itemId
-     *            the ID of the item.
-     * @param areChildrenAllowed
-     *            the boolean value specifying if the Item can have children or
-     *            not.
-     * @return <code>true</code> if the operaton is successful otherwise
-     *         <code>false</code>.
-     * @throws UnsupportedOperationException
-     *             if the setChildrenAllowed is not supported.
-     */
-    @Override
-    public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed)
-            throws UnsupportedOperationException {
-
-        throw new UnsupportedOperationException(
-                "Conversion file to/from directory is not supported");
-    }
-
-    /**
-     * Returns <code>false</code> when moving files around in the filesystem is
-     * not supported.
-     * 
-     * @param itemId
-     *            the ID of the item.
-     * @param newParentId
-     *            the ID of the Item that's to be the new parent of the Item
-     *            identified with itemId.
-     * @return <code>true</code> if the operation is successful otherwise
-     *         <code>false</code>.
-     * @throws UnsupportedOperationException
-     *             if the setParent is not supported.
-     */
-    @Override
-    public boolean setParent(Object itemId, Object newParentId)
-            throws UnsupportedOperationException {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("setParent: " + 
-    							((File)itemId).hashCode() + " " + 
-    							((File)itemId).getName() + " to: " + 
-    							((File)newParentId).hashCode() + " " + 
-    							((File)newParentId).getName());
-    	}
-    	
-    	Path path = Paths.get(((File) itemId).getAbsolutePath());
-    	Path parent = Paths.get(((File) newParentId).getAbsolutePath());
-    	boolean ok = path.getParent() == parent;
-    	
-    	if (ok) {
-    		fireItemSetChange();
-    	}
-    	return ok;
-    }
-
-    /*
-     * Tests if the filesystem contains the specified Item. Don't add a JavaDoc
-     * comment here, we use the default documentation from implemented
-     * interface.
-     */
-    @Override
-    public boolean containsId(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("containsId: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-        if (!(itemId instanceof File)) {
-            return false;
-        }
-        boolean val = false;
-
-        // Try to match all roots
-        for (int i = 0; i < roots.length; i++) {
-            try {
-                val |= ((File) itemId).getCanonicalPath().startsWith(
-                        roots[i].getCanonicalPath());
-            } catch (final IOException e) { //NOPMD
-                // Exception ignored
-            }
-
-        }
-        if (val && filter != null) {
-            val &= filter.accept(((File) itemId).getParentFile(),
-                    ((File) itemId).getName());
-        }
-        return val;
-    }
-
-    /*
-     * Gets the specified Item from the filesystem. Don't add a JavaDoc comment
-     * here, we use the default documentation from implemented interface.
-     */
-    @Override
-    public Item getItem(Object itemId) {
-
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("getItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-    	if (!(itemId instanceof File)) {
-            return null;
-        }
-        return new FileItem((File) itemId);
-    }
-    
-    public Item updateItem(Object itemId) {
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("updateItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-    	if (!(itemId instanceof File)) {
-            return null;
-        }
-    	
-    	this.fireItemSetChange();
-    	
-        return new FileItem((File) itemId);
-    }
-
-    /**
-     * Internal recursive method to add the files under the specified directory
-     * to the collection.
-     * 
-     * @param col
-     *            the collection where the found items are added
-     * @param f
-     *            the root file where to start adding files
-     */
-    private void addItemIds(Collection<File> col, File f) {
-        File[] l;
-        if (filter != null) {
-            l = f.listFiles(filter);
-        } else {
-            l = f.listFiles();
-        }
-        if (l == null) {
-            // File.listFiles returns null if File does not exist or if there
-            // was an IO error (permission denied)
-            return;
-        }
-        final List<File> ll = Arrays.asList(l);
-        Collections.sort(ll);
-
-        for (final Iterator<File> i = ll.iterator(); i.hasNext();) {
-            final File lf = i.next();
-            col.add(lf);
-            if (lf.isDirectory()) {
-                addItemIds(col, lf);
-            }
-        }
-    }
-
-    /*
-     * Gets the IDs of Items in the filesystem. Don't add a JavaDoc comment
-     * here, we use the default documentation from implemented interface.
-     */
-    @Override
-    public Collection<File> getItemIds() {
-
-        if (recursive) {
-            final Collection<File> col = new ArrayList<File>();
-            for (int i = 0; i < roots.length; i++) {
-                addItemIds(col, roots[i]);
-            }
-            return Collections.unmodifiableCollection(col);
-        } else {
-            File[] f;
-            if (roots.length == 1) {
-                if (filter != null) {
-                    f = roots[0].listFiles(filter);
-                } else {
-                    f = roots[0].listFiles();
-                }
-            } else {
-                f = roots;
-            }
-
-            if (f == null) {
-                return Collections
-                        .unmodifiableCollection(new LinkedList<File>());
-            }
-
-            final List<File> l = Arrays.asList(f);
-            Collections.sort(l);
-            return Collections.unmodifiableCollection(l);
-        }
-
-    }
-
-    /**
-     * Gets the specified property of the specified file Item. The available
-     * file properties are "Name", "Size" and "Last Modified". If propertyId is
-     * not one of those, <code>null</code> is returned.
-     * 
-     * @param itemId
-     *            the ID of the file whose property is requested.
-     * @param propertyId
-     *            the property's ID.
-     * @return the requested property's value, or <code>null</code>
-     */
-    @Override
-    public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-
-        if (!(itemId instanceof File)) {
-            return null;
-        }
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_ICON, null);
-        }
-
-        if (propertyId.equals(PROPERTY_SIZE)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_SIZE, null);
-        }
-
-        if (propertyId.equals(PROPERTY_LASTMODIFIED)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_LASTMODIFIED, null);
-        }
-        
-        if (propertyId.equals(PROPERTY_VERSION)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_VERSION, null);
-        }
-
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_STATUS, null);
-        }
-
-        if (propertyId.equals(PROPERTY_DATA)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new FileItem((File) itemId), FILEITEM_DATA, null);
-        }
-
-        return null;
-    }
-
-    /**
-     * Gets the collection of available file properties.
-     * 
-     * @return Unmodifiable collection containing all available file properties.
-     */
-    @Override
-    public Collection<String> getContainerPropertyIds() {
-        return FILE_PROPERTIES;
-    }
-
-    /**
-     * Gets the specified property's data type. "Name" is a <code>String</code>,
-     * "Size" is a <code>Long</code>, "Last Modified" is a <code>Date</code>. If
-     * propertyId is not one of those, <code>null</code> is returned.
-     * 
-     * @param propertyId
-     *            the ID of the property whose type is requested.
-     * @return data type of the requested property, or <code>null</code>
-     */
-    @Override
-    public Class<?> getType(Object propertyId) {
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return Resource.class;
-        }
-        if (propertyId.equals(PROPERTY_SIZE)) {
-            return Long.class;
-        }
-        if (propertyId.equals(PROPERTY_LASTMODIFIED)) {
-            return Date.class;
-        }
-        if (propertyId.equals(PROPERTY_VERSION)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-        	return TextArea.class;
-        }
-        if (propertyId.equals(PROPERTY_DATA)) {
-        	return Object.class;
-        }
-        return null;
-    }
-
-    /**
-     * Internal method to recursively calculate the number of files under a root
-     * directory.
-     * 
-     * @param f
-     *            the root to start counting from.
-     */
-    private int getFileCounts(File f) {
-        File[] l;
-        if (filter != null) {
-            l = f.listFiles(filter);
-        } else {
-            l = f.listFiles();
-        }
-
-        if (l == null) {
-            return 0;
-        }
-        int ret = l.length;
-        for (int i = 0; i < l.length; i++) {
-            if (l[i].isDirectory()) {
-                ret += getFileCounts(l[i]);
-            }
-        }
-        return ret;
-    }
-
-    /**
-     * Gets the number of Items in the container. In effect, this is the
-     * combined amount of files and directories.
-     * 
-     * @return Number of Items in the container.
-     */
-    @Override
-    public int size() {
-
-        if (recursive) {
-            int counts = 0;
-            for (int i = 0; i < roots.length; i++) {
-                counts += getFileCounts(roots[i]);
-            }
-            return counts;
-        } else {
-            File[] f;
-            if (roots.length == 1) {
-                if (filter != null) {
-                    f = roots[0].listFiles(filter);
-                } else {
-                    f = roots[0].listFiles();
-                }
-            } else {
-                f = roots;
-            }
-
-            if (f == null) {
-                return 0;
-            }
-            return f.length;
-        }
-    }
-    
-
-    /**
-     * A Item wrapper for files in a filesystem.
-     * 
-     * @author Vaadin Ltd.
-     * @since 3.0
-     */
-    public class FileItem implements Item {
-
-        /**
-         * The wrapped file.
-         */
-        private final File file;
-        
-        private Object data = null;
-
-        /**
-         * Constructs a FileItem from a existing file.
-         */
-        private FileItem(File file) {
-        	if (logger.isTraceEnabled()) {
-        		logger.trace("FileItem constructor: " + file.hashCode() + " " + file.getName());
-        	}
-            this.file = file;
-        }
-
-        /*
-         * Gets the specified property of this file. Don't add a JavaDoc comment
-         * here, we use the default documentation from implemented interface.
-         */
-        @Override
-        public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(file, id);
-        }
-
-        /*
-         * Gets the IDs of all properties available for this item Don't add a
-         * JavaDoc comment here, we use the default documentation from
-         * implemented interface.
-         */
-        @Override
-        public Collection<String> getItemPropertyIds() {
-            return getContainerPropertyIds();
-        }
-
-        /**
-         * Calculates a integer hash-code for the Property that's unique inside
-         * the Item containing the Property. Two different Properties inside the
-         * same Item contained in the same list always have different
-         * hash-codes, though Properties in different Items may have identical
-         * hash-codes.
-         * 
-         * @return A locally unique hash-code as integer
-         */
-        @Override
-        public int hashCode() {
-            return file.hashCode() ^ GitRepositoryContainer.this.hashCode();
-        }
-
-        /**
-         * Tests if the given object is the same as the this object. Two
-         * Properties got from an Item with the same ID are equal.
-         * 
-         * @param obj
-         *            an object to compare with this object.
-         * @return <code>true</code> if the given object is the same as this
-         *         object, <code>false</code> if not
-         */
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == null || !(obj instanceof FileItem)) {
-                return false;
-            }
-            final FileItem fi = (FileItem) obj;
-            return fi.getHost() == getHost() && fi.file.equals(file);
-        }
-
-        /**
-         * Gets the host of this file.
-         */
-        private GitRepositoryContainer getHost() {
-            return GitRepositoryContainer.this;
-        }
-        
-        /**
-         * Gets the file's version
-         * 
-         * @return Integer
-         */
-        
-        public String getVersion() {
-        	/*
-        	 * If its a directory, there is no version
-        	 */
-        	if (this.file.isDirectory()) {
-        		return null;
-        	}
-        	try {
-				return XACMLPolicyScanner.getVersion(Paths.get(this.file.getAbsolutePath()));
-			} catch (IOException e) {
-				logger.error("Could not get version: " + e);
-				return "n/a";
-			}
-        }
-
-        /**
-         * Gets the last modified date of this file.
-         * 
-         * @return Date
-         */
-        public Date lastModified() {
-            return new Date(file.lastModified());
-        }
-
-        /**
-         * Gets the name of this file.
-         * 
-         * @return file name of this file.
-         */
-        public String getName() {
-            return file.getName();
-        }
-        
-        public File getFile() {
-        	return file;
-        }
-
-        /**
-         * Gets the icon of this file.
-         * 
-         * @return the icon of this file.
-         */
-        public Resource getIcon() {
-            return FileTypeResolver.getIcon(file);
-        }
-
-        /**
-         * Gets the size of this file.
-         * 
-         * @return size
-         */
-        public Long getSize() {
-            if (file.isDirectory()) {
-                return null;
-            }
-            return file.length();
-        }
-
-        /**
-         * Gets the status of this file.
-         * 
-         * @return status of this file.
-         */
-        public TextArea getStatus() {
-        	TextArea area = null;
-        	try {
-        		Path repoPath = this.getHost().repository;
-				Git git = Git.open(repoPath.toFile());
-				
-				//
-				// I would like to use absolutePath, but that seems to barf when
-				// we try to relativize this if a full path is not given.
-				//
-				Path relativePath = repoPath.relativize(Paths.get(this.file.getPath()));
-				
-				Status status = git.status().addPath(relativePath.toString()).call();
-				if (logger.isDebugEnabled()) {
-					logger.debug(this.file.getAbsolutePath());
-					logger.debug("Added: " + status.getAdded());
-					logger.debug("Changed: " + status.getChanged());
-					logger.debug("Conflicting: " + status.getConflicting());
-					logger.debug("Missing: " + status.getMissing());
-					logger.debug("Modified: " + status.getModified());
-					logger.debug("Removed: " + status.getRemoved());
-					logger.debug("Uncommitted: " + status.getUncommittedChanges());
-					logger.debug("Untracked: " + status.getUntracked());
-					logger.debug("Untracked folders; " + status.getUntrackedFolders());
-				}
-				//
-				// Are we a file or directory?
-				//
-				StringBuffer buffer = new StringBuffer();
-				int length = 0;
-				if (this.file.isFile()) {
-					if (status.getAdded().contains(relativePath.toString())) {
-						buffer.append("Added" + "\n");
-						length++;
-					}
-					if (status.getChanged().contains(relativePath.toString())) {
-						buffer.append("Changed" + "\n");
-						length++;
-					}
-					if (status.getConflicting().contains(relativePath.toString())) {
-						buffer.append("Conflicting" + "\n");
-						length++;
-					}
-					if (status.getMissing().contains(relativePath.toString())) {
-						buffer.append("Missing" + "\n");
-						length++;
-					}
-					if (status.getModified().contains(relativePath.toString())) {
-						buffer.append("Modified" + "\n");
-						length++;
-					}
-					if (status.getRemoved().contains(relativePath.toString())) {
-						buffer.append("Removed" + "\n");
-						length++;
-					}
-					if (status.getUncommittedChanges().contains(relativePath.toString())) {
-						buffer.append("Uncommitted" + "\n");
-						length++;
-					}
-					if (status.getUntracked().contains(relativePath.toString())) {
-						buffer.append("Untracked (New)" + "\n");
-						length++;
-					}
-					if (status.getUntrackedFolders().contains(relativePath.toString())) {
-						buffer.append("Untracked Folders (New)" + "\n");
-						length++;
-					}
-				} else if (this.file.isDirectory()) {
-					if (status.getUntracked().size() > 0) {
-						buffer.append("Untracked (New)" + "\n");
-						length++;
-					}
-					if (status.getUntrackedFolders().size() > 0) {
-						buffer.append("Untracked Folders (New)" + "\n");
-						length++;
-					}
-				}
-				if (length > 0) {
-					area = new TextArea();
-					area.setValue(buffer.toString().trim());
-					area.setWidth("100.0%");
-					area.setRows(length);
-					area.setReadOnly(true);
-				}
-			} catch (IOException | NoWorkTreeException | GitAPIException e) {
-				logger.error(e);
-			}
-            return area;
-        }
-
-        /**
-         * Gets the file's data
-         * 
-         * @return file data
-         */
-        public Object getData() {
-        	return this.data;
-        }
-        /**
-         * @see java.lang.Object#toString()
-         */
-        @Override
-        public String toString() {
-//            if ("".equals(file.getName())) {
- //               return file.getAbsolutePath();
-  //          }
-            return file.getName();
-        }
-
-        /**
-         * Filesystem container does not support adding new properties.
-         * 
-         * @see com.vaadin.data.Item#addItemProperty(Object, Property)
-         */
-        @Override
-        public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Filesystem container does not support adding new properties");
-        }
-
-        /**
-         * Filesystem container does not support removing properties.
-         * 
-         * @see com.vaadin.data.Item#removeItemProperty(Object)
-         */
-        @Override
-        public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Filesystem container does not support property removal");
-        }
-    }
-
-    /**
-     * Generic file extension filter for displaying only files having certain
-     * extension.
-     * 
-     * @author Vaadin Ltd.
-     * @since 3.0
-     */
-    public class FileExtensionFilter implements FilenameFilter, Serializable {
-
-        private final String filter;
-
-        /**
-         * Constructs a new FileExtensionFilter using given extension.
-         * 
-         * @param fileExtension
-         *            the File extension without the separator (dot).
-         */
-        public FileExtensionFilter(String fileExtension) {
-            filter = "." + fileExtension;
-        }
-
-        /**
-         * Allows only files with the extension and directories.
-         * 
-         * @see java.io.FilenameFilter#accept(File, String)
-         */
-        @Override
-        public boolean accept(File dir, String name) {
-            if (name.endsWith(filter)) {
-                return true;
-            }
-            return new File(dir, name).isDirectory();
-        }
-
-    }
-
-    /**
-     * Returns the file filter used to limit the files in this container.
-     * 
-     * @return Used filter instance or null if no filter is assigned.
-     */
-    public FilenameFilter getFilter() {
-        return filter;
-    }
-
-    /**
-     * Sets the file filter used to limit the files in this container.
-     * 
-     * @param filter
-     *            The filter to set. <code>null</code> disables filtering.
-     */
-    public void setFilter(FilenameFilter filter) {
-        this.filter = filter;
-    }
-
-    /**
-     * Sets the file filter used to limit the files in this container.
-     * 
-     * @param extension
-     *            the Filename extension (w/o separator) to limit the files in
-     *            container.
-     */
-    public void setFilter(String extension) {
-        filter = new FileExtensionFilter(extension);
-    }
-
-    /**
-     * Is this container recursive filesystem.
-     * 
-     * @return <code>true</code> if container is recursive, <code>false</code>
-     *         otherwise.
-     */
-    public boolean isRecursive() {
-        return recursive;
-    }
-
-    /**
-     * Sets the container recursive property. Set this to false to limit the
-     * files directly under the root file.
-     * <p>
-     * Note : This is meaningful only if the root really is a directory.
-     * </p>
-     * 
-     * @param recursive
-     *            the New value for recursive property.
-     */
-    public void setRecursive(boolean recursive) {
-        this.recursive = recursive;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#addContainerProperty(java.lang.Object,
-     * java.lang.Class, java.lang.Object)
-     */
-    @Override
-    public boolean addContainerProperty(Object propertyId, Class<?> type,
-            Object defaultValue) throws UnsupportedOperationException {
-        throw new UnsupportedOperationException(
-                "File system container does not support this operation");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#addItem()
-     */
-    @Override
-    public Object addItem() throws UnsupportedOperationException {
-        throw new UnsupportedOperationException(
-                "Git repository container does not support this operation");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#addItem(java.lang.Object)
-     */
-    @Override
-    public Item addItem(Object itemId) throws UnsupportedOperationException {
-    	if (! (itemId instanceof File)) {
-            throw new UnsupportedOperationException(
-                    "Git repository container does not support this operation for Objects that are not files.");
-    	}
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("addItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-    	fireItemSetChange();
-  	
-        return new FileItem((File) itemId);
-    }
-    
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#removeAllItems()
-     */
-    @Override
-    public boolean removeAllItems() throws UnsupportedOperationException {
-        throw new UnsupportedOperationException(
-                "File system container does not support this operation");
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#removeItem(java.lang.Object)
-     */
-    @Override
-    public boolean removeItem(Object itemId)
-            throws UnsupportedOperationException {
-    	
-    	if (logger.isTraceEnabled()) {
-    		logger.trace("removeItem: " + ((File)itemId).hashCode() + " " + ((File)itemId).getName());
-    	}
-
-    	fireItemSetChange();
-    	return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.vaadin.data.Container#removeContainerProperty(java.lang.Object )
-     */
-    @Override
-    public boolean removeContainerProperty(Object propertyId)
-            throws UnsupportedOperationException {
-        throw new UnsupportedOperationException(
-                "File system container does not support this operation");
-    }
-
-	public Object getRoot(int index) {
-		if (index >= this.roots.length) {
-			return null;
-		}
-		return this.roots[index];
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java
deleted file mode 100644
index fbc5ea2..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/GitStatusContainer.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.jgit.api.Status;
-import org.eclipse.jgit.lib.IndexDiff;
-
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class GitStatusContainer extends ItemSetChangeNotifier implements Container.Ordered, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private Log logger	= LogFactory.getLog(GitStatusContainer.class);
-
-	/**
-     * String identifier of a git file/directory's "name" property.
-     */
-    public static String PROPERTY_NAME = "Name";
-
-	/**
-     * String identifier of a git file/directory's "status" property.
-     */
-    public static String PROPERTY_STATUS = "Status";
-
-	/**
-     * String identifier of a git file/directory's "entry" property.
-     */
-    public static String PROPERTY_ENTRY = "Entry";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> GITSTATUS_PROPERTIES;
-    
-    private final static Method GITSTATUSITEM_NAME;
-    
-    private final static Method GITSTATUSITEM_STATUS;
-    
-    private final static Method GITSTATUSITEM_ENTRY;
-    
-    static {
-    	GITSTATUS_PROPERTIES = new ArrayList<String>();
-    	GITSTATUS_PROPERTIES.add(PROPERTY_NAME);
-    	GITSTATUS_PROPERTIES.add(PROPERTY_STATUS);
-    	GITSTATUS_PROPERTIES.add(PROPERTY_ENTRY);
-    	GITSTATUS_PROPERTIES = Collections.unmodifiableCollection(GITSTATUS_PROPERTIES);
-    	try {
-    		GITSTATUSITEM_NAME = StatusItem.class.getMethod("getName", new Class[]{});
-    		GITSTATUSITEM_STATUS = StatusItem.class.getMethod("getStatus", new Class[]{});
-    		GITSTATUSITEM_ENTRY = StatusItem.class.getMethod("getGitEntry", new Class[]{});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException("Internal error finding methods in GitStatusContainer");
-        }
-    }
-    
-    public class GitEntry {
-    	String	name;
-    	boolean added = false;
-    	boolean changed = false;
-    	boolean conflicting = false;
-    	boolean ignoredNotInIndex = false;
-    	boolean missing = false;
-    	boolean modified = false;
-    	boolean removed = false;
-    	boolean uncommitted = false;
-    	boolean untracked = false;
-    	boolean untrackedFolders = false;
-    	
-    	public GitEntry(String name) {
-    		this.name = name;
-    	}
-
-		public String getName() {
-			return name;
-		}
-
-		public void setName(String name) {
-			this.name = name;
-		}
-
-		public boolean isAdded() {
-			return added;
-		}
-
-		public void setAdded(boolean added) {
-			this.added = added;
-		}
-
-		public boolean isChanged() {
-			return changed;
-		}
-
-		public void setChanged(boolean changed) {
-			this.changed = changed;
-		}
-
-		public boolean isConflicting() {
-			return conflicting;
-		}
-
-		public void setConflicting(boolean conflicting) {
-			this.conflicting = conflicting;
-		}
-
-		public boolean isIgnoredNotInIndex() {
-			return ignoredNotInIndex;
-		}
-
-		public void setIgnoredNotInIndex(boolean ignoredNotInIndex) {
-			this.ignoredNotInIndex = ignoredNotInIndex;
-		}
-
-		public boolean isMissing() {
-			return missing;
-		}
-
-		public void setMissing(boolean missing) {
-			this.missing = missing;
-		}
-
-		public boolean isModified() {
-			return modified;
-		}
-
-		public void setModified(boolean modified) {
-			this.modified = modified;
-		}
-
-		public boolean isRemoved() {
-			return removed;
-		}
-
-		public void setRemoved(boolean removed) {
-			this.removed = removed;
-		}
-
-		public boolean isUncommitted() {
-			return uncommitted;
-		}
-
-		public void setUncommitted(boolean uncommitted) {
-			this.uncommitted = uncommitted;
-		}
-
-		public boolean isUntracked() {
-			return untracked;
-		}
-
-		public void setUntracked(boolean untracked) {
-			this.untracked = untracked;
-		}
-
-		public boolean isUntrackedFolders() {
-			return untrackedFolders;
-		}
-
-		public void setUntrackedFolders(boolean untrackedFolders) {
-			this.untrackedFolders = untrackedFolders;
-		}
-
-		public String getStatus() {
-			StringBuilder builder = new StringBuilder();
-			if (this.isAdded()) {
-				builder.append("Added" + System.lineSeparator());
-			}
-			if (this.isChanged()) {
-				builder.append("Changed" + System.lineSeparator());
-			}
-			if (this.isConflicting()) {
-				builder.append("Conflicting" + System.lineSeparator());
-			}
-			if (this.isMissing()) {
-				builder.append("Missing" + System.lineSeparator());
-			}
-			if (this.isModified()) {
-				builder.append("Modified" + System.lineSeparator());
-			}
-			if (this.isRemoved()) {
-				builder.append("Removed" + System.lineSeparator());
-			}
-			if (this.isUncommitted()) {
-				builder.append("Uncommitted" + System.lineSeparator());
-			}
-			if (this.isUntracked()) {
-				builder.append("Untracked" + System.lineSeparator());
-			}
-			if (this.isUntrackedFolders()) {
-				builder.append("Untracked Folders" + System.lineSeparator());
-			}
-			return builder.toString();
-		}
-
-		@Override
-		public String toString() {
-			return "GitEntry [name=" + name + ", added=" + added + ", changed="
-					+ changed + ", conflicting=" + conflicting
-					+ ", ignoredNotInIndex=" + ignoredNotInIndex + ", missing="
-					+ missing + ", modified=" + modified + ", removed="
-					+ removed + ", uncommitted=" + uncommitted + ", untracked="
-					+ untracked + ", untrackedFolders=" + untrackedFolders
-					+ "]";
-		}
-    }
-    
-    //
-    // This is our data, a sorted map
-    //
-    private TreeMap<String, GitEntry> map = null;
-    private Map<String, IndexDiff.StageState> conflictingStage = null;
-    int conflictCount = 0;
-    
-	public GitStatusContainer(Status status) {
-		super();
-		this.setContainer(this);
-		//
-		// Initialize
-		//
-		this.refreshStatus(status);
-	}
-	
-	public void refreshStatus(Status status) {
-		//
-		// Save this
-		//
-		this.conflictingStage = status.getConflictingStageState();
-		if (logger.isDebugEnabled()) {
-			logger.debug("conflictingStage: " + this.conflictingStage.size());
-		}
-		//
-		// Re-create this
-		//
-		this.map = new TreeMap<String, GitEntry>();
-		this.conflictCount = 0;
-		//
-		// Iterate through everything
-		//
-		for (String id : status.getAdded()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setAdded(true);
-		}
-		for (String id : status.getChanged()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setChanged(true);
-		}
-		for (String id : status.getConflicting()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setConflicting(true);
-			//
-			//
-			//
-			conflictCount++;
-		}
-		for (String id : status.getMissing()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setMissing(true);
-		}
-		for (String id : status.getModified()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setModified(true);
-		}
-		for (String id : status.getRemoved()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setRemoved(true);
-		}
-		for (String id : status.getUncommittedChanges()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setUncommitted(true);
-		}
-		for (String id : status.getUntracked()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setUntracked(true);
-		}
-		for (String id : status.getUntrackedFolders()) {
-			if (id.endsWith(".gitignore") || id.endsWith(".DS_Store")) {
-				continue;
-			}
-			GitEntry entry = this.map.get(id);
-			if (entry == null) {
-				entry = new GitEntry(id);
-				this.map.put(id, entry);
-			}
-			entry.setUntrackedFolders(true);
-		}
-	}
-	
-	public Map<String, IndexDiff.StageState> getConflictingStageState() {
-		return this.conflictingStage;
-	}
-	
-	public int	getConflictCount() {
-		return this.conflictCount;
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		return new StatusItem(map.get(itemId));
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return GITSTATUS_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<String> items = new ArrayList<String>();
-		items.addAll(this.map.keySet());
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Property<Object> getContainerProperty(Object itemId, Object propertyId) {
-		GitEntry entry = this.map.get(itemId);
-		if (entry == null) {
-//			logger.error("unknown itemId: " + itemId);
-			return null;
-		}
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new StatusItem(entry), GITSTATUSITEM_NAME, null);
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new StatusItem(entry), GITSTATUSITEM_STATUS, null);
-        }
-        if (propertyId.equals(PROPERTY_ENTRY)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new StatusItem(entry), GITSTATUSITEM_ENTRY, null);
-        }
-		return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-        if (propertyId.equals(PROPERTY_NAME)) {
-        	return String.class;
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-        	return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ENTRY)) {
-        	return GitEntry.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return this.map.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		return this.map.containsKey(itemId);
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't add items.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't add items.");
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't remove items.");
-	}
-
-	@Override
-	public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't add properties.");
-	}
-
-	@Override
-	public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't remove properties.");
-	}
-
-	@Override
-	public boolean removeAllItems() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't remove items.");
-	}
-
-	@Override
-	public Object nextItemId(Object itemId) {
-		return this.map.higherKey((String) itemId);
-	}
-
-	@Override
-	public Object prevItemId(Object itemId) {
-		return this.map.lowerKey((String) itemId);
-	}
-
-	@Override
-	public Object firstItemId() {
-		return this.map.firstKey();
-	}
-
-	@Override
-	public Object lastItemId() {
-		return this.map.lastKey();
-	}
-
-	@Override
-	public boolean isFirstId(Object itemId) {
-		return itemId.equals(this.map.firstKey());
-	}
-
-	@Override
-	public boolean isLastId(Object itemId) {
-		return itemId.equals(this.map.lastKey());
-	}
-
-	@Override
-	public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't add items.");
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Can't add items.");
-	}
-
-	public class StatusItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final GitEntry entry;
-		
-		public StatusItem(GitEntry itemId) {
-			this.entry = itemId;
-		}
-
-		public String getName() {
-			return this.entry.getName();
-		}
-		
-		public String getStatus() {
-			return this.entry.getStatus();
-		}
-
-		public GitEntry getGitEntry() {
-			return this.entry;
-		}
-
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.entry, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-			return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Container does not support adding new properties");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Container does not support removing properties");
-		}
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java
deleted file mode 100644
index 7ad49ca..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ItemSetChangeNotifier.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.EventObject;
-import java.util.LinkedList;
-
-import com.vaadin.data.Container;
-import com.vaadin.data.Container.ItemSetChangeEvent;
-import com.vaadin.data.Container.ItemSetChangeListener;
-
-public class ItemSetChangeNotifier implements Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-    private Collection<Container.ItemSetChangeListener> itemSetChangeListeners = null;
-    private Container container = null;
-    
-    public ItemSetChangeNotifier() {
-    }
-    
-    protected void setContainer(Container c) {
-    	this.container = c;
-    }
-
-	@Override
-	public void addItemSetChangeListener(ItemSetChangeListener listener) {
-        if (getItemSetChangeListeners() == null) {
-            setItemSetChangeListeners(new LinkedList<Container.ItemSetChangeListener>());
-        }
-        getItemSetChangeListeners().add(listener);	}
-
-	// TODO - Container.ItemSetChangeNotifier.addListener has been deprecated and replaced with
-	// Container.ItemSetChangeNotifier.addItemSetChangeListener
-	@Override
-	public void addListener(ItemSetChangeListener listener) {
-        addItemSetChangeListener(listener);
-	}
-
-	@Override
-	public void removeItemSetChangeListener(ItemSetChangeListener listener) {
-        if (getItemSetChangeListeners() != null) {
-            getItemSetChangeListeners().remove(listener);
-        }
-    }
-
-	// TODO - Container.ItemSetChangeNotifier.removeListener has been deprecated and replaced with
-	// Container.ItemSetChangeNotifier.removeItemSetChangeListener
-	@Override
-	public void removeListener(ItemSetChangeListener listener) {
-        removeItemSetChangeListener(listener);
-	}
-	
-	protected static class BaseItemSetChangeEvent extends EventObject implements
-	    Container.ItemSetChangeEvent, Serializable {
-		private static final long serialVersionUID = 1L;
-
-		protected BaseItemSetChangeEvent(Container source) {
-		    super(source);
-		}
-		
-		@Override
-		public Container getContainer() {
-		    return (Container) getSource();
-		}
-	}
-
-    protected void setItemSetChangeListeners(
-            Collection<Container.ItemSetChangeListener> itemSetChangeListeners) {
-        this.itemSetChangeListeners = itemSetChangeListeners;
-    }
-    protected Collection<Container.ItemSetChangeListener> getItemSetChangeListeners() {
-        return itemSetChangeListeners;
-    }
-   /**
-     * Sends a simple Item set change event to all interested listeners,
-     * indicating that anything in the contents may have changed (items added,
-     * removed etc.).
-     */
-    protected void fireItemSetChange() {
-        fireItemSetChange(new BaseItemSetChangeEvent(this.container));
-    }
-
-    /**
-     * Sends an Item set change event to all registered interested listeners.
-     * 
-     * @param event
-     *            the item set change event to send, optionally with additional
-     *            information
-     */
-    protected void fireItemSetChange(ItemSetChangeEvent event) {
-        if (getItemSetChangeListeners() != null) {
-            final Object[] l = getItemSetChangeListeners().toArray();
-            for (int i = 0; i < l.length; i++) {
-                ((Container.ItemSetChangeListener) l[i])
-                        .containerItemSetChange(event);
-            }
-        }
-    }
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java
deleted file mode 100644
index a187ef7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/MatchFunctionQueryDelegate.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.List;
-
-import com.vaadin.data.Container.Filter;
-import com.vaadin.data.util.sqlcontainer.RowItem;
-import com.vaadin.data.util.sqlcontainer.SQLUtil;
-import com.vaadin.data.util.sqlcontainer.query.FreeformStatementDelegate;
-import com.vaadin.data.util.sqlcontainer.query.OrderBy;
-import com.vaadin.data.util.sqlcontainer.query.generator.StatementHelper;
-import com.vaadin.data.util.sqlcontainer.query.generator.filter.QueryBuilder;
-
-public class MatchFunctionQueryDelegate implements FreeformStatementDelegate {
-	private static final long serialVersionUID = 1L;
-    private List<Filter> filters = null;
-    private List<OrderBy> orderBys = null;
-
-	public MatchFunctionQueryDelegate() {
-	}
-
-	@Override
-	public String getQueryString(int offset, int limit)
-			throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("use getQueryStatement");
-	}
-
-	@Override
-	public String getCountQuery() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("getCountStatement");
-	}
-
-	@Override
-	public void setFilters(List<Filter> filters)
-			throws UnsupportedOperationException {
-		this.filters = filters;
-	}
-
-	@Override
-	public void setOrderBy(List<OrderBy> orderBys)
-			throws UnsupportedOperationException {
-		this.orderBys = orderBys;
-	}
-
-	@Override
-	public int storeRow(Connection conn, RowItem row)
-			throws UnsupportedOperationException, SQLException {
-		throw new UnsupportedOperationException("Cannot store anything");
-	}
-
-	@Override
-	public boolean removeRow(Connection conn, RowItem row)
-			throws UnsupportedOperationException, SQLException {
-		throw new UnsupportedOperationException("Cannot remove anything");
-	}
-
-	@Override
-	public String getContainsRowQueryString(Object... keys)
-			throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("use getContainsRowQueryStatement");
-	}
-
-	@Override
-	public StatementHelper getQueryStatement(int offset, int limit)
-			throws UnsupportedOperationException {
-		StatementHelper sh = new StatementHelper();
-		StringBuffer query = new StringBuffer("SELECT * FROM match_functions ");
-		if (this.filters != null && this.filters.isEmpty() == false) {
-			query.append(QueryBuilder.getWhereStringForFilters(this.filters, sh));
-		}
-		query.append(getOrderByString());
-		if (offset != 0 || limit != 0) {
-			query.append(" LIMIT ").append(limit);
-			query.append(" OFFSET ").append(offset);
-		}
-		sh.setQueryString(query.toString());
-		return sh;
-	}
-
-	@Override
-	public StatementHelper getCountStatement()
-			throws UnsupportedOperationException {
-		StatementHelper sh = new StatementHelper();
-		StringBuffer query = new StringBuffer("SELECT COUNT(*) FROM match_functions ");
-		if (this.filters != null && this.filters.isEmpty() == false) {
-			query.append(QueryBuilder.getWhereStringForFilters(this.filters, sh));
-		}
-		query.append(getOrderByString());
-		sh.setQueryString(query.toString());
-		return sh;
-	}
-
-	@Override
-	public StatementHelper getContainsRowQueryStatement(Object... keys)
-			throws UnsupportedOperationException {
-        StatementHelper sh = new StatementHelper();
-        StringBuffer query = new StringBuffer("SELECT * FROM match_functions WHERE ARGUMENT_ID = ?");
-        sh.addParameterValue(keys[0]);
-        sh.setQueryString(query.toString());
-        return sh;
-	}
-
-    private String getOrderByString() {
-        StringBuffer orderBuffer = new StringBuffer("");
-        if (this.orderBys != null && !this.orderBys.isEmpty()) {
-            orderBuffer.append(" ORDER BY ");
-            OrderBy lastOrderBy = this.orderBys.get(this.orderBys.size() - 1);
-            for (OrderBy orderBy : this.orderBys) {
-                orderBuffer.append(SQLUtil.escapeSQL(orderBy.getColumn()));
-                if (orderBy.isAscending()) {
-                    orderBuffer.append(" ASC");
-                } else {
-                    orderBuffer.append(" DESC");
-                }
-                if (orderBy != lastOrderBy) {
-                    orderBuffer.append(", ");
-                }
-            }
-        }
-        return orderBuffer.toString();
-    }
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java
deleted file mode 100644
index 65f8a3c..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/ObligationAdviceContainer.java
+++ /dev/null
@@ -1,1385 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBElement;
-
-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.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.AttributeSelectorType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
-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 org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class ObligationAdviceContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(ObligationAdviceContainer.class);
-	
-    public static String PROPERTY_NAME = "Name";
-    public static String PROPERTY_ID = "Id";
-    public static String PROPERTY_ID_SHORT = "ShortId";
-    public static String PROPERTY_EFFECT = "Effect";
-    public static String PROPERTY_CATEGORY = "Category";
-    public static String PROPERTY_CATEGORY_SHORT = "ShortCategory";
-    public static String PROPERTY_DATATYPE = "Datatype";
-    public static String PROPERTY_DATATYPE_SHORT = "ShortDatatype";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> OBADVICE_PROPERTIES;
-
-    private final static Method OBADVICE_ITEM_NAME;
-    
-    private final static Method OBADVICE_ITEM_ID;
-
-    private final static Method OBADVICE_ITEM_ID_SHORT;
-
-    private final static Method OBADVICE_ITEM_EFFECT;
-
-    private final static Method OBADVICE_ITEM_DATATYPE;
-
-    private final static Method OBADVICE_ITEM_DATATYPE_SHORT;
-
-    private final static Method OBADVICE_ITEM_CATEGORY;
-
-    private final static Method OBADVICE_ITEM_CATEGORY_SHORT;
-
-    static {
-    	OBADVICE_PROPERTIES = new ArrayList<String>();
-    	OBADVICE_PROPERTIES.add(PROPERTY_NAME);
-    	OBADVICE_PROPERTIES.add(PROPERTY_ID);
-    	OBADVICE_PROPERTIES.add(PROPERTY_ID_SHORT);
-    	OBADVICE_PROPERTIES.add(PROPERTY_EFFECT);
-    	OBADVICE_PROPERTIES.add(PROPERTY_CATEGORY);
-    	OBADVICE_PROPERTIES.add(PROPERTY_DATATYPE_SHORT);
-    	OBADVICE_PROPERTIES.add(PROPERTY_DATATYPE);
-    	OBADVICE_PROPERTIES.add(PROPERTY_CATEGORY_SHORT);
-    	OBADVICE_PROPERTIES = Collections.unmodifiableCollection(OBADVICE_PROPERTIES);
-    	try {
-    		OBADVICE_ITEM_NAME = ObAdviceItem.class.getMethod("getName", new Class[]{});
-    		OBADVICE_ITEM_ID = ObAdviceItem.class.getMethod("getId", new Class[]{});
-    		OBADVICE_ITEM_ID_SHORT = ObAdviceItem.class.getMethod("getIdShort", new Class[]{});
-    		OBADVICE_ITEM_EFFECT = ObAdviceItem.class.getMethod("getEffect", new Class[]{});
-    		OBADVICE_ITEM_DATATYPE = ObAdviceItem.class.getMethod("getDatatype", new Class[]{});
-    		OBADVICE_ITEM_DATATYPE_SHORT = ObAdviceItem.class.getMethod("getDatatypeShort", new Class[]{});
-    		OBADVICE_ITEM_CATEGORY = ObAdviceItem.class.getMethod("getCategory", new Class[]{});
-    		OBADVICE_ITEM_CATEGORY_SHORT = ObAdviceItem.class.getMethod("getCategoryShort", new Class[]{});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in ObligationAdviceContainer");
-        }
-    }
-    //
-    // Our root object
-    //
-    private final Object root;
-    //
-    // Our helper maps to control the hierarchy
-    //
-    private List<AdviceExpressionType> rootAdvice = new ArrayList<AdviceExpressionType>();
-    private List<ObligationExpressionType> rootObligations = new ArrayList<ObligationExpressionType>();
-    private Map<AttributeAssignmentExpressionType, AdviceExpressionType> adviceExpressions = new HashMap<AttributeAssignmentExpressionType, AdviceExpressionType>();
-    private Map<AttributeAssignmentExpressionType, ObligationExpressionType> obligationExpressions = new HashMap<AttributeAssignmentExpressionType, ObligationExpressionType>();
-    private Map<AttributeValueType, AttributeAssignmentExpressionType> values = new HashMap<AttributeValueType, AttributeAssignmentExpressionType>();
-    private Map<AttributeDesignatorType, AttributeAssignmentExpressionType> designators = new HashMap<AttributeDesignatorType, AttributeAssignmentExpressionType>();
-    private Map<AttributeSelectorType, AttributeAssignmentExpressionType> selectors = new HashMap<AttributeSelectorType, AttributeAssignmentExpressionType>();
-    private Map<ApplyType, AttributeAssignmentExpressionType> applys = new HashMap<ApplyType, AttributeAssignmentExpressionType>();
-    
-	public ObligationAdviceContainer(Object root) {
-		super();
-		this.setContainer(this);
-		//
-		// Save
-		//
-		this.root = root;
-		//
-		// Initialize
-		//
-		this.initialize();
-	}
-	
-	protected void initialize() {
-		if (this.root instanceof AdviceExpressionsType) {
-			for (AdviceExpressionType advice : ((AdviceExpressionsType) this.root).getAdviceExpression()) {
-				this.rootAdvice.add(advice);
-				for (AttributeAssignmentExpressionType assignment : advice.getAttributeAssignmentExpression()) {
-					this.adviceExpressions.put(assignment, advice);
-					this.addExpression(assignment.getExpression(), assignment);
-				}
-			}
-		} else if (this.root instanceof ObligationExpressionsType) {
-			for (ObligationExpressionType obligation : ((ObligationExpressionsType) this.root).getObligationExpression()) {
-				this.rootObligations.add(obligation);
-				for (AttributeAssignmentExpressionType assignment : obligation.getAttributeAssignmentExpression()) {
-					this.obligationExpressions.put(assignment, obligation);
-					this.addExpression(assignment.getExpression(), assignment);
-				}
-			}
-		} else {
-			throw new IllegalArgumentException("This container supports only advice or obligation expressions.");
-		}
-	}
-	
-	private void addExpression(JAXBElement<?> element, AttributeAssignmentExpressionType parent) {
-		if (element.getValue() == null) {
-			return;
-		}
-		if (element.getValue() instanceof AttributeValueType) {
-			this.values.put((AttributeValueType) element.getValue(), parent);
-		} else if (element.getValue() instanceof AttributeDesignatorType) {
-			this.designators.put((AttributeDesignatorType) element.getValue(), parent);
-		} else if (element.getValue() instanceof AttributeSelectorType) {
-			this.selectors.put((AttributeSelectorType) element.getValue(), parent);
-		} else if (element.getValue() instanceof ApplyType) {
-			this.applys.put((ApplyType) element.getValue(), parent);
-		} else {
-			//
-			// TODO
-			//
-			logger.error("Adding unknown expression type");
-		}
-	}
-
-	public boolean isObjectSupported(Object itemId) {
-		if (itemId instanceof AdviceExpressionType) {
-			return true;
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return true;
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			return true;
-		}
-		if (itemId instanceof AttributeValueType) {
-			return true;
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return true;
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return true;
-		}
-		if (itemId instanceof ApplyType) {
-			return true;
-		}
-		return false;
-	}
-	
-	public void updateItem(Object itemId) {
-		this.fireItemSetChange();
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItem: " + itemId);
-		}
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-		return new ObAdviceItem(itemId);
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return OBADVICE_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (this.root instanceof ObligationExpressionsType) {
-			items.addAll(this.rootObligations);
-			if (this.obligationExpressions.isEmpty() == false) {
-				items.addAll(this.obligationExpressions.keySet());
-			}
-		} else if (this.root instanceof AdviceExpressionsType) {
-			items.addAll(this.rootAdvice);
-			if (this.adviceExpressions.isEmpty() == false) {
-				items.addAll(this.adviceExpressions.keySet());
-			}
-		}
-		if (this.values.isEmpty() == false) {
-			items.add(this.values.keySet());
-		}
-		if (this.designators.isEmpty() == false) {
-			items.add(this.designators.keySet());
-		}
-		if (this.selectors.isEmpty() == false) {
-			items.add(this.selectors.keySet());
-		}
-		if (this.applys.isEmpty() == false) {
-			items.add(this.applys.keySet());
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItemIds (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (this.isObjectSupported(itemId) == false) {
-			return null;
-		}
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_ID, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_ID_SHORT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_ID_SHORT, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_EFFECT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_EFFECT, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_DATATYPE, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_DATATYPE_SHORT, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_CATEGORY)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_CATEGORY, null);
-        }
-		
-        if (propertyId.equals(PROPERTY_CATEGORY_SHORT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new ObAdviceItem(itemId), OBADVICE_ITEM_CATEGORY_SHORT, null);
-        }
-		
-		return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ID)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ID_SHORT)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_EFFECT)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_DATATYPE_SHORT)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_CATEGORY)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_CATEGORY_SHORT)) {
-            return String.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		int size = 0;
-		if (this.root instanceof ObligationExpressionsType) {
-			size += this.rootObligations.size();
-			size += this.obligationExpressions.size();
-		} else if (this.root instanceof AdviceExpressionsType) {
-			size += this.rootAdvice.size();
-			size += this.adviceExpressions.size();
-		}
-		size += this.values.size();
-		size += this.designators.size();
-		size += this.selectors.size();
-		size += this.applys.size();
-		if (logger.isTraceEnabled()) {
-			logger.trace("size: " + size);
-		}
-		return size;
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("containsId: " + itemId);
-		}
-		if (itemId instanceof AdviceExpressionType) {
-			return this.rootAdvice.contains(itemId);
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return this.rootObligations.contains(itemId);
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			if (this.root instanceof ObligationExpressionsType) {
-				return this.obligationExpressions.containsKey(itemId);
-			} else if (this.root instanceof AdviceExpressionsType) {
-				return this.adviceExpressions.containsKey(itemId);
-			}
-		}
-		if (itemId instanceof AttributeValueType) {
-			return this.values.containsKey(itemId);
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return this.designators.containsKey(itemId);
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return this.selectors.containsKey(itemId);
-		}
-		if (itemId instanceof ApplyType) {
-			return this.applys.containsKey(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		if (itemId instanceof ObligationExpressionType ||
-			itemId instanceof AdviceExpressionType) {
-			return this.addItem(itemId, null);
-		}
-		throw new UnsupportedOperationException("Must be Obligation or Advice Expression Type.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		if (this.root instanceof ObligationExpressionsType) {
-			return this.addItem(new ObligationExpressionType(), null);
-		} else if (this.root instanceof AdviceExpressionsType) {
-			return this.addItem(new AdviceExpressionType(), null);
-		}
-		//
-		// Should never get here
-		//
-		return null;
-	}
-	
-	public Item addItem(Object itemId, Object parent) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItem: " + itemId + " " + parent);
-		}
-		//
-		// Check itemId to see if its supported
-		//
-		if (this.isObjectSupported(itemId) == false) {
-			logger.error("Unsupported itemid: " + itemId.getClass().getCanonicalName());
-			return null;
-		}
-		//
-		// Determine what they are trying to add
-		//
-		if (this.root instanceof ObligationExpressionsType) {
-			if (itemId instanceof ObligationExpressionType) {
-				//
-				// Adding a new root obligation expression, is it already in the parent.
-				//
-				if (((ObligationExpressionsType)this.root).getObligationExpression().contains(itemId) == false) {
-					//
-					// It doesn't exist in the object, add it in
-					//
-					((ObligationExpressionsType)this.root).getObligationExpression().add((ObligationExpressionType) itemId);
-				}
-				//
-				// Track this
-				//
-				this.rootObligations.add((ObligationExpressionType) itemId);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return the item
-				//
-				return new ObAdviceItem(itemId);
-			}
-			if (itemId instanceof AttributeAssignmentExpressionType) {
-				//
-				// Sanity check the parent
-				//
-				if (parent instanceof ObligationExpressionType == false) {
-					logger.error("Incorrect parent type: " + parent.getClass().getCanonicalName());
-					return null;
-				}
-				//
-				// Does the parent object exist?
-				//
-				if (((ObligationExpressionsType)this.root).getObligationExpression().contains(parent) == false) {
-					//
-					// This is a new obligation
-					//
-					logger.info("addItem - parent not found, adding." + ((ObligationExpressionType) parent).getObligationId());
-					((ObligationExpressionsType)this.root).getObligationExpression().add((ObligationExpressionType) parent);
-					//
-					// track it
-					//
-					this.rootObligations.add((ObligationExpressionType) parent);
-				}
-				//
-				// Check if the item needs to be added to the parent object
-				//
-				if (((ObligationExpressionType) parent).getAttributeAssignmentExpression().contains(itemId) == false) {
-					//
-					// Put the assignment into the parent
-					//
-					((ObligationExpressionType) parent).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId);
-					//
-					// Add the contained expression
-					//
-					this.addExpression(((AttributeAssignmentExpressionType) itemId).getExpression(), (AttributeAssignmentExpressionType) itemId);
-				}
-				//
-				// track this in our map
-				//
-				this.obligationExpressions.put((AttributeAssignmentExpressionType) itemId, (ObligationExpressionType) parent);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return the item
-				//
-				return new ObAdviceItem(itemId);
-			}
-			if (parent instanceof AttributeAssignmentExpressionType) {
-				//
-				// Does the parent object exist?
-				//
-				if (this.obligationExpressions.containsKey(parent) == false) {
-					//
-					// No - we can't add it. Need more information.
-					//
-					logger.info("addItem - parent not found, adding." + ((AttributeAssignmentExpressionType) parent).getAttributeId());
-					return null;
-				}
-				if (itemId instanceof AttributeValueType) {
-					this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof AttributeDesignatorType) {
-					this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof AttributeSelectorType) {
-					this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof ApplyType) {
-					this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else {
-					logger.error("Should not get here. The object was checked in the beginning of the function. Someone removed or altered that check.");
-					assert false;
-					return null;
-				}
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return the item
-				//
-				return new ObAdviceItem(itemId);
-			}
-		} else if (this.root instanceof AdviceExpressionsType) {
-			//
-			// Are we adding new root advice expression?
-			//
-			if (itemId instanceof AdviceExpressionType) {
-				//
-				// Adding a new root obligation expression, is it already in the parent.
-				//
-				if (((AdviceExpressionsType)this.root).getAdviceExpression().contains(itemId) == false) {
-					//
-					// No - add it in
-					//
-					((AdviceExpressionsType)this.root).getAdviceExpression().add((AdviceExpressionType) itemId);
-				}
-				//
-				// Track this object
-				//
-				this.rootAdvice.add((AdviceExpressionType) itemId);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return the new item
-				//
-				return new ObAdviceItem(itemId);
-			}
-			if (itemId instanceof AttributeAssignmentExpressionType) {
-				//
-				// Sanity check
-				//
-				if (parent instanceof AdviceExpressionType == false) {
-					logger.error("Incorrect parent type: " + parent.getClass().getCanonicalName());
-					return null;
-				}
-				//
-				// Does the parent object exist?
-				//
-				if (((AdviceExpressionsType)this.root).getAdviceExpression().contains(parent) == false) {
-					//
-					// This is a new obligation
-					//
-					logger.info("addItem - parent not found, adding." + ((AdviceExpressionType) parent).getAdviceId());
-					((AdviceExpressionsType)this.root).getAdviceExpression().add((AdviceExpressionType) parent);
-					//
-					// Track it
-					//
-					this.rootAdvice.add((AdviceExpressionType) parent);
-				}
-				//
-				// Check if the item needs to be added to the parent object
-				//
-				if (((AdviceExpressionType) parent).getAttributeAssignmentExpression().contains(itemId) == false) {
-					//
-					// Put the assignment into the parent
-					//
-					((AdviceExpressionType) parent).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId);
-					//
-					// Add the contained expression
-					//
-					this.addExpression(((AttributeAssignmentExpressionType) itemId).getExpression(), (AttributeAssignmentExpressionType) itemId);
-				}
-				//
-				// track this in our map
-				//
-				this.adviceExpressions.put((AttributeAssignmentExpressionType) itemId, (AdviceExpressionType) parent);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return the item
-				//
-				return new ObAdviceItem(itemId);
-			}
-			if (parent instanceof AttributeAssignmentExpressionType) {
-				//
-				// Does the parent object exist?
-				//
-				if (this.adviceExpressions.containsKey(parent) == false) {
-					//
-					// No - we can't add it. Need more information.
-					//
-					logger.info("addItem - parent not found, adding." + ((AttributeAssignmentExpressionType) parent).getAttributeId());
-					return null;
-				}
-				if (itemId instanceof AttributeValueType) {
-					this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof AttributeDesignatorType) {
-					this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof AttributeSelectorType) {
-					this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else if (itemId instanceof ApplyType) {
-					this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) parent);
-				} else {
-					logger.error("Should not get here. Someone altered the object supported check or removed the code.");
-					assert false;
-					return null;
-				}
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				//
-				// Return new item
-				//
-				return new ObAdviceItem(itemId);
-			}
-		} else {
-			//
-			// We should not ever get here.
-			//
-			logger.error("The root object is incorrect.");
-			return null;
-		}
-		logger.error("Unsupported combination of itemId and parent classes.");
-		return null;
-	}
-
-	@Override
-	public boolean addContainerProperty(Object propertyId, Class<?> type,
-			Object defaultValue) throws UnsupportedOperationException {
-		return false;
-	}
-
-	@Override
-	public boolean removeContainerProperty(Object propertyId)
-			throws UnsupportedOperationException {
-		return false;
-	}
-	
-	public boolean removeAllAssignments () {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeAllAssignments:");
-		}
-		if (this.root instanceof ObligationExpressionsType) {
-			((ObligationExpressionsType)this.root).getObligationExpression().clear();
-			this.obligationExpressions.clear();
-		} else if (this.root instanceof AdviceExpressionsType) {
-			((AdviceExpressionsType)this.root).getAdviceExpression().clear();
-			this.adviceExpressions.clear();
-		}
-		this.values.clear();
-		this.designators.clear();
-		this.selectors.clear();
-		this.applys.clear();
-		//
-		// Notify
-		//
-		this.fireItemSetChange();
-		return true;
-	}
-
-	@Override
-	public boolean removeAllItems() throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeAllItems:");
-		}
-		if (this.root instanceof ObligationExpressionsType) {
-			((ObligationExpressionsType)this.root).getObligationExpression().clear();
-			this.rootObligations.clear();
-			this.obligationExpressions.clear();
-		} else if (this.root instanceof AdviceExpressionsType) {
-			((AdviceExpressionsType)this.root).getAdviceExpression().clear();
-			this.rootAdvice.clear();
-			this.adviceExpressions.clear();
-		}
-		this.values.clear();
-		this.designators.clear();
-		this.selectors.clear();
-		this.applys.clear();
-		//
-		// Notify
-		//
-		this.fireItemSetChange();
-		return true;
-	}
-
-	@Override
-	public Collection<?> getChildren(Object itemId) {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (itemId instanceof AdviceExpressionType) {
-			if (this.rootAdvice.contains(itemId)) {
-				items.addAll(((AdviceExpressionType) itemId).getAttributeAssignmentExpression());
-			} else {
-				logger.error("getChildren: itemId not in root advice expression " + ((AdviceExpressionType) itemId).getAdviceId());
-			}
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			if (this.rootObligations.contains(itemId)) {
-				items.addAll(((ObligationExpressionType) itemId).getAttributeAssignmentExpression());
-			} else {
-				logger.error("getChildren: itemId not in root obligation expression " + ((ObligationExpressionType) itemId).getObligationId());
-			}
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			if (this.root instanceof ObligationExpressionsType) {
-				if (this.obligationExpressions.containsKey(itemId)) {
-					JAXBElement<?> element = ((AttributeAssignmentExpressionType) itemId).getExpression();
-					if (element != null && element.getValue() != null) {
-						items.add(element.getValue());
-					}
-				} else {
-					logger.error("getChildren: itemId not in obligation expressions " + ((AttributeAssignmentExpressionType) itemId).getAttributeId());
-				}
-			} else if (this.root instanceof AdviceExpressionsType) {
-				if (this.adviceExpressions.containsKey(itemId)) {
-					JAXBElement<?> element = ((AttributeAssignmentExpressionType) itemId).getExpression();
-					if (element != null && element.getValue() != null) {
-						items.add(element.getValue());
-					}
-				} else {
-					logger.error("getChildren: itemId not in advice expressions " + ((AttributeAssignmentExpressionType) itemId).getAttributeId());
-				}
-			}
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("getChildren " + itemId + "(" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Object getParent(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getParent: " + itemId);
-		}
-		assert itemId != null;
-		if (itemId instanceof AdviceExpressionType) {
-			if (this.root instanceof AdviceExpressionsType) {
-				return this.root;
-			}
-			return null;
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			if (this.root instanceof ObligationExpressionsType) {
-				return this.root;
-			}
-			return null;
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			if (this.root instanceof ObligationExpressionsType) {
-				return this.obligationExpressions.get(itemId);
-			} else if (this.root instanceof AdviceExpressionsType) {
-				return this.adviceExpressions.get(itemId);
-			}
-		}
-		if (itemId instanceof AttributeValueType) {
-			return this.values.get(itemId);
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return this.designators.get(itemId);
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return this.selectors.get(itemId);
-		}
-		if (itemId instanceof ApplyType) {
-			return this.applys.get(itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> rootItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		if (this.root instanceof ObligationExpressionsType) {
-			items.addAll(this.rootObligations);
-		} else if (this.root instanceof AdviceExpressionsType) {
-			items.addAll(this.rootAdvice);
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("rootItemIds (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setParent: " + itemId);
-		}
-		if (itemId instanceof AdviceExpressionType) {
-			return false;
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return false;
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			if (this.root instanceof ObligationExpressionsType && newParentId instanceof ObligationExpressionType) {
-				//
-				// Remove it from its parent object
-				//
-				ObligationExpressionType oldParent = this.obligationExpressions.get(itemId);
-				if (oldParent.getAttributeAssignmentExpression().remove(itemId)) {
-					//
-					// See if its in the new parent
-					//
-					if (((ObligationExpressionType) newParentId).getAttributeAssignmentExpression().contains(itemId) == false) {
-						//
-						// Nope, add it in
-						//
-						((ObligationExpressionType) newParentId).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId);
-					}
-					//
-					// Update our tracking
-					//
-					this.obligationExpressions.put((AttributeAssignmentExpressionType) itemId, (ObligationExpressionType) newParentId);
-					//
-					// Fire
-					//
-					this.fireItemSetChange();
-					return true;
-				}
-			} else if (this.root instanceof AdviceExpressionsType) {
-				//
-				// Remove it from its parent object
-				//
-				AdviceExpressionType oldParent = this.adviceExpressions.get(itemId);
-				if (oldParent.getAttributeAssignmentExpression().remove(itemId)) {
-					//
-					// See if its in the new parent
-					//
-					if (((AdviceExpressionType) newParentId).getAttributeAssignmentExpression().contains(itemId) == false) {
-						//
-						// Nope, add it in
-						//
-						((AdviceExpressionType) newParentId).getAttributeAssignmentExpression().add((AttributeAssignmentExpressionType) itemId);
-					}
-					//
-					// Update our tracking
-					//
-					this.adviceExpressions.put((AttributeAssignmentExpressionType) itemId, (AdviceExpressionType) newParentId);
-					//
-					// Fire
-					//
-					this.fireItemSetChange();
-					return true;
-				}
-			}
-			return false;
-		}
-		if (itemId instanceof AttributeValueType && newParentId instanceof AttributeAssignmentExpressionType) {
-			AttributeAssignmentExpressionType oldParent = this.values.get(itemId);
-			if (oldParent != null &&
-				oldParent.getExpression() != null &&
-				oldParent.getExpression().getValue() != null &&
-				oldParent.getExpression().getValue() == itemId) {
-				//
-				// Remove from old parent
-				//
-				oldParent.setExpression(null);
-				//
-				// Put in new parent
-				//
-				((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeValue((AttributeValueType) itemId));
-				//
-				// track it
-				//
-				this.values.put((AttributeValueType) itemId, (AttributeAssignmentExpressionType) newParentId);
-				//
-				// Fire
-				//
-				this.fireItemSetChange();
-				return true;
-			}
-			return false;
-		}
-		if (itemId instanceof AttributeDesignatorType && newParentId instanceof AttributeAssignmentExpressionType) {
-			AttributeAssignmentExpressionType oldParent = this.designators.get(itemId);
-			if (oldParent != null &&
-				oldParent.getExpression() != null &&
-				oldParent.getExpression().getValue() != null &&
-				oldParent.getExpression().getValue() == itemId) {
-				//
-				// Remove from old parent
-				//
-				oldParent.setExpression(null);
-				//
-				// Put in new parent
-				//
-				((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeDesignator((AttributeDesignatorType) itemId));
-				//
-				// track it
-				//
-				this.designators.put((AttributeDesignatorType) itemId, (AttributeAssignmentExpressionType) newParentId);
-				//
-				// Fire
-				//
-				this.fireItemSetChange();
-				return true;
-			}
-			return false;
-		}
-		if (itemId instanceof AttributeSelectorType && newParentId instanceof AttributeAssignmentExpressionType) {
-			AttributeAssignmentExpressionType oldParent = this.selectors.get(itemId);
-			if (oldParent != null &&
-				oldParent.getExpression() != null &&
-				oldParent.getExpression().getValue() != null &&
-				oldParent.getExpression().getValue() == itemId) {
-				//
-				// Remove from old parent
-				//
-				oldParent.setExpression(null);
-				//
-				// Put in new parent
-				//
-				((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createAttributeSelector((AttributeSelectorType) itemId));
-				//
-				// track it
-				//
-				this.selectors.put((AttributeSelectorType) itemId, (AttributeAssignmentExpressionType) newParentId);
-				//
-				// Fire
-				//
-				this.fireItemSetChange();
-				return true;
-			}
-			return false;
-		}
-		if (itemId instanceof ApplyType && newParentId instanceof AttributeAssignmentExpressionType) {
-			AttributeAssignmentExpressionType oldParent = this.applys.get(itemId);
-			if (oldParent != null &&
-				oldParent.getExpression() != null &&
-				oldParent.getExpression().getValue() != null &&
-				oldParent.getExpression().getValue() == itemId) {
-				//
-				// Remove from old parent
-				//
-				oldParent.setExpression(null);
-				//
-				// Put in new parent
-				//
-				((AttributeAssignmentExpressionType) newParentId).setExpression(new ObjectFactory().createApply((ApplyType) itemId));
-				//
-				// track it
-				//
-				this.applys.put((ApplyType) itemId, (AttributeAssignmentExpressionType) newParentId);
-				//
-				// Fire
-				//
-				this.fireItemSetChange();
-				return true;
-			}
-			return false;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean areChildrenAllowed(Object itemId) {
-		if (itemId instanceof AdviceExpressionType) {
-			return true;
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return true;
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			return true;
-		}
-		if (itemId instanceof AttributeValueType) {
-			return false;
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return false;
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return false;
-		}
-		if (itemId instanceof ApplyType) {
-			return false;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
-		if (itemId instanceof AdviceExpressionType) {
-			return (areChildrenAllowed ? true : false);
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return (areChildrenAllowed ? true : false);
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			return (areChildrenAllowed ? true : false);
-		}
-		if (itemId instanceof AttributeValueType) {
-			return (areChildrenAllowed == false ? true : false);
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			return (areChildrenAllowed == false ? true : false);
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			return (areChildrenAllowed == false ? true : false);
-		}
-		if (itemId instanceof ApplyType) {
-			return (areChildrenAllowed == false ? true : false);
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isRoot(Object itemId) {
-		if (this.root instanceof AdviceExpressionsType) {
-			return this.rootAdvice.contains(itemId);
-		} else if (this.root instanceof ObligationExpressionsType) {
-			return this.rootObligations.contains(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public boolean hasChildren(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("hasChildren: " + itemId);
-		}
-		if (itemId instanceof AdviceExpressionType && this.root instanceof AdviceExpressionsType &&
-				this.rootAdvice.contains(itemId)) {
-			return ((AdviceExpressionType) itemId).getAttributeAssignmentExpression().size() > 0;
-		}
-		if (itemId instanceof ObligationExpressionType && this.root instanceof ObligationExpressionsType &&
-				this.rootObligations.contains(itemId)) {
-			return ((ObligationExpressionType) itemId).getAttributeAssignmentExpression().size() > 0;
-		}
-		if (itemId instanceof AttributeAssignmentExpressionType) {
-			if (this.root instanceof ObligationExpressionsType) {
-				return this.obligationExpressions.size() > 0;
-			} else if (this.root instanceof AdviceExpressionsType) {
-				return this.adviceExpressions.size() > 0;
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeItem: " + itemId);
-		}
-		if (this.root instanceof ObligationExpressionsType) {
-			if (itemId instanceof ObligationExpressionType) {
-				if (((ObligationExpressionsType) this.root).getObligationExpression().remove(itemId)) {
-					//
-					// Remove this
-					//
-					if (this.rootObligations.remove(itemId) == false) {
-						//
-						//
-						//
-						assert false;
-						logger.error("Removing item " + itemId + " failed to remove it from root obligation list");
-					}
-					//
-					// Notify
-					//
-					this.fireItemSetChange();
-					return true ;
-				}
-			} else if (itemId instanceof AttributeAssignmentExpressionType) {
-				ObligationExpressionType parent = this.obligationExpressions.get(itemId);
-				if (parent != null && parent.getAttributeAssignmentExpression().remove(itemId)) {
-					if (this.obligationExpressions.remove(itemId) == null) {
-						assert false;
-						logger.error("Removing item " + itemId + " failed to remove it from obligation expressions map");
-					}
-					//
-					// Notify
-					//
-					this.fireItemSetChange();
-					return true;
-				}
-			}
-		} else if (this.root instanceof AdviceExpressionsType) {
-			if (itemId instanceof AdviceExpressionType) {
-				if (((AdviceExpressionsType) this.root).getAdviceExpression().remove(itemId)) {
-					if (this.rootAdvice.remove(itemId) == false) {
-						assert false;
-						logger.error("Removing item " + itemId + " failed to remove it from root advice list");
-					}
-					//
-					// Notify
-					//
-					this.fireItemSetChange();
-					return true;
-				}
-			} else if (itemId instanceof AttributeAssignmentExpressionType) {
-				AdviceExpressionType parent = this.adviceExpressions.get(itemId);
-				if (parent != null && parent.getAttributeAssignmentExpression().remove(itemId)) {
-					if (this.adviceExpressions.remove(itemId) == null) {
-						assert false;
-						logger.error("Removing item " + itemId + " failed to remove it from advice expressions map");
-					}
-					//
-					// Notify
-					//
-					this.fireItemSetChange();
-					return true;
-				}
-			}
-		}
-		if (itemId instanceof AttributeValueType) {
-			AttributeAssignmentExpressionType parent = this.values.get(itemId);
-			if (parent != null && 
-				parent.getExpression() != null && 
-				parent.getExpression().getValue() != null && 
-				parent.getExpression().getValue().equals(itemId)) {
-				parent.setExpression(null);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				return this.values.remove(itemId) == null;
-			}
-		}
-		if (itemId instanceof AttributeDesignatorType) {
-			AttributeAssignmentExpressionType parent = this.designators.get(itemId);
-			if (parent != null && 
-				parent.getExpression() != null && 
-				parent.getExpression().getValue() != null && 
-				parent.getExpression().getValue().equals(itemId)) {
-				parent.setExpression(null);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				return this.designators.remove(itemId) == null;
-			}
-		}
-		if (itemId instanceof AttributeSelectorType) {
-			AttributeAssignmentExpressionType parent = this.selectors.get(itemId);
-			if (parent != null && 
-				parent.getExpression() != null && 
-				parent.getExpression().getValue() != null && 
-				parent.getExpression().getValue().equals(itemId)) {
-				parent.setExpression(null);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				return this.selectors.remove(itemId) == null;
-			}
-		}
-		if (itemId instanceof ApplyType) {
-			AttributeAssignmentExpressionType parent = this.applys.get(itemId);
-			if (parent != null && 
-				parent.getExpression() != null && 
-				parent.getExpression().getValue() != null && 
-				parent.getExpression().getValue().equals(itemId)) {
-				parent.setExpression(null);
-				//
-				// Notify
-				//
-				this.fireItemSetChange();
-				return this.applys.remove(itemId) == null;
-			}
-		}
-		return false;
-	}
-
-	public class ObAdviceItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final Object data;
-		
-		public ObAdviceItem(Object data) {
-			this.data = data;
-		}
-		
-		public String getName() {
-			if (this.data instanceof AdviceExpressionType) {
-				return "Advice";
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return "Obligation";
-			}
-			if (this.data instanceof AttributeAssignmentExpressionType) {
-				return "Attribute Assignment Expression";
-			}
-			if (this.data instanceof AttributeValueType) {
-				return "Attribute Value";
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return "Attribute Designator";
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return "Attribute Selector";
-			}
-			if (this.data instanceof ApplyType) {
-				return "Apply";
-			}
-			return null;
-		}
-		
-		public String getId() {
-			if (this.data instanceof AdviceExpressionType) {
-				return ((AdviceExpressionType) this.data).getAdviceId();
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return ((ObligationExpressionType) this.data).getObligationId();
-			}
-			if (this.data instanceof AttributeAssignmentExpressionType) {
-				return ((AttributeAssignmentExpressionType) this.data).getAttributeId();
-			}
-			if (this.data instanceof AttributeValueType) {
-				StringBuilder builder = new StringBuilder();
-				for (Object content : ((AttributeValueType) this.data).getContent()) {
-					builder.append(content);
-				}
-				return builder.toString();
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return ((AttributeDesignatorType) this.data).getAttributeId();
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return ((AttributeSelectorType) this.data).getContextSelectorId();
-			}
-			if (this.data instanceof ApplyType) {
-				return ((ApplyType) this.data).getFunctionId();
-			}
-			return null;
-		}
-		
-		public String getIdShort() {
-			String id = this.getId();
-			if (id == null) {
-				return id;
-			}
-			if (this.data instanceof AttributeValueType) {
-				return id;
-			}
-			//
-			// Make it short
-			//
-			String[] parts = id.split("[:]");
-			
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-			return id;
-		}
-		
-		public String getEffect() {
-			if (this.data instanceof AdviceExpressionType) {
-				return ((AdviceExpressionType) this.data).getAppliesTo().toString();
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return ((ObligationExpressionType) this.data).getFulfillOn().toString();
-			}
-			return null;
-		}
-		
-		public String getDatatype() {
-			/*
-			if (this.data instanceof AdviceExpressionType) {
-			}
-			if (this.data instanceof ObligationExpressionType) {
-			}
-			if (this.data instanceof AttributeAssignmentExpressionType) {
-			}
-			*/
-			if (this.data instanceof AttributeValueType) {
-				return ((AttributeValueType) this.data).getDataType();
-			}
-			if (this.data instanceof AttributeDesignatorType) {
-				return ((AttributeDesignatorType) this.data).getDataType();
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return ((AttributeSelectorType) this.data).getDataType();
-			}
-			/*
-			if (this.data instanceof ApplyType) {
-				
-			}
-			*/
-			return null;
-		}
-
-		public String getDatatypeShort() {
-			String dt = this.getDatatype();
-			if (dt == null) {
-				return dt;
-			}
-			//
-			// Get short part
-			//
-			int index = dt.lastIndexOf('#');
-			if (index == -1) {
-				String[] parts = dt.split("[:]");
-				
-				if (parts != null && parts.length > 0) {
-					return parts[parts.length - 1];
-				}
-			} else {
-				return dt.substring(index + 1);
-			}
-			return dt;
-		}
-		
-		public String getCategory() {
-			/*
-			if (this.data instanceof AdviceExpressionType) {
-			}
-			if (this.data instanceof ObligationExpressionType) {
-			}
-			*/
-			if (this.data instanceof AttributeAssignmentExpressionType) {
-				return ((AttributeAssignmentExpressionType) this.data).getCategory();
-			}
-			/*
-			if (this.data instanceof AttributeValueType) {
-			}
-			*/
-			if (this.data instanceof AttributeDesignatorType) {
-				return ((AttributeDesignatorType) this.data).getCategory();
-			}
-			if (this.data instanceof AttributeSelectorType) {
-				return ((AttributeSelectorType) this.data).getCategory();
-			}
-			/*
-			if (this.data instanceof ApplyType) {
-				
-			}
-			*/
-			return null;
-		}
-		
-		public String getCategoryShort() {
-			String id = this.getCategory();
-			if (id == null) {
-				return id;
-			}
-			String[] parts = id.split("[:]");
-			
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-			return id;
-		}
-		
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.data, id);
-		}
-		@Override
-		public Collection<?> getItemPropertyIds() {
-           return getContainerPropertyIds();
-		}
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Expression container does not support adding new properties");
-		}
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Expression container does not support removing properties");
-		}		
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java
deleted file mode 100644
index 5b9f3f5..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPContainer.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-import com.vaadin.server.Resource;
-
-public class PDPContainer extends ItemSetChangeNotifier implements Container.Indexed, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(PDPGroupContainer.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 "Description" property.
-     */
-    public static String PROPERTY_DESCRIPTION = "Description";
-
-    /**
-     * String identifier of a file's "Default" property.
-     */
-    public static String PROPERTY_DEFAULT = "Default";
-
-    /**
-     * String identifier of a file's "icon" property.
-     */
-    public static String PROPERTY_ICON = "Icon";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_STATUS = "Status";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_PDPS = "PDPs";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_POLICIES = "Policies";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_PIPCONFIG = "PIP Configurations";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> PDP_PROPERTIES;
-
-    private final static Method PDPITEM_ID;
-    
-    private final static Method PDPITEM_NAME;
-    
-    private final static Method PDPITEM_DESCRIPTION;
-
-    private final static Method PDPITEM_ICON;
-    
-    private final static Method PDPITEM_STATUS;
-        
-    private final static Method PDPITEM_POLICIES;
-    
-    private final static Method PDPITEM_PIPCONFIG;
-        
-    
-    static {
-    	PDP_PROPERTIES = new ArrayList<String>();
-    	PDP_PROPERTIES.add(PROPERTY_ID);
-    	PDP_PROPERTIES.add(PROPERTY_NAME);
-    	PDP_PROPERTIES.add(PROPERTY_DESCRIPTION);
-    	PDP_PROPERTIES.add(PROPERTY_DEFAULT);
-    	PDP_PROPERTIES.add(PROPERTY_ICON);
-    	PDP_PROPERTIES.add(PROPERTY_STATUS);
-    	PDP_PROPERTIES.add(PROPERTY_PDPS);
-    	PDP_PROPERTIES.add(PROPERTY_POLICIES);
-    	PDP_PROPERTIES.add(PROPERTY_PIPCONFIG);
-    	PDP_PROPERTIES = Collections.unmodifiableCollection(PDP_PROPERTIES);
-        try {
-        	PDPITEM_ID = PDPItem.class.getMethod("getId", new Class[]{});
-        	PDPITEM_NAME = PDPItem.class.getMethod("getName", new Class[]{});
-        	PDPITEM_DESCRIPTION = PDPItem.class.getMethod("getDescription", new Class[] {});
-            PDPITEM_ICON = PDPItem.class.getMethod("getIcon", new Class[] {});
-            PDPITEM_STATUS = PDPItem.class.getMethod("getStatus", new Class[] {});
-            PDPITEM_POLICIES = PDPItem.class.getMethod("getPolicies", new Class[] {});
-            PDPITEM_PIPCONFIG = PDPItem.class.getMethod("getPipConfigs", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PDPContainer");
-        }
-    }
-    
- 	private PAPEngine papEngine = null; //NOPMD
-	private PDPGroup group;
-	private List<PDP> pdps = Collections.synchronizedList(new ArrayList<PDP>());
-	
-	public PDPContainer(PDPGroup group) {
-		super();
-		this.setContainer(this);
-		//
-		//
-		//
-		this.group = group;
-		this.pdps.addAll(this.group.getPdps());
-	}
-	
-	public synchronized void refresh(PDPGroup group) {
-		synchronized(this.group) {
-			this.group = group;
-		}
-		synchronized (this.pdps) {
-			this.pdps.clear();
-			this.pdps.addAll(this.group.getPdps());
-		}
-	}
-
-	@Override
-	public Object nextItemId(Object itemId) {
-		synchronized (this.pdps) {
-			int index = this.pdps.indexOf(itemId);
-			if (index == -1) {
-				return null;
-			}
-			if (index == this.pdps.size() - 1) {
-				return null;
-			}
-			return this.pdps.get(index + 1);
-		}
-	}
-
-	@Override
-	public Object prevItemId(Object itemId) {
-		synchronized (this.pdps) {
-			int index = this.pdps.indexOf(itemId);
-			if (index == -1) {
-				return null;
-			}
-			if (index == 0) {
-				return null;
-			}
-			return this.pdps.get(index - 1);
-		}
-	}
-
-	@Override
-	public Object firstItemId() {
-		synchronized (this.pdps) {
-			if (this.pdps.size() > 0) {
-				return this.pdps.get(0);
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public Object lastItemId() {
-		synchronized (this.pdps) {
-			if (this.pdps.size() > 0) {
-				return this.pdps.get(this.pdps.size() - 1);
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public boolean isFirstId(Object itemId) {
-		synchronized (this.pdps) {
-			if (this.pdps.size() > 0) {
-				return this.pdps.get(0).equals(itemId);
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isLastId(Object itemId) {
-		synchronized (this.pdps) {
-			if (this.pdps.size() > 0) {
-				return this.pdps.get(this.pdps.size() - 1).equals(itemId);
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Use addPDP method");
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Use addPDP method");
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		/*
-		if (itemId instanceof PDP) {
-		}
-		*/
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return PDP_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		synchronized(this.pdps) {
-			return Collections.unmodifiableList(this.pdps);
-		}
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_ID, null);
-        }
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_DESCRIPTION, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_ICON, null);
-        }
-
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_STATUS, null);
-        }
-
-        if (propertyId.equals(PROPERTY_POLICIES)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_POLICIES, null);
-        }
-
-        if (propertyId.equals(PROPERTY_PIPCONFIG)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPItem((PDP) itemId), PDPITEM_PIPCONFIG, null);
-        }
-        
-		return null;
-	}
-
-	@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_DESCRIPTION)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return Resource.class;
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_POLICIES)) {
-            return Set.class;
-        }
-        if (propertyId.equals(PROPERTY_PIPCONFIG)) {
-            return Set.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return this.pdps.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		return this.pdps.contains(itemId);
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-	@Override
-	public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot add a property");
-	}
-
-	@Override
-	public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot remove a property");
-	}
-
-	@Override
-	public boolean removeAllItems() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot remove all items.");
-	}
-
-	@Override
-	public int indexOfId(Object itemId) {
-		return this.pdps.indexOf(itemId);
-	}
-
-	@Override
-	public Object getIdByIndex(int index) {
-		return this.pdps.get(index);
-	}
-
-	@Override
-	public List<?> getItemIds(int startIndex, int numberOfItems) {
-		synchronized (this.pdps) {
-			int endIndex = startIndex + numberOfItems;
-			if (endIndex > this.pdps.size()) {
-				endIndex = this.pdps.size() - 1;
-			}
-			return this.pdps.subList(startIndex, endIndex);
-		}
-	}
-
-	@Override
-	public Object addItemAt(int index) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot add item.");
-	}
-
-	@Override
-	public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot add item.");
-	}
-
-	public class PDPItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final PDP pdp;
-		
-		public PDPItem(PDP pdp) {
-			this.pdp = pdp;
-		}
-
-		public String getId() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getId: " + this.pdp);
-			}
-			return this.pdp.getId();
-		}
-		
-		public String getName() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getName: " + this.pdp);
-			}
-			return this.pdp.getName();
-		}
-		
-		public String getDescription() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getDescription: " + this.pdp);
-			}
-			return this.pdp.getDescription();
-		}
-		
-        public Resource getIcon() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getIcon: " + this.pdp);
-			}
-        	return null;
-        }
-        
-        public String	getStatus() {
-        	String status = this.pdp.getStatus().getStatus().toString();
-        	Set<String> errors = this.pdp.getStatus().getLoadErrors();
-        	if (errors.size() > 0) {
-        		status = status + String.format(" %d errors", errors.size());
-        	}
-        	Set<String> warnings = this.pdp.getStatus().getLoadWarnings();
-        	if (warnings.size() > 0) {
-        		status = status + String.format(" %d warnings", warnings.size());
-        	}
-        	return status;
-        }
-        
-        public Set<PDPPolicy> getPolicies() {
- 			if (logger.isTraceEnabled()) {
-				logger.trace("getPolicies: " + this.pdp);
-			}
- 			return this.pdp.getPolicies();
-        }
-        
-        public Set<PDPPIPConfig> getPipConfigs() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getPIPConfigs: " + this.pdp);
-			}
-			return this.pdp.getPipConfigs();
-        }
-        
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.pdp, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-	        return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-			throw new UnsupportedOperationException("PDP container does not support adding new properties");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id)
-				throws UnsupportedOperationException {
-            throw new UnsupportedOperationException(
-                    "PDP container does not support property removal");
-		}	
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java
deleted file mode 100644
index 12b9852..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPGroupContainer.java
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PAPException;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-import com.vaadin.server.Resource;
-
-public class PDPGroupContainer extends ItemSetChangeNotifier implements Container.Indexed, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(PDPGroupContainer.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 "Description" property.
-     */
-    public static String PROPERTY_DESCRIPTION = "Description";
-
-    /**
-     * String identifier of a file's "Default" property.
-     */
-    public static String PROPERTY_DEFAULT = "Default";
-
-    /**
-     * String identifier of a file's "icon" property.
-     */
-    public static String PROPERTY_ICON = "Icon";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_STATUS = "Status";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_PDPS = "PDPs";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_POLICIES = "Policies";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_PIPCONFIG = "PIP Configurations";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> PDP_PROPERTIES;
-
-    private final static Method PDPITEM_ID;
-    
-    private final static Method PDPITEM_NAME;
-    
-    private final static Method PDPITEM_DESCRIPTION;
-
-    private final static Method PDPITEM_DEFAULT;
-
-    private final static Method PDPITEM_ICON;
-    
-    private final static Method PDPITEM_STATUS;
-        
-    private final static Method PDPITEM_PDPS;
-    
-    private final static Method PDPITEM_POLICIES;
-    
-    private final static Method PDPITEM_PIPCONFIG;
-        
-    
-    static {
-    	PDP_PROPERTIES = new ArrayList<String>();
-    	PDP_PROPERTIES.add(PROPERTY_ID);
-    	PDP_PROPERTIES.add(PROPERTY_NAME);
-    	PDP_PROPERTIES.add(PROPERTY_DESCRIPTION);
-    	PDP_PROPERTIES.add(PROPERTY_DEFAULT);
-    	PDP_PROPERTIES.add(PROPERTY_ICON);
-    	PDP_PROPERTIES.add(PROPERTY_STATUS);
-    	PDP_PROPERTIES.add(PROPERTY_PDPS);
-    	PDP_PROPERTIES.add(PROPERTY_POLICIES);
-    	PDP_PROPERTIES.add(PROPERTY_PIPCONFIG);
-    	PDP_PROPERTIES = Collections.unmodifiableCollection(PDP_PROPERTIES);
-        try {
-        	PDPITEM_ID = PDPGroupItem.class.getMethod("getId", new Class[]{});
-        	PDPITEM_NAME = PDPGroupItem.class.getMethod("getName", new Class[]{});
-        	PDPITEM_DESCRIPTION = PDPGroupItem.class.getMethod("getDescription", new Class[] {});
-        	PDPITEM_DEFAULT = PDPGroupItem.class.getMethod("getDefault", new Class[] {});
-            PDPITEM_ICON = PDPGroupItem.class.getMethod("getIcon", new Class[] {});
-            PDPITEM_STATUS = PDPGroupItem.class.getMethod("getStatus", new Class[] {});
-            PDPITEM_PDPS = PDPGroupItem.class.getMethod("getPDPs", new Class[] {});
-            PDPITEM_POLICIES = PDPGroupItem.class.getMethod("getPolicies", new Class[] {});
-            PDPITEM_PIPCONFIG = PDPGroupItem.class.getMethod("getPipConfigs", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PDPContainer");
-        }
-    }
-    
- 	private PAPEngine papEngine = null;
- 	private List<PDPGroup> groups = Collections.synchronizedList(new ArrayList<PDPGroup>());
- 	
-    public PDPGroupContainer(PAPEngine engine) {
-		super();
-		this.setContainer(this);
-		//
-		//
-		//
-		this.papEngine = engine;
-		//
-		//
-		//
-		this.refreshGroups();
-	}
-    
-    public boolean isSupported(Object itemId) {
-    	if (itemId instanceof PDPGroup) {
-    		return true;
-    	}
-    	return false;
-    }
-	
-	public synchronized void refreshGroups() {
-		synchronized(this.groups) { 
-			this.groups.clear();
-			try {
-				this.groups.addAll(this.papEngine.getPDPGroups());
-			} catch (PAPException e) {
-				String message = "Unable to retrieve Groups from server: " + e;
-				logger.error(message, e);
-			}
-		}
-		//
-		// Notify that we have changed
-		//
-		this.fireItemSetChange();
-	}
-	
-	public List<PDPGroup>	getGroups() {
-		return Collections.unmodifiableList(this.groups);
-	}
-	
-	public void makeDefault(PDPGroup group) {
-		try {
-			this.papEngine.SetDefaultGroup(group);
-		} catch (PAPException e) {
-			String message = "Unable to set Default Group on server: " + e;
-			logger.error(message, e);
-		}
-	}
-	
-	public void removeGroup(PDPGroup group, PDPGroup newGroup) throws PAPException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeGroup: " + group + " new group for PDPs: " + newGroup);
-		}
-		if (group.isDefaultGroup()) {
-			throw new UnsupportedOperationException("You can't remove the Default Group.");
-		}
-		try {
-			this.papEngine.removeGroup(group, newGroup);
-		} catch (NullPointerException | PAPException e) {
-			logger.error("Failed to removeGroup " + group.getId(), e);
-			throw new PAPException("Failed to remove group '" + group.getId()+ "'", e);
-		}
-	}
-	
-	public void removePDP(PDP pdp, PDPGroup group) throws PAPException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removePDP: " + pdp + " from group: " + group);
-		}
-		try {
-			this.papEngine.removePDP(pdp);
-		} catch (PAPException e) {
-			logger.error("Failed to removePDP " + pdp.getId(), e);
-			throw new PAPException("Failed to remove pdp '" + pdp.getId()+ "'", e);
-		}
-	}
-	
-	public void updatePDP(PDP pdp) {
-		try {
-			papEngine.updatePDP(pdp);
-		} catch (PAPException e) {
-			logger.error(e);
-		}
-	}
-	
-	public void updateGroup(PDPGroup group) {
-		try {
-			papEngine.updateGroup(group);
-		} catch (PAPException e) {
-			logger.error(e);
-		}
-	}
-	
-	@Override
-	public Item getItem(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItem: " + itemId);
-		}
-		if (this.isSupported(itemId)) {
-			return new PDPGroupItem((PDPGroup) itemId);
-		}
-		return null;
-	}
-	
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return PDP_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		items.addAll(this.groups);
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItemIds: " + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_ID, null);
-        }
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_DESCRIPTION, null);
-        }
-
-        if (propertyId.equals(PROPERTY_DEFAULT)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_DEFAULT, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_ICON, null);
-        }
-
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_STATUS, null);
-        }
-
-        if (propertyId.equals(PROPERTY_PDPS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_PDPS, null);
-        }
-
-        if (propertyId.equals(PROPERTY_POLICIES)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_POLICIES, null);
-        }
-
-        if (propertyId.equals(PROPERTY_PIPCONFIG)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPGroupItem((PDPGroup) itemId), PDPITEM_PIPCONFIG, null);
-        }
-        
-        return null;
-	}
-
-	@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_DESCRIPTION)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_DEFAULT)) {
-            return Boolean.class;
-        }
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return Resource.class;
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_PDPS)) {
-            return Set.class;
-        }
-        if (propertyId.equals(PROPERTY_POLICIES)) {
-            return Set.class;
-        }
-        if (propertyId.equals(PROPERTY_PIPCONFIG)) {
-            return Set.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		return this.groups.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("containsId: " + itemId);
-		}
-		if (this.isSupported(itemId) == false) {
-			return false;
-		}
-		return this.groups.contains(itemId);
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("PDP Container cannot add a given item.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("PDP Container cannot add a given item.");
-	}
-	
-	public void addNewGroup(String name, String description) throws NullPointerException, PAPException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addNewGroup " + name + " " + description);
-		}
-		this.papEngine.newGroup(name, description);
-	}
-	
-	public void addNewPDP(String id, PDPGroup group, String name, String description) throws NullPointerException, PAPException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addNewPDP " + id + " " + name + " " + description);
-		}
-		this.papEngine.newPDP(id, group, name, description);
-	}
-	
-	public void movePDP(PDP pdp, PDPGroup group) {
-		try {
-			this.papEngine.movePDP(pdp, group);
-		} catch (PAPException e) {
-			String message = "Unable to move PDP to new group on server: " + e;
-			logger.error(message, e);
-		}
-	}
-
-	@Override
-	public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot add a container property.");
-	}
-
-	@Override
-	public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot remove a container property.");
-	}
-
-	@Override
-	public boolean removeAllItems() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("PDP Container cannot remove all items. You must have at least the Default group.");
-	}
-
-	@Override
-	public void addItemSetChangeListener(ItemSetChangeListener listener) {
-        if (getItemSetChangeListeners() == null) {
-            setItemSetChangeListeners(new LinkedList<Container.ItemSetChangeListener>());
-        }
-        getItemSetChangeListeners().add(listener);	
-	}
-
-	@Override
-	public Object nextItemId(Object itemId) {
-		if (this.isSupported(itemId) == false) {
-			return null;
-		}
-		int index = this.groups.indexOf(itemId);
-		if (index == -1) {
-			//
-			// We don't know this group
-			//
-			return null;
-		}
-		//
-		// Is it the last one?
-		//
-		if (index == this.groups.size() - 1) {
-			//
-			// Yes
-			//
-			return null;
-		}
-		//
-		// Return the next one
-		//
-		return this.groups.get(index + 1);
-	}
-
-	@Override
-	public Object prevItemId(Object itemId) {
-		if (this.isSupported(itemId) == false) {
-			return null;
-		}
-		int index = this.groups.indexOf(itemId);
-		if (index == -1) {
-			//
-			// We don't know this group
-			//
-			return null;
-		}
-		//
-		// Is it the first one?
-		//
-		if (index == 0) {
-			//
-			// Yes
-			//
-			return null;
-		}
-		//
-		// Return the previous one
-		//
-		return this.groups.get(index - 1);
-	}
-
-	@Override
-	public Object firstItemId() {
-		synchronized (this.groups) {
-			if (this.groups.size() > 0) {
-				return this.groups.get(0);
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public Object lastItemId() {
-		synchronized (this.groups) {
-			if (this.groups.size() > 0) {
-				return this.groups.get(this.groups.size() - 1);
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public boolean isFirstId(Object itemId) {
-		synchronized (this.groups) {
-			if (this.groups.size() > 0) {
-				return this.groups.get(0).equals(itemId);
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isLastId(Object itemId) {
-		synchronized (this.groups) {
-			if (this.groups.size() > 0) {
-				return this.groups.get(this.groups.size() - 1).equals(itemId);
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering.");
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot addItemAfter, there really is no real ordering.");
-	}
-
-	@Override
-	public int indexOfId(Object itemId) {
-		return this.groups.indexOf(itemId);
-	}
-
-	@Override
-	public Object getIdByIndex(int index) {
-		return this.groups.get(index);
-	}
-
-	@Override
-	public List<?> getItemIds(int startIndex, int numberOfItems) {
-		synchronized (this.groups) {
-			int endIndex = startIndex + numberOfItems;
-			if (endIndex > this.groups.size()) {
-				endIndex = this.groups.size() - 1;
-			}
-			return this.groups.subList(startIndex, endIndex);
-		}
-	}
-
-	@Override
-	public Object addItemAt(int index) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot addItemAt");
-	}
-
-	@Override
-	public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot addItemAt");
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeItem: " + itemId);
-		}
-		if (this.isSupported(itemId) == false) {
-			return false;
-		}
-		//
-		// You cannot remove the default group
-		//
-		if (((PDPGroup) itemId).getId().equals("Default")) {
-			throw new UnsupportedOperationException("You can't remove the Default Group.");
-		}
-		//
-		// Remove PDPGroup and  move any PDP's in it into the default group
-		//
-		try {
-			this.papEngine.removeGroup((PDPGroup) itemId, this.papEngine.getDefaultGroup());
-			return true;
-		} catch (NullPointerException | PAPException e) {
-			logger.error("Failed to remove group", e);
-		}
-		return false;
-	}
-
-	public class PDPGroupItem implements Item {
-		private static final long serialVersionUID = 1L;
-		
-		private final PDPGroup group;
-		
-		public PDPGroupItem(PDPGroup itemId) {
-			this.group = itemId;
-		}
-
-		public String getId() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getId: " + this.group);
-			}
-			return this.group.getId();
-		}
-		
-		public String getName() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getName: " + this.group);
-			}
-			return this.group.getName();
-		}
-		
-		public String getDescription() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getDescription: " + this.group);
-			}
-			return this.group.getDescription();
-		}
-		
-		public Boolean getDefault() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getDefault: " + this.group);
-			}
-			return this.group.isDefaultGroup();
-		}
-		
-        public Resource getIcon() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getIcon: " + this.group);
-			}
-        	return null;
-        }
-        
-        public String	getStatus() {
-			return this.group.getStatus().getStatus().toString();
-        }
-        
-        public Set<PDP>		getPDPs() {
-        	return Collections.unmodifiableSet(this.group.getPdps());
-        }
-        
-        public Set<PDPPolicy> getPolicies() {
- 			if (logger.isTraceEnabled()) {
-				logger.trace("getPolicies: " + this.group);
-			}
- 			return this.group.getPolicies();
-        }
-        
-        public Set<PDPPIPConfig> getPipConfigs() {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getPIPConfigs: " + this.group);
-			}
-			return this.group.getPipConfigs();
-        }
-        
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(this.group, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-	        return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property) throws UnsupportedOperationException {
-			throw new UnsupportedOperationException("PDP container does not support adding new properties");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id)
-				throws UnsupportedOperationException {
-            throw new UnsupportedOperationException(
-                    "PDP container does not support property removal");
-		}	
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java
deleted file mode 100644
index aa2fb87..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPIPContainer.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.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.Properties;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.api.pip.PIPException;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class PDPPIPContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(PDPPIPContainer.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 "Description" property.
-     */
-    public static String PROPERTY_DESCRIPTION = "Description";
-    
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> PDPPIP_PROPERTIES;
-
-    private final static Method PDPPIPITEM_ID;
-    
-    private final static Method PDPPIPITEM_NAME;
-    
-    private final static Method PDPPIPITEM_DESCRIPTION;
-    
-    static {
-    	PDPPIP_PROPERTIES = new ArrayList<String>();
-    	PDPPIP_PROPERTIES.add(PROPERTY_ID);
-    	PDPPIP_PROPERTIES.add(PROPERTY_NAME);
-    	PDPPIP_PROPERTIES.add(PROPERTY_DESCRIPTION);
-    	PDPPIP_PROPERTIES = Collections.unmodifiableCollection(PDPPIP_PROPERTIES);
-        try {
-        	PDPPIPITEM_ID = PDPPIPItem.class.getMethod("getId", new Class[]{});
-        	PDPPIPITEM_NAME = PDPPIPItem.class.getMethod("getName", new Class[]{});
-        	PDPPIPITEM_DESCRIPTION = PDPPIPItem.class.getMethod("getDescription", new Class[] {});
-       } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PDPPIPContainer");
-        }
-    }
-    
-    private final Object data;
-    
-    List<PIPConfiguration> configurations = new ArrayList<PIPConfiguration>();
- 
-	public PDPPIPContainer(Object data) {
-		super();
-		setContainer(this);
-		//
-		// Save our object
-		//
-		this.data = data;
-		//
-		// Is it supported?
-		//
-		if (this.isPDPGroup() == false && this.isPDP() == false) {
-			throw new IllegalArgumentException("This container only supported PDPGroup and PDP objects.");
-		}
-		//
-		// Initialize our internal structures
-		//
-		initialize();
-	}
-	
-	private boolean	isSupported(Object itemId) {
-		if (this.isConfiguration(itemId) ||
-			this.isResolver(itemId) ) {
-			return true;
-		}
-		return false;
-	}
-	
-	private boolean isPDPGroup() {
-		return this.data instanceof PDPGroup;
-	}
-
-	private boolean isPDP() {
-		return this.data instanceof PDP;
-	}
-	
-	private boolean isConfiguration(Object itemId) {
-		return itemId instanceof PIPConfiguration;
-	}
-	
-	private boolean isResolver(Object itemId) {
-		return itemId instanceof PIPResolver;
-	}
-	
-	private void initialize() {
-		assert this.data != null;
-		//
-		// Get the list of configurations
-		//
-		Set<PDPPIPConfig> configs = null;
-		if (this.isPDPGroup()) {
-			configs = ((PDPGroup) this.data).getPipConfigs();
-		} else if (this.isPDP()) {
-			configs = ((PDP) this.data).getPipConfigs();
-		} else {
-			throw new IllegalArgumentException("This container only supported PDPGroup and PDP objects.");
-		}
-		//
-		// Map these to a list of PIPConfiguration objects. That
-		// way we can match them up to the database.
-		//
-		for (PDPPIPConfig config : configs) {
-			Properties properties = new Properties();
-			properties.putAll(config.getConfiguration());
-			try {
-				PIPConfiguration pipConfig = new PIPConfiguration(config.getId(), properties);
-				if (logger.isDebugEnabled()) {
-					logger.debug("Found config: " + pipConfig);
-				}
-				this.configurations.add(pipConfig);
-			} catch (PIPException e) {
-				logger.error("Failed to create PIPConfiguration: " + e.getLocalizedMessage());
-			}
-		}
-	}
-	
-
-	public void refresh() {
-		this.configurations.clear();
-		this.initialize();
-		this.fireItemSetChange();
-	}
-	
-	@Override
-	public Item getItem(Object itemId) {
-		if (this.isSupported(itemId)) {
-			return new PDPPIPItem(itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return PDPPIP_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		for (PIPConfiguration config : this.configurations) {
-			items.add(config);
-			/*
-			for (PIPResolver resolver : config.getPipresolvers()) {
-				items.add(resolver);
-			}
-			*/
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (this.isSupported(itemId) == false) {
-			return null;
-		}
-		
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPPIPItem(itemId), PDPPIPITEM_ID, null);
-        }
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPPIPItem(itemId), PDPPIPITEM_NAME, null);
-        }
-        
-        if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PDPPIPItem(itemId), PDPPIPITEM_DESCRIPTION, null);
-        }
-        
-		return null;
-	}
-
-	@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_DESCRIPTION)) {
-            return String.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		/*
-		int size = 0;
-		for (PIPConfiguration config : this.configurations) {
-			size++;
-			size += config.getPipresolvers().size();
-		}
-		return size;
-		*/
-		return this.configurations.size();
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		//
-		// Let's try this by using the Id
-		//
-		for (PIPConfiguration config : this.configurations) {
-			if (this.isConfiguration(itemId)) {
-				if (((PIPConfiguration) itemId).getId() == config.getId()) {
-					return true;
-				}
-			} else if (this.isResolver(itemId)) {
-				for (PIPResolver resolver : config.getPipresolvers()) {
-					if (((PIPResolver) itemId).getId() == resolver.getId()) {
-						return true;
-					}
-				}				
-			} else {
-				throw new IllegalArgumentException("This container only supports pip configuration and resolvers objects.");
-			}
-		}
-		return false;
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		if (this.isConfiguration(itemId)) {
-			this.configurations.add((PIPConfiguration) itemId);
-		// } else if (this.isResolver(itemId)) {
-		}
-		throw new UnsupportedOperationException("Cannot add unsupported object.");
-	}
-
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot add unknown object.");
-	}
-
-	@Override
-	public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Adding properties not supported.");
-	}
-
-	@Override
-	public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Removing properties not supported.");
-	}
-
-	@Override
-	public boolean removeAllItems() throws UnsupportedOperationException {
-		//
-		// Remove everything
-		//
-		this.configurations.clear();
-		return true;
-	}
-
-	@Override
-	public Collection<?> getChildren(Object itemId) {
-		if (this.isConfiguration(itemId)) {
-			Collection<Object> children = new ArrayList<Object>();
-			for (PIPConfiguration config : this.configurations) {
-				if (config.getId() == ((PIPConfiguration) itemId).getId()) {
-					/*
-					 * Not for this release
-					 * 
-					children.addAll(config.getPipresolvers());
-					*/
-					break;
-				}
-			}
-			return Collections.unmodifiableCollection(children);
-		}
-		return Collections.emptyList();
-	}
-
-	@Override
-	public Object getParent(Object itemId) {
-		if (this.isResolver(itemId)) {
-			return ((PIPResolver) itemId).getPipconfiguration();
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> rootItemIds() {
-		Collection<Object> roots = new ArrayList<Object>();
-		roots.addAll(this.configurations);
-		return Collections.unmodifiableCollection(roots);
-	}
-
-	@Override
-	public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Not allowed in this implementation.");
-	}
-
-	@Override
-	public boolean areChildrenAllowed(Object itemId) {
-		if (this.isConfiguration(itemId)) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Cannot change which objects can or cannot have children.");
-	}
-
-	@Override
-	public boolean isRoot(Object itemId) {
-		if (this.isConfiguration(itemId)) {
-			return this.containsId(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public boolean hasChildren(Object itemId) {
-		if (this.isConfiguration(itemId)) {
-			//return ((PIPConfiguration) itemId).getPipresolvers().size() > 0;
-			//
-			// Not this implementation
-			return false;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Not allowed in this implementation.");
-		/*
-		if (this.isConfiguration(itemId)) {
-			return this.configurations.remove(itemId);
-		}
-		if (this.isResolver(itemId)) {
-			((PIPResolver) itemId).getPipconfiguration().removePipresolver((PIPResolver) itemId);
-		}
-		throw new UnsupportedOperationException("Object not supported by this container.");
-		*/
-	}
-
-	public class PDPPIPItem implements Item {
-		private static final long serialVersionUID = 1L;
-		
-		private final Object config;
-		
-		public PDPPIPItem(Object config) {
-			this.config = config;
-		}
-		
-		public String getId() {
-			if (this.config instanceof PIPConfiguration) {
-				return Integer.toString(((PIPConfiguration) this.config).getId());
-			}
-			if (this.config instanceof PIPResolver) {
-				return Integer.toString(((PIPResolver) this.config).getId());
-			}
-			return null;
-		}
-		
-		public String getName() {
-			if (this.config instanceof PIPConfiguration) {
-				return ((PIPConfiguration) this.config).getName();
-			}
-			if (this.config instanceof PIPResolver) {
-				return ((PIPResolver) this.config).getName();
-			}
-			return null;
-		}
-		
-		public String getDescription() {
-			if (this.config instanceof PIPConfiguration) {
-				return ((PIPConfiguration) this.config).getDescription();
-			}
-			if (this.config instanceof PIPResolver) {
-				return ((PIPResolver) this.config).getDescription();
-			}
-			return null;
-		}
-
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(config, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-	        return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property)
-				throws UnsupportedOperationException {
-			throw new UnsupportedOperationException("Cannot add property.");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id)
-				throws UnsupportedOperationException {
-			throw new UnsupportedOperationException("Cannot remove property.");
-		}	
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java
deleted file mode 100644
index bb015c1..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PDPPolicyContainer.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-
-public class PDPPolicyContainer extends ItemSetChangeNotifier implements Container.Indexed {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(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 static Method PDPPOLICYITEM_ID;
-    
-    private final static Method PDPPOLICYITEM_NAME;
-    
-    private final static Method PDPPOLICYITEM_VERSION;
-    
-    private final static Method PDPPOLICYITEM_DESCRIPTION;
-    
-    private final static Method PDPPOLICYITEM_ISROOT;
-    
-    private final static Method PDPPOLICYITEM_SETISROOT;
-   
-    static {
-    	PDPPOLICY_PROPERTIES = new ArrayList<String>();
-    	PDPPOLICY_PROPERTIES.add(PROPERTY_ID);
-    	PDPPOLICY_PROPERTIES.add(PROPERTY_NAME);
-    	PDPPOLICY_PROPERTIES.add(PROPERTY_VERSION);
-    	PDPPOLICY_PROPERTIES.add(PROPERTY_DESCRIPTION);
-    	PDPPOLICY_PROPERTIES.add(PROPERTY_ISROOT);
-    	PDPPOLICY_PROPERTIES = Collections.unmodifiableCollection(PDPPOLICY_PROPERTIES);
-        try {
-        	PDPPOLICYITEM_ID = PDPPolicyItem.class.getMethod("getId", new Class[]{});
-        	PDPPOLICYITEM_NAME = PDPPolicyItem.class.getMethod("getName", new Class[]{});
-        	PDPPOLICYITEM_VERSION = PDPPolicyItem.class.getMethod("getVersion", new Class[]{});
-        	PDPPOLICYITEM_DESCRIPTION = PDPPolicyItem.class.getMethod("getDescription", new Class[] {});
-        	PDPPOLICYITEM_ISROOT = PDPPolicyItem.class.getMethod("getRoot", new Class[] {});
-        	PDPPOLICYITEM_SETISROOT = PDPPolicyItem.class.getMethod("setRoot", new Class[] {Boolean.class});
-       } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PDPContainer");
-        }
-    }
-    
-    private final Object data;
-    private List<PDPPolicy> policies;
-    
-	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 {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId)
-			throws UnsupportedOperationException {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItem: " + itemId);
-		}
-		if (itemId instanceof PDPPolicy) {
-			return new PDPPolicyItem((PDPPolicy) itemId);
-		}
-		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 Property<?> getContainerProperty(Object itemId, Object propertyId) {
-		if (itemId instanceof PDPPolicy == false) {
-			return null;
-		}
-		
-		if (propertyId.equals(PROPERTY_ID)) {
-			return new MethodProperty<Object>(getType(propertyId),
-							new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ID, null);
-		}
-
-		if (propertyId.equals(PROPERTY_NAME)) {
-			return new MethodProperty<Object>(getType(propertyId),
-							new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_NAME, null);
-		}
-		
-		if (propertyId.equals(PROPERTY_VERSION)) {
-			return new MethodProperty<Object>(getType(propertyId),
-							new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_VERSION, null);
-		}
-
-		if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-			return new MethodProperty<Object>(getType(propertyId),
-							new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_DESCRIPTION, null);
-		}
-		
-		if (propertyId.equals(PROPERTY_ISROOT)) {
-			return new MethodProperty<Object>(getType(propertyId),
-							new PDPPolicyItem((PDPPolicy) itemId), PDPPOLICYITEM_ISROOT, PDPPOLICYITEM_SETISROOT);
-		}
-		
-		return null;
-	}
-
-	@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 Item addItem(Object itemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItem: " + itemId);
-		}
-		if (itemId instanceof PDPPolicy) {
-			this.policies.add((PDPPolicy) itemId);
-			return new PDPPolicyItem((PDPPolicy)itemId);
-		}
-		return null;
-	}
-
-	@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);
-		}
-		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 {
-		//this.policies = new ArrayList<PDPPolicy>();
-		//return true;
-		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;
-	}
-
-	@Override
-	public Item addItemAt(int index, Object newItemId)
-			throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItemAt: " + index + " " + newItemId);
-		}
-		return null;
-	}	
-	
-	public class PDPPolicyItem implements Item {
-		private static final long serialVersionUID = 1L;
-		
-		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);
-		}
-		
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(policy, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-	        return getContainerPropertyIds();
-		}
-
-		@Override
-		public boolean addItemProperty(Object id, @SuppressWarnings("rawtypes") Property property)
-				throws UnsupportedOperationException {
-	           throw new UnsupportedOperationException("PDP Policy container "
-	                    + "does not support adding new properties");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id)
-				throws UnsupportedOperationException {
-            throw new UnsupportedOperationException(
-                    "PDP Policy container does not support property removal");
-		}
-
-	}
-}
-
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java
deleted file mode 100644
index 247dcdd..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/model/PolicyContainer.java
+++ /dev/null
@@ -1,2096 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.model;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.bind.JAXBElement;
-
-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.AttributeDesignatorType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeSelectorType;
-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.FunctionType;
-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.PolicySetType;
-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.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.util.XACMLPolicyScanner;
-import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult;
-import com.google.gwt.thirdparty.guava.common.base.Splitter;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.util.MethodProperty;
-import com.vaadin.server.Resource;
-import com.vaadin.server.ThemeResource;
-import com.vaadin.ui.Table;
-
-public class PolicyContainer extends ItemSetChangeNotifier implements Container.Hierarchical, Container.Ordered, Container.ItemSetChangeNotifier {
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(PolicyContainer.class);
-	private final PolicyContainer self = this;
-	
-    /**
-     * String identifier of a file's "name" property.
-     */
-    public static String PROPERTY_NAME = "Name";
-
-    /**
-     * String identifier of a file's "id" property.
-     */
-    public static String PROPERTY_ID = "Id";
-
-    /**
-     * String identifier of a file's "short ID" property.
-     */
-    public static String PROPERTY_SHORTID = "ShortId";
-
-    /**
-     * String identifier of a file's "Algorithm" property.
-     */
-    public static String PROPERTY_ALGORITHM = "Algorithm";
-
-    /**
-     * String identifier of a file's "ShortAlgorithm" property.
-     */
-    public static String PROPERTY_SHORTALGORITHM = "ShortAlgorithm";
-
-    /**
-     * String identifier of a file's "Description" property.
-     */
-    public static String PROPERTY_DESCRIPTION = "Description";
-
-    /**
-     * String identifier of a file's "icon" property.
-     */
-    public static String PROPERTY_ICON = "Icon";
-
-    /**
-     * String identifier of a file's "Status" property.
-     */
-    public static String PROPERTY_STATUS = "Status";
-
-    /**
-     * String identifier of a file's "Attributes" property.
-     */
-    public static String PROPERTY_ATTRIBUTES = "Attributes";
-
-    /**
-     * List of the string identifiers for the available properties.
-     */
-    public static Collection<String> POLICY_PROPERTIES;
-
-    private final static Method POLICYITEM_NAME;
-    
-    private final static Method POLICYITEM_ID;
-
-    private final static Method POLICYITEM_SHORTID;
-
-    private final static Method POLICYITEM_ALGORITHM;
-
-    private final static Method POLICYITEM_SHORTALGORITHM;
-
-    private final static Method POLICYITEM_DESCRIPTION;
-
-    private final static Method POLICYITEM_ICON;
-    
-    private final static Method POLICYITEM_STATUS;
-    
-    private final static Method POLICYITEM_ATTRIBUTES;
-    
-    static {
-
-    	POLICY_PROPERTIES = new ArrayList<String>();
-    	POLICY_PROPERTIES.add(PROPERTY_NAME);
-    	POLICY_PROPERTIES.add(PROPERTY_ID);
-    	POLICY_PROPERTIES.add(PROPERTY_SHORTID);
-    	POLICY_PROPERTIES.add(PROPERTY_ALGORITHM);
-    	POLICY_PROPERTIES.add(PROPERTY_SHORTALGORITHM);
-    	POLICY_PROPERTIES.add(PROPERTY_DESCRIPTION);
-    	POLICY_PROPERTIES.add(PROPERTY_ICON);
-    	POLICY_PROPERTIES.add(PROPERTY_STATUS);
-    	POLICY_PROPERTIES.add(PROPERTY_ATTRIBUTES);
-    	POLICY_PROPERTIES = Collections.unmodifiableCollection(POLICY_PROPERTIES);
-        try {
-        	POLICYITEM_NAME = PolicyItem.class.getMethod("getName", new Class[]{});
-        	POLICYITEM_ID = PolicyItem.class.getMethod("getId", new Class[]{});
-        	POLICYITEM_SHORTID = PolicyItem.class.getMethod("getShortId", new Class[]{});
-        	POLICYITEM_ALGORITHM = PolicyItem.class.getMethod("getAlgorithm", new Class[] {});
-        	POLICYITEM_SHORTALGORITHM = PolicyItem.class.getMethod("getShortAlgorithm", new Class[] {});
-            POLICYITEM_DESCRIPTION = PolicyItem.class.getMethod("getDescription", new Class[] {});
-            POLICYITEM_ICON = PolicyItem.class.getMethod("getIcon", new Class[] {});
-            POLICYITEM_STATUS = PolicyItem.class.getMethod("getStatus", new Class[] {});
-            POLICYITEM_ATTRIBUTES = PolicyItem.class.getMethod("getAttributes", new Class[] {});
-        } catch (final NoSuchMethodException e) {
-            throw new RuntimeException(
-                    "Internal error finding methods in PolicyContainer");
-        }
-    }
-    
-    private final File file;
-    private Object root;
-    
-    private Map<PolicySetType, PolicySetType> policySets = new HashMap<PolicySetType, PolicySetType>();
-    private Map<PolicyType, PolicySetType> policies = new HashMap<PolicyType, PolicySetType>();
-    private Map<RuleType, PolicyType> rules = new HashMap<RuleType, PolicyType>();
-    private Map<TargetType, Object> targets = new HashMap<TargetType, Object>();
-    private Map<AnyOfType, TargetType> anyofs = new HashMap<AnyOfType, TargetType>();
-    private Map<AllOfType, AnyOfType> allofs = new HashMap<AllOfType, AnyOfType>();
-    private Map<MatchType, AllOfType> matches = new HashMap<MatchType, AllOfType>();
-    private Map<ObligationExpressionType, Object> obligations = new HashMap<ObligationExpressionType, Object>();
-    private Map<AdviceExpressionType, Object> advice = new HashMap<AdviceExpressionType, Object>();
-    private Map<ConditionType, RuleType> conditions = new HashMap<ConditionType, RuleType>();
-    private Map<VariableDefinitionType, PolicyType> variables = new HashMap<VariableDefinitionType, PolicyType>();
-        
-	public PolicyContainer(File file) throws IOException {
-		super();
-		this.setContainer(this);
-		this.file = file;
-		this.readData();
-		if (logger.isTraceEnabled()) {
-			logger.trace("New Policy Container: " + this.file.getName());
-		}
-	}
-	
-	private void readData() throws IOException {
-		Object data = null;
-		try (InputStream is = Files.newInputStream(Paths.get(this.file.getAbsolutePath()))) {
-			data = XACMLPolicyScanner.readPolicy(is);
-		} catch (IOException e) {
-			logger.error("Failed to load policy.");
-		}
-		XACMLPolicyScanner scanner = null;
-		if (data instanceof PolicySetType) {
-			this.root = data;
-			scanner = new XACMLPolicyScanner((PolicySetType) this.root);
-		} else if (data instanceof PolicyType) {
-			this.root = data;
-			scanner = new XACMLPolicyScanner((PolicyType) this.root);
-		} else {
-			if (data != null) {
-				logger.error("invalid root object: " + data.getClass().getCanonicalName());
-			} else {
-				logger.error("could not parse the file");
-			}
-			throw new IOException("Invalid Xacml Policy File");
-		}
-		scanner.scan(new XACMLPolicyScanner.SimpleCallback() {
-			
-			@Override
-			public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) {
-				self.addRule(parent, rule, false);
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicySet(PolicySetType parent,
-					PolicySetType policySet) {
-				self.addPolicySet(parent, policySet, false);
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicy(PolicySetType parent,
-					PolicyType policy) {
-				self.addPolicy(parent, policy, false);
-				return CallbackResult.CONTINUE;
-			}
-			
-		});
-	}
-	
-   private boolean	isObjectSupported(Object itemId) {
-       if (!(itemId instanceof PolicySetType) &&
-           	!(itemId instanceof PolicyType) &&
-           	!(itemId instanceof RuleType) &&
-           	!(itemId instanceof TargetType) &&
-           	!(itemId instanceof ObligationExpressionType) &&
-           	!(itemId instanceof AdviceExpressionType) &&
-           	!(itemId instanceof AnyOfType) &&
-           	!(itemId instanceof AllOfType) &&
-           	!(itemId instanceof MatchType) &&
-           	!(itemId instanceof ConditionType) &&
-           	!(itemId instanceof VariableDefinitionType)) {
-               return false;
-           }
-	   return true;
-   }
-
-	@Override
-	public Item getItem(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItem: " + itemId);
-		}
-        if (this.isObjectSupported(itemId) == false) {
-            return null;
-        }
-		return new PolicyItem(itemId);
-	}
-	
-	public Item updateItem(Object itemId) {
-        if (this.isObjectSupported(itemId) == false) {
-            return null;
-        }
-
-        this.fireItemSetChange();
-        
-        return new PolicyItem(itemId);
-	}
-	
-	public Map<VariableDefinitionType, PolicyType>	getVariables() {
-		return Collections.unmodifiableMap(this.variables);
-	}
-
-	@Override
-	public Collection<?> getContainerPropertyIds() {
-		return POLICY_PROPERTIES;
-	}
-
-	@Override
-	public Collection<?> getItemIds() {
-		XACMLPolicyScanner scanner = null;
-		final Collection<Object> items = new ArrayList<Object>();
-		if (this.root instanceof PolicyType) {
-			scanner = new XACMLPolicyScanner((PolicyType) this.root);
-		} else if (this.root instanceof PolicySetType) {
-			scanner = new XACMLPolicyScanner((PolicySetType) this.root);
-		} else {
-			return Collections.unmodifiableCollection(items);
-		}
-		
-		scanner.scan(new XACMLPolicyScanner.SimpleCallback() {
-			
-			@Override
-			public CallbackResult onPreVisitRule(PolicyType parent, RuleType rule) {
-				items.add(rule);
-				if (rule.getTarget() != null) {
-					items.add(rule.getTarget());
-				}
-				if (rule.getCondition() != null) {
-					items.add(rule.getCondition());
-				}
-				if (rule.getObligationExpressions() != null) {
-					items.addAll(rule.getObligationExpressions().getObligationExpression());
-				}
-				if (rule.getAdviceExpressions() != null) {
-					items.addAll(rule.getAdviceExpressions().getAdviceExpression());
-				}
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicySet(PolicySetType parent, PolicySetType policySet) {
-				items.add(policySet);
-				if (policySet.getTarget() != null) {
-					items.add(policySet.getTarget());
-				}
-				if (policySet.getObligationExpressions() != null) {
-					items.addAll(policySet.getObligationExpressions().getObligationExpression());
-				}
-				if (policySet.getAdviceExpressions() != null) {
-					items.addAll(policySet.getAdviceExpressions().getAdviceExpression());
-				}
-				return CallbackResult.CONTINUE;
-			}
-			
-			@Override
-			public CallbackResult onPreVisitPolicy(PolicySetType parent, PolicyType policy) {
-				items.add(policy);
-				if (policy.getTarget() != null) {
-					items.add(policy.getTarget());
-				}
-				if (policy.getObligationExpressions() != null) {
-					items.addAll(policy.getObligationExpressions().getObligationExpression());
-				}
-				if (policy.getAdviceExpressions() != null) {
-					items.addAll(policy.getAdviceExpressions().getAdviceExpression());
-				}
-				return CallbackResult.CONTINUE;
-			}
-			
-		});
-		if (logger.isTraceEnabled()) {
-			logger.trace("getItemIds: (" + items.size() + "):" + items);
-		}
-		return Collections.unmodifiableCollection(items);		
-	}
-
-	@Override
-	public Property<?> getContainerProperty(Object itemId, Object propertyId) {
-        if (this.isObjectSupported(itemId) == false) {
-            return null;
-        }
-
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_NAME, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_ID, null);
-        }
-
-        if (propertyId.equals(PROPERTY_SHORTID)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_SHORTID, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_ICON, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ALGORITHM)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_ALGORITHM, null);
-        }
-
-        if (propertyId.equals(PROPERTY_SHORTALGORITHM)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_SHORTALGORITHM, null);
-        }
-
-         if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_DESCRIPTION, null);
-        }
-
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_STATUS, null);
-        }
-
-        if (propertyId.equals(PROPERTY_ATTRIBUTES)) {
-            return new MethodProperty<Object>(getType(propertyId),
-                    new PolicyItem(itemId), POLICYITEM_ATTRIBUTES, null);
-        }
-
-        return null;
-	}
-
-	@Override
-	public Class<?> getType(Object propertyId) {
-		
-        if (propertyId.equals(PROPERTY_NAME)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ID)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_SHORTID)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ICON)) {
-            return Resource.class;
-        }
-        if (propertyId.equals(PROPERTY_DESCRIPTION)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ALGORITHM)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_SHORTALGORITHM)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_STATUS)) {
-            return String.class;
-        }
-        if (propertyId.equals(PROPERTY_ATTRIBUTES)) {
-            return Table.class;
-        }
-		return null;
-	}
-
-	@Override
-	public int size() {
-		int size = 0;
-		size += this.policySets.size();
-		size += this.policies.size();
-		size += this.rules.size();
-		size += this.targets.size();
-		size += this.obligations.size();
-		size += this.advice.size();
-		size += this.anyofs.size();
-		size += this.allofs.size();
-		size += this.matches.size();
-		size += this.conditions.size();
-		size += this.variables.size();
-		
-		return size;
-	}
-
-	@Override
-	public boolean containsId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("containsId: " + itemId);
-		}
-		if (itemId instanceof PolicySetType) {
-			if (this.root instanceof PolicySetType && ((PolicySetType) itemId).getPolicySetId().equals(((PolicySetType) this.root).getPolicySetId())) {
-				return true;
-			}
-			return this.policySets.containsKey(itemId);
-		}
-		if (itemId instanceof PolicyType) {
-			if (this.root instanceof PolicyType && ((PolicyType) itemId).getPolicyId().equals(((PolicyType) this.root).getPolicyId())) {
-				return true;
-			}
-			return this.policies.containsKey(itemId);
-		}
-		if (itemId instanceof RuleType) {
-			return this.rules.containsKey(itemId);
-		}
-		if (itemId instanceof TargetType) {
-			return this.targets.containsKey(itemId);
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return this.obligations.containsKey(itemId);
-		}
-		if (itemId instanceof AdviceExpressionType) {
-			return this.advice.containsKey(itemId);
-		}
-		if (itemId instanceof AnyOfType) {
-			return this.anyofs.containsKey(itemId);
-		}
-		if (itemId instanceof AllOfType) {
-			return this.allofs.containsKey(itemId);
-		}
-		if (itemId instanceof MatchType) {
-			return this.matches.containsKey(itemId);
-		}
-		if (itemId instanceof ConditionType) {
-			return this.conditions.containsKey(itemId);
-		}
-		if (itemId instanceof VariableDefinitionType) {
-			return this.variables.containsKey(itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public Item addItem(Object itemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Please use the addItem(Object, Object) method instead.");
-	}
-
-	/**
-	 * Add's the new Policy object under the parent. This method appends the item to the end
-	 * of the parent's list if applicable. If you want to add an item within a list, use the
-	 * addItemAfter() method instead.
-	 * 
-	 * @param itemId
-	 * @param parent
-	 * @return
-	 * @throws UnsupportedOperationException
-	 */
-	public Item addItem(Object itemId, Object parent) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItem: " + itemId);
-		}
-		if (itemId instanceof PolicySetType && parent instanceof PolicySetType) {
-			this.addPolicySet((PolicySetType) parent, (PolicySetType) itemId, true);
-		} else if (itemId instanceof PolicyType && parent instanceof PolicySetType) {
-			this.addPolicy((PolicySetType) parent, (PolicyType) itemId, true);
-		} else if (itemId instanceof RuleType && parent instanceof PolicyType) {
-			this.addRule((PolicyType) parent, (RuleType) itemId, true);
-		} else if (itemId instanceof TargetType && 
-				(parent instanceof PolicyType || 
-				parent instanceof PolicySetType || 
-				parent instanceof RuleType)) {
-			this.addTarget(parent, (TargetType) itemId, true);
-		} else if (itemId instanceof ObligationExpressionType ||
-					itemId instanceof ObligationExpressionsType) {
-			if (parent instanceof PolicyType || 
-				parent instanceof PolicySetType || 
-				parent instanceof RuleType ||
-				parent instanceof ObligationExpressionsType) {
-				if (itemId instanceof ObligationExpressionType) {
-					this.addObligation(parent, (ObligationExpressionType) itemId, true);
-				} else {
-					this.addObligations(parent, (ObligationExpressionsType) itemId, true);
-				}
-			}
-		} else if (itemId instanceof AdviceExpressionType ||
-					itemId instanceof AdviceExpressionsType) {
-			if (parent instanceof PolicyType || 
-				parent instanceof PolicySetType || 
-				parent instanceof RuleType ||
-				parent instanceof AdviceExpressionsType) {
-				if (itemId instanceof AdviceExpressionType) {
-					this.addAdvice(parent, (AdviceExpressionType) itemId, true);
-				} else {
-					this.addAdvice(parent, (AdviceExpressionsType) itemId, true);
-				}
-			}
-		} else if (itemId instanceof AnyOfType && parent instanceof TargetType) {
-			this.addAnyOf((TargetType) parent, (AnyOfType) itemId, true);
-		} else if (itemId instanceof AllOfType && parent instanceof AnyOfType) {
-			this.addAllOf((AnyOfType) parent, (AllOfType) itemId, true);
-		} else if (itemId instanceof MatchType && parent instanceof AllOfType) {
-			this.addMatch((AllOfType) parent, (MatchType) itemId, true);
-		} else if (itemId instanceof ConditionType && parent instanceof RuleType) {
-			this.addCondition((RuleType) parent, (ConditionType) itemId, true);
-		} else if (itemId instanceof VariableDefinitionType && parent instanceof PolicyType) {
-			this.addVariable((PolicyType) parent, (VariableDefinitionType) itemId, true);
-		} else {
-			throw new UnsupportedOperationException("Unknown itemid or parent type: " + itemId.getClass().getCanonicalName() + " " + parent.getClass().getCanonicalName());
-		}
-		//
-		// Fire update event
-		//
-		this.fireItemSetChange();
-		//
-		// Create a new item
-		//
-		return new PolicyItem(itemId);
-	}
-	
-	private void addVariable(PolicyType policy, VariableDefinitionType variable, boolean add) {
-		if (add) {
-			if (policy == null) {
-				throw new NullPointerException();
-			}
-			policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(variable);
-		}
-		this.variables.put(variable, policy);
-	}
-
-	private void addCondition(RuleType rule, ConditionType condition, boolean add) {
-		if (add) {
-			if (rule == null) {
-				throw new NullPointerException();
-			}
-			rule.setCondition(condition);
-		}
-		this.conditions.put(condition, rule);
-	}
-
-	private void addPolicySet(PolicySetType parent, PolicySetType policySet, boolean add) {
-		if (policySet == null) {
-			throw new NullPointerException();
-		}
-		if (parent == null && this.isRoot(policySet) == false) {
-			logger.warn("adding a non-root policy set with no parent");
-			return;
-		}
-		if (add) {
-			if (parent == null) {
-				throw new NullPointerException();
-			}
-			parent.getPolicySetOrPolicyOrPolicySetIdReference().add(new ObjectFactory().createPolicySet(policySet));
-		}
-		this.policySets.put(policySet, parent);
-		this.addTarget(policySet, policySet.getTarget(), false);
-		this.addObligations(policySet, policySet.getObligationExpressions(), false);
-		this.addAdvice(policySet, policySet.getAdviceExpressions(), false);
-	}
-	
-	private void addPolicy(PolicySetType parent, PolicyType policy, boolean add) {
-		if (policy == null) {
-			throw new NullPointerException();
-		}
-		if (parent == null && this.isRoot(policy) == false) {
-			logger.warn("adding a non-root policy with no parent");
-			return;
-		}
-		if (add) {
-			if (parent == null) {
-				throw new NullPointerException();
-			}
-			parent.getPolicySetOrPolicyOrPolicySetIdReference().add(new ObjectFactory().createPolicy(policy));
-		}
-		this.policies.put(policy, parent);
-		this.addTarget(policy, policy.getTarget(), false);
-		this.addObligations(policy, policy.getObligationExpressions(), false);
-		this.addAdvice(policy, policy.getAdviceExpressions(), false);
-		for (Object obj : policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition()) {
-			if (obj instanceof VariableDefinitionType) {
-				this.addVariable(policy, (VariableDefinitionType) obj, false);
-			}
-		}
-	}
-	
-	private void addRule(PolicyType parent, RuleType rule, boolean add) {
-		if (rule == null) {
-			throw new NullPointerException("Rule can't be null");
-		}
-		if (parent == null) {
-			throw new NullPointerException("Parent policy can't be null");
-		}
-		if (this.isRoot(parent) == false && this.policies.get(parent) == null) {
-			logger.warn("Could NOT find parent as root or in map: " + parent);
-			return;
-		}
-		if (add) {
-			parent.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().add(rule);
-		}
-		this.rules.put(rule, parent);
-		this.addTarget(rule, rule.getTarget(), false);
-		this.addObligations(rule, rule.getObligationExpressions(), false);
-		this.addAdvice(rule, rule.getAdviceExpressions(), false);
-		this.addCondition(rule, rule.getCondition(), add);
-	}
-	
-	private void addTarget(Object parent, TargetType target, boolean add) {
-		if (target == null) {
-			logger.error("TargetType is NULL");
-			return;
-		}
-		if (add) {
-			if (parent == null) {
-				throw new NullPointerException();
-			}
-			if (parent instanceof PolicySetType) {
-				((PolicySetType) parent).setTarget(target);
-			} else if (parent instanceof PolicyType) {
-				((PolicyType) parent).setTarget(target);
-			} else if (parent instanceof RuleType) {
-				((RuleType) parent).setTarget(target);
-			} else {
-				logger.error("Adding target to unknown class: " + parent.getClass().getCanonicalName());
-			}
-		}
-		this.targets.put(target, parent);
-		this.addAnyOfs(target);
-	}
-	
-	private void addAnyOfs(TargetType target) {
-		for (AnyOfType anyof : target.getAnyOf()) {
-			this.anyofs.put(anyof, target);
-			this.addAllOfs(anyof);
-		}
-	}
-	
-	private void addAnyOf(TargetType target, AnyOfType anyof, boolean add) {
-		if (add) {
-			target.getAnyOf().add(anyof);
-		}
-		this.anyofs.put(anyof, target);
-	}
-	
-	private void addAllOfs(AnyOfType anyof) {
-		for (AllOfType allof : anyof.getAllOf()) {
-			this.allofs.put(allof, anyof);
-			this.addMatches(allof);
-		}
-	}
-	
-	private void addAllOf(AnyOfType anyof, AllOfType allof, boolean add) {
-		if (add) {
-			anyof.getAllOf().add(allof);
-		}
-		this.allofs.put(allof, anyof);
-	}
-	
-	private void addMatches(AllOfType allofs) {
-		for (MatchType match : allofs.getMatch()) {
-			this.matches.put(match, allofs);
-		}
-	}
-
-	private void addMatch(AllOfType allofs, MatchType match, boolean add) {
-		if (add) {
-			allofs.getMatch().add(match);
-		}
-		this.matches.put(match, allofs);
-	}
-
-	private void addObligations(Object parent, ObligationExpressionsType expressions, boolean bAdd) {
-		if (expressions == null || expressions.getObligationExpression() == null) {
-			return;
-		}
-		if (bAdd) {
-			if (parent instanceof PolicySetType) {
-				((PolicySetType) parent).setObligationExpressions(expressions);
-			} else if (parent instanceof PolicyType) {
-				((PolicyType) parent).setObligationExpressions(expressions);
-			} else if (parent instanceof RuleType) {
-				((RuleType) parent).setObligationExpressions(expressions);
-			}
-		}
-		for (ObligationExpressionType expression : expressions.getObligationExpression()) {
-			this.obligations.put(expression, parent);
-		}
-	}
-	
-	private void addObligation(Object parent, ObligationExpressionType expression, boolean bAdd) {
-		ObligationExpressionsType expressions = null;
-		if (parent instanceof PolicySetType) {
-			expressions = ((PolicySetType) parent).getObligationExpressions();
-			if (expressions == null) {
-				expressions = new ObligationExpressionsType();
-				((PolicySetType) parent).setObligationExpressions(expressions);
-			}
-		} else if (parent instanceof PolicyType) {
-			expressions = ((PolicyType) parent).getObligationExpressions();
-			if (expressions == null) {
-				expressions = new ObligationExpressionsType();
-				((PolicyType) parent).setObligationExpressions(expressions);
-			}
-		} else if (parent instanceof RuleType) {
-			expressions = ((RuleType) parent).getObligationExpressions();
-			if (expressions == null) {
-				expressions = new ObligationExpressionsType();
-				((RuleType) parent).setObligationExpressions(expressions);
-			}
-		} else if (parent instanceof ObligationExpressionsType) {
-			expressions = (ObligationExpressionsType) parent;
-			if (bAdd) {
-				expressions.getObligationExpression().add(expression);
-			}
-			parent = this.getParent(expressions);
-			this.obligations.put(expression, parent);
-			return;
-		}
-		if (bAdd) {
-			expressions.getObligationExpression().add(expression);
-		}
-		this.obligations.put(expression, parent);
-	}
-	
-	private void addAdvice(Object parent, AdviceExpressionsType expressions, boolean bAdd) {
-		if (expressions == null || expressions.getAdviceExpression() == null) {
-			return;
-		}
-		if (bAdd) {
-			if (parent instanceof PolicySetType) {
-				((PolicySetType) parent).setAdviceExpressions(expressions);
-			} else if (parent instanceof PolicyType) {
-				((PolicyType) parent).setAdviceExpressions(expressions);
-			} else if (parent instanceof RuleType) {
-				((RuleType) parent).setAdviceExpressions(expressions);
-			}
-		}
-		for (AdviceExpressionType expression : expressions.getAdviceExpression()) {
-			this.advice.put(expression, parent);
-		}
-	}
-	
-	private void addAdvice(Object parent, AdviceExpressionType expression, boolean bAdd) {
-		AdviceExpressionsType expressions = null;
-		if (parent instanceof PolicySetType) {
-			expressions = ((PolicySetType) parent).getAdviceExpressions();
-			if (expressions == null) {
-				expressions = new AdviceExpressionsType();
-				((PolicySetType) parent).setAdviceExpressions(expressions);
-			}
-		} else if (parent instanceof PolicyType) {
-			expressions = ((PolicyType) parent).getAdviceExpressions();
-			if (expressions == null) {
-				expressions = new AdviceExpressionsType();
-				((PolicyType) parent).setAdviceExpressions(expressions);
-			}
-		} else if (parent instanceof RuleType) {
-			expressions = ((RuleType) parent).getAdviceExpressions();
-			if (expressions == null) {
-				expressions = new AdviceExpressionsType();
-				((RuleType) parent).setAdviceExpressions(expressions);
-			}
-		} else if (parent instanceof AdviceExpressionsType) {
-			expressions = (AdviceExpressionsType) parent;
-			if (bAdd) {
-				expressions.getAdviceExpression().add(expression);
-			}
-			parent = this.getParent(expressions);
-			this.advice.put(expression, parent);
-			return;
-		}
-		if (bAdd) {
-			expressions.getAdviceExpression().add(expression);
-		}
-		this.advice.put(expression, parent);
-	}
-	
-	@Override
-	public Object addItem() throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Policy Container cannot add an unknown item.");
-	}
-
-	@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 {
-		throw new UnsupportedOperationException("Policy Container cannot remove all items. You must have a base Policy or Policy Set.");
-	}
-
-	@Override
-	public Collection<?> getChildren(Object itemId) {
-		final Collection<Object> items = new ArrayList<Object>();
-		
-		if (itemId instanceof PolicySetType) {
-			PolicySetType policySet = (PolicySetType) itemId;
-			if (policySet.getTarget() != null) {
-				items.add(policySet.getTarget());
-			}
-			if (policySet.getObligationExpressions() != null) {
-				items.addAll(policySet.getObligationExpressions().getObligationExpression());
-			}
-			if (policySet.getAdviceExpressions() != null) {
-				items.addAll(policySet.getAdviceExpressions().getAdviceExpression());
-			}
-			List<JAXBElement<?>> children = policySet.getPolicySetOrPolicyOrPolicySetIdReference();
-			for (JAXBElement<?> element : children) {
-				if (element.getName().getLocalPart().equals("PolicySet")) {
-					items.add(element.getValue());
-				} else if (element.getName().getLocalPart().equals("Policy")) {
-					items.add(element.getValue());
-				}
-			}
-		} else if (itemId instanceof PolicyType) {
-			PolicyType policy = (PolicyType) itemId;
-			if (policy.getTarget() != null) {
-				items.add(policy.getTarget());
-			}
-			List<Object> objs = policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition();
-			for (Object obj : objs) {
-				if (obj instanceof VariableDefinitionType) {
-					items.add(obj);
-				} else if (obj instanceof RuleType) {
-					items.add(obj);
-				}
-			}
-			if (policy.getObligationExpressions() != null) {
-				items.addAll(policy.getObligationExpressions().getObligationExpression());
-			}
-			if (policy.getAdviceExpressions() != null) {
-				items.addAll(policy.getAdviceExpressions().getAdviceExpression());
-			}
-		} else if (itemId instanceof RuleType) {
-			RuleType rule = (RuleType) itemId;
-			if (rule.getTarget() != null) {
-				items.add(rule.getTarget());
-			}
-			if (rule.getCondition() != null) {
-				items.add(rule.getCondition());
-			}
-			if (rule.getObligationExpressions() != null) {
-				items.addAll(((RuleType) itemId).getObligationExpressions().getObligationExpression());
-			}
-			if (rule.getAdviceExpressions() != null) {
-				items.addAll(rule.getAdviceExpressions().getAdviceExpression());
-			}
-		} else if (itemId instanceof TargetType) {
-			for (AnyOfType anyof : ((TargetType) itemId).getAnyOf()) {
-				items.add(anyof);
-			}
-		} else if (itemId instanceof AnyOfType) {
-			for (AllOfType allof : ((AnyOfType) itemId).getAllOf()) {
-				items.add(allof);
-			}
-		} else if (itemId instanceof AllOfType) {
-			for (MatchType match : ((AllOfType) itemId).getMatch()) {
-				items.add(match);
-			}
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("getChildren: " + itemId + "(" + items.size() + ") " + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-
-	@Override
-	public Object getParent(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("getParent: " + itemId);
-		}
-		assert itemId != null;
-		if (itemId == null) {
-			logger.fatal("getParent called with NULL object");
-			return null;
-		}
-		if (itemId.equals(this.root)) {
-			if (logger.isTraceEnabled()) {
-				logger.trace("getParent is the root");
-			}
-			return null;
-		}
-		if (itemId instanceof PolicySetType) {
-			return this.policySets.get(itemId);
-		}
-		if (itemId instanceof PolicyType) {
-			return this.policies.get(itemId);
-		}
-		if (itemId instanceof RuleType) {
-			return this.rules.get(itemId);
-		}
-		if (itemId instanceof TargetType) {
-			return this.targets.get(itemId);
-		}
-		if (itemId instanceof ObligationExpressionType) {
-			return this.obligations.get(itemId);
-		}
-		if (itemId instanceof AdviceExpressionType) {
-			return this.advice.get(itemId);
-		}
-		if (itemId instanceof AllOfType) {
-			return this.allofs.get(itemId);
-		}
-		if (itemId instanceof AnyOfType) {
-			return this.anyofs.get(itemId);
-		}
-		if (itemId instanceof MatchType) {
-			return this.matches.get(itemId);
-		}
-		if (itemId instanceof ConditionType) {
-			return this.conditions.get(itemId);
-		}
-		if (itemId instanceof VariableDefinitionType) {
-			return this.variables.get(itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Collection<?> rootItemIds() {
-		final Collection<Object> items = new ArrayList<Object>();
-		items.add(this.root);
-		if (logger.isTraceEnabled()) {
-			logger.trace("rootItemIds: " + items);
-		}
-		return Collections.unmodifiableCollection(items);
-	}
-	
-	@Override
-	public boolean setParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		boolean result = this.setItemParent(itemId, newParentId);
-		if (result == true) {
-			if (logger.isTraceEnabled()) {
-				logger.trace("setParent: " + itemId + " " + newParentId + " succeeded.");
-			}
-			this.fireItemSetChange();
-		}
-		return result;
-	}
-
-	protected boolean setItemParent(Object itemId, Object newParentId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setItemParent: " + itemId + " " + newParentId);
-		}
-		if (newParentId instanceof PolicySetType) {
-			return this.moveItemToPolicySet(itemId, (PolicySetType) newParentId);
-		}
-		if (newParentId instanceof PolicyType) {
-			return this.moveItemToPolicy(itemId, (PolicyType) newParentId);
-		}
-		if (newParentId instanceof RuleType) {
-			return this.moveItemToRule(itemId, (RuleType) newParentId);
-		}
-		if (newParentId instanceof TargetType) {
-			return this.moveItemToTarget(itemId, (TargetType) newParentId);
-		}
-		if (newParentId instanceof AnyOfType) {
-			return this.moveItemToAnyOf(itemId, (AnyOfType) newParentId);
-		}
-		if (newParentId instanceof AllOfType) {
-			return this.moveItemToAllOf(itemId, (AllOfType) newParentId);
-		}
-		return false;
-	}
-	
-	protected boolean moveItemToPolicySet(Object itemId, PolicySetType policySet) {
-		if (itemId instanceof PolicySetType) {
-			
-			if (this.doRemoveItem(itemId)) {
-				this.addPolicySet(policySet, (PolicySetType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof PolicyType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addPolicy(policySet, (PolicyType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof TargetType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addTarget(policySet, (TargetType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof ObligationExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addObligation(policySet, (ObligationExpressionType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof AdviceExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addAdvice(policySet, (AdviceExpressionType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to Policy Set: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-	
-	protected boolean moveItemToPolicy(Object itemId, PolicyType policy) {
-		if (itemId instanceof RuleType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addRule(policy, (RuleType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof TargetType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addTarget(policy, (TargetType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof ObligationExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addObligation(policy, (ObligationExpressionType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof AdviceExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addAdvice(policy, (AdviceExpressionType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof VariableDefinitionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addVariable(policy, (VariableDefinitionType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to Policy: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-	
-	protected boolean moveItemToRule(Object itemId, RuleType rule) {
-		if (itemId instanceof TargetType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addTarget(rule, (TargetType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof ObligationExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addObligation(rule, (ObligationExpressionType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof AdviceExpressionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addAdvice(rule, (AdviceExpressionsType) itemId, true);
-				return true;
-			}
-			return false;
-		} else if (itemId instanceof ConditionType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addCondition(rule, (ConditionType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to Rule: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-	
-	protected boolean moveItemToTarget(Object itemId, TargetType target) {
-		if (itemId instanceof AnyOfType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addAnyOf(target, (AnyOfType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to target: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-	
-	protected boolean moveItemToAnyOf(Object itemId, AnyOfType anyOf) {
-		if (itemId instanceof AllOfType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addAllOf(anyOf, (AllOfType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to anyOf: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-	
-	protected boolean moveItemToAllOf(Object itemId, AllOfType allOf) {
-		if (itemId instanceof MatchType) {
-			if (this.doRemoveItem(itemId)) {
-				this.addMatch(allOf, (MatchType) itemId, true);
-				return true;
-			}
-			return false;
-		}
-		logger.warn("Can't move this item to allOf: " + itemId.getClass().getCanonicalName());
-		return false;
-	}
-
-	@Override
-	public boolean areChildrenAllowed(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("areChildrenAllowed: " + itemId);
-		}
-		if (itemId instanceof MatchType ||
-			itemId instanceof ObligationExpressionType ||
-			itemId instanceof AdviceExpressionType ||
-			itemId instanceof ConditionType ||
-			itemId instanceof VariableDefinitionType) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public boolean setChildrenAllowed(Object itemId, boolean areChildrenAllowed)
-			throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setChildrenAllowed: " + itemId + " " + areChildrenAllowed);
-		}
-		if (itemId instanceof MatchType ||
-			itemId instanceof ObligationExpressionType ||
-			itemId instanceof AdviceExpressionType ||
-			itemId instanceof ConditionType ||
-			itemId instanceof VariableDefinitionType) {
-			if (areChildrenAllowed == true) {
-				return false;
-			}
-			return true;
-		}
-		if (areChildrenAllowed == false) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public boolean isRoot(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("isRoot: " + itemId);
-		}
-		assert itemId != null;
-		if (itemId == null) {
-			//
-			// This usually means the container's map's are screwed up.
-			//
-			logger.error("NULL isRoot item");
-			return false;
-		}
-		if (itemId instanceof PolicyType && this.root instanceof PolicyType && itemId.equals(this.root)) {
-			return true;
-		} else if (itemId instanceof PolicySetType && this.root instanceof PolicySetType && itemId.equals(this.root)) {
-			return true;
-		}
-		return false;
-	}
-
-	@Override
-	public boolean hasChildren(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("hasChildren: " + itemId);
-		}
-		if (itemId instanceof MatchType ||
-			itemId instanceof ObligationExpressionType ||
-			itemId instanceof AdviceExpressionType ||
-			itemId instanceof ConditionType ||
-			itemId instanceof VariableDefinitionType) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public boolean removeItem(Object itemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("removeItem: " + itemId);
-		}
-		boolean result = this.doRemoveItem(itemId);
-		if (result) {
-			this.fireItemSetChange();
-		}
-		return result;
-	}
-	
-	protected boolean doRemoveItem(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("doRemoveItem: " + itemId);
-		}
-		if (itemId instanceof PolicySetType) {
-			PolicySetType parent = this.policySets.get(itemId);
-			if (parent == null) {
-				logger.error("policy set not found in map");
-				assert false;
-				return false;
-			}
-			return this.removePolicySetFromPolicySet(parent, (PolicySetType) itemId);
-		} else if (itemId instanceof PolicyType) {
-			PolicySetType parent = this.policies.get(itemId);
-			if (parent == null) {
-				logger.error("policy not found in map");
-				assert false;
-				return false;
-			}
-			return this.removePolicyFromPolicySet(parent, (PolicyType) itemId);
-		} else if (itemId instanceof RuleType) {
-			PolicyType parent = this.rules.get(itemId);
-			if (parent == null) {
-				logger.error("rule not found in map");
-				assert false;
-				return false;
-			}
-			if (parent.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().remove(itemId)) {
-				this.removeRule((RuleType) itemId);
-				return true;
-			}
-			logger.error("Failed to remove rule from parent policy");
-			assert false;
-			return false;
-		} else if (itemId instanceof TargetType) {
-			throw new UnsupportedOperationException("Cannot remove TargetType directly - please remove it via PolicySet/Policy/Rule");
-		} else if (itemId instanceof ObligationExpressionType) {
-			Object parent = this.obligations.get(itemId);
-			if (parent == null) {
-				logger.error("obligation not found in map");
-				assert false;
-				return false;
-			}
-			if (parent instanceof PolicySetType) {
-				if (((PolicySetType) parent).getObligationExpressions() != null) {
-					if (((PolicySetType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) {
-						logger.error("Failed to remove obligation expression from policy set");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("policy set does not contain obligation expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else if (parent instanceof PolicyType) {
-				if (((PolicyType) parent).getObligationExpressions() != null) {
-					if (((PolicyType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) {
-						logger.error("Failed to remove obligation expression from policy");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("policy does not contain obligation expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else if (parent instanceof RuleType) {
-				if (((RuleType) parent).getObligationExpressions() != null) {
-					if (((RuleType) parent).getObligationExpressions().getObligationExpression().remove(itemId) == false) {
-						logger.error("Failed to remove obligation expression from policy set");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("rule does not contain obligation expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else {
-				logger.error("Unknown parent for obligation: " + parent.getClass().getCanonicalName());
-				assert false;
-				return false;
-			}
-			if (this.obligations.remove(itemId) == null) {
-				logger.error("obligation map does not contain itemId");
-				assert false;
-			}
-			return true;
-		} else if (itemId instanceof AdviceExpressionType) {
-			Object parent = this.advice.get(itemId);
-			if (parent == null) {
-				logger.error("advice not found in map");
-				assert false;
-				return false;
-			}
-			if (parent instanceof PolicySetType) {
-				if (((PolicySetType) parent).getAdviceExpressions() != null) {
-					if (((PolicySetType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) {
-						logger.error("Failed to remove advice expression from policy set");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("policy set does not contain advice expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else if (parent instanceof PolicyType) {
-				if (((PolicyType) parent).getAdviceExpressions() != null) {
-					if (((PolicyType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) {
-						logger.error("Failed to remove advice expression from policy");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("policy does not contain advice expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else if (parent instanceof RuleType) {
-				if (((RuleType) parent).getAdviceExpressions() != null) {
-					if (((RuleType) parent).getAdviceExpressions().getAdviceExpression().remove(itemId) == false) {
-						logger.error("Failed to remove advice expression from rule");
-						assert false;
-						return false;
-					}
-				} else {
-					logger.error("rule does not contain advice expressions, cannot remove");
-					assert false;
-					return false;
-				}
-			} else {
-				logger.error("Unknown parent for advice: " + parent.getClass().getCanonicalName());
-				assert false;
-				return false;
-			}
-			if (this.advice.remove((AdviceExpressionType) itemId) == null) {
-				logger.error("obligation map does not contain itemId");
-				assert false;
-			}
-			return true;
-		} else if (itemId instanceof AnyOfType) {
-			TargetType parent = this.anyofs.get(itemId);
-			if (parent == null) {
-				logger.error("anyof not found in map");
-				assert false;
-				return false;
-			}
-			if (parent.getAnyOf().remove(itemId)) {
-				this.removeAnyOf((AnyOfType) itemId);
-				return true;
-			} else {
-				logger.error("Failed to remove itemId from target");
-				assert false;
-				return false;
-			}
-		} else if (itemId instanceof AllOfType) {
-			AnyOfType parent = this.allofs.get(itemId);
-			if (parent == null) {
-				logger.error("allof not found in map");
-				assert false;
-				return false;
-			}
-			if (parent.getAllOf().remove(itemId)) {
-				this.removeAllOf((AllOfType) itemId);
-				return true;
-			} else {
-				logger.error("Failed to remove itemId from anyOf");
-				assert false;
-				return false;
-			}
-		} else if (itemId instanceof MatchType) {
-			AllOfType parent = this.matches.get(itemId);
-			if (parent == null) {
-				logger.error("match not found in map");
-				assert false;
-				return false;
-			}
-			if (parent.getMatch().remove(itemId)) {
-				this.removeMatch((MatchType) itemId);
-				return true;
-			} else {
-				logger.error("Failed to remove itemId from allOf");
-				assert false;
-				return false;
-			}
-		} else if (itemId instanceof ConditionType) {
-			RuleType rule = this.conditions.get(itemId);
-			if (rule != null) {
-				rule.setCondition(null);
-				if (this.conditions.remove(itemId) == null) {
-					logger.error("Failed to remove condition from map");
-					assert false;
-					return false;
-				}
-				return true;
-			} else {
-				logger.error("condition not found in map");
-				assert false;
-				return false;
-			}
-		} else if (itemId instanceof VariableDefinitionType) {
-			PolicyType policy = this.variables.get(itemId);
-			if (policy != null) {
-				if (policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition().remove(itemId)) {
-					if (this.variables.remove(itemId) == null) {
-						logger.error("failed to remove variable from map");
-						assert false;
-						return false;
-					}
-					return true;
-				} else {
-					logger.error("failed to remove variable from policy");
-					assert false;
-					return false;
-				}
-			} else {
-				logger.error("variable not found in map");
-				assert false;
-				return false;
-			}
-		}
-		logger.error("Failed to remove policy set from policy set, not found.");
-		return false;
-	}
-	
-	protected boolean removePolicyFromPolicySet(PolicySetType parent, PolicyType policy) {
-		for (JAXBElement<?> element : parent.getPolicySetOrPolicyOrPolicySetIdReference()) {
-			if (PolicyType.class.isAssignableFrom(element.getDeclaredType()) &&
-						((PolicyType) element.getValue()).getPolicyId().equals(policy.getPolicyId())) {
-				if (parent.getPolicySetOrPolicyOrPolicySetIdReference().remove(element)) {
-					this.removePolicy(policy);
-					return true;
-				}
-				logger.error("Failed to remove policy from parent policy set");
-				assert false;
-				return false;
-			}
-		}
-		logger.error("Failed to remove policy from policy set, not found.");
-		return false;
-	}
-
-	protected boolean removePolicySetFromPolicySet(PolicySetType parent, PolicySetType policySet) {
-		for (JAXBElement<?> element : parent.getPolicySetOrPolicyOrPolicySetIdReference()) {
-			if (PolicySetType.class.isAssignableFrom(element.getDeclaredType())) {
-				logger.info(element);
-				if (((PolicySetType) element.getValue()).getPolicySetId().equals(policySet.getPolicySetId())) {
-					if (parent.getPolicySetOrPolicyOrPolicySetIdReference().remove(element)) {
-						this.removePolicySet(policySet);
-						return true;
-					}
-					logger.error("Failed to remove policy set from parent policy set");
-					assert false;
-					return false;
-				}
-			}
-		}
-		return false;
-	}
-	
-	protected void removePolicySet(PolicySetType policySet) {
-		if (this.policySets.remove(policySet) == null) {
-			logger.warn("Failed to remove policy set from map: " + policySet);
-			return;
-		}
-		//
-		// Remove its objects from the other maps
-		//
-		this.removeTarget(policySet.getTarget());
-		this.removeObligations(policySet.getObligationExpressions());
-		this.removeAdvice(policySet.getAdviceExpressions());
-	}
-	
-	protected void removePolicy(PolicyType policy) {
-		if (this.policies.remove(policy) == null) {
-			logger.warn("Failed to remove policy from map: " + policy);
-			return;
-		}
-		//
-		// Remove its objects from the other maps
-		//
-		this.removeTarget(policy.getTarget());
-		this.removeObligations(policy.getObligationExpressions());
-		this.removeAdvice(policy.getAdviceExpressions());
-		this.removeVariables(policy.getCombinerParametersOrRuleCombinerParametersOrVariableDefinition());
-	}
-	
-	protected void removeVariables(List<Object> combinerParametersOrRuleCombinerParametersOrVariableDefinition) {
-		for (Object object : combinerParametersOrRuleCombinerParametersOrVariableDefinition) {
-			if (object instanceof VariableDefinitionType) {
-				this.variables.remove(object);
-			}
-		}
-	}
-
-	protected void removeRule(RuleType rule) {
-		if (this.rules.remove(rule) == null) {
-			logger.warn("Failed to remove rule from map: " + rule);
-			return;
-		}
-		//
-		// Remove its objects from the other maps
-		//
-		this.removeTarget(rule.getTarget());
-		this.removeObligations(rule.getObligationExpressions());
-		this.removeAdvice(rule.getAdviceExpressions());
-		if (rule.getCondition() != null) {
-			this.conditions.remove(rule.getCondition());
-		}
-	}
-	
-	protected void removeObligations(ObligationExpressionsType expressions) {
-		if (expressions == null) {
-			return;
-		}
-		for (ObligationExpressionType expression : expressions.getObligationExpression()) {
-			if (this.obligations.remove(expression) == null) {
-				logger.warn("Failed to remove obligation expression: " + expression);
-			}
-		}
-	}
-	
-	protected void removeAdvice(AdviceExpressionsType expressions) {
-		if (expressions == null) {
-			return;
-		}
-		for (AdviceExpressionType expression : expressions.getAdviceExpression()) {
-			if (this.advice.remove(expression) == null) {
-				logger.warn("Failed to remove advice expression: " + expression);
-			}
-		}
-	}
-	
-	protected void removeTarget(TargetType target) {
-		if (this.targets.remove(target) == null) {
-			logger.warn("Failed to remove target from map: " + target);
-			return;
-		}
-		for (AnyOfType anyof : target.getAnyOf()) {
-			this.removeAnyOf(anyof);
-		}
-	}
-	
-	protected void removeAnyOf(AnyOfType anyof) {
-		if (this.anyofs.remove(anyof) == null) {
-			logger.warn("failed to remove anyof from map: " + anyof);
-			return;
-		}
-		for (AllOfType allof : anyof.getAllOf()) {
-			this.removeAllOf(allof);
-		}
-	}
-	
-	protected void removeAllOf(AllOfType allof) {
-		if (this.allofs.remove(allof) == null) {
-			logger.warn("failed to remove allof from map: " + allof);
-			return;
-		}
-		for (MatchType match : allof.getMatch()) {
-			this.removeMatch(match);
-		}
-	}
-	
-	protected void removeMatch(MatchType match) {
-		if (this.matches.remove(match) == null) {
-			logger.warn("failed to remove match from map: " + match);
-			return;
-		}
-	}
-
-	@Override
-	public Object nextItemId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("nextItemId: " + itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Object prevItemId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("prevItemId: " + itemId);
-		}
-		return null;
-	}
-
-	@Override
-	public Object firstItemId() {
-		if (logger.isTraceEnabled()) {
-			logger.trace("firstItemId: ");
-		}
-		return this.root;
-	}
-
-	@Override
-	public Object lastItemId() {
-		if (logger.isTraceEnabled()) {
-			logger.trace("lastItemId: ");
-		}
-		return null;
-	}
-
-	@Override
-	public boolean isFirstId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("isFirstId: " + itemId);
-		}
-		//
-		// The Oasis classes do not have equals implemented. So I am
-		// not too sure that using equals works.
-		//
-		if (this.root != null && itemId != null) {
-			return this.root.equals(itemId);
-		}
-		if (logger.isTraceEnabled()) {
-			logger.trace("item is NOT the first ID" +  itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public boolean isLastId(Object itemId) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("isLastId: " + itemId);
-		}
-		return false;
-	}
-
-	@Override
-	public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException {
-		throw new UnsupportedOperationException("Need to know what you want added. Please use addItemAfter(Object, Object) instead.");
-	}
-
-	@Override
-	public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("addItemAfter: " + previousItemId + " new " + newItemId);
-		}
-		/*
-		if (newItemId instanceof PolicySetType) {
-			
-		}
-		//
-		// Get our parents
-		//
-		Object parentPreviousItem = this.getParent(previousItemId);
-		*/
-		return null;
-	}
-	
-	public Item moveAfterSibling(Object itemId, Object siblingId) throws UnsupportedOperationException {
-		if (logger.isTraceEnabled()) {
-			logger.trace("moveAfterSibling: " + itemId + " sibling " + siblingId);
-		}
-		//
-		// Get the parents, which should be the same
-		//
-		/*
-		Object itemParent = this.getParent(itemId);
-		Object siblingParent = this.getParent(siblingId);
-		if (itemParent == null) {
-			logger.error("can't move the root element");
-			return null;
-		}
-		if (itemParent != siblingParent) {
-			logger.error("parents are not the same");
-			return null;
-		}
-		if (itemId instanceof PolicySetType) {
-			assert(itemParent instanceof PolicySetType);
-			if (itemParent instanceof PolicySetType) {
-				if (siblingId instanceof PolicySetType || siblingId instanceof PolicyType) {
-					int index = ((PolicySetType) itemParent).getPolicySetOrPolicyOrPolicySetIdReference().indexOf(siblingId);
-					
-				}				
-			}
-		}
-		*/
-		return null;
-	}
-
-	/**
-	 * This class is returned to caller's to display the properties
-	 * for each policy object.
-	 * 
-	 * @author pameladragosh
-	 *
-	 */
-	public class PolicyItem implements Item {
-		private static final long serialVersionUID = 1L;
-		private final Object data;
-		
-		public PolicyItem(Object data) {
-			this.data = data;
-		}
-
-		public String getName() {
-			if (this.data instanceof RuleType) {
-				return "Rule";
-			}
-			if (this.data instanceof PolicyType) {
-				return "Policy";
-			}
-			if (this.data instanceof PolicySetType) {
-				return "Policy Set";
-			}
-			if (this.data instanceof TargetType) {
-				return "Target";
-			}
-			if (this.data instanceof AnyOfType) {
-				return "Any Of";
-			}
-			if (this.data instanceof AllOfType) {
-				return "All Of";
-			}
-			if (this.data instanceof MatchType) {
-				return "Match";
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return "Obligation";
-			}
-			if (this.data instanceof AdviceExpressionType) {
-				return "Advice";
-			}
-			if (this.data instanceof ConditionType) {
-				return "Condition";
-			}
-			if (this.data instanceof VariableDefinitionType) {
-				return "Variable";
-			}
-			return null;
-		}
-		
-		public String getId() {
-			if (this.data instanceof RuleType) {
-				return ((RuleType) this.data).getRuleId();
-			} 
-			if (this.data instanceof PolicyType) {
-				return ((PolicyType) this.data).getPolicyId();
-			}
-			if (this.data instanceof PolicySetType) {
-				return ((PolicySetType) this.data).getPolicySetId();
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return ((ObligationExpressionType) this.data).getObligationId();
-			}
-			if (this.data instanceof AdviceExpressionType) {
-				return ((AdviceExpressionType) this.data).getAdviceId();
-			}
-			/*
-			if (this.data instanceof TargetType) {
-				return this.data.toString();
-			}
-			if (this.data instanceof AnyOfType) {
-				return this.data.toString();
-			}
-			if (this.data instanceof AllOfType) {
-				return this.data.toString();
-			}
-			if (this.data instanceof MatchType) {
-				((MatchType) this.data).getMatchId();
-			}
-			*/
-			if (this.data instanceof VariableDefinitionType) {
-				((VariableDefinitionType) this.data).getVariableId();
-			}
-			return null;
-		}
-		
-		public String getShortId() {
-			String id = this.getId();
-			if (id == null) {
-				return null;
-			}
-			String[] parts = id.split("[:]");
-			
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-			
-			return null;
-		}
-		
-		public String getDescription() {
-			if (this.data instanceof RuleType) {
-				return ((RuleType) this.data).getDescription();
-			} else if (this.data instanceof PolicyType) {
-				return ((PolicyType) this.data).getDescription();
-			} else if (this.data instanceof PolicySetType) {
-				return ((PolicySetType) this.data).getDescription();
-			} else if (this.data instanceof MatchType) {
-				StringBuilder builder = new StringBuilder();
-				AttributeValueType value = ((MatchType) this.data).getAttributeValue();
-				if (value != null) {
-					builder.append(value.getContent());
-					builder.append(" ");
-				}
-				String alg = this.getShortAlgorithm();
-				if (alg != null && alg.length() > 0) {
-					builder.append(alg);
-					builder.append(" ");
-				}
-				if (((MatchType) this.data).getAttributeDesignator() != null) {
-					builder.append(((MatchType) this.data).getAttributeDesignator().getAttributeId());
-				} else if (((MatchType) this.data).getAttributeSelector() != null) {
-					builder.append(((MatchType) this.data).getAttributeSelector().getContextSelectorId());
-				}
-				return builder.toString();
-			}
-			return null;
-		}
-		
-		public String getAlgorithm() {
-			if (this.data instanceof PolicyType) {
-				return ((PolicyType) this.data).getRuleCombiningAlgId();
-			}
-			if (this.data instanceof PolicySetType) {
-				return ((PolicySetType) this.data).getPolicyCombiningAlgId();
-			}
-			if (this.data instanceof RuleType) {
-				return ((RuleType) this.data).getEffect().toString();
-			}
-			if (this.data instanceof MatchType) {
-				return ((MatchType) this.data).getMatchId();
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return ((ObligationExpressionType) this.data).getFulfillOn().toString();
-			}
-			if (this.data instanceof AdviceExpressionType) {
-				return ((AdviceExpressionType) this.data).getAppliesTo().toString();
-			}
-			if (this.data instanceof ConditionType) {
-				return this.getRootExpressionFunction(((ConditionType) this.data).getExpression());
-			}
-			if (this.data instanceof VariableDefinitionType) {
-				//return this.getRootExpressionFunction(((VariableDefinitionType) this.data).getExpression());
-				return ((VariableDefinitionType) this.data).getVariableId();
-			}
-			return null;
-		}
-		
-		public String getShortAlgorithm() {
-			String algorithm = null;
-			if (this.data instanceof PolicyType) {
-				algorithm = ((PolicyType) this.data).getRuleCombiningAlgId();
-			}
-			if (this.data instanceof PolicySetType) {
-				algorithm = ((PolicySetType) this.data).getPolicyCombiningAlgId();
-			}
-			if (this.data instanceof RuleType) {
-				return ((RuleType) this.data).getEffect().toString();
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return ((ObligationExpressionType) this.data).getFulfillOn().toString();
-			}
-			if (this.data instanceof AdviceExpressionType) {
-				return ((AdviceExpressionType) this.data).getAppliesTo().toString();
-			}
-			if (this.data instanceof MatchType) {
-				algorithm = ((MatchType) this.data).getMatchId();
-			}
-			if (this.data instanceof ConditionType) {
-				algorithm = this.getRootExpressionFunction(((ConditionType) this.data).getExpression());
-				if (algorithm.startsWith("http")) {
-					return algorithm;
-				}
-			}
-			if (this.data instanceof VariableDefinitionType) {
-				//algorithm = this.getRootExpressionFunction(((VariableDefinitionType) this.data).getExpression());
-				return ((VariableDefinitionType) this.data).getVariableId();
-			}
-			if (algorithm != null) {
-				Iterable<String> fields = Splitter.on(':').trimResults().omitEmptyStrings().split(algorithm);
-				if (fields != null) {
-					String lastId = null;
-					for (String id : fields) {
-						lastId = id;
-					}
-					return lastId;
-				}
-			}
-			return null;
-		}
-		
-        public Resource getIcon() {
-			if (this.data instanceof PolicySetType) {
-				return new ThemeResource("../runo/icons/16/folder.png");
-			}
-			if (this.data instanceof RuleType) {
-				if (((RuleType) this.data).getEffect() == null) {
-					logger.warn("Rule has a null Effect");
-					return new ThemeResource("icons/deny-16.png");
-				}
-				if (((RuleType) this.data).getEffect() == EffectType.DENY) {
-					return new ThemeResource("icons/deny-16.png");
-				}
-				return new ThemeResource("icons/permit-16.png");
-			}
-			if (this.data instanceof PolicyType) {
-				return new ThemeResource("../runo/icons/16/document-txt.png");
-			}
-			if (this.data instanceof TargetType) {
-				return new ThemeResource("icons/target-green-16.png");
-			}
-			if (this.data instanceof ObligationExpressionType) {
-				return new ThemeResource("icons/obligation-16.png");
-			}
-			if (this.data instanceof AdviceExpressionType) {
-				return new ThemeResource("icons/advice-16.png");
-			}
-			if (this.data instanceof ConditionType) {
-				return new ThemeResource("icons/condition-16.png");
-			}
-			if (this.data instanceof VariableDefinitionType) {
-				return new ThemeResource("icons/variable-16.png");
-			}
-			return null;
-        }
-        
-        public String getStatus() {
-        	StringBuffer buffer = new StringBuffer();
-        	String a = this.getAlgorithm();
-        	//String id = this.getId();
-			if (this.data instanceof RuleType) {
-				RuleType rule = ((RuleType) this.data);
-				buffer.append("Rule");
-				EffectType effect = rule.getEffect();
-				if (effect == null) {
-					rule.setEffect(EffectType.PERMIT);
-				}
-				if (rule.getEffect() == EffectType.PERMIT) {
-					buffer.append(" (PERMIT)");
-				} else if (rule.getEffect() == EffectType.DENY) {
-					buffer.append(" (DENY)");
-				}
-			} else if (this.data instanceof PolicyType) {
-				buffer.append("Policy");
-			} else if (this.data instanceof PolicySetType) {
-				buffer.append("Policy Set");
-			}
-			/*
-			if (id != null) {
-				String[] ids = id.split("[:]");
-				if (ids.length > 0) {
-					buffer.append(" " + ids[ids.length - 1]);
-				}
-			}
-			*/
-			if (a != null) {
-				String[] algs = a.split("[:]");
-				if (algs.length > 0) {
-					buffer.append(" (" + algs[algs.length - 1] + ")");
-				}
-			}
-			/*
-			String d = this.getDescription();
-			if (d != null) {
-				buffer.append(" " + d);
-			}
-			*/
-			return buffer.toString();
-        }
-        
-        public Table getAttributes() {
-        	/*
-        	if (this.data instanceof MatchType) {
-        		
-        	}
-        	*/
-        	return null;
-        }
-        
-        protected	String	getRootExpressionFunction(JAXBElement<?> element) {
-        	if (element == null || element.getValue() == null) {
-        		return null;
-        	}
-        	Object value = element.getValue();
-        	if (value instanceof ApplyType) {
-        		return ((ApplyType) value).getFunctionId();
-        	}
-        	if (value instanceof AttributeValueType) {
-        		return ((AttributeValueType) value).getDataType();
-        	}
-        	if (value instanceof AttributeDesignatorType) {
-        		return ((AttributeDesignatorType) value).getAttributeId();
-        	}
-        	if (value instanceof AttributeSelectorType) {
-        		return ((AttributeSelectorType) value).getContextSelectorId();
-        	}
-        	if (value instanceof VariableReferenceType) {
-        		return "Variable=" + ((VariableReferenceType) value).getVariableId();
-        	}
-        	if (value instanceof FunctionType) {
-        		return ((FunctionType) value).getFunctionId();
-        	}
-        	return null;
-        }
-        
-		@Override
-		public Property<?> getItemProperty(Object id) {
-            return getContainerProperty(data, id);
-		}
-
-		@Override
-		public Collection<?> getItemPropertyIds() {
-            return getContainerPropertyIds();
-		}
-
-		@SuppressWarnings("rawtypes")
-		@Override
-		public boolean addItemProperty(Object id, Property property) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Policy container does not support adding new properties");
-		}
-
-		@Override
-		public boolean removeItemProperty(Object id) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("Policy container does not support property removal");
-		}
-
-		@Override
-		public String toString() {
-			return this.getName();
-		}
-		
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java
deleted file mode 100644
index 944c3c8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/AdminNotification.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import com.vaadin.ui.Notification;
-
-/**
- * A simple mechanism for displaying messages to the user.
- * 
- * At the moment this is a very thin layer on top of the Vaadin Notification class.
- * There are two reasons for this class existing:
- * 	- simplifying (slightly) the code, in that the type is in the method call just like logging
- * 	- this is a central point where all messages are done, which allows us to globally change how they are displayed if we wish.
- * 
- * @author glenngriffin
- *
- */
-public class AdminNotification  {
-	//
-	// PUBLIC STATIC METHODS
-	//
-	
-	public static void info(String caption) {
-		Notification.show(caption, Notification.Type.HUMANIZED_MESSAGE);
-	}
-
-	public static void warn(String caption) {
-		Notification.show(caption, Notification.Type.WARNING_MESSAGE);
-	}
-	
-	public static void error(String caption) {
-		Notification.show(caption, Notification.Type.ERROR_MESSAGE);
-	}
-	
-
-
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java
deleted file mode 100644
index 72c8a85..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/JPAUtils.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-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 oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.jpa.PIPType;
-import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms;
-import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.ui.UI;
-
-public class JPAUtils {
-	private static Log logger	= LogFactory.getLog(JPAUtils.class);
-	
-	private static final Object mapAccess = new Object();
-	private static Map<Datatype, List<FunctionDefinition>> mapDatatype2Function = null;
-	private static Map<String, FunctionDefinition> mapID2Function = null;
-	private static final Object booleanAccess = new Object();
-	private static Datatype booleanDatatype = null;
-	
-	public static Datatype getBooleanDatatype() {
-		synchronized(booleanAccess) {
-			if (booleanDatatype == null) {
-				booleanDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_BOOLEAN);
-			}
-			return booleanDatatype;
-		}
-	}
-	
-	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;
-	}
-	
-	public static Attribute createAttribute(AttributeDesignatorType designator) {
-		Attribute attribute = new Attribute();
-		attribute.setCategoryBean(JPAUtils.findCategory(designator.getCategory()));
-		attribute.setDatatypeBean(JPAUtils.findDatatype(designator.getDataType()));
-		attribute.setXacmlId(designator.getAttributeId());
-		attribute.setIssuer(designator.getIssuer());
-		attribute.setIsDesignator(true);
-		return attribute;
-	}
-	
-	public static Attribute createAttribute(AttributeSelectorType selector) {
-		Attribute attribute = new Attribute();
-		attribute.setCategoryBean(JPAUtils.findCategory(selector.getCategory()));
-		attribute.setDatatypeBean(JPAUtils.findDatatype(selector.getDataType()));
-		attribute.setXacmlId(selector.getContextSelectorId());
-		attribute.setSelectorPath(selector.getPath());
-		attribute.setIsDesignator(false);
-		return attribute;
-	}
-	
-	public static Attribute findAttribute(Attribute attribute) {
-		return JPAUtils.findAttribute(attribute.getCategoryBean(), attribute.getDatatypeBean(), attribute.getXacmlId());
-	}
-		
-	public static Attribute findAttribute(Category category, Datatype datatype, String attributeID) {
-		if (category == null || datatype == null | attributeID == null) {
-			return null;
-		}
-		return JPAUtils.findAttribute(category.getXacmlId(), datatype.getXacmlId(), attributeID);
-	}
-	
-	public static Attribute findAttribute(String category, String dataType, String attributeId) {
-		if (category == null || dataType == null | attributeId == null) {
-			return null;
-		}
-		JPAContainer<Attribute> attributes = ((XacmlAdminUI)UI.getCurrent()).getAttributes();
-		for (Object id : attributes.getItemIds()) {
-			Attribute a = attributes.getItem(id).getEntity();
-			if (a.getCategoryBean().getXacmlId().equals(category) &&
-						a.getDatatypeBean().getXacmlId().equals(dataType) &&
-						a.getXacmlId().equals(attributeId)) {
-				return a;
-			}
-		}
-		return null;
-	}
-
-	public static Category	findCategory(Identifier cat) {
-		JPAContainer<Category> categories = ((XacmlAdminUI)UI.getCurrent()).getCategories();
-		for (Object id : categories.getItemIds()) {
-			Category c = categories.getItem(id).getEntity();
-			if (c.getIdentifer().equals(cat)) {
-				return c;
-			}
-		}
-		return null;
-	}
-	
-	public static Category	findCategory(String cat) {
-		JPAContainer<Category> categories = ((XacmlAdminUI)UI.getCurrent()).getCategories();
-		for (Object id : categories.getItemIds()) {
-			Category c = categories.getItem(id).getEntity();
-			if (c.getIdentifer().stringValue().equals(cat)) {
-				return c;
-			}
-		}
-		return null;
-	}
-	
-	public static Datatype	findDatatype(Identifier dt) {
-		JPAContainer<Datatype> datatypes =  ((XacmlAdminUI)UI.getCurrent()).getDatatypes();
-		
-		for (Object id : datatypes.getItemIds()) {
-			Datatype d = datatypes.getItem(id).getEntity();
-			if (d.getIdentifer().equals(dt)) {
-				return d;
-			}
-		}		
-		return null;
-	}
-	
-	public static Datatype	findDatatype(String dt) {
-		JPAContainer<Datatype> datatypes =  ((XacmlAdminUI)UI.getCurrent()).getDatatypes();
-		
-		for (Object id : datatypes.getItemIds()) {
-			Datatype d = datatypes.getItem(id).getEntity();
-			if (d.getIdentifer().stringValue().equals(dt)) {
-				return d;
-			}
-		}		
-		return null;
-	}
-	
-	public static Datatype	findDatatype(int datatypeId) {
-		JPAContainer<Datatype> datatypes =  ((XacmlAdminUI)UI.getCurrent()).getDatatypes();
-		
-		for (Object id : datatypes.getItemIds()) {
-			Datatype d = datatypes.getItem(id).getEntity();
-			if (d.getId() == datatypeId) {
-				return d;
-			}
-		}		
-		return null;
-	}
-	
-	public static ConstraintType	findConstraintType(String type) {
-		JPAContainer<ConstraintType> types = ((XacmlAdminUI)UI.getCurrent()).getConstraintTypes();
-		for (Object id : types.getItemIds()) {
-			ConstraintType value = types.getItem(id).getEntity();
-			if (value.getConstraintType().equals(type)) {
-				return value;
-			}
-		}
-		return null;
-	}
-
-	public static FunctionDefinition findFunction(String functionId) {
-		if (functionId == null) {
-			throw new IllegalArgumentException("Cannot find a null function id");
-		}
-		JPAContainer<FunctionDefinition> functions = ((XacmlAdminUI)UI.getCurrent()).getFunctionDefinitions();
-		for (Object id : functions.getItemIds()) {
-			FunctionDefinition value = functions.getItem(id).getEntity();
-			if (value.getXacmlid().equals(functionId)) {
-				return value;
-			}
-		}
-		return null;
-	}
-	
-	public static PolicyAlgorithms findPolicyAlgorithm(String algorithm) {
-		if (algorithm == null) {
-			throw new IllegalArgumentException("Cannot find a null algorithm");
-		}
-		JPAContainer<PolicyAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getPolicyAlgorithms();
-		for (Object id : algorithms.getItemIds()) {
-			PolicyAlgorithms alg = algorithms.getItem(id).getEntity();
-			if (alg.getXacmlId().equals(algorithm)) {
-				return alg;
-			}
-		}
-		return null;
-	}
-	
-	public static RuleAlgorithms findRuleAlgorithm(String algorithm) {
-		if (algorithm == null) {
-			throw new IllegalArgumentException("Cannot find a null algorithm");
-		}
-		JPAContainer<RuleAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getRuleAlgorithms();
-		for (Object id : algorithms.getItemIds()) {
-			RuleAlgorithms alg = algorithms.getItem(id).getEntity();
-			if (alg.getXacmlId().equals(algorithm)) {
-				return alg;
-			}
-		}
-		return null;
-	}
-	
-	public static Obadvice findObligation(Identifier id, EffectType effect) {
-		if (id == null) {
-			return null;
-		}
-		return JPAUtils.findObligation(id.stringValue(), effect);
-	}
-	
-	public static Obadvice findObligation(String id, EffectType effect) {
-		JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice();
-		for (Object oaID : oa.getItemIds()) {
-			Obadvice obligation = oa.getItem(oaID).getEntity();
-			if (obligation.getType().equals(Obadvice.OBLIGATION) && 
-				obligation.getXacmlId().equals(id) &&
-				obligation.getFulfillOn().equals((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY))) {
-				return obligation;
-			}
-		}
-		return null;
-	}
-	
-	public static Obadvice findAdvice(Identifier id, EffectType effect) {
-		if (id == null) {
-			return null;
-		}
-		return JPAUtils.findAdvice(id.stringValue(), effect);
-	}
-	
-	public static Obadvice findAdvice(String id, EffectType effect) {
-		JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice();
-		for (Object oaID : oa.getItemIds()) {
-			Obadvice advice = oa.getItem(oaID).getEntity();
-			if (advice.getType().equals(Obadvice.ADVICE) && 
-				advice.getXacmlId().equals(id) &&
-				advice.getFulfillOn().equals((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY))) {
-				return advice;
-			}
-		}
-		return null;
-	}
-	
-	public static Attribute isStandardAttribute(Attribute attribute) {
-		return JPAUtils.isStandardAttribute(attribute.getCategoryBean(), attribute.getDatatypeBean(), attribute.getXacmlId());
-	}
-	
-	public static Attribute isStandardAttribute(Category categoryBean, Datatype datatypeBean, String xacmlId) {
-		if (categoryBean == null || datatypeBean == null || xacmlId == null) {
-			return null;
-		}
-		return JPAUtils.isStandardAttribute(categoryBean.getXacmlId(), datatypeBean.getXacmlId(), xacmlId);
-	}
-
-	public static Attribute	isStandardAttribute(String category, String datatype, String id) {
-		if (category == null || datatype == null || id == null) {
-			return null;
-		}
-		Category cat = JPAUtils.findCategory(category);
-		if (cat == null) {
-			return null;
-		}
-		Datatype dt = JPAUtils.findDatatype(datatype);
-		if (dt == null) {
-			return null;
-		}
-		Identifier identifier = null;
-		Iterator<Identifier> iter = XACMLConstants.STANDARD_ATTRIBUTES.iterator();
-		while (iter.hasNext()) {
-			Identifier i = iter.next();
-			if (i.stringValue().equals(id)) {
-				identifier = i;
-				break;
-			}
-		}
-		if (identifier == null) {
-			return null;
-		}
-		Attribute attribute = new Attribute();
-		attribute.setCategoryBean(cat);
-		attribute.setDatatypeBean(dt);
-		attribute.setXacmlId(identifier.stringValue());
-		return attribute;
-	}
-	
-	/**
-	 * 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 static Map<Datatype, List<FunctionDefinition>>	getFunctionDatatypeMap() {
-		
-		synchronized(mapAccess) {
-			if (mapDatatype2Function == null) {
-				buildFunctionMaps();
-			}
-		}
-		return mapDatatype2Function;
-	}
-	
-	public static Map<String, FunctionDefinition> getFunctionIDMap() {
-		synchronized(mapAccess) {
-			if (mapID2Function == null) {
-				buildFunctionMaps();
-			}
-		}
-		return mapID2Function;
-	}
-	
-	private static void buildFunctionMaps() {
-		mapDatatype2Function = new HashMap<Datatype, List<FunctionDefinition>>();
-		mapID2Function = new HashMap<String, FunctionDefinition>();
-		JPAContainer<FunctionDefinition> functions = ((XacmlAdminUI)UI.getCurrent()).getFunctionDefinitions();
-		for (Object id : functions.getItemIds()) {
-			FunctionDefinition value = functions.getItem(id).getEntity();
-			mapID2Function.put(value.getXacmlid(), value);
-			if (mapDatatype2Function.containsKey(value.getDatatypeBean()) == false) {
-				mapDatatype2Function.put(value.getDatatypeBean(), new ArrayList<FunctionDefinition>());
-			}
-			mapDatatype2Function.get(value.getDatatypeBean()).add(value);
-		}
-	}
-	
-	public static void dumpDatatype2FunctionMap() {
-		if (logger.isDebugEnabled() == false) {
-			return;
-		}
-		Map<Datatype, List<FunctionDefinition>> map = getFunctionDatatypeMap();
-		for (Datatype dt : map.keySet()) {
-			for (FunctionDefinition function: map.get(dt)) {
-				logger.debug("Datatype: " + (dt != null ? dt.getId() : "null") + " " + function.getXacmlid() + " (" + (function.getDatatypeBean() != null ? function.getDatatypeBean().getId() : "null") + ")");
-			}
-		}
-	}
-
-	public static PIPType	getPIPType(String typeName) {
-		for (Object id : ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItemIds()) {
-			PIPType type = ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItem(id).getEntity();
-			if (type.getType().equals(typeName)) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java
deleted file mode 100644
index ba8cd82..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/OnDemandFileDownloader.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import java.io.IOException;
-
-import com.vaadin.server.FileDownloader;
-import com.vaadin.server.StreamResource;
-import com.vaadin.server.StreamResource.StreamSource;
-import com.vaadin.server.VaadinRequest;
-import com.vaadin.server.VaadinResponse;
-import com.vaadin.ui.UI;
-
-public class OnDemandFileDownloader extends FileDownloader {
-	private static final long serialVersionUID = 1L;
-	private final OnDemandStreamResource resource;
-
-	public interface OnDemandStreamResource extends StreamSource {
-		String getFilename ();
-	}
-
-  public OnDemandFileDownloader(OnDemandStreamResource resource) {
-		super(new StreamResource(resource, ""));
-		this.resource = resource;
-		if (this.resource == null) {
-			throw new NullPointerException("Can't send null resource");
-		}
-	}
-
-	@Override
-	public boolean handleConnectorRequest(VaadinRequest request,
-			VaadinResponse response, String path) throws IOException {
-		this.getResource().setFilename(this.resource.getFilename());
-		return super.handleConnectorRequest(request, response, path);
-	}
-
-	private StreamResource getResource() {
-		StreamResource resource = null;
-		UI.getCurrent().getSession().lock();
-		try {
-			resource = (StreamResource) this.getResource("dl");
-		} finally {
-			UI.getCurrent().getSession().unlock();
-		}
-		return resource;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java
deleted file mode 100644
index 3958100..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/RESTfulPAPEngine.java
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.util.Collections;
-import java.util.Set;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PAPException;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import org.apache.openaz.xacml.api.pap.PDPStatus;
-import org.apache.openaz.xacml.rest.XACMLRestProperties;
-import org.apache.openaz.xacml.std.pap.StdPDP;
-import org.apache.openaz.xacml.std.pap.StdPDPGroup;
-import org.apache.openaz.xacml.std.pap.StdPDPItemSetChangeNotifier;
-import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
-import org.apache.openaz.xacml.std.pap.StdPDPStatus;
-import org.apache.openaz.xacml.util.XACMLProperties;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.CollectionType;
-
-/**
- * Implementation of the PAPEngine interface that communicates with a PAP engine in a remote servlet
- * through a RESTful interface
- * 
- * @author glenngriffin
- *
- */
-public class RESTfulPAPEngine extends StdPDPItemSetChangeNotifier implements PAPEngine {
-	private static final Log logger	= LogFactory.getLog(RESTfulPAPEngine.class);
-
-	//
-	// URL of the PAP Servlet that this Admin Console talks to
-	//
-	private String papServletURLString;
-	
-	/**
-	 * Set up link with PAP Servlet and get our initial set of Groups
-	 * @throws Exception 
-	 */
-	public RESTfulPAPEngine (String myURLString) throws PAPException, IOException  {
-		//
-		// Get our URL to the PAP servlet
-		//
-		this.papServletURLString = XACMLProperties.getProperty(XACMLRestProperties.PROP_PAP_URL);
-		if (this.papServletURLString == null || this.papServletURLString.length() == 0) {
-			String message = "The property 'POLICYENGINE_ADMIN_ACTIVE' was not set during installation.  Admin Console cannot call PAP.";
-			logger.error(message);
-			throw new PAPException(message);
-		}
-
-		//
-		// register this Admin Console with the PAP Servlet to get updates
-		//
-		Object newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString);
-		if (newURL != null) {
-			// assume this was a re-direct and try again
-			logger.warn("Redirecting to '" + newURL + "'");
-			this.papServletURLString = (String)newURL;
-			newURL = sendToPAP("PUT", null, null, null, "adminConsoleURL=" + myURLString);
-			if (newURL != null) {
-				logger.error("Failed to redirect to " + this.papServletURLString);
-				throw new PAPException("Failed to register with PAP");
-			}
-		}
-	}
-	
-
-	//
-	// High-level commands used by the Admin Console code through the PAPEngine Interface
-	//
-	
-	@Override
-	public PDPGroup getDefaultGroup() throws PAPException {
-		PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "default=");
-		return newGroup;
-	}
-
-	@Override
-	public void SetDefaultGroup(PDPGroup group) throws PAPException {
-		sendToPAP("POST", null, null, null, "groupId=" + group.getId(), "default=true");
-	}
-
-	@Override
-	public Set<PDPGroup> getPDPGroups() throws PAPException {
-		Set<PDPGroup> newGroupSet;
-		newGroupSet = (Set<PDPGroup>) this.sendToPAP("GET", null, Set.class, StdPDPGroup.class, "groupId=");
-		return Collections.unmodifiableSet(newGroupSet);
-	}
-
-
-	@Override
-	public PDPGroup getGroup(String id) throws PAPException {
-		PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=" + id);
-		return newGroup;
-	}
-
-	@Override
-	public void newGroup(String name, String description)
-			throws PAPException, NullPointerException {
-		String escapedName = null;
-		String escapedDescription = null;
-		try {
-			escapedName = URLEncoder.encode(name, "UTF-8");
-			escapedDescription = URLEncoder.encode(description, "UTF-8");
-		} catch (UnsupportedEncodingException e) {
-			throw new PAPException("Unable to send name or description to PAP: " + e.getMessage());
-		}
-		
-		this.sendToPAP("POST", null, null, null, "groupId=", "groupName="+escapedName, "groupDescription=" + escapedDescription);
-	}
-	
-	
-	/**
-	 * Update the configuration on the PAP for a single Group.
-	 * 
-	 * @param group
-	 * @return
-	 * @throws PAPException
-	 */
-	public void updateGroup(PDPGroup group) throws PAPException {
-
-		try {
-			
-			//
-			// ASSUME that all of the policies mentioned in this group are already located in the correct directory on the PAP!
-			//
-			// Whenever a Policy is added to the group, that file must be automatically copied to the PAP from the Workspace.
-			// 
-			
-			
-//			// Copy all policies from the local machine's workspace to the PAP's PDPGroup directory.
-//			// This is not efficient since most of the policies will already exist there.
-//			// However, the policy files are (probably!) not too huge, and this is a good way to ensure that any corrupted files on the PAP get refreshed.
-//			
-//TODO WRONG!!!!	The policy.getStream() is based on the location in the PAP directory, not the Workspace.
-//TODO 
-//			for (PDPPolicy policy : group.getPolicies()) {
-//				try (InputStream is = policy.getStream()) {
-//				copyFile(policy.getId(), group, is);
-//				}
-//			}
-			
-			// now update the group object on the PAP
-			
-			sendToPAP("PUT", group, null, null, "groupId=" + group.getId());
-		} catch (Exception e) {
-			String message = "Unable to PUT policy '" + group.getId() + "', e:" + e;
-			logger.error(message, e);
-			throw new PAPException(message);
-		}
-	}
-	
-	
-	@Override
-	public void removeGroup(PDPGroup group, PDPGroup newGroup)
-			throws PAPException, NullPointerException {
-		String moveToGroupString = null;
-		if (newGroup != null) {
-			moveToGroupString = "movePDPsToGroupId=" + newGroup.getId();
-		}
-		sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), moveToGroupString);
-	}
-	
-	@Override
-	public PDPGroup getPDPGroup(PDP pdp) throws PAPException {
-		return getPDPGroup(pdp.getId());
-	}
-
-	@Override
-	public PDPGroup getPDPGroup(String pdpId) throws PAPException {
-		PDPGroup newGroup = (PDPGroup)sendToPAP("GET", null, null, StdPDPGroup.class, "groupId=", "pdpId=" + pdpId, "getPDPGroup=");
-		return newGroup;
-	}
-
-	@Override
-	public PDP getPDP(String pdpId) throws PAPException {
-		PDP newPDP = (PDP)sendToPAP("GET", null, null, StdPDP.class, "groupId=", "pdpId=" + pdpId);
-		return newPDP;
-	}
-
-	@Override
-	public void newPDP(String id, PDPGroup group, String name, String description) throws PAPException,
-			NullPointerException {
-		StdPDP newPDP = new StdPDP(id, name, description);
-		sendToPAP("PUT", newPDP, null, null, "groupId=" + group.getId(), "pdpId=" + id);
-	}
-
-	
-	@Override
-	public void movePDP(PDP pdp, PDPGroup newGroup) throws PAPException {
-		sendToPAP("POST", null, null, null, "groupId=" + newGroup.getId(), "pdpId=" + pdp.getId());
-	}
-
-	@Override
-	public void updatePDP(PDP pdp) throws PAPException {
-		PDPGroup group = getPDPGroup(pdp);
-		sendToPAP("PUT", pdp, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId());
-	}
-	
-	@Override
-	public void removePDP(PDP pdp) throws PAPException {
-		PDPGroup group = getPDPGroup(pdp);
-		sendToPAP("DELETE", null, null, null, "groupId=" + group.getId(), "pdpId=" + pdp.getId());
-	}
-
-	
-
-	@Override
-	public void publishPolicy(String id, String name, boolean isRoot,
-			InputStream policy, PDPGroup group) throws PAPException {
-		
-//TODO - this method should take as input a Policy object, add it to the group, then call updateGroup
-//TODO - ?? Where does the Policy object (with the version info) get created?
-
-		// copy the (one) file into the target directory on the PAP servlet
-		copyFile(id, group, policy);
-		
-		// adjust the local copy of the group to include the new policy
-		PDPPolicy pdpPolicy = new StdPDPPolicy(id, isRoot, name);
-		group.getPolicies().add(pdpPolicy);
-		
-		// tell the PAP servlet to include the policy in the configuration
-		updateGroup(group);
-	}
-	
-	
-	
-	/**
-	 * Copy a single Policy file from the input stream to the PAP Servlet.
-	 * Either this works (silently) or it throws an exception.
-	 * 
-	 * @param policyId
-	 * @param group
-	 * @param policy
-	 * @return
-	 * @throws PAPException
-	 */
-	public void copyFile(String policyId, PDPGroup group, InputStream policy) throws PAPException {
-		// send the policy file to the PAP Servlet
-		try {
-			sendToPAP("POST", policy, null, null, "groupId=" + group.getId(), "policyId="+policyId);
-		} catch (Exception e) {
-			String message = "Unable to PUT policy '" + policyId + "', e:" + e;
-			logger.error(message, e);
-			throw new PAPException(message);
-		}
-	}
-	
-
-	@Override
-	public void	copyPolicy(PDPPolicy policy, PDPGroup group) throws PAPException {
-		if (policy == null || group == null) {
-			throw new PAPException("Null input policy="+policy+"  group="+group);
-		}
-		try (InputStream is = new FileInputStream(new File(policy.getLocation())) ) {
-			copyFile(policy.getId(), group, is );
-		} catch (Exception e) {
-			String message = "Unable to PUT policy '" + policy.getId() + "', e:" + e;
-			logger.error(message, e);
-			throw new PAPException(message);
-		}
-	}
-
-
-	
-	
-	@Override
-	public void	removePolicy(PDPPolicy policy, PDPGroup group) throws PAPException {
-		throw new PAPException("NOT IMPLEMENTED");
-
-	}
-
-	
-	
-	/**
-	 * Special operation - Similar to the normal PAP operations but this one contacts the PDP directly
-	 * to get detailed status info.
-	 * 
-	 * @param pdp
-	 * @return
-	 * @throws PAPException 
-	 */
-	@Override
-	public PDPStatus getStatus(PDP pdp) throws PAPException {
-		StdPDPStatus status = (StdPDPStatus)sendToPAP("GET", pdp, null, StdPDPStatus.class);
-		return status;
-	}
-	
-	
-	
-	
-	//
-	// Internal Operations called by the PAPEngine Interface methods
-	//
-	
-	/**
-	 * Send a request to the PAP Servlet and get the response.
-	 * 
-	 * The content is either an InputStream to be copied to the Request OutputStream
-	 * 	OR it is an object that is to be encoded into JSON and pushed into the Request OutputStream.
-	 * 
-	 * The Request parameters may be encoded in multiple "name=value" sets, or parameters may be combined by the caller.
-	 * 
-	 * @param method
-	 * @param content	- EITHER an InputStream OR an Object to be encoded in JSON
-	 * @param collectionTypeClass
-	 * @param responseContentClass
-	 * @param parameters
-	 * @return
-	 * @throws Exception
-	 */
-	private Object sendToPAP(String method, Object content, Class collectionTypeClass, Class responseContentClass, String... parameters ) throws PAPException {
-		HttpURLConnection connection = null;
-		try {
-			String fullURL = papServletURLString;
-			if (parameters != null && parameters.length > 0) {
-				String queryString = "";
-				for (String p : parameters) {
-					queryString += "&" + p;
-				}
-				fullURL += "?" + queryString.substring(1);
-			}
-			
-			// special case - Status (actually the detailed status) comes from the PDP directly, not the PAP
-			if (method.equals("GET") &&
-					content instanceof PDP &&
-					responseContentClass == StdPDPStatus.class) {
-				// Adjust the url and properties appropriately
-				fullURL = ((PDP)content).getId() + "?type=Status";
-				content = null;
-			}
-			
-			
-			URL url = new URL(fullURL);
-
-			//
-			// Open up the connection
-			//
-			connection = (HttpURLConnection)url.openConnection();
-			//
-			// Setup our method and headers
-			//
-            connection.setRequestMethod(method);
-//				connection.setRequestProperty("Accept", "text/x-java-properties");
-//	            connection.setRequestProperty("Content-Type", "text/x-java-properties");
-            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);
-			if (content != null) {
-				if (content instanceof InputStream) {
-		    		try {
-		    			//
-		    			// Send our current policy configuration
-		    			//
-		    			try (OutputStream os = connection.getOutputStream()) {
-		    				int count = IOUtils.copy((InputStream)content, os);
-		    				if (logger.isDebugEnabled()) {
-		    					logger.debug("copied to output, bytes="+count);
-		    				}
-		    			}
-		    		} catch (Exception e) {
-		    			logger.error("Failed to write content in '" + method + "'", e);
-		    			throw e;
-		    		}
-				} else {
-					// The content is an object to be encoded in JSON
-		            ObjectMapper mapper = new ObjectMapper();
-		            mapper.writeValue(connection.getOutputStream(),  content);
-				}
-			}
-            //
-            // Do the connect
-            //
-            connection.connect();
-            if (connection.getResponseCode() == 204) {
-            	logger.info("Success - no content.");
-            	return null;
-            } else if (connection.getResponseCode() == 200) {
-            	logger.info("Success. We have a return object.");
-            	
-            	// get the response 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(connection.getInputStream());
-    		    scanner.useDelimiter("\\A");
-    		    json =  scanner.hasNext() ? scanner.next() : "";
-    		    scanner.close();
-    		    logger.info("JSON response from PAP: " + json);
-            	
-            	// convert Object sent as JSON into local object
-	            ObjectMapper mapper = new ObjectMapper();
-	            
-	            if (collectionTypeClass != null) {
-	            	// collection of objects expected
-	            	final CollectionType javaType = 
-	            	      mapper.getTypeFactory().constructCollectionType(collectionTypeClass, responseContentClass);
-
-	            	Object objectFromJSON = mapper.readValue(json, javaType);
-					return objectFromJSON;
-	            } else {
-	            	// single value object expected
-		            Object objectFromJSON = mapper.readValue(json, responseContentClass);
-					return objectFromJSON;
-	            }
-
-            } else if (connection.getResponseCode() >= 300 && connection.getResponseCode()  <= 399) {
-            	// redirection
-            	String newURL = connection.getHeaderField("Location");
-            	if (newURL == null) {
-            		logger.error("No Location header to redirect to when response code="+connection.getResponseCode());
-            		throw new IOException("No redirect Location header when response code="+connection.getResponseCode());
-            	}
-            	int qIndex = newURL.indexOf("?");
-            	if (qIndex > 0) {
-            		newURL = newURL.substring(0, qIndex);
-            	}
-            	logger.info("Redirect seen.  Redirecting " + fullURL + " to " + newURL);
-            	return newURL;
-            } else {
-            	logger.warn("Unexpected response code: " + connection.getResponseCode() + "  message: " + connection.getResponseMessage());
-            	throw new IOException("Server Response: " + connection.getResponseCode() + ": " + connection.getResponseMessage());
-            }
-
-		} catch (Exception e) {
-			logger.error("HTTP Request/Response to PAP: " + e,e);
-			throw new PAPException("Request/Response threw :" + e);
-		} finally {
-			// cleanup the connection
-				if (connection != null) {
-				try {
-					// For some reason trying to get the inputStream from the connection
-					// throws an exception rather than returning null when the InputStream does not exist.
-					InputStream is = null;
-					try {
-						is = connection.getInputStream();
-					} catch (Exception e1) { //NOPMD
-						// ignore this
-					}
-					if (is != null) {
-						is.close();
-					}
-
-				} catch (IOException ex) {
-					logger.error("Failed to close connection: " + ex, ex);
-				}
-				connection.disconnect();
-			}
-		}
-	}
-}
-
-
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java
deleted file mode 100644
index 28bf377..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLConstants.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-
-public class XACMLConstants {
-
-	public static final Set<Identifier> SUBJECT_CATEGORIES = new HashSet<Identifier>();
-	public static final Set<Identifier> ACTION_CATEGORIES = new HashSet<Identifier>();
-	public static final Set<Identifier> RESOURCE_CATEGORIES = new HashSet<Identifier>();
-	public static final Set<Identifier> ENVIRONMENT_CATEGORIES = new HashSet<Identifier>();
-	
-	public static final Set<Identifier> CATEGORIES = new HashSet<Identifier>();
-	static {
-		SUBJECT_CATEGORIES.addAll(Arrays.asList(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT,
-												XACML3.ID_SUBJECT_CATEGORY_CODEBASE,
-												XACML3.ID_SUBJECT_CATEGORY_INTERMEDIARY_SUBJECT,
-												XACML3.ID_SUBJECT_CATEGORY_RECIPIENT_SUBJECT,
-												XACML3.ID_SUBJECT_CATEGORY_REQUESTING_MACHINE)
-												);
-		
-		ACTION_CATEGORIES.addAll(Arrays.asList(
-												XACML3.ID_ATTRIBUTE_CATEGORY_ACTION)
-												);
-		
-		RESOURCE_CATEGORIES.addAll(Arrays.asList(
-												XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE)
-												);
-		
-		ENVIRONMENT_CATEGORIES.addAll(Arrays.asList(
-												XACML3.ID_ATTRIBUTE_CATEGORY_ENVIRONMENT)
-												);
-		
-		CATEGORIES.addAll(SUBJECT_CATEGORIES);
-		CATEGORIES.addAll(ACTION_CATEGORIES);
-		CATEGORIES.addAll(RESOURCE_CATEGORIES);
-		CATEGORIES.addAll(ENVIRONMENT_CATEGORIES);
-		
-	}
-	public static final Set<Identifier> DATATYPES = new HashSet<Identifier>();
-	static {
-		DATATYPES.addAll(Arrays.asList(XACML3.ID_DATATYPE_STRING,
-										XACML3.ID_DATATYPE_BOOLEAN,
-										XACML3.ID_DATATYPE_INTEGER,
-										XACML3.ID_DATATYPE_DOUBLE,
-										XACML3.ID_DATATYPE_TIME,
-										XACML3.ID_DATATYPE_DATE,
-										XACML3.ID_DATATYPE_DATETIME,
-										XACML3.ID_DATATYPE_DAYTIMEDURATION,
-										XACML3.ID_DATATYPE_YEARMONTHDURATION,
-										XACML3.ID_DATATYPE_ANYURI,
-										XACML3.ID_DATATYPE_HEXBINARY,
-										XACML3.ID_DATATYPE_BASE64BINARY,
-										XACML3.ID_DATATYPE_RFC822NAME,
-										XACML3.ID_DATATYPE_X500NAME,
-										XACML3.ID_DATATYPE_IPADDRESS,
-										XACML3.ID_DATATYPE_DNSNAME));
-	}
-	
-	public static final Set<Identifier> POLICY_ALGORITHMS = new HashSet<Identifier>();
-	static {
-		POLICY_ALGORITHMS.addAll(Arrays.asList(
-				XACML3.ID_POLICY_DENY_OVERRIDES,
-				XACML3.ID_POLICY_DENY_UNLESS_PERMIT,
-				XACML3.ID_POLICY_FIRST_APPLICABLE,
-				XACML3.ID_POLICY_ON_PERMIT_APPLY_SECOND,
-				XACML3.ID_POLICY_ONLY_ONE_APPLICABLE,
-				XACML3.ID_POLICY_ORDERED_DENY_OVERRIDES,
-				XACML3.ID_POLICY_ORDERED_PERMIT_OVERRIDES,
-				XACML3.ID_POLICY_PERMIT_OVERRIDES,
-				XACML3.ID_POLICY_PERMIT_UNLESS_DENY
-				));
-	}
-	
-	public static final Set<Identifier> RULE_ALGORITHMS = new HashSet<Identifier>();
-	static {
-		RULE_ALGORITHMS.addAll(Arrays.asList(
-				XACML3.ID_RULE_DENY_OVERRIDES,
-				XACML3.ID_RULE_DENY_UNLESS_PERMIT,
-				XACML3.ID_RULE_FIRST_APPLICABLE,
-				XACML3.ID_RULE_ONLY_ONE_APPLICABLE,
-				XACML3.ID_RULE_ORDERED_DENY_OVERRIDES,
-				XACML3.ID_RULE_ORDERED_PERMIT_OVERRIDES,
-				XACML3.ID_RULE_PERMIT_OVERRIDES,
-				XACML3.ID_RULE_PERMIT_UNLESS_DENY
-				));
-	}
-
-	public static final Set<Identifier> STANDARD_ATTRIBUTES = new HashSet<Identifier>();
-	static {
-		STANDARD_ATTRIBUTES.addAll(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE,
-				XACML3.ID_ACTION_ACTION_ID,
-				XACML3.ID_ACTION_IMPLIED_ACTION,
-				XACML3.ID_RESOURCE_RESOURCE_ID,
-				XACML3.ID_RESOURCE_RESOURCE_LOCATION,
-				XACML3.ID_RESOURCE_SIMPLE_FILE_NAME,
-				XACML3.ID_ENVIRONMENT_CURRENT_DATE,
-				XACML3.ID_ENVIRONMENT_CURRENT_TIME,
-				XACML3.ID_ENVIRONMENT_CURRENT_DATETIME
-				));
-	}
-	
-	public static final Map<Identifier, Set<Identifier>> MAP_STANDARD_CATEGORIES = new HashMap<Identifier, Set<Identifier>>();
-	static {
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_CODEBASE, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_INTERMEDIARY_SUBJECT, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_RECIPIENT_SUBJECT, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_SUBJECT_CATEGORY_REQUESTING_MACHINE, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_SUBJECT_SUBJECT_ID,
-				XACML3.ID_SUBJECT_SUBJECT_ID_QUALIFIER,
-				XACML3.ID_SUBJECT_KEY_INFO,
-				XACML3.ID_SUBJECT_AUTHENTICATION_TIME,
-				XACML3.ID_SUBJECT_AUTHENTICATION_METHOD,
-				XACML3.ID_SUBJECT_REQUEST_TIME,
-				XACML3.ID_SUBJECT_SESSION_START_TIME,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_IP_ADDRESS,
-				XACML3.ID_SUBJECT_AUTHN_LOCALITY_DNS_NAME,
-				XACML3.ID_SUBJECT_ROLE
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_ACTION, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_ACTION_ACTION_ID,
-				XACML3.ID_ACTION_IMPLIED_ACTION
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_RESOURCE, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_RESOURCE_RESOURCE_ID,
-				XACML3.ID_RESOURCE_RESOURCE_LOCATION,
-				XACML3.ID_RESOURCE_SIMPLE_FILE_NAME
-				)));
-		MAP_STANDARD_CATEGORIES.put(XACML3.ID_ATTRIBUTE_CATEGORY_ENVIRONMENT, new HashSet<Identifier>(Arrays.asList(
-				XACML3.ID_ENVIRONMENT_CURRENT_DATE,
-				XACML3.ID_ENVIRONMENT_CURRENT_TIME,
-				XACML3.ID_ENVIRONMENT_CURRENT_DATETIME
-				)));
-	}
-	
-	public static String extractShortName(String xacmlID) {
-		if (xacmlID == null) {
-			return null;
-		}
-		if (xacmlID.startsWith("http:")) {
-			String [] parts = xacmlID.split("[#]");
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-			return null;
-		}
-		if (xacmlID.startsWith("urn") || xacmlID.contains(":")) {
-			String[] parts = xacmlID.split("[:]");
-			
-			if (parts != null && parts.length > 0) {
-				return parts[parts.length - 1];
-			}
-		}	
-		return null;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java
deleted file mode 100644
index 7ef7e60..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLFunctionValidator.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import java.util.List;
-
-import javax.xml.bind.JAXBElement;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.std.IdentifierImpl;
-
-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.AttributeSelectorType;
-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.FunctionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
-
-public class XACMLFunctionValidator {
-	private static Log logger	= LogFactory.getLog(XACMLFunctionValidator.class);
-	
-	public static boolean	validNumberOfArguments(ApplyType apply) {
-		try {
-			//
-			// Sanity check
-			//
-			if (apply == null) {
-				throw new IllegalArgumentException("Must supply a non-null apply object.");
-			}
-			//
-			// Get the function
-			//
-			FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId());
-			if (function == null) {
-				throw new Exception("Invalid function id: " + apply.getFunctionId());
-			}
-			//
-			// Now check argument list, do we have the minimum?
-			//
-			List<JAXBElement<?>> applyArgs = apply.getExpression();
-			if (applyArgs.isEmpty()) {
-				//
-				// May not need any args
-				//
-				if (function.getArgLb() > 0) {
-					throw new Exception ("Number of Args mismatch, expecting at least " + 
-							function.getArgLb() + " arguments but have zero.");
-				}
-			} else {
-				if (applyArgs.size() < function.getArgLb()) {
-					throw new Exception ("Number of Args mismatch, expecting at least " + 
-										function.getArgLb() + " arguments but have " + applyArgs.size());
-				}
-			}
-			//
-			// Is there an upper bound?
-			//
-			if (function.getArgUb() != -1 && applyArgs.size() != function.getArgUb()) {
-				throw new Exception ("Number of Args mismatch, expecting at most " + 
-						function.getArgUb() + " arguments but have " + applyArgs.size());
-			}
-		} catch (Exception e) {
-			logger.error("Number of arguments incorrect: " + e);
-			return false;
-		}
-		return true;
-	}
-	
-	public static boolean	canHaveMoreArguments(ConditionType condition) {
-		if (condition.getExpression() == null || condition.getExpression().getValue() == null) {
-			return true;
-		}
-		Object expression = condition.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression);
-		}
-		return false;
-	}
-	
-	public static boolean canHaveMoreArguments(VariableDefinitionType variable) {
-		if (variable.getExpression() == null || variable.getExpression().getValue() == null) {
-			return true;
-		}
-		Object expression = variable.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression);
-		}
-		return false;
-	}
-	
-	public static boolean canHaveMoreArguments(AttributeAssignmentExpressionType assignment) {
-		if (assignment.getExpression() == null || assignment.getExpression().getValue() == null) {
-			return true;
-		}
-		Object expression = assignment.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			return XACMLFunctionValidator.canHaveMoreArguments((ApplyType) expression);
-		}
-		return false;
-	}
-	
-	public static boolean	canHaveMoreArguments(ApplyType apply) {
-		//
-		// Sanity check
-		//
-		if (apply == null) {
-			throw new IllegalArgumentException("Must supply a non-null apply object.");
-		}
-		//
-		// Get the function
-		//
-		FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId());
-		if (function == null) {
-			throw new IllegalArgumentException("Invalid function id: " + apply.getFunctionId());
-		}
-		//
-		// Is there no upper bound?
-		//
-		if (function.getArgUb() == -1) {
-			//
-			// No limit to the number of arguments
-			//
-			return true;
-		}
-		//
-		// There is an upper bound - have we met it?
-		//
-		List<JAXBElement<?>> applyArgs = apply.getExpression();
-		if (applyArgs.size() < function.getArgUb()) {
-			//
-			// We have not met the upper bound, so yes we can
-			// add more arguments.
-			//
-			return true;
-		}
-		return false;
-	}
-	
-	public static boolean	isFunctionAvailable(FunctionDefinition function, ApplyType apply, FunctionArgument argument) {
-		//
-		// Does it return correct datatype?
-		//
-		if (argument != null) {
-			//
-			// Does it match?
-			//
-			if (function.getDatatypeBean().getXacmlId().equals(argument.getDatatypeBean().getXacmlId())) {
-				return false;
-			}
-			if (function.getIsBagReturn() != argument.getIsBag()) {
-				return false;
-			}
-		}
-		//
-		// Check each argument
-		//
-		int i;
-		for (i = 0; i < apply.getExpression().size(); i++) {
-			//
-			// Get the argument
-			//
-			JAXBElement<?> arg = apply.getExpression().get(i);
-			//
-			// Get what the argument should be
-			//
-			FunctionArgument functionArg = XACMLFunctionValidator.getFunctionArgument(i + 1, function);
-			//
-			// Sanity check
-			//
-			if (arg == null || arg.getValue() == null || functionArg == null) {
-				//
-				// Something screwy with the list, just return not available. They will have
-				// delete items that are bad.
-				//
-				return false;
-			}
-			//
-			// Does it match?
-			//
-			if (XACMLFunctionValidator.isArgumentValid(arg.getValue(), functionArg) == false) {
-				return false;
-			}
-		}
-		//
-		// Done checking, we don't care if there are more args needed. Just want to know if this
-		// function can fit with the existing arguments.
-		//
-		return true;
-	}
-	
-	public static FunctionDefinition	validateApply(ApplyType apply, FunctionArgument argument) {
-		//
-		// Sanity check
-		//
-		if (apply == null) {
-			throw new IllegalArgumentException("Must supply a non-null apply object.");
-		}
-		try {
-			//
-			// Get the function
-			//
-			FunctionDefinition function = JPAUtils.getFunctionIDMap().get(apply.getFunctionId());
-			if (function == null) {
-				throw new Exception("Invalid function id: " + apply.getFunctionId());
-			}
-			//
-			// Does it return correct datatype?
-			//
-			if (argument != null) {
-				//
-				// Does it match?
-				//
-				if (argument.getDatatypeBean() != null) {
-					if (! function.getDatatypeBean().getXacmlId().equals(argument.getDatatypeBean().getXacmlId())) {
-						throw new Exception("Function return datatype(" + function.getDatatypeBean() + 
-								") does not match expected argument datatype (" + argument.getDatatypeBean());
-					}
-				} else {
-					if (logger.isDebugEnabled()) {
-						logger.debug("Argument datatype bean is null - any datatype should work.");
-					}
-				}
-				if (function.getIsBagReturn() != argument.getIsBag()) {
-					throw new Exception("Function is bag (" + function.getIsBagReturn() + 
-							") does not match argument isBag(" + argument.getIsBag());
-				}
-			}
-			//
-			// Now check argument list, do we have the minimum?
-			//
-			List<JAXBElement<?>> applyArgs = apply.getExpression();
-			if (applyArgs == null) {
-				//
-				// May not need any args
-				//
-				if (function.getArgLb() > 0) {
-					throw new Exception ("Number of Args mismatch, expecting at least " + 
-							function.getArgLb() + " arguments but have zero.");
-				}
-			} else {
-				if (applyArgs.size() < function.getArgLb()) {
-					throw new Exception ("Number of Args mismatch, expecting at least " + 
-										function.getArgLb() + " arguments but have " + applyArgs.size());
-				}
-			}
-			//
-			// Is there an upper bound?
-			//
-			if (function.getArgUb() != -1 && applyArgs.size() != function.getArgUb()) {
-				throw new Exception ("Number of Args mismatch, expecting at most " + 
-						function.getArgUb() + " arguments but have " + applyArgs.size());
-			}
-			//
-			// Check each argument
-			//
-			int i;
-			for (i = 0; i < applyArgs.size(); i++) {
-				//
-				// Get the argument
-				//
-				JAXBElement<?> arg = applyArgs.get(i);
-				//
-				// Get what the argument should be
-				//
-				FunctionArgument functionArg = XACMLFunctionValidator.getFunctionArgument(i + 1, function);
-				//
-				// Sanity check
-				//
-				if (arg == null || arg.getValue() == null || functionArg == null) {
-					throw new NullPointerException("An argument is null: Element" + arg + " Function Arg: " + functionArg);
-				}
-				//
-				// Does it match?
-				//
-				if (XACMLFunctionValidator.isArgumentValid(arg.getValue(), functionArg) == false) {
-					throw new Exception("Invalid Argument: " + arg.getValue());
-				}
-			}
-			//
-			// Done checking, just return the function which has the datatype
-			// and if it is a bag.
-			//
-			return function;
-		} catch(Exception e) {
-			logger.error("Function is not valid: " + apply.getFunctionId() + " argument: " + argument + " " + e);
-			return null;
-		}
-	}
-	
-	private static boolean isArgumentValid(Object value, FunctionArgument functionArg) {
-		if (value instanceof ApplyType) {
-			//
-			// Recursively validate the Apply.
-			//
-			FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) value, functionArg);
-			if (functionArg.getDatatypeBean() == null || function.getDatatypeBean().getId() == functionArg.getDatatypeBean().getId()) {
-				if (function.getIsBagReturn() == functionArg.getIsBag()) {
-					return true;
-				}
-				logger.error("isBag does not match: " + function.getIsBagReturn() + " " + functionArg.getIsBag());
-			}
-			logger.error("Datatypes do not match: " + function.getDatatypeBean().getShortName() + " " + functionArg.getDatatypeBean().getShortName());
-		} else if (value instanceof AttributeValueType) {
-			AttributeValueType val = (AttributeValueType) value;
-			Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(val.getDataType()));
-			if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) {
-				//
-				// TODO Is bag?
-				//
-				return true;
-			}
-			logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName());
-		} else if (value instanceof AttributeDesignatorType) {
-			AttributeDesignatorType designator = (AttributeDesignatorType) value;
-			Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(designator.getDataType()));
-			if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) {
-				//
-				// TODO Is bag?
-				//
-				return true;
-			}
-			logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName());
-		} else if (value instanceof AttributeSelectorType) {
-			AttributeSelectorType selector = (AttributeSelectorType) value;
-			Datatype datatype = JPAUtils.findDatatype(new IdentifierImpl(selector.getDataType()));
-			if (functionArg.getDatatypeBean() == null || datatype.getId() == functionArg.getDatatypeBean().getId()) {
-				//
-				// TODO Is bag?
-				//
-				return true;
-			}
-			logger.error("Datatypes do not match: " + datatype.getShortName() + " " + functionArg.getDatatypeBean().getShortName());
-		} else if (value instanceof VariableReferenceType) {
-			//
-			// We can't verify this at this time.
-			// The user can define variables in other parts of the policy file
-			// or another policy file. This should be flagged if the user performs
-			// simulation and other testing on the policy before deployment.
-			//
-			return true;
-		} else if (value instanceof FunctionType) {
-			//
-			// Does this function exist?
-			//
-			FunctionDefinition function = JPAUtils.findFunction(((FunctionType) value).getFunctionId());
-			if (function == null) {
-				//
-				// Could not find function
-				//
-				logger.warn("Could not find function in our database: " + ((FunctionType) value).getFunctionId());
-				return false;
-			}
-			//
-			// Does this function return the correct data type?
-			//
-			if (functionArg.getDatatypeBean() == null || function.getDatatypeBean().getId() == functionArg.getDatatypeBean().getId()) {
-				return true;
-			}			
-			logger.error("Datatypes do not match: " + function.getDatatypeBean().getShortName() + " " + functionArg.getDatatypeBean().getShortName());
-		}		
-		return false;
-	}
-
-	public static FunctionArgument getFunctionArgument(int index, FunctionDefinition function) {
-		if (index < 1) {
-			throw new IllegalArgumentException("The index must be 1-based");
-		}
-		//
-		// Setup what the actual lower bound and upper bounds are
-		// within the list.
-		//
-//		int lowerBound = function.getArgLb();
-//		if (lowerBound == 0) {
-//			lowerBound = 1;
-//		}
-		int upperBound = function.getArgUb();
-		if (upperBound == -1) {
-			upperBound = function.getFunctionArguments().size();
-		}
-		//
-		// The list may not be sorted, so make sure we find
-		// the actual argument index
-		//
-		int argumentIndex = index;
-		if (index >= upperBound) {
-			argumentIndex = upperBound;
-		}
-		for (FunctionArgument arg : function.getFunctionArguments()) {
-			if (arg.getArgIndex() == argumentIndex) {
-				return arg;
-			}
-		}
-		return null;
-	}
-
-	public static boolean validateCondition(ConditionType condition) {
-		if (condition.getExpression() == null) {
-			return false;
-		}
-		Object expression = condition.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null);
-			if (function == null) {
-				return false;
-			}
-			if (function.isBagReturn()) {
-				return false;
-			}
-			if (function.getDatatypeBean() == null) {
-				return false;
-			}
-			return function.getDatatypeBean().getXacmlId().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue());
-		}
-		if (expression instanceof AttributeDesignatorType) {
-			return ((AttributeDesignatorType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue());
-		}
-		if (expression instanceof AttributeSelectorType) {
-			return ((AttributeSelectorType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue());
-		}
-		if (expression instanceof AttributeValueType) {
-			return ((AttributeValueType) expression).getDataType().equals(XACML3.ID_DATATYPE_BOOLEAN.stringValue());
-		}
-		if (expression instanceof VariableReferenceType) {
-			//
-			// Really unknown - the variable may or may not have been defined
-			//
-			return true;
-		}
-		return false;
-	}
-
-	public static boolean validateVariable(VariableDefinitionType variable) {
-		if (variable.getExpression() == null) {
-			return false;
-		}
-		Object expression = variable.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null);
-			if (function == null) {
-				return false;
-			}
-			return true;
-		}
-		if (expression instanceof AttributeDesignatorType) {
-			return true;
-		}
-		if (expression instanceof AttributeSelectorType) {
-			return true;
-		}
-		if (expression instanceof AttributeValueType) {
-			return true;
-		}
-		if (expression instanceof VariableReferenceType) {
-			return true;
-		}
-		return false;
-	}
-
-	public static boolean validateAssignment(AttributeAssignmentExpressionType assignmentExpression) {
-		if (assignmentExpression.getExpression() == null) {
-			return false;
-		}
-		Object expression = assignmentExpression.getExpression().getValue();
-		if (expression instanceof ApplyType) {
-			FunctionDefinition function = XACMLFunctionValidator.validateApply((ApplyType) expression, null);
-			if (function == null) {
-				return false;
-			}
-			//
-			// TODO
-			//
-		}
-		//
-		// TODO
-		//
-		return true;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java
deleted file mode 100644
index 8a7c714..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/util/XACMLPolicyImporter.java
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.util;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.api.Advice;
-import org.apache.openaz.xacml.api.AttributeValue;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.Obligation;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.util.XACMLObjectCopy;
-import org.apache.openaz.xacml.util.XACMLPolicyAggregator;
-import org.apache.openaz.xacml.util.XACMLPolicyScanner.CallbackResult;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.ui.UI;
-
-public class XACMLPolicyImporter extends XACMLPolicyAggregator {
-	private static Log logger	= LogFactory.getLog(XACMLPolicyImporter.class);
-	
-	public enum OPTION {
-		/*
-		 * Overwrite any existing ID
-		 */
-		OVERWRITE_EXISTING,
-		/*
-		 * Update an existing ID - only ADDs information
-		 */
-		UPDATE_EXISTING,
-		/*
-		 * Does not change an existing ID
-		 */
-		DONOTCHANGE_EXISTING
-	}
-	
-	public boolean	importAttributes = true;
-	public boolean	ignoreStandardAttributes = true;
-	public boolean	addConstraints = true;
-	public OPTION	attributeOption = OPTION.OVERWRITE_EXISTING;
-	public boolean	importObligations = true;
-	public OPTION	obligationOption = OPTION.OVERWRITE_EXISTING;
-	public boolean	importAdvice = true;
-	public OPTION	adviceOption = OPTION.OVERWRITE_EXISTING;
-
-	public XACMLPolicyImporter() {
-	}
-
-	public boolean isImportAttributes() {
-		return importAttributes;
-	}
-
-	public void setImportAttributes(boolean importAttributes) {
-		this.importAttributes = importAttributes;
-	}
-
-	public boolean isIgnoreStandardAttributes() {
-		return ignoreStandardAttributes;
-	}
-
-	public void setIgnoreStandardAttributes(boolean ignoreStandardAttributes) {
-		this.ignoreStandardAttributes = ignoreStandardAttributes;
-	}
-
-	public boolean isAddConstraints() {
-		return addConstraints;
-	}
-
-	public void setAddConstraints(boolean addConstraints) {
-		this.addConstraints = addConstraints;
-	}
-
-	public OPTION getAttributeOption() {
-		return attributeOption;
-	}
-
-	public void setAttributeOption(OPTION attributeOption) {
-		this.attributeOption = attributeOption;
-	}
-
-	public boolean isImportObligations() {
-		return importObligations;
-	}
-
-	public void setImportObligations(boolean importObligations) {
-		this.importObligations = importObligations;
-	}
-
-	public OPTION getObligationOption() {
-		return obligationOption;
-	}
-
-	public void setObligationOption(OPTION obligationOption) {
-		this.obligationOption = obligationOption;
-	}
-
-	public boolean isImportAdvice() {
-		return importAdvice;
-	}
-
-	public void setImportAdvice(boolean importAdvice) {
-		this.importAdvice = importAdvice;
-	}
-
-	public OPTION getAdviceOption() {
-		return adviceOption;
-	}
-
-	public void setAdviceOption(OPTION adviceOption) {
-		this.adviceOption = adviceOption;
-	}
-	@Override
-	public CallbackResult onObligation(Object parent, ObligationExpressionType expression, Obligation obligation) {
-		if (importObligations) {
-			super.onObligation(parent, expression, obligation);
-		}
-		return CallbackResult.CONTINUE;
-	}
-	
-	@Override
-	public CallbackResult onAttribute(Object parent, Object container, org.apache.openaz.xacml.api.Attribute attribute) {
-		if (importAttributes) {
-			super.onAttribute(parent, container, attribute);
-		}
-		return CallbackResult.CONTINUE;
-	}
-	
-	@Override
-	public CallbackResult onAdvice(Object parent, AdviceExpressionType expression, Advice advice) {
-		if (importAdvice) {
-			super.onAdvice(parent, expression, advice);
-		}
-		return CallbackResult.CONTINUE;
-	}
-
-	@Override
-	public void onFinishScan(Object root) {
-		if (this.importAttributes && this.doImportAttributes() > 0) {
-			((XacmlAdminUI)UI.getCurrent()).refreshAttributes();
-		}
-		int changes = 0;
-		if (this.importObligations) {
-			changes += this.doImportObligations();
-		}
-		if (this.importAdvice) {
-			changes += this.doImportAdvice();
-		}
-		//
-		// If changes were made, we need to tell the UI so the
-		// dictionary can refresh.
-		//
-		if (changes > 0) {
-			((XacmlAdminUI)UI.getCurrent()).refreshObadvice();
-		}
-	}
-	
-	@SuppressWarnings("unchecked")
-	protected int doImportAttributes() {
-		int changes = 0;
-		//
-		// Get our attributes. This container is modifiable.
-		//
-		JPAContainer<Attribute> attributes = ((XacmlAdminUI)UI.getCurrent()).getAttributes();
-		//
-		// Get mutable entity providers for these.
-		//
-		JPAContainer<Category> categories = new JPAContainer<Category>(Category.class);
-		categories.setEntityProvider(new CachingMutableLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-
-		JPAContainer<Datatype> datatypes = new JPAContainer<Datatype>(Datatype.class);
-		datatypes.setEntityProvider(new CachingMutableLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		//
-		// Work the map
-		//
-		for (Identifier cat : this.attributeMap.keySet()) {
-			//
-			// Does category exist?
-			//
-			Category category = JPAUtils.findCategory(cat);
-			if (category == null) {
-				//
-				// This should rarely happen, but is possible since XACML 3.0
-				// you can define your own categories.
-				//
-				logger.warn("New category: " + cat);
-				category = new Category(cat, Category.CUSTOM);
-				String shortName = XACMLConstants.extractShortName(cat.stringValue());
-				if (shortName != null) {
-					category.setShortName(shortName);
-				} else {
-					category.setShortName(category.getXacmlId());
-				}
-				//
-				// Make sure the grouping is ok
-				//
-				if (category.getGrouping() == null) {
-					category.setGrouping(category.getShortName());
-				}
-				//
-				// Add it in
-				//
-				categories.addEntity(category);
-				//
-				// Tell the RO to update itself.
-				//
-				((XacmlAdminUI)UI.getCurrent()).getCategories().refresh();
-			}
-			Map<Identifier, Map<Identifier, Set<AttributeValue<?>>>> map = this.attributeMap.get(cat);
-			for (Identifier dt : map.keySet()) {
-				//
-				// Does datatype exist?
-				//
-				Datatype datatype = JPAUtils.findDatatype(dt);
-				if (datatype == null) {
-					//
-					// This should rarely happen, but is possible since XACML 3.0
-					// you can define new datatypes.
-					//
-					logger.warn("New datatype: " + dt);
-					datatype = new Datatype(dt, Datatype.CUSTOM);
-					String shortName = XACMLConstants.extractShortName(dt.stringValue());
-					if (shortName != null) {
-						datatype.setShortName(shortName);
-					} else {
-						datatype.setShortName(datatype.getXacmlId());
-					}
-					//
-					// Add it in
-					//
-					datatypes.addEntity(datatype);
-					//
-					// Tell the Read-Only property to update itself.
-					//
-					((XacmlAdminUI)UI.getCurrent()).getDatatypes().refresh();
-				}
-				//
-				// Iterate the attributes
-				//
-				for (Identifier id : map.get(dt).keySet()) {
-					//
-					// Do we ignore it if its standard?
-					//
-					if (! this.ignoreStandardAttributes || 
-						XACMLConstants.STANDARD_ATTRIBUTES.contains(id) == false) {
-						//
-						// Does it already exist?
-						//
-						Attribute newAttribute = null;
-						Attribute currentAttribute = JPAUtils.findAttribute(category, datatype, id.stringValue());
-						//
-						// Support for an existing attribute
-						//
-						if (currentAttribute != null) {
-							if (this.attributeOption == OPTION.OVERWRITE_EXISTING) {
-								newAttribute = currentAttribute;
-								newAttribute.setConstraintType(null);
-								newAttribute.removeAllConstraintValues();
-							} else if (this.attributeOption == OPTION.DONOTCHANGE_EXISTING) {
-								logger.info("Do not change existing: " + currentAttribute);
-								continue;
-							} else if (this.attributeOption == OPTION.UPDATE_EXISTING) {
-								newAttribute = currentAttribute;
-							}
-						} else {
-							//
-							// Create our new attribute
-							//
-							newAttribute = new Attribute(id.stringValue(), ((XacmlAdminUI)UI.getCurrent()).getUserid());
-							newAttribute.setCategoryBean(category);
-							newAttribute.setDatatypeBean(datatype);
-						}
-						//
-						// Get all the values
-						//
-						Set<AttributeValue<?>> values = map.get(dt).get(id);
-						//
-						// Do we have more than 1? Also, omit boolean datatype which
-						// doesn't make any sense to enumerate.
-						//
-						if (values.size() > 1 && dt.equals(XACML3.ID_DATATYPE_BOOLEAN) == false) {
-							//
-							// We have a lot of possible values, add as an enumeration
-							//
-							newAttribute.setConstraintType(JPAUtils.findConstraintType(ConstraintType.ENUMERATION_TYPE));
-							for (AttributeValue<?> value : values) {
-								Object val = value.getValue();
-								String content;
-								if (val instanceof Collection) {
-									content = XACMLObjectCopy.getContent((List<Object>) value.getValue());
-								} else {
-									content = val.toString();
-								}
-								//
-								// Check if we should add it in
-								//
-								boolean add = true;
-								//
-								// If we are updating an existing, we can really only do this for enumerations,
-								// its impossible to resolve a regular expression or range.
-								//
-								if (currentAttribute != null && this.attributeOption == OPTION.UPDATE_EXISTING &&
-											newAttribute.getConstraintType().getConstraintType().equals(ConstraintType.ENUMERATION_TYPE)) {
-									//
-									// Make sure it isn't there already, no duplicates.
-									//
-									for (ConstraintValue currentConstraintValue : newAttribute.getConstraintValues()) {
-										if (currentConstraintValue.getValue().equals(content)) {
-											add = false;
-											break;
-										}
-									}
-								}
-								if (add && content.isEmpty() == false) {
-									ConstraintValue newValue = new ConstraintValue("Enumeration", content);
-									newValue.setAttribute(newAttribute);
-									newAttribute.addConstraintValue(newValue);
-								}
-							}
-						}
-						//
-						// Add it
-						//
-						if (newAttribute != null) {
-							if (newAttribute.getId() == 0) {
-								logger.info("Adding new attribute");
-								if (attributes.addEntity(newAttribute) == null) {
-									logger.error("Failed to add new attribute: " + newAttribute);
-								} else {
-									changes++;
-								}
-							} else {
-								logger.info("Updating attribute " + newAttribute);
-								try {
-									attributes.commit();
-									changes++;
-								} catch (SourceException | InvalidValueException e) {
-									logger.error("Update failed: " + e.getLocalizedMessage());
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return changes;
-	}
-
-	protected int doImportObligations() {
-		int changes = 0;
-		JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice();
-		for (Identifier id : this.obligationMap.keySet()) {
-			for (EffectType effect : this.obligationMap.get(id).keySet()) {
-				for (Obligation obligation : this.obligationMap.get(id).get(effect)) {
-					Obadvice newObligation = null;
-					Obadvice currentObligation = JPAUtils.findObligation(obligation.getId(), effect);
-					//
-					// Does it exist?
-					//
-					if (currentObligation != null) {
-						if (this.obligationOption == OPTION.OVERWRITE_EXISTING) {
-							newObligation = currentObligation;
-							newObligation.removeAllExpressions();
-						} else if (this.obligationOption == OPTION.DONOTCHANGE_EXISTING) {
-							continue;
-						} else if (this.obligationOption == OPTION.UPDATE_EXISTING) {
-							newObligation = currentObligation;
-						}
-					} else {
-						//
-						// Create new one
-						//
-						newObligation = new Obadvice(obligation.getId(), ((XacmlAdminUI)UI.getCurrent()).getUserid());
-						newObligation.setFulfillOn((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY));
-					}
-					//
-					// TODO add the expressions
-					//
-					
-					//
-					// Add it in
-					//
-					if (newObligation != null) {
-						if (newObligation.getId() == 0) {
-							logger.info("Adding obligation " + newObligation);
-							oa.addEntity(newObligation);
-							changes++;
-						} else {
-							logger.info("Updating obligation " + newObligation);
-							try {
-								oa.commit();
-								changes++;
-							} catch (SourceException | InvalidValueException e) {
-								logger.error("Update obligation failed " + e.getLocalizedMessage());
-							}
-						}
-					}
-				}
-			}
-		}
-		return changes;
-	}
-	
-	protected int doImportAdvice() {
-		int changes = 0;
-		JPAContainer<Obadvice> oa = ((XacmlAdminUI)UI.getCurrent()).getObadvice();
-		for (Identifier id : this.adviceMap.keySet()) {
-			for (EffectType effect : this.adviceMap.get(id).keySet()) {
-				for (Advice advice : this.adviceMap.get(id).get(effect)) {
-					Obadvice newAdvice = null;
-					Obadvice currentAdvice = JPAUtils.findAdvice(advice.getId(), effect);
-					//
-					// Does it exist?
-					//
-					if (currentAdvice != null) {
-						if (this.adviceOption == OPTION.OVERWRITE_EXISTING) {
-							newAdvice = currentAdvice;
-							newAdvice.removeAllExpressions();
-						} else if (this.adviceOption == OPTION.DONOTCHANGE_EXISTING) {
-							continue;
-						} else if (this.adviceOption == OPTION.UPDATE_EXISTING) {
-							newAdvice = currentAdvice;
-						}
-					} else {
-						//
-						// Create new one
-						//
-						newAdvice = new Obadvice(advice.getId(), ((XacmlAdminUI)UI.getCurrent()).getUserid());
-						newAdvice.setType(Obadvice.ADVICE);
-						newAdvice.setFulfillOn((effect == EffectType.PERMIT ? Obadvice.EFFECT_PERMIT : Obadvice.EFFECT_DENY));
-					}
-					//
-					// TODO add the expressions
-					//
-					
-					//
-					// Add it in
-					//
-					if (newAdvice != null) {
-						if (newAdvice.getId() == 0) {
-							logger.info("Adding advice " + newAdvice);
-							oa.addEntity(newAdvice);
-							changes++;
-						} else {
-							logger.info("Updating advice " + newAdvice);
-							try {
-								oa.commit();
-								changes++;
-							} catch (SourceException | InvalidValueException e) {
-								logger.error("Update advice failed " + e.getLocalizedMessage());
-							}
-						}
-					}
-				}
-			}
-		}
-		return changes;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java
deleted file mode 100644
index 0dd7f32..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeDictionarySelectorComponent.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.components.AttributeDictionary;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.ListSelect;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-
-public class AttributeDictionarySelectorComponent extends CustomComponent implements AttributeChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private ListSelect listSelectAttribute;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_2;
-	@AutoGenerated
-	private Button buttonNewAttribute;
-	@AutoGenerated
-	private ComboBox comboBoxCategoryFilter;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final AttributeDictionarySelectorComponent self = this;
-	private final Datatype datatype;
-	private final Attribute initialAttribute;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private static final JPAContainer<Category>	categories = new JPAContainer<Category>(Category.class);
-	private static final JPAContainer<Attribute>	attributes = new JPAContainer<Attribute>(Attribute.class);
-	static {
-		attributes.setEntityProvider(new CachingLocalEntityProvider<Attribute>(Attribute.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		attributes.sort(new String[]{"xacmlId"}, new boolean[]{true});
-		categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
-	}
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeDictionarySelectorComponent(Datatype datatype, Attribute initialAttribute) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save pointer and finish container initialization
-		//
-		this.datatype = datatype;
-		this.initialAttribute = initialAttribute;
-		//
-		// Initialize
-		//
-		this.initializeCategoryFilter();
-		this.initializeAttributes();
-		this.initializeButtons();
-		//
-		// Set our focus
-		//
-		this.listSelectAttribute.focus();
-	}
-	
-	protected void initializeCategoryFilter() {
-		//
-		// Remove any filters
-		//
-		AttributeDictionarySelectorComponent.categories.removeAllContainerFilters();
-		//
-		// Initialize data source and GUI properties
-		//
-		this.comboBoxCategoryFilter.setContainerDataSource(AttributeDictionarySelectorComponent.categories);
-		this.comboBoxCategoryFilter.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxCategoryFilter.setItemCaptionPropertyId("xacmlId");
-		this.comboBoxCategoryFilter.setImmediate(true);
-		//
-		// Respond to events
-		//
-		this.comboBoxCategoryFilter.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Clear any existing filters
-				//
-				AttributeDictionarySelectorComponent.attributes.removeAllContainerFilters();
-				//
-				// Get the current selection
-				//
-				Object id = self.comboBoxCategoryFilter.getValue();
-				//
-				// Is anything currently selected?
-				//
-				if (id != null) {
-					//
-					// Yes - add the new filter into the container
-					//
-					AttributeDictionarySelectorComponent.attributes.addContainerFilter(new Compare.Equal("categoryBean", AttributeDictionarySelectorComponent.categories.getItem(id).getEntity()));
-				}
-			}
-		});
-	}
-	
-	protected void initializeAttributes() {
-		//
-		// Remove any filters
-		//
-		AttributeDictionarySelectorComponent.attributes.removeAllContainerFilters();
-		//
-		// Initialize data source and GUI properties
-		//
-		this.listSelectAttribute.setContainerDataSource(AttributeDictionarySelectorComponent.attributes);
-		this.listSelectAttribute.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.listSelectAttribute.setItemCaptionPropertyId("xacmlId");
-		this.listSelectAttribute.setImmediate(true);
-		this.listSelectAttribute.setHeight(7, Unit.EM);
-		//
-		// Filter by datatype
-		//
-		if (this.datatype != null) {
-			AttributeDictionarySelectorComponent.attributes.addContainerFilter(new Compare.Equal("datatypeBean", this.datatype));
-		}
-		//
-		// Is there a default selection?  Is there an id?
-		//
-		if (this.initialAttribute != null && this.initialAttribute.getId() != 0) {
-			this.listSelectAttribute.select(this.initialAttribute.getId());
-		}
-		//
-		// Respond to events
-		//
-		this.listSelectAttribute.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonNewAttribute.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				AttributeDictionary.createNewAttributeWindow();
-			}
-		});
-	}
-	
-	@Override
-	public void commit() {
-		this.listSelectAttribute.commit();
-	}
-	
-	@Override
-	public Attribute getAttribute() {
-		Object id = this.listSelectAttribute.getValue();
-		if (id == null) {
-			return null;
-		}
-		return AttributeDictionarySelectorComponent.attributes.getItem(id).getEntity();
-	}
-
-	@Override
-	public boolean addListener(AttributeChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(AttributeChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireAttributeChanged(Attribute attribute) {
-		this.notifier.fireAttributeChanged(attribute);
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_2
-		horizontalLayout_2 = buildHorizontalLayout_2();
-		mainLayout.addComponent(horizontalLayout_2);
-		
-		// listSelectAttribute
-		listSelectAttribute = new ListSelect();
-		listSelectAttribute.setCaption("Dictionary Attributes");
-		listSelectAttribute.setImmediate(false);
-		listSelectAttribute.setWidth("100.0%");
-		listSelectAttribute.setHeight("-1px");
-		listSelectAttribute.setInvalidAllowed(false);
-		listSelectAttribute.setRequired(true);
-		mainLayout.addComponent(listSelectAttribute);
-		mainLayout.setExpandRatio(listSelectAttribute, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_2() {
-		// common part: create layout
-		horizontalLayout_2 = new HorizontalLayout();
-		horizontalLayout_2.setImmediate(false);
-		horizontalLayout_2.setWidth("-1px");
-		horizontalLayout_2.setHeight("-1px");
-		horizontalLayout_2.setMargin(false);
-		horizontalLayout_2.setSpacing(true);
-		
-		// comboBoxCategoryFilter
-		comboBoxCategoryFilter = new ComboBox();
-		comboBoxCategoryFilter.setCaption("Filter Category");
-		comboBoxCategoryFilter.setImmediate(false);
-		comboBoxCategoryFilter.setWidth("-1px");
-		comboBoxCategoryFilter.setHeight("-1px");
-		horizontalLayout_2.addComponent(comboBoxCategoryFilter);
-		horizontalLayout_2.setExpandRatio(comboBoxCategoryFilter, 1.0f);
-		
-		// buttonNewAttribute
-		buttonNewAttribute = new Button();
-		buttonNewAttribute.setCaption("New Attribute");
-		buttonNewAttribute.setImmediate(true);
-		buttonNewAttribute
-				.setDescription("Click to create a new attribute in the dictionary.");
-		buttonNewAttribute.setWidth("-1px");
-		buttonNewAttribute.setHeight("-1px");
-		horizontalLayout_2.addComponent(buttonNewAttribute);
-		horizontalLayout_2.setComponentAlignment(buttonNewAttribute,
-				new Alignment(10));
-		
-		return horizontalLayout_2;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java
deleted file mode 100644
index c1568b9..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeSimpleCreatorComponent.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-
-public class AttributeSimpleCreatorComponent extends CustomComponent implements AttributeChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private Table tableDatatype;
-	@AutoGenerated
-	private Table tableCategory;
-	@AutoGenerated
-	private TextField textFieldContextPath;
-	@AutoGenerated
-	private TextField textFieldAttributeId;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final AttributeSimpleCreatorComponent self = this;
-	private final Datatype datatype;
-	private final Attribute attribute;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private static final JPAContainer<Category>	categories = new JPAContainer<Category>(Category.class);
-	private static final JPAContainer<Datatype>	datatypes = new JPAContainer<Datatype>(Datatype.class);
-	static {
-		categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
-		datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
-	}
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeSimpleCreatorComponent(Datatype datatype, Attribute initialAttribute) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.datatype = datatype;
-		this.attribute = initialAttribute;
-		//
-		// Initialize GUI
-		//
-		this.initializeCategories();
-		this.initializeDatatypes();
-		this.initializeAttributeId();
-		//
-		// Focus
-		//
-		this.textFieldAttributeId.focus();
-	}
-	
-	private void initializeCategories() {
-		//
-		// Remove any filters
-		//
-		AttributeSimpleCreatorComponent.categories.removeAllContainerFilters();
-		//
-		// Initialize data source & GUI properties
-		//
-		this.tableCategory.setContainerDataSource(AttributeSimpleCreatorComponent.categories);
-		this.tableCategory.setVisibleColumns(new Object[] {"xacmlId"});
-		this.tableCategory.setColumnHeaders(new String[] {"XACML ID"});
-		this.tableCategory.setImmediate(true);
-		this.tableCategory.setNullSelectionAllowed(false);
-		this.tableCategory.setPageLength(10);
-		this.tableCategory.setSelectable(true);
-		//
-		// Default selection
-		//
-		Category defaultCategory;
-		if (this.attribute == null || this.attribute.getCategoryBean() == null || this.attribute.getCategoryBean().getIdentifer() == null) {
-			defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT);
-			assert defaultCategory != null;
-		} else {
-			defaultCategory = JPAUtils.findCategory(this.attribute.getCategoryBean().getIdentifer());
-		}
-		if (defaultCategory != null) {
-			this.tableCategory.select(defaultCategory.getId());
-		}
-		//
-		// Respond to changes
-		//
-		this.tableCategory.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-
-	private void initializeDatatypes() {
-		//
-		// Remove any filters
-		//
-		AttributeSimpleCreatorComponent.datatypes.removeAllContainerFilters();
-		//
-		// Initialize data source & GUI properties
-		//
-		this.tableDatatype.setContainerDataSource(AttributeSimpleCreatorComponent.datatypes);
-		this.tableDatatype.setVisibleColumns(new Object[] {"xacmlId", "shortName"});
-		this.tableDatatype.setColumnHeaders(new String[] {"Data Type ID", "Data Type"});
-		this.tableDatatype.setNullSelectionAllowed(false);
-		this.tableDatatype.setImmediate(true);
-		this.tableDatatype.setPageLength(10);
-		//
-		// Are we restricted to a certain datatype?
-		//
-		if (this.datatype != null) {
-			//
-			// Datatype restricted
-			//
-			this.tableDatatype.select(this.datatype.getId());
-			this.tableDatatype.setEnabled(false);
-			return;
-		}
-		this.tableDatatype.setSelectable(true);
-		//
-		// Do we have a default value?
-		//
-		Datatype defaultDatatype;
-		if (this.attribute != null && this.attribute.getDatatypeBean() != null) {
-			defaultDatatype = this.attribute.getDatatypeBean();
-		} else {
-			defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING);
-		}
-		if (defaultDatatype != null) {
-			this.tableDatatype.select(defaultDatatype.getId());
-		}
-		//
-		// Respond to changes
-		//
-		this.tableDatatype.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	private void initializeAttributeId() {
-		this.textFieldAttributeId.setImmediate(true);
-		this.textFieldAttributeId.setNullRepresentation("");
-		if (this.attribute == null) {
-			this.textFieldAttributeId.setValue(XacmlAdminUI.getDomain());
-		} else {
-			//
-			// Set the ID
-			//
-			this.textFieldAttributeId.setValue(this.attribute.getXacmlId());
-			//
-			// Is it an attribute selector?
-			//
-			if (this.attribute.isDesignator()) {
-				this.textFieldContextPath.setVisible(false);
-				this.textFieldContextPath.setRequired(false);
-			} else {
-				this.textFieldAttributeId.setCaption("Context Selector Id");
-				this.textFieldAttributeId.setRequired(false);
-				this.textFieldContextPath.setVisible(true);				
-				this.textFieldContextPath.setValue(this.attribute.getSelectorPath());
-				this.textFieldContextPath.setRequired(true);
-				this.textFieldContextPath.setRequiredError("You must have a context path for a selector.");
-				this.textFieldContextPath.addValueChangeListener(new ValueChangeListener() {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public void valueChange(ValueChangeEvent event) {
-						self.fireAttributeChanged(self.getAttribute());
-					}
-				});
-			}
-		}
-		//
-		// Respond to changes
-		//
-		this.textFieldAttributeId.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	@Override
-	public Attribute	getAttribute() {
-		try {
-			this.textFieldAttributeId.commit();
-		} catch (Exception e) { //NOPMD
-			// TODO - Handle, Log or NOPMD
-			// TODO - Will vaadin display error?
-		}
-		Attribute attribute = new Attribute(this.textFieldAttributeId.getValue());
-		attribute.setSelectorPath(this.textFieldContextPath.getValue());
-		Object categoryId = this.tableCategory.getValue();
-		if (categoryId != null) {
-			attribute.setCategoryBean(AttributeSimpleCreatorComponent.categories.getItem(categoryId).getEntity());
-		}
-		if (this.datatype != null) {
-			attribute.setDatatypeBean(this.datatype);
-		} else {
-			Object datatypeId = this.tableDatatype.getValue();
-			if (datatypeId == null) {
-				return null;
-			}
-			attribute.setDatatypeBean(AttributeSimpleCreatorComponent.datatypes.getItem(datatypeId).getEntity());
-		}
-		return attribute;
-	}
-	
-	@Override
-	public boolean addListener(AttributeChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(AttributeChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void commit() {
-		try {
-			this.textFieldAttributeId.commit();
-			this.textFieldContextPath.commit();
-			this.tableCategory.commit();
-			this.tableDatatype.commit();
-		} catch (Exception e) { //NOPMD
-			// TODO - Handle, Log or NOPMD
-			// TODO - Will vaadin display error?
-		}
-	}
-
-	@Override
-	public void fireAttributeChanged(Attribute attribute) {
-		this.notifier.fireAttributeChanged(attribute);
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldAttributeId
-		textFieldAttributeId = new TextField();
-		textFieldAttributeId.setCaption("Attribute Id");
-		textFieldAttributeId.setImmediate(false);
-		textFieldAttributeId.setWidth("100.0%");
-		textFieldAttributeId.setHeight("-1px");
-		textFieldAttributeId.setInvalidAllowed(false);
-		textFieldAttributeId.setRequired(true);
-		mainLayout.addComponent(textFieldAttributeId);
-		mainLayout.setExpandRatio(textFieldAttributeId, 1.0f);
-		
-		// textFieldContextPath
-		textFieldContextPath = new TextField();
-		textFieldContextPath.setCaption("Context Path");
-		textFieldContextPath.setImmediate(false);
-		textFieldContextPath.setDescription("The Selector's Context Path.");
-		textFieldContextPath.setWidth("100.0%");
-		textFieldContextPath.setHeight("-1px");
-		textFieldContextPath
-				.setInputPrompt("eg. md:record/md:patient/md:patient-number/text()");
-		mainLayout.addComponent(textFieldContextPath);
-		mainLayout.setExpandRatio(textFieldContextPath, 1.0f);
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// tableCategory
-		tableCategory = new Table();
-		tableCategory.setCaption("Choose Category");
-		tableCategory.setImmediate(false);
-		tableCategory.setWidth("-1px");
-		tableCategory.setHeight("-1px");
-		tableCategory.setInvalidAllowed(false);
-		tableCategory.setRequired(true);
-		horizontalLayout_1.addComponent(tableCategory);
-		
-		// tableDatatype
-		tableDatatype = new Table();
-		tableDatatype.setCaption("Choose Data Type");
-		tableDatatype.setImmediate(false);
-		tableDatatype.setWidth("-1px");
-		tableDatatype.setHeight("-1px");
-		tableDatatype.setInvalidAllowed(false);
-		tableDatatype.setRequired(true);
-		horizontalLayout_1.addComponent(tableDatatype);
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java
deleted file mode 100644
index a3fded5..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/AttributeStandardSelectorComponent.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.io.Serializable;
-import java.util.Set;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.util.XACMLConstants;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.util.BeanItem;
-import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-
-public class AttributeStandardSelectorComponent extends CustomComponent implements AttributeChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_2;
-	@AutoGenerated
-	private Table tableDatatypes;
-	@AutoGenerated
-	private Table tableAttributes;
-	@AutoGenerated
-	private ComboBox comboBoxCategories;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	public class AttributeBean implements Serializable {
-		private static final long serialVersionUID = 1L;
-		private Identifier	attributeId;
-		private Identifier	categoryId;
-		
-		public AttributeBean(Identifier category, Identifier id) {
-			this.categoryId = category;
-			this.attributeId = id;
-		}
-		public Identifier getAttributeId() {
-			return attributeId;
-		}
-		public void setAttributeId(Identifier attributeId) {
-			this.attributeId = attributeId;
-		}
-		public Identifier getCategoryId() {
-			return categoryId;
-		}
-		public void setCategoryId(Identifier categoryId) {
-			this.categoryId = categoryId;
-		}
-		@Override
-		public String toString() {
-			return this.attributeId.stringValue();
-		}
-		
-	}
-	private final AttributeStandardSelectorComponent self = this;
-	private final Datatype datatype;
-	private final Attribute attribute;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private static final JPAContainer<Category>	categories = new JPAContainer<Category>(Category.class);
-	private static final JPAContainer<Datatype>	datatypes = new JPAContainer<Datatype>(Datatype.class);
-	static {
-		categories.setEntityProvider(new CachingLocalEntityProvider<Category>(Category.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		datatypes.setEntityProvider(new CachingLocalEntityProvider<Datatype>(Datatype.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		categories.sort(new String[]{"xacmlId"}, new boolean[]{true});
-		datatypes.sort(new String[]{"xacmlId"}, new boolean[]{true});
-	}
-	private BeanItemContainer<AttributeBean> container = new BeanItemContainer<AttributeBean>(AttributeBean.class);
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeStandardSelectorComponent(Datatype datatype, Attribute initialAttribute) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.datatype = datatype;
-		this.attribute = initialAttribute;
-		//
-		// Initialize GUI
-		//
-		this.initializeCategories();
-		this.initializeAttributes();
-		this.initializeDatatypes();
-		//
-		// Initialize focus
-		//
-		this.tableAttributes.focus();
-	}
-	
-	private void initializeCategories() {
-		//
-		// Remove any filters
-		//
-		AttributeStandardSelectorComponent.categories.removeAllContainerFilters();
-		//
-		// Initialize data source & GUI properties
-		//
-		this.comboBoxCategories.setContainerDataSource(AttributeStandardSelectorComponent.categories);
-		this.comboBoxCategories.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxCategories.setItemCaptionPropertyId("xacmlId");
-		this.comboBoxCategories.setImmediate(true);
-		this.comboBoxCategories.setNullSelectionAllowed(false);
-		//
-		// Set default selection
-		//
-		Category defaultCategory;
-		if (this.attribute == null || this.attribute.getCategoryBean() == null) {
-			defaultCategory = JPAUtils.findCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT);
-		} else {
-			defaultCategory = this.attribute.getCategoryBean();
-		}
-		if (defaultCategory != null) {
-			this.comboBoxCategories.select(defaultCategory.getId());
-		}
-		//
-		// Respond to events
-		//
-		this.comboBoxCategories.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupAttributeIDs();
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	private void initializeAttributes() {
-		//
-		// Initialize GUI properties
-		//
-		this.tableAttributes.setImmediate(true);
-		this.tableAttributes.setNullSelectionAllowed(false);
-		this.tableAttributes.setPageLength(10);
-		//
-		// Setup
-		//
-		this.tableAttributes.setContainerDataSource(this.container);
-		this.tableAttributes.setVisibleColumns(new Object[] {"attributeId"});
-		this.tableAttributes.setColumnHeaders(new String[] {"Attribute Id"});
-		this.tableAttributes.setSelectable(true);
-		this.setupAttributeIDs();
-		//
-		// Respond
-		//
-		this.tableAttributes.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	private void initializeDatatypes() {
-		//
-		// Remove any filters
-		//
-		AttributeStandardSelectorComponent.datatypes.removeAllContainerFilters();
-		//
-		// Initialize data source & GUI properties
-		//
-		this.tableDatatypes.setContainerDataSource(AttributeStandardSelectorComponent.datatypes);
-		this.tableDatatypes.setVisibleColumns(new Object[] {"shortName", "xacmlId"});
-		this.tableDatatypes.setColumnHeaders(new String[] {"Short Name", "XACML Data Type ID"});
-		this.tableDatatypes.setImmediate(true);
-		this.tableDatatypes.setNullSelectionAllowed(false);
-		this.tableDatatypes.setPageLength(10);
-		//
-		// Are we restricted to a certain datatype?
-		//
-		if (this.datatype != null) {
-			//
-			// Datatype restricted
-			//
-			this.tableDatatypes.select(this.datatype.getId());
-			this.tableDatatypes.setEnabled(false);
-			return;
-		}
-		this.tableDatatypes.setSelectable(true);
-		//
-		// Select a default
-		//
-		Datatype defaultDatatype;
-		if (this.attribute == null || this.attribute.getDatatypeBean() == null) {
-			defaultDatatype = JPAUtils.findDatatype(XACML3.ID_DATATYPE_STRING);
-		} else {
-			defaultDatatype = this.attribute.getDatatypeBean();
-		}
-		if (defaultDatatype != null) {
-			this.tableDatatypes.select(defaultDatatype.getId());
-		}
-		//
-		// Respond to events
-		//
-		this.tableDatatypes.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.fireAttributeChanged(self.getAttribute());
-			}
-		});
-	}
-	
-	private void	setupAttributeIDs() {
-		//
-		// Get the current selection (should NOT be null)
-		//
-		Object id = this.comboBoxCategories.getValue();
-		Category category = AttributeStandardSelectorComponent.categories.getItem(id).getEntity();
-		Set<Identifier> attributeIDs = null;
-		if (category.isStandard()) {
-			//
-			// Get the subset of attribute ID's specific to this standard
-			// category.
-			//
-			attributeIDs = XACMLConstants.MAP_STANDARD_CATEGORIES.get(category.getIdentifer());
-		}
-		if (attributeIDs == null) {
-			//
-			// A custom category, there are no default attribute IDs
-			// that we can determine.
-			//
-			attributeIDs = XACMLConstants.STANDARD_ATTRIBUTES;
-		} 
-		//
-		// Reset attribute IDs. Based on the category, add only acceptable
-		// attribute ID's for the category.
-		//
-		Object defaultBean = null;
-		this.tableAttributes.removeAllItems();
-		for (Identifier attributeId : attributeIDs) {
-			BeanItem<AttributeBean> newItem = this.container.addItem(new AttributeBean(category.getIdentifer(), attributeId));
-			if (this.attribute == null) {
-				if (attributeId.equals(XACML3.ID_SUBJECT_SUBJECT_ID) ||
-					attributeId.equals(XACML3.ID_ACTION_ACTION_ID) ||
-					attributeId.equals(XACML3.ID_RESOURCE_RESOURCE_ID) ||
-					attributeId.equals(XACML3.ID_ENVIRONMENT_CURRENT_DATE)) {
-					defaultBean = newItem.getBean();
-				}
-			} else {
-				if (newItem.getBean().getAttributeId().stringValue().equals(this.attribute.getXacmlId())) {
-					defaultBean = newItem.getBean();
-				}
-			}
-		}
-		//
-		// Set the default selection
-		//
-		if (defaultBean != null) {
-			this.tableAttributes.select(defaultBean);
-		}
-	}
-	
-	@Override
-	public void commit() {
-		this.comboBoxCategories.commit();
-		this.tableAttributes.commit();
-		this.tableDatatypes.commit();
-	}
-
-	@Override
-	public Attribute	getAttribute() {
-		Object categoryId = this.comboBoxCategories.getValue();
-		Object attributeId = this.tableAttributes.getValue();
-		Object datatypeId = this.tableDatatypes.getValue();
-		if (attributeId == null || datatypeId == null || categoryId == null) {
-			return null;
-		}
-		AttributeBean attributeBean = this.container.getItem(attributeId).getBean();
-		Datatype datatype = AttributeStandardSelectorComponent.datatypes.getItem(datatypeId).getEntity();
-		Category category = AttributeStandardSelectorComponent.categories.getItem(categoryId).getEntity();
-		if (datatype == null || category == null) {
-			return null;
-		}
-		Attribute attribute = new Attribute(attributeBean.getAttributeId().stringValue());
-		attribute.setCategoryBean(category);
-		attribute.setDatatypeBean(datatype);
-		
-		return attribute;
-	}
-
-	@Override
-	public boolean addListener(AttributeChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(AttributeChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireAttributeChanged(Attribute attribute) {
-		this.notifier.fireAttributeChanged(attribute);
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// comboBoxCategories
-		comboBoxCategories = new ComboBox();
-		comboBoxCategories.setCaption("Select A Category");
-		comboBoxCategories.setImmediate(false);
-		comboBoxCategories.setWidth("-1px");
-		comboBoxCategories.setHeight("-1px");
-		comboBoxCategories.setInvalidAllowed(false);
-		comboBoxCategories.setRequired(true);
-		mainLayout.addComponent(comboBoxCategories);
-		mainLayout.setExpandRatio(comboBoxCategories, 1.0f);
-		
-		// horizontalLayout_2
-		horizontalLayout_2 = buildHorizontalLayout_2();
-		mainLayout.addComponent(horizontalLayout_2);
-		mainLayout.setExpandRatio(horizontalLayout_2, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_2() {
-		// common part: create layout
-		horizontalLayout_2 = new HorizontalLayout();
-		horizontalLayout_2.setImmediate(false);
-		horizontalLayout_2.setWidth("-1px");
-		horizontalLayout_2.setHeight("-1px");
-		horizontalLayout_2.setMargin(false);
-		horizontalLayout_2.setSpacing(true);
-		
-		// tableAttributes
-		tableAttributes = new Table();
-		tableAttributes.setCaption("Standard Attributes");
-		tableAttributes.setImmediate(false);
-		tableAttributes.setWidth("-1px");
-		tableAttributes.setHeight("-1px");
-		tableAttributes.setInvalidAllowed(false);
-		tableAttributes.setRequired(true);
-		horizontalLayout_2.addComponent(tableAttributes);
-		
-		// tableDatatypes
-		tableDatatypes = new Table();
-		tableDatatypes.setCaption("Standard Data Types");
-		tableDatatypes.setImmediate(false);
-		tableDatatypes.setWidth("-1px");
-		tableDatatypes.setHeight("-1px");
-		tableDatatypes.setInvalidAllowed(false);
-		tableDatatypes.setRequired(true);
-		horizontalLayout_2.addComponent(tableDatatypes);
-		
-		return horizontalLayout_2;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java
deleted file mode 100644
index ab466b0..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CSVPIPConfigurationComponent.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.util.converter.StringToIntegerConverter;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class CSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private TextField textFieldSkip;
-
-	@AutoGenerated
-	private TextField textFieldQuote;
-
-	@AutoGenerated
-	private TextField textFieldDelimiter;
-
-	@AutoGenerated
-	private TextField textFieldFile;
-
-	public static String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.CSVEngine";
-	
-	
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(CSVPIPConfigurationComponent.class);
-	private final CSVPIPConfigurationComponent self = this;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private final EntityItem<PIPConfiguration> entity;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param entityConfig 
-	 * @param configParamField 
-	 */
-	public CSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.entity = entityConfig;
-		//
-		// initialize
-		//
-		this.initialize();
-		//
-		//  Focus
-		//
-		this.textFieldFile.focus();
-	}
-	
-	protected void initialize() {
-		if (logger.isDebugEnabled()) {
-			logger.debug("initializing " + this.entity.getEntity().toString());
-		}
-		//
-		// What are our current values?
-		//
-		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
-		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
-			if (param.getParamName().equals(CSVEngine.PROP_SOURCE)) {
-				this.textFieldFile.setData(param);
-			} else if (param.getParamName().equals(CSVEngine.PROP_DELIMITER)) {
-				this.textFieldDelimiter.setData(param);
-			} else if (param.getParamName().equals(CSVEngine.PROP_QUOTE)) {
-				this.textFieldQuote.setData(param);
-			} else if (param.getParamName().equals(CSVEngine.PROP_SKIP)) {
-				this.textFieldSkip.setData(param);
-			} else {
-				unneeded.add(param);
-			}
-		}
-		if (unneeded.isEmpty() == false) {
-			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
-		}
-		//
-		//
-		//
-		this.initializeEntity();
-		this.initializeText();
-	}
-	
-	protected void initializeEntity() {
-		//
-		// Initialize the entity
-		//
-		this.entity.getEntity().setClassname(CLASSNAME);
-		this.entity.getEntity().setRequiresResolvers(true);
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textFieldFile.setRequired(true);
-		this.textFieldFile.setRequiredError("You need to specify a path to the CSV file on the server.");
-		this.textFieldFile.setImmediate(true);
-		this.textFieldFile.setNullRepresentation("");
-		//
-		//
-		//
-		PIPConfigParam param = (PIPConfigParam) this.textFieldFile.getData();
-		if (param != null) {
-			this.textFieldFile.setValue(param.getParamValue());
-		}
-		this.textFieldFile.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData();
-				if (param == null) {
-					param = new PIPConfigParam(CSVEngine.PROP_SOURCE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldFile.setData(param);
-				}
-				param.setParamValue(self.textFieldFile.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldFile.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldFile.getData();
-				if (param == null) {
-					param = new PIPConfigParam(CSVEngine.PROP_SOURCE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldFile.setData(param);
-				}
-				param.setParamValue(self.textFieldFile.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldDelimiter.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldDelimiter.getData();
-		if (param != null) {
-			this.textFieldDelimiter.setValue(param.getParamValue());
-		}
-		this.textFieldDelimiter.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldDelimiter.getData();
-				if (param == null) {
-					param = new PIPConfigParam(CSVEngine.PROP_DELIMITER);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldDelimiter.setData(param);
-				}
-				param.setParamValue(self.textFieldDelimiter.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldQuote.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldQuote.getData();
-		if (param != null) {
-			this.textFieldQuote.setValue(param.getParamValue());
-		}
-		this.textFieldQuote.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldQuote.getData();
-				if (param == null) {
-					param = new PIPConfigParam(CSVEngine.PROP_QUOTE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldQuote.setData(param);
-				}
-				param.setParamValue(self.textFieldQuote.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldSkip.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldSkip.getData();
-		if (param != null) {
-			this.textFieldSkip.setValue(param.getParamValue());
-		}
-		this.textFieldSkip.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldSkip.getData();
-				if (param == null) {
-					param = new PIPConfigParam(CSVEngine.PROP_SKIP);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldSkip.setData(param);
-				}
-				param.setParamValue(self.textFieldSkip.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldSkip.setConverter(new StringToIntegerConverter());
-	}
-	
-	public void validate() throws InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("validate");
-		}
-		this.textFieldFile.validate();
-		this.textFieldDelimiter.validate();
-		this.textFieldQuote.validate();
-		this.textFieldSkip.validate();
-	}
-	
-	public void commit() throws SourceException, InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("commit");
-		}
-		this.textFieldFile.commit();
-		this.textFieldDelimiter.commit();
-		this.textFieldQuote.commit();
-		
-		if (this.textFieldSkip.getValue() == null || this.textFieldSkip.getValue().isEmpty()) {
-			this.entity.getEntity().removePipconfigParam((PIPConfigParam) this.textFieldSkip.getData());
-			this.textFieldSkip.setData(null);
-		}
-		this.textFieldSkip.commit();
-	}
-
-	public void discard() throws SourceException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("discard");
-		}
-		this.textFieldFile.discard();
-		this.textFieldDelimiter.discard();
-		this.textFieldQuote.discard();
-		this.textFieldSkip.discard();
-		
-		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SOURCE);
-		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_DELIMITER);
-		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_QUOTE);
-		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_SKIP);
-		this.entity.getEntity().getPipconfigParams().remove(CSVEngine.PROP_MAXSIZE);
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-	
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldFile
-		textFieldFile = new TextField();
-		textFieldFile.setCaption("Path to CSV File");
-		textFieldFile.setImmediate(false);
-		textFieldFile
-				.setDescription("This is the path to CSV file on the PDP node.");
-		textFieldFile.setWidth("-1px");
-		textFieldFile.setHeight("-1px");
-		textFieldFile.setInvalidAllowed(false);
-		textFieldFile.setRequired(true);
-		textFieldFile
-				.setInputPrompt("Eg. \"c:\\data.csv\" \"http://foo.com/data.csv\"");
-		mainLayout.addComponent(textFieldFile);
-		mainLayout.setExpandRatio(textFieldFile, 1.0f);
-		
-		// textFieldDelimiter
-		textFieldDelimiter = new TextField();
-		textFieldDelimiter.setCaption("Delimiter");
-		textFieldDelimiter.setImmediate(false);
-		textFieldDelimiter
-				.setDescription("Enter a separator character or string that delineates columns in each row.");
-		textFieldDelimiter.setWidth("-1px");
-		textFieldDelimiter.setHeight("-1px");
-		textFieldDelimiter.setInputPrompt("Eg. \",\" or \"|\"");
-		textFieldDelimiter.setNullSettingAllowed(true);
-		mainLayout.addComponent(textFieldDelimiter);
-		mainLayout.setExpandRatio(textFieldDelimiter, 1.0f);
-		
-		// textFieldQuote
-		textFieldQuote = new TextField();
-		textFieldQuote.setCaption("Quote");
-		textFieldQuote.setImmediate(false);
-		textFieldQuote
-				.setDescription("Enter character used for quoted elements.");
-		textFieldQuote.setWidth("-1px");
-		textFieldQuote.setHeight("-1px");
-		textFieldQuote.setInputPrompt("Eg. \" or '");
-		textFieldQuote.setNullSettingAllowed(true);
-		mainLayout.addComponent(textFieldQuote);
-		
-		// textFieldSkip
-		textFieldSkip = new TextField();
-		textFieldSkip.setCaption("Skip Lines");
-		textFieldSkip.setImmediate(false);
-		textFieldSkip
-				.setDescription("Skips the number of lines at the beginning of the file.");
-		textFieldSkip.setWidth("-1px");
-		textFieldSkip.setHeight("-1px");
-		textFieldSkip.setInputPrompt("Eg. 1 or 2");
-		mainLayout.addComponent(textFieldSkip);
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java
deleted file mode 100644
index 043cba7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/CustomPIPConfigurationComponent.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class CustomPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private PIPParameterComponent pipParameterComponent;
-	@AutoGenerated
-	private TextField textFieldClassname;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final EntityItem<?> entity;
-	private static final Log logger	= LogFactory.getLog(CustomPIPConfigurationComponent.class);
-	private final CustomPIPConfigurationComponent self = this;
-	private final BasicNotifier notifier = new BasicNotifier();
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param configParamField 
-	 */
-	public CustomPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
-		//
-		// Save
-		//
-		this.entity = entityConfig;
-		
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// InitializeGUI
-		//
-		this.initialize();
-	}
-	
-	protected void initialize() {
-		if (logger.isDebugEnabled()) {
-			logger.debug("initializing " + this.entity.getEntity().toString());
-		}
-		this.initializeEntity();
-		this.initializeText();
-	}
-	
-	protected void initializeEntity() {
-		//
-		// If the entity is persisted, then we are editing
-		// it. So don't remove anything.
-		//
-		if (this.entity.isPersistent()) {
-			return;
-		}
-		//
-		// Not sure if we really should remove stuff. To be
-		// determined later.
-		//
-	}
-	
-	protected void initializeText() {
-		this.textFieldClassname.setRequired(true);
-		this.textFieldClassname.setRequiredError("You must declare the Java classname for the PIP Factory Loader");
-		this.textFieldClassname.setImmediate(true);
-		final Object entity = this.entity.getEntity();
-		if (entity instanceof PIPConfiguration) {
-			this.textFieldClassname.setValue(((PIPConfiguration)entity).getClassname());
-		} else if (entity instanceof PIPResolver) {
-			this.textFieldClassname.setValue(((PIPResolver)entity).getClassname());
-		}
-		//
-		// Respond to events
-		//
-		this.textFieldClassname.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (entity instanceof PIPConfiguration) {
-					((PIPConfiguration) entity).setClassname(self.textFieldClassname.getValue());
-				} else if (entity instanceof PIPResolver) {
-					((PIPResolver) entity).setClassname(self.textFieldClassname.getValue());
-				}
-				self.fireFormChangedEvent();
-			}
-		});
-	}
-
-	public void validate() throws InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("validate");
-		}
-		this.textFieldClassname.validate();
-	}
-	
-	public void commit() throws SourceException, InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("commit");
-		}
-		this.textFieldClassname.commit();
-	}
-
-	public void discard() throws SourceException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("discard");
-		}
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldClassname
-		textFieldClassname = new TextField();
-		textFieldClassname.setCaption("Java Classname");
-		textFieldClassname.setImmediate(false);
-		textFieldClassname
-				.setDescription("Java classname of the code implementing the custom PIP.");
-		textFieldClassname.setWidth("-1px");
-		textFieldClassname.setHeight("-1px");
-		textFieldClassname.setInputPrompt("Eg. com.foo.MyPIP");
-		mainLayout.addComponent(textFieldClassname);
-		mainLayout.setExpandRatio(textFieldClassname, 1.0f);
-		
-		// pipParameterComponent
-		pipParameterComponent = new PIPParameterComponent(this.entity.getEntity());
-		pipParameterComponent.setImmediate(false);
-		pipParameterComponent.setWidth("-1px");
-		pipParameterComponent.setHeight("-1px");
-		mainLayout.addComponent(pipParameterComponent);
-		
-		return mainLayout;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java
deleted file mode 100644
index eafbcad..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/EnumerationEditorComponent.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Container;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator;
-import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Field;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TableFieldFactory;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class EnumerationEditorComponent extends CustomComponent implements Validator {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-
-	@AutoGenerated
-	private Button buttonClearAll;
-
-	@AutoGenerated
-	private Button buttonRemove;
-
-	@AutoGenerated
-	private Button buttonAdd;
-
-	@AutoGenerated
-	private Table tableEnumerations;
-
-	private static final long serialVersionUID = -1L;
-	private static final Log logger	= LogFactory.getLog(EnumerationEditorComponent.class);
-	private final EnumerationEditorComponent self = this;
-	private final Attribute attribute;
-	private Identifier datatype;
-	private final BeanItemContainer<ConstraintValue> beanContainer;
-
-	public EnumerationEditorComponent(Attribute attribute, Identifier datatype) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save our attribute
-		//
-		this.attribute = attribute;
-		this.datatype = datatype;
-		//
-		// Construct a bean container that the 
-		// table uses to manage the values.
-		//
-		this.beanContainer = new BeanItemContainer<ConstraintValue>(ConstraintValue.class);
-		//
-		// Initialize our components
-		//
-		this.initializeTable();
-		this.initializeButtons();
-	}
-	
-	private void initializeTable() {
-		//
-		// Add the current enumeration values into the
-		// bean container.
-		//
-		for (ConstraintValue value : this.attribute.getConstraintValues()) {
-			if (value.getProperty().equals("Enumeration")) {
-				this.beanContainer.addBean(value);
-			}
-		}
-		//
-		// Now hook the bean container to the table
-		//
-		this.tableEnumerations.setContainerDataSource(beanContainer);
-		//
-		// We have to manually create the text field because we need
-		// to set a validator.
-		//
-		this.tableEnumerations.setTableFieldFactory(new TableFieldFactory() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Field<?> createField(Container container, Object itemId,
-					Object propertyId, Component uiContext) {
-				if (propertyId.toString().equals("value")) {
-					final TextField text = new TextField();
-					text.setImmediate(true);
-					text.setNullRepresentation("");
-					text.setNullSettingAllowed(false);
-					text.setRequired(true);
-					text.setRequiredError("Cannot have empty enumeration values.");
-					text.addValidator(self);
-					return text;
-				}
-				return null;
-			}
-		});
-		//
-		// Finish setting up the table.
-		//
-		this.tableEnumerations.setVisibleColumns(new Object[] {"value"});
-		this.tableEnumerations.setColumnHeaders(new String[] {"Enumeration Value"});
-		this.tableEnumerations.setSelectable(true);
-		this.tableEnumerations.setEditable(true);
-		this.tableEnumerations.setImmediate(true);
-		if (this.tableEnumerations.size() == 0) {
-			this.tableEnumerations.setPageLength(3);
-		} else {
-			this.tableEnumerations.setPageLength(this.tableEnumerations.size() + 1);
-		}
-		//
-		// As the user select items, enable/disable buttons
-		//
-		this.tableEnumerations.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.buttonRemove.setEnabled(self.tableEnumerations.getValue() != null);
-			}
-			
-		});
-	}
-	
-	private void initializeButtons() {
-		//
-		// Adding new values
-		//
-		this.buttonAdd.setImmediate(true);
-		this.buttonAdd.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Create a new value object
-				//
-				ConstraintValue newValue = new ConstraintValue("Enumeration", "");
-				//
-				// Associate it with the attribute
-				//
-				newValue.setAttribute(self.attribute);
-				//
-				// Add it into the attribute's internal list
-				//
-				self.attribute.addConstraintValue(newValue);
-				//
-				// Now we can add it to the GUI
-				//
-				Item item = self.tableEnumerations.addItem(newValue);
-				if (item != null) {
-					self.tableEnumerations.select(newValue);
-					self.tableEnumerations.focus();
-				}
-				//
-				// Make sure this button is now enabled
-				//
-				self.buttonClearAll.setEnabled(true);
-			}
-		});
-		//
-		// Removing values - nothing is selected to begin with so
-		// disable the button.
-		//
-		this.buttonRemove.setEnabled(false);
-		this.buttonRemove.setImmediate(true);
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Get the selected value
-				//
-				Object value = self.tableEnumerations.getValue();
-				//
-				// Was it selected or unselected (i.e. null)? If so, remove it
-				// from the table
-				//
-				if (value != null && self.tableEnumerations.removeItem(value)) {
-					//
-					// Dis-associate it with the attribute
-					//
-					((ConstraintValue) value).setAttribute(null);
-					//
-					// Now remove it from the attribute's internal list
-					//
-					self.attribute.removeConstraintValue((ConstraintValue) value);
-					//
-					// If there are no items, then disable this button
-					//
-					if (self.tableEnumerations.size() == 0) {
-						self.buttonClearAll.setEnabled(false);
-					}
-				}
-			}
-			
-		});
-		//
-		// Clearing all the values, set it enabled if we have anything
-		//
-		this.buttonClearAll.setImmediate(true);
-		this.buttonClearAll.setEnabled(this.tableEnumerations.size() > 0);
-		this.buttonClearAll.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Iterate all the values
-				//
-				for (Object id : self.tableEnumerations.getItemIds()) {
-					//
-					// Get the value object (it is the id)
-					//
-					ConstraintValue value = (ConstraintValue) id;
-					//
-					// Dis-associate it with the attribute
-					//
-					value.setAttribute(null);
-					//
-					// Now remove it from the attribute's internal list
-					//
-					self.attribute.removeConstraintValue(value);
-				}
-				//
-				// Remove everything from the table
-				//
-				self.tableEnumerations.removeAllItems();
-				//
-				// Now disable this button
-				//
-				self.buttonClearAll.setEnabled(false);
-			}			
-		});
-	}
-	
-	public void setupDatatype(Identifier id) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setupDatatype: " + datatype);
-		}
-		this.datatype = id;
-		//
-		// Initiate a validate
-		//
-		this.tableEnumerations.validate();
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value == null || value.toString().length() == 0) {
-			return;
-		}
-		if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) {
-			try {
-				Integer.parseInt(value.toString());
-			} catch(NumberFormatException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-			return;
-		}
-		if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) {
-			try {
-				Double.parseDouble(value.toString());
-			} catch(NumberFormatException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-			return;
-		}
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// tableEnumerations
-		tableEnumerations = new Table();
-		tableEnumerations.setCaption("Enumeration Values");
-		tableEnumerations.setImmediate(true);
-		tableEnumerations
-				.setDescription("Enter possible values for the attribute.");
-		tableEnumerations.setWidth("100.0%");
-		tableEnumerations.setHeight("-1px");
-		tableEnumerations.setInvalidAllowed(false);
-		mainLayout.addComponent(tableEnumerations);
-		mainLayout.setExpandRatio(tableEnumerations, 1.0f);
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// buttonAdd
-		buttonAdd = new Button();
-		buttonAdd.setCaption("Add");
-		buttonAdd.setImmediate(true);
-		buttonAdd.setDescription("Add a new enumeration value.");
-		buttonAdd.setWidth("-1px");
-		buttonAdd.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonAdd);
-		horizontalLayout_1.setComponentAlignment(buttonAdd, new Alignment(9));
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove");
-		buttonRemove.setImmediate(true);
-		buttonRemove.setDescription("Remove the selected enumeration value.");
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonRemove);
-		horizontalLayout_1.setComponentAlignment(buttonRemove,
-				new Alignment(10));
-		
-		// buttonClearAll
-		buttonClearAll = new Button();
-		buttonClearAll.setCaption("Clear All");
-		buttonClearAll.setImmediate(false);
-		buttonClearAll.setDescription("Clears all the values out.");
-		buttonClearAll.setWidth("-1px");
-		buttonClearAll.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonClearAll);
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java
deleted file mode 100644
index 67f7faf..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/HyperCSVPIPConfigurationComponent.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class HyperCSVPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private TextField textFieldDefinition;
-	@AutoGenerated
-	private TextField textFieldTarget;
-	@AutoGenerated
-	private TextField textFieldSource;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	public static final String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.csv.HyperCSVEngine";
-	
-	private final EntityItem<PIPConfiguration> entity;
-	private static final Log logger	= LogFactory.getLog(CustomPIPConfigurationComponent.class);
-	private final HyperCSVPIPConfigurationComponent self = this;
-	private final BasicNotifier notifier = new BasicNotifier();
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public HyperCSVPIPConfigurationComponent(EntityItem<PIPConfiguration> entityConfig) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.entity = entityConfig;
-		//
-		// Initialize
-		//
-		this.initialize();
-	}
-
-	protected void initialize() {
-		if (logger.isDebugEnabled()) {
-			logger.debug("initializing " + this.entity.getEntity().toString());
-		}
-		//
-		// What are our current values?
-		//
-		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
-		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
-			if (param.getParamName().equals(HyperCSVEngine.PROP_SOURCE)) {
-				this.textFieldSource.setData(param);
-			} else if (param.getParamName().equals(HyperCSVEngine.PROP_TARGET)) {
-				this.textFieldTarget.setData(param);
-			} else if (param.getParamName().equals(HyperCSVEngine.PROP_DEFINITION)) {
-				this.textFieldDefinition.setData(param);
-			} else {
-				unneeded.add(param);
-			}
-		}
-		if (unneeded.isEmpty() == false) {
-			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
-		}
-		//
-		//
-		//
-		this.initializeEntity();
-		this.initializeText();
-	}
-	
-	protected void initializeEntity() {
-		//
-		// Initialize the entity
-		//
-		this.entity.getEntity().setClassname(CLASSNAME);
-		this.entity.getEntity().setRequiresResolvers(true);
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textFieldSource.setNullRepresentation("");
-		PIPConfigParam param = (PIPConfigParam) this.textFieldSource.getData();
-		if (param != null) {
-			this.textFieldSource.setValue(param.getParamValue());
-		}
-		this.textFieldSource.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldSource.setData(param);
-				}
-				param.setParamValue(self.textFieldSource.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		this.textFieldSource.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldSource.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_SOURCE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldSource.setData(param);
-				}
-				param.setParamValue(self.textFieldSource.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		//
-		//
-		this.textFieldTarget.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldTarget.getData();
-		if (param != null) {
-			this.textFieldTarget.setValue(param.getParamValue());
-		}
-		this.textFieldTarget.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldTarget.setData(param);
-				}
-				param.setParamValue(self.textFieldTarget.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		this.textFieldTarget.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldTarget.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_TARGET);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldTarget.setData(param);
-				}
-				param.setParamValue(self.textFieldTarget.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		//
-		//
-		this.textFieldDefinition.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldDefinition.getData();
-		if (param != null) {
-			this.textFieldDefinition.setValue(param.getParamValue());
-		}
-		this.textFieldDefinition.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldDefinition.setData(param);
-				}
-				param.setParamValue(self.textFieldDefinition.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		this.textFieldDefinition.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldDefinition.getData();
-				if (param == null) {
-					param = new PIPConfigParam(HyperCSVEngine.PROP_DEFINITION);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldDefinition.setData(param);
-				}
-				param.setParamValue(self.textFieldDefinition.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-	}
-	
-	public void validate() throws InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("validate");
-		}
-		this.textFieldSource.validate();
-		this.textFieldTarget.validate();
-		this.textFieldDefinition.validate();
-	}
-	
-	public void commit() throws SourceException, InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("commit");
-		}
-		this.textFieldSource.commit();
-		this.textFieldTarget.commit();
-		this.textFieldDefinition.commit();
-	}
-
-	public void discard() throws SourceException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("discard");
-		}
-		this.textFieldSource.discard();
-		this.textFieldTarget.discard();
-		this.textFieldDefinition.discard();
-		//??
-		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_SOURCE);
-		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_TARGET);
-		this.entity.getEntity().getPipconfigParams().remove(HyperCSVEngine.PROP_DEFINITION);
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldSource
-		textFieldSource = new TextField();
-		textFieldSource.setCaption("CSV Source File");
-		textFieldSource.setImmediate(false);
-		textFieldSource.setDescription("Path to CSV file");
-		textFieldSource.setWidth("-1px");
-		textFieldSource.setHeight("-1px");
-		textFieldSource.setInvalidAllowed(false);
-		textFieldSource.setRequired(true);
-		textFieldSource.setInputPrompt("Eg. /opt/app/data.csv");
-		mainLayout.addComponent(textFieldSource);
-		
-		// textFieldTarget
-		textFieldTarget = new TextField();
-		textFieldTarget.setCaption("Table");
-		textFieldTarget.setImmediate(false);
-		textFieldTarget.setDescription("Name of database table to be created.");
-		textFieldTarget.setWidth("-1px");
-		textFieldTarget.setHeight("-1px");
-		textFieldTarget.setInvalidAllowed(false);
-		textFieldTarget.setRequired(true);
-		mainLayout.addComponent(textFieldTarget);
-		
-		// textFieldDefinition
-		textFieldDefinition = new TextField();
-		textFieldDefinition.setCaption("Table Definition");
-		textFieldDefinition.setImmediate(false);
-		textFieldDefinition.setDescription("SQL Table Definition");
-		textFieldDefinition.setWidth("-1px");
-		textFieldDefinition.setHeight("-1px");
-		textFieldDefinition.setInvalidAllowed(false);
-		textFieldDefinition.setRequired(true);
-		mainLayout.addComponent(textFieldDefinition);
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java
deleted file mode 100644
index 608b0ac..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/LDAPPIPConfigurationComponent.java
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Set;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.server.Page;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Notification;
-import com.vaadin.ui.Notification.Type;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class LDAPPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Button buttonTest;
-
-	@AutoGenerated
-	private TextField textFieldScope;
-
-	@AutoGenerated
-	private TextField textFieldCredentials;
-
-	@AutoGenerated
-	private TextField textFieldPrincipal;
-
-	@AutoGenerated
-	private ComboBox comboBoxAuthentication;
-
-	@AutoGenerated
-	private TextField textFieldProviderURL;
-
-	@AutoGenerated
-	private TextField textFieldFactory;
-
-	public static String CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.ldap.LDAPEngine";
-	
-	public static String LDAP_CONTEXT = Context.INITIAL_CONTEXT_FACTORY;
-	public static String LDAP_URL = Context.PROVIDER_URL;
-	public static String LDAP_AUTH = "authentication";
-	public static String LDAP_PRINCIPAL = "principal";
-	public static String LDAP_CREDENTIALS = "credentials";
-	public static String LDAP_SCOPE = "scope";
-	
-	public static String LDAP_DEFAULT_CONTEXT = "com.sun.jndi.ldap.LdapCtxFactory";
-	
-	public static String LDAP_AUTH_ANONYMOUS = "anonymous";
-	public static String LDAP_AUTH_SIMPLE = "simple";
-	public static String LDAP_AUTH_SASL = "SASL";	//????
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(LDAPPIPConfigurationComponent.class);
-	private final LDAPPIPConfigurationComponent self = this;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private final EntityItem<PIPConfiguration> entity;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param configParamField 
-	 */
-	public LDAPPIPConfigurationComponent(EntityItem<PIPConfiguration> entity) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.entity = entity;
-		//
-		// Initialize
-		//
-		this.initialize();
-	}
-	
-	protected void initialize() {
-		if (logger.isDebugEnabled()) {
-			logger.debug("initializing " + this.entity.getEntity().toString());
-		}
-		//
-		// Iterate any existing values
-		//
-		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
-		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
-			if (param.getParamName().equals(LDAP_CONTEXT)) {
-				this.textFieldFactory.setData(param);
-			} else if (param.getParamName().equals(LDAP_URL)) {
-				this.textFieldProviderURL.setData(param);
-			} else if (param.getParamName().equals(LDAP_AUTH)) {
-				this.comboBoxAuthentication.setData(param);
-			} else if (param.getParamName().equals(LDAP_PRINCIPAL)) {
-				this.textFieldPrincipal.setData(param);
-			} else if (param.getParamName().equals(LDAP_CREDENTIALS)) {
-				this.textFieldCredentials.setData(param);
-			} else if (param.getParamName().equals(LDAP_SCOPE)) {
-				this.textFieldScope.setData(param);
-			} else {
-				unneeded.add(param);
-			}
-		}
-		//
-		// Get rid of unneeded parameters
-		//
-		if (unneeded.isEmpty() == false) {
-			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
-		}
-		//
-		// Initialize GUI
-		//
-		this.initializeEntity();
-		this.initializeCombo();
-		this.initializeText();
-		this.initializeButtons();
-	}
-	
-	protected void initializeEntity() {
-		//
-		// Initialize the entity
-		//
-		this.entity.getEntity().setClassname(CLASSNAME);
-		this.entity.getEntity().setRequiresResolvers(true);
-	}
-	
-	protected void initializeCombo() {
-		//
-		// GUI properties
-		//
-		this.comboBoxAuthentication.setImmediate(true);
-		this.comboBoxAuthentication.setNullSelectionAllowed(false);
-		this.comboBoxAuthentication.setRequired(true);
-		this.comboBoxAuthentication.setRequiredError("You must select an authentication mechanism");
-		//
-		// Initial set of items
-		//
-		this.comboBoxAuthentication.addItem(LDAP_AUTH_ANONYMOUS);
-		this.comboBoxAuthentication.addItem(LDAP_AUTH_SIMPLE);
-		this.comboBoxAuthentication.addItem(LDAP_AUTH_SASL);
-		//
-		// Ensure the authentication combo is selected to something.
-		//
-		PIPConfigParam param = (PIPConfigParam) this.comboBoxAuthentication.getData();
-		if (param == null) {
-			param = new PIPConfigParam(LDAP_AUTH, LDAP_AUTH_ANONYMOUS);
-			this.entity.getEntity().addPipconfigParam(param);
-			this.comboBoxAuthentication.setData(param);
-			this.comboBoxAuthentication.select(param.getParamValue());
-		} else {
-			//
-			// Is this custom?
-			//
-			this.comboBoxAuthentication.select(param.getParamValue());
-			if (this.comboBoxAuthentication.getValue().equals(param.getParamValue()) == false) {
-				this.comboBoxAuthentication.addItem(param.getParamValue());
-				this.comboBoxAuthentication.select(param.getParamValue());
-			}
-		}
-		//
-		// Respond to events
-		//
-		this.comboBoxAuthentication.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.comboBoxAuthentication.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_AUTH, self.comboBoxAuthentication.getValue().toString());
-					self.entity.getEntity().addPipconfigParam(param);
-					self.comboBoxAuthentication.setData(param);
-				}
-				param.setParamValue(self.comboBoxAuthentication.getValue().toString());
-				self.fireFormChangedEvent();
-			}		
-		});
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textFieldFactory.setImmediate(true);
-		this.textFieldFactory.setNullRepresentation("");
-		//
-		// We can initialize this if there is no value
-		//
-		PIPConfigParam param = (PIPConfigParam) this.textFieldFactory.getData();
-		if (param == null) {
-			param = new PIPConfigParam(LDAP_CONTEXT, LDAP_DEFAULT_CONTEXT);
-			this.entity.getEntity().addPipconfigParam(param);
-			this.textFieldFactory.setData(param);
-		}
-		this.textFieldFactory.setValue(param.getParamValue());
-		this.textFieldFactory.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldFactory.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_CONTEXT);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldFactory.setData(param);
-				}
-				param.setParamValue(self.textFieldFactory.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		this.textFieldFactory.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldFactory.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_CONTEXT);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldFactory.setData(param);
-				}
-				param.setParamValue(self.textFieldFactory.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		//
-		//
-		this.textFieldProviderURL.setImmediate(true);
-		this.textFieldProviderURL.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldProviderURL.getData();
-		if (param != null) {
-			this.textFieldProviderURL.setValue(param.getParamValue());
-		}		
-		this.textFieldProviderURL.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldProviderURL.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_URL);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldProviderURL.setData(param);
-				}
-				param.setParamValue(self.textFieldProviderURL.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldProviderURL.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldProviderURL.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_URL);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldProviderURL.setData(param);
-				}
-				param.setParamValue(self.textFieldProviderURL.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldPrincipal.setImmediate(true);
-		this.textFieldPrincipal.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldPrincipal.getData();
-		if (param != null) {
-			this.textFieldPrincipal.setValue(param.getParamValue());
-		}		
-		this.textFieldPrincipal.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldPrincipal.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_PRINCIPAL);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldPrincipal.setData(param);
-				}
-				param.setParamValue(self.textFieldPrincipal.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldPrincipal.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldPrincipal.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_PRINCIPAL);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldPrincipal.setData(param);
-				}
-				param.setParamValue(self.textFieldPrincipal.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldCredentials.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldCredentials.getData();
-		if (param != null) {
-			this.textFieldCredentials.setValue(param.getParamValue());
-		}		
-		this.textFieldCredentials.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldCredentials.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_CREDENTIALS);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldCredentials.setData(param);
-				}
-				param.setParamValue(self.textFieldCredentials.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldCredentials.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldCredentials.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_CREDENTIALS);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldCredentials.setData(param);
-				}
-				param.setParamValue(self.textFieldCredentials.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		//
-		//
-		//
-		this.textFieldScope.setNullRepresentation("");
-		param = (PIPConfigParam) this.textFieldScope.getData();
-		if (param == null) {
-			param = new PIPConfigParam(LDAP_SCOPE, "subtree");
-			this.entity.getEntity().addPipconfigParam(param);
-			this.textFieldScope.setData(param);
-		}
-		this.textFieldScope.setValue(param.getParamValue());
-		this.textFieldScope.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldScope.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_SCOPE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldScope.setData(param);
-				}
-				param.setParamValue(self.textFieldScope.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-		this.textFieldScope.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldScope.getData();
-				if (param == null) {
-					param = new PIPConfigParam(LDAP_SCOPE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldScope.setData(param);
-				}
-				param.setParamValue(self.textFieldScope.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonTest.setImmediate(true);
-		this.buttonTest.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.testLDAPConnection();
-			}
-		});
-	}
-	
-	protected void testLDAPConnection() {
-		Hashtable<String, String> env = new Hashtable<String, String>();
-		env.put(Context.INITIAL_CONTEXT_FACTORY, this.textFieldFactory.getValue());
-		env.put(Context.PROVIDER_URL, this.textFieldProviderURL.getValue());
-		env.put(Context.SECURITY_PRINCIPAL, this.textFieldPrincipal.getValue());
-		env.put(Context.SECURITY_CREDENTIALS, this.textFieldCredentials.getValue());
-
-		String auth = this.comboBoxAuthentication.getValue().toString();
-		env.put(Context.SECURITY_AUTHENTICATION, auth);
-		//
-		// Do we need to do anything?
-		//
-		/*
-		if (auth.equals(LDAP_AUTH_ANONYMOUS)) {
-			
-		} else if (auth.equals(LDAP_AUTH_SIMPLE)) {
-			
-		} else if (auth.equals(LDAP_AUTH_SASL)) {
-			
-		}
-		*/
-
-		DirContext ctx = null;
-		try {
-		   ctx = new InitialDirContext(env);
-			new Notification("Success!",
-				    "Connection Established!",
-				    Type.HUMANIZED_MESSAGE, true)
-				    .show(Page.getCurrent());			
-		} catch (NamingException e) {
-		   logger.error(e);
-			new Notification("Connection Failed",
-				    "<br/>" + e.getLocalizedMessage(),
-				    Type.ERROR_MESSAGE, true)
-				    .show(Page.getCurrent());
-		} finally {
-			try {
-				if (ctx != null) {
-					ctx.close();
-				}
-			} catch (NamingException idontcare) { //NOPMD
-			}
-		}
-	}
-	
-	public void validate() throws InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("validate");
-		}
-		this.comboBoxAuthentication.validate();
-		this.textFieldFactory.validate();
-		this.textFieldProviderURL.validate();
-		this.textFieldPrincipal.validate();
-		this.textFieldCredentials.validate();
-		this.textFieldScope.validate();
-	}
-
-	public void commit() throws SourceException, InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("commit");
-		}
-		this.comboBoxAuthentication.commit();
-		this.textFieldFactory.commit();
-		this.textFieldProviderURL.commit();
-		this.textFieldPrincipal.commit();
-		this.textFieldCredentials.commit();
-		this.textFieldScope.commit();
-	}
-	
-	public void discard() throws SourceException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("discard");
-		}
-		
-		this.textFieldFactory.discard();
-		this.textFieldProviderURL.discard();
-		this.textFieldPrincipal.discard();
-		this.textFieldCredentials.discard();
-		this.textFieldScope.discard();
-		/*
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_CONTEXT);
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_URL);
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_AUTH);
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_PRINCIPAL);
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_CREDENTIALS);
-		this.entity.getEntity().getPipconfigParams().remove(LDAP_SCOPE);
-		*/
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldFactory
-		textFieldFactory = new TextField();
-		textFieldFactory.setCaption("Initial Context Factory");
-		textFieldFactory.setImmediate(false);
-		textFieldFactory.setWidth("-1px");
-		textFieldFactory.setHeight("-1px");
-		textFieldFactory.setInvalidAllowed(false);
-		textFieldFactory.setRequired(true);
-		textFieldFactory.setInputPrompt("com.sun.jndi.ldap.LdapCtxFactory");
-		mainLayout.addComponent(textFieldFactory);
-		mainLayout.setExpandRatio(textFieldFactory, 1.0f);
-		
-		// textFieldProviderURL
-		textFieldProviderURL = new TextField();
-		textFieldProviderURL.setCaption("Provider URL");
-		textFieldProviderURL.setImmediate(false);
-		textFieldProviderURL.setWidth("-1px");
-		textFieldProviderURL.setHeight("-1px");
-		textFieldProviderURL.setInvalidAllowed(false);
-		textFieldProviderURL.setRequired(true);
-		textFieldProviderURL
-				.setInputPrompt("Eg. ldap://localhost:389/o=JNDITutorial");
-		mainLayout.addComponent(textFieldProviderURL);
-		mainLayout.setExpandRatio(textFieldProviderURL, 1.0f);
-		
-		// comboBoxAuthentication
-		comboBoxAuthentication = new ComboBox();
-		comboBoxAuthentication.setCaption("Authentication");
-		comboBoxAuthentication.setImmediate(false);
-		comboBoxAuthentication.setWidth("-1px");
-		comboBoxAuthentication.setHeight("-1px");
-		comboBoxAuthentication.setRequired(true);
-		mainLayout.addComponent(comboBoxAuthentication);
-		mainLayout.setExpandRatio(comboBoxAuthentication, 1.0f);
-		
-		// textFieldPrincipal
-		textFieldPrincipal = new TextField();
-		textFieldPrincipal.setCaption("Principal");
-		textFieldPrincipal.setImmediate(false);
-		textFieldPrincipal.setWidth("-1px");
-		textFieldPrincipal.setHeight("-1px");
-		textFieldPrincipal.setNullSettingAllowed(true);
-		mainLayout.addComponent(textFieldPrincipal);
-		mainLayout.setExpandRatio(textFieldPrincipal, 1.0f);
-		
-		// textFieldCredentials
-		textFieldCredentials = new TextField();
-		textFieldCredentials.setCaption("Credentials");
-		textFieldCredentials.setImmediate(false);
-		textFieldCredentials.setWidth("-1px");
-		textFieldCredentials.setHeight("-1px");
-		textFieldCredentials.setNullSettingAllowed(true);
-		mainLayout.addComponent(textFieldCredentials);
-		mainLayout.setExpandRatio(textFieldCredentials, 1.0f);
-		
-		// textFieldScope
-		textFieldScope = new TextField();
-		textFieldScope.setCaption("Scope");
-		textFieldScope.setImmediate(false);
-		textFieldScope.setWidth("-1px");
-		textFieldScope.setHeight("-1px");
-		textFieldScope.setInvalidAllowed(false);
-		textFieldScope.setRequired(true);
-		textFieldScope.setInputPrompt("Eg. subtree");
-		mainLayout.addComponent(textFieldScope);
-		
-		// buttonTest
-		buttonTest = new Button();
-		buttonTest.setCaption("Test Connection");
-		buttonTest.setImmediate(true);
-		buttonTest.setWidth("-1px");
-		buttonTest.setHeight("-1px");
-		mainLayout.addComponent(buttonTest);
-		mainLayout.setComponentAlignment(buttonTest, new Alignment(48));
-		
-		return mainLayout;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java
deleted file mode 100644
index bcbeca8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/OaExpressionsEditorComponent.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.jpa.ObadviceExpression;
-import org.apache.openaz.xacml.admin.view.windows.ExpressionEditorWindow;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-
-public class OaExpressionsEditorComponent extends CustomComponent {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonadd;
-	@AutoGenerated
-	private Table tableExpressions;
-	private static final long serialVersionUID = 1L;
-	private final OaExpressionsEditorComponent self = this;
-	private final JPAContainer<ObadviceExpression> container;
-	private final EntityItem<Obadvice> oa;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public OaExpressionsEditorComponent(EntityItem<Obadvice> oa, JPAContainer<ObadviceExpression> container) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.container = container;
-		this.oa = oa;
-		//
-		// Filter the container
-		//
-		this.container.removeAllContainerFilters();
-		this.container.addContainerFilter(new Compare.Equal("obadvice", this.oa.getEntity()));
-		//
-		// Initialize components
-		//
-		this.initializeTable();
-		this.initializeButtons();
-	}
-	
-	private void initializeTable() {
-		this.tableExpressions.setContainerDataSource(this.container);
-		this.tableExpressions.setVisibleColumns(new Object[] {"type"});
-		this.tableExpressions.setColumnHeaders(new String[] {"Expression Type"});
-		this.tableExpressions.setPageLength(this.container.size() + 1);
-	}
-	
-	private void initializeButtons() {
-		this.buttonadd.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				ObadviceExpression expression = new ObadviceExpression();
-				// TODO - EntityItem is not used - does container.createEntityItem even need to be called?
-				// final EntityItem<ObadviceExpression> entity = self.container.createEntityItem(expression);
-				self.container.createEntityItem(expression); // See TODO
-
-				final ExpressionEditorWindow editor = new ExpressionEditorWindow();
-				editor.setCaption("Edit Attribute");
-				editor.setCloseShortcut(KeyCode.ESCAPE);
-				editor.setModal(true);
-				editor.center();
-				UI.getCurrent().addWindow(editor);
-			}
-			
-		});
-		this.buttonRemove.setEnabled(false);
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.tableExpressions.removeItem(self.tableExpressions.getValue());
-			}
-			
-		});
-
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// tableExpressions
-		tableExpressions = new Table();
-		tableExpressions.setCaption("Expressions");
-		tableExpressions.setImmediate(false);
-		tableExpressions
-				.setDescription("The list of expressions for the obligation/advice object.");
-		tableExpressions.setWidth("-1px");
-		tableExpressions.setHeight("-1px");
-		mainLayout.addComponent(tableExpressions);
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// buttonadd
-		buttonadd = new Button();
-		buttonadd.setCaption("Add");
-		buttonadd.setImmediate(true);
-		buttonadd.setWidth("-1px");
-		buttonadd.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonadd);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove");
-		buttonRemove.setImmediate(true);
-		buttonRemove.setDescription("Remove selected expression(s).");
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonRemove);
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java
deleted file mode 100644
index 5a91ff2..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPParameterComponent.java
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.jpa.PIPResolverParam;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import org.apache.openaz.xacml.admin.view.windows.PIPParamEditorWindow;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.util.BeanItem;
-import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class PIPParameterComponent extends CustomComponent implements FormChangedEventNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table tableParameters;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private Button buttonClear;
-	@AutoGenerated
-	private Button buttonClone;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonAdd;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPParameterComponent.class);
-	private final PIPParameterComponent self = this;
-	private final Object config;
-	private final BasicNotifier notifier = new BasicNotifier();
-	
-	private static final Action ADD_PARAM = 	new Action ("Add Parameter");
-	private static final Action EDIT_PARAM = 	new Action ("Edit Parameter");
-	private static final Action REMOVE_PARAM = 	new Action ("Remove Parameter");
-	private static final Action CLONE_PARAM = 	new Action ("Clone Parameter");
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPParameterComponent(Object config) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.config = config;
-		//
-		// Initialize
-		//
-		this.initializeTable();
-		this.initializeButtons();
-		//
-		// Initial button setup
-		//
-		this.setupButtons();
-	}
-	
-	protected void initializeTable() {
-		//
-		// Initialize GUI properties
-		//
-		this.tableParameters.setImmediate(true);
-		this.tableParameters.setSelectable(true);
-		//
-		// Add in the data
-		//
-		if (this.config instanceof PIPConfiguration) {
-			BeanItemContainer<PIPConfigParam> container = new BeanItemContainer<PIPConfigParam>(PIPConfigParam.class);
-			PIPConfiguration config = (PIPConfiguration) this.config;
-			for (PIPConfigParam param : config.getPipconfigParams()) {
-				container.addBean(param);
-			}
-			this.tableParameters.setContainerDataSource(container);
-		} else if (this.config instanceof PIPResolver) {
-			BeanItemContainer<PIPResolverParam> container = new BeanItemContainer<PIPResolverParam>(PIPResolverParam.class);
-			PIPResolver resolver = (PIPResolver) this.config;
-			for (PIPResolverParam param : resolver.getPipresolverParams()) {
-				container.addBean(param);
-			}
-			this.tableParameters.setContainerDataSource(container);
-		} else {
-			throw new IllegalArgumentException("Unsupported object");
-		}
-		//
-		// Finish more gui initialization
-		//
-		this.tableParameters.setPageLength(5);//this.tableParameters.getContainerDataSource().size() + 1);
-		this.tableParameters.setVisibleColumns(new Object[] {"paramName", "paramValue"});
-		this.tableParameters.setColumnHeaders(new String[] {"Name", "Value"});
-		this.tableParameters.setSizeFull();
-		//
-		// Action Handler
-		//
-		this.tableParameters.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					return new Action[] {ADD_PARAM};
-				}
-				return new Action[] {EDIT_PARAM, REMOVE_PARAM, CLONE_PARAM};
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == ADD_PARAM) {
-					self.editParameter(null);
-					return;
-				}
-				if (action == EDIT_PARAM) {
-					self.editParameter(target);
-					return;
-				}
-				if (action == REMOVE_PARAM) {
-					self.removeParameter(target);
-					return;
-				}
-				if (action == CLONE_PARAM) {
-					self.cloneParameter(target);
-					return;
-				}
-			}
-		});
-		//
-		// Respond to events
-		//
-		this.tableParameters.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupButtons();
-			}
-		});
-		//
-		// Double click
-		//
-		this.tableParameters.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					self.editParameter(event.getItemId());
-				}
-			}
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonAdd.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.editParameter(null);
-			}
-		});
-		this.buttonClone.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.cloneParameter(self.tableParameters.getValue());
-			}
-		});
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.removeParameter(self.tableParameters.getValue());
-			}
-		});
-		this.buttonClear.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.clearParameters();
-			}
-		});
-	}
-	
-	protected void setupButtons() {
-		if (this.tableParameters.getValue() != null) {
-			this.buttonClone.setEnabled(true);
-			this.buttonRemove.setEnabled(true);
-		} else {
-			this.buttonClone.setEnabled(false);
-			this.buttonRemove.setEnabled(false);
-		}
-	}
-
-	protected void editParameter(final Object source) {
-		//
-		// Make a copy
-		//
-		final Object target = source != null ? source : this.config instanceof PIPConfiguration ? new PIPConfigParam() : new PIPResolverParam();
-		final PIPParamEditorWindow window = new PIPParamEditorWindow(target);
-		window.setModal(true);
-		window.setCaption((source == null ? "Create New Parameter" : "Edit Parameter"));
-		window.center();
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did user save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Yes - was it a brand new object?
-				//
-				if (source == null) {
-					//
-					// yes add it to the parent object
-					//
-					if (self.config instanceof PIPConfiguration) {
-						((PIPConfiguration) self.config).addPipconfigParam((PIPConfigParam) target);
-					} else {
-						((PIPResolver) self.config).addPipresolverParam((PIPResolverParam) target);
-					}
-					//
-					// add it to the table
-					//
-					Item item = self.tableParameters.addItem(target);
-					if (item == null) {
-						logger.error("Failed to add parameter: " + target);
-					} else {
-						self.tableParameters.select(target);
-					}
-				} else {
-					//
-					// Copy the parameters over
-					//
-					if (source instanceof PIPConfigParam) {
-						((PIPConfigParam) source).setParamName(((PIPConfigParam) target).getParamName());
-						((PIPConfigParam) source).setParamValue(((PIPConfigParam) target).getParamValue());
-					} else {
-						((PIPResolverParam) source).setParamName(((PIPResolverParam) target).getParamName());
-						((PIPResolverParam) source).setParamValue(((PIPResolverParam) target).getParamValue());
-					}
-					//
-					// Update the table
-					//
-					self.tableParameters.refreshRowCache();
-				}
-			}
-		});
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void cloneParameter(Object target) {
-		if (target == null) {
-			logger.error("null target sent to clone method");
-			return;
-		}
-		Item item;
-		if (target instanceof PIPConfigParam && this.config instanceof PIPConfiguration) {
-			PIPConfigParam param = new PIPConfigParam((PIPConfigParam) target);
-			((PIPConfiguration) this.config).addPipconfigParam(param);
-			item = this.tableParameters.addItem(new BeanItem<PIPConfigParam>(param));
-		} else if (target instanceof PIPResolverParam && this.config instanceof PIPResolver) {
-			PIPResolverParam param = new PIPResolverParam((PIPResolverParam) target);
-			((PIPResolver) this.config).addPipresolverParam(param);
-			item = this.tableParameters.addItem(new BeanItem<PIPResolverParam>(param));
-		} else {
-			throw new IllegalArgumentException("Unsupported param and config combination.");
-		}
-		if (item == null) {
-			logger.error("Failed to add parameter to table: " + target);
-		} else {
-			this.tableParameters.select(target);
-		}
-	}
-
-	protected void removeParameter(Object target) {
-		if (target == null) {
-			logger.error("null target sent to remove method");
-			return;
-		}
-		if (this.config instanceof PIPConfiguration) {
-			if (((PIPConfiguration)this.config).removePipconfigParam((PIPConfigParam) target) == null) {
-				logger.error("Failed to remove parameter from pip configuration");
-				return;
-			}
-		} else {
-			if (((PIPResolver) this.config).removePipresolverParam((PIPResolverParam) target) == null) {
-				logger.error("Failed to remove parameter from pip resolver");
-				return;
-			}
-		}
-		if (this.tableParameters.removeItem(target) == false) {
-			logger.error("Failed to remove parameter from table");
-		}
-	}
-	
-	protected void clearParameters() {
-		this.tableParameters.removeAllItems();
-		if (this.config instanceof PIPConfiguration) {
-			((PIPConfiguration) this.config).clearConfigParams();
-		} else {
-			((PIPResolver) this.config).clearParams();
-		}
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		// tableParameters
-		tableParameters = new Table();
-		tableParameters.setCaption("Configuration Parameters");
-		tableParameters.setImmediate(false);
-		tableParameters.setWidth("-1px");
-		tableParameters.setHeight("-1px");
-		mainLayout.addComponent(tableParameters);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// buttonAdd
-		buttonAdd = new Button();
-		buttonAdd.setCaption("Add");
-		buttonAdd.setImmediate(false);
-		buttonAdd.setWidth("-1px");
-		buttonAdd.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonAdd);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove");
-		buttonRemove.setImmediate(false);
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonRemove);
-		
-		// buttonClone
-		buttonClone = new Button();
-		buttonClone.setCaption("Clone");
-		buttonClone.setImmediate(false);
-		buttonClone.setWidth("-1px");
-		buttonClone.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonClone);
-		
-		// buttonClear
-		buttonClear = new Button();
-		buttonClear.setCaption("Clear All");
-		buttonClear.setImmediate(false);
-		buttonClear.setWidth("-1px");
-		buttonClear.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonClear);
-		
-		return horizontalLayout_1;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java
deleted file mode 100644
index 7529e70..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/PIPResolverComponent.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.view.windows.PIPResolverEditorWindow;
-import org.apache.openaz.xacml.std.pip.engines.csv.ConfigurableCSVResolver;
-import org.apache.openaz.xacml.std.pip.engines.jdbc.ConfigurableJDBCResolver;
-import org.apache.openaz.xacml.std.pip.engines.ldap.ConfigurableLDAPResolver;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingMutableLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class PIPResolverComponent extends CustomComponent {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Table tableResolvers;
-	
-	private final Action ADD_RESOLVER = new Action("Add Resolver");
-	private final Action EDIT_RESOLVER = new Action("Edit Resolver");
-	private final Action CLONE_RESOLVER = new Action("Clone Resolver");
-	private final Action REMOVE_RESOLVER = new Action("Remove Resolver");
-
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPResolverComponent.class);
-	
-	private final PIPResolverComponent self = this;
-	private final PIPConfiguration config;
-	
-	private final JPAContainer<PIPResolver> resolverContainer = new JPAContainer<PIPResolver>(PIPResolver.class);
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPResolverComponent(PIPConfiguration configuration) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.config = configuration;
-		this.resolverContainer.setEntityProvider(new CachingMutableLocalEntityProvider<PIPResolver>(PIPResolver.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-		this.resolverContainer.addContainerFilter(new Compare.Equal("pipconfiguration", this.config));
-		//
-		// Initialize GUI
-		//
-		this.initializeTable();
-	}
-	
-	protected void initializeTable() {
-		//
-		// Setup the container datasource
-		//
-		this.tableResolvers.setContainerDataSource(this.resolverContainer);
-		//
-		// Set GUI properties
-		//
-		this.tableResolvers.setImmediate(true);
-		this.tableResolvers.setVisibleColumns(new Object[] {"name", "description", "issuer"});
-		this.tableResolvers.setColumnHeaders(new String[] {"Name", "Description", "Issuer"});
-		this.tableResolvers.setPageLength(this.config.getPipresolvers().size() + 1);
-		this.tableResolvers.setSizeFull();
-		this.tableResolvers.setSelectable(true);
-		//
-		// Add the actions
-		//
-		this.tableResolvers.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					return new Action[] {ADD_RESOLVER};
-				}
-				return new Action[] {EDIT_RESOLVER, CLONE_RESOLVER, REMOVE_RESOLVER};
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == ADD_RESOLVER) {
-					PIPResolverComponent.addResolver(self.config, null);
-					return;
-				}
-				if (action == EDIT_RESOLVER) {
-					PIPResolverComponent.editResolver(self.resolverContainer.getItem(target));
-					return;
-				}
-				if (action == CLONE_RESOLVER) {
-					PIPResolverComponent.addResolver(self.config, self.resolverContainer.getItem(target).getEntity());
-					return;
-				}
-				if (action == REMOVE_RESOLVER) {
-					self.removeResolver(self.config, self.resolverContainer.getItem(target).getEntity());
-					return;
-				}
-			}
-		});
-		//
-		// Respond to events
-		//
-		this.tableResolvers.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					Object id = event.getItemId();
-					if (id == null) {
-						return;
-					}
-					PIPResolverComponent.editResolver(self.resolverContainer.getItem(id));
-				}
-			}
-		});
-	}
-	
-	protected void removeResolver(PIPConfiguration config, PIPResolver resolver) {
-		config.removePipresolver(resolver);
-		this.tableResolvers.removeItem(resolver.getId());
-	}
-
-	public static void	addResolver(PIPConfiguration config, PIPResolver pipResolver) {
-		//
-		// Create the entity
-		//
-		PIPResolver resolver = null;
-		if (pipResolver != null) {
-			resolver = new PIPResolver(pipResolver);
-		} else {
-			resolver = new PIPResolver();
-		}
-		resolver.setCreatedBy(((XacmlAdminUI)UI.getCurrent()).getUserid());
-		resolver.setModifiedBy(((XacmlAdminUI)UI.getCurrent()).getUserid());
-		resolver.setPipconfiguration(config);
-		//
-		// Set its default class
-		//
-		if (config.getPiptype().isSQL()) {
-			resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
-		} else if (config.getPiptype().isLDAP()) {
-			resolver.setClassname(ConfigurableLDAPResolver.class.getCanonicalName());
-		} else if (config.getPiptype().isCSV()) {
-			resolver.setClassname(ConfigurableCSVResolver.class.getCanonicalName());
-		} else if (config.getPiptype().isHyperCSV()) {
-			resolver.setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
-		}
-		//
-		// Bring up the editor window
-		//
-		PIPResolverComponent.editResolver(((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().createEntityItem(resolver));
-		
-	}
-	
-	public static void	editResolver(final EntityItem<PIPResolver> entity) {
-		
-		final PIPResolverEditorWindow window = new PIPResolverEditorWindow(entity);
-		window.setModal(true);
-		window.center();
-		if (entity.isPersistent()) {
-			window.setCaption("Edit Resolver");
-		} else {
-			window.setCaption("Create Resolver");
-		}
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click "save"?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Adding a new entity?
-				//
-				if (entity.isPersistent() == false) {
-					//
-					// Yes - let's official add it
-					//
-					((XacmlAdminUI)UI.getCurrent()).getPIPResolvers().addEntity(entity.getEntity());
-					((XacmlAdminUI)UI.getCurrent()).refreshPIPConfiguration();
-				}
-			}
-		});
-		UI.getCurrent().addWindow(window);
-	}
-
-	public static void publishConfiguration(EntityItem<PIPConfiguration> config) {
-		Properties properties = config.getEntity().generateProperties(Integer.toString(config.getEntity().getId()));
-		
-		try {
-			ByteArrayOutputStream os = new ByteArrayOutputStream();
-			properties.store(os, "");
-			if (logger.isDebugEnabled()) {
-				logger.debug(os.toString());
-			}
-		} catch (IOException e) { //NOPMD
-			// TODO - Handle, Log or NOPMD
-			// TODO - Will vaadin display error?
-		}
-	}
-		
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// tableResolvers
-		tableResolvers = new Table();
-		tableResolvers.setCaption("Resolvers");
-		tableResolvers.setImmediate(false);
-		tableResolvers.setWidth("-1px");
-		tableResolvers.setHeight("-1px");
-		mainLayout.addComponent(tableResolvers);
-		
-		return mainLayout;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java
deleted file mode 100644
index d07aa34..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RangeEditorComponent.java
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.DoubleRangeValidator;
-import com.vaadin.data.validator.IntegerRangeValidator;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Panel;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class RangeEditorComponent extends CustomComponent {
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Panel panelTester;
-	@AutoGenerated
-	private VerticalLayout verticalLayout_2;
-	@AutoGenerated
-	private Button buttonValidate;
-	@AutoGenerated
-	private TextField textFieldTestInput;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_2;
-	@AutoGenerated
-	private TextField textFieldMax;
-	@AutoGenerated
-	private ComboBox comboBoxMax;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private TextField textFieldMin;
-	@AutoGenerated
-	private ComboBox comboBoxMin;
-	private static final long serialVersionUID = -1L;
-	private static final Log logger	= LogFactory.getLog(RangeEditorComponent.class);
-	private final RangeEditorComponent self = this;
-	private final Attribute attribute;
-	private Identifier datatype;
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	public RangeEditorComponent(Attribute attribute, Identifier datatype) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save our attribute
-		//
-		this.attribute = attribute;
-		this.datatype = datatype;
-		//
-		// Finish initialization
-		//
-		this.initializeCombos();	
-		this.initializeTextFields();
-		this.initializeTest();
-		this.setupDatatype(this.datatype);
-	}
-	
-	private void initializeCombos() {
-		//
-		// Add the 2 possible values into each combo box
-		//
-		this.comboBoxMin.setNullSelectionAllowed(true);
-		this.comboBoxMin.addItem("minInclusive");
-		this.comboBoxMin.addItem("minExclusive");		
-		this.comboBoxMax.addItem("maxInclusive");
-		this.comboBoxMax.addItem("maxExclusive");
-		//
-		// Find any current values
-		//
-		for (ConstraintValue value : this.attribute.getConstraintValues()) {
-			if (value.getProperty().equals("minInclusive") ||
-				value.getProperty().equals("minExclusive")) {
-				//
-				// If it hasn't been set yet
-				//
-				if (this.comboBoxMin.getData() == null) {
-					//
-					// Select the appropriate combo value
-					//
-					this.comboBoxMin.select(value.getProperty());
-					//
-					// Save the object
-					//
-					this.comboBoxMin.setData(value);
-					//
-					// Setup the text field
-					//
-					this.textFieldMin.setValue(value.getValue());
-				} else {
-					//
-					// Extra value in there, this shouldn't happen. But this
-					// is here just in case
-					//
-					logger.warn("Extra min value found: " + value.getProperty() + " " + value.getValue());
-				}
-			} else if (value.getProperty().equals("maxInclusive") ||
-					value.getProperty().equals("maxExclusive")) {
-				//
-				// Check if it hasn't been set yet
-				//
-				if (this.comboBoxMax.getData() == null) {
-					//
-					// Select the appropriate combo value
-					//
-					this.comboBoxMax.select(value.getProperty());
-					//
-					// Save the object
-					//
-					this.comboBoxMax.setData(value);
-					//
-					// Setup the text field
-					//
-					this.textFieldMax.setValue(value.getValue());
-				} else {
-					//
-					// Extra value in there, this shouldn't happen. But this
-					// is here just in case
-					//
-					logger.warn("Extra max value found: " + value.getProperty() + " " + value.getValue());
-				}
-			} else {
-				logger.warn("Non-range value found: " + value.getProperty() + " " + value.getValue());
-			}
-		}
-		//
-		// Were there values?
-		//
-		if (this.comboBoxMin.getData() == null) {
-			//
-			// Put a new empty value in there
-			//
-			ConstraintValue value = new ConstraintValue("minInclusive", null);
-			//
-			// Associate it with the attribute
-			//
-			value.setAttribute(this.attribute);
-			//
-			// Make sure the attribute has it in its list
-			//
-			this.attribute.addConstraintValue(value);
-			//
-			// Save it in the combo
-			//
-			this.comboBoxMin.setData(value);
-			//
-			// Disable text field
-			//
-			this.textFieldMin.setEnabled(false);
-		}
-		if (this.comboBoxMax.getData() == null) {
-			//
-			// Put a new empty value in there
-			//
-			ConstraintValue value = new ConstraintValue("maxInclusive", null);
-			//
-			// Associate it with the attribute
-			//
-			value.setAttribute(this.attribute);
-			//
-			// Make sure the attribute has it in its list
-			//
-			this.attribute.addConstraintValue(value);
-			//
-			// Save it in the combo
-			//
-			this.comboBoxMax.setData(value);
-			//
-			// Disable text field
-			//
-			this.textFieldMax.setEnabled(false);
-		}
-		//
-		// Respond to combo changes
-		//
-		this.setupComboText(this.comboBoxMin, this.textFieldMin);
-		this.setupComboText(this.comboBoxMax, this.textFieldMax);
-	}
-	
-	private void setupComboText(final ComboBox box, final TextField text) {
-		//
-		// Respond to combo changes
-		//
-		box.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Get the new value
-				//
-				String property = (String) box.getValue();
-				//
-				// Get our constraint object
-				//
-				ConstraintValue value = (ConstraintValue) box.getData();
-				//
-				// Update our object
-				//
-				if (property == null) {
-					//
-					// Clear the text field and disable it
-					//
-					text.setEnabled(false);
-					text.setValue(null);
-				} else {
-					//
-					// Change the property name
-					//
-					value.setProperty(property);
-					//
-					// Focus to the text field and enable it
-					//
-					text.setEnabled(true);
-					text.focus();
-				}
-			}
-		});
-		
-	}
-	
-	private void initializeTextFields() {
-		this.textFieldMin.setNullRepresentation("");
-		this.textFieldMin.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Get our min object
-				//
-				ConstraintValue value = (ConstraintValue) self.comboBoxMin.getData();
-				//
-				// Save its new value
-				//
-				value.setValue(self.textFieldMin.getValue());
-			}			
-		});
-		this.textFieldMax.setNullRepresentation("");
-		this.textFieldMax.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Get our max object
-				//
-				ConstraintValue value = (ConstraintValue) self.comboBoxMax.getData();
-				//
-				// Save its new value
-				//
-				value.setValue(self.textFieldMax.getValue());
-			}
-			
-		});
-	}
-	
-	private void initializeTest() {
-		this.textFieldTestInput.setNullRepresentation("");
-		this.textFieldTestInput.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (self.textFieldTestInput.getValue() != null && self.textFieldTestInput.getValue().length() > 0) {
-					self.buttonValidate.setEnabled(true);
-				} else {
-					self.buttonValidate.setEnabled(false);
-				}
-			}
-		});
-				
-		this.buttonValidate.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Create our validator and add it into the text
-				//
-				Validator validator = self.setupValidator(self.datatype);
-				if (validator == null) {
-					logger.warn("Could not create a validator");
-					return;
-				}
-				self.textFieldTestInput.addValidator(validator);
-				//
-				// Initiate the validation
-				//
-				try {
-					self.textFieldTestInput.validate();
-					//
-					// If we get here, then it validated!
-					//
-					AdminNotification.info("Success! Value is in range");
-				} catch (InvalidValueException e) {
-					AdminNotification.warn("Failed, Value is NOT in range");
-				}
-				//
-				// Remove the validator
-				//
-				self.textFieldTestInput.removeValidator(validator);
-			}			
-		});
-	}
-	
-	private Validator setupValidator(Identifier id) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setupValidator: " + id);
-		}
-		//
-		// Get our min/max objects
-		//
-		ConstraintValue min = (ConstraintValue) self.comboBoxMin.getData();
-		ConstraintValue max = (ConstraintValue) self.comboBoxMax.getData();
-		Object minObject = self.comboBoxMin.getConvertedValue();
-		Object maxObject = self.comboBoxMax.getConvertedValue();
-		logger.debug("Converted values: " + minObject + " " + maxObject);
-		//
-		// Get our min/max values
-		//
-		String minValue = self.textFieldMin.getValue();
-		String maxValue = self.textFieldMax.getValue();
-		//
-		// What is our datatype?
-		//
-		if (id.equals(XACML3.ID_DATATYPE_INTEGER)) {
-			Integer minimum = null;
-			Integer maximum = null;
-			boolean minInclusive = true;
-			boolean maxInclusive = true;
-			if (min.getProperty() != null) {
-				if (minValue != null && minValue.length() > 0) {
-					minimum = Integer.parseInt(minValue);
-				}
-				if (min.getProperty().equals("minInclusive")) {
-					minInclusive = true;
-				} else if (min.getProperty().equals("minExclusive")) {
-					minInclusive = false;
-				}
-			}
-			if (max.getProperty() != null) {
-				if (maxValue != null && maxValue.length() > 0) {
-					maximum = Integer.parseInt(maxValue);
-				}
-				if (max.getProperty().equals("maxInclusive")) {
-					maxInclusive = true;
-				} else if (max.getProperty().equals("maxExclusive")) {
-					maxInclusive = false;
-				}
-			}
-			IntegerRangeValidator validator = new IntegerRangeValidator("The value is NOT within the range", minimum, maximum);
-			validator.setMinValueIncluded(minInclusive);
-			validator.setMaxValueIncluded(maxInclusive);
-			return validator;
-		}
-		if (id.equals(XACML3.ID_DATATYPE_DOUBLE)) {
-			Double minimum = null;
-			Double maximum = null;
-			boolean minInclusive = true;
-			boolean maxInclusive = true;
-			if (min.getProperty() != null) {
-				if (minValue != null && minValue.length() > 0) {
-					minimum = Double.parseDouble(minValue);
-				}
-				if (min.getProperty().equals("minInclusive")) {
-					minInclusive = true;
-				} else if (min.getProperty().equals("minExclusive")) {
-					minInclusive = false;
-				}
-			}
-			if (max.getProperty() != null) {
-				if (maxValue != null && maxValue.length() > 0) {
-					maximum = Double.parseDouble(maxValue);
-				}
-				if (max.getProperty().equals("maxInclusive")) {
-					maxInclusive = true;
-				} else if (max.getProperty().equals("maxExclusive")) {
-					maxInclusive = false;
-				}
-			}
-			DoubleRangeValidator validator = new DoubleRangeValidator("The value is NOT within the range", minimum, maximum);
-			validator.setMinValueIncluded(minInclusive);
-			validator.setMaxValueIncluded(maxInclusive);
-			return validator;
-		}
-		
-		return null;
-	}
-	
-	public void	setupDatatype(Identifier datatype) {
-		if (logger.isTraceEnabled()) {
-			logger.trace("setupDatatype: " + datatype);
-		}
-		this.datatype = datatype;
-		if (datatype.equals(XACML3.ID_DATATYPE_INTEGER)) {
-			this.textFieldMin.setConverter(Integer.class);
-			this.textFieldMax.setConverter(Integer.class);
-			this.textFieldTestInput.setConverter(Integer.class);
-			return;
-		}
-		if (datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) {
-			this.textFieldMin.setConverter(Double.class);
-			this.textFieldMax.setConverter(Double.class);
-			this.textFieldTestInput.setConverter(Double.class);
-			return;
-		}
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
-		
-		// horizontalLayout_2
-		horizontalLayout_2 = buildHorizontalLayout_2();
-		mainLayout.addComponent(horizontalLayout_2);
-		mainLayout.setExpandRatio(horizontalLayout_2, 1.0f);
-		
-		// panelTester
-		panelTester = buildPanelTester();
-		mainLayout.addComponent(panelTester);
-		mainLayout.setExpandRatio(panelTester, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// comboBoxMin
-		comboBoxMin = new ComboBox();
-		comboBoxMin.setCaption("Minimum Type");
-		comboBoxMin.setImmediate(true);
-		comboBoxMin.setDescription("Select the type for the minimum.");
-		comboBoxMin.setWidth("-1px");
-		comboBoxMin.setHeight("-1px");
-		horizontalLayout_1.addComponent(comboBoxMin);
-		
-		// textFieldMin
-		textFieldMin = new TextField();
-		textFieldMin.setCaption("Minimum Value");
-		textFieldMin.setImmediate(true);
-		textFieldMin.setDescription("Enter a value for the minimum.");
-		textFieldMin.setWidth("-1px");
-		textFieldMin.setHeight("-1px");
-		textFieldMin.setInvalidAllowed(false);
-		textFieldMin.setInputPrompt("eg. 1");
-		horizontalLayout_1.addComponent(textFieldMin);
-		horizontalLayout_1
-				.setComponentAlignment(textFieldMin, new Alignment(9));
-		
-		return horizontalLayout_1;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_2() {
-		// common part: create layout
-		horizontalLayout_2 = new HorizontalLayout();
-		horizontalLayout_2.setImmediate(false);
-		horizontalLayout_2.setWidth("-1px");
-		horizontalLayout_2.setHeight("-1px");
-		horizontalLayout_2.setMargin(false);
-		horizontalLayout_2.setSpacing(true);
-		
-		// comboBoxMax
-		comboBoxMax = new ComboBox();
-		comboBoxMax.setCaption("Maximum Type");
-		comboBoxMax.setImmediate(true);
-		comboBoxMax.setDescription("Select the type for the maximum.");
-		comboBoxMax.setWidth("-1px");
-		comboBoxMax.setHeight("-1px");
-		horizontalLayout_2.addComponent(comboBoxMax);
-		
-		// textFieldMax
-		textFieldMax = new TextField();
-		textFieldMax.setCaption("Maximum Value");
-		textFieldMax.setImmediate(true);
-		textFieldMax.setDescription("Enter a value for the maxmum.");
-		textFieldMax.setWidth("-1px");
-		textFieldMax.setHeight("-1px");
-		textFieldMax.setInvalidAllowed(false);
-		textFieldMax.setInputPrompt("eg. 100");
-		horizontalLayout_2.addComponent(textFieldMax);
-		
-		return horizontalLayout_2;
-	}
-
-	@AutoGenerated
-	private Panel buildPanelTester() {
-		// common part: create layout
-		panelTester = new Panel();
-		panelTester.setCaption("Test Range Values");
-		panelTester.setImmediate(true);
-		panelTester.setWidth("-1px");
-		panelTester.setHeight("-1px");
-		
-		// verticalLayout_2
-		verticalLayout_2 = buildVerticalLayout_2();
-		panelTester.setContent(verticalLayout_2);
-		
-		return panelTester;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildVerticalLayout_2() {
-		// common part: create layout
-		verticalLayout_2 = new VerticalLayout();
-		verticalLayout_2.setImmediate(false);
-		verticalLayout_2.setWidth("100.0%");
-		verticalLayout_2.setHeight("100.0%");
-		verticalLayout_2.setMargin(false);
-		verticalLayout_2.setSpacing(true);
-		
-		// textFieldTestInput
-		textFieldTestInput = new TextField();
-		textFieldTestInput.setCaption("Value");
-		textFieldTestInput.setImmediate(true);
-		textFieldTestInput.setDescription("Enter a value to test against.");
-		textFieldTestInput.setWidth("-1px");
-		textFieldTestInput.setHeight("-1px");
-		textFieldTestInput.setInputPrompt("eg. 50");
-		verticalLayout_2.addComponent(textFieldTestInput);
-		
-		// buttonValidate
-		buttonValidate = new Button();
-		buttonValidate.setCaption("Test");
-		buttonValidate.setImmediate(true);
-		buttonValidate
-				.setDescription("Click to test if value is within the range.");
-		buttonValidate.setWidth("-1px");
-		buttonValidate.setHeight("-1px");
-		verticalLayout_2.addComponent(buttonValidate);
-		verticalLayout_2.setComponentAlignment(buttonValidate,
-				new Alignment(48));
-		
-		return verticalLayout_2;
-	}
-	
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java
deleted file mode 100644
index 968719a..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/RegexpEditorComponent.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.ConstraintValue;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.RegexpValidator;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Panel;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class RegexpEditorComponent extends CustomComponent {
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Panel panelTester;
-
-	@AutoGenerated
-	private VerticalLayout verticalLayout_2;
-
-	@AutoGenerated
-	private Button buttonTest;
-
-	@AutoGenerated
-	private TextField textFieldTestValue;
-
-	@AutoGenerated
-	private TextField textFieldExpression;
-
-	private static final long serialVersionUID = -1L;
-	private static final Log logger	= LogFactory.getLog(RegexpEditorComponent.class);
-	private RegexpEditorComponent self = this;
-	private final Attribute attribute;
-	private ConstraintValue value = null;
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	public RegexpEditorComponent(Attribute attribute) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		
-		this.attribute = attribute;
-		
-		initializeTextField();
-		initializeTestPanel();
-	}
-	
-	private void initializeTextField() {
-		//
-		// Find our reg expression value if it exists
-		//
-		for (ConstraintValue value : this.attribute.getConstraintValues()) {
-			if (value.getProperty().equals(ConstraintType.REGEXP_TYPE)) {
-				if (this.value == null) {
-					this.textFieldExpression.setValue(value.getValue());
-					this.value = value;
-				} else {
-					logger.warn("Multiple regexp constraint values: " + value);
-					value.setAttribute(null);
-					this.attribute.removeConstraintValue(value);
-				}
-			} else {
-				value.setAttribute(null);
-				this.attribute.removeConstraintValue(value);
-			}
-		}
-		//
-		// Was something found?
-		//
-		if (this.value == null) {
-			ConstraintValue newValue = new ConstraintValue(ConstraintType.REGEXP_TYPE, "");
-			newValue.setAttribute(this.attribute);
-			this.attribute.addConstraintValue(newValue);
-			this.value = newValue;
-		}
-		//
-		// Save the values when they changes
-		//
-		this.textFieldExpression.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.value.setValue(self.textFieldExpression.getValue());
-			}
-		});
-	}
-	
-	private void initializeTestPanel() {
-		this.textFieldTestValue.setNullRepresentation("");
-		
-		this.buttonTest.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				String testValue = self.textFieldTestValue.getValue();
-				if (testValue == null || testValue.length() == 0) {
-					return;
-				}
-				String regExp = self.textFieldExpression.getValue();
-				if (regExp == null || regExp.length() == 0) {
-					return;
-				}
-				//
-				// Create a validator
-				//
-				Validator validator = new RegexpValidator(regExp, true, "Regular Expression does NOT match.");
-				//
-				// Add it
-				//
-				self.textFieldTestValue.addValidator(validator);
-				//
-				// Validate
-				//
-				try {
-					self.textFieldTestValue.validate();
-					AdminNotification.info("Success! Regular Expression Matches");
-				} catch (InvalidValueException e) {
-					AdminNotification.warn("Failed, Regular Expression does NOT match");
-				}
-				//
-				// Remove the validator
-				//
-				self.textFieldTestValue.removeValidator(validator);
-			}
-		});
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldExpression
-		textFieldExpression = new TextField();
-		textFieldExpression.setCaption("Regular Expression");
-		textFieldExpression.setImmediate(true);
-		textFieldExpression
-				.setDescription("Create a regular expression used to constrain attribute values.");
-		textFieldExpression.setWidth("-1px");
-		textFieldExpression.setHeight("-1px");
-		textFieldExpression.setInvalidAllowed(false);
-		textFieldExpression.setInputPrompt("eg. [a-zA-Z0-9]");
-		mainLayout.addComponent(textFieldExpression);
-		mainLayout.setExpandRatio(textFieldExpression, 1.0f);
-		
-		// panelTester
-		panelTester = buildPanelTester();
-		mainLayout.addComponent(panelTester);
-		mainLayout.setExpandRatio(panelTester, 1.0f);
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private Panel buildPanelTester() {
-		// common part: create layout
-		panelTester = new Panel();
-		panelTester.setCaption("Test The Expression");
-		panelTester.setImmediate(false);
-		panelTester.setWidth("-1px");
-		panelTester.setHeight("-1px");
-		
-		// verticalLayout_2
-		verticalLayout_2 = buildVerticalLayout_2();
-		panelTester.setContent(verticalLayout_2);
-		
-		return panelTester;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildVerticalLayout_2() {
-		// common part: create layout
-		verticalLayout_2 = new VerticalLayout();
-		verticalLayout_2.setImmediate(false);
-		verticalLayout_2.setWidth("100.0%");
-		verticalLayout_2.setHeight("100.0%");
-		verticalLayout_2.setMargin(false);
-		
-		// textFieldTestValue
-		textFieldTestValue = new TextField();
-		textFieldTestValue.setCaption("Test Value");
-		textFieldTestValue.setImmediate(true);
-		textFieldTestValue
-				.setDescription("Enter a value to match against the regular expression.");
-		textFieldTestValue.setWidth("-1px");
-		textFieldTestValue.setHeight("-1px");
-		textFieldTestValue.setInputPrompt("eg. example");
-		verticalLayout_2.addComponent(textFieldTestValue);
-		
-		// buttonTest
-		buttonTest = new Button();
-		buttonTest.setCaption("Test");
-		buttonTest.setImmediate(true);
-		buttonTest.setWidth("-1px");
-		buttonTest.setHeight("-1px");
-		verticalLayout_2.addComponent(buttonTest);
-		verticalLayout_2.setComponentAlignment(buttonTest, new Alignment(48));
-		
-		return verticalLayout_2;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java
deleted file mode 100644
index 7b2b501..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/components/SQLPIPConfigurationComponent.java
+++ /dev/null
@@ -1,763 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.components;
-
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-import javax.sql.DataSource;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.server.Page;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Notification;
-import com.vaadin.ui.Notification.Type;
-import com.vaadin.ui.PasswordField;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-
-public class SQLPIPConfigurationComponent extends CustomComponent implements FormChangedEventNotifier {
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Button buttonTest;
-
-	@AutoGenerated
-	private PasswordField textFieldPassword;
-
-	@AutoGenerated
-	private TextField textFieldUser;
-
-	@AutoGenerated
-	private TextField textFieldConnectionURL;
-
-	@AutoGenerated
-	private ComboBox comboBoxSQLDriver;
-
-	@AutoGenerated
-	private TextField textFieldDataSource;
-
-	@AutoGenerated
-	private ComboBox comboBoxConnectionType;
-
-	public static final String	CLASSNAME = "org.apache.openaz.xacml.std.pip.engines.jdbc.JDBCEngine";
-	
-	public static final String	SQL_TYPE = "type";
-	public static final String	SQL_TYPE_JDBC = "jdbc";
-	public static final String	SQL_TYPE_JNDI = "jndi";
-	public static final String	SQL_DATASOURCE = "datasource";
-	public static final String	SQL_DRIVER = "jdbc.driver";
-	public static final String	SQL_URL = "jdbc.url";
-	public static final String	SQL_USER = "jdbc.conn.user";
-	public static final String	SQL_PASSWORD = "jdbc.conn.password";
-	
-	//
-	// These are the drivers that we are initially supporting and testing.
-	// Other JDBC drivers may work fine, but we will wait until we test
-	// with those drivers before adding them to this list.
-	//
-	public static final String	SQL_DRIVER_MYSQL = "com.mysql.jdbc.Driver";
-	public static final String	SQL_DRIVER_POSTGRESQL = "org.postgresql.Driver";
-	public static final String	SQL_DRIVER_H2 = "org.h2.Driver";
-	public static final String	SQL_DRIVER_HYPER = "org.hsqldb.jdbc.JDBCDriver";
-	public static final String	SQL_DRIVER_SQL_SERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
-	public static String[]	SQL_DRIVERS = new String[] {SQL_DRIVER_MYSQL, SQL_DRIVER_POSTGRESQL, SQL_DRIVER_H2, SQL_DRIVER_HYPER, SQL_DRIVER_SQL_SERVER};
-
-	public static final String	SQL_DRIVER_MYSQL_URL = "jdbc:mysql://localhost:3306/";
-	public static final String	SQL_DRIVER_POSTGRESQL_URL = "jdbc:postgresql://localhost:5432/";
-	public static final String	SQL_DRIVER_H2_URL = "jdbc:h2:file:/";
-	public static final String	SQL_DRIVER_HYPER_URL = "jdbc:hsqldb:file:/";
-	public static final String	SQL_DRIVER_SQL_SERVER_URL = "jdbc:sqlserver://localhost:1433/";
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(SQLPIPConfigurationComponent.class);
-
-	private final SQLPIPConfigurationComponent self = this;
-	private final BasicNotifier notifier = new BasicNotifier();
-	private final EntityItem<PIPConfiguration> entity;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param configParamField 
-	 */
-	public SQLPIPConfigurationComponent(EntityItem<PIPConfiguration> entity) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.entity = entity;
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// Finish 
-		//
-		this.reset();
-	}
-	
-	protected void initialize() {
-		if (logger.isDebugEnabled()) {
-			logger.debug("initializing " + this.entity.getEntity().toString());
-		}
-		//
-		// Iterate any existing values, save them in the data field for each
-		// GUI object.
-		//
-		Set<PIPConfigParam> unneeded = new HashSet<PIPConfigParam>();
-		for (PIPConfigParam param : this.entity.getEntity().getPipconfigParams()) {
-			//
-			// Sanity check
-			//
-			if (param.getParamName() == null) {
-				logger.warn("Null parameter name found.");
-				unneeded.add(param);
-				continue;
-			}
-			if (param.getParamName().equals(SQL_TYPE)) {
-				this.comboBoxConnectionType.setData(param);
-			} else if (param.getParamName().equals(SQL_DATASOURCE)) {
-				this.textFieldDataSource.setData(param);
-			} else if (param.getParamName().equals(SQL_DRIVER)) {
-				this.comboBoxSQLDriver.setData(param);
-			} else if (param.getParamName().equals(SQL_URL)) {
-				this.textFieldConnectionURL.setData(param);
-			} else if (param.getParamName().equals(SQL_USER)) {
-				this.textFieldUser.setData(param);
-			} else if (param.getParamName().equals(SQL_PASSWORD)) {
-				this.textFieldPassword.setData(param);
-			} else {
-				unneeded.add(param);
-			}
-		}
-		//
-		// Get rid of parameters that are not needed
-		//
-		if (unneeded.isEmpty() == false) {
-			this.entity.getEntity().getPipconfigParams().removeAll(unneeded);
-		}
-		//
-		// Now finish initializing the GUI objects
-		//
-		this.initializeEntity();
-		this.initializeTypeCombo();
-		this.initializeSQLDriverCombo();
-		this.initializeText();
-		this.initializeButtons();
-	}
-	
-	protected void initializeEntity() {
-		//
-		// Initialize the entity
-		//
-		this.entity.getEntity().setClassname(CLASSNAME);
-		this.entity.getEntity().setRequiresResolvers(true);
-	}
-	
-	protected void initializeTypeCombo() {
-		//
-		// Setup GUI properties
-		//
-		this.comboBoxConnectionType.setImmediate(true);
-		this.comboBoxConnectionType.setNullSelectionAllowed(false);
-		this.comboBoxConnectionType.setRequired(true);
-		this.comboBoxConnectionType.setRequiredError("You must select a connection type.");
-		//
-		// Add the possible items
-		//
-		this.comboBoxConnectionType.addItem(SQL_TYPE_JDBC);
-		this.comboBoxConnectionType.addItem(SQL_TYPE_JNDI);
-		//
-		// Respond to events
-		//
-		this.comboBoxConnectionType.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.comboBoxConnectionType.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_TYPE);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.comboBoxConnectionType.setData(param);
-				}
-				param.setParamValue(self.comboBoxConnectionType.getValue().toString());
-				self.reset();
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		// Set its default selection. If there isn't one, then we default to JDBC.
-		//
-		PIPConfigParam param = (PIPConfigParam) this.comboBoxConnectionType.getData();
-		if (param == null) {
-			param = new PIPConfigParam(SQL_TYPE, SQL_TYPE_JDBC);
-			this.entity.getEntity().addPipconfigParam(param);
-			this.comboBoxConnectionType.setData(param);
-		}
-		this.comboBoxConnectionType.select(param.getParamValue());
-	}
-	
-	protected void initializeSQLDriverCombo() {
-		//
-		// GUI properties
-		//
-		this.comboBoxSQLDriver.setImmediate(true);
-		this.comboBoxSQLDriver.setRequired(true);
-		this.comboBoxConnectionType.setRequiredError("You must select a JDBC Driver");
-		this.comboBoxSQLDriver.setInputPrompt("Eg. com.mysql.jdbc.Driver");
-		//
-		// Add some common driver values. These are the drivers we have tested with so far.
-		//
-		for (String driver : SQL_DRIVERS) {
-			this.comboBoxSQLDriver.addItem(driver);
-		}
-		//
-		// Setup the default selection
-		//
-		PIPConfigParam param = (PIPConfigParam) this.comboBoxSQLDriver.getData();
-		if (param != null) {
-			this.comboBoxSQLDriver.setValue(param.getParamValue());
-			//
-			// Check if its there (the value could be something other than what we
-			// have setup in our list of defaults.)
-			//
-			boolean bFound = false;
-			for (Object id : this.comboBoxSQLDriver.getItemIds()) {
-				Item item = this.comboBoxSQLDriver.getItem(id);
-				if (item.toString().equals(param.getParamValue())) {
-					bFound = true;
-					break;
-				}
-			}
-			if (! bFound) {
-				//
-				// It's not one of our defaults, no problem. Add it in.
-				//
-				this.comboBoxSQLDriver.addItem(param.getParamValue());
-				this.comboBoxSQLDriver.setValue(param.getParamValue());
-			}
-		}
-		//
-		// Allow new items
-		//
-		this.comboBoxSQLDriver.setNewItemsAllowed(true);
-		//
-		// Respond to selection changes
-		//
-		this.comboBoxSQLDriver.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.comboBoxSQLDriver.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_DRIVER, self.comboBoxSQLDriver.getValue().toString());
-					self.entity.getEntity().addPipconfigParam(param);
-					self.comboBoxSQLDriver.setData(param);
-				}
-				//
-				// Was something unselected?
-				//
-				if (self.comboBoxSQLDriver.getValue() == null) {
-					param.setParamValue(null);
-				} else {
-					param.setParamValue(self.comboBoxSQLDriver.getValue().toString());
-					//
-					// See if we should pre-populate the driver URL
-					//
-					self.setupDriverURL(self.comboBoxSQLDriver.getValue().toString());
-				}
-				//
-				// Fire
-				//
-				self.fireFormChangedEvent();
-			}
-		});
-	}
-	
-	protected void initializeText() {
-		//
-		// GUI properties
-		//
-		this.textFieldDataSource.setImmediate(true);
-		this.textFieldDataSource.setNullRepresentation("");
-		this.textFieldDataSource.setRequired(true);
-		this.textFieldDataSource.setRequiredError("The name of the JNDI Resource is needed.");
-		//
-		// Get its initial value
-		//
-		PIPConfigParam param = (PIPConfigParam) this.textFieldDataSource.getData();
-		if (param != null) {
-			this.textFieldDataSource.setValue(param.getParamValue());
-		}
-		//
-		// Respond to value changes
-		//
-		this.textFieldDataSource.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldDataSource.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_DATASOURCE, self.textFieldDataSource.getValue());
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldDataSource.setData(param);
-				}
-				param.setParamValue(self.textFieldDataSource.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		// Setup GUI properties
-		//
-		this.textFieldConnectionURL.setImmediate(true);
-		this.textFieldConnectionURL.setNullRepresentation("");
-		this.textFieldConnectionURL.setRequired(true);
-		this.textFieldConnectionURL.setRequiredError("A URL is needed to connect to the database.");
-		//
-		// Set its default value
-		//
-		param = (PIPConfigParam) this.textFieldConnectionURL.getData();
-		if (param != null) {
-			this.textFieldConnectionURL.setValue(param.getParamValue());
-		}
-		//
-		// Respond to value changes
-		//
-		this.textFieldConnectionURL.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldConnectionURL.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_URL);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldConnectionURL.setData(param);
-				}
-				param.setParamValue(self.textFieldConnectionURL.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		// Set GUI properties
-		//
-		this.textFieldUser.setImmediate(true);
-		this.textFieldUser.setNullRepresentation("");
-		this.textFieldUser.setRequired(true);
-		this.textFieldUser.setRequiredError("User name is required.");
-		//
-		// Setup its default value
-		//
-		param = (PIPConfigParam) self.textFieldUser.getData();
-		if (param != null) {
-			this.textFieldUser.setValue(param.getParamValue());
-		}
-		//
-		// Respond to value changes
-		//
-		this.textFieldUser.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldUser.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_USER);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldUser.setData(param);
-				}
-				param.setParamValue(self.textFieldUser.getValue());
-				self.fireFormChangedEvent();
-			}
-		});
-		//
-		// Initialize GUI properties
-		//
-		this.textFieldPassword.setImmediate(true);
-		this.textFieldPassword.setNullRepresentation("");
-		//
-		// Set its default value
-		//
-		param = (PIPConfigParam) self.textFieldPassword.getData();
-		if (param != null) {
-			this.textFieldPassword.setValue(param.getParamValue());
-		}
-		//
-		// Respond to value change events
-		//
-		this.textFieldPassword.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				PIPConfigParam param = (PIPConfigParam) self.textFieldPassword.getData();
-				if (param == null) {
-					param = new PIPConfigParam(SQL_PASSWORD);
-					self.entity.getEntity().addPipconfigParam(param);
-					self.textFieldPassword.setData(param);
-				}
-				param.setParamValue(self.textFieldPassword.getValue());
-				self.fireFormChangedEvent();
-			}			
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonTest.setImmediate(true);
-		this.buttonTest.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object id = self.comboBoxConnectionType.getValue();
-				if (id == null) {
-					logger.warn("No combo box selection");
-					return;
-				}				
-				if (id.toString().equals(SQL_TYPE_JDBC)) {
-					self.testJDBCConnection();
-				} else if (id.toString().equals(SQL_TYPE_JNDI)) {
-					self.testJNDIConnection();
-				}
-			}			
-		});
-	}
-	
-	protected void setupDriverURL(String value) {
-		if (value.equals(SQL_DRIVER_MYSQL)) {
-			this.textFieldConnectionURL.setValue(SQL_DRIVER_MYSQL_URL);
-		} else if (value.equals(SQL_DRIVER_POSTGRESQL)) {
-			this.textFieldConnectionURL.setValue(SQL_DRIVER_POSTGRESQL_URL);
-		} else if (value.equals(SQL_DRIVER_H2)) {
-			this.textFieldConnectionURL.setValue(SQL_DRIVER_H2_URL);
-		} else if (value.equals(SQL_DRIVER_HYPER)) {
-			this.textFieldConnectionURL.setValue(SQL_DRIVER_HYPER_URL);
-		} else if (value.equals(SQL_DRIVER_SQL_SERVER)) {
-			this.textFieldConnectionURL.setValue(SQL_DRIVER_SQL_SERVER_URL);
-		}
-	}
-	
-	protected void testJNDIConnection() {
-		try {
-			Context initialContext = new InitialContext();
-			DataSource dataSource = (DataSource) initialContext.lookup(this.textFieldDataSource.getValue());
-			try (Connection connection = dataSource.getConnection()) {
-				new Notification("Success!",
-					    "Connection Established!",
-					    Type.HUMANIZED_MESSAGE, true)
-					    .show(Page.getCurrent());			
-			}
-		} catch (NamingException e) {
-			logger.error(e);
-			new Notification("JNDI Naming Exception",
-				    "<br/>" + e.getLocalizedMessage() + "<br/>Is the context defined in this J2EE Container instance?",
-				    Type.ERROR_MESSAGE, true)
-				    .show(Page.getCurrent());
-		} catch (SQLException e) {
-			logger.error(e);
-			new Notification("SQL Exception",
-				    "<br/>" + e.getLocalizedMessage() + "<br/>Are the configuration parameters correct?",
-				    Type.ERROR_MESSAGE, true)
-				    .show(Page.getCurrent());
-		}
-	}
-
-	protected void testJDBCConnection() {
-		try {
-			if (this.comboBoxSQLDriver.getValue() != null) {
-				Class.forName(this.comboBoxSQLDriver.getValue().toString());
-			} else {
-				throw new ClassNotFoundException("Please select a JDBC driver to load.");
-			}
-		} catch (ClassNotFoundException e) {
-			logger.error(e);
-			new Notification("Driver Exception",
-				    "<br/>" + e.getLocalizedMessage() + "<br/>Is the JDBC driver's jar in the J2EE container path?",
-				    Type.ERROR_MESSAGE, true)
-				    .show(Page.getCurrent());
-			return;
-		}
-		Connection connection = null;
-		try {
-			connection = DriverManager.getConnection(this.textFieldConnectionURL.getValue(), this.textFieldUser.getValue(), this.textFieldPassword.getValue());
-			new Notification("Success!",
-				    "Connection Established!",
-				    Type.HUMANIZED_MESSAGE, true)
-				    .show(Page.getCurrent());
-		} catch (SQLException e) {
-			logger.error(e);
-			new Notification("SQL Exception",
-				    "<br/>" + e.getLocalizedMessage() + "<br/>Are the configuration parameters correct?",
-				    Type.ERROR_MESSAGE, true)
-				    .show(Page.getCurrent());
-		} finally {
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException idontcare) { //NOPMD
-				}
-			}
-		}
-	}
-
-	protected void reset() {
-		Object id = this.comboBoxConnectionType.getValue();
-		if (id == null) {
-			logger.warn("Can't reset combo hasn't selected anything.");
-			return;
-		}
-		if (id.toString().equals(SQL_TYPE_JDBC)) {
-			//
-			//
-			//
-			this.textFieldDataSource.setVisible(false);
-			this.textFieldDataSource.setRequired(false);
-			//
-			//
-			//
-			this.textFieldConnectionURL.setVisible(true);
-			this.textFieldConnectionURL.setRequired(true);
-			this.comboBoxSQLDriver.setVisible(true);
-			this.comboBoxSQLDriver.setRequired(true);
-			this.textFieldUser.setVisible(true);
-			this.textFieldUser.setRequired(true);
-			this.textFieldPassword.setVisible(true);
-		} else if (id.toString().equals(SQL_TYPE_JNDI)) {
-			//
-			//
-			//
-			this.textFieldDataSource.setVisible(true);
-			this.textFieldDataSource.setRequired(true);
-			//
-			//
-			//
-			this.textFieldConnectionURL.setVisible(false);
-			this.textFieldConnectionURL.setRequired(false);
-			this.comboBoxSQLDriver.setVisible(false);
-			this.comboBoxSQLDriver.setRequired(false);
-			this.textFieldUser.setVisible(false);
-			this.textFieldUser.setRequired(false);
-			this.textFieldPassword.setVisible(false);
-		} else {
-			logger.warn("Unknown SQL type selection: " + id);
-		}
-	}
-	
-	public void validate() throws InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("validate");
-		}
-		this.comboBoxConnectionType.validate();
-		this.textFieldDataSource.validate();
-		this.textFieldConnectionURL.validate();
-		this.comboBoxSQLDriver.validate();
-		this.textFieldPassword.validate();
-		this.textFieldUser.validate();
-	}
-	
-	public void commit()  throws SourceException, InvalidValueException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("commit");
-		}
-		this.comboBoxConnectionType.commit();
-		
-		Object id = this.comboBoxConnectionType.getValue();
-		if (id == null) {
-			logger.warn("Can't reset combo hasn't selected anything.");
-			return;
-		}
-		if (id.toString().equals(SQL_TYPE_JDBC)) {
-			this.textFieldConnectionURL.commit();
-			this.comboBoxSQLDriver.commit();
-			this.textFieldPassword.commit();
-			this.textFieldUser.commit();
-			
-			this.textFieldDataSource.setData(null);
-			this.entity.getEntity().getPipconfigParams().remove(SQL_DATASOURCE);
-
-		} else if (id.toString().equals(SQL_TYPE_JNDI)) {
-
-			this.textFieldDataSource.commit();
-
-			this.textFieldConnectionURL.setData(null);
-			this.comboBoxSQLDriver.setData(null);
-			this.textFieldPassword.setData(null);
-			this.textFieldUser.setData(null);
-			/* ???
-			this.entity.getEntity().getPipconfigParams().remove(SQL_TYPE);
-			this.entity.getEntity().getPipconfigParams().remove(SQL_DRIVER);
-			this.entity.getEntity().getPipconfigParams().remove(SQL_URL);
-			this.entity.getEntity().getPipconfigParams().remove(SQL_USER);
-			this.entity.getEntity().getPipconfigParams().remove(SQL_PASSWORD);
-			*/
-		}
-	}
-	
-	public void discard() throws SourceException {
-		if (logger.isDebugEnabled()) {
-			logger.debug("discard");
-		}
-		this.textFieldDataSource.setData(null);
-		this.textFieldConnectionURL.setData(null);
-		this.comboBoxSQLDriver.setData(null);
-		this.textFieldPassword.setData(null);
-		this.textFieldUser.setData(null);
-
-		this.entity.getEntity().getPipconfigParams().remove(SQL_TYPE);
-		this.entity.getEntity().getPipconfigParams().remove(SQL_DATASOURCE);
-		this.entity.getEntity().getPipconfigParams().remove(SQL_DRIVER);
-		this.entity.getEntity().getPipconfigParams().remove(SQL_URL);
-		this.entity.getEntity().getPipconfigParams().remove(SQL_USER);
-		this.entity.getEntity().getPipconfigParams().remove(SQL_PASSWORD);
-	}
-
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// comboBoxConnectionType
-		comboBoxConnectionType = new ComboBox();
-		comboBoxConnectionType.setCaption("Type of SQL Connection");
-		comboBoxConnectionType.setImmediate(false);
-		comboBoxConnectionType.setWidth("-1px");
-		comboBoxConnectionType.setHeight("-1px");
-		mainLayout.addComponent(comboBoxConnectionType);
-		
-		// textFieldDataSource
-		textFieldDataSource = new TextField();
-		textFieldDataSource.setCaption("Data Source");
-		textFieldDataSource.setImmediate(false);
-		textFieldDataSource.setWidth("-1px");
-		textFieldDataSource.setHeight("-1px");
-		mainLayout.addComponent(textFieldDataSource);
-		mainLayout.setExpandRatio(textFieldDataSource, 1.0f);
-		
-		// comboBoxSQLDriver
-		comboBoxSQLDriver = new ComboBox();
-		comboBoxSQLDriver.setCaption("JDBC Driver");
-		comboBoxSQLDriver.setImmediate(false);
-		comboBoxSQLDriver.setWidth("-1px");
-		comboBoxSQLDriver.setHeight("-1px");
-		mainLayout.addComponent(comboBoxSQLDriver);
-		mainLayout.setExpandRatio(comboBoxSQLDriver, 1.0f);
-		
-		// textFieldConnectionURL
-		textFieldConnectionURL = new TextField();
-		textFieldConnectionURL.setCaption("Connection URL");
-		textFieldConnectionURL.setImmediate(false);
-		textFieldConnectionURL.setWidth("-1px");
-		textFieldConnectionURL.setHeight("-1px");
-		mainLayout.addComponent(textFieldConnectionURL);
-		mainLayout.setExpandRatio(textFieldConnectionURL, 1.0f);
-		
-		// textFieldUser
-		textFieldUser = new TextField();
-		textFieldUser.setCaption("User");
-		textFieldUser.setImmediate(false);
-		textFieldUser.setWidth("-1px");
-		textFieldUser.setHeight("-1px");
-		mainLayout.addComponent(textFieldUser);
-		mainLayout.setExpandRatio(textFieldUser, 1.0f);
-		
-		// textFieldPassword
-		textFieldPassword = new PasswordField();
-		textFieldPassword.setCaption("Password");
-		textFieldPassword.setImmediate(false);
-		textFieldPassword.setWidth("-1px");
-		textFieldPassword.setHeight("-1px");
-		mainLayout.addComponent(textFieldPassword);
-		mainLayout.setExpandRatio(textFieldPassword, 1.0f);
-		
-		// buttonTest
-		buttonTest = new Button();
-		buttonTest.setCaption("Test Connection");
-		buttonTest.setImmediate(true);
-		buttonTest.setWidth("-1px");
-		buttonTest.setHeight("-1px");
-		mainLayout.addComponent(buttonTest);
-		mainLayout.setComponentAlignment(buttonTest, new Alignment(48));
-		
-		return mainLayout;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java
deleted file mode 100644
index da86e03..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
-
-public interface ApplyParametersChangedListener {
-	
-	void applyParameterChanged(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container);
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java
deleted file mode 100644
index 2491e18..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/ApplyParametersChangedNotifier.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
-
-public interface ApplyParametersChangedNotifier {
-
-	boolean	addListener(ApplyParametersChangedListener listener);
-	
-	boolean	removeListener(ApplyParametersChangedListener listener);
-	
-	void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container);
-	
-	class BasicNotifier implements ApplyParametersChangedNotifier {
-		Collection<ApplyParametersChangedListener> listeners = null;
-		
-		@Override
-		public boolean addListener(ApplyParametersChangedListener listener) {
-			if (this.listeners == null) {
-				this.listeners = new ArrayList<ApplyParametersChangedListener>();
-			}
-			return this.listeners.add(listener);
-		}
-
-		@Override
-		public boolean removeListener(ApplyParametersChangedListener listener) {
-			if (this.listeners == null) {
-				return false;
-			}
-			return this.listeners.remove(listener);
-		}
-
-		@Override
-		public void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) {
-			if (this.listeners == null) {
-				return;
-			}
-			for (ApplyParametersChangedListener listener : this.listeners) {
-				listener.applyParameterChanged(apply, parent, argument, container);
-			}
-		}
-		
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java
deleted file mode 100644
index 10fb9a2..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-
-public interface AttributeChangedEventListener {
-	void attributeChanged(Attribute attribute);
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java
deleted file mode 100644
index da7606f..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/AttributeChangedEventNotifier.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-
-public interface AttributeChangedEventNotifier {
-
-	boolean	addListener(AttributeChangedEventListener listener);
-	
-	boolean removeListener(AttributeChangedEventListener listener);
-
-	void	fireAttributeChanged(Attribute attribute);
-	
-	void commit();
-	
-	Attribute	getAttribute();
-	
-	class BasicNotifier implements AttributeChangedEventNotifier {
-		Collection<AttributeChangedEventListener>	listeners = null;
-
-		@Override
-		public boolean addListener(AttributeChangedEventListener listener) {
-			if (this.listeners == null) {
-				this.listeners = new ArrayList<AttributeChangedEventListener>();
-			}
-			return this.listeners.add(listener);
-		}
-
-		@Override
-		public boolean removeListener(AttributeChangedEventListener listener) {
-			if (this.listeners == null) {
-				return false;
-			}
-			return this.listeners.remove(listener);
-		}
-
-		@Override
-		public void fireAttributeChanged(Attribute attribute) {
-			if (this.listeners == null) {
-				return;
-			}
-			for (AttributeChangedEventListener listener : this.listeners) {
-				listener.attributeChanged(attribute);
-			}
-		}
-		
-		public void commit() {
-			
-		}
-
-		public Attribute	getAttribute() {
-			return null;
-		}
-		
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java
deleted file mode 100644
index 4637ee7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-public interface FormChangedEventListener {
-	void onFormChanged();
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java
deleted file mode 100644
index 1b8ba9d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/events/FormChangedEventNotifier.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.events;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-public interface FormChangedEventNotifier {
-	boolean	addListener(FormChangedEventListener listener);
-	boolean	removeListener(FormChangedEventListener listener);
-	void		fireFormChangedEvent();
-	
-	class BasicNotifier implements FormChangedEventNotifier {
-		Collection<FormChangedEventListener> listeners = null;
-
-		@Override
-		public boolean addListener(FormChangedEventListener listener) {
-			if (this.listeners == null) {
-				this.listeners = new ArrayList<FormChangedEventListener>();
-			}
-			return this.listeners.add(listener);
-		}
-
-		@Override
-		public boolean removeListener(FormChangedEventListener listener) {
-			if (this.listeners == null) {
-				this.listeners = new ArrayList<FormChangedEventListener>();
-			}
-			return this.listeners.remove(listener);
-		}
-
-		@Override
-		public void fireFormChangedEvent() {
-			if (this.listeners == null) {
-				return;
-			}
-			for (FormChangedEventListener listener : this.listeners) {
-				listener.onFormChanged();
-			}
-		}
-		
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java
deleted file mode 100644
index c91a192..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConfigParamField.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import java.util.Collection;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPType;
-import org.apache.openaz.xacml.admin.view.components.CSVPIPConfigurationComponent;
-import org.apache.openaz.xacml.admin.view.components.CustomPIPConfigurationComponent;
-import org.apache.openaz.xacml.admin.view.components.HyperCSVPIPConfigurationComponent;
-import org.apache.openaz.xacml.admin.view.components.LDAPPIPConfigurationComponent;
-import org.apache.openaz.xacml.admin.view.components.SQLPIPConfigurationComponent;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-import com.vaadin.ui.VerticalLayout;
-
-public class ConfigParamField extends CustomField<Object> implements FormChangedEventListener {
-	private static final long serialVersionUID = 1L;
-	private final EntityItem<PIPConfiguration> entityConfig;
-	private VerticalLayout mainLayout = new VerticalLayout();
-
-	public ConfigParamField(EntityItem<PIPConfiguration> config) {
-		//
-		// Save
-		//
-		this.entityConfig = config;
-		//
-		// Make sure we can auto-fit
-		//
-		this.setWidth("-1px");
-		this.mainLayout.setWidth("-1px");
-	}
-
-	public Component resetContent(PIPType pipType) {
-		//
-		// Remove all the layout
-		//
-		this.mainLayout.removeAllComponents();
-		this.mainLayout.setDescription("Custom Field Layout");
-		//
-		// Is there a type?
-		//
-		if (pipType == null) {
-			return this.mainLayout;
-		}
-		//
-		// Setup the layout based on the type
-		//
-		Component c = null;
-		String type = pipType.getType();
-		if (type.equals(PIPType.TYPE_SQL)) {
-			SQLPIPConfigurationComponent comp = new SQLPIPConfigurationComponent(this.entityConfig);
-			comp.addListener(this);
-			c = comp;
-		} else if (type.equals(PIPType.TYPE_LDAP)) {
-			LDAPPIPConfigurationComponent comp = new LDAPPIPConfigurationComponent(this.entityConfig);
-			comp.addListener(this);
-			c = comp;
-		} else if (type.equals(PIPType.TYPE_CSV)) {
-			CSVPIPConfigurationComponent comp = new CSVPIPConfigurationComponent(this.entityConfig);
-			comp.addListener(this);
-			c = comp;
-		} else if (type.equals(PIPType.TYPE_HYPERCSV)) {
-			HyperCSVPIPConfigurationComponent comp = new HyperCSVPIPConfigurationComponent(this.entityConfig);
-			comp.addListener(this);
-			c = comp;
-		} else if (type.equals(PIPType.TYPE_CUSTOM)) {
-			CustomPIPConfigurationComponent comp = new CustomPIPConfigurationComponent(this.entityConfig);
-			comp.addListener(this);
-			c = comp;
-		}
-		if (c != null) {
-			this.mainLayout.addComponent(c);
-		}
-		//
-		// Done
-		//
-		return this.mainLayout;
-	}
-	
-	@Override
-	protected Component initContent() {
-		return this.resetContent(this.entityConfig.getEntity().getPiptype());
-	}
-
-	@Override
-	public void validate() throws InvalidValueException {
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component c = this.mainLayout.getComponent(0);
-		if (c instanceof SQLPIPConfigurationComponent) {
-			((SQLPIPConfigurationComponent)c).validate();
-		} else if (c instanceof LDAPPIPConfigurationComponent) {
-			((LDAPPIPConfigurationComponent)c).validate();
-		} else if (c instanceof CSVPIPConfigurationComponent) {
-			((CSVPIPConfigurationComponent)c).validate();
-		} else if (c instanceof HyperCSVPIPConfigurationComponent) {
-			((HyperCSVPIPConfigurationComponent)c).validate();
-		} else if (c instanceof CustomPIPConfigurationComponent) {
-			((CustomPIPConfigurationComponent)c).validate();
-		}
-		super.validate();
-	}
-
-	@Override
-	public void commit() throws SourceException, InvalidValueException {
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component c = this.mainLayout.getComponent(0);
-		if (c instanceof SQLPIPConfigurationComponent) {
-			((SQLPIPConfigurationComponent)c).commit();
-		} else if (c instanceof LDAPPIPConfigurationComponent) {
-			((LDAPPIPConfigurationComponent)c).commit();
-		} else if (c instanceof CSVPIPConfigurationComponent) {
-			((CSVPIPConfigurationComponent)c).commit();
-		} else if (c instanceof HyperCSVPIPConfigurationComponent) {
-			((HyperCSVPIPConfigurationComponent)c).commit();
-		} else if (c instanceof CustomPIPConfigurationComponent) {
-			((CustomPIPConfigurationComponent)c).commit();
-		}
-		super.commit();
-	}
-
-	@Override
-	public Class<?> getType() {
-		return Collection.class;
-	}
-
-	@Override
-	public void onFormChanged() {
-		this.fireEvent(new com.vaadin.ui.Field.ValueChangeEvent(this));
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java
deleted file mode 100644
index 2004510..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ConstraintField.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import java.util.Collection;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.view.components.EnumerationEditorComponent;
-import org.apache.openaz.xacml.admin.view.components.RangeEditorComponent;
-import org.apache.openaz.xacml.admin.view.components.RegexpEditorComponent;
-import org.apache.openaz.xacml.api.Identifier;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-import com.vaadin.ui.VerticalLayout;
-
-public class ConstraintField extends CustomField<Object> {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(ConstraintField.class);
-	
-	private VerticalLayout mainLayout = new VerticalLayout();
-	private EntityItem<Attribute>	attributeEntity;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ConstraintField(EntityItem<Attribute> entityItem) {
-		//
-		// Save our Attribute that we are editing
-		//
-		this.attributeEntity = entityItem;
-	}
-	
-	public void	resetDatatype(Identifier id) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("resetDatatype " + id);
-		}
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component component = this.mainLayout.getComponent(0);
-		if (component != null && component instanceof RangeEditorComponent) {
-			((RangeEditorComponent) component).setupDatatype(id);
-		}
-		if (component != null && component instanceof EnumerationEditorComponent) {
-			((EnumerationEditorComponent) component).setupDatatype(id);
-		}
-	}
-	
-	public Component resetContent(ConstraintType type, Identifier datatype) {
-		//
-		// Remove all existing components
-		//
-		this.mainLayout.removeAllComponents();
-		//
-		// What are we constrained to?
-		//
-		if (type == null || type.getConstraintType() == null) {
-			//
-			// No constraint defined
-			//
-			this.attributeEntity.getEntity().removeAllConstraintValues();
-			return mainLayout;
-		}
-		if (type.getConstraintType().equals("Enumeration")) {
-			mainLayout.addComponent(new EnumerationEditorComponent(this.attributeEntity.getEntity(), datatype));
-		} else if (type.getConstraintType().equals("Range")) {
-			mainLayout.addComponent(new RangeEditorComponent(this.attributeEntity.getEntity(), datatype));
-		} else if (type.getConstraintType().equals("Regular Expression")) {
-			mainLayout.addComponent(new RegexpEditorComponent(this.attributeEntity.getEntity()));
-		}
-		return mainLayout;
-	}
-
-	@Override
-	protected Component initContent() {
-		return this.resetContent(this.attributeEntity.getEntity().getConstraintType(), this.attributeEntity.getEntity().getDatatypeBean().getIdentifer());
-	}
-
-	@Override
-	public Class<?> getType() {
-		return Collection.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java
deleted file mode 100644
index 62c7ffa..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/DesignatorSelectorField.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-import com.vaadin.ui.OptionGroup;
-
-public class DesignatorSelectorField extends CustomField<Object> {
-	private static final long serialVersionUID = 1L;
-	private final DesignatorSelectorField self = this;
-	private final OptionGroup selectDesignator = new OptionGroup("Type of attribute");
-
-	public DesignatorSelectorField(EntityItem<Attribute> attributeEntity) {
-		this.selectDesignator.setImmediate(true);
-		this.selectDesignator.addItem(Attribute.ATTRIBUTE_DESIGNATOR);
-		this.selectDesignator.addItem(Attribute.ATTRIBUTE_SELECTOR);
-		if (attributeEntity.getEntity().isDesignator()) {
-			this.selectDesignator.select(Attribute.ATTRIBUTE_DESIGNATOR);
-		} else {
-			this.selectDesignator.select(Attribute.ATTRIBUTE_SELECTOR);
-		}
-		//
-		// Listen when designator vs selector changes
-		//
-		this.selectDesignator.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(
-					com.vaadin.data.Property.ValueChangeEvent event) {
-				Object value = self.selectDesignator.getValue();
-				if (value != null) {
-					if (value.toString().equals(Attribute.ATTRIBUTE_DESIGNATOR)) {
-						self.setValue('1');
-					} else if (value.toString().equals(Attribute.ATTRIBUTE_SELECTOR)) {
-						self.setValue('0');
-					}
-				}
-			}
-		});
-	}
-
-	@Override
-	protected Component initContent() {
-		return this.selectDesignator;
-	}
-
-	@Override
-	public Class<? extends Object> getType() {
-		return Character.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java
deleted file mode 100644
index d1f250b..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ExpressionField.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import java.util.Collection;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-
-
-public class ExpressionField extends CustomField<Object> {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(ExpressionField.class); //NOPMD
-	
-	@Override
-	protected Component initContent() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Class<? extends Object> getType() {
-		return Collection.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java
deleted file mode 100644
index f5ca9fd..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/OaExpressionsField.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import java.util.Collection;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.view.components.OaExpressionsEditorComponent;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-import com.vaadin.ui.UI;
-
-public class OaExpressionsField extends CustomField<Object> {
-	private static final long serialVersionUID = 1L;
-	private final EntityItem<Obadvice> obad;
-
-	public OaExpressionsField(EntityItem<Obadvice> obad) {
-		this.obad = obad;
-	}
-
-	@Override
-	protected Component initContent() {
-		return new OaExpressionsEditorComponent(this.obad, ((XacmlAdminUI)UI.getCurrent()).getObadviceExpressions());
-	}
-
-	@Override
-	public Class<? extends Object> getType() {
-		return Collection.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java
deleted file mode 100644
index 9986dc7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/fields/ResolverParamField.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.fields;
-
-import java.util.Collection;
-
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.view.components.PIPParameterComponent;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.windows.PIPSQLResolverEditorWindow;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.CustomField;
-import com.vaadin.ui.VerticalLayout;
-
-public class ResolverParamField extends CustomField<Object> implements FormChangedEventListener {
-	private static final long serialVersionUID = 1L;
-	private final EntityItem<PIPResolver> entity;
-	private VerticalLayout mainLayout = new VerticalLayout();
-
-	public ResolverParamField(EntityItem<PIPResolver> entity) {
-		this.entity = entity;
-		//
-		// Make sure we can auto-fit
-		//
-		this.setWidth("-1px");
-		this.mainLayout.setWidth("-1px");
-	}
-
-	@Override
-	public void onFormChanged() {
-		this.fireEvent(new com.vaadin.ui.Field.ValueChangeEvent(this));
-	}
-
-	@Override
-	protected Component initContent() {
-		Component c = null;
-		if (this.entity.getEntity().getPipconfiguration().getPiptype().isSQL() ||
-			this.entity.getEntity().getPipconfiguration().getPiptype().isHyperCSV() ||
-			this.entity.getEntity().getPipconfiguration().getPiptype().isLDAP() ||
-			this.entity.getEntity().getPipconfiguration().getPiptype().isCSV() ) {
-			//
-			//
-			//
-			PIPSQLResolverEditorWindow comp = new PIPSQLResolverEditorWindow(this.entity);
-			comp.addListener(this);
-			c = comp;
-		} else {
-			//
-			//
-			//
-			PIPParameterComponent comp = new PIPParameterComponent(this.entity.getEntity());
-			comp.addListener(this);
-			c = comp;
-		}
-		if (c != null) {
-			this.mainLayout.addComponent(c);
-		}
-		return this.mainLayout;
-	}
-
-	
-	@Override
-	public void discard() throws SourceException {
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component c = this.mainLayout.getComponent(0);
-		if (c instanceof PIPSQLResolverEditorWindow) {
-			((PIPSQLResolverEditorWindow)c).discard();
-		}
-		super.discard();
-	}
-
-	@Override
-	public void validate() throws InvalidValueException {
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component c = this.mainLayout.getComponent(0);
-		if (c instanceof PIPSQLResolverEditorWindow) {
-			((PIPSQLResolverEditorWindow)c).validate();
-		}
-		super.validate();
-	}
-
-	@Override
-	public void commit() throws SourceException, InvalidValueException {
-		if (this.mainLayout.getComponentCount() == 0) {
-			return;
-		}
-		Component c = this.mainLayout.getComponent(0);
-		if (c instanceof PIPSQLResolverEditorWindow) {
-			((PIPSQLResolverEditorWindow)c).commit();
-		}
-		super.commit();
-	}
-
-	@Override
-	public Class<? extends Object> getType() {
-		return Collection.class;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java
deleted file mode 100644
index 1101f23..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/AnyURIValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import com.vaadin.data.Validator;
-
-public class AnyURIValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public AnyURIValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				new URI((String) value);
-			} catch (URISyntaxException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized URI");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java
deleted file mode 100644
index 362a5d9..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/Base64BinaryValidator.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-// import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Base64;
-
-import com.vaadin.data.Validator;
-
-public class Base64BinaryValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public Base64BinaryValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			// try {
-				new Base64().decode((String) value);
-			// Base64().decode(String) inherited from 
-			// org.apache.commons.codec.binary.BaseNCodec
-			// does not throw DecoderException in version 1.10
-			// of org.apache.commons.codec (the version we are
-			// using).  This may need to be uncommented in later
-			// versions.
-			//
-			// TODO - Since this does not throw an exception under
-			//        any circumstance, I question whether it is
-			//        a valid method of validating the input value.
-			//
-			// } catch (DecoderException e) {
-			// 	throw new InvalidValueException(e.getLocalizedMessage());
-			// }
-		} else
-			throw new InvalidValueException("Unrecognized Base64 Binary");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java
deleted file mode 100644
index 0e2c8c1..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/BooleanValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import com.vaadin.data.Validator;
-
-public class BooleanValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public BooleanValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof Boolean) {
-			return;
-		}
-		if (value.toString().equalsIgnoreCase("true") ||
-			value.toString().equalsIgnoreCase("false") ||
-			value.toString().equalsIgnoreCase("0") ||
-			value.toString().equalsIgnoreCase("1")) {
-			return;
-		}
-		throw new InvalidValueException("Unrecognized boolean");
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java
deleted file mode 100644
index 3d2c8d0..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DNSNameValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.RFC2396DomainName;
-import com.vaadin.data.Validator;
-
-public class DNSNameValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public DNSNameValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				RFC2396DomainName.newInstance((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized DNS Name");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java
deleted file mode 100644
index 4bdea6e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateTimeValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.ISO8601DateTime;
-import com.vaadin.data.Validator;
-
-public class DateTimeValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public DateTimeValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				ISO8601DateTime.fromISO8601DateTimeString((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized DateTime");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java
deleted file mode 100644
index 0d217e4..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DateValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.ISO8601Date;
-import com.vaadin.data.Validator;
-
-public class DateValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public DateValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				ISO8601Date.fromISO8601DateString((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized Date");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java
deleted file mode 100644
index f8aaa6b..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DayTimeDurationValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.XPathDayTimeDuration;
-import com.vaadin.data.Validator;
-
-public class DayTimeDurationValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public DayTimeDurationValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				XPathDayTimeDuration.newInstance((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized DayTimeDuration");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java
deleted file mode 100644
index a0fc0dd..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/DoubleValidator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import com.vaadin.data.Validator;
-
-public class DoubleValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public DoubleValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof Double) {
-			return;
-		}
-		try {
-			Double.parseDouble(value.toString());
-		} catch (NumberFormatException e) {
-			throw new InvalidValueException(e.getLocalizedMessage());
-		}
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java
deleted file mode 100644
index e8065b1..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/HexBinaryValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import org.apache.commons.codec.DecoderException;
-
-import org.apache.openaz.xacml.std.datatypes.HexBinary;
-import com.vaadin.data.Validator;
-
-public class HexBinaryValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public HexBinaryValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				HexBinary.newInstance((String) value);
-			} catch (DecoderException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized HexBinary");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java
deleted file mode 100644
index 3996819..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IntegerValidator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import com.vaadin.data.Validator;
-
-public class IntegerValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public IntegerValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof Integer) {
-			return;
-		}
-		try {
-			Integer.parseInt(value.toString());
-		} catch (NumberFormatException e) {
-			throw new InvalidValueException(e.getLocalizedMessage());
-		}
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java
deleted file mode 100644
index 72aa772..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/IpAddressValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.IPAddress;
-import com.vaadin.data.Validator;
-
-public class IpAddressValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public IpAddressValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				IPAddress.newInstance((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized IP Address");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java
deleted file mode 100644
index 4211cd7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/RFC822NameValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.RFC822Name;
-import com.vaadin.data.Validator;
-
-public class RFC822NameValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public RFC822NameValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				RFC822Name.newInstance((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized RFC822 Name");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java
deleted file mode 100644
index 7d03d38..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/StringValidator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import com.vaadin.data.Validator;
-
-public class StringValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public StringValidator() {
-		// TODO Auto-generated constructor stub
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		// TODO Auto-generated method stub
-		
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java
deleted file mode 100644
index b93dafe..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/TimeValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.ISO8601Time;
-import com.vaadin.data.Validator;
-
-public class TimeValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public TimeValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				ISO8601Time.fromISO8601TimeString((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized Time");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java
deleted file mode 100644
index 354d662..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/ValidatorFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.data.Validator;
-
-public class ValidatorFactory {
-
-	public static Validator	newInstance(Datatype datatype) {
-		
-		if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_ANYURI)) {
-			return new AnyURIValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_BASE64BINARY)) {
-			return new Base64BinaryValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_BOOLEAN)) {
-			return new BooleanValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DATE)) {
-			return new DateValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DATETIME)) {
-			return new DateTimeValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DAYTIMEDURATION)) {
-			return new DayTimeDurationValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DNSNAME)) {
-			return new DNSNameValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_DOUBLE)) {
-			return new DoubleValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_HEXBINARY)) {
-			return new HexBinaryValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_INTEGER)) {
-			return new IntegerValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_IPADDRESS)) {
-			return new IpAddressValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_RFC822NAME)) {
-			return new RFC822NameValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_STRING)) {
-			return new StringValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_TIME)) {
-			return new TimeValidator();
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_X500NAME)) {
-			return new X500NameValidator();
-		/*
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_XPATHEXPRESSION)) {
-			
-		*/
-		} else if (datatype.getIdentifer().equals(XACML3.ID_DATATYPE_YEARMONTHDURATION)) {
-			return new YearMonthDurationValidator();
-		}
-		
-		return null;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java
deleted file mode 100644
index 977a13d..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/X500NameValidator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import javax.security.auth.x500.X500Principal;
-
-import com.vaadin.data.Validator;
-
-public class X500NameValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public X500NameValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				new X500Principal((String) value);
-			} catch (IllegalArgumentException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized X500 Name");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java
deleted file mode 100644
index 8d53629..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/validators/YearMonthDurationValidator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.validators;
-
-import java.text.ParseException;
-
-import org.apache.openaz.xacml.std.datatypes.XPathYearMonthDuration;
-import com.vaadin.data.Validator;
-
-public class YearMonthDurationValidator implements Validator {
-	private static final long serialVersionUID = 1L;
-
-	public YearMonthDurationValidator() {
-	}
-
-	@Override
-	public void validate(Object value) throws InvalidValueException {
-		if (value instanceof String) {
-			try {
-				XPathYearMonthDuration.newInstance((String) value);
-			} catch (ParseException e) {
-				throw new InvalidValueException(e.getLocalizedMessage());
-			}
-		} else
-			throw new InvalidValueException("Unrecognized YearMonthDuration");
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java
deleted file mode 100644
index 802eb43..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AdviceEditorWindow.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AdviceExpressionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class AdviceEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private OptionGroup optionGroupEffect;
-	@AutoGenerated
-	private TextField textFieldAdviceID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final AdviceEditorWindow self = this;
-	private final AdviceExpressionType advice;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AdviceEditorWindow(AdviceExpressionType advice) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.advice = advice;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initialize();
-		this.initializeButton();
-		//
-		// Focus
-		//
-		this.textFieldAdviceID.focus();
-	}
-	
-	protected void initialize() {
-		//
-		// The text field for the advice ID
-		//
-		this.textFieldAdviceID.setNullRepresentation("");
-		if (this.advice.getAdviceId() == null) {
-			this.textFieldAdviceID.setValue(XacmlAdminUI.getDomain());
-		} else {
-			this.textFieldAdviceID.setValue(advice.getAdviceId());
-		}
-		this.textFieldAdviceID.setRequiredError("You must have an ID for the advice");
-		//
-		// The option
-		//
-		this.optionGroupEffect.setRequiredError("You must select Permit or Deny for the advice");
-		this.optionGroupEffect.addItem(EffectType.PERMIT);
-		this.optionGroupEffect.addItem(EffectType.DENY);
-		if (this.advice.getAppliesTo() == null) {
-			this.optionGroupEffect.select(EffectType.PERMIT);
-		} else {
-			if (this.advice.getAppliesTo().equals(EffectType.PERMIT)) {
-				this.optionGroupEffect.select(EffectType.PERMIT);
-			} else {
-				this.optionGroupEffect.select(EffectType.DENY);
-			}
-		}
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.setImmediate(true);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textFieldAdviceID.commit();
-					self.optionGroupEffect.commit();
-					//
-					// all good, save everything
-					//
-					self.advice.setAdviceId(self.textFieldAdviceID.getValue());
-					self.advice.setAppliesTo((EffectType) self.optionGroupEffect.getValue());
-					//
-					// Set ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// Vaadin displays the error
-					//
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public AdviceExpressionType getAdvice() {
-		return this.advice;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldAdviceID
-		textFieldAdviceID = new TextField();
-		textFieldAdviceID.setCaption("Advice ID");
-		textFieldAdviceID.setImmediate(false);
-		textFieldAdviceID.setWidth("-1px");
-		textFieldAdviceID.setHeight("-1px");
-		textFieldAdviceID.setInvalidAllowed(false);
-		textFieldAdviceID.setRequired(true);
-		textFieldAdviceID.setInputPrompt("Eg. urn:com:foo:advice:sample");
-		mainLayout.addComponent(textFieldAdviceID);
-		
-		// optionGroupEffect
-		optionGroupEffect = new OptionGroup();
-		optionGroupEffect.setCaption("Applies To");
-		optionGroupEffect.setImmediate(false);
-		optionGroupEffect.setWidth("-1px");
-		optionGroupEffect.setHeight("-1px");
-		optionGroupEffect.setInvalidAllowed(false);
-		optionGroupEffect.setRequired(true);
-		mainLayout.addComponent(optionGroupEffect);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java
deleted file mode 100644
index e8496e5..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ApplyEditorWindow.java
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.List;
-import java.util.Map;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ConditionType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener;
-import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedNotifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Container;
-import com.vaadin.data.Container.Filter;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.data.util.filter.SimpleStringFilter;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ApplyEditorWindow extends Window implements ApplyParametersChangedNotifier {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSelect;
-	@AutoGenerated
-	private Table tableFunction;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private CheckBox checkBoxFilterIsBag;
-	@AutoGenerated
-	private ComboBox comboBoxDatatypeFilter;
-	@AutoGenerated
-	private TextField textFieldFilter;
-	@AutoGenerated
-	private TextArea textAreaDescription;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(ApplyEditorWindow.class);
-	private final ApplyEditorWindow self = this;
-	private final ApplyParametersChangedNotifier notifier = new ApplyParametersChangedNotifier.BasicNotifier();
-	private final BeanItemContainer<FunctionDefinition>	container = new BeanItemContainer<FunctionDefinition>(FunctionDefinition.class);
-	private final ApplyType apply;
-	private final ApplyType applyParent;
-	private final FunctionArgument argument;
-	private final Object parent;
-	private boolean isSaved = false;
-	private FunctionDefinition function = null;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param parent 
-	 * @param parentApply 
-	 */
-	public ApplyEditorWindow(ApplyType apply, ApplyType parentApply, FunctionArgument argument, Object parent) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.apply = apply;
-		this.applyParent = parentApply;
-		this.argument = argument;
-		this.parent = parent;
-		logger.info(this.apply + " " + this.applyParent + " " + this.argument + " " + this.parent);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.textAreaDescription.setValue(apply.getDescription());
-		this.textAreaDescription.setNullRepresentation("");
-		this.initializeButton();
-		this.initializeTable();
-		this.initializeFilters();
-		//
-		// focus
-		//
-		this.textFieldFilter.focus();
-	}
-	
-	protected void initializeTable() {
-		//
-		// Setup GUI properties
-		//
-		this.tableFunction.setImmediate(true);
-		this.tableFunction.setSelectable(true);
-		this.tableFunction.setNullSelectionAllowed(false);
-		this.tableFunction.setRequired(true);
-		this.tableFunction.setRequiredError("You MUST select a function for the Apply");
-		//
-		// Set its data source
-		//
-		this.tableFunction.setContainerDataSource(this.container);
-		this.tableFunction.setVisibleColumns(new Object[] {"xacmlid", "shortname", "datatypeBean", "isBagReturn"});
-		this.tableFunction.setColumnHeaders(new String[] {"Function Xacml ID", "ID", "Return Data Type", "Return Bag?"});
-		//
-		// Determine appropriate filters
-		//
-		Datatype datatypeId = null;
-		if (this.applyParent == null) {
-			if (this.parent instanceof ConditionType) {
-				//
-				// Only boolean functions allowed
-				//
-				datatypeId = JPAUtils.findDatatype(XACML3.ID_DATATYPE_BOOLEAN);
-			}
-		} else {
-			String parentFunction = this.applyParent.getFunctionId();
-			this.function = JPAUtils.findFunction(parentFunction);
-			if (this.function == null) {
-				throw new IllegalArgumentException("applyParent's function is not found:" + parentFunction);
-			}
-			if (this.argument == null) {
-				throw new IllegalArgumentException("Need to know what argument apply is ");
-			}
-			datatypeId = this.argument.getDatatypeBean();
-		}
-		Map<Datatype, List<FunctionDefinition>> functionMap = JPAUtils.getFunctionDatatypeMap();
-		if (datatypeId == null) {
-			//
-			// All functions are available
-			//
-			for (Datatype id : functionMap.keySet()) {
-				this.addTableEntries(functionMap.get(id));
-			}
-		} else {
-			for (Datatype id : functionMap.keySet()) {
-				if (id == null) {
-					if (datatypeId == null) {
-						this.addTableEntries(functionMap.get(id));
-						break;
-					}
-					continue;
-				}
-				if (id.getId() == datatypeId.getId()) {
-					this.addTableEntries(functionMap.get(id));
-					break;
-				}
-			}
-		}
-		//
-		// Setup double-click
-		//
-		this.tableFunction.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					self.selected();
-				}
-			}
-		});
-		//
-		// Value change listener
-		//
-		this.tableFunction.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				logger.info("valueChange " + self.tableFunction.getValue());
-				if (self.tableFunction.getValue() != null) {
-					self.buttonSelect.setEnabled(true);
-				} else {
-					self.buttonSelect.setEnabled(false);
-				}
-			}			
-		});
-		//
-		// Select current value if possible
-		//
-		if (this.apply != null && this.apply.getFunctionId() != null && this.apply.getFunctionId().isEmpty() == false) {
-			FunctionDefinition current = JPAUtils.findFunction(this.apply.getFunctionId());
-			if (current != null) {
-				this.tableFunction.select(current);
-				this.tableFunction.setCurrentPageFirstItemId(current);
-			} else {
-				logger.warn("Could not find function in table for " + this.apply.getFunctionId());
-			}
-		} else {
-			this.buttonSelect.setEnabled(false);
-		}
-	}
-	
-	protected void addTableEntries(List<FunctionDefinition> functions) {
-		if (functions == null) {
-			logger.warn("NULL list of functions, cannot add to table.");
-			return;
-		}
-		for (FunctionDefinition function : functions) {
-			//
-			// Just check if this function is available for this
-			// apply.
-			//
-//			if (XACMLFunctionValidator.isFunctionAvailable(function, this.apply, this.argument)) {
-				this.container.addBean(function);
-//			} else {
-//				if (logger.isDebugEnabled()) {
-//					logger.debug("Function not available: " + function);
-//				}
-//			}
-		}
-	}
-	
-	protected void initializeButton() {
-		this.buttonSelect.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.selected();
-			}
-		});
-	}
-	
-	protected void initializeFilters() {
-		this.textFieldFilter.setImmediate(true);
-		this.textFieldFilter.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-			SimpleStringFilter currentFilter = null;
-			
-			@Override
-			public void textChange(TextChangeEvent event) {
-				//
-				// Remove current filter
-				//
-				if (this.currentFilter != null) {
-					self.container.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Get the text
-				//
-				String value = event.getText();
-				if (value != null && value.length() > 0) {
-					//
-					// Add the new filter
-					//
-					this.currentFilter = new SimpleStringFilter("shortname", value, true, false);
-					self.container.addContainerFilter(this.currentFilter);
-				}
-			}
-		});
-		
-		this.comboBoxDatatypeFilter.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes());
-		this.comboBoxDatatypeFilter.setImmediate(true);
-		this.comboBoxDatatypeFilter.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxDatatypeFilter.setItemCaptionPropertyId("xacmlId");
-		this.comboBoxDatatypeFilter.setNullSelectionAllowed(true);
-		this.comboBoxDatatypeFilter.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-			Container.Filter currentFilter = null;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Remove current filter
-				//
-				if (this.currentFilter != null) {
-					self.container.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Get the current selection
-				//
-				Object id = self.comboBoxDatatypeFilter.getValue();
-				if (id == null) {
-					return;
-				}
-				//
-				// Setup the filter
-				//
-				final Datatype datatype = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id).getEntity();
-				this.currentFilter = new Container.Filter() {
-					private static final long serialVersionUID = 1L;
-
-					@Override
-					public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException {
-						if (itemId instanceof FunctionDefinition) {
-							Datatype dt = ((FunctionDefinition) itemId).getDatatypeBean();
-							if (dt == null) {
-								return false;
-							}
-							return dt.getXacmlId().equals(datatype.getXacmlId());
-						}
-						return false;
-					}
-					
-					@Override
-					public boolean appliesToProperty(Object propertyId) {
-						if (propertyId != null && propertyId.toString().equals("datatypeBean")) {
-							return true;
-						}
-						return false;
-					}
-				};
-				self.container.addContainerFilter(this.currentFilter);
-			}
-		});
-		
-		this.checkBoxFilterIsBag.setImmediate(true);
-		this.checkBoxFilterIsBag.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-			Filter currentFilter = null;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Remove current filter
-				//
-				if (this.currentFilter != null) {
-					self.container.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Is it checked?
-				//
-				if (self.checkBoxFilterIsBag.getValue() == false) {
-					//
-					// Nope, get out of here
-					//
-					return;
-				}
-				//
-				// Add the filter
-				//
-				this.currentFilter = new Compare.Equal("isBagReturn", true);
-				self.container.addContainerFilter(this.currentFilter);
-			}
-		});
-	}
-	
-	protected	void	selected() {
-		//
-		// Is there a selected function?
-		//
-		try {
-			//
-			// Run the commit
-			//
-			this.textAreaDescription.commit();
-			this.tableFunction.commit();
-			//
-			// Commit worked, get the selected function
-			//
-			Object id = this.tableFunction.getValue();
-			//
-			// Sanity check, it *should* never be null
-			// unless someone changed the initialization code.
-			//
-			if (id == null || ! (id instanceof FunctionDefinition)) {
-				throw new InvalidValueException(this.tableFunction.getRequiredError());
-			}
-			//
-			// Get the actual function and save it into the apply
-			//
-			this.function = (FunctionDefinition) id;
-			this.apply.setDescription(this.textAreaDescription.getValue());
-			this.apply.setFunctionId(function.getXacmlid());
-		} catch (SourceException | InvalidValueException e) {
-			//
-			// Vaadin GUI will display message
-			//
-			return;
-		}
-		/**
-		//
-		// Make sure the arguments are good
-		//
-		final ApplyType copyApply = XACMLObjectCopy.copy(this.apply);
-		final ApplyArgumentsEditorWindow window = new ApplyArgumentsEditorWindow(copyApply, this.function);
-		window.setCaption("Define Arguments for " + this.function.getShortname());
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Save our arguments
-				//
-				self.apply.getExpression().clear();
-				self.apply.getExpression().addAll(copyApply.getExpression());
-				//
-				// We are saved
-				//
-				self.isSaved = true;
-				//
-				// Fire
-				//
-				self.fireEvent(self.apply, self.applyParent, self.argument, self.parent);
-				//
-				// Close the apply editor window
-				//
-				self.close();
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-		**/
-		//
-		// We are saved
-		//
-		self.isSaved = true;
-		//
-		// Fire
-		//
-		self.fireEvent(self.apply, self.applyParent, self.argument, self.parent);
-		//
-		// Close the apply editor window
-		//
-		self.close();
-	}
-
-	@Override
-	public boolean addListener(ApplyParametersChangedListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(ApplyParametersChangedListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireEvent(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) {
-		this.notifier.fireEvent(apply, parent, argument, container);
-	}
-
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public FunctionDefinition	getSelectedFunction() {
-		return this.function;
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		// tableFunction
-		tableFunction = new Table();
-		tableFunction.setCaption("Select A Function");
-		tableFunction.setImmediate(false);
-		tableFunction.setWidth("100.0%");
-		tableFunction.setHeight("-1px");
-		tableFunction.setInvalidAllowed(false);
-		tableFunction.setRequired(true);
-		mainLayout.addComponent(tableFunction);
-		mainLayout.setExpandRatio(tableFunction, 1.0f);
-		
-		// buttonSelect
-		buttonSelect = new Button();
-		buttonSelect.setCaption("Select and Continue");
-		buttonSelect.setImmediate(true);
-		buttonSelect.setWidth("-1px");
-		buttonSelect.setHeight("-1px");
-		mainLayout.addComponent(buttonSelect);
-		mainLayout.setComponentAlignment(buttonSelect, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// textAreaDescription
-		textAreaDescription = new TextArea();
-		textAreaDescription.setCaption("Enter A Description");
-		textAreaDescription.setImmediate(false);
-		textAreaDescription.setWidth("50.0%");
-		textAreaDescription.setHeight("-1px");
-		horizontalLayout_1.addComponent(textAreaDescription);
-		
-		// textFieldFilter
-		textFieldFilter = new TextField();
-		textFieldFilter.setCaption("Filter Function By ID");
-		textFieldFilter.setImmediate(false);
-		textFieldFilter.setWidth("-1px");
-		textFieldFilter.setHeight("-1px");
-		horizontalLayout_1.addComponent(textFieldFilter);
-		horizontalLayout_1.setComponentAlignment(textFieldFilter,
-				new Alignment(9));
-		
-		// comboBoxDatatypeFilter
-		comboBoxDatatypeFilter = new ComboBox();
-		comboBoxDatatypeFilter.setCaption("Filter By Data Type");
-		comboBoxDatatypeFilter.setImmediate(false);
-		comboBoxDatatypeFilter.setWidth("-1px");
-		comboBoxDatatypeFilter.setHeight("-1px");
-		horizontalLayout_1.addComponent(comboBoxDatatypeFilter);
-		horizontalLayout_1.setComponentAlignment(comboBoxDatatypeFilter,
-				new Alignment(9));
-		
-		// checkBoxFilterIsBag
-		checkBoxFilterIsBag = new CheckBox();
-		checkBoxFilterIsBag.setCaption("Is Bag Filter");
-		checkBoxFilterIsBag.setImmediate(false);
-		checkBoxFilterIsBag.setWidth("-1px");
-		checkBoxFilterIsBag.setHeight("-1px");
-		horizontalLayout_1.addComponent(checkBoxFilterIsBag);
-		horizontalLayout_1.setComponentAlignment(checkBoxFilterIsBag,
-				new Alignment(9));
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java
deleted file mode 100644
index a9306fa..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeAssignmentExpressionEditorWindow.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeAssignmentExpressionType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Category;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class AttributeAssignmentExpressionEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private Table tableCategories;
-	@AutoGenerated
-	private TextField textFieldIssuer;
-	@AutoGenerated
-	private TextField textFieldAttributeID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final AttributeAssignmentExpressionEditorWindow self = this;
-	private final AttributeAssignmentExpressionType assignment;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeAssignmentExpressionEditorWindow(AttributeAssignmentExpressionType assignment) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.assignment = assignment;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeText();
-		this.initializeTable();
-		this.initializeButton();
-		//
-		// Focus
-		//
-		this.textFieldAttributeID.focus();
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textFieldAttributeID.setNullRepresentation("");
-		if (this.assignment.getAttributeId() == null) {
-			this.textFieldAttributeID.setValue(XacmlAdminUI.getDomain());
-		} else {
-			this.textFieldAttributeID.setValue(this.assignment.getAttributeId());
-		}
-		this.textFieldAttributeID.setRequiredError("You must have an attribute id for the assignment expression.");
-		//
-		//
-		//
-		this.textFieldIssuer.setNullRepresentation("");
-		this.textFieldIssuer.setValue(this.assignment.getIssuer());
-	}
-	
-	protected void initializeTable() {
-		this.tableCategories.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getCategories());
-		this.tableCategories.setVisibleColumns(new Object[] {"xacmlId"});
-		this.tableCategories.setColumnHeaders(new String[] {"XACML ID"});
-		this.tableCategories.setSelectable(true);
-		this.tableCategories.setNullSelectionAllowed(true);
-		this.tableCategories.setPageLength(((XacmlAdminUI) UI.getCurrent()).getCategories().size());
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textFieldAttributeID.commit();
-					self.textFieldIssuer.commit();
-					self.tableCategories.commit();
-					//
-					// Save
-					//
-					self.assignment.setAttributeId(self.textFieldAttributeID.getValue());
-					self.assignment.setIssuer(self.textFieldIssuer.getValue());
-					Object cat = self.tableCategories.getValue();
-					if (cat != null) {
-						EntityItem<Category> entity = ((XacmlAdminUI) UI.getCurrent()).getCategories().getItem(cat);
-						if (entity != null && entity.getEntity() != null) {
-							self.assignment.setCategory(entity.getEntity().getXacmlId());
-						} else {
-							self.assignment.setCategory(null);
-						}
-					} else {
-						self.assignment.setCategory(null);
-					}
-					//
-					// Set ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// close window
-					//
-					self.close();
-				} catch (SourceException e) { //NOPMD
-					//
-					// Vaadin displays error GUI
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public AttributeAssignmentExpressionType getAssignment () {
-		return this.assignment;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldAttributeID
-		textFieldAttributeID = new TextField();
-		textFieldAttributeID.setCaption("Attribute Assignment ID");
-		textFieldAttributeID.setImmediate(false);
-		textFieldAttributeID.setWidth("-1px");
-		textFieldAttributeID.setHeight("-1px");
-		textFieldAttributeID.setInvalidAllowed(false);
-		textFieldAttributeID.setRequired(true);
-		mainLayout.addComponent(textFieldAttributeID);
-		
-		// textFieldIssuer
-		textFieldIssuer = new TextField();
-		textFieldIssuer.setCaption("Issuer (Optional)");
-		textFieldIssuer.setImmediate(false);
-		textFieldIssuer.setWidth("-1px");
-		textFieldIssuer.setHeight("-1px");
-		textFieldIssuer.setNullSettingAllowed(true);
-		mainLayout.addComponent(textFieldIssuer);
-		
-		// tableCategories
-		tableCategories = new Table();
-		tableCategories.setCaption("Category (Optional)");
-		tableCategories.setImmediate(false);
-		tableCategories.setWidth("100.0%");
-		tableCategories.setHeight("-1px");
-		mainLayout.addComponent(tableCategories);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java
deleted file mode 100644
index 62e9c1a..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeEditorWindow.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.ConstraintType;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.view.fields.ConstraintField;
-import org.apache.openaz.xacml.admin.view.fields.DesignatorSelectorField;
-import org.apache.openaz.xacml.api.Identifier;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.fieldgroup.FieldGroup;
-import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
-import com.vaadin.data.fieldgroup.PropertyId;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.data.util.filter.Not;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.shared.ui.combobox.FilteringMode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.FormLayout;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.Window;
-
-public class AttributeEditorWindow extends Window {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(AttributeEditorWindow.class);
-	private AttributeEditorWindow self = this;
-	
-	private boolean isSaved = false;
-	private Attribute attribute;
-	
-	private FormLayout mainLayout = new FormLayout();
-	
-	@PropertyId("isDesignator")
-	DesignatorSelectorField selectDesignator;
-	
-	@PropertyId("selectorPath")
-	TextField selectorPath = new TextField("Attribute Selector Path");
-	
-	@PropertyId("xacmlId")
-	TextField xacmlID = new TextField("XACML ID");
-
-	@PropertyId("categoryBean")
-	ComboBox category = new ComboBox("Category");
-	
-	@PropertyId("description")
-	TextArea descriptionField = new TextArea("Description");
-	
-	@PropertyId("datatypeBean")
-	ComboBox datatype = new ComboBox("DataType");
-	
-	@PropertyId("constraintType")
-	ComboBox constraintTypes = new ComboBox("Constraint Type");
-	
-	@PropertyId("constraintValues")
-	ConstraintField constraintValues;
-	
-	Button saveButton = new Button("Save");
-	
-	FieldGroup fieldGroup = null;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeEditorWindow(EntityItem<Attribute> entityItem) {
-		//
-		// Save our attribute
-		//
-		this.attribute = entityItem.getEntity();
-		if (logger.isDebugEnabled()) {
-			logger.debug("Editing attribute: " + entityItem.getEntity().toString());
-		}
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Create our main layout
-		//
-		this.setContent(mainLayout);
-		//
-		// Finish setting up the main layout
-		//
-		this.mainLayout.setSpacing(true);
-		this.mainLayout.setMargin(true);
-		//
-		// Setup option group, binding the
-		// field group doesn't seem to work.
-		//
-		this.selectDesignator = new DesignatorSelectorField(entityItem);
-		this.selectDesignator.setCaption("Select the Attribute Type");
-		this.selectDesignator.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object value = self.selectDesignator.getValue();
-				if (value == null || ! (value instanceof Character)) {
-					self.selectorPath.setVisible(false);
-				}
-				if (((Character) value) == '1') {
-					self.selectorPath.setVisible(false);
-				} else {
-					self.selectorPath.setVisible(true);
-				}
-			}			
-		});
-		//
-		// Setup selector path
-		//
-		this.selectorPath.setImmediate(true);
-		this.selectorPath.setNullRepresentation("");
-		this.selectorPath.setWidth("100%");
-		//
-		// Setup the Category combo
-		//
-		this.category.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getCategories());
-		this.category.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.category.setItemCaptionPropertyId("xacmlId");
-		this.category.setFilteringMode(FilteringMode.CONTAINS);
-		this.category.setImmediate(true);
-		this.category.setNullSelectionAllowed(false);
-		this.category.setConverter(new SingleSelectConverter<Object>(this.category));
-		//
-		// Setup the Datatype combo
-		//
-		this.datatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes());
-		this.datatype.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.datatype.setItemCaptionPropertyId("xacmlId");
-		this.datatype.setFilteringMode(FilteringMode.CONTAINS);
-		this.datatype.setImmediate(true);
-		this.datatype.setNullSelectionAllowed(false);
-		this.datatype.setConverter(new SingleSelectConverter<Object>(this.datatype));
-		//
-		// Setup the constraint type combo
-		//
-		this.constraintTypes.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getConstraintTypes());
-		this.constraintTypes.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.constraintTypes.setItemCaptionPropertyId("constraintType");
-		this.constraintTypes.setFilteringMode(FilteringMode.CONTAINS);
-		this.constraintTypes.setImmediate(true);
-		this.constraintTypes.setNullSelectionAllowed(true);
-		this.constraintTypes.setConverter(new SingleSelectConverter<Object>(this.constraintTypes));
-		//
-		// Setup the constraint value custom field
-		//
-		this.constraintValues = new ConstraintField(entityItem);
-		//
-		// Finish laying out the main layout
-		//
-		this.mainLayout.addComponent(this.selectDesignator);
-		this.mainLayout.addComponent(this.selectorPath);
-		this.mainLayout.addComponent(this.xacmlID);
-		this.mainLayout.addComponent(this.category);
-		this.mainLayout.addComponent(this.descriptionField);
-		this.mainLayout.addComponent(this.datatype);
-		this.mainLayout.addComponent(this.constraintTypes);
-		this.mainLayout.addComponent(this.constraintValues);
-		//
-		// Now create our field group and bind our bean items
-		// This will populate the components with the attribute's
-		// current value.
-		//
-		this.fieldGroup = new FieldGroup(entityItem);
-		this.fieldGroup.bindMemberFields(this);
-		//
-		// Finishing setting up after the bind. There are some components
-		// where initializing the bind causes some properties to be reset.
-		//
-		this.xacmlID.setWidth("100%");
-		this.descriptionField.setNullRepresentation("");
-		this.descriptionField.setWidth("100%");
-		this.setupDatatype(this.attribute.getDatatypeBean().getIdentifer());
-		this.datatype.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Identifier id = self.getCurrentDatatype();
-				if (id != null) {
-					self.setupDatatype(id);
-				}
-			}			
-		});
-		//
-		// Listen to when constraint type changes
-		//
-		this.constraintTypes.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object value = self.constraintTypes.getValue();
-				if (value == null) {
-					self.constraintValues.resetContent(null, self.getCurrentDatatype());
-				} else {
-					ConstraintType newValue = ((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().getItem(value).getEntity();
-					self.constraintValues.resetContent(newValue, self.getCurrentDatatype());
-				}
-			}
-		});
-		//
-		// Setup our "SAVE" button to commit the fields
-		//
-		this.mainLayout.addComponent(this.saveButton);
-		this.mainLayout.setComponentAlignment(this.saveButton, Alignment.MIDDLE_CENTER);
-		this.saveButton.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// SAVE the latest values
-					//
-					fieldGroup.commit();
-					//
-					// Set that we did save the attribute
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (CommitException e) {
-					logger.error("Failed to commit fields", e);
-				}
-			}
-			
-		});
-		//
-		// Add our close listener so we can discard anything that was changed.
-		//
-		this.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				if (self.isSaved == false) {
-					logger.info("discarding");
-					//
-					// Discard any changes to the existing JPA container entity
-					//
-					self.fieldGroup.discard();
-					//
-					// Make sure there are no filters on the container
-					//
-					((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters();
-				}
-			}
-			
-		});
-		//
-		// Set focus
-		//
-		this.xacmlID.focus();
-	}
-	
-	private void setupDatatype(Identifier datatype) {
-		if (datatype.equals(XACML3.ID_DATATYPE_INTEGER) ||
-				datatype.equals(XACML3.ID_DATATYPE_DOUBLE)) {
-			((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().removeAllContainerFilters();
-			this.constraintTypes.setEnabled(true);
-			this.constraintValues.resetDatatype(datatype);
-			return;
-		}
-		if (datatype.equals(XACML3.ID_DATATYPE_STRING)) {
-			((XacmlAdminUI) UI.getCurrent()).getConstraintTypes().addContainerFilter(new Not(new Compare.Equal("constraintType", ConstraintType.RANGE_TYPE)));
-			if (this.attribute.getConstraintType() != null && 
-					this.attribute.getConstraintType().getConstraintType() != null &&
-					this.attribute.getConstraintType().getConstraintType().equals(ConstraintType.RANGE_TYPE)) {
-				this.attribute.setConstraintType(null);
-			}
-			this.constraintValues.resetDatatype(datatype);
-			return;
-		}
-		//
-		// No constraint for all other datatypes
-		//
-		this.attribute.setConstraintType(null);
-		this.constraintTypes.select(null);
-		this.constraintTypes.setEnabled(false);
-	}
-	
-	private Identifier getCurrentDatatype() {
-		Object id = self.datatype.getValue();
-		if (id != null) {
-			EntityItem<Datatype> dt = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id);
-			if (dt != null) {
-				return dt.getEntity().getIdentifer();
-			}
-		}
-		return null;
-	}
-		
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java
deleted file mode 100644
index b1448bf..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeSelectionWindow.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-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.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.components.AttributeDictionarySelectorComponent;
-import org.apache.openaz.xacml.admin.view.components.AttributeSimpleCreatorComponent;
-import org.apache.openaz.xacml.admin.view.components.AttributeStandardSelectorComponent;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventNotifier;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class AttributeSelectionWindow extends Window implements AttributeChangedEventListener {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayoutAttribute;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private VerticalLayout verticalLayout_2;
-	@AutoGenerated
-	private CheckBox checkBoxMustBePresent;
-	@AutoGenerated
-	private TextField textFieldIssuer;
-	@AutoGenerated
-	private OptionGroup optionGroupAttribute;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(AttributeSelectionWindow.class);
-	private final AttributeSelectionWindow self = this;
-	private final Datatype datatype;
-	private final Attribute defaultAttribute;
-	private AttributeChangedEventNotifier currentComponent = null;
-	private Attribute attribute = null;
-	private boolean isSaved = false;
-	
-	public static final String	ATTRIBUTE_OPTION_DICTIONARY = "Use Attribute From Dictionary";
-	public static final String	ATTRIBUTE_OPTION_STANDARD = "Use A Standard Attribute";
-	public static final String	ATTRIBUTE_OPTION_INPUT = "Input A New Attribute";
-	public static final String[] ATTRIBUTE_OPTIONS = new String[] {ATTRIBUTE_OPTION_DICTIONARY, ATTRIBUTE_OPTION_STANDARD, ATTRIBUTE_OPTION_INPUT};
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeSelectionWindow(Datatype datatype, Object defaultAttribute) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save data
-		//
-		this.datatype = datatype;
-		if (defaultAttribute == null) {
-			this.defaultAttribute = null;
-		} else {
-			//
-			// Given a default attribute
-			//
-			Attribute tempAttribute;
-			if (defaultAttribute instanceof AttributeDesignatorType) {
-				tempAttribute = JPAUtils.createAttribute((AttributeDesignatorType) defaultAttribute);
-			} else if (defaultAttribute instanceof AttributeSelectorType) {
-				tempAttribute = JPAUtils.createAttribute((AttributeSelectorType) defaultAttribute);
-			} else {
-				this.defaultAttribute = null;
-				throw new IllegalArgumentException("Selection window only works with designator or selector objects.");
-			}
-			//
-			// See if the attribute exists in our dictionary
-			//
-			Attribute dictionaryAttribute = JPAUtils.findAttribute(tempAttribute);
-			if (dictionaryAttribute != null) {
-				this.defaultAttribute = dictionaryAttribute;
-			} else {
-				this.defaultAttribute = tempAttribute;
-			}
-		}
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeOption();
-		this.initializeButtons();
-		this.initializeAttribute();
-		//
-		// Setup attribute
-		//
-		this.resetAttributeOption();
-		//
-		// Focus
-		//
-	}
-	
-	protected void initializeOption() {
-		//
-		// Setup datasource and GUI properties
-		//
-		this.optionGroupAttribute.setImmediate(true);
-		this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_DICTIONARY);
-		this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_STANDARD);
-		this.optionGroupAttribute.addItem(ATTRIBUTE_OPTION_INPUT);
-		//
-		// Respond to events
-		//
-		this.optionGroupAttribute.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.resetAttributeOption();
-			}
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit everything??
-					//
-					self.textFieldIssuer.commit();
-					self.checkBoxMustBePresent.commit();
-					self.currentComponent.commit();
-					//
-					// Save to the attribute
-					//
-					String issuer = self.textFieldIssuer.getValue();
-					if (issuer == null || issuer.length() == 0) {
-						self.attribute.setIssuer(null);
-					} else {
-						self.attribute.setIssuer(issuer);
-					}
-					self.attribute.setMustBePresent(self.checkBoxMustBePresent.getValue());
-					//
-					// Mark as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// Vaadin displays the error
-					//
-				}
-			}
-		});
-	}
-		
-	protected void initializeAttribute() {
-		//
-		// Are we editing something?
-		//
-		if (this.defaultAttribute == null) {
-			//
-			// No, this is a new attribute being created
-			//
-			this.optionGroupAttribute.select(ATTRIBUTE_OPTION_STANDARD);
-			return;
-		}
-		//
-		// Yes, is it in our dictionary?
-		//
-		Attribute attribute = JPAUtils.findAttribute(this.defaultAttribute);
-		if (attribute != null) {
-			//
-			// Yes its in our dictionary
-			//
-			this.attribute = attribute;
-			this.optionGroupAttribute.select(ATTRIBUTE_OPTION_DICTIONARY);
-			return;
-		}
-		//
-		// Is it a standard attribute?
-		//
-		attribute = JPAUtils.isStandardAttribute(this.defaultAttribute);
-		if (attribute == null) {
-			//
-			// No, start editing via custom input attribute
-			//
-			this.attribute = this.defaultAttribute;
-			this.optionGroupAttribute.select(ATTRIBUTE_OPTION_INPUT);
-			return;
-		}
-		//
-		// Yes - its a standard attribute
-		//
-		this.attribute = attribute;
-		this.optionGroupAttribute.select(ATTRIBUTE_OPTION_STANDARD);
-	}
-	
-	protected void resetAttributeOption() {
-		//
-		// Remove GUI components from layout
-		//
-		this.horizontalLayoutAttribute.removeAllComponents();
-		this.currentComponent = null;
-		//
-		// Grab our currently selected option value
-		//
-		Object value = self.optionGroupAttribute.getValue();
-		//
-		// What is it set to?
-		//
-		if (value.toString().equals(ATTRIBUTE_OPTION_DICTIONARY)) {
-			this.currentComponent = new AttributeDictionarySelectorComponent(this.datatype, this.defaultAttribute);
-		} else if (value.toString().equals(ATTRIBUTE_OPTION_STANDARD)) {
-			this.currentComponent = new AttributeStandardSelectorComponent(this.datatype, this.defaultAttribute);
-		} else if (value.toString().equals(ATTRIBUTE_OPTION_INPUT)) {
-			this.currentComponent = new AttributeSimpleCreatorComponent(this.datatype, this.defaultAttribute);
-		} else {
-			logger.error("Unknown option" + value);
-			return;
-		}
-		this.currentComponent.addListener(this);
-		this.horizontalLayoutAttribute.addComponent((CustomComponent) this.currentComponent);
-		this.currentComponent.fireAttributeChanged(this.currentComponent.getAttribute());
-	}
-	
-	@Override
-	public void attributeChanged(Attribute attribute) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("attributeChanged: " + attribute);
-		}
-		this.attribute = attribute;
-		if (attribute == null) {
-			this.buttonSave.setEnabled(false);
-		} else {
-			this.buttonSave.setEnabled(true);
-		}
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Attribute	getAttribute() {
-		return this.attribute;
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		// horizontalLayoutAttribute
-		horizontalLayoutAttribute = new HorizontalLayout();
-		horizontalLayoutAttribute.setImmediate(false);
-		horizontalLayoutAttribute.setWidth("-1px");
-		horizontalLayoutAttribute.setHeight("-1px");
-		horizontalLayoutAttribute.setMargin(false);
-		mainLayout.addComponent(horizontalLayoutAttribute);
-		mainLayout.setExpandRatio(horizontalLayoutAttribute, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Select");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		
-		// optionGroupAttribute
-		optionGroupAttribute = new OptionGroup();
-		optionGroupAttribute.setCaption("Attribute Source");
-		optionGroupAttribute.setImmediate(false);
-		optionGroupAttribute.setWidth("-1px");
-		optionGroupAttribute.setHeight("-1px");
-		optionGroupAttribute.setInvalidAllowed(false);
-		horizontalLayout_1.addComponent(optionGroupAttribute);
-		
-		// verticalLayout_2
-		verticalLayout_2 = buildVerticalLayout_2();
-		horizontalLayout_1.addComponent(verticalLayout_2);
-		
-		return horizontalLayout_1;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildVerticalLayout_2() {
-		// common part: create layout
-		verticalLayout_2 = new VerticalLayout();
-		verticalLayout_2.setImmediate(false);
-		verticalLayout_2.setWidth("-1px");
-		verticalLayout_2.setHeight("-1px");
-		verticalLayout_2.setMargin(true);
-		verticalLayout_2.setSpacing(true);
-		
-		// textFieldIssuer
-		textFieldIssuer = new TextField();
-		textFieldIssuer.setCaption("Issuer");
-		textFieldIssuer.setImmediate(false);
-		textFieldIssuer.setWidth("-1px");
-		textFieldIssuer.setHeight("-1px");
-		verticalLayout_2.addComponent(textFieldIssuer);
-		
-		// checkBoxMustBePresent
-		checkBoxMustBePresent = new CheckBox();
-		checkBoxMustBePresent.setCaption("Attribute Must Be Present");
-		checkBoxMustBePresent.setImmediate(false);
-		checkBoxMustBePresent.setWidth("-1px");
-		checkBoxMustBePresent.setHeight("-1px");
-		verticalLayout_2.addComponent(checkBoxMustBePresent);
-		
-		return verticalLayout_2;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java
deleted file mode 100644
index 13ae0b1..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/AttributeValueEditorWindow.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.validators.ValidatorFactory;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.shared.ui.combobox.FilteringMode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class AttributeValueEditorWindow extends Window {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldValue;
-	@AutoGenerated
-	private ComboBox comboBoxDatatype;
-	private static final long serialVersionUID = 1L;
-	private final AttributeValueEditorWindow self = this;
-	private final Datatype datatypeRestriction;
-	private final AttributeValueType value;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public AttributeValueEditorWindow(AttributeValueType value, Datatype datatypeRestriction) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.value = value;
-		this.datatypeRestriction = datatypeRestriction;
-		//
-		// Make sure the value has the same datatype as the restriction
-		//
-		if (this.datatypeRestriction != null) {
-			this.value.setDataType(this.datatypeRestriction.getXacmlId());
-		}
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeCombo();
-		this.initializeTextField();
-		this.initializeButtons();
-		//
-		// Focus?
-		//
-		if (this.datatypeRestriction == null) {
-			this.comboBoxDatatype.focus();
-		} else {
-			this.textFieldValue.focus();
-		}
-	}
-	
-	protected void initializeCombo() {
-		this.comboBoxDatatype.setContainerDataSource(((XacmlAdminUI) UI.getCurrent()).getDatatypes());
-		this.comboBoxDatatype.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboBoxDatatype.setItemCaptionPropertyId("xacmlId");
-		this.comboBoxDatatype.setFilteringMode(FilteringMode.CONTAINS);
-		this.comboBoxDatatype.setImmediate(true);
-		this.comboBoxDatatype.setNullSelectionAllowed(false);
-		this.comboBoxDatatype.setConverter(new SingleSelectConverter<Object>(this.comboBoxDatatype));
-		//
-		// Select a value if its defined
-		//
-		if (this.datatypeRestriction != null) {
-			this.comboBoxDatatype.select(this.datatypeRestriction.getId());
-		} else if (this.value.getDataType() != null) {
-			this.comboBoxDatatype.select(JPAUtils.findDatatype(this.value.getDataType()).getId());
-		}
-		//
-		// Can the user change the datatype?
-		//
-		if (this.datatypeRestriction != null) {
-			this.comboBoxDatatype.setEnabled(false);
-			return;
-		}
-		//
-		// Listen to events
-		//
-		this.comboBoxDatatype.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object id = self.comboBoxDatatype.getValue();
-				assert id != null;
-				//
-				// Get the entity and save it
-				//
-				EntityItem<Datatype> entity = ((XacmlAdminUI) UI.getCurrent()).getDatatypes().getItem(id);
-				self.value.setDataType(entity.getEntity().getXacmlId());
-				//
-				// Reset the validator
-				//
-				self.textFieldValue.removeAllValidators();
-				Validator validator = ValidatorFactory.newInstance(entity.getEntity());
-				if (validator != null) {
-					self.textFieldValue.addValidator(validator);
-				}
-			}
-		});
-	}
-	
-	protected void initializeTextField() {
-		//
-		// GUI properties
-		//
-		this.textFieldValue.setImmediate(true);
-		this.textFieldValue.setNullRepresentation("");
-		//
-		// Setup validator
-		//
-		if (this.datatypeRestriction != null) {
-			Validator validator = ValidatorFactory.newInstance(this.datatypeRestriction);
-			if (validator != null) {
-				this.textFieldValue.addValidator(validator);
-			}
-		}
-		//
-		// Text change or Value Change?
-		//
-		this.textFieldValue.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Save the new value. TODO - assuming position 0 of content list.
-				//
-				self.saveValue(0, self.textFieldValue.getValue());
-				//
-				// Setup the save button
-				//
-				if (self.textFieldValue.getValue() == null || self.textFieldValue.getValue().isEmpty()) {
-					self.buttonSave.setEnabled(false);
-				} else {
-					self.buttonSave.setEnabled(true);
-				}
-			}
-		});
-		//
-		// Initialize the value
-		//
-		if (this.value != null && this.value.getContent().isEmpty() == false) {
-			//
-			// TODO - If there are multiple Content objects...Right now we work with the first one only.
-			//
-			this.textFieldValue.setValue(this.value.getContent().get(0).toString());
-		}
-	}
-	
-	protected void saveValue(int i, String value) {
-		//
-		// Get the content - TODO
-		//
-		if (this.value.getContent().isEmpty()) {
-			this.value.getContent().add(value);
-			return;
-		}
-		Object o = this.value.getContent().get(i);
-		if (o == null) {
-			//
-			// Add it into the list - ensure its a
-			//
-			assert this.value.getContent().size() == i;
-			this.value.getContent().add(value);
-		} else {
-			//
-			// Overwrite the previous object
-			//
-			this.value.getContent().set(i, value);
-		}
-	}
-
-	protected void initializeButtons() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Make sure it validates (i.e. call the Validators)
-					//
-					self.comboBoxDatatype.validate();
-					self.textFieldValue.validate();
-					//
-					// Yes
-					//
-					self.isSaved = true;
-					//
-					// Close
-					//
-					self.close();
-				} catch (InvalidValueException e) { //NOPMD
-					//
-					// Vaadin with update GUI displaying the error
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public String	getValue() {
-		return this.textFieldValue.getValue();
-	}
-	
-	public AttributeValueType	getAttribute() {
-		return this.value;
-	}
-	
-	public Datatype getDatatype() {
-		return JPAUtils.findDatatype(this.value.getDataType());
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// comboBoxDatatype
-		comboBoxDatatype = new ComboBox();
-		comboBoxDatatype.setCaption("Select Datatype");
-		comboBoxDatatype.setImmediate(false);
-		comboBoxDatatype.setWidth("-1px");
-		comboBoxDatatype.setHeight("-1px");
-		comboBoxDatatype.setInvalidAllowed(false);
-		comboBoxDatatype.setRequired(true);
-		mainLayout.addComponent(comboBoxDatatype);
-		
-		// textFieldValue
-		textFieldValue = new TextField();
-		textFieldValue.setCaption("Attribute Value");
-		textFieldValue.setImmediate(false);
-		textFieldValue.setWidth("100.0%");
-		textFieldValue.setHeight("-1px");
-		textFieldValue.setInvalidAllowed(false);
-		textFieldValue.setRequired(true);
-		mainLayout.addComponent(textFieldValue);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java
deleted file mode 100644
index b961a78..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ColumnSelectionWindow.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.IntegerRangeValidator;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-// import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ColumnSelectionWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldColumn;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private boolean isSaved = false;
-	private ColumnSelectionWindow self = this;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ColumnSelectionWindow(Integer value) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// Set the value
-		//
-		if (value != null) {
-			this.textFieldColumn.setValue(value.toString());
-		} else {
-			this.textFieldColumn.setValue(Integer.toString(0));
-		}
-		//
-		// Shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		//
-		// Focus
-		//
-		this.textFieldColumn.focus();
-	}
-	
-	protected void initialize() {
-		this.initializeText();
-		this.initializeButton();
-	}
-
-	protected void initializeText() {
-		//
-		// Add a validator
-		//
-		this.textFieldColumn.addValidator(new IntegerRangeValidator("Please enter an integer greater than or equal to 0.", 0, null));
-		//
-		// Respond to text changing to setup the button
-		//
-		this.textFieldColumn.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() != null && event.getText().isEmpty() == false) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}
-		});
-	}
-	
-	protected void initializeButton() {
-		self.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textFieldColumn.commit();
-					//
-					// If we get here, the value is valid.
-					// Mark ourselves as saved and close the window
-					//
-					self.isSaved = true;
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// Vaadin will display error
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Integer getColumn() {
-		try {
-			return Integer.parseInt(this.textFieldColumn.getValue());
-		} catch (NumberFormatException e) {
-			return null;
-		}
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldColumn
-		textFieldColumn = new TextField();
-		textFieldColumn.setCaption("Column");
-		textFieldColumn.setImmediate(false);
-		textFieldColumn.setDescription("0-based index into CSV line");
-		textFieldColumn.setWidth("-1px");
-		textFieldColumn.setHeight("-1px");
-		textFieldColumn.setRequired(true);
-		textFieldColumn.setInputPrompt("Eg. ‘0'");
-		mainLayout.addComponent(textFieldColumn);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java
deleted file mode 100644
index 468634c..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPGroupWindow.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.openaz.xacml.admin.model.PDPPIPContainer;
-import org.apache.openaz.xacml.admin.model.PDPPolicyContainer;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.api.pap.PAPEngine;
-import org.apache.openaz.xacml.api.pap.PAPException;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import org.apache.openaz.xacml.std.pap.StdPDPGroup;
-import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Validator;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class EditPDPGroupWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private Table tablePIP;
-	@AutoGenerated
-	private Table tablePolicies;
-	@AutoGenerated
-	private TextArea textDescription;
-	@AutoGenerated
-	private TextField textName;
-	
-	
-	private static final Action ADD_POLICY = 		new Action ("Add New Policy");
-	private static final Action REMOVE_POLICY = 	new Action ("Remove Policy");
-	private static final Action MAKE_ROOT = 		new Action ("Make Root");
-	private static final Action MAKE_REFERENCED = 	new Action ("Make Referenced");
-	
-	private static final Action EDIT_CONFIG = 		new Action("Edit Configurations");
-
-	//
-	// ?? Why is this static?
-	//
-	private static PDPPolicyContainer policyContainer;
-	private PDPPIPContainer pipContainer;
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final EditPDPGroupWindow self = this;
-	private final StdPDPGroup group;
-	private boolean isSaved = false;
-	
-	// this is the version that contains all of the edits made by the user.
-	// it may be a copy of the original object (edited) or a new one.
-	private StdPDPGroup updatedObject;
-	
-	private PAPEngine papEngine;
-	private List<PDPGroup> groups;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public EditPDPGroupWindow(StdPDPGroup group, List<PDPGroup> list, PAPEngine engine) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save pointers
-		//
-		this.group = group;
-		this.groups = list;
-		this.papEngine = engine;
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// Shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		//
-		// Focus
-		//
-		this.textName.focus();
-	}
-	
-	protected void initialize() {
-		this.initializeText();
-		this.initializeButton();
-		this.initializeTables();
-	}
-	
-	protected void initializeText() {
-		this.textName.setNullRepresentation("");
-		this.textDescription.setNullRepresentation("");
-		if (this.group != null) {
-			this.textName.setValue(this.group.getName());
-			this.textDescription.setValue(this.group.getDescription());
-		}
-		//
-		// Validation
-		//
-		this.textName.addValidator(new Validator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void validate(Object value) throws InvalidValueException {
-				assert value instanceof String;
-				if (value == null) {
-					throw new InvalidValueException("The name cannot be blank.");
-				}
-				// Group names must be unique so that user can distinguish between them (and we can create unique IDs from them)
-				for (PDPGroup g : self.groups) {
-					if (group != null && g.getId().equals(group.getId())) {
-						// ignore this group - we may or may not be changing the name
-						continue;
-					}
-					if (g.getName().equals(value.toString())) {
-						throw new InvalidValueException("Name must be unique");
-					}
-				}
-			}
-		});
-		this.textName.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() == null || event.getText().isEmpty()) {
-					self.buttonSave.setEnabled(false);
-				} else {
-					self.buttonSave.setEnabled(true);
-				}
-			}
-		});
-	}
-	
-	protected void initializeTables() {
-		this.initializePolicyTable();
-		this.initializePIPTable();
-	}
-	
-	protected void initializePolicyTable() {
-		if (this.group == null) {
-			this.tablePolicies.setVisible(false);
-			return;
-		}
-		//
-		// GUI properties
-		//
-		EditPDPGroupWindow.policyContainer = new PDPPolicyContainer(group);
-		this.tablePolicies.setContainerDataSource(EditPDPGroupWindow.policyContainer);
-		this.tablePolicies.setVisibleColumns("Root", "Name", "Version", "Id");//, "Description");
-		this.tablePolicies.setPageLength(EditPDPGroupWindow.policyContainer.size() + 1);
-		this.tablePolicies.setSelectable(true);
-		this.tablePolicies.setSizeFull();
-		/*
-		 * Not in this release.
-		 * 
-		this.tablePolicies.setColumnCollapsingAllowed(true);
-		this.tablePolicies.setColumnCollapsed("Description", true);
-		//
-		// Generated columns
-		//
-		this.tablePolicies.addGeneratedColumn("Description", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				TextArea area = new TextArea();
-				if (itemId != null && itemId instanceof PDPPolicy) {
-					area.setValue(((PDPPolicy)itemId).getDescription());
-				}
-				area.setNullRepresentation("");
-				area.setWidth("100.0%");
-				return area;
-			}
-		});
-		*/
-		//
-		// Actions
-		//
-		this.tablePolicies.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					return new Action[] {ADD_POLICY};
-				}
-				return new Action[] {ADD_POLICY, REMOVE_POLICY, MAKE_ROOT, MAKE_REFERENCED};
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == ADD_POLICY) {
-
-					final SelectWorkspacePoliciesWindow policiesWindow = new SelectWorkspacePoliciesWindow();
-					policiesWindow.setCaption("Select Policy to Add");
-					policiesWindow.setModal(true);
-					policiesWindow.addCloseListener(new CloseListener() {
-						private static final long serialVersionUID = 1L;
-					
-						@Override
-						public void windowClose(CloseEvent event) {
-							//
-							// Did the user hit save?
-							//
-							if (policiesWindow.isSaved() == false) {
-								return;
-							}
-							//
-							// Get the selected policy
-							//
-							StdPDPPolicy selectedPolicy = policiesWindow.getSelectedPolicy();
-							if (selectedPolicy != null) {
-
-								// do not allow multiple copies of same policy
-								for (Object existingPolicy : EditPDPGroupWindow.policyContainer.getItemIds()) {
-									if (selectedPolicy.getId().equals(((PDPPolicy)existingPolicy).getId())) {
-										AdminNotification.warn("Cannot re-add Policy with the same ID (i.e. same Name, source Sub-Domain and Version)");
-										return;
-									}
-								}
-								// copy policy to PAP
-								try {
-									papEngine.copyPolicy(selectedPolicy, self.group);
-								} catch (PAPException e) {
-									AdminNotification.warn("Unable to copy Policy '" + selectedPolicy.getPolicyId() + "' to PAP: " + e.getMessage());
-									return;
-								}
-								
-								// add Policy to group
-								EditPDPGroupWindow.policyContainer.addItem(selectedPolicy);
-								self.markAsDirtyRecursive();								
-							}
-						}
-					});
-					policiesWindow.center();
-					UI.getCurrent().addWindow(policiesWindow);
-					return;
-				}
-				if (action == REMOVE_POLICY) {
-					assert target != null;
-					PDPPolicy policy = (PDPPolicy)target;
-					EditPDPGroupWindow.policyContainer.removeItem(policy);
-					self.markAsDirtyRecursive();
-					return;
-				}
-				if (action == MAKE_ROOT) {
-					assert target != null;
-					assert target instanceof StdPDPPolicy;
-					StdPDPPolicy policy = (StdPDPPolicy)target;
-					EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(true);
-					self.markAsDirtyRecursive();
-					return;
-				}
-				if (action == MAKE_REFERENCED) {
-					assert target != null;
-					assert target instanceof StdPDPPolicy;
-					StdPDPPolicy policy = (StdPDPPolicy)target;
-					EditPDPGroupWindow.policyContainer.getItem(policy).getItemProperty("Root").setValue(false);
-					self.markAsDirtyRecursive();
-					return;
-				}
-				
-				AdminNotification.error("Unrecognized action '" + action + "' on target '" + target + "'");
-			}
-		});
-	}
-	
-	protected void initializePIPTable() {
-		if (this.group == null) {
-			this.tablePIP.setVisible(false);
-			return;
-		}
-		//
-		// Setup data source and GUI properties
-		//
-		this.pipContainer = new PDPPIPContainer(group);
-		this.tablePIP.setContainerDataSource(this.pipContainer);
-		this.tablePIP.setPageLength(this.pipContainer.size() + 2);
-		this.tablePIP.setSelectable(true);
-		this.tablePIP.setSizeFull();
-		//
-		// Add the action handler
-		//
-		this.tablePIP.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				return new Action[] {EDIT_CONFIG};
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == EDIT_CONFIG) {
-					self.editPIPConfiguration();
-					return;
-				}
-			}
-		});
-	}
-
-	protected void editPIPConfiguration() {
-		final SelectPIPConfigurationWindow window = new SelectPIPConfigurationWindow(this.group);
-		window.setCaption("Select PIP Configurations");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save button?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Yes - save the PIP configuration
-				//
-				Set<PDPPIPConfig> configs = window.getSelectedConfigs();
-				assert configs != null;
-				self.group.setPipConfigs(configs);
-				//
-				// Update the container
-				//
-				self.pipContainer.refresh();
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Validate
-					//
-					self.textName.commit();
-					//
-					// All good save everything
-					//
-					self.doSave();
-					//
-					// mark ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (InvalidValueException e) { //NOPMD
-					//
-					// Ignore, Vaadin will display our message
-					//
-				}
-			}
-		});
-	}
-	
-	protected void doSave() {
-		if (this.group == null) {
-			return;
-		}
-		StdPDPGroup updatedGroupObject = new StdPDPGroup(
-				this.group.getId(), 
-				this.group.isDefaultGroup(), 
-				this.textName.getValue(), 
-				this.textDescription.getValue(), 
-				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>) EditPDPGroupWindow.policyContainer.getItemIds());
-		updatedGroupObject.setPolicies(changedPolicies);
-		updatedGroupObject.setPdps(this.group.getPdps());
-		// replace the original set of PIP Configs with the set from the container
-//TODO - get PIP Configs from a container used to support editing
-//			selfPDPObject.getPipConfigs().clear();
-//			selfPDPObject.getPipConfigs().addAll(containerGroup.getPipConfigs());
-		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 isSaved() {
-		return this.isSaved;
-	}
-	
-	public String getGroupName() {
-		return this.textName.getValue();
-	}
-	
-	public String getGroupDescription() {
-		return this.textDescription.getValue();
-	}
-	
-	public PDPGroup getUpdatedObject() {
-		return this.updatedObject;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100.0%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textName
-		textName = new TextField();
-		textName.setCaption("Group Name");
-		textName.setImmediate(false);
-		textName.setWidth("-1px");
-		textName.setHeight("-1px");
-		textName.setRequired(true);
-		mainLayout.addComponent(textName);
-		
-		// textDescription
-		textDescription = new TextArea();
-		textDescription.setCaption("Group Description");
-		textDescription.setImmediate(false);
-		textDescription.setWidth("100.0%");
-		textDescription.setHeight("-1px");
-		textDescription.setNullSettingAllowed(true);
-		mainLayout.addComponent(textDescription);
-		mainLayout.setExpandRatio(textDescription, 1.0f);
-		
-		// tablePolicies
-		tablePolicies = new Table();
-		tablePolicies.setCaption("Policies");
-		tablePolicies.setImmediate(false);
-		tablePolicies.setWidth("-1px");
-		tablePolicies.setHeight("-1px");
-		mainLayout.addComponent(tablePolicies);
-		mainLayout.setExpandRatio(tablePolicies, 1.0f);
-		
-		// tablePIP
-		tablePIP = new Table();
-		tablePIP.setCaption("PIP Configurations");
-		tablePIP.setImmediate(false);
-		tablePIP.setWidth("-1px");
-		tablePIP.setHeight("-1px");
-		mainLayout.addComponent(tablePIP);
-		mainLayout.setExpandRatio(tablePIP, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java
deleted file mode 100644
index d2c40e9..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/EditPDPWindow.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.api.pap.PDP;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.RegexpValidator;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-import elemental.events.KeyboardEvent.KeyCode;
-
-public class EditPDPWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextArea textDescription;
-	@AutoGenerated
-	private TextField textName;
-	@AutoGenerated
-	private TextField textId;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final EditPDPWindow self = this;
-	private final PDP pdp;
-	private final List<PDPGroup> groups;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param pdp 
-	 */
-	public EditPDPWindow(PDP pdp, List<PDPGroup> list) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save data
-		//
-		this.pdp = pdp;
-		this.groups = list;
-		//
-		// Initialize
-		//
-		this.initializeText();
-		this.initializeButton();
-		//
-		// Keyboard short
-		//
-		this.setCloseShortcut(KeyCode.ESC);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		//
-		//  Focus
-		//
-		this.textId.focus();
-	}
-	
-	protected void initializeText() {
-		//
-		// Initialize values
-		//
-		if (this.pdp != null) {
-			this.textId.setValue(this.pdp.getId());
-			this.textName.setValue(this.pdp.getName());
-			this.textDescription.setValue(this.pdp.getDescription());
-		}
-		//
-		//
-		//
-		this.textId.setRequiredError("You must enter a valid id for the PDP.");
-		this.textId.setNullRepresentation("");
-		this.textId.addValidator(new RegexpValidator("[\\w=,]", false, "Please enter a valid URL with no whitespace or \"=\" or \",\" characters."));
-		this.textId.addValidator(new Validator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void validate(Object value) throws InvalidValueException {
-				//
-				// Cannot be null
-				//
-				if (value == null || value.toString().length() == 0) {
-					throw new InvalidValueException("ID cannot be null.");
-				}
-				//
-				// Make sure its a valid URL
-				//
-				try {
-					new URL(value.toString());
-				} catch (MalformedURLException e) {
-					throw new InvalidValueException("The PDP URL '" + value.toString() + "' is not a valid URL: '" + e.getMessage() +"'");
-				}
-			}
-		});
-		//
-		//
-		//
-		this.textName.setNullRepresentation("");
-		this.textName.addValidator(new Validator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void validate(Object value) throws InvalidValueException {
-				//
-				// If the value is null, set it to the id
-				//
-				if (value == null || value.toString().length() == 0) {
-					return;
-				}
-			}
-		});
-		//
-		//
-		//
-		this.textDescription.setNullRepresentation("");
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Do a commit
-					//
-					self.textName.commit();
-					self.textId.commit();
-					self.textDescription.commit();
-					//
-					// Should be a string, but to be safe
-					//
-					String id = self.textId.getValue();
-					String name = self.textName.getValue();
-					if (name == null || name.isEmpty()) {
-						self.textName.setValue(id);
-						name = id;
-					}
-					//
-					// ID must be unique.
-					// Also the Name must be unique AND not match any existing IDs
-					// because user uses the NAME to identify this PDP on the browser window, not the ID.
-					//
-					for (PDPGroup g : self.groups) {
-						for (PDP p : g.getPdps()) {
-							if (p.getId().equals(id)) {
-								if (self.pdp != null) {
-									//
-									// we are editing this pdp
-									//
-									continue;
-								}
-								throw new InvalidValueException("URL must be unique - the PDP '" + id + "' already exists in group '" + g.getName() + "'");
-							}
-							if (id.equals(p.getName())) {
-								throw new InvalidValueException("A previous PDP with URL '" + p.getId() + "' has been given the name '" + id + 
-										"'.  Please edit that PDP to change the name before creating a nwe PDP with this URL.");
-							}
-							if (name != null && name.length() > 0 && self.pdp == null && (p.getId().equals(name) || name.equals(p.getName()))) {
-								throw new InvalidValueException("Name must not be the same as another PDP's name OR another PDP's URL.");
-							}
-						}
-					}
-					//
-					// make sure name is NOT a URL, unless it is identical to the ID.
-					// (If it is a URL, then a later PDP might be created with that URL as it's ID, which would be confusing.)
-					//
-					if ( ! id.equals(name)) {
-						try {
-							new URL(name);
-							// if we get here the name is a URL but not identical to the id, which is not good
-							AdminNotification.warn("The Name must not be a URL unless it is the same as the PDP URL");
-							return;
-						} catch (Exception e) { //NOPMD
-							// ignore - we want to get here
-						}
-					}
-					//
-					// If we get here the inputs are ok
-					//
-					self.isSaved = true;
-					//
-					//
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e1) { //NOPMD
-					//
-					// Vaadin will display error
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public String getPDPId() {
-		return this.textId.getValue();
-	}
-	
-	public String getPDPName() {
-		return this.textName.getValue();
-	}
-	
-	public String getPDPDescription() {
-		return this.textDescription.getValue();
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textId
-		textId = new TextField();
-		textId.setCaption("PDP URL");
-		textId.setImmediate(false);
-		textId.setDescription("The URL is the ID of the PDP");
-		textId.setWidth("-1px");
-		textId.setHeight("-1px");
-		textId.setRequired(true);
-		textId.setInputPrompt("Eg. http://localhost:8080/pdp");
-		mainLayout.addComponent(textId);
-		
-		// textName
-		textName = new TextField();
-		textName.setCaption("PDP Name");
-		textName.setImmediate(false);
-		textName.setWidth("-1px");
-		textName.setHeight("-1px");
-		mainLayout.addComponent(textName);
-		
-		// textDescription
-		textDescription = new TextArea();
-		textDescription.setCaption("PDP Description");
-		textDescription.setImmediate(false);
-		textDescription.setWidth("100.0%");
-		textDescription.setHeight("-1px");
-		textDescription.setNullSettingAllowed(true);
-		mainLayout.addComponent(textDescription);
-		mainLayout.setExpandRatio(textDescription, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java
deleted file mode 100644
index b231d70..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionBuilderComponent.java
+++ /dev/null
@@ -1,1078 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Map;
-
-import javax.xml.bind.JAXBElement;
-
-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.AttributeSelectorType;
-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.FunctionType;
-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.VariableDefinitionType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableReferenceType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.jpa.FunctionArgument;
-import org.apache.openaz.xacml.admin.jpa.FunctionDefinition;
-import org.apache.openaz.xacml.admin.model.ExpressionContainer;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.util.XACMLFunctionValidator;
-import org.apache.openaz.xacml.admin.view.events.ApplyParametersChangedListener;
-import org.apache.openaz.xacml.util.XACMLObjectCopy;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Container.ItemSetChangeEvent;
-import com.vaadin.data.Container.ItemSetChangeListener;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.TreeTable;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ExpressionBuilderComponent extends Window implements ApplyParametersChangedListener {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TreeTable treeExpressions;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private CheckBox checkBoxShortName;
-	@AutoGenerated
-	private Button buttonClearAll;
-	@AutoGenerated
-	private Button buttonDeleteExpression;
-	@AutoGenerated
-	private Button buttonAddExpression;
-	/*
-	 * 
-	 * 
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(ExpressionBuilderComponent.class);
-	
-	private static final Action ADD_EXPRESSION = 	new Action ("Add Expression");
-	private static final Action EDIT_EXPRESSION = 	new Action ("Edit Expression");
-	private static final Action DELETE_EXPRESSION = new Action ("Delete Expression");
-	private static final Action ADD_ARGUMENT = 	new Action ("Add Argument");
-	private static final Action EDIT_ARGUMENT = 	new Action ("Edit Argument");
-	private static final Action DELETE_ARGUMENT = new Action ("Delete Argument");
-	
-	private final Object[] visibleColumns = new Object[] {ExpressionContainer.PROPERTY_NAME, ExpressionContainer.PROPERTY_ID, ExpressionContainer.PROPERTY_ID_SHORT, ExpressionContainer.PROPERTY_DATATYPE, ExpressionContainer.PROPERTY_DATATYPE_SHORT};
-	private final String[] columnHeaders = new String[] {"Name", "XCAML ID or Value", "XCAML ID or Value", "Data Type ID", "Data Type ID"};
-	
-	private final ExpressionBuilderComponent self = this;
-	private final Object parent;
-	private final Map<VariableDefinitionType, PolicyType> variables;
-	private final ExpressionContainer container;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ExpressionBuilderComponent(Object parent, Object root, FunctionArgument argument, Map<VariableDefinitionType, PolicyType> variables) {
-		buildMainLayout();
-//		setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save our data
-		//
-		this.parent = parent;
-		this.variables = variables;
-		this.container = new ExpressionContainer(parent, root, argument);
-		//
-		// Make sure we support the parent object
-		//
-		if (this.isSupported() == false) {
-			throw new IllegalArgumentException("Unsupported object type");
-		}
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Finish our GUI initialization
-		//
-		this.initializeTree();
-		this.initializeButtons();
-		this.initializeCheckbox();
-		//
-		// Setup the buttons
-		//
-		this.setupButtons();
-	}
-	
-	private boolean isSupported() {
-		return this.isParentACondition() ||
-					this.isParentAVariable() ||
-					this.isParentAAssignment();
-	}
-	
-	private boolean	isParentACondition() {
-		return this.parent instanceof ConditionType;
-	}
-	
-	private boolean isParentAVariable() {
-		return this.parent instanceof VariableDefinitionType;
-	}
-	
-	private boolean isParentAAssignment() {
-		return this.parent instanceof AttributeAssignmentExpressionType;
-	}
-	
-	private void initializeTree() {
-		//
-		// Initialize GUI properties
-		//
-		this.treeExpressions.setImmediate(true);
-		this.treeExpressions.setSelectable(true);
-		//
-		// Initialize the data source
-		//
-		this.treeExpressions.setContainerDataSource(this.container);
-		this.treeExpressions.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.treeExpressions.setVisibleColumns(this.visibleColumns);
-		this.treeExpressions.setColumnHeaders(this.columnHeaders);
-		this.treeExpressions.setColumnCollapsingAllowed(true);
-		this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, true);
-		this.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, true);
-		//
-		// Add our action handler
-		//
-		this.treeExpressions.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					if (self.container.size() == 0) {
-						return new Action[] {ADD_EXPRESSION};
-					}
-					return null;
-				}
-				if (target instanceof ApplyType && XACMLFunctionValidator.canHaveMoreArguments((ApplyType) target)) {
-					return new Action[] {ADD_ARGUMENT, EDIT_EXPRESSION, DELETE_EXPRESSION};
-				}
-				return new Action[] {EDIT_ARGUMENT, DELETE_ARGUMENT};
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == ADD_EXPRESSION && target == null) {
-					self.addExpression(null, null);
-				}
-				if (action == EDIT_EXPRESSION && target != null) {
-					self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
-				}
-				if (action == DELETE_EXPRESSION && target != null) {
-					self.deleteExpression(target);
-				}
-				if (action == ADD_ARGUMENT && target != null && target instanceof ApplyType) {
-					self.addArgument((ApplyType) target);
-				}
-				if (action == EDIT_ARGUMENT && target != null) {
-					self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
-				}
-				if (action == DELETE_ARGUMENT && target != null) {
-					self.deleteExpression(target);
-				}
-			}
-		});
-		//
-		// Listen to double-click item selections
-		//
-		this.treeExpressions.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					Object target = event.getItemId();//self.treeExpressions.getValue();
-					if (target == null) {
-						return;
-					}
-					self.editExpression(target, (ApplyType) self.container.getParent(target), (FunctionArgument) self.container.getArgument(target));
-				}
-			}
-		});
-		//
-		// Listen when the user selects a row
-		//
-		this.treeExpressions.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupButtons();
-			}			
-		});
-		//
-		// Listen to when the table contents change
-		//
-		this.treeExpressions.addItemSetChangeListener(new ItemSetChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void containerItemSetChange(ItemSetChangeEvent event) {
-				self.validateExpression();
-			}
-		});
-		//
-		// Expand columns automatically
-		//
-		this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_NAME, 1.0f);
-		this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_ID, 1.0f);
-		this.treeExpressions.setColumnExpandRatio(ExpressionContainer.PROPERTY_DATATYPE, 1.0f);
-		//
-		// Expand all the children
-		//
-		for (Object id : this.treeExpressions.getItemIds()) {
-			this.treeExpressions.setCollapsed(id, false);
-		}
-		//
-		// Have a description generator
-		//
-		this.treeExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public String generateDescription(Component source, Object itemId, Object propertyId) {
-				if (propertyId != null && propertyId.equals(ExpressionContainer.PROPERTY_NAME) && itemId instanceof ApplyType) {
-					return ((ApplyType) itemId).getDescription();
-				}
-				return null;
-			}
-		});
-	}
-	
-	private void initializeButtons() {
-		this.buttonClearAll.setImmediate(true);
-		this.buttonClearAll.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.clearAllExpressions();
-			}
-			
-		});
-		
-		this.buttonAddExpression.setImmediate(true);
-		this.buttonAddExpression.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object selected = self.treeExpressions.getValue();
-				if (selected == null) {
-					//
-					// Adding a root expression
-					//
-					self.addExpression(null, null);
-				} else {
-					//
-					// Adding an argument
-					//
-					if (selected instanceof ApplyType) {
-						//
-						// Get the function
-						//
-						self.addArgument((ApplyType) selected);
-					}
-				}
-			}			
-		});
-		
-		this.buttonDeleteExpression.setImmediate(true);
-		this.buttonDeleteExpression.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object id = self.treeExpressions.getValue();
-				if (id == null) {
-					logger.error("Delete button clicked on null selection");
-					return;
-				}
-				self.deleteExpression(id);
-			}
-			
-		});
-		
-		this.buttonSave.setImmediate(true);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.setEnabled(false);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// TODO validate
-				//
-				//
-				// Mark that we are saved
-				//
-				self.isSaved = true;
-				//
-				// Close the window
-				//
-				self.close();
-			}
-		});		
-	}
-	
-	protected void initializeCheckbox() {
-		this.checkBoxShortName.setValue(true);
-		this.checkBoxShortName.setImmediate(true);
-		this.checkBoxShortName.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID, self.checkBoxShortName.getValue());
-				self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE, self.checkBoxShortName.getValue());
-				self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_ID_SHORT, ! self.checkBoxShortName.getValue());
-				self.treeExpressions.setColumnCollapsed(ExpressionContainer.PROPERTY_DATATYPE_SHORT, ! self.checkBoxShortName.getValue());
-			}
-		});
-	}
-	
-	protected void setupButtons() {
-		if (this.treeExpressions.size() == 0) {
-			this.buttonAddExpression.setEnabled(true);
-			this.buttonClearAll.setEnabled(false);
-			this.buttonSave.setEnabled(false);
-		} else {
-			this.validateExpression();
-			this.buttonAddExpression.setEnabled(false);
-			this.buttonClearAll.setEnabled(true);
-		}
-		Object value = this.treeExpressions.getValue();
-		if (value == null) {
-			this.buttonDeleteExpression.setEnabled(false);
-		} else {
-			this.buttonDeleteExpression.setEnabled(true);
-		}
-	}
-	
-	protected void validateExpression() {
-		boolean valid = false;
-		boolean canHaveMore = false;
-		if (this.isParentACondition()) {
-			valid = XACMLFunctionValidator.validateCondition((ConditionType) this.parent);
-			canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((ConditionType) this.parent);
-		} else if (this.isParentAVariable()) {
-			valid = XACMLFunctionValidator.validateVariable((VariableDefinitionType) this.parent);
-			canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((VariableDefinitionType) this.parent);
-		} else if (this.isParentAAssignment()) {
-			valid = XACMLFunctionValidator.validateAssignment((AttributeAssignmentExpressionType)this.parent);
-			canHaveMore = XACMLFunctionValidator.canHaveMoreArguments((AttributeAssignmentExpressionType) this.parent);
-		}
-		if (logger.isDebugEnabled()) {
-			logger.debug("valid: " + valid + " canHaveMore: " + canHaveMore);
-		}
-//		this.buttonAddExpression.setEnabled(canHaveMore);
-		this.buttonSave.setEnabled(valid);
-	}
-	
-	protected void addArgument(final ApplyType parentApply) {
-		//
-		// Get the function
-		//
-		FunctionDefinition function = JPAUtils.findFunction(parentApply.getFunctionId());
-		if (function != null) {
-			FunctionArgument argument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size() + 1, function);
-			if (logger.isDebugEnabled()) {
-				logger.debug("Add Argument: " + argument);
-			}
-			assert argument != null;
-			//
-			// Is this a high order bag function? And it's data type not defined? (most likely)
-			//
-			if (function.isHigherOrder() && argument.getDatatypeBean() == null) {
-				if (logger.isDebugEnabled()) {
-					logger.debug("isHighOrder and a null datatype bean");
-				}
-				//
-				// Get what the data type restriction should be
-				//
-				try {
-					assert parentApply.getExpression().size() > 0;
-					JAXBElement<?> element = parentApply.getExpression().get(0);
-					assert element != null && element.getValue() != null;
-					Object declaredFunction = element.getValue();
-					assert declaredFunction instanceof FunctionType;
-					FunctionDefinition declaredFunctionDefinition = JPAUtils.findFunction(((FunctionType) declaredFunction).getFunctionId());
-					assert declaredFunctionDefinition != null;
-					if (logger.isDebugEnabled()) {
-						logger.debug("declaredFunction is: " + declaredFunctionDefinition);
-					}
-					FunctionArgument declaredFunctionArgument = XACMLFunctionValidator.getFunctionArgument(parentApply.getExpression().size(), declaredFunctionDefinition);
-					assert declaredFunctionArgument != null;
-					if (logger.isDebugEnabled()) {
-						logger.debug("declaredFunctionArgument is: " + declaredFunctionArgument);
-					}
-					//
-					// Copy the argument
-					//
-					argument = new FunctionArgument(argument);
-					argument.setDatatypeBean(declaredFunctionArgument.getDatatypeBean());
-				} catch (Exception e) {
-					logger.error("Exception while determining parent apply's FunctionType argument datatype.");
-				}
-				
-			}
-			self.addExpression(parentApply, argument);
-		} else {
-			AdminNotification.error("ApplyType does not have a function defined. Please define that first.");
-		}
-
-	}
-
-	protected void addExpression(final ApplyType parentApply, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("Adding Expression: " + parentApply + " arg: " + argument);
-		}
-		//
-		// First we need to select what Expression They want
-		//
-		final ExpressionSelectionWindow selector = new ExpressionSelectionWindow(parentApply,
-																		this.isParentAAssignment(),
-																		(argument != null ? argument.isBag() : false),
-																		(argument != null ? ! argument.isBag() : false));
-		selector.setCaption("Select the Expression Type");
-		selector.setModal(true);
-		selector.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Was something selected?
-				//
-				String selection = selector.getSelection();
-				if (selection == null) {
-					return;
-				}
-				//
-				// What did the user select?
-				//
-				if (selection.equals(ExpressionSelectionWindow.OPTION_APPLY)) {
-					//
-					self.editApply(new ApplyType(), parentApply, argument);
-					//
-				} else if (selection.equals(ExpressionSelectionWindow.OPTION_DESIGNATOR)) {
-					//
-					self.editAttribute(new AttributeDesignatorType(), parentApply, argument);
-					//
-				} else if (selection.equals(ExpressionSelectionWindow.OPTION_SELECTOR) ) {
-					//
-					self.editAttribute(new AttributeSelectorType(), parentApply, argument);
-					//
-				} else if (selection.equals(ExpressionSelectionWindow.OPTION_VALUE)) {
-					//
-					self.editValue(new AttributeValueType(), parentApply, argument);
-					//
-				} else if (selection.equals(ExpressionSelectionWindow.OPTION_VARIABLE)) {
-					//
-					self.editVariable(new VariableReferenceType(), parentApply, argument);
-					//
-				}
-			}
-		});
-		selector.center();
-		UI.getCurrent().addWindow(selector);
-	}
-
-	protected void editApply(final ApplyType apply, final ApplyType parent, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("editApply: " + apply + " parent: " + parent + " :" + argument);
-		}
-		//
-		// Copy the apply and create its window
-		//
-		final ApplyType copyApply = XACMLObjectCopy.copy(apply);
-		final ApplyEditorWindow window = new ApplyEditorWindow(copyApply, parent, argument, self.parent);
-		window.setCaption("Edit The Apply Expression");
-		window.setModal(true);
-		//
-		// Set ourselves as an ApplyParametersChanged listener
-		//
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Copy back the apply
-				//
-				apply.setDescription(copyApply.getDescription());
-				apply.setFunctionId(copyApply.getFunctionId());
-				//
-				// Get the function information
-				//
-				FunctionDefinition function = JPAUtils.findFunction(apply.getFunctionId());
-				assert function != null;
-				//
-				// Is this a new Apply?
-				//
-				if (self.container.containsId(apply)) {
-					//
-					// No - we are updating
-					//
-					self.container.updateItem(apply);
-				} else {
-					//
-					// Is this a higher-order bag function?
-					//
-					if (function.isHigherOrder()) {
-						//
-						// Have the user select a function for it
-						//
-						final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow(null);
-						functionSelection.setCaption("Select Function");
-						functionSelection.setModal(true);
-						functionSelection.addCloseListener(new CloseListener() {
-							private static final long serialVersionUID = 1L;
-
-							@Override
-							public void windowClose(CloseEvent e) {
-								//
-								// Did the user save?
-								//
-								if (functionSelection.isSaved() == false) {
-									return;
-								}
-								//
-								// Get the function
-								//
-								String function = functionSelection.getSelectedFunction();
-								if (function == null || function.isEmpty()) {
-									logger.error("Function window said it was saved, but there was no function.");
-									return;
-								}
-								//
-								// Create the function object
-								//
-								FunctionType hoFunction = new FunctionType();
-								hoFunction.setFunctionId(function);
-								//
-								// Add it into the apply
-								//
-								apply.getExpression().add(new ObjectFactory().createFunction(hoFunction));
-								//
-								// New Item
-								//
-								Item item = self.container.addItem(apply, parent, argument);
-								assert item != null;
-								self.treeExpressions.setCollapsed(apply, false);
-								self.treeExpressions.select(apply);
-							}
-						});
-						functionSelection.center();
-						UI.getCurrent().addWindow(functionSelection);
-					} else {
-						//
-						// New Item
-						//
-						Item item = self.container.addItem(apply, parent, argument);
-						assert item != null;
-						self.treeExpressions.setCollapsed(apply, false);
-						self.treeExpressions.select(apply);
-					}
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void editAttribute(final Object target, final ApplyType parent, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("editAttribute: " + target + " parent: " + parent + " :" + argument);
-		}
-		//
-		// Determine what the data type needs to be
-		//
-		Datatype datatype = null;
-		if (parent == null && this.isParentACondition()) {
-			datatype = JPAUtils.getBooleanDatatype();
-		} else {
-			if (argument != null) {
-				datatype = argument.getDatatypeBean();
-			}
-		}
-		//
-		// Copy the attribute
-		//
-		final Object copyAttribute = XACMLObjectCopy.deepCopy(target);
-		//
-		// Create the window
-		//
-		final AttributeSelectionWindow window = new AttributeSelectionWindow(datatype, copyAttribute);
-		if (target instanceof AttributeDesignatorType) {
-			window.setCaption("Edit Designator " + (((AttributeDesignatorType) target).getAttributeId() != null ? ((AttributeDesignatorType) target).getAttributeId() : ""));
-		} else {
-			window.setCaption("Edit Selector " + (((AttributeSelectorType) target).getContextSelectorId() != null ? ((AttributeSelectorType) target).getContextSelectorId() : ""));
-		}
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user hit save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Grab the attribute
-				//
-				Attribute attribute = window.getAttribute();
-				if (attribute == null) {
-					return;
-				}
-				//
-				// Save it back into the original
-				//
-				if (target instanceof AttributeDesignatorType) {
-					((AttributeDesignatorType)target).setAttributeId(attribute.getXacmlId());
-					((AttributeDesignatorType)target).setCategory(attribute.getCategoryBean().getXacmlId());
-					((AttributeDesignatorType)target).setDataType(attribute.getDatatypeBean().getXacmlId());
-					((AttributeDesignatorType)target).setIssuer(attribute.getIssuer());
-					((AttributeDesignatorType)target).setMustBePresent(attribute.isMustBePresent());
-				} else {
-					((AttributeSelectorType)target).setContextSelectorId(attribute.getXacmlId());
-					((AttributeSelectorType)target).setCategory(attribute.getCategoryBean().getXacmlId());
-					((AttributeSelectorType)target).setDataType(attribute.getDatatypeBean().getXacmlId());
-					((AttributeSelectorType)target).setPath(attribute.getSelectorPath());
-					((AttributeSelectorType)target).setMustBePresent(attribute.isMustBePresent());
-				}
-				//
-				// Is this a new item?
-				//
-				if (self.container.containsId(target)) {
-					//
-					// No, just update the container
-					//
-					self.container.updateItem(target);
-				} else {
-					//
-					// Yes a new item, add it in
-					//
-					//assert(self.container.addItem(JPAUtils.createDesignator(attribute), parent, argument) != null);
-					Item item = self.container.addItem(target, parent, argument);
-					assert item != null;
-					self.treeExpressions.select(target);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editValue(final AttributeValueType value, final ApplyType parent, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("editvalue: " + value + " parent: " + parent + " :" + argument);
-		}
-		//
-		// Copy the attribute value
-		//
-		final AttributeValueType copyValue = XACMLObjectCopy.copy(value);
-		//
-		// Get what the datatype should be
-		//
-		Datatype datatypeRestriction = null;
-		//
-		// Is this a root?
-		//
-		if (parent == null) {
-			//
-			// Check if our parent container is a condition
-			//
-			if (self.isParentACondition()) {
-				//
-				// We are only allowed to return boolean's
-				//
-				datatypeRestriction = JPAUtils.getBooleanDatatype();
-			}
-		} else {
-			//
-			// Are we an argument?
-			//
-			if (argument != null) {
-				//
-				// Yes - we are restricted to that argument's datatype
-				//
-				datatypeRestriction = argument.getDatatypeBean();
-			}
-		}
-		//
-		// Create the window
-		//
-		final AttributeValueEditorWindow window = new AttributeValueEditorWindow(copyValue, datatypeRestriction);
-		window.setCaption("Edit Attribute Value");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Yes - get the value
-				//
-				value.getContent().clear();
-				for (Object o : copyValue.getContent()) {
-					value.getContent().add(o);
-				}
-				value.setDataType(copyValue.getDataType());
-				//
-				// Was this a new value?
-				//
-				if (self.container.containsId(value)) {
-					//
-					// No - update it
-					//
-					self.container.updateItem(value);
-				} else {
-					//
-					// Yes - add it in
-					//
-					Item item = self.container.addItem(value, parent, argument);
-					assert item != null;
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editVariable(final VariableReferenceType variable, final ApplyType parent, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("editVariable: " + variable + " parent: " + parent + " :" + argument);
-		}
-		//
-		// Copy the variable
-		//
-		final VariableReferenceType copyVariable = XACMLObjectCopy.copy(variable);
-		//
-		// Create the window
-		//
-		final VariableReferenceEditorWindow window = new VariableReferenceEditorWindow(copyVariable, this.variables);
-		window.setCaption("Edit Variable Reference");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Copy the variable changes back
-				//
-				variable.setVariableId(copyVariable.getVariableId());
-				//
-				// Is this a new one?
-				//
-				if (self.container.containsId(variable)) {
-					//
-					// No - update it
-					//
-					self.container.updateItem(variable);
-				} else {
-					//
-					// Yes - add it
-					//
-					Item item = self.container.addItem(variable, parent, argument);
-					assert item != null;
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-	
-	protected void editFunction(final FunctionType func, final ApplyType parent, final FunctionArgument argument) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("editFunction: " + func + " parent: " + parent + " :" + argument);
-		}
-
-		final FunctionSelectionWindow functionSelection = new FunctionSelectionWindow((func != null ? func.getFunctionId() : null));
-		functionSelection.setCaption("Edit Function");
-		functionSelection.setModal(true);
-		functionSelection.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user save?
-				//
-				if (functionSelection.isSaved() == false) {
-					return;
-				}
-				//
-				// Get the function
-				//
-				String function = functionSelection.getSelectedFunction();
-				if (function == null || function.isEmpty()) {
-					logger.error("Function window said it was saved, but there was no function.");
-					return;
-				}
-				//
-				// New one?
-				//
-				if (func == null) {
-					//
-					// Create the function object
-					//
-					FunctionType hoFunction = new FunctionType();
-					hoFunction.setFunctionId(function);
-					//
-					// Add it into the apply
-					//
-					assert parent.getExpression().size() == 0;
-					parent.getExpression().add(new ObjectFactory().createFunction(hoFunction));
-					//
-					// New Item
-					//
-					Item item = self.container.addItem(func, parent, argument);
-					assert item != null;
-					self.treeExpressions.setCollapsed(parent, false);
-					self.treeExpressions.select(func);
-				} else {
-					//
-					// Editing an existing
-					//
-					func.setFunctionId(function);
-					self.container.updateItem(func);
-					//
-					// Warn user
-					//
-					if (parent.getExpression().size() > 1) {
-						AdminNotification.warn("You have updated the function ID. The rest of the arguments may be invalid for the function. Please verify the other arguments.");
-					}
-				}
-			}
-		});
-		functionSelection.center();
-		UI.getCurrent().addWindow(functionSelection);
-	}
-	
-	protected void editExpression(final Object target, final ApplyType parent, final FunctionArgument argument) {
-		if (target instanceof ApplyType) {
-			//
-			this.editApply((ApplyType) target, parent, argument);
-			//
-		} else if (target instanceof AttributeValueType) {
-			//
-			this.editValue((AttributeValueType) target,parent, argument);
-			//
-		} else if (target instanceof AttributeDesignatorType || target instanceof AttributeSelectorType) {
-			//
-			this.editAttribute(target, parent, argument);
-			//
-		} else if (target instanceof VariableReferenceType) {
-			//
-			this.editVariable((VariableReferenceType) target, parent, argument);
-			//
-		} else if (target instanceof FunctionType) {
-			//
-			this.editFunction((FunctionType) target, parent, argument);
-			//
-		}
-	}
-
-	protected void deleteExpression(Object target) {
-		if (this.container.isRoot(target)) {
-			if (this.treeExpressions.removeAllItems() == false) {
-				logger.error("Failed to remove everything.");
-			}
-		} else {
-			if (this.treeExpressions.removeItem(target) == false) {
-				logger.error("Failed to remove " + target);
-			}
-		}
-		this.setupButtons();
-	}
-	
-	protected void clearAllExpressions() {
-		if (this.treeExpressions.removeAllItems() == false) {
-			logger.error("Failed to remove everything.");
-		}
-		this.setupButtons();
-	}
-		
-	@Override
-	public void applyParameterChanged(ApplyType apply, ApplyType parent, FunctionArgument argument, Object container) {
-		logger.info("applyParameterChanged: " + apply + " " + parent + " " + argument + " " + container);
-		//
-		// TODO - figure out if this something being edited, or a new one
-		//
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		mainLayout.setExpandRatio(horizontalLayout_1, 1.0f);
-		
-		// treeExpressions
-		treeExpressions = new TreeTable();
-		treeExpressions.setImmediate(false);
-		treeExpressions.setWidth("100.0%");
-		treeExpressions.setHeight("-1px");
-		mainLayout.addComponent(treeExpressions);
-		mainLayout.setExpandRatio(treeExpressions, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// buttonAddExpression
-		buttonAddExpression = new Button();
-		buttonAddExpression.setCaption("Add Expression");
-		buttonAddExpression.setImmediate(true);
-		buttonAddExpression.setWidth("-1px");
-		buttonAddExpression.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonAddExpression);
-		
-		// buttonDeleteExpression
-		buttonDeleteExpression = new Button();
-		buttonDeleteExpression.setCaption("Delete Expression");
-		buttonDeleteExpression.setImmediate(true);
-		buttonDeleteExpression.setWidth("-1px");
-		buttonDeleteExpression.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonDeleteExpression);
-		
-		// buttonClearAll
-		buttonClearAll = new Button();
-		buttonClearAll.setCaption("Clear All");
-		buttonClearAll.setImmediate(true);
-		buttonClearAll.setDescription("Clears all the expressions.");
-		buttonClearAll.setWidth("-1px");
-		buttonClearAll.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonClearAll);
-		
-		// checkBoxShortName
-		checkBoxShortName = new CheckBox();
-		checkBoxShortName.setCaption("Display Short XACML ID's");
-		checkBoxShortName.setImmediate(false);
-		checkBoxShortName
-				.setDescription("If checked, the right-most string of the function and datatype URI's will only be displayed.");
-		checkBoxShortName.setWidth("-1px");
-		checkBoxShortName.setHeight("-1px");
-		horizontalLayout_1.addComponent(checkBoxShortName);
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java
deleted file mode 100644
index 0ee6eea..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionEditorWindow.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.Tree;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ExpressionEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Tree treeExpression;
-	@AutoGenerated
-	private ComboBox comboBox;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ExpressionEditorWindow() {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-
-		// TODO add user code here
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// comboBox
-		comboBox = new ComboBox();
-		comboBox.setImmediate(false);
-		comboBox.setWidth("-1px");
-		comboBox.setHeight("-1px");
-		mainLayout.addComponent(comboBox);
-		
-		// treeExpression
-		treeExpression = new Tree();
-		treeExpression.setImmediate(false);
-		treeExpression.setWidth("100.0%");
-		treeExpression.setHeight("-1px");
-		mainLayout.addComponent(treeExpression);
-		mainLayout.setExpandRatio(treeExpression, 1.0f);
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java
deleted file mode 100644
index d7bfeb0..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ExpressionSelectionWindow.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ApplyType;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ExpressionSelectionWindow extends Window {
-
-	public static String	OPTION_APPLY = "Apply";
-	public static String	OPTION_VALUE = "Attribute Value";
-	public static String	OPTION_DESIGNATOR = "Attribute Designator";
-	public static String	OPTION_SELECTOR = "Attribute Selector";
-	public static String	OPTION_VARIABLE = "Variable Reference";
-	
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private OptionGroup optionGroupExpression;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final ExpressionSelectionWindow self = this;
-	boolean isSaved = false;
-	String selection = null;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param parentApply 
-	 */
-	// TODO - Refactor.  Unused formal parameter parentApply.  Either determine
-	// whether this is unnecessary and remove it (including removing it from all 
-	// constructor consumers), or use it.
-	// NOTE: parentApply was originally used by passing to private initializeOption method.
-	//       However, the parameter was unused by that method also.
-	//       Setting to NOPMD for now.
-	public ExpressionSelectionWindow(ApplyType parentApply, boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) { //NOPMD
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Finish GUI initialization
-		//
-		// this.initializeOption(parentApply, isAttributeAssignment, mustBeBag, mustBeValue);
-		this.initializeOption(isAttributeAssignment, mustBeBag, mustBeValue);
-		this.initializeButtons();
-	}
-	
-	// private void initializeOption(ApplyType parentApply, boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) {
-	private void initializeOption(boolean isAttributeAssignment, boolean mustBeBag, boolean mustBeValue) {
-//		if (!isAttributeAssignment) {
-			this.optionGroupExpression.addItem(OPTION_APPLY);
-//		}
-		if (!mustBeBag || mustBeValue) {
-			this.optionGroupExpression.addItem(OPTION_VALUE);
-		}
-		if (mustBeBag || !mustBeValue) {
-			this.optionGroupExpression.addItem(OPTION_DESIGNATOR);
-			this.optionGroupExpression.addItem(OPTION_SELECTOR);
-		}
-		this.optionGroupExpression.addItem(OPTION_VARIABLE);
-		//
-		// Default Selection
-		//
-		if (!isAttributeAssignment) {
-			this.optionGroupExpression.select(OPTION_APPLY);
-		} else {
-			if (!mustBeBag || mustBeValue) {
-				this.optionGroupExpression.select(OPTION_VALUE);
-			} else {
-				this.optionGroupExpression.select(OPTION_DESIGNATOR);
-			}
-		}
-	}
-	
-	private void initializeButtons() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.isSaved = true;
-				self.selection = self.optionGroupExpression.getValue().toString();
-				self.close();
-			}			
-		});
-	}
-	
-	public String	getSelection() {
-		if (this.isSaved == false) {
-			return null;
-		}
-		return this.selection;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// optionGroupExpression
-		optionGroupExpression = new OptionGroup();
-		optionGroupExpression
-				.setCaption("Select One Of The Following Types of Expressions");
-		optionGroupExpression.setImmediate(false);
-		optionGroupExpression.setWidth("-1px");
-		optionGroupExpression.setHeight("-1px");
-		mainLayout.addComponent(optionGroupExpression);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Select");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(24));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
deleted file mode 100644
index 80d33b8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/FunctionSelectionWindow.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.util.filter.SimpleStringFilter;
-import com.vaadin.data.util.sqlcontainer.SQLContainer;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class FunctionSelectionWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private Table tableFunctions;
-	@AutoGenerated
-	private TextField textFieldFilter;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(FunctionSelectionWindow.class);
-	private final FunctionSelectionWindow self = this;
-	private final String defaultFunctionID;
-	private String selectedFunction = null;
-	private boolean isSaved = false;
-	private static SQLContainer highOrderFunctions = ((XacmlAdminUI) UI.getCurrent()).getHigherOrderBagContainer();
-	/*
-	 * Seems that when this view is created it may or may not be upper case.
-	 */
-	private static String PROPERTY_SHORTNAME = "shortname";
-	private static String PROPERTY_XACMLID = "xacmlid";
-	
-	static {
-		for (Object prop : FunctionSelectionWindow.highOrderFunctions.getContainerPropertyIds()) {
-			logger.info("SQL Container Property Id: " + prop.toString());
-			if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) {
-				PROPERTY_SHORTNAME = prop.toString();
-			} else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) {
-				PROPERTY_XACMLID = prop.toString();
-			}
-		}
-		
-	}
-	
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public FunctionSelectionWindow(String defaultFunction) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.defaultFunctionID = defaultFunction;
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeTextField();
-		this.initializeFunctions();
-		this.initializeButtons();
-		//
-		// Set our focus
-		//
-		this.tableFunctions.focus();
-	}
-
-	protected void initializeTextField() {
-		//
-		// Initialize GUI settings
-		//
-		this.textFieldFilter.setImmediate(true);
-		//
-		// Respond to the text change events
-		//
-		this.textFieldFilter.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-			SimpleStringFilter currentFilter = null;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				//
-				// Remove current filter
-				//
-				if (this.currentFilter != null) {
-					FunctionSelectionWindow.highOrderFunctions.removeContainerFilter(this.currentFilter);
-					this.currentFilter = null;
-				}
-				//
-				// Get the text
-				//
-				String value = event.getText();
-				if (value != null && value.length() > 0) {
-					//
-					// Add the new filter
-					//
-					this.currentFilter = new SimpleStringFilter(PROPERTY_SHORTNAME, value, true, false);
-					FunctionSelectionWindow.highOrderFunctions.addContainerFilter(this.currentFilter);
-				}
-			}
-		});
-	}
-	protected void initializeFunctions() {
-		//
-		// Setup data source. Make sure there are no current filters
-		//
-		FunctionSelectionWindow.highOrderFunctions.removeAllContainerFilters();
-		this.tableFunctions.setContainerDataSource(FunctionSelectionWindow.highOrderFunctions);
-		//
-		// Initialize GUI properties
-		//
-		this.tableFunctions.setImmediate(true);
-		this.tableFunctions.setNullSelectionAllowed(false);
-		this.tableFunctions.setRequired(true);
-		this.tableFunctions.setRequiredError("Please select a function.");
-		this.tableFunctions.setSelectable(true);
-		this.tableFunctions.setPageLength(15);
-		this.tableFunctions.setVisibleColumns(new Object[] {PROPERTY_SHORTNAME, PROPERTY_XACMLID});
-		this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"});
-		//
-		// Respond to selection events
-		//
-		this.tableFunctions.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object id = self.tableFunctions.getValue();
-				if (id != null) {
-					Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id);
-					if (item == null) {
-						return;
-					}
-					Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
-					if (property == null) {
-						return;
-					}
-					selectedFunction = property.getValue().toString();
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}			
-		});
-		//
-		// Respond to double-click events
-		//
-		this.tableFunctions.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					self.doSave();
-				}
-			}
-		});
-		//
-		// Setup the default selection
-		//
-		this.buttonSave.setEnabled(false);
-		if (this.defaultFunctionID != null) {
-			for (Object id : FunctionSelectionWindow.highOrderFunctions.getItemIds()) {
-				Item item = FunctionSelectionWindow.highOrderFunctions.getItem(id);
-				if (item != null) {
-					Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
-					if (property != null && property.getValue().toString().equals(this.defaultFunctionID)) {
-						this.tableFunctions.select(id);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	protected void initializeButtons() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.doSave();
-			}		
-		});
-	}
-	
-	protected void doSave() {
-		try {
-			//
-			// Commit changes
-			//
-			self.tableFunctions.commit();
-			//
-			// We are saved
-			//
-			self.isSaved = true;
-			//
-			// Close the window
-			//
-			self.close();
-		} catch (SourceException | InvalidValueException e) { //NOPMD
-			//
-			// Nothing to do, Vaadin highlights
-			//
-		}
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public String getSelectedFunction() {
-		return this.selectedFunction;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldFilter
-		textFieldFilter = new TextField();
-		textFieldFilter.setCaption("Filter");
-		textFieldFilter.setImmediate(false);
-		textFieldFilter.setWidth("-1px");
-		textFieldFilter.setHeight("-1px");
-		mainLayout.addComponent(textFieldFilter);
-		
-		// tableFunctions
-		tableFunctions = new Table();
-		tableFunctions.setImmediate(false);
-		tableFunctions.setDescription("Functions To Select From");
-		tableFunctions.setWidth("100.0%");
-		tableFunctions.setHeight("-1px");
-		mainLayout.addComponent(tableFunctions);
-		mainLayout.setExpandRatio(tableFunctions, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
deleted file mode 100644
index cd75c07..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitConflictResolver.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.VerticalLayout;
-
-public class GitConflictResolver extends CustomComponent {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public GitConflictResolver() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-
-		// TODO add user code here
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
deleted file mode 100644
index 492d8b9..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitPushWindow.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.Status;
-import org.eclipse.jgit.api.errors.GitAPIException;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.dircache.DirCacheEntry;
-import org.eclipse.jgit.errors.NoWorkTreeException;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.model.GitStatusContainer;
-import org.apache.openaz.xacml.admin.model.GitStatusContainer.GitEntry;
-import org.apache.openaz.xacml.admin.model.GitStatusContainer.StatusItem;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Item;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.Table.ColumnGenerator;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class GitPushWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonPush;
-	@AutoGenerated
-	private Table tableChanges;
-	@AutoGenerated
-	private TextArea textAreaComments;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(GitPushWindow.class);
-	private final GitPushWindow self = this;
-	private final GitStatusContainer container;
-	private final Git git;
-	private final File target;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param git 
-	 * @param status 
-	 */
-	public GitPushWindow(Git git, File target, Status status) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save data
-		//
-		this.git = git;
-		this.target = target;
-		this.container = new GitStatusContainer(status);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeText();
-		this.initializeTable(status);
-		this.initializeButtons();
-		//
-		//  Focus
-		//
-		this.textAreaComments.focus();
-	}
-	
-	protected void initializeText() {
-		this.textAreaComments.setImmediate(true);
-		this.textAreaComments.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText().isEmpty()) {
-					self.buttonPush.setEnabled(false);
-				} else {
-					if (self.container.getConflictCount() == 0) {
-						self.buttonPush.setEnabled(true);
-					} else {
-						self.buttonPush.setEnabled(false);
-					}
-				}
-			}			
-		});
-	}
-
-	protected void initializeTable(Status status) {
-		//
-		// Setup the table
-		//
-		this.tableChanges.setContainerDataSource(this.container);
-		this.tableChanges.setPageLength(this.container.size());
-		this.tableChanges.setImmediate(true);
-		//
-		// Generate column
-		//
-		this.tableChanges.addGeneratedColumn("Entry", new ColumnGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object generateCell(Table source, Object itemId, Object columnId) {
-				Item item = self.container.getItem(itemId);
-				assert item != null;
-				if (item instanceof StatusItem) {
-					return self.generateGitEntryComponent(((StatusItem) item).getGitEntry());
-				}
-				assert item instanceof StatusItem;
-				return null;
-			}
-		});
-	}
-	
-	protected Object generateGitEntryComponent(final GitEntry entry) {
-		//
-		// If its conflicting, take care of it
-		//
-		if (entry.isConflicting()) {
-			return this.generateConflictingEntry(entry);
-		}
-		if (entry.isUntracked()) {
-			return this.generateUntrackedEntry(entry);
-		}
-		/*
-		if (entry.isChanged() ||
-			entry.isModified() ||
-			entry.isUncommitted()) {
-			return this.generateUncommittedEntry(entry);
-		}
-		*/
-		return null;
-	}
-	
-	protected Object generateConflictingEntry(final GitEntry entry) {
-		Button resolve = new Button("Resolve");
-		resolve.setImmediate(true);
-		resolve.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-		
-			}
-		});
-		return resolve;
-	}
-	
-	protected Object generateUntrackedEntry(final GitEntry entry) {
-		Button add = new Button("Add");
-		add.setImmediate(true);
-		add.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					DirCache cache = self.git.add().addFilepattern(entry.getName()).call();
-					DirCacheEntry cacheEntry = cache.getEntry(entry.getName());
-					assert cacheEntry != null;
-					if (cacheEntry == null) {
-						return;
-					}
-					if (cacheEntry.isMerged()) {
-						self.refreshStatus();
-					}
-				} catch (GitAPIException e) {
-					String error = "Failed to add: " + e.getLocalizedMessage();
-					logger.error(error);
-					AdminNotification.error(error);
-				}
-			}
-		});
-		return add;
-	}
-	
-	protected Object generateUncommittedEntry(final GitEntry entry) {
-		Button commit = new Button("Commit");
-		commit.setImmediate(true);
-		commit.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-			}
-		});
-		return commit;
-	}
-	
-	protected void initializeButtons() {
-		this.buttonPush.setEnabled(false);
-		this.buttonPush.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textAreaComments.commit();
-					//
-					// Mark as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch(SourceException | InvalidValueException idontcare) { //NOPMD
-					//
-					// Vaadin will highlight the failed requirement or validation
-					//
-				}
-			}			
-		});
-	}
-	
-	protected void	refreshStatus() {
-		try {
-			//
-			// Grab our working repository
-			//
-			Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
-			final Git git = Git.open(repoPath.toFile());
-			//
-			// Get our status
-			//
-			final String base;
-			Status status;
-			if (target == null) {
-				base = ".";
-			} else {
-				Path relativePath = repoPath.relativize(Paths.get(target.getPath()));
-				base = relativePath.toString();
-			}
-			if (logger.isDebugEnabled()) {
-				logger.debug("Status on base: " + base);
-			}
-			status = git.status().addPath(base).call();
-			//
-			// Pass it to our container
-			//
-			this.container.refreshStatus(status);
-			this.tableChanges.refreshRowCache();
-		} catch (NoWorkTreeException | IOException | GitAPIException e) {
-			String error = "Failed to refresh status: " + e.getLocalizedMessage();
-			logger.error(error);
-		}
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public String getComment() {
-		return this.textAreaComments.getValue();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textAreaComments
-		textAreaComments = new TextArea();
-		textAreaComments.setCaption("Add Comments");
-		textAreaComments.setImmediate(false);
-		textAreaComments
-				.setDescription("Enter comments that reflect the changes you have made to the repository domains and/or policy files.");
-		textAreaComments.setWidth("400px");
-		textAreaComments.setHeight("-1px");
-		textAreaComments.setInvalidAllowed(false);
-		textAreaComments.setRequired(true);
-		textAreaComments
-				.setInputPrompt("Eg. Add new rule for employees in marketing department.");
-		mainLayout.addComponent(textAreaComments);
-		
-		// tableChanges
-		tableChanges = new Table();
-		tableChanges.setCaption("Changes To Be Pushed");
-		tableChanges.setImmediate(false);
-		tableChanges.setWidth("100.0%");
-		tableChanges.setHeight("-1px");
-		mainLayout.addComponent(tableChanges);
-		mainLayout.setExpandRatio(tableChanges, 1.0f);
-		
-		// buttonPush
-		buttonPush = new Button();
-		buttonPush.setCaption("Push Changes");
-		buttonPush.setImmediate(true);
-		buttonPush.setWidth("-1px");
-		buttonPush.setHeight("-1px");
-		mainLayout.addComponent(buttonPush);
-		mainLayout.setComponentAlignment(buttonPush, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
deleted file mode 100644
index da2edf7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/GitSynchronizeWindow.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.IOException;
-import java.nio.file.Path;
-
-import org.eclipse.jgit.api.Git;
-// import org.eclipse.jgit.api.MergeResult;
-import org.eclipse.jgit.api.PullResult;
-// import org.eclipse.jgit.api.RebaseResult;
-import org.eclipse.jgit.api.errors.GitAPIException;
-// import org.eclipse.jgit.transport.FetchResult;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class GitSynchronizeWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSynchronize;
-	@AutoGenerated
-	private TextArea textAreaResults;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final GitSynchronizeWindow self = this;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public GitSynchronizeWindow() {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		//
-		//
-		this.initializeButtons();
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSynchronize.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				if (self.buttonSynchronize.getCaption().equals("Synchronize")) {
-					self.synchronize();
-				} else {
-					self.close();
-				}
-			}			
-		});
-	}
-	
-	protected void synchronize() {
-		//
-		// Grab our working repository
-		//
-		Path repoPath = ((XacmlAdminUI)getUI()).getUserGitPath();
-		try {
-			final Git git = Git.open(repoPath.toFile());
-			
-			PullResult result = git.pull().call();
-			// FetchResult fetch = result.getFetchResult();
-			// MergeResult merge = result.getMergeResult();
-			// RebaseResult rebase = result.getRebaseResult();
-			if (result.isSuccessful()) {
-				//
-				// TODO add more notification
-				//
-				this.textAreaResults.setValue("Successful!");
-			} else {
-				//
-				// TODO
-				//
-				this.textAreaResults.setValue("Failed.");
-			}
-		} catch (IOException | GitAPIException e) {
-			e.printStackTrace();
-		}
-		this.buttonSynchronize.setCaption("Ok");
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textAreaResults
-		textAreaResults = new TextArea();
-		textAreaResults.setCaption("Synch Results");
-		textAreaResults.setImmediate(false);
-		textAreaResults.setWidth("462px");
-		textAreaResults.setHeight("222px");
-		mainLayout.addComponent(textAreaResults);
-		
-		// buttonSynchronize
-		buttonSynchronize = new Button();
-		buttonSynchronize.setCaption("Synchronize");
-		buttonSynchronize.setImmediate(true);
-		buttonSynchronize.setWidth("-1px");
-		buttonSynchronize.setHeight("-1px");
-		mainLayout.addComponent(buttonSynchronize);
-		mainLayout.setComponentAlignment(buttonSynchronize, new Alignment(24));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
deleted file mode 100644
index eafb7e0..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/MatchEditorWindow.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.MatchType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.Datatype;
-import org.apache.openaz.xacml.admin.view.events.AttributeChangedEventListener;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Item;
-import com.vaadin.data.Property;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.util.filter.Compare;
-import com.vaadin.data.util.sqlcontainer.SQLContainer;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class MatchEditorWindow extends Window implements AttributeChangedEventListener {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private Table tableFunctions;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(MatchEditorWindow.class);
-	private final MatchEditorWindow self = this;
-	private final MatchType match;
-	private final Datatype datatype;
-	private boolean isSaved = false;
-	private static SQLContainer matchFunctions = ((XacmlAdminUI) UI.getCurrent()).getMatchFunctionContainer();
-		
-	private static String PROPERTY_SHORTNAME = "shortname";
-	private static String PROPERTY_XACMLID = "xacmlid";
-	private static String PROPERTY_ARG2_DATATYPE = "arg2_datatype";
-	
-	static {
-		//
-		// H2 seems to insist on capitalizing, even with the no uppercase switch.
-		//
-		for (Object prop : MatchEditorWindow.matchFunctions.getContainerPropertyIds()) {
-			logger.info("SQL Container Property Id: " + prop.toString());
-			if (prop.toString().equalsIgnoreCase(PROPERTY_SHORTNAME)) {
-				PROPERTY_SHORTNAME = prop.toString();
-			} else if (prop.toString().equalsIgnoreCase(PROPERTY_XACMLID)) {
-				PROPERTY_XACMLID = prop.toString();
-			} else if (prop.toString().equalsIgnoreCase(PROPERTY_ARG2_DATATYPE)) {
-				PROPERTY_ARG2_DATATYPE = prop.toString();
-			}
-		}
-		
-	}
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public MatchEditorWindow(MatchType match, Datatype datatype) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save our data
-		//
-		this.match = match;
-		this.datatype = datatype;
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeFunctions();
-		this.initializeButtons();
-		//
-		// Set our focus
-		//
-		this.tableFunctions.focus();
-	}
-	
-	protected void initializeFunctions() {
-		//
-		// Setup datasource and GUI properties
-		//
-		this.tableFunctions.setContainerDataSource(MatchEditorWindow.matchFunctions);
-		this.tableFunctions.setImmediate(true);
-		this.tableFunctions.setNullSelectionAllowed(false);
-		this.tableFunctions.setRequired(true);
-		this.tableFunctions.setRequiredError("Please select a function.");
-		this.tableFunctions.setSelectable(true);
-		this.tableFunctions.setPageLength(15);
-		this.tableFunctions.setVisibleColumns(PROPERTY_SHORTNAME, PROPERTY_XACMLID);
-		this.tableFunctions.setColumnHeaders(new String[] {"Short Function Name", "Xacml ID"});
-		//
-		// Filter out functions where ARG2 is the given datatype. NOTE: The
-		// AttributeDesignator/AttributeSelector is the 2nd argument.
-		//
-		MatchEditorWindow.matchFunctions.removeAllContainerFilters();
-		MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, this.datatype.getId()));
-		//
-		// Respond to selection events
-		//
-		this.tableFunctions.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object id = self.tableFunctions.getValue();
-				if (id != null) {
-					Item item = MatchEditorWindow.matchFunctions.getItem(id);
-					if (item == null) {
-						return;
-					}
-					Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
-					if (property == null) {
-						return;
-					}
-					self.match.setMatchId(property.getValue().toString());
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}			
-		});
-		//
-		// Respond to double-click events
-		//
-		this.tableFunctions.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					self.doSave();
-				}
-			}
-		});
-		//
-		// Default selection
-		//
-		this.buttonSave.setEnabled(false);
-		if (this.match.getMatchId() != null) {
-			for (Object id : MatchEditorWindow.matchFunctions.getItemIds()) {
-				Item item = MatchEditorWindow.matchFunctions.getItem(id);
-				if (item != null) {
-					Property<?> property = item.getItemProperty(PROPERTY_XACMLID);
-					if (property != null && property.getValue().toString().equals(this.match.getMatchId())) {
-						this.tableFunctions.select(id);
-						break;
-					}
-				}
-			}
-		}
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.doSave();
-			}		
-		});
-	}
-	
-	protected void doSave() {
-		try {
-			//
-			// Commit changes
-			//
-			self.tableFunctions.commit();
-			//
-			// We are saved
-			//
-			self.isSaved = true;
-			//
-			// Close the window
-			//
-			self.close();
-		} catch (SourceException | InvalidValueException e) {
-			return;
-		}
-	}
-	
-	@Override
-	public void attributeChanged(Attribute attribute) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("attributeChanged: " + attribute);
-		}
-		//
-		// Remove all filters.
-		//
-		MatchEditorWindow.matchFunctions.removeAllContainerFilters();
-		if (attribute == null) {
-			return;
-		}
-		//
-		// Get the datatype for the attribute
-		//
-		Datatype datatype = attribute.getDatatypeBean();
-		if (logger.isDebugEnabled()) {
-			logger.debug("datatype: " + datatype.getId());
-		}
-		//
-		// Filter out functions where ARG2 is the datatype. The
-		// AttributeDesignator/AttributeSelector is the 2nd arg.
-		//
-		MatchEditorWindow.matchFunctions.addContainerFilter(new Compare.Equal(PROPERTY_ARG2_DATATYPE, datatype.getId()));
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public MatchType getMatch() {
-		return this.match;
-	}
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// tableFunctions
-		tableFunctions = new Table();
-		tableFunctions.setCaption("Function");
-		tableFunctions.setImmediate(true);
-		tableFunctions
-				.setDescription("Select a function for matching the attribute.");
-		tableFunctions.setWidth("100.0%");
-		tableFunctions.setHeight("-1px");
-		tableFunctions.setInvalidAllowed(false);
-		tableFunctions.setRequired(true);
-		mainLayout.addComponent(tableFunctions);
-		mainLayout.setExpandRatio(tableFunctions, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
deleted file mode 100644
index 960a2b7..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObadviceEditorWindow.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.openaz.xacml.admin.jpa.Obadvice;
-import org.apache.openaz.xacml.admin.view.fields.OaExpressionsField;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.fieldgroup.FieldGroup;
-import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
-import com.vaadin.data.fieldgroup.PropertyId;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.FormLayout;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.Window;
-
-public class ObadviceEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	private static final long serialVersionUID = 1L;
-	private ObadviceEditorWindow self = this;
-
-	private FormLayout mainLayout = new FormLayout();
-	
-	@PropertyId("type")
-	OptionGroup typeOption = new OptionGroup("Type");
-
-	@PropertyId("xacmlId")
-	TextField xacmlID = new TextField("Obligation Id");
-
-	@PropertyId("description")
-	TextArea descriptionField = new TextArea("Description");
-	
-	@PropertyId("fulfillOn")
-	OptionGroup fulfillOption = new OptionGroup("Fullfill On");
-	
-	@PropertyId("obadviceExpressions")
-	OaExpressionsField expressionsField; 
-	//Table tableExpressions = new Table("Attribute Assignments");
-	
-	Button saveButton = new Button("Save");
-	
-	private FieldGroup fieldGroup = null;
-	private final EntityItem<Obadvice> obad;
-	private boolean isSaved = false;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 * @param caption 
-	 */
-	public ObadviceEditorWindow(EntityItem<Obadvice> obad) {
-		this.setContent(mainLayout);
-		//
-		// Save
-		//
-		this.obad = obad;
-		//
-		// Initialize main layout
-		//
-		this.mainLayout.setMargin(true);
-		this.mainLayout.setWidth("-1px");
-		//
-		// Initialize components
-		//
-		this.typeOption.setNullSelectionAllowed(false);
-		this.typeOption.setImmediate(true);
-		this.typeOption.setDescription("Select whether this is an obligation or advice");
-		this.typeOption.addItem("Obligation");
-		this.typeOption.addItem("Advice");
-		
-		this.fulfillOption.setNullSelectionAllowed(true);
-		this.fulfillOption.setDescription("Optionally restrict the use of the obligation/advice to a Permit or a Deny");
-		this.fulfillOption.addItem("Permit");
-		this.fulfillOption.addItem("Deny");
-
-		this.descriptionField.setNullRepresentation("");
-		
-		this.expressionsField = new OaExpressionsField(this.obad);
-		//
-		// Add our form components
-		//
-		this.mainLayout.addComponent(this.typeOption);
-		this.mainLayout.addComponent(this.fulfillOption);
-		this.mainLayout.addComponent(this.xacmlID);
-		this.mainLayout.addComponent(this.descriptionField);
-		this.mainLayout.addComponent(this.expressionsField);
-//		this.mainLayout.addComponent(this.tableExpressions);
-		this.mainLayout.addComponent(this.saveButton);
-		//
-		// Now bind those fields to the data
-		//
-		this.fieldGroup = new FieldGroup(obad);
-		this.fieldGroup.bindMemberFields(this);
-		//
-		// Finish setting up
-		//
-		this.initializeButtons();
-		this.initializeOptions();
-		//
-		// Set focus
-		//
-		this.xacmlID.focus();
-	}
-	
-	private void initializeButtons() {
-		this.saveButton.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					fieldGroup.commit();
-					self.isSaved = true;
-					self.close();
-				} catch (CommitException e) {
-					e.printStackTrace();
-				}
-			}
-			
-		});
-	}
-	
-	private void initializeOptions() {
-		self.setIDCaption();
-		this.typeOption.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setIDCaption();
-			}
-			
-		});
-	}
-	
-	private void setIDCaption() {
-		String value = (String) self.typeOption.getValue();
-		if (value.equals("Obligation")) {
-			self.xacmlID.setCaption("Obligation Id");
-		} else {
-			self.xacmlID.setCaption("Advice Id");
-		}		
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public void	discard() {
-		//
-		//  May be discarded automatically??
-		//
-		this.fieldGroup.discard();
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
deleted file mode 100644
index 21c2d45..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationAdviceEditorWindow.java
+++ /dev/null
@@ -1,817 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Map;
-
-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.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.AttributeSelectorType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeValueType;
-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.VariableDefinitionType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.model.ObligationAdviceContainer;
-import org.apache.openaz.xacml.util.XACMLObjectCopy;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemDescriptionGenerator;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Component;
-import com.vaadin.ui.HorizontalLayout;
-import com.vaadin.ui.TreeTable;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ObligationAdviceEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TreeTable tableExpressions;
-	@AutoGenerated
-	private HorizontalLayout horizontalLayout_1;
-	@AutoGenerated
-	private Button buttonClear;
-	@AutoGenerated
-	private Button buttonRemove;
-	@AutoGenerated
-	private Button buttonAdd;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(ObligationAdviceEditorWindow.class);
-	private final ObligationAdviceEditorWindow self = this;
-	private final Object root;
-	private final Map<VariableDefinitionType, PolicyType> variables;
-	private ObligationAdviceContainer container;
-	private boolean isSaved = false;
-
-	private static final Action ADD_OBLIGATION =		new Action ("Add Obligation");
-	private static final Action ADD_ADVICE =			new Action ("Add Advice");
-	private static final Action ADD_EXPRESSION =		new Action ("Add Expression");
-	private static final Action ADD_ATTRIBUTE =			new Action ("Add Attribute");
-	private static final Action EDIT_OBLIGATION =		new Action ("Edit Obligation");
-	private static final Action EDIT_ADVICE =			new Action ("Edit Advice");
-	private static final Action EDIT_EXPRESSION =		new Action ("Edit Expression");
-	private static final Action EDIT_ATTRIBUTE =		new Action ("Edit Attribute");
-	private static final Action REMOVE_OBLIGATION =		new Action ("Remove Obligation");
-	private static final Action REMOVE_ADVICE	 =		new Action ("Remove Advice");
-	private static final Action REMOVE_EXPRESSION =		new Action ("Remove Expression");
-	private static final Action REMOVE_ATTRIBUTE =		new Action ("Remove Attribute");
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ObligationAdviceEditorWindow(Object root, Map<VariableDefinitionType, PolicyType> variables) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		if (! (root instanceof ObligationExpressionsType) &&
-			! (root instanceof AdviceExpressionsType) ) {
-			throw new IllegalArgumentException("This window supports Obligation or Advice Expressions only.");
-		}
-		this.root = root;
-		this.variables = variables;
-		this.container = new ObligationAdviceContainer(this.root);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeTable();
-		this.initializeButtons();
-		this.setupButtons();
-		//
-		// Focus
-		//
-		this.tableExpressions.focus();
-	}
-
-	protected void initializeTable() {
-		//
-		// GUI properties
-		//
-		this.tableExpressions.setImmediate(true);
-		//
-		// Set the container
-		//
-		this.tableExpressions.setContainerDataSource(this.container);
-		this.tableExpressions.setVisibleColumns(new Object[] {ObligationAdviceContainer.PROPERTY_NAME, 
-																ObligationAdviceContainer.PROPERTY_ID_SHORT, 
-																ObligationAdviceContainer.PROPERTY_EFFECT,
-																ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT,
-																ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT});
-		this.tableExpressions.setColumnHeaders(new String[] {"Name", "ID or Value", (this.root instanceof ObligationExpressionsType ? "Effect" : "Applies"), "Category", "Data Type"});
-		//this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_NAME, 1.0f);
-		//this.tableExpressions.setColumnExpandRatio(ObligationAdviceContainer.PROPERTY_ID_SHORT, 1.0f);
-		//this.tableExpressions.setColumnWi
-		this.tableExpressions.setSelectable(true);
-		//
-		// Expand it out
-		//
-		for (Object item : this.tableExpressions.getItemIds()) {
-			this.tableExpressions.setCollapsed(item, false);
-			for (Object child : this.tableExpressions.getChildren(item)) {
-				this.tableExpressions.setCollapsed(child, false);
-			}
-		}
-		this.tableExpressions.setPageLength(this.container.size() + 3);
-		//
-		// Respond to events
-		//
-		this.tableExpressions.addActionHandler(new Handler() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Action[] getActions(Object target, Object sender) {
-				if (target == null) {
-					if (self.root instanceof ObligationExpressionsType) {
-						return new Action[] {ADD_OBLIGATION};
-					}
-					if (self.root instanceof AdviceExpressionsType) {
-						return new Action[] {ADD_ADVICE};
-					}
-				}
-				if (target instanceof ObligationExpressionType) {
-					return new Action[] {EDIT_OBLIGATION, REMOVE_OBLIGATION, ADD_EXPRESSION};
-				}
-				if (target instanceof AdviceExpressionType) {
-					return new Action[] {EDIT_ADVICE, REMOVE_ADVICE, ADD_EXPRESSION};
-				}
-				if (target instanceof AttributeAssignmentExpressionType) {
-					return new Action[] {EDIT_EXPRESSION, REMOVE_EXPRESSION, ADD_ATTRIBUTE};
-				}
-				if (target instanceof AttributeValueType ||
-					target instanceof AttributeDesignatorType ||
-					target instanceof AttributeSelectorType ||
-					target instanceof ApplyType) {
-					return new Action[] {EDIT_ATTRIBUTE, REMOVE_ATTRIBUTE};
-				}
-				return null;
-			}
-
-			@Override
-			public void handleAction(Action action, Object sender, Object target) {
-				if (action == ADD_OBLIGATION) {
-					self.editObligation(null);
-					return;
-				}
-				if (action == EDIT_OBLIGATION) {
-					assert target instanceof ObligationExpressionType;
-					self.editObligation((ObligationExpressionType) target);
-					return;
-				}
-				if (action == REMOVE_OBLIGATION) {
-					assert target instanceof ObligationExpressionType;
-					if (self.container.removeItem(target) == false) {
-						logger.error("Failed to remove obligation");
-						assert false;
-					}
-					return;
-				}
-				if (action == ADD_ADVICE) {
-					self.editAdvice(null);
-					return;
-				}
-				if (action == EDIT_ADVICE) {
-					assert target instanceof AdviceExpressionType;
-					self.editAdvice((AdviceExpressionType) target);
-					return;
-				}
-				if (action == REMOVE_ADVICE) {
-					assert target instanceof AdviceExpressionType;
-					if (self.container.removeItem(target) == false) {
-						logger.error("Failed to remove advice");
-						assert false;
-					}
-					return;
-				}
-				if (action == ADD_EXPRESSION) {
-					assert target instanceof ObligationExpressionType || target instanceof AdviceExpressionType;
-					self.editExpression(null, target);
-					return;
-				}
-				if (action == EDIT_EXPRESSION) {
-					assert target instanceof AttributeAssignmentExpressionType;
-					self.editExpression((AttributeAssignmentExpressionType) target, self.container.getParent(target));
-					return;
-				}
-				if (action == REMOVE_EXPRESSION) {
-					assert target instanceof AttributeAssignmentExpressionType;
-					if (self.container.removeItem(target) == false) {
-						logger.error("Failed to remove expression");
-						assert false;
-					}
-					return;
-				}
-				if (action == ADD_ATTRIBUTE) {
-					assert target instanceof AttributeAssignmentExpressionType;
-					self.editAttribute(null, (AttributeAssignmentExpressionType) target);
-					return;
-				}
-				if (action == EDIT_ATTRIBUTE) {
-					assert target instanceof AttributeValueType ||
-							target instanceof AttributeDesignatorType ||
-							target instanceof AttributeSelectorType ||
-							target instanceof ApplyType;
-					self.editAttribute(target, (AttributeAssignmentExpressionType) self.container.getParent(target));
-					return;
-				}
-				if (action == REMOVE_ATTRIBUTE) {
-					assert target instanceof AttributeValueType ||
-							target instanceof AttributeDesignatorType ||
-							target instanceof AttributeSelectorType ||
-							target instanceof ApplyType;
-					if (self.container.removeItem(target) == false) {
-						logger.error("Failed to remove attribute");
-						assert false;
-					}
-					return;
-				}
-			}
-		});
-		//
-		// Respond to selections
-		//
-		this.tableExpressions.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupButtons();
-			}
-		});
-		this.tableExpressions.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					if (event.getSource() instanceof AdviceExpressionType) {
-						self.editAdvice((AdviceExpressionType) event.getSource());
-					} else if (event.getSource() instanceof ObligationExpressionType) {
-						self.editObligation((ObligationExpressionType) event.getSource());
-					} else if (event.getSource() instanceof AttributeAssignmentExpressionType) {
-						self.editExpression((AttributeAssignmentExpressionType) event.getSource(), self.container.getParent(event.getSource()));
-					} else {
-						self.editAttribute(event.getSource(), (AttributeAssignmentExpressionType) self.container.getParent(event.getSource())); 
-					}
-				}
-			}			
-		});
-		//
-		// Implement a description generator, to display the full XACML ID.
-		//
-		this.tableExpressions.setItemDescriptionGenerator(new ItemDescriptionGenerator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public String generateDescription(Component source, Object itemId, Object propertyId) {
-				if (propertyId == ObligationAdviceContainer.PROPERTY_ID_SHORT) {
-					if (itemId instanceof AdviceExpressionType) {
-						return ((AdviceExpressionType) itemId).getAdviceId();
-					}
-					if (itemId instanceof ObligationExpressionType) {
-						return ((ObligationExpressionType) itemId).getObligationId();
-					}
-					if (itemId instanceof AttributeAssignmentExpressionType) {
-						return ((AttributeAssignmentExpressionType) itemId).getAttributeId();
-					}
-					if (itemId instanceof AttributeDesignatorType) {
-						return ((AttributeDesignatorType) itemId).getAttributeId();
-					}
-					if (itemId instanceof AttributeSelectorType) {
-						return ((AttributeSelectorType) itemId).getContextSelectorId();
-					}
-					if (itemId instanceof ApplyType) {
-						return ((ApplyType) itemId).getDescription();
-					}
-				}
-				if (propertyId == ObligationAdviceContainer.PROPERTY_CATEGORY_SHORT) {
-					if (itemId instanceof AttributeAssignmentExpressionType) {
-						return ((AttributeAssignmentExpressionType) itemId).getCategory();
-					}
-					if (itemId instanceof AttributeDesignatorType) {
-						return ((AttributeDesignatorType) itemId).getCategory();
-					}
-					if (itemId instanceof AttributeSelectorType) {
-						return ((AttributeSelectorType) itemId).getCategory();
-					}
-					if (itemId instanceof ApplyType) {
-						return null;
-					}
-				}
-				if (propertyId == ObligationAdviceContainer.PROPERTY_DATATYPE_SHORT) {
-					if (itemId instanceof AttributeValueType) {
-						return ((AttributeValueType) itemId).getDataType();
-					}
-					if (itemId instanceof AttributeDesignatorType) {
-						return ((AttributeDesignatorType) itemId).getDataType();
-					}
-					if (itemId instanceof AttributeSelectorType) {
-						return ((AttributeSelectorType) itemId).getDataType();
-					}
-					/*
-					if (itemId instanceof ApplyType) {
-						//
-						// TODO - get the datatype for the function
-						//
-					}
-					*/
-				}
-				return null;
-			}
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonAdd.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				if (self.tableExpressions.getValue() == null) {
-					//
-					// Add new root advice or obligation
-					//
-					if (self.root instanceof AdviceExpressionsType) {
-						self.editAdvice(null);
-					} else {
-						self.editObligation(null);
-					}
-				} else {
-					//
-					// Add new assignment expression
-					//
-					self.editExpression(null, self.tableExpressions.getValue());
-				}
-			}			
-		});
-		
-		this.buttonRemove.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object object = self.tableExpressions.getValue();
-				if (object != null) {
-					if (object instanceof AttributeValueType ||
-						object instanceof AttributeDesignatorType ||
-						object instanceof AttributeSelectorType ||
-						object instanceof ApplyType) {
-						if (self.container.removeItem(self.container.getParent(object)) == false) {
-							logger.error("Failed to remove attribute value/des/sel/apply");
-							assert false;
-						}
-					} else {
-						if (self.container.removeItem(object) == false) {
-							logger.error("Failed to remove object");
-							assert false;
-						}
-					}
-				} else {
-					logger.error("This code should never get executed if the button was properly disabled.");
-				}
-			}			
-		});
-		
-		this.buttonClear.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				Object object = self.tableExpressions.getValue();
-				if (object == null) {
-					if (self.container.removeAllItems() == false) {
-						logger.error("Failed to remove all items");
-						assert false;
-					}
-				} else {
-					if (self.container.removeAllAssignments() == false) {
-						logger.error("Failed to remove all assignments");
-						assert false;
-					}
-				}
-			}			
-		});
-		
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Mark ourselves as saved
-				//
-				self.isSaved = true;
-				//
-				// Close the window
-				//
-				self.close();
-			}			
-		});
-	}
-	
-	protected void setupButtons() {
-		Object target = this.tableExpressions.getValue();
-		if (target == null) {
-			if (this.root instanceof AdviceExpressionsType) {
-				this.buttonAdd.setVisible(true);
-				this.buttonAdd.setCaption("Add Advice");
-				this.buttonRemove.setCaption("Remove Advice");
-				this.buttonClear.setCaption("Clear All Advice");
-				this.buttonClear.setVisible(true);
-			} else {
-				this.buttonAdd.setVisible(true);
-				this.buttonAdd.setCaption("Add Obligation");
-				this.buttonRemove.setCaption("Remove Obligation");
-				this.buttonClear.setCaption("Clear All Obligations");
-				this.buttonClear.setVisible(true);
-			}
-			this.buttonRemove.setEnabled(false);
-		} else {
-			if (target instanceof AdviceExpressionType ||
-				target instanceof ObligationExpressionType) {
-				this.buttonAdd.setVisible(true);
-				this.buttonAdd.setCaption("Add Assignment");
-				if (target instanceof AdviceExpressionType) {
-					this.buttonRemove.setCaption("Remove Advice");
-				} else {
-					this.buttonRemove.setCaption("Remove Obligation");
-				}
-				this.buttonClear.setCaption("Clear All Assignments");
-				this.buttonClear.setVisible(true);
-			} else {
-				this.buttonAdd.setVisible(false);
-				this.buttonRemove.setCaption("Remove Assignment");
-				this.buttonClear.setVisible(false);
-			}
-			this.buttonRemove.setEnabled(true);
-		}
-		if (this.tableExpressions.size() == 0) {
-			this.buttonClear.setEnabled(false);
-		} else {
-			this.buttonClear.setEnabled(true);
-		}
-	}
-	
-	protected void editAttribute(Object target, final AttributeAssignmentExpressionType parent) {
-		//
-		// Make a copy
-		//
-		final AttributeAssignmentExpressionType copyAssignment = (parent == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(parent));
-		//
-		// Prompt user for attribute right away
-		//
-		final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, copyAssignment.getExpression() != null ? copyAssignment.getExpression().getValue() : null, null, self.variables);
-		builder.setCaption("Define Assignment Attribute");
-		builder.setModal(true);
-		builder.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user save?
-				//
-				if (builder.isSaved() == false) {
-					return;
-				}
-				//
-				// Yes - update it
-				//
-				parent.setExpression(copyAssignment.getExpression());
-				if (parent.getExpression() != null) {
-					self.container.removeItem(parent.getExpression().getValue());
-				}
-				self.container.addItem(copyAssignment.getExpression().getValue(), parent);
-				//
-				// Set the table size
-				//
-				self.tableExpressions.setPageLength(self.container.size() + 1);
-			}
-		});
-		builder.center();
-		UI.getCurrent().addWindow(builder);
-	}
-
-	protected void editExpression(final AttributeAssignmentExpressionType assignment, final Object parent) {
-		//
-		// Copy
-		//
-		final AttributeAssignmentExpressionType copyAssignment = (assignment == null ? new AttributeAssignmentExpressionType() : XACMLObjectCopy.copy(assignment));
-		//
-		// Create the window
-		//
-		final AttributeAssignmentExpressionEditorWindow window = new AttributeAssignmentExpressionEditorWindow(copyAssignment);
-		window.setCaption(assignment == null ? "Create Attribute Assignment" : "Edit Attribute Assignment");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user click save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Was this a new assignment?
-				//
-				if (assignment == null) {
-					//
-					// Prompt user for attribute right away
-					//
-					final ExpressionBuilderComponent builder = new ExpressionBuilderComponent(copyAssignment, null, null, self.variables);
-					builder.setCaption("Define Assignment Attribute");
-					builder.setModal(true);
-					builder.addCloseListener(new CloseListener() {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public void windowClose(CloseEvent e) {
-							//
-							// Did the user save?
-							//
-							if (builder.isSaved() == false) {
-								return;
-							}
-							//
-							// Yes - add it to the container
-							//
-							if (self.container.addItem(copyAssignment, parent) == null) {
-								logger.error("Failed to add copy assignment");
-								assert false;
-							}
-							//
-							// Set the table size
-							//
-							self.tableExpressions.setPageLength(self.container.size() + 1);
-						}
-					});
-					builder.center();
-					UI.getCurrent().addWindow(builder);
-				} else {
-					//
-					// No - copy back the data
-					//
-					assignment.setAttributeId(copyAssignment.getAttributeId());
-					assignment.setIssuer(assignment.getIssuer());
-					assignment.setCategory(copyAssignment.getCategory());
-					//
-					// Update the container
-					//
-					self.container.updateItem(assignment);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editAdvice(final AdviceExpressionType advice) {
-		//
-		// Copy the advice
-		//
-		final AdviceExpressionType copyAdvice = (advice == null ? new AdviceExpressionType() : XACMLObjectCopy.copy(advice));
-		//
-		// Setup the window
-		//
-		final AdviceEditorWindow window = new AdviceEditorWindow(copyAdvice);
-		window.setCaption("Edit Advice");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Is it saved?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Was this a new object?
-				//
-				if (advice == null) {
-					//
-					// New - add it to the container
-					//
-					if (self.container.addItem(copyAdvice) == null) {
-						logger.error("failed to add advice");
-						assert false;
-					}
-					//
-					// Set the table size
-					//
-					self.tableExpressions.setPageLength(self.container.size() + 1);
-				} else {
-					//
-					// No - copy it back
-					//
-					advice.setAdviceId(copyAdvice.getAdviceId());
-					advice.setAppliesTo(copyAdvice.getAppliesTo());
-					//
-					// Update
-					//
-					self.container.updateItem(advice);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editObligation(final ObligationExpressionType obligation) {
-		//
-		// Copy the advice
-		//
-		final ObligationExpressionType copyObligation = (obligation == null ? new ObligationExpressionType() : XACMLObjectCopy.copy(obligation));
-		//
-		// Setup the window
-		//
-		final ObligationEditorWindow window = new ObligationEditorWindow(copyObligation);
-		window.setCaption("Edit Obligation");
-		window.setModal(true);
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Is it saved?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Was this a new object?
-				//
-				if (obligation == null) {
-					//
-					// New - add it to the container
-					//
-					if (self.container.addItem(copyObligation) == null) {
-						logger.error("Failed to add obligation");
-						assert false;
-					}
-					//
-					// Set the table size
-					//
-					self.tableExpressions.setPageLength(self.container.size() + 1);
-				} else {
-					//
-					// No - copy it back
-					//
-					obligation.setObligationId(copyObligation.getObligationId());
-					obligation.setFulfillOn(copyObligation.getFulfillOn());
-					//
-					// Update
-					//
-					self.container.updateItem(obligation);
-				}
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Object getRootObject() {
-		return this.root;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// horizontalLayout_1
-		horizontalLayout_1 = buildHorizontalLayout_1();
-		mainLayout.addComponent(horizontalLayout_1);
-		
-		// tableExpressions
-		tableExpressions = new TreeTable();
-		tableExpressions.setCaption("Expressions");
-		tableExpressions.setImmediate(false);
-		tableExpressions.setWidth("100%");
-		tableExpressions.setHeight("-1px");
-		mainLayout.addComponent(tableExpressions);
-		mainLayout.setExpandRatio(tableExpressions, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	@AutoGenerated
-	private HorizontalLayout buildHorizontalLayout_1() {
-		// common part: create layout
-		horizontalLayout_1 = new HorizontalLayout();
-		horizontalLayout_1.setImmediate(false);
-		horizontalLayout_1.setWidth("-1px");
-		horizontalLayout_1.setHeight("-1px");
-		horizontalLayout_1.setMargin(false);
-		horizontalLayout_1.setSpacing(true);
-		
-		// buttonAdd
-		buttonAdd = new Button();
-		buttonAdd.setCaption("Add Expression");
-		buttonAdd.setImmediate(false);
-		buttonAdd.setWidth("-1px");
-		buttonAdd.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonAdd);
-		
-		// buttonRemove
-		buttonRemove = new Button();
-		buttonRemove.setCaption("Remove Expression");
-		buttonRemove.setImmediate(false);
-		buttonRemove.setWidth("-1px");
-		buttonRemove.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonRemove);
-		
-		// buttonClear
-		buttonClear = new Button();
-		buttonClear.setCaption("Clear Expressions");
-		buttonClear.setImmediate(false);
-		buttonClear.setWidth("-1px");
-		buttonClear.setHeight("-1px");
-		horizontalLayout_1.addComponent(buttonClear);
-		
-		return horizontalLayout_1;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
deleted file mode 100644
index dac4eda..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/ObligationEditorWindow.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class ObligationEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private OptionGroup optionGroupFullfillOn;
-	@AutoGenerated
-	private TextField textFieldObligationID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final ObligationEditorWindow self = this;
-	private final ObligationExpressionType obligation;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public ObligationEditorWindow(ObligationExpressionType obligation) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.obligation = obligation;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initialize();
-		this.initializeButton();
-		//
-		// Focus
-		//
-		this.textFieldObligationID.focus();
-	}
-	
-	protected void initialize() {
-		//
-		// The text field for the advice ID
-		//
-		this.textFieldObligationID.setNullRepresentation("");
-		if (this.obligation.getObligationId() == null) {
-			this.textFieldObligationID.setValue(XacmlAdminUI.getDomain());
-		} else {
-			this.textFieldObligationID.setValue(obligation.getObligationId());
-		}
-		this.textFieldObligationID.setRequiredError("You must have an ID for the obligation");
-		//
-		// The option
-		//
-		this.optionGroupFullfillOn.setRequiredError("You must select Permit or Deny for the obligation");
-		this.optionGroupFullfillOn.addItem(EffectType.PERMIT);
-		this.optionGroupFullfillOn.addItem(EffectType.DENY);
-		if (this.obligation.getFulfillOn() == null) {
-			this.optionGroupFullfillOn.select(EffectType.PERMIT);
-		} else {
-			if (this.obligation.getFulfillOn().equals(EffectType.PERMIT)) {
-				this.optionGroupFullfillOn.select(EffectType.PERMIT);
-			} else {
-				this.optionGroupFullfillOn.select(EffectType.DENY);
-			}
-		}
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.setImmediate(true);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textFieldObligationID.commit();
-					self.optionGroupFullfillOn.commit();
-					//
-					// all good, save everything
-					//
-					self.obligation.setObligationId(self.textFieldObligationID.getValue());
-					self.obligation.setFulfillOn((EffectType) self.optionGroupFullfillOn.getValue());
-					//
-					// Set ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// Vaadin displays the error
-					//
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public ObligationExpressionType getAdvice() {
-		return this.obligation;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldObligationID
-		textFieldObligationID = new TextField();
-		textFieldObligationID.setCaption("Obligation ID");
-		textFieldObligationID.setImmediate(false);
-		textFieldObligationID.setWidth("-1px");
-		textFieldObligationID.setHeight("-1px");
-		textFieldObligationID.setInvalidAllowed(false);
-		textFieldObligationID.setRequired(true);
-		textFieldObligationID.setInputPrompt("Eg. urn:com:foo:obligation:sample");
-		mainLayout.addComponent(textFieldObligationID);
-		
-		// optionGroupFullfillOn
-		optionGroupFullfillOn = new OptionGroup();
-		optionGroupFullfillOn.setCaption("Fulfill On");
-		optionGroupFullfillOn.setImmediate(false);
-		optionGroupFullfillOn.setWidth("-1px");
-		optionGroupFullfillOn.setHeight("-1px");
-		optionGroupFullfillOn.setInvalidAllowed(false);
-		optionGroupFullfillOn.setRequired(true);
-		mainLayout.addComponent(optionGroupFullfillOn);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
deleted file mode 100644
index de279a3..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PDPStatusWindow.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.api.pap.PDPPolicy;
-import org.apache.openaz.xacml.api.pap.PDPStatus;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PDPStatusWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-
-	@AutoGenerated
-	private Button buttonOK;
-
-
-	@AutoGenerated
-	private Table table;
-
-
-	private PDPStatus status;
-	
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PDPStatusWindow.class);
-	private final PDPStatusWindow self = this;
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PDPStatusWindow(PDPStatus status) {
-		buildMainLayout();
-		setContent(mainLayout);
-		//setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.status = status;
-		//
-		// Setup shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		this.buttonOK.setClickShortcut(KeyCode.ENTER);
-		//
-		// Initialize
-		//
-		try {
-			this.initialize();
-			this.initializeButton();
-		} catch (Exception e) {
-			logger.error("Initialize exception: " + e);
-		}
-		//
-		//  Focus
-		//
-		this.buttonOK.focus();
-	}
-	
-	protected void initialize() {
-		//
-		// Setup the table - real simple
-		//
-		this.table.addContainerProperty("Property", Label.class, null);
-		this.table.addContainerProperty("Value", TextArea.class, null);
-		//
-		// Set the status
-		//
-		StringBuilder builder;
-		int rows;
-		Integer id = 1;
-		this.table.addItem(new Object[] {new Label("Status"), this.createTextArea(this.status.getStatus().toString(), 1)}, id++);
-		//
-		// Setup Errors
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (String error : this.status.getLoadErrors()) {
-			builder.append(error);
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Errors"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Setup Errors
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (String error : this.status.getLoadWarnings()) {
-			builder.append(error);
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Warnings"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Setup the loaded policy table
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (PDPPolicy policy : this.status.getLoadedPolicies()) {
-			builder.append(policy.getName());
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Policies Loaded"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Setup the Failed policy table
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (PDPPolicy policy : this.status.getFailedPolicies()) {
-			builder.append(policy.getName());
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Policies Failed To Load"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Setup the Loaded PIP configuration table
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (PDPPIPConfig config : this.status.getLoadedPipConfigs()) {
-			builder.append(config.getName());
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Loaded PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Setup the Failed PIP configuration table
-		//
-		builder = new StringBuilder();
-		rows = 0;
-		for (PDPPIPConfig config : this.status.getFailedPipConfigs()) {
-			builder.append(config.getName());
-			builder.append(System.lineSeparator());
-			rows++;
-		}
-		if (rows == 0) {
-			rows = 1;
-		}
-		this.table.addItem(new Object[] {new Label("Failed PIP Configurations"), this.createTextArea(builder.toString(), rows)}, id++);
-		//
-		// Set the length
-		//
-		table.setPageLength(id - 1);
-		table.setReadOnly(true);
-		table.setSizeFull();
-	}
-	
-	protected TextArea	createTextArea(String value, int lines) {
-		TextArea area = new TextArea();
-		area.setValue(value);
-		area.setNullRepresentation("");
-		area.setSizeFull();
-		area.setReadOnly(true);
-		area.setRows(lines);
-		return area;
-	}
-	
-	protected void initializeButton() {
-		this.buttonOK.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				self.close();
-			}
-		});
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("100.0%");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// table
-		table = new Table();
-		table.setCaption("Status");
-		table.setImmediate(false);
-		table.setWidth("100.0%");
-		table.setHeight("-1px");
-		mainLayout.addComponent(table);
-		
-		// buttonOK
-		buttonOK = new Button();
-		buttonOK.setCaption("Ok");
-		buttonOK.setImmediate(true);
-		buttonOK.setWidth("-1px");
-		buttonOK.setHeight("-1px");
-		mainLayout.addComponent(buttonOK);
-		mainLayout.setComponentAlignment(buttonOK, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-	
-	
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java
deleted file mode 100644
index 08f9306..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPConfigurationEditorWindow.java
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Locale;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.admin.jpa.PIPType;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.admin.view.fields.ConfigParamField;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.fieldfactory.SingleSelectConverter;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.fieldgroup.FieldGroup;
-import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
-import com.vaadin.data.fieldgroup.PropertyId;
-import com.vaadin.data.util.converter.Converter;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.Window;
-
-public class PIPConfigurationEditorWindow extends Window {
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPConfigurationEditorWindow.class);
-	private final PIPConfigurationEditorWindow self = this;
-	private final EntityItem<PIPConfiguration> entity;
-	private FieldGroup fieldGroup;
-	private boolean isSaved = false;
-	
-	private GridLayout grid = new GridLayout(2,6);
-	
-	@PropertyId("piptype")
-	ComboBox comboType = new ComboBox("Type");
-	
-	@PropertyId("name")
-	TextField fieldName = new TextField("Name");
-	
-	@PropertyId("description")
-	TextArea areaDescription = new TextArea("Description");
-
-	@PropertyId("issuer")
-	TextField fieldIssuer = new TextField("Issuer");
-	
-	@PropertyId("requiresResolvers")
-	CheckBox requiresResolvers = new CheckBox("Requires Resolvers");
-	
-	@PropertyId("pipconfigParams")
-	ConfigParamField paramField = null;
-	
-	Button	buttonSave = new Button("Save");
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPConfigurationEditorWindow(EntityItem<PIPConfiguration> entity) {
-		//
-		// Our base component
-		//
-		this.setContent(this.grid);
-		this.grid.setMargin(true);
-		this.grid.setSpacing(true);
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Save
-		//
-		this.entity = entity;
-		//
-		// Check if a brand new object and set the default
-		// pip type.
-		//
-		if (this.entity.getEntity().getPiptype() == null) {
-			this.entity.getEntity().setPiptype(JPAUtils.getPIPType(PIPType.TYPE_SQL));
-		}
-
-		//
-		// Initialize GUI components
-		//
-		this.initialize();
-		//
-		// Add components
-		//
-		this.grid.addComponent(this.comboType, 0, 0);
-		this.grid.addComponent(this.fieldName, 0, 1);
-		this.grid.addComponent(this.fieldIssuer, 0, 2);
-		this.grid.addComponent(this.areaDescription, 0, 3);
-		this.grid.addComponent(this.requiresResolvers, 0, 4);
-		this.grid.addComponent(this.paramField, 1, 0, 1, 4);
-		this.grid.addComponent(this.buttonSave, 0, 5, 1, 5);
-		//
-		// Bind and initialize
-		//
-		this.initializeFields();
-		//
-		// Post initialize
-		//
-		this.initializeButtons();
-		//
-		// Set focus
-		//
-		this.fieldName.focus();
-		//
-		// Initially call this to see if the entity is already
-		// saveable
-		//
-		this.formChanged();
-	}
-	
-	protected void initialize() {
-		//
-		//
-		//
-		this.fieldName.setImmediate(true);
-		this.fieldName.setNullRepresentation("");
-		this.fieldName.setRequired(true);
-		this.fieldName.setRequiredError("Enter a name for the configuration");
-		this.fieldName.setInputPrompt("Eg. \"Company LDAP Server\" or \"MySQL Customer DB\"");
-
-		this.fieldIssuer.setNullRepresentation("");
-		this.fieldIssuer.setRequired(false);
-		this.fieldIssuer.setInputPrompt("Eg. urn:com:sample:hr");
-		
-		this.areaDescription.setNullRepresentation("");
-		this.areaDescription.setRequired(false);
-		this.areaDescription.setInputPrompt("Optionally write a description for this configuration.");
-		this.areaDescription.setRows(3);
-		this.areaDescription.setWidth("100%");
-		//
-		//
-		//
-		this.requiresResolvers.setConverter(new Converter<Boolean, Object>() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public Object convertToModel(Boolean value,
-					Class<? extends Object> targetType, Locale locale)
-					throws Converter.ConversionException {
-				if (targetType.isAssignableFrom(java.lang.Character.class)) {
-					if (value) {
-						return '1';
-					} else {
-						return '0';
-					}
-				}
-				return null;
-			}
-
-			@Override
-			public Boolean convertToPresentation(Object value,
-					Class<? extends Boolean> targetType, Locale locale)
-					throws Converter.ConversionException {
-				if (value instanceof Character) {
-					return ((Character) value) == '1';
-				}
-				return null;
-			}
-
-			@Override
-			public Class<Object> getModelType() {
-				return Object.class;
-			}
-
-			@Override
-			public Class<Boolean> getPresentationType() {
-				return Boolean.class;
-			}
-		});
-		//
-		//
-		//
-		this.comboType.setContainerDataSource(((XacmlAdminUI)UI.getCurrent()).getPIPTypes());
-		this.comboType.setImmediate(true);
-		this.comboType.setConverter(new SingleSelectConverter<Object>(this.comboType));
-		this.comboType.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboType.setItemCaptionPropertyId("type");
-		this.comboType.setNullSelectionAllowed(false);
-		this.comboType.setRequired(true);
-		this.comboType.setRequiredError("You need to identify what type of configuration this is.");
-		//
-		//
-		//
-		this.paramField = new ConfigParamField(this.entity);
-		this.paramField.setValidationVisible(false);
-	}
-	
-	protected void initializeFields() {
-		//
-		// Now create our field group and bind our fields.
-		// This will populate the components with the
-		// current value if we are editing an entity.
-		//
-		this.fieldGroup = new FieldGroup(this.entity);
-		this.fieldGroup.bindMemberFields(this);
-		//
-		//
-		//
-		this.fieldName.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				self.formChanged();
-			}
-			
-		});
-		this.fieldName.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.formChanged();
-			}			
-		});
-		//
-		//
-		//
-		this.paramField.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.formChanged();
-			}			
-		});
-		//
-		// Only custom PIP configurations should be allowed to
-		// check the "requires resolvers" box. We know that the
-		// SQL/LDAP/HyperSQL/CSV resolver already do require resolvers.
-		//
-		if (this.entity.getEntity().getPiptype().isCustom() == false) {
-			this.requiresResolvers.setEnabled(false);
-		}
-		//
-		// Finish GUI intialization
-		//
-		if (this.entity.isPersistent()) {
-			//
-			// The user is editing something, don't let them change
-			// the type
-			//
-			this.comboType.setReadOnly(true);
-		}
-		this.comboType.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				//
-				// Get the new value
-				//
-				Object id = self.comboType.getValue();
-				EntityItem<PIPType> type = null;
-				if (id != null) {
-					type = ((XacmlAdminUI) UI.getCurrent()).getPIPTypes().getItem(id);
-				}
-				//
-				// Have our custom field reset itself
-				//
-				self.paramField.resetContent(type != null ? type.getEntity() : null);
-				//
-				// Do we need to display the requires resolver check box?
-				//
-				if (type != null && type.getEntity().isCustom()) {
-					self.requiresResolvers.setEnabled(true);
-					self.requiresResolvers.setRequired(true);
-					self.requiresResolvers.setValue(self.entity.getEntity().requiresResolvers());
-				} else {
-					self.requiresResolvers.setEnabled(false);
-					self.requiresResolvers.setRequired(false);
-				}
-				//
-				// Re-center the form
-				//
-				self.center();
-				//
-				// Check if we can enable the save button
-				//
-				self.formChanged();
-			}			
-		});
-	}
-		
-	protected void formChanged() {
-		if (this.fieldGroup.isValid() || this.entity.isModified()) {
-			this.buttonSave.setEnabled(true);
-		} else {
-			this.buttonSave.setEnabled(false);
-		}
-	}
-	
-	protected void initializeButtons() {
-		this.grid.setComponentAlignment(this.buttonSave, Alignment.BOTTOM_CENTER);
-		this.buttonSave.setImmediate(true);
-		this.buttonSave.setEnabled(false);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit changes
-					//
-					self.fieldGroup.commit();
-					//
-					// Save
-					//
-					self.isSaved = true;
-					//
-					// We can close
-					//
-					self.close();
-				} catch (CommitException e) {
-					logger.warn("Couldn't commit, the save button should NOT be enabled.");
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java
deleted file mode 100644
index e024d0e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPCustomResolverEditorWindow.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.VerticalLayout;
-
-public class PIPCustomResolverEditorWindow extends CustomComponent {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPCustomResolverEditorWindow() {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(false);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java
deleted file mode 100644
index 650ed09..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPImportWindow.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.Upload;
-import com.vaadin.ui.Upload.Receiver;
-import com.vaadin.ui.Upload.SucceededEvent;
-import com.vaadin.ui.Upload.SucceededListener;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PIPImportWindow extends Window implements Receiver, SucceededListener  {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-	private static final Log logger	= LogFactory.getLog(PolicyUploadWindow.class);
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Upload upload;
-
-	private static final long serialVersionUID = 1L;
-	private String filename = null;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPImportWindow() {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Set ourselves up
-		//
-		this.upload.addSucceededListener(this);
-		this.upload.setReceiver(this);
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// upload_1
-		upload = new Upload();
-		upload.setImmediate(false);
-		upload.setWidth("-1px");
-		upload.setHeight("-1px");
-		mainLayout.addComponent(upload);
-		
-		return mainLayout;
-	}
-
-	@Override
-	public void uploadSucceeded(SucceededEvent event) {
-		this.filename = event.getFilename();
-		this.close();
-	}
-
-	@Override
-	public OutputStream receiveUpload(String filename, String mimeType) {
-		//
-		// Try to create the output stream
-		//
-		try {
-			return new FileOutputStream(filename);
-		} catch (FileNotFoundException e) {
-			logger.error("Failed to create uploaded file", e);
-		}
-		return null;
-	}
-	
-	public String	getUploadedFile() {
-		return this.filename;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java
deleted file mode 100644
index 70942c2..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPParamEditorWindow.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.openaz.xacml.admin.jpa.PIPConfigParam;
-import org.apache.openaz.xacml.admin.jpa.PIPResolverParam;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PIPParamEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldValue;
-	@AutoGenerated
-	private TextField textFieldName;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final PIPParamEditorWindow self = this;
-	private final Object config;
-	private boolean isSaved = false;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPParamEditorWindow(Object config) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save parameters
-		//
-		this.config = config;
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// focus
-		//
-		this.textFieldName.focus();
-	}
-	
-	protected void initialize() {
-		//
-		// GUI properties
-		//
-		this.textFieldName.setImmediate(true);
-		this.textFieldName.setNullRepresentation("");
-		this.textFieldValue.setImmediate(true);
-		this.textFieldValue.setNullRepresentation("");
-		//
-		// Now setup based on the object
-		//
-		if (this.config instanceof PIPConfigParam) {
-			this.initializePIPConfiguration();
-		} else if (this.config instanceof PIPResolverParam) {
-			this.initializePIPResolver();
-		} else {
-			throw new IllegalArgumentException("Unknown object");
-		}
-		this.initializeButtons();
-		this.setupButtons();
-	}
-	
-	protected void initializePIPConfiguration() {
-		final PIPConfigParam param = (PIPConfigParam) this.config;
-		//
-		// setup the name
-		//
-		this.textFieldName.setValue(param.getParamName());	
-		this.textFieldName.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				param.setParamName(self.textFieldName.getValue());
-				self.setupButtons();
-			}
-		});
-		//
-		// setup the value
-		//
-		this.textFieldValue.setValue(param.getParamValue());	
-		this.textFieldValue.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				param.setParamValue(self.textFieldValue.getValue());
-				self.setupButtons();
-			}
-		});
-	}
-	
-	protected void initializePIPResolver() {
-		final PIPResolverParam param = (PIPResolverParam) this.config;
-		//
-		// setup the name
-		//
-		this.textFieldName.setValue(param.getParamName());	
-		this.textFieldName.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				param.setParamName(self.textFieldName.getValue());
-				self.setupButtons();
-			}
-		});
-		//
-		// setup the value
-		//
-		this.textFieldValue.setValue(param.getParamValue());	
-		this.textFieldValue.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				param.setParamValue(self.textFieldValue.getValue());
-				self.setupButtons();
-			}
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit the values
-					//
-					self.textFieldName.commit();
-					self.textFieldValue.commit();
-					//
-					// Done, save
-					//
-					self.isSaved = true;
-					//
-					// Close
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// Vaadin will display error
-					//
-				}
-			}
-		});
-	}
-	
-	protected void setupButtons() {
-		if (this.textFieldName.getValue() != null && this.textFieldValue.getValue() != null) {
-			this.buttonSave.setEnabled(true);
-		} else {
-			this.buttonSave.setEnabled(false);
-		}
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Object getParameter() {
-		return this.config;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldName
-		textFieldName = new TextField();
-		textFieldName.setCaption("Parameter Name");
-		textFieldName.setImmediate(false);
-		textFieldName.setWidth("-1px");
-		textFieldName.setHeight("-1px");
-		textFieldName.setInvalidAllowed(false);
-		textFieldName.setRequired(true);
-		mainLayout.addComponent(textFieldName);
-		
-		// textFieldValue
-		textFieldValue = new TextField();
-		textFieldValue.setCaption("Parameter Value");
-		textFieldValue.setImmediate(false);
-		textFieldValue.setWidth("-1px");
-		textFieldValue.setHeight("-1px");
-		textFieldValue.setInvalidAllowed(false);
-		textFieldValue.setRequired(true);
-		mainLayout.addComponent(textFieldValue);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java
deleted file mode 100644
index 530fddb..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPResolverEditorWindow.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.view.fields.ResolverParamField;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.fieldgroup.FieldGroup;
-import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
-import com.vaadin.data.fieldgroup.PropertyId;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.GridLayout;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.Window;
-
-public class PIPResolverEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPResolverEditorWindow.class);
-	private final PIPResolverEditorWindow self = this;
-	
-	private final EntityItem<PIPResolver> entity;
-	private FieldGroup fieldGroup;
-	private boolean isSaved = false;
-	private GridLayout grid = new GridLayout(2,4);
-	
-	@PropertyId("name")
-	TextField fieldName = new TextField("Name");
-	
-	@PropertyId("description")
-	TextArea areaDescription = new TextArea("Description");
-
-	@PropertyId("issuer")
-	TextField fieldIssuer = new TextField("Issuer");
-	
-	@PropertyId("pipresolverParams")
-	ResolverParamField paramField;
-	
-	Button	buttonSave = new Button("Save");
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPResolverEditorWindow(EntityItem<PIPResolver> entity) {
-		//
-		// Our base component
-		//
-		this.setContent(this.grid);
-		this.grid.setMargin(true);
-		this.grid.setSpacing(true);
-		//
-		// Save
-		//
-		this.entity = entity;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.initialize();
-		//
-		// Add components
-		//
-		this.grid.addComponent(this.fieldName, 0, 0);
-		this.grid.addComponent(this.fieldIssuer, 0, 1);
-		this.grid.addComponent(this.areaDescription, 0, 2);
-		this.grid.addComponent(this.paramField, 1, 0, 1, 2);
-		this.grid.addComponent(this.buttonSave, 0, 3, 1, 3);
-		//
-		// Bind and initialize
-		//
-		this.initializeFields();
-		//
-		// Post initialize
-		//
-		this.initializeButtons();
-		//
-		// Set focus
-		//
-		this.fieldName.focus();
-		//
-		// Initially call this to see if the entity is already
-		// saveable
-		//
-		this.formChanged();
-	}
-	
-	protected void initialize() {
-		//
-		//
-		//
-		this.fieldName.setImmediate(true);
-		this.fieldName.setNullRepresentation("");
-		this.fieldName.setRequired(true);
-		this.fieldName.setRequiredError("Enter a name for the resolver");
-		this.fieldName.setInputPrompt("Eg. \"Resolve employee type\"");
-
-		this.fieldIssuer.setNullRepresentation("");
-		this.fieldIssuer.setRequired(false);
-		this.fieldIssuer.setInputPrompt("Eg. urn:com:sample:hr");
-		
-		this.areaDescription.setNullRepresentation("");
-		this.areaDescription.setRequired(false);
-		this.areaDescription.setInputPrompt("Optionally write a description for this resolver.");
-		this.areaDescription.setRows(3);
-		this.areaDescription.setWidth("100%");
-		//
-		// Create our field
-		//
-		this.paramField = new ResolverParamField(this.entity);
-		//this.paramField.setValidationVisible(false);
-	}
-	
-	protected void initializeFields() {
-		//
-		// Now create our field group and bind our fields.
-		// This will populate the components with the
-		// current value if we are editing an entity.
-		//
-		this.fieldGroup = new FieldGroup(this.entity);
-		this.fieldGroup.bindMemberFields(this);
-		//
-		//
-		//
-		this.fieldName.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				self.formChanged();
-			}
-		});
-		//
-		//
-		//
-		this.paramField.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.formChanged();
-			}			
-		});
-	}
-
-	protected void formChanged() {
-		if (this.fieldGroup.isValid() || this.entity.isModified()) {
-			this.buttonSave.setEnabled(true);
-		} else {
-			this.buttonSave.setEnabled(false);
-		}
-	}
-	
-	protected void initializeButtons() {
-		this.grid.setComponentAlignment(this.buttonSave, Alignment.BOTTOM_CENTER);
-		this.buttonSave.setImmediate(true);
-		this.buttonSave.setEnabled(false);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit changes
-					//
-					self.fieldGroup.commit();
-					//
-					// Save
-					//
-					self.isSaved = true;
-					//
-					// We can close
-					//
-					self.close();
-				} catch (CommitException e) {
-					logger.warn("Couldn't commit, the save button should NOT be enabled.");
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java
deleted file mode 100644
index 2fb4a25..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PIPSQLResolverEditorWindow.java
+++ /dev/null
@@ -1,1199 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.AttributeDesignatorType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.jpa.Attribute;
-import org.apache.openaz.xacml.admin.jpa.PIPResolver;
-import org.apache.openaz.xacml.admin.jpa.PIPResolverParam;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.admin.util.XACMLConstants;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventListener;
-import org.apache.openaz.xacml.admin.view.events.FormChangedEventNotifier;
-import org.apache.openaz.xacml.api.XACML3;
-import org.apache.openaz.xacml.std.pip.engines.csv.ConfigurableCSVResolver;
-import org.apache.openaz.xacml.std.pip.engines.jdbc.ConfigurableJDBCResolver;
-import org.apache.openaz.xacml.std.pip.engines.ldap.ConfigurableLDAPResolver;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.util.BeanItem;
-import com.vaadin.data.util.BeanItemContainer;
-import com.vaadin.event.Action;
-import com.vaadin.event.Action.Handler;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window.CloseEvent;
-import com.vaadin.ui.Window.CloseListener;
-
-public class PIPSQLResolverEditorWindow extends CustomComponent implements FormChangedEventNotifier, Handler {
-	
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Table tableAttributes;
-
-	@AutoGenerated
-	private Table tableRequiredAttributes;
-
-	@AutoGenerated
-	private CheckBox checkBoxShortIds;
-
-	@AutoGenerated
-	private TextField textFieldFilter;
-
-	@AutoGenerated
-	private TextField textFieldBase;
-
-	@AutoGenerated
-	private TextArea textAreaSelect;
-
-	private final Action ADD_ATTRIBUTE = new Action("Add Attribute");
-	private final Action EDIT_ATTRIBUTE = new Action("Edit Attribute");
-	private final Action CLONE_ATTRIBUTE = new Action("Clone Attribute");
-	private final Action REMOVE_ATTRIBUTE = new Action("Remove Attribute");
-	
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	/**
-	 * 
-	 */
-	
-	protected class ResolverAttribute implements Serializable {
-		private static final long serialVersionUID = 1L;
-		String	identifier = null;
-		String	prefix = null;
-		PIPResolverParam	id = null;
-		PIPResolverParam	category = null;
-		PIPResolverParam	datatype = null;
-		PIPResolverParam	issuer = null;
-		PIPResolverParam	column = null;
-		
-		public ResolverAttribute(String prefix, String identifier) {
-			this.prefix = prefix;
-			this.identifier = identifier;
-		}
-		
-		public ResolverAttribute(String prefix, String identifier, ResolverAttribute target) {
-			this(prefix, identifier);
-			this.setId(target.getId());
-			this.setCategory(target.getCategory());
-			this.setDatatype(target.getDatatype());
-			this.setIssuer(target.getIssuer());
-			this.setColumn(target.getColumn());
-			this.setResolver(target.id.getPipresolver());
-		}
-
-		public String	getIdentifier() {
-			return this.identifier;
-		}
-		
-		public String	getId() {
-			if (this.id == null) {
-				return null;
-			}
-			return this.id.getParamValue();
-		}
-		
-		public String	getShortId() {
-			String id = this.getId();
-			if (id == null) {
-				return null;
-			}
-			return XACMLConstants.extractShortName(id);
-		}
-		
-		public PIPResolverParam getIdParam() {
-			return this.id;
-		}
-		
-		public void		setId(String id) {
-			if (this.id == null) {
-				this.id = new PIPResolverParam();
-				this.id.setParamName(this.prefix + this.identifier + ".id");
-			}
-			this.id.setParamValue(id);
-		}
-		
-		public void		setId(PIPResolverParam param) {
-			this.id = param;
-		}
-		
-		public String	getCategory() {
-			if (this.category == null) {
-				return null;
-			}
-			return this.category.getParamValue();
-		}
-		
-		public String	getShortCategory() {
-			String category = this.getCategory();
-			if (category == null) {
-				return null;
-			}
-			return XACMLConstants.extractShortName(category);
-		}
-		
-		public PIPResolverParam	getCategoryParam() {
-			return this.category;
-		}
-		
-		public void		setCategory(String category) {
-			if (this.category == null) {
-				this.category = new PIPResolverParam();
-				this.category.setParamName(this.prefix + this.identifier + ".category");
-			}
-			this.category.setParamValue(category);
-		}
-		
-		public void setCategory(PIPResolverParam param) {
-			this.category = param;
-		}
-		
-		public String	getDatatype() {
-			if (this.datatype == null) {
-				return null;
-			}
-			return this.datatype.getParamValue();
-		}
-		
-		public String	getShortDatatype() {
-			String dt = this.getDatatype();
-			if (dt == null) {
-				return null;
-			}
-			return XACMLConstants.extractShortName(dt);
-		}
-		
-		public PIPResolverParam getDatatypeParam() {
-			return this.datatype;
-		}
-		
-		public void		setDatatype(String datatype) {
-			if (this.datatype == null) {
-				this.datatype = new PIPResolverParam();
-				this.datatype.setParamName(this.prefix + this.identifier + ".datatype");
-			}
-			this.datatype.setParamValue(datatype);
-		}
-		
-		public void		setDatatype(PIPResolverParam param) {
-			this.datatype = param;
-		}
-		
-		public String	getIssuer() {
-			if (this.issuer == null) {
-				return null;
-			}
-			return this.issuer.getParamValue();
-		}
-		
-		public String	getShortIssuer() {
-			String issuer = this.getIssuer();
-			if (issuer == null) {
-				return null;
-			}
-			return XACMLConstants.extractShortName(issuer);
-		}
-		
-		public PIPResolverParam getIssuerParam() {
-			return this.issuer;
-		}
-		
-		public void		setIssuer(String issuer) {
-			if (this.issuer == null) {
-				this.issuer = new PIPResolverParam();
-				this.issuer.setParamName(this.prefix + this.identifier + ".issuer");
-			}
-			this.issuer.setParamValue(issuer);
-		}
-
-		public void		setIssuer(PIPResolverParam param) {
-			this.issuer = param;
-		}
-		
-		public Integer		getColumn() {
-			if (this.column == null) {
-				return null;
-			}
-			try {
-				return Integer.parseInt(this.column.getParamValue());
-			} catch (NumberFormatException e) {
-				logger.error("Failed to set column: " + e);
-				return null;
-			}
-		}
-		
-		public PIPResolverParam getColumnParam() {
-			return this.column;
-		}
-		
-		public void	setColumn(Integer col) {
-			if (this.column == null) {
-				this.column = new PIPResolverParam();
-				this.column.setParamName(this.prefix + this.identifier + "column");
-			}
-			this.column.setParamValue(col.toString());
-		}
-		
-		public void setColumn(PIPResolverParam param) {
-			this.column = param;
-		}
-
-		public void setResolver(PIPResolver resolver) {
-			if (this.id != null) {
-				this.id.setPipresolver(resolver);
-			}
-			if (this.category != null) {
-				this.category.setPipresolver(resolver);
-			}
-			if (this.datatype != null) {
-				this.datatype.setPipresolver(resolver);
-			}
-			if (this.issuer != null) {
-				this.issuer.setPipresolver(resolver);
-			}
-			if (this.column != null) {
-				this.column.setPipresolver(resolver);
-			}
-		}
-	}	
-	
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PIPSQLResolverEditorWindow.class);
-	private final PIPSQLResolverEditorWindow self = this;
-	private final EntityItem<PIPResolver> entity;
-	private final BeanItemContainer<ResolverAttribute> fieldsContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class);
-	private final BeanItemContainer<ResolverAttribute> parametersContainer = new BeanItemContainer<ResolverAttribute>(ResolverAttribute.class);
-	private final BasicNotifier notifier = new BasicNotifier();
-	boolean isSaved = false;
-	String fieldPrefix;
-	String parameterPrefix;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PIPSQLResolverEditorWindow(EntityItem<PIPResolver> entity) {
-		buildMainLayout();
-		setCompositionRoot(mainLayout);
-		//
-		// Save
-		//
-		this.entity = entity;
-		//
-		// Initialize
-		//
-		this.initialize();
-	}
-	
-	protected boolean isSQL() {
-		if (this.entity.getEntity().getPipconfiguration().getPiptype().isSQL() ||
-			this.entity.getEntity().getPipconfiguration().getPiptype().isHyperCSV()) {
-			return true;
-		}
-		return false;
-	}
-	
-	protected boolean isLDAP() {
-		return this.entity.getEntity().getPipconfiguration().getPiptype().isLDAP();
-	}
-	
-	protected boolean isCSV() {
-		return this.entity.getEntity().getPipconfiguration().getPiptype().isCSV();
-	}
-	
-	protected void initialize() {
-		//
-		// Initialize entity
-		//
-		this.initializeEntity();
-		//
-		// Go through the parameters, save them into a
-		// properties object.
-		//
-		boolean sourceInitialized = false;
-		boolean attributeInitialized = false;
-		for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) {
-			//
-			// Look for ones we know about
-			//
-			if (param.getParamName().equalsIgnoreCase("select")) {
-				this.textAreaSelect.setValue(param.getParamValue());
-				this.textAreaSelect.setData(param);
-			} else if (param.getParamName().equals("fields") || param.getParamName().equals("filter.view")) {
-				this.initializeSourceTable(param.getParamValue());
-				this.tableRequiredAttributes.setData(param);
-				sourceInitialized = true;
-			} else if (param.getParamName().equals("parameters") || param.getParamName().equals("filter.parameters")) {
-				this.initializeAttributeTable(param.getParamValue());
-				this.tableAttributes.setData(param);
-				attributeInitialized = true;
-			} else if (param.getParamName().equalsIgnoreCase("base")) {
-				this.textFieldBase.setValue(param.getParamValue());
-				this.textFieldBase.setData(param);
-			} else if (param.getParamName().equalsIgnoreCase("filter")) {
-				this.textFieldFilter.setValue(param.getParamValue());
-				this.textFieldFilter.setData(param);
-			}
-		}
-		//
-		// Initialize GUI
-		//
-		this.initializeText();
-		this.initializeCheckBox();
-		//
-		// Verify the tables get setup, if this is a new object
-		// then they haven't been.
-		//
-		if (sourceInitialized == false) {
-			this.initializeSourceTable("");
-		}
-		if (attributeInitialized == false) {
-			this.initializeAttributeTable("");
-		}
-	}
-	
-	protected void initializeEntity() {
-		//
-		// Make sure the classname is set correctly
-		//
-		if (this.isSQL()) {
-			//
-			//
-			//
-			this.fieldPrefix = "field.";
-			this.parameterPrefix = "parameter.";
-			this.entity.getEntity().setClassname(ConfigurableJDBCResolver.class.getCanonicalName());
-		} else if (this.isLDAP()) {
-			//
-			//
-			//
-			this.fieldPrefix = "filter.view.";
-			this.parameterPrefix = "filter.parameters.";
-			this.entity.getEntity().setClassname(ConfigurableLDAPResolver.class.getCanonicalName());
-		} else if (this.isCSV()) {
-			//
-			//
-			//
-			this.fieldPrefix = "field.";
-			this.parameterPrefix = "parameter.";
-			this.entity.getEntity().setClassname(ConfigurableCSVResolver.class.getCanonicalName());
-		}
-	}
-	
-	protected void initializeText() {
-		//
-		// Are we SQL or LDAP?
-		//
-		if (this.isSQL()) {
-			//
-			// Turn these off
-			//
-			this.textFieldBase.setRequired(false);
-			this.textFieldBase.setVisible(false);
-			this.textFieldFilter.setRequired(false);
-			this.textFieldFilter.setVisible(false);
-			//
-			// GUI properties
-			//
-			this.textAreaSelect.setImmediate(true);
-			//
-			// Respond to changes
-			//
-			this.textAreaSelect.addValueChangeListener(new ValueChangeListener() {
-				private static final long serialVersionUID = 1L;
-	
-				@Override
-				public void valueChange(ValueChangeEvent event) {
-					PIPResolverParam param = (PIPResolverParam) self.textAreaSelect.getData();
-					if (param == null) {
-						param = new PIPResolverParam();
-						param.setPipresolver(self.entity.getEntity());
-						param.setParamName("select");
-						self.entity.getEntity().addPipresolverParam(param);
-						self.textAreaSelect.setData(param);
-					}
-					param.setParamValue(self.textAreaSelect.getValue());
-					self.fireFormChangedEvent();
-				}			
-			});
-		} else if (this.isLDAP()) {
-			//
-			// Turn these off
-			//
-			this.textAreaSelect.setRequired(false);
-			this.textAreaSelect.setVisible(false);
-			//
-			//
-			//
-			this.textFieldBase.setImmediate(true);
-			this.textFieldBase.addValueChangeListener(new ValueChangeListener() {
-				private static final long serialVersionUID = 1L;
-				
-				@Override
-				public void valueChange(ValueChangeEvent event) {
-					PIPResolverParam param = (PIPResolverParam) self.textFieldBase.getData();
-					if (param == null) {
-						param = new PIPResolverParam();
-						param.setPipresolver(self.entity.getEntity());
-						param.setParamName("base");
-						self.entity.getEntity().addPipresolverParam(param);
-						self.textFieldBase.setData(param);
-					}
-					param.setParamValue(self.textFieldBase.getValue());
-					self.fireFormChangedEvent();
-				}			
-			});
-			//
-			//
-			//
-			this.textFieldFilter.setImmediate(true);
-			this.textFieldFilter.addValueChangeListener(new ValueChangeListener() {
-				private static final long serialVersionUID = 1L;
-				
-				@Override
-				public void valueChange(ValueChangeEvent event) {
-					PIPResolverParam param = (PIPResolverParam) self.textFieldFilter.getData();
-					if (param == null) {
-						param = new PIPResolverParam();
-						param.setPipresolver(self.entity.getEntity());
-						param.setParamName("filter");
-						self.entity.getEntity().addPipresolverParam(param);
-						self.textFieldFilter.setData(param);
-					}
-					param.setParamValue(self.textFieldFilter.getValue());
-					self.fireFormChangedEvent();
-				}			
-			});
-		} else if (this.isCSV()) {
-			//
-			// Turn these off
-			//
-			this.textAreaSelect.setRequired(false);
-			this.textAreaSelect.setVisible(false);
-			this.textFieldBase.setRequired(false);
-			this.textFieldBase.setVisible(false);
-			this.textFieldFilter.setRequired(false);
-			this.textFieldFilter.setVisible(false);
-		}
-	}
-	
-	protected void initializeCheckBox() {
-		this.checkBoxShortIds.setValue(true);
-		this.checkBoxShortIds.setImmediate(true);
-		this.checkBoxShortIds.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (self.checkBoxShortIds.getValue()) {
-					self.tableRequiredAttributes.setColumnCollapsed("id", true);
-					self.tableRequiredAttributes.setColumnCollapsed("category", true);
-					self.tableRequiredAttributes.setColumnCollapsed("datatype", true);
-					self.tableRequiredAttributes.setColumnCollapsed("shortId", false);
-					self.tableRequiredAttributes.setColumnCollapsed("shortCategory", false);
-					self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", false);
-				} else {
-					self.tableRequiredAttributes.setColumnCollapsed("id", false);
-					self.tableRequiredAttributes.setColumnCollapsed("category", false);
-					self.tableRequiredAttributes.setColumnCollapsed("datatype", false);
-					self.tableRequiredAttributes.setColumnCollapsed("shortId", true);
-					self.tableRequiredAttributes.setColumnCollapsed("shortCategory", true);
-					self.tableRequiredAttributes.setColumnCollapsed("shortDatatype", true);
-				}
-			}			
-		});
-	}
-	
-	protected void initializeSourceTable(String fields) {
-		//
-		// Add data into the container
-		//
-		this.populateData(this.fieldPrefix, fields, this.fieldsContainer);
-		//
-		// Set GUI properties
-		//
-		this.tableRequiredAttributes.setContainerDataSource(this.fieldsContainer);
-		this.tableRequiredAttributes.setPageLength((this.fieldsContainer.size() == 0 ? 3 : this.fieldsContainer.size() + 1));
-		this.tableRequiredAttributes.setSizeFull();
-		this.tableRequiredAttributes.setColumnCollapsingAllowed(true);
-		this.tableRequiredAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"});
-		this.tableRequiredAttributes.setColumnHeaders(new String[] {"Field", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"});
-		this.tableRequiredAttributes.setColumnCollapsed("id", true);
-		this.tableRequiredAttributes.setColumnCollapsed("category", true);
-		this.tableRequiredAttributes.setColumnCollapsed("datatype", true);
-		this.tableRequiredAttributes.setSelectable(true);
-		//
-		// Setup its handler
-		//
-		this.tableRequiredAttributes.addActionHandler(this);
-		//
-		// Respond to events
-		//
-		this.tableRequiredAttributes.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					Object id = event.getItemId();
-					if (id == null) {
-						//
-						// Really shouldn't get here
-						//
-						return;
-					}
-					BeanItem<ResolverAttribute> beanItem = self.fieldsContainer.getItem(id);
-					if (beanItem == null) {
-						//
-						// Again, shouldn't get here
-						//
-						return;
-					}
-					self.editAttribute(self.tableRequiredAttributes, beanItem.getBean());
-				}
-			}
-		});
-	}
-	
-	protected void initializeAttributeTable(String parameters) {
-		//
-		// Add data into the container
-		//
-		this.populateData(this.parameterPrefix, parameters, this.parametersContainer);
-		//
-		// setup gui properties
-		//
-		this.tableAttributes.setContainerDataSource(this.parametersContainer);
-		this.tableAttributes.setPageLength(this.parametersContainer.size() + 1);
-		this.tableAttributes.setSizeFull();
-		this.tableAttributes.setColumnCollapsingAllowed(true);
-		this.tableAttributes.setVisibleColumns(new Object[] {"identifier", "id", "category", "datatype", "shortId", "shortCategory", "shortDatatype"});
-		this.tableAttributes.setColumnHeaders(new String[] {"Position", "Attribute Id", "Category", "Data Type", "Attribute Id", "Category", "Data Type"});
-		this.tableAttributes.setColumnCollapsed("id", true);
-		this.tableAttributes.setColumnCollapsed("category", true);
-		this.tableAttributes.setColumnCollapsed("datatype", true);
-		this.tableAttributes.setSelectable(true);
-		//
-		// Setup its handler
-		//
-		this.tableAttributes.addActionHandler(this);
-		//
-		// Respond to events
-		//
-		this.tableAttributes.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					Object id = event.getItemId();
-					if (id == null) {
-						//
-						// Really shouldn't get here
-						//
-						return;
-					}
-					BeanItem<ResolverAttribute> beanItem = self.parametersContainer.getItem(id);
-					if (beanItem == null) {
-						//
-						// Again, shouldn't get here
-						//
-						return;
-					}
-					self.editAttribute(self.tableAttributes, beanItem.getBean());
-				}
-			}
-		});
-	}
-	
-	protected void populateData(String prefix, String list, BeanItemContainer<ResolverAttribute> container) {
-		for (String field : Splitter.on(',').trimResults().omitEmptyStrings().split(list)) {
-			//
-			// Create a bean for this field
-			//
-			ResolverAttribute bean = new ResolverAttribute(prefix, field);
-			//
-			// Now try to find the attribute information
-			//
-			for (PIPResolverParam param : this.entity.getEntity().getPipresolverParams()) {
-				if (param.getParamName().equals(prefix + field + ".id")) {
-					bean.setId(param);
-				} else if (param.getParamName().equals(prefix + field + ".category")) {
-					bean.setCategory(param);
-				} else if (param.getParamName().equals(prefix + field + ".datatype")) {
-					bean.setDatatype(param);
-				} else if (param.getParamName().equals(prefix + field + ".issuer")) {
-					bean.setIssuer(param);
-				} else if (param.getParamName().equals(prefix + field + ".column")) {
-					bean.setColumn(param);
-				}
-			}
-			container.addBean(bean);
-		}
-	}
-
-	@Override
-	public Action[] getActions(Object target, Object sender) {
-		if (target == null) {
-			return new Action[] {ADD_ATTRIBUTE};
-		}
-		return new Action[] {EDIT_ATTRIBUTE, CLONE_ATTRIBUTE, REMOVE_ATTRIBUTE};
-	}
-
-	@Override
-	public void handleAction(Action action, Object sender, Object target) {
-		if (action == ADD_ATTRIBUTE) {
-			if (sender.equals(this.tableRequiredAttributes)) {
-				this.editAttribute(self.tableRequiredAttributes, null);
-			} else {
-				this.editAttribute(self.tableAttributes, null);
-			}
-			return;
-		}
-		if (action == EDIT_ATTRIBUTE) {
-			assert target instanceof ResolverAttribute;
-			if (sender.equals(this.tableRequiredAttributes)) {
-				this.editAttribute(self.tableRequiredAttributes, (ResolverAttribute) target);
-			} else {
-				this.editAttribute(self.tableAttributes, (ResolverAttribute) target);
-			}
-			return;
-		}
-		if (action == CLONE_ATTRIBUTE) {
-			assert target instanceof ResolverAttribute;
-			try {
-				//
-				// Which table?
-				//
-				if (sender.equals(this.tableRequiredAttributes)) {
-					//
-					// Clone the attribute giving it a new
-					// field name.
-					//
-					ResolverAttribute clone = new ResolverAttribute(this.fieldPrefix, this.getNextField(), (ResolverAttribute) target);
-					//
-					// Add it to the container
-					//
-					this.fieldsContainer.addBean(clone);
-					//
-					// Reset the page length so we can see it and have room
-					// to add another.
-					//
-					this.tableRequiredAttributes.setPageLength(this.fieldsContainer.size() + 1);
-					//
-					// Select it
-					//
-					this.tableRequiredAttributes.select(clone);
-				} else {
-					//
-					// Clone the attribute giving it a new
-					// field name.
-					//
-					ResolverAttribute clone = new ResolverAttribute(this.parameterPrefix, this.getNextParameter(), (ResolverAttribute) target);
-					//
-					// Add it to the container
-					//
-					this.parametersContainer.addBean(clone);
-					//
-					// Reset the page length so we can see it and have room
-					// to add another.
-					//
-					this.tableAttributes.setPageLength(this.parametersContainer.size() + 1);
-					//
-					// Select it
-					//
-					this.tableAttributes.select(clone);
-				}
-				//
-				// We have changed
-				//
-				this.fireFormChangedEvent();
-			} catch (Exception e) {
-				logger.error("Failed to clone: " + e);
-			}
-			return;
-		}
-		if (action == REMOVE_ATTRIBUTE) {
-			assert target instanceof ResolverAttribute;
-			//
-			// Help method to remove the attribute
-			//
-			this.removeAttribute((ResolverAttribute) target);
-			//
-			// Which table?
-			//
-			if (sender.equals(this.tableRequiredAttributes)) {
-				//
-				// Now remove it from the table
-				//
-				this.tableRequiredAttributes.removeItem(target);
-			} else {
-				//
-				// Now remove it from the table
-				//
-				this.tableAttributes.removeItem(target);
-			}
-			//
-			// we have changed
-			//
-			this.fireFormChangedEvent();
-			return;
-		}
-	}
-
-	protected void removeAttribute(ResolverAttribute target) {
-		this.entity.getEntity().removePipresolverParam(target.getIdParam());
-		this.entity.getEntity().removePipresolverParam(target.getCategoryParam());
-		this.entity.getEntity().removePipresolverParam(target.getDatatypeParam());
-		this.entity.getEntity().removePipresolverParam(target.getIssuerParam());
-	}
-
-	protected void editAttribute(final Table table, final ResolverAttribute request) {
-		if (this.isCSV()) {
-			this.editCSVAttribute(table, request);
-		} else {
-			this.editResolverAttribute(table, request, null);
-		}
-	}
-	
-	protected void editCSVAttribute(final Table table, final ResolverAttribute request) {
-		assert this.isCSV();
-		//
-		// Prompt for the column
-		//
-		final ColumnSelectionWindow window = new ColumnSelectionWindow((request != null ? request.getColumn() : 0));
-		if (request == null) {
-			window.setCaption("Input the CSV Column for the new attribute");
-		} else {
-			window.setCaption("Edit the CSV Column for the attribute");
-		}
-		window.setModal(true);
-		window.center();
-		window.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent e) {
-				//
-				// Did the user save?
-				//
-				if (window.isSaved() == false) {
-					return;
-				}
-				//
-				// Save it if its not a new
-				//
-				if (request != null) {
-					request.setColumn(window.getColumn());
-				}
-				//
-				// Now we select the attribute, pass the column
-				// in case this is a brand new attribute. Yeah its messy.
-				//
-				self.editResolverAttribute(table, request, window.getColumn());
-			}
-		});
-		window.center();
-		UI.getCurrent().addWindow(window);
-	}
-
-	protected void editResolverAttribute(final Table table, final ResolverAttribute request, final Integer column) {
-		//
-		// Provide objects to the attribute selection window
-		//
-		AttributeDesignatorType designator = new AttributeDesignatorType();
-		if (request == null) {
-			designator.setAttributeId(XACML3.ID_SUBJECT_SUBJECT_ID.stringValue());
-			designator.setCategory(XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue());
-			designator.setDataType(XACML3.ID_DATATYPE_STRING.stringValue());
-			designator.setIssuer(this.entity.getEntity().getIssuer());
-		} else {
-			designator.setAttributeId(request.getId());
-			designator.setCategory(request.getCategory());
-			designator.setDataType(request.getDatatype());
-			designator.setIssuer(request.getIssuer());
-		}
-		//
-		// Have user select an attribute
-		//
-		final AttributeSelectionWindow selection = new AttributeSelectionWindow(null, designator);
-		selection.setModal(true);
-		selection.setCaption("Select Attribute");
-		selection.addCloseListener(new CloseListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void windowClose(CloseEvent event) {
-				//
-				// User click Save button?
-				//
-				if (selection.isSaved() == false) {
-					return;
-				}
-				//
-				// Yes - get the final attribute
-				//
-				Attribute attribute = selection.getAttribute();
-				//
-				// Is it a new one?
-				//
-				if (request == null) {
-					try {
-						//
-						// Create a new bean
-						//
-						ResolverAttribute bean = null;
-						if (table.equals(self.tableRequiredAttributes)) {
-							bean = new ResolverAttribute(self.fieldPrefix, self.getNextField());
-						} else {
-							bean = new ResolverAttribute(self.parameterPrefix, self.getNextParameter());
-						}
-						bean.setId(attribute.getXacmlId());
-						bean.setCategory(attribute.getCategoryBean().getXacmlId());
-						bean.setDatatype(attribute.getDatatypeBean().getXacmlId());
-						if (attribute.getIssuer() != null) {
-							bean.setIssuer(attribute.getIssuer());
-						}
-						if (column != null) {
-							bean.setColumn(column);
-						}
-						//
-						// Add it to the resolver
-						//
-						bean.setResolver(self.entity.getEntity());
-						self.entity.getEntity().addPipresolverParam(bean.getIdParam());
-						self.entity.getEntity().addPipresolverParam(bean.getCategoryParam());
-						self.entity.getEntity().addPipresolverParam(bean.getDatatypeParam());
-						if (bean.getIssuer() != null) {
-							self.entity.getEntity().addPipresolverParam(bean.getIssuerParam());
-						}
-						//
-						// Which table?
-						//
-						if (table.equals(self.tableRequiredAttributes)) {
-							//
-							// Add to table
-							//
-							self.fieldsContainer.addBean(bean);
-							//
-							// Reset the page length
-							//
-							self.tableRequiredAttributes.setPageLength(self.fieldsContainer.size() + 1);
-						} else if (table.equals(self.tableAttributes)) {
-							//
-							// Add to table
-							//
-							self.parametersContainer.addBean(bean);
-							//
-							// Reset the page length
-							//
-							self.tableAttributes.setPageLength(self.parametersContainer.size() + 1);
-						}
-						if (logger.isDebugEnabled()) {
-							logger.debug("Added new attribute: " + bean);
-						}
-					} catch (Exception e) {
-						logger.error(e);
-						AdminNotification.error("Unable to add another required attribute field");
-					}
-				} else {
-					//
-					// Update the table entry
-					//
-					request.setId(attribute.getXacmlId());
-					request.setCategory(attribute.getCategoryBean().getXacmlId());
-					request.setDatatype(attribute.getDatatypeBean().getXacmlId());
-					request.setIssuer(attribute.getIssuer());
-					//
-					// Let the table know
-					//
-					table.refreshRowCache();
-				}
-				//
-				// we have changed
-				//
-				self.fireFormChangedEvent();
-			}
-		});
-		selection.center();
-		UI.getCurrent().addWindow(selection);
-	}
-	
-	protected String	getNextField() throws Exception {
-		//
-		// Start at the next index number. NOTE: The GUI needs
-		// to use numbers to index the fields.
-		//
-		int index = this.tableRequiredAttributes.size() + 1;
-		//
-		// Really if we get to 100, that's an insane number of fields
-		// needed for a SQL query.
-		//
-		while (index < 100) {
-			String field = String.format("%02d", index);
-			boolean exists = false;
-			for (Object id : this.tableRequiredAttributes.getItemIds()) {
-				@SuppressWarnings("unchecked")
-				BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableRequiredAttributes.getItem(id);
-				if (required.getBean().getIdentifier().equals(field)) {
-					exists = true;
-					index++;
-					break;
-				}
-			}
-			if (exists == false) {
-				return field;
-			}
-		}
-		//
-		// Sanity check
-		//
-		throw new Exception("Unable to find a next field name. Are there too many fields?");
-	}
-	
-	protected String	getNextParameter() throws Exception {
-		//
-		// Start at the next index number. NOTE: The GUI needs
-		// to use numbers to index the fields.
-		//
-		int index = this.tableAttributes.size() + 1;
-		//
-		// Really if we get to 100, that's an insane number of fields
-		// needed for a SQL query.
-		//
-		while (index < 100) {
-			String field = String.format("%02d", index);
-			boolean exists = false;
-			for (Object id : this.tableAttributes.getItemIds()) {
-				@SuppressWarnings("unchecked")
-				BeanItem<ResolverAttribute> required = (BeanItem<ResolverAttribute>) this.tableAttributes.getItem(id);
-				if (required.getBean().getIdentifier().equals(field)) {
-					exists = true;
-					index++;
-					break;
-				}
-			}
-			if (exists == false) {
-				return field;
-			}
-		}
-		//
-		// Sanity check
-		//
-		throw new Exception("Unable to find a next parameter name. Are there too many parameters?");
-	}
-	
-	public void discard() throws SourceException {
-		if (this.isSQL()) {
-			this.textAreaSelect.discard();
-		} else if (this.isLDAP()) {
-			this.textFieldBase.discard();
-			this.textFieldFilter.discard();
-		// } else if (this.isCSV()) {
-		}
-	}
-	
-	public void validate() throws InvalidValueException {
-		if (this.isSQL()) {
-			this.textAreaSelect.validate();
-		} else if (this.isLDAP()) {
-			this.textFieldBase.validate();
-			this.textFieldFilter.validate();
-		//} else if (this.isCSV()) {
-			
-		}
-	}
-	
-	public void commit() throws SourceException, InvalidValueException {
-		//
-		// Commit required fields
-		//
-		if (this.isSQL()) {
-			this.textAreaSelect.commit();
-		} else if (this.isLDAP()) {
-			this.textFieldBase.commit();
-			this.textFieldFilter.commit();
-		// } else if (this.isCSV()) {
-		}
-		//
-		// Setup the fields
-		//
-		{
-			List<String> fields = new ArrayList<String>(this.fieldsContainer.size());
-			for (ResolverAttribute attribute : this.fieldsContainer.getItemIds()) {
-				fields.add(attribute.getIdentifier());
-			}
-			PIPResolverParam param = (PIPResolverParam) this.tableRequiredAttributes.getData();
-			if (param == null) {
-				param = new PIPResolverParam();
-				if (this.isSQL()) {
-					param.setParamName("fields");
-				} else if (this.isLDAP()) {
-					param.setParamName("filter.view");
-				} else if (this.isCSV()) {
-					param.setParamName("fields");
-				}
-				this.entity.getEntity().addPipresolverParam(param);
-				this.tableRequiredAttributes.setData(param);
-			}
-			param.setParamValue(Joiner.on(',').join(fields));
-		}
-		//
-		// Setup the parameters
-		//
-		{
-			List<String> parameters = new ArrayList<String>(this.parametersContainer.size());
-			for (ResolverAttribute attribute : this.parametersContainer.getItemIds()) {
-				parameters.add(attribute.getIdentifier());
-			}
-			PIPResolverParam param = (PIPResolverParam) this.tableAttributes.getData();
-			if (param == null) {
-				param = new PIPResolverParam();
-				if (this.isSQL()) {
-					param.setParamName("parameters");
-				} else if (this.isLDAP()) {
-					param.setParamName("filter.parameters");
-				} else if (this.isCSV()) {
-					param.setParamName("parameters");
-				}
-				this.entity.getEntity().addPipresolverParam(param);
-				this.tableAttributes.setData(param);
-			}
-			param.setParamValue(Joiner.on(',').join(parameters));
-		}
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	@Override
-	public boolean addListener(FormChangedEventListener listener) {
-		return this.notifier.addListener(listener);
-	}
-
-	@Override
-	public boolean removeListener(FormChangedEventListener listener) {
-		return this.notifier.removeListener(listener);
-	}
-
-	@Override
-	public void fireFormChangedEvent() {
-		this.notifier.fireFormChangedEvent();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textAreaSelect
-		textAreaSelect = new TextArea();
-		textAreaSelect.setCaption("SQL Select Statement");
-		textAreaSelect.setImmediate(false);
-		textAreaSelect.setWidth("100.0%");
-		textAreaSelect.setHeight("-1px");
-		textAreaSelect.setInvalidAllowed(false);
-		textAreaSelect.setRequired(true);
-		mainLayout.addComponent(textAreaSelect);
-		mainLayout.setExpandRatio(textAreaSelect, 1.0f);
-		
-		// textFieldBase
-		textFieldBase = new TextField();
-		textFieldBase.setCaption("Base DN");
-		textFieldBase.setImmediate(false);
-		textFieldBase.setWidth("-1px");
-		textFieldBase.setHeight("-1px");
-		mainLayout.addComponent(textFieldBase);
-		
-		// textFieldFilter
-		textFieldFilter = new TextField();
-		textFieldFilter.setCaption("Filter");
-		textFieldFilter.setImmediate(false);
-		textFieldFilter.setWidth("-1px");
-		textFieldFilter.setHeight("-1px");
-		mainLayout.addComponent(textFieldFilter);
-		
-		// checkBoxShortIds
-		checkBoxShortIds = new CheckBox();
-		checkBoxShortIds.setCaption("Display short id’s.");
-		checkBoxShortIds.setImmediate(false);
-		checkBoxShortIds.setWidth("-1px");
-		checkBoxShortIds.setHeight("-1px");
-		mainLayout.addComponent(checkBoxShortIds);
-		
-		// tableRequiredAttributes
-		tableRequiredAttributes = new Table();
-		tableRequiredAttributes.setCaption("Attributes Returned");
-		tableRequiredAttributes.setImmediate(false);
-		tableRequiredAttributes.setWidth("-1px");
-		tableRequiredAttributes.setHeight("-1px");
-		mainLayout.addComponent(tableRequiredAttributes);
-		
-		// tableAttributes
-		tableAttributes = new Table();
-		tableAttributes.setCaption("Parameters - Attributes Needed (i.e. ?)");
-		tableAttributes.setImmediate(false);
-		tableAttributes.setWidth("-1px");
-		tableAttributes.setHeight("-1px");
-		tableAttributes.setInvalidAllowed(false);
-		tableAttributes.setRequired(true);
-		mainLayout.addComponent(tableAttributes);
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java
deleted file mode 100644
index f9d70c8..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyEditorWindow.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.RegexpValidator;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.ListSelect;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PolicyEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextArea textAreaDescription;
-	@AutoGenerated
-	private ListSelect listSelectAlgorithm;
-	@AutoGenerated
-	private TextField textFieldVersion;
-	@AutoGenerated
-	private Label labelID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final PolicyEditorWindow self = this;
-	private final PolicyType policy;
-	private JPAContainer<RuleAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getRuleAlgorithms();
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PolicyEditorWindow(PolicyType policy) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.policy = policy;
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeLabel();
-		this.initializeText();
-		this.initializeSelect();
-		this.initializeButton();
-		//
-		// Focus
-		//
-		this.textAreaDescription.focus();
-	}
-	
-	protected void initializeLabel() {
-		if (this.policy.getPolicyId() == null) {
-			this.policy.setPolicyId(((XacmlAdminUI)UI.getCurrent()).newPolicyID());
-		}
-		this.labelID.setValue(this.policy.getPolicyId());
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textAreaDescription.setNullRepresentation("");
-		this.textAreaDescription.setValue(this.policy.getDescription());
-		//
-		//
-		//
-		if (this.policy.getVersion() == null) {
-			this.policy.setVersion("1");
-		}
-		this.textFieldVersion.setRequiredError("The exact format is: ((\\d+|\\*)\\.)*(\\d+|\\*|\\+)");
-		this.textFieldVersion.addValidator(new RegexpValidator("((\\d+|\\*)\\.)*(\\d+|\\*|\\+)", true, "The version MUST a number optionally separated by '.' eg. 1 or 1.0 or 1.1.1 etc."));
-		this.textFieldVersion.setValue(this.policy.getVersion());
-	}
-	
-	protected void initializeSelect() {
-		this.listSelectAlgorithm.setContainerDataSource(this.algorithms);
-		this.listSelectAlgorithm.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.listSelectAlgorithm.setItemCaptionPropertyId("xacmlId");
-		this.listSelectAlgorithm.setNullSelectionAllowed(false);
-		
-		if (this.policy.getRuleCombiningAlgId() == null) {
-			this.policy.setRuleCombiningAlgId(XACML3.ID_RULE_FIRST_APPLICABLE.stringValue());
-		}
-		this.listSelectAlgorithm.setValue(JPAUtils.findRuleAlgorithm(this.policy.getRuleCombiningAlgId()).getId());
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.listSelectAlgorithm.commit();
-					self.textFieldVersion.commit();
-					self.textAreaDescription.commit();
-					//
-					// Save everything
-					//
-					self.policy.setDescription(self.textAreaDescription.getValue());
-					self.policy.setVersion(self.textFieldVersion.getValue());
-					Object id = self.listSelectAlgorithm.getValue();
-					self.policy.setRuleCombiningAlgId(algorithms.getItem(id).getEntity().getXacmlId());
-					//
-					// Mark ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// VAADIN will show the required error message to the user
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public PolicyType getPolicySet() {
-		return this.policy;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// labelID
-		labelID = new Label();
-		labelID.setCaption("Policy Set ID");
-		labelID.setImmediate(false);
-		labelID.setWidth("100.0%");
-		labelID.setHeight("-1px");
-		labelID.setValue("Label");
-		mainLayout.addComponent(labelID);
-		
-		// textFieldVersion
-		textFieldVersion = new TextField();
-		textFieldVersion.setCaption("Version");
-		textFieldVersion.setImmediate(false);
-		textFieldVersion
-				.setDescription("The format is numbers only separated by decimal point.");
-		textFieldVersion.setWidth("-1px");
-		textFieldVersion.setHeight("-1px");
-		textFieldVersion.setInvalidAllowed(false);
-		textFieldVersion.setRequired(true);
-		textFieldVersion.setInputPrompt("Eg. 1 or 1.0 or 1.0.0 etc.");
-		mainLayout.addComponent(textFieldVersion);
-		
-		// listSelectAlgorithm
-		listSelectAlgorithm = new ListSelect();
-		listSelectAlgorithm.setCaption("Policy Combining Algorithm");
-		listSelectAlgorithm.setImmediate(false);
-		listSelectAlgorithm.setWidth("100.0%");
-		listSelectAlgorithm.setHeight("-1px");
-		listSelectAlgorithm.setInvalidAllowed(false);
-		listSelectAlgorithm.setRequired(true);
-		mainLayout.addComponent(listSelectAlgorithm);
-		
-		// textAreaDescription
-		textAreaDescription = new TextArea();
-		textAreaDescription.setCaption("Description");
-		textAreaDescription.setImmediate(false);
-		textAreaDescription.setWidth("100.0%");
-		textAreaDescription.setHeight("-1px");
-		mainLayout.addComponent(textAreaDescription);
-		mainLayout.setExpandRatio(textAreaDescription, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java
deleted file mode 100644
index 73149cc..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyNameEditorWindow.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-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 oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms;
-import org.apache.openaz.xacml.admin.jpa.RuleAlgorithms;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.JPAContainerItem;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ComboBox;
-import com.vaadin.ui.FormLayout;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.Window;
-
-public class PolicyNameEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(PolicyNameEditorWindow.class);
-	private final PolicyNameEditorWindow self = this;
-	private Object data = null;
-	private String filename = null;
-	private boolean isSaved = false;
-	
-	@AutoGenerated
-	private FormLayout mainLayout;
-	@AutoGenerated
-	private ComboBox comboAlgorithms;
-	@AutoGenerated
-	private OptionGroup optionPolicySet;
-	@AutoGenerated
-	private TextArea textAreaDescription;
-	@AutoGenerated
-	private TextField textFieldPolicyName;
-	@AutoGenerated
-	private Button buttonSave;
-	
-	JPAContainer<PolicyAlgorithms> policyAlgorithms;
-	JPAContainer<RuleAlgorithms> ruleAlgorithms;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PolicyNameEditorWindow(String filename, Object policyData, JPAContainer<PolicyAlgorithms> policyAlgs, JPAContainer<RuleAlgorithms> ruleAlgs) {
-		buildMainLayout();
-		setContent(mainLayout);
-		
-		this.mainLayout.setMargin(true);
-
-		this.filename = filename;
-		this.data = policyData;
-		this.policyAlgorithms = policyAlgs;
-		this.ruleAlgorithms = ruleAlgs;
-		
-		this.optionPolicySet.addItem("Policy Set");
-		this.optionPolicySet.addItem("Policy");
-
-		this.comboAlgorithms.setNewItemsAllowed(false);
-		this.comboAlgorithms.setNullSelectionAllowed(false);
-		this.comboAlgorithms.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.comboAlgorithms.setItemCaptionPropertyId("xacmlId");
-		//
-		// Setup the policy filename
-		//
-		this.textFieldPolicyName.setImmediate(true);
-		this.textFieldPolicyName.setNullRepresentation("");
-		if (filename != null) {
-			this.textFieldPolicyName.setValue(filename);
-		}
-		this.textFieldPolicyName.addValidator(new Validator() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void validate(Object value) throws InvalidValueException {
-				if (value instanceof String) {
-					String filename = (String) value;
-					if (filename.endsWith(".xml")) {
-						filename = filename.substring(0, filename.length() - 4);
-					}
-					if (filename.length() == 0) {
-						throw new InvalidValueException("Invalid filename.");
-					}
-					if (filename.indexOf('.') != -1) {
-						throw new InvalidValueException("Please do not use a \'.\' in the filename.");
-					}
-				}
-			}
-			
-		});
-		this.textFieldPolicyName.setValidationVisible(true);
-		//
-		// Are we editing or creating?
-		//
-		if (this.data != null) {
-			//
-			// We are editing
-			//
-			if (this.data instanceof PolicySetType) {
-				this.optionPolicySet.setValue("Policy Set");
-				this.optionPolicySet.setVisible(false);
-				this.textAreaDescription.setValue(((PolicySetType)this.data).getDescription());
-				this.comboAlgorithms.setContainerDataSource(policyAlgs);
-				for (Object object : this.policyAlgorithms.getItemIds()) {
-					PolicyAlgorithms a = (PolicyAlgorithms) this.policyAlgorithms.getItem(object).getEntity();
-					if (a.getXacmlId().equals(((PolicySetType)this.data).getPolicyCombiningAlgId())) {
-						this.comboAlgorithms.select(object);
-						break;
-					}
-				}
-			}
-			if (this.data instanceof PolicyType) {
-				this.optionPolicySet.setValue("Policy");
-				this.optionPolicySet.setVisible(false);
-				this.textAreaDescription.setValue(((PolicyType)this.data).getDescription());
-				this.comboAlgorithms.setContainerDataSource(ruleAlgs);
-				for (Object object : this.ruleAlgorithms.getItemIds()) {
-					RuleAlgorithms a = (RuleAlgorithms) this.ruleAlgorithms.getItem(object).getEntity();
-					if (a.getXacmlId().equals(((PolicyType)this.data).getRuleCombiningAlgId())) {
-						this.comboAlgorithms.select(object);
-						break;
-					}
-				}
-			}
-		} else {
-			//
-			// Creating a new policy
-			//
-			this.optionPolicySet.setValue("Policy Set");
-			this.comboAlgorithms.setContainerDataSource(policyAlgs);
-			this.comboAlgorithms.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-			this.comboAlgorithms.setItemCaptionPropertyId("xacmlId");
-			for (Object object : this.policyAlgorithms.getItemIds()) {
-				PolicyAlgorithms a = (PolicyAlgorithms) this.policyAlgorithms.getItem(object).getEntity();
-				if (a.getXacmlId().equals(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue())) {
-					this.comboAlgorithms.select(object);
-					break;
-				}
-			}
-			
-			this.optionPolicySet.addValueChangeListener(new ValueChangeListener() {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public void valueChange(ValueChangeEvent event) {
-					if (self.optionPolicySet.getValue().toString().equals("Policy Set")) {
-						self.comboAlgorithms.setContainerDataSource(self.policyAlgorithms);
-						for (Object object : self.policyAlgorithms.getItemIds()) {
-							PolicyAlgorithms a = (PolicyAlgorithms) self.policyAlgorithms.getItem(object).getEntity();
-							if (a.getXacmlId().equals(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue())) {
-								self.comboAlgorithms.select(object);
-								break;
-							}
-						}
-					} else if (self.optionPolicySet.getValue().toString().equals("Policy")) {
-						self.comboAlgorithms.setContainerDataSource(self.ruleAlgorithms);
-						for (Object object : self.ruleAlgorithms.getItemIds()) {
-							RuleAlgorithms a = (RuleAlgorithms) self.ruleAlgorithms.getItem(object).getEntity();
-							if (a.getXacmlId().equals(XACML3.ID_RULE_FIRST_APPLICABLE.stringValue())) {
-								self.comboAlgorithms.select(object);
-								break;
-							}
-						}
-					}					
-				}
-				
-			});
-		}
-
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Make sure the policy filename was valid
-				//
-				if (self.textFieldPolicyName.isValid() == false) {
-					return;
-				}
-				//
-				// Grab the filename (NOTE: The user may or may not
-				// have changed the name).
-				//
-				self.filename = self.textFieldPolicyName.getValue();
-				//
-				// Make sure the filename ends with an extension
-				//
-				if (self.filename.endsWith(".xml") == false) {
-					self.filename = self.filename + ".xml";
-				}
-				//
-				// Set ourselves as saved
-				//
-				self.isSaved = true;
-				//
-				// Now grab the policy file's data
-				//
-				if (self.data == null) {
-					//
-					// This is a brand new Policy
-					//
-					if (self.optionPolicySet.getValue().toString().equals("Policy Set")) {
-						PolicySetType policySet = new PolicySetType();
-						policySet.setVersion("1");
-						policySet.setPolicySetId(((XacmlAdminUI)getUI()).newPolicyID());
-						policySet.setTarget(new TargetType());
-						self.data = policySet;
-					} else if (self.optionPolicySet.getValue().toString().equals("Policy")) {
-						PolicyType policy = new PolicyType();
-						policy.setVersion("1");
-						policy.setPolicyId(((XacmlAdminUI)getUI()).newPolicyID());
-						policy.setTarget(new TargetType());
-						self.data = policy;
-					} else {
-						logger.error("Policy option NOT setup correctly.");
-					}
-				}
-				if (self.data != null) {
-					//
-					// Save off everything
-					//
-					if (self.data instanceof PolicySetType) {
-						((PolicySetType)self.data).setDescription(self.textAreaDescription.getValue());
-						Object a = self.comboAlgorithms.getValue();
-						PolicyAlgorithms alg = (PolicyAlgorithms) ((JPAContainerItem<?>)self.comboAlgorithms.getItem(a)).getEntity();
-						((PolicySetType)self.data).setPolicyCombiningAlgId(alg.getXacmlId());
-					} else if (self.data instanceof PolicyType) {
-						((PolicyType)self.data).setDescription(self.textAreaDescription.getValue());
-						Object a = self.comboAlgorithms.getValue();
-						RuleAlgorithms alg = (RuleAlgorithms) ((JPAContainerItem<?>)self.comboAlgorithms.getItem(a)).getEntity();
-						((PolicyType)self.data).setRuleCombiningAlgId(alg.getXacmlId());
-					} else {
-						logger.error("Unsupported data object." + self.data.getClass().getCanonicalName());
-					}
-				}
-				//
-				// Now we can close the window
-				//
-				self.close();
-			}
-		});
-		
-		this.textFieldPolicyName.focus();
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Object getPolicyData() {
-		if (this.isSaved) {
-			return this.data;
-		}
-		return null;
-	}
-	
-	public String getPolicyFilename() {
-		if (this.isSaved) {
-			return this.filename;
-		}
-		return null;
-	}
-
-	@AutoGenerated
-	private FormLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new FormLayout();
-		mainLayout.setImmediate(false);
-		
-		// textFieldPolicyName
-		textFieldPolicyName = new TextField();
-		textFieldPolicyName.setCaption("Policy File Name");
-		textFieldPolicyName.setImmediate(true);
-		textFieldPolicyName.setWidth("-1px");
-		textFieldPolicyName.setHeight("-1px");
-		textFieldPolicyName.setInputPrompt("Enter filename eg. foobar.xml");
-		textFieldPolicyName.setRequired(true);
-		mainLayout.addComponent(textFieldPolicyName);
-		
-		// textAreaDescription
-		textAreaDescription = new TextArea();
-		textAreaDescription.setCaption("Description");
-		textAreaDescription.setImmediate(false);
-		textAreaDescription.setWidth("100%");
-		textAreaDescription.setHeight("-1px");
-		textAreaDescription
-				.setInputPrompt("Enter a description for the Policy/PolicySet.");
-		textAreaDescription.setNullSettingAllowed(true);
-		mainLayout.addComponent(textAreaDescription);
-		
-		// optionPolicySet
-		optionPolicySet = new OptionGroup();
-		optionPolicySet.setCaption("Policy or PolicySet?");
-		optionPolicySet.setImmediate(true);
-		optionPolicySet
-				.setDescription("Is the root level a Policy or Policy Set.");
-		optionPolicySet.setWidth("-1px");
-		optionPolicySet.setHeight("-1px");
-		optionPolicySet.setRequired(true);
-		mainLayout.addComponent(optionPolicySet);
-		
-		// comboAlgorithms
-		comboAlgorithms = new ComboBox();
-		comboAlgorithms.setCaption("Combining Algorithm");
-		comboAlgorithms.setImmediate(false);
-		comboAlgorithms.setDescription("Select the combining algorithm.");
-		comboAlgorithms.setWidth("-1px");
-		comboAlgorithms.setHeight("-1px");
-		comboAlgorithms.setRequired(true);
-		mainLayout.addComponent(comboAlgorithms);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java
deleted file mode 100644
index af2ae20..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicySetEditorWindow.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms;
-import org.apache.openaz.xacml.admin.util.JPAUtils;
-import org.apache.openaz.xacml.api.XACML3;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.RegexpValidator;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.ListSelect;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PolicySetEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextArea textAreaDescription;
-	@AutoGenerated
-	private ListSelect listSelectAlgorithm;
-	@AutoGenerated
-	private TextField textFieldVersion;
-	@AutoGenerated
-	private Label labelID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final PolicySetEditorWindow self = this;
-	private final PolicySetType policySet;
-	private JPAContainer<PolicyAlgorithms> algorithms = ((XacmlAdminUI)UI.getCurrent()).getPolicyAlgorithms();
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PolicySetEditorWindow(PolicySetType policySet) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.policySet = policySet;
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize GUI
-		//
-		this.initializeLabel();
-		this.initializeText();
-		this.initializeSelect();
-		this.initializeButton();
-		//
-		// Focus
-		//
-		this.textAreaDescription.focus();
-	}
-	
-	protected void initializeLabel() {
-		if (this.policySet.getPolicySetId() == null) {
-			this.policySet.setPolicySetId(((XacmlAdminUI)UI.getCurrent()).newPolicyID());
-		}
-		this.labelID.setValue(this.policySet.getPolicySetId());
-	}
-	
-	protected void initializeText() {
-		//
-		//
-		//
-		this.textAreaDescription.setNullRepresentation("");
-		this.textAreaDescription.setValue(this.policySet.getDescription());
-		//
-		//
-		//
-		if (this.policySet.getVersion() == null) {
-			this.policySet.setVersion("1");
-		}
-		this.textFieldVersion.setRequiredError("The exact format is: ((\\d+|\\*)\\.)*(\\d+|\\*|\\+)");
-		this.textFieldVersion.addValidator(new RegexpValidator("((\\d+|\\*)\\.)*(\\d+|\\*|\\+)", true, "The version MUST a number optionally separated by '.' eg. 1 or 1.0 or 1.1.1 etc."));
-		this.textFieldVersion.setValue(this.policySet.getVersion());
-	}
-	
-	protected void initializeSelect() {
-		this.listSelectAlgorithm.setContainerDataSource(this.algorithms);
-		this.listSelectAlgorithm.setItemCaptionMode(ItemCaptionMode.PROPERTY);
-		this.listSelectAlgorithm.setItemCaptionPropertyId("xacmlId");
-		this.listSelectAlgorithm.setNullSelectionAllowed(false);
-		
-		if (this.policySet.getPolicyCombiningAlgId() == null) {
-			this.policySet.setPolicyCombiningAlgId(XACML3.ID_POLICY_FIRST_APPLICABLE.stringValue());
-		}
-		this.listSelectAlgorithm.setValue(JPAUtils.findPolicyAlgorithm(this.policySet.getPolicyCombiningAlgId()).getId());
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.listSelectAlgorithm.commit();
-					self.textFieldVersion.commit();
-					self.textAreaDescription.commit();
-					//
-					// Save everything
-					//
-					self.policySet.setDescription(self.textAreaDescription.getValue());
-					self.policySet.setVersion(self.textFieldVersion.getValue());
-					Object id = self.listSelectAlgorithm.getValue();
-					self.policySet.setPolicyCombiningAlgId(algorithms.getItem(id).getEntity().getXacmlId());
-					//
-					// Mark ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// VAADIN will show the required error message to the user
-					//
-				}
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public PolicySetType getPolicySet() {
-		return this.policySet;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// labelID
-		labelID = new Label();
-		labelID.setCaption("Policy Set ID");
-		labelID.setImmediate(false);
-		labelID.setWidth("100.0%");
-		labelID.setHeight("-1px");
-		labelID.setValue("Label");
-		mainLayout.addComponent(labelID);
-		
-		// textFieldVersion
-		textFieldVersion = new TextField();
-		textFieldVersion.setCaption("Version");
-		textFieldVersion.setImmediate(false);
-		textFieldVersion
-				.setDescription("The format is numbers only separated by decimal point.");
-		textFieldVersion.setWidth("-1px");
-		textFieldVersion.setHeight("-1px");
-		textFieldVersion.setInvalidAllowed(false);
-		textFieldVersion.setRequired(true);
-		textFieldVersion.setInputPrompt("Eg. 1 or 1.0 or 1.0.0 etc.");
-		mainLayout.addComponent(textFieldVersion);
-		
-		// listSelectAlgorithm
-		listSelectAlgorithm = new ListSelect();
-		listSelectAlgorithm.setCaption("Policy Combining Algorithm");
-		listSelectAlgorithm.setImmediate(false);
-		listSelectAlgorithm.setWidth("100.0%");
-		listSelectAlgorithm.setHeight("-1px");
-		listSelectAlgorithm.setInvalidAllowed(false);
-		listSelectAlgorithm.setRequired(true);
-		mainLayout.addComponent(listSelectAlgorithm);
-		
-		// textAreaDescription
-		textAreaDescription = new TextArea();
-		textAreaDescription.setCaption("Description");
-		textAreaDescription.setImmediate(false);
-		textAreaDescription.setWidth("100.0%");
-		textAreaDescription.setHeight("-1px");
-		mainLayout.addComponent(textAreaDescription);
-		mainLayout.setExpandRatio(textAreaDescription, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java
deleted file mode 100644
index 06afe28..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/PolicyUploadWindow.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.Upload;
-import com.vaadin.ui.Upload.Receiver;
-import com.vaadin.ui.Upload.SucceededEvent;
-import com.vaadin.ui.Upload.SucceededListener;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class PolicyUploadWindow extends Window implements Receiver, SucceededListener {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private CheckBox checkBoxImportAdvice;
-	@AutoGenerated
-	private CheckBox checkBoxImportObligations;
-	@AutoGenerated
-	private CheckBox checkBoxIgnoreStandard;
-	@AutoGenerated
-	private CheckBox checkBoxImportAttributes;
-	@AutoGenerated
-	private Upload upload;
-	private static final long serialVersionUID = 1L;
-	private final PolicyUploadWindow self = this;
-	private static final Log logger	= LogFactory.getLog(PolicyUploadWindow.class);
-	private Path directory = null;
-	private Path newfile = null;
-	private boolean succeeded = false;
-
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public PolicyUploadWindow(Path directory) {
-		buildMainLayout();
-		//
-		// Create our main layout
-		//
-		this.setContent(mainLayout);
-		//
-		// Finish setting up the main layout
-		//
-		this.mainLayout.setSpacing(true);
-		this.mainLayout.setMargin(true);
-		
-		this.checkBoxImportAdvice.setValue(true);
-		this.checkBoxIgnoreStandard.setValue(true);
-		this.checkBoxImportAttributes.setValue(true);
-		this.checkBoxImportObligations.setValue(true);
-		
-		this.directory = directory;
-
-		this.upload.addSucceededListener(this);
-		this.upload.setReceiver(this);
-		
-		this.checkBoxImportAttributes.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (self.checkBoxImportAttributes.getValue()) {
-					self.checkBoxIgnoreStandard.setEnabled(true);
-				} else {
-					self.checkBoxIgnoreStandard.setEnabled(false);
-				}
-			}
-			
-		});
-	}
-	
-	@Override
-	public OutputStream receiveUpload(String filename, String mimeType) {
-		//
-		// Validate the mime type
-		//
-		if (! mimeType.equalsIgnoreCase("text/xml")) {
-			return null;
-		}
-		//
-		// Create its new full path
-		//
-		this.newfile = Paths.get(self.directory.toString(), filename);
-		//
-		// Does it already exist?
-		//
-		if (Files.exists(this.newfile)) {
-			//
-			// TODO Prompt them to overwrite and/or bump the version???
-			//
-			return null;
-		}
-		//
-		// Try to create the output stream
-		//
-		try {
-			return new FileOutputStream(this.newfile.toFile());
-		} catch (FileNotFoundException e) {
-			logger.error("Failed to create uploaded file", e);
-		}
-		return null;
-	}
-	
-	@Override
-	public void uploadSucceeded(SucceededEvent event) {
-		if (logger.isDebugEnabled()) {
-			logger.debug("upload succeeded");
-		}
-		this.succeeded = true;
-		this.close();
-	}
-
-	public Path	getUploadedFile() {
-		if (this.succeeded) {
-			return this.newfile;
-		}
-		return null;
-	}
-	
-	public boolean importAttributes() {
-		return this.checkBoxImportAttributes.getValue();
-	}
-	
-	public boolean importObligations() {
-		return this.checkBoxImportObligations.getValue();
-	}
-	
-	public boolean importAdvice() {
-		return this.checkBoxImportAdvice.getValue();
-	}
-	
-	public boolean ignoreStandard() {
-		return this.checkBoxIgnoreStandard.getValue();
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// upload
-		upload = new Upload();
-		upload.setCaption("Upload Xacml Policy File");
-		upload.setImmediate(false);
-		upload.setWidth("-1px");
-		upload.setHeight("-1px");
-		mainLayout.addComponent(upload);
-		
-		// checkBoxImportAttributes
-		checkBoxImportAttributes = new CheckBox();
-		checkBoxImportAttributes
-				.setCaption("Import attributes into attribute dictionary.");
-		checkBoxImportAttributes.setImmediate(false);
-		checkBoxImportAttributes.setWidth("-1px");
-		checkBoxImportAttributes.setHeight("-1px");
-		mainLayout.addComponent(checkBoxImportAttributes);
-		
-		// checkBoxIgnoreStandard
-		checkBoxIgnoreStandard = new CheckBox();
-		checkBoxIgnoreStandard.setCaption("Ignore Standard Attributes");
-		checkBoxIgnoreStandard.setImmediate(false);
-		checkBoxIgnoreStandard.setWidth("-1px");
-		checkBoxIgnoreStandard.setHeight("-1px");
-		mainLayout.addComponent(checkBoxIgnoreStandard);
-		mainLayout.setComponentAlignment(checkBoxIgnoreStandard, new Alignment(
-				20));
-		
-		// checkBoxImportObligations
-		checkBoxImportObligations = new CheckBox();
-		checkBoxImportObligations
-				.setCaption("Import obligations into obligation dictionary.");
-		checkBoxImportObligations.setImmediate(false);
-		checkBoxImportObligations.setWidth("-1px");
-		checkBoxImportObligations.setHeight("-1px");
-		mainLayout.addComponent(checkBoxImportObligations);
-		
-		// checkBoxImportAdvice
-		checkBoxImportAdvice = new CheckBox();
-		checkBoxImportAdvice
-				.setCaption("Import advice into advice dictionary.");
-		checkBoxImportAdvice.setImmediate(false);
-		checkBoxImportAdvice.setWidth("-1px");
-		checkBoxImportAdvice.setHeight("-1px");
-		mainLayout.addComponent(checkBoxImportAdvice);
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java
deleted file mode 100644
index 3b9ade9..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RenamePolicyFileWindow.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-// import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class RenamePolicyFileWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldFilename;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private RenamePolicyFileWindow self = this;
-	private String newFilename = null;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public RenamePolicyFileWindow(String currentFilename) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize the text field
-		//
-		this.textFieldFilename.setValue(currentFilename);
-		this.textFieldFilename.setImmediate(true);
-		this.textFieldFilename.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() == null || event.getText().isEmpty()) {
-					self.buttonSave.setEnabled(false);
-				} else {
-					self.buttonSave.setEnabled(true);
-				}
-			}
-		});
-		//
-		// Initialize the button
-		//
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Save the value
-				//
-				self.newFilename = self.textFieldFilename.getValue();
-				//
-				// Make sure it ends with .xml
-				//
-				if (self.newFilename.endsWith(".xml") == false) {
-					self.newFilename = self.newFilename + ".xml";
-				}
-				//
-				// Close the window
-				//
-				self.close();
-			}
-		});
-		this.textFieldFilename.focus();
-	}
-	
-	public String getNewFilename() {
-		return this.newFilename;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldFilename
-		textFieldFilename = new TextField();
-		textFieldFilename.setCaption("Policy File Name");
-		textFieldFilename.setImmediate(false);
-		textFieldFilename.setWidth("-1px");
-		textFieldFilename.setHeight("-1px");
-		mainLayout.addComponent(textFieldFilename);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(24));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java
deleted file mode 100644
index e6baf44..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/RuleEditorWindow.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.EffectType;
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Label;
-import com.vaadin.ui.OptionGroup;
-import com.vaadin.ui.TextArea;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class RuleEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextArea textAreaDescription;
-	@AutoGenerated
-	private OptionGroup optionGroupEffect;
-	@AutoGenerated
-	private Label labelRuleID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final RuleEditorWindow self = this;
-	private final RuleType rule;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public RuleEditorWindow(RuleType rule) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.rule = rule;
-		//
-		// Close shortcut
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.initializeLabel();
-		this.initializeOption();
-		this.initializeText();
-		this.initializeButton();
-	}
-	
-	protected void initializeLabel() {
-		if (this.rule.getRuleId() == null) {
-			this.rule.setRuleId(((XacmlAdminUI)UI.getCurrent()).newRuleID());
-		}
-		this.labelRuleID.setValue(this.rule.getRuleId());
-	}
-
-	protected void initializeOption() {
-		this.optionGroupEffect.setRequiredError("You MUST select an effect (Permit or Deny for the rule.");
-		this.optionGroupEffect.addItem("Permit");
-		this.optionGroupEffect.addItem("Deny");
-		if (this.rule.getEffect() == null) {
-			this.rule.setEffect(EffectType.PERMIT);
-		}
-		if (this.rule.getEffect() == EffectType.PERMIT) {
-			this.optionGroupEffect.setValue("Permit");
-		} else {
-			this.optionGroupEffect.setValue("Deny");
-		}
-	}
-
-	protected void initializeText() {
-		this.textAreaDescription.setValue(this.rule.getDescription());
-	}
-
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.optionGroupEffect.commit();
-					self.textAreaDescription.commit();
-					//
-					// Save everything
-					//
-					if (self.optionGroupEffect.getValue() == "Permit") {
-						self.rule.setEffect(EffectType.PERMIT);
-					} else {
-						self.rule.setEffect(EffectType.DENY);
-					}
-					self.rule.setDescription(self.textAreaDescription.getValue());
-					//
-					// Set ourselves as saved
-					//
-					self.isSaved = true;
-					//
-					// Close the window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					//
-					// VAADIN will show the required error message to the user
-					//
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public RuleType getRule() {
-		return this.rule;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// labelRuleID
-		labelRuleID = new Label();
-		labelRuleID.setCaption("Rule ID");
-		labelRuleID.setImmediate(false);
-		labelRuleID.setWidth("100.0%");
-		labelRuleID.setHeight("-1px");
-		labelRuleID.setValue("Label");
-		mainLayout.addComponent(labelRuleID);
-		mainLayout.setExpandRatio(labelRuleID, 1.0f);
-		
-		// optionGroupEffect
-		optionGroupEffect = new OptionGroup();
-		optionGroupEffect.setCaption("Choose the effect.");
-		optionGroupEffect.setImmediate(false);
-		optionGroupEffect.setWidth("-1px");
-		optionGroupEffect.setHeight("-1px");
-		optionGroupEffect.setInvalidAllowed(false);
-		optionGroupEffect.setRequired(true);
-		mainLayout.addComponent(optionGroupEffect);
-		
-		// textAreaDescription
-		textAreaDescription = new TextArea();
-		textAreaDescription.setCaption("Enter a description for the Rule.");
-		textAreaDescription.setImmediate(false);
-		textAreaDescription.setWidth("100.0%");
-		textAreaDescription.setHeight("-1px");
-		textAreaDescription.setNullSettingAllowed(true);
-		textAreaDescription.setNullRepresentation("");
-		mainLayout.addComponent(textAreaDescription);
-		mainLayout.setExpandRatio(textAreaDescription, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java
deleted file mode 100644
index fd3d8cb..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPDPGroupWindow.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Set;
-
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ListSelect;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class SelectPDPGroupWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private ListSelect listSelectPDPGroup;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final SelectPDPGroupWindow self = this;
-	
-	private boolean saved = false;
-	
-	private PDPGroup selectedGroup = null;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	// TODO - Refactor.  Unused formal parameter: caption. Either determine
-	// that this parameter is unnecessary and remove it (including removing
-	// it from all constructor method consumers), or use it.
-	// NOTE: Setting to NOPMD for now.
-	public SelectPDPGroupWindow(Set<PDPGroup> groups, String caption) { //NOPMD
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Setup the shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		//
-		// initialize
-		//
-		this.initialize(groups);
-		//
-		// Focus
-		//
-		this.listSelectPDPGroup.focus();
-		//
-		// setup the button
-		//
-		this.setupButtons();
-	}
-	
-	protected void initialize(Set<PDPGroup> groups) {
-		//
-		// Initialize the list
-		//
-		this.initializeSelect(groups);
-		//
-		// Buttons
-		//
-		this.initializeButtons();
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Get the selected value
-				//
-				self.selectedGroup = (PDPGroup) self.listSelectPDPGroup.getValue();
-				assert self.selectedGroup != null;
-				//
-				// Mark ourselves as saved
-				//
-				self.saved = true;
-				//
-				// Close window
-				//
-				self.close();
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return saved;
-	}
-	
-	public PDPGroup selectedGroup() {
-		return this.selectedGroup;
-	}
-	
-	private void initializeSelect(Set<PDPGroup> groups) {
-		//
-		// Initialize GUI properties
-		//
-		this.listSelectPDPGroup.setImmediate(true);
-		this.listSelectPDPGroup.setItemCaptionMode(ItemCaptionMode.EXPLICIT);
-		this.listSelectPDPGroup.setNullSelectionAllowed(false);
-		this.listSelectPDPGroup.setNewItemsAllowed(false);
-		this.listSelectPDPGroup.setMultiSelect(false);
-		//
-		// Add items
-		//
-		for (PDPGroup group : groups) {
-			this.listSelectPDPGroup.addItem(group);
-			this.listSelectPDPGroup.setItemCaption(group, group.getName());
-		}
-		//
-		// Listen to events
-		//
-		this.listSelectPDPGroup.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				self.setupButtons();
-			}
-		});
-	}
-	
-	protected void setupButtons() {
-		if (self.listSelectPDPGroup.getValue() == null) {
-			self.buttonSave.setEnabled(false);
-		} else {
-			self.buttonSave.setEnabled(true);
-		}
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// listSelectPDPGroup
-		listSelectPDPGroup = new ListSelect();
-		listSelectPDPGroup.setImmediate(false);
-		listSelectPDPGroup.setWidth("-1px");
-		listSelectPDPGroup.setHeight("-1px");
-		listSelectPDPGroup.setInvalidAllowed(false);
-		listSelectPDPGroup.setRequired(true);
-		mainLayout.addComponent(listSelectPDPGroup);
-		mainLayout.setExpandRatio(listSelectPDPGroup, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java
deleted file mode 100644
index dfa92ee..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectPIPConfigurationWindow.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.jpa.PIPConfiguration;
-import org.apache.openaz.xacml.api.pap.PDPGroup;
-import org.apache.openaz.xacml.api.pap.PDPPIPConfig;
-import org.apache.openaz.xacml.std.pap.StdPDPPIPConfig;
-import com.vaadin.addon.jpacontainer.EntityItem;
-import com.vaadin.addon.jpacontainer.JPAContainer;
-import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-// import com.vaadin.ui.CustomComponent;
-import com.vaadin.ui.Table;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class SelectPIPConfigurationWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private Table table;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(SelectPIPConfigurationWindow.class);
-	private final SelectPIPConfigurationWindow self = this;
-	private final JPAContainer<PIPConfiguration>	container = new JPAContainer<PIPConfiguration>(PIPConfiguration.class);
-	private boolean isSaved = false;
-	private Set<PDPPIPConfig> selectedConfigs = null;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public SelectPIPConfigurationWindow(PDPGroup group) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Initialize
-		//
-		this.initialize(group);
-	}
-	
-	protected void initialize(PDPGroup group) {
-		//
-		// Setup the container
-		//
-		this.container.setEntityProvider(new CachingLocalEntityProvider<PIPConfiguration>(PIPConfiguration.class, ((XacmlAdminUI)UI.getCurrent()).getEntityManager()));
-
-		this.initializeTable(group);
-		this.initializeButton();
-	}
-
-	protected void initializeTable(PDPGroup group) {
-		//
-		// GUI properties
-		//
-		this.table.setContainerDataSource(this.container);
-		this.table.setImmediate(true);
-		this.table.setSelectable(true);
-		this.table.setMultiSelect(true);
-		this.table.setPageLength(this.container.size() > 10 ? 10 : this.container.size());
-		this.table.setVisibleColumns("name", "description");
-		//
-		// Pre-select the group's configurations
-		//
-		for (PDPPIPConfig config : group.getPipConfigs()) {
-			try {
-				Integer id = Integer.parseInt(config.getId());
-				if (this.container.containsId(id)) {
-					this.table.select(id);
-				}
-			} catch (NumberFormatException e) {
-				logger.error("invalid config id: " + config.getId());
-			}
-		}
-	}
-
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				//
-				// Commit the table so we have everything that was selected
-				//
-				self.table.commit();
-				//
-				// We are going to fill this structure
-				//
-				self.selectedConfigs = new HashSet<PDPPIPConfig>();
-				//
-				// Get all the selected values
-				//
-				Object values = self.table.getValue();
-				if (values != null && values instanceof Collection) {
-					Collection<?> ids = (Collection<?>) values;
-					for (Object id : ids) {
-						//
-						// Get the entity
-						//
-						EntityItem<PIPConfiguration> entity = self.container.getItem(id);
-						PIPConfiguration config = entity.getEntity();
-						//
-						// Create object needed by PAP REST
-						//
-						StdPDPPIPConfig pipConfig = new StdPDPPIPConfig();
-						pipConfig.setId(Integer.toString(config.getId()));
-						pipConfig.setClassname(config.getClassname());
-						pipConfig.setName(config.getName());
-						pipConfig.setDescription(config.getDescription());
-						Map<String, String> map = config.getConfiguration(null);
-						pipConfig.setValues(map);
-						//
-						// Add it to the saved Set
-						//
-						self.selectedConfigs.add(pipConfig);
-					}
-				}
-				//
-				// Mark ourselves as saved
-				//
-				self.isSaved = true;
-				//
-				// Close the window
-				//
-				self.close();
-			}
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public Set<PDPPIPConfig> getSelectedConfigs() {
-		return this.selectedConfigs;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// table
-		table = new Table();
-		table.setCaption("PIP Configurations");
-		table.setImmediate(false);
-		table.setWidth("-1px");
-		table.setHeight("-1px");
-		mainLayout.addComponent(table);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java
deleted file mode 100644
index 93cea8c..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SelectWorkspacePoliciesWindow.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.net.URI;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.openaz.xacml.admin.XacmlAdminUI;
-import org.apache.openaz.xacml.admin.model.GitRepositoryContainer;
-import org.apache.openaz.xacml.admin.model.GitRepositoryContainer.FileItem;
-import org.apache.openaz.xacml.admin.util.AdminNotification;
-import org.apache.openaz.xacml.std.pap.StdPDPPolicy;
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.event.ItemClickEvent;
-import com.vaadin.event.ItemClickEvent.ItemClickListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.TreeTable;
-import com.vaadin.ui.UI;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class SelectWorkspacePoliciesWindow extends Window {
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-
-	@AutoGenerated
-	private Button buttonSave;
-
-	@AutoGenerated
-	private TreeTable treeWorkspace;
-
-	private static Log	logger	= LogFactory.getLog(SelectWorkspacePoliciesWindow.class);
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final SelectWorkspacePoliciesWindow self = this;
-	private GitRepositoryContainer treeContainer;
-	private boolean isSaved = false;
-	private StdPDPPolicy selectedPolicy = null;
-	
-	
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public SelectWorkspacePoliciesWindow() {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		//
-		//
-		//
-		this.initializeTree();
-		this.initializeButton();
-		//
-		//
-		//
-		this.treeWorkspace.focus();
-	}
-	
-	protected void initializeTree() {
-		//
-		// This is where the user's Git repository is located
-		//
-		final Path gitPath = ((XacmlAdminUI)UI.getCurrent()).getUserGitPath();
-		//
-		// Create our Git file system container
-		//
-		this.treeContainer = new GitRepositoryContainer(gitPath, gitPath.toFile());
-		//
-		// Create our own filter to filter out File extensions and
-		// also the Git directory.
-		//
-		this.treeContainer.setFilter(new FilenameFilter() {
-
-			@Override
-			public boolean accept(File dir, String name) {
-				//
-				// We don't want any of the hidden files
-				//
-				if (name.startsWith(".git") || name.equals(".DS_Store")) {
-					return false;
-				}
-				//
-				// We definitely want xml files
-				//
-				if (name.endsWith(".xml")) {
-					return true;
-				}
-				//
-				// We should test if its a directory, we want those
-				// included.
-				//
-				Path path = Paths.get(dir.getAbsolutePath(), name);
-				if (Files.isDirectory(path)) {
-					return true;
-				}
-				logger.warn("Filtering out: " + path.toString());
-				return false;
-			}
-			
-		});
-		//
-		// Set TreeTables datasource as our git container
-		//
-		this.treeWorkspace.setContainerDataSource(this.treeContainer);
-		//
-		// Setup other properties etc.
-		//
-		this.treeWorkspace.setItemIconPropertyId("Icon");
-		this.treeWorkspace.setVisibleColumns(new Object[]{"Name", "Version", "Size", "Last Modified", "Status"});
-		this.treeWorkspace.setSizeFull();
-		this.treeWorkspace.setSelectable(true);
-		this.treeWorkspace.setEditable(false);
-		//
-		// Expand the first couple of directories
-		//
-		for (Object id : this.treeWorkspace.getItemIds()) {
-			this.treeWorkspace.setCollapsed(id, false);
-			for (Object child : this.treeWorkspace.getChildren(id)) {
-				this.treeWorkspace.setCollapsed(child, false);
-			}
-		}
-		//
-		// Respond to table selections
-		//
-		this.treeWorkspace.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (self.treeWorkspace.getValue() != null) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}
-		});
-		//
-		// Double-click events
-		//
-		this.treeWorkspace.addItemClickListener(new ItemClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void itemClick(ItemClickEvent event) {
-				if (event.isDoubleClick()) {
-					//
-					// Save and close
-					//
-					self.doSave();
-				}
-			}
-		});
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				assert treeWorkspace.getValue() != null;
-				//
-				// Save everything
-				//
-				self.doSave();
-			}
-		});
-	}
-	
-	protected void doSave() {
-		//
-		// Get the current selection
-		//
-		FileItem selectedItem = (FileItem) this.treeWorkspace.getItem(this.treeWorkspace.getValue());
-		//
-		//
-		//
-		assert selectedItem != null;
-		if (selectedItem == null) {
-			return;
-		}
-		
-		// create the id of the target file
-		
-		// Our standard for file naming is:
-		//		<domain>.<filename>.<version>.xml
-		
-		// since the file name usually has a ".xml", we need to strip that before adding the other parts
-		String name = selectedItem.getName();
-		String id = name;
-		if (id.endsWith(".xml")) {
-			id = id.substring(0, id.length() - 4);
-		}
-		
-		// add on the version string
-
-		String version = selectedItem.getVersion();
-		id += "." + version;
-		
-		// put the .xml on the end
-		id += ".xml";
-		
-		// tack on the domain in front.  Do this one level at a time until we reach one of the roots
-	
-
-		File parentFile = selectedItem.getFile();
-		while ((parentFile = (File) this.treeWorkspace.getParent(parentFile)) != null) {
-			if (this.treeContainer.isRoot(parentFile)) {
-				break;
-			}
-			id = parentFile.getName() + "." + id;
-		}
-		
-		// Default policy to be Root policy;  user can change to deferred later
-		URI selectedURI = selectedItem.getFile().toURI();
-		try {
-			//
-			// Create the policy
-			//
-			this.selectedPolicy = new StdPDPPolicy(id, true, name, selectedURI);
-			//
-			// Mark ourselves as saved
-			//
-			this.isSaved = true;
-		} catch (IOException e) {
-			logger.error("Unable to create policy '" + id + "': " + e.getMessage());
-			AdminNotification.warn("Unable to create policy '" + id + "': " + e.getMessage());
-		}
-
-		//
-		// Close the window
-		//
-		this.close();
-	}
-
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public StdPDPPolicy getSelectedPolicy() {
-		return this.selectedPolicy;
-	}
-
-	
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// treeWorkspace
-		treeWorkspace = new TreeTable();
-		treeWorkspace.setCaption("Select Policy(s) for PDP Group");
-		treeWorkspace.setImmediate(true);
-		treeWorkspace.setWidth("100.0%");
-		treeWorkspace.setHeight("-1px");
-		mainLayout.addComponent(treeWorkspace);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-
-	
-	
-	
-	
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java
deleted file mode 100644
index 0e38a67..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/SubDomainEditorWindow.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.annotations.AutoGenerated;
-// import com.vaadin.data.Property.ValueChangeEvent;
-// import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.data.validator.RegexpValidator;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.FormLayout;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.Window;
-
-public class SubDomainEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private FormLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldSubdomain;
-
-	//
-	// Full domain pattern:
-	// "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$";
-	//
-	// We just want one part of it.
-	//
-	private static final String SUBDOMAIN_NAME_PATTERN = "^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$";
-	private static final String ERROR_MESSAGE = "Either enter a single subdomain via RFC1123 - letters, digits and a hyphen. Cannot start or end with a hyphen.";
-	
-	private static final long serialVersionUID = 1L;
-	private static final Log logger	= LogFactory.getLog(SubDomainEditorWindow.class);
-	private final SubDomainEditorWindow self = this;
-	private boolean saved = false;
-	private String subdomain = null;
-	
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public SubDomainEditorWindow(String subdomain) {
-		buildMainLayout();
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.subdomain = subdomain;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.initializeTextField();
-		this.initializeButtons();
-		//
-		// Focus
-		//
-		this.textFieldSubdomain.focus();
-	}
-	
-	protected void initializeTextField() {
-		this.textFieldSubdomain.setRequired(true);
-		this.textFieldSubdomain.setRequiredError("Please enter a valid sub domain");
-		//
-		// Validate the name entered
-		//
-		this.textFieldSubdomain.addValidator(new RegexpValidator(SUBDOMAIN_NAME_PATTERN, true, ERROR_MESSAGE) {
-			private static final long serialVersionUID = 1L;
-			
-		});
-		//
-		// Respond to events
-		//
-		this.textFieldSubdomain.setImmediate(true);
-		this.textFieldSubdomain.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() != null && event.getText().length() > 0) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}
-			
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.setEnabled(false);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Make sure the text is valid
-					//
-					self.textFieldSubdomain.validate();
-					//
-					// Parse our the subdomain parts
-					//
-					self.subdomain = self.textFieldSubdomain.getValue();
-					self.saved = true;
-					//
-					// Close it up
-					//
-					self.close();
-				} catch (InvalidValueException e) {
-					logger.error(e);
-				}
-			}
-			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.saved;
-	}
-	
-	public String	getSubDomain() {
-		return this.subdomain;
-	}
-
-	@AutoGenerated
-	private FormLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new FormLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldSubdomain
-		textFieldSubdomain = new TextField();
-		textFieldSubdomain.setCaption("Enter Sub Domain");
-		textFieldSubdomain.setImmediate(false);
-		textFieldSubdomain
-				.setDescription("You can enter sub domain name - do not use spaces or wildcard characters.");
-		textFieldSubdomain.setWidth("-1px");
-		textFieldSubdomain.setHeight("-1px");
-		textFieldSubdomain.setInvalidAllowed(false);
-		textFieldSubdomain
-				.setInputPrompt("Examples: sales hr business marketing.");
-		mainLayout.addComponent(textFieldSubdomain);
-		mainLayout.setExpandRatio(textFieldSubdomain, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java
deleted file mode 100644
index bec843e..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableDefinitionEditorWindow.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.VariableDefinitionType;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class VariableDefinitionEditorWindow extends Window {
-
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldID;
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private final VariableDefinitionEditorWindow self = this;
-	private final VariableDefinitionType variable;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public VariableDefinitionEditorWindow(VariableDefinitionType variable) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save
-		//
-		this.variable = variable;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.initializeText();
-		this.initializeButton();
-		//
-		// Initial focus
-		//
-		this.textFieldID.focus();
-	}
-	
-	protected void initializeText() {
-		//
-		// Initialize GUI properties
-		//
-		this.textFieldID.setImmediate(true);
-		//
-		// Listen to changes
-		//
-		this.textFieldID.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() != null && event.getText().isEmpty() == false) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}
-			
-		});
-		this.textFieldID.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				if (self.textFieldID.getValue() != null && self.textFieldID.getValue().isEmpty() == false) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}			
-		});
-		//
-		// Set the value
-		//
-		this.textFieldID.setValue(variable.getVariableId());
-	}
-	
-	protected void initializeButton() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit it
-					//
-					self.textFieldID.commit();
-					//
-					// Save it
-					//
-					self.variable.setVariableId(self.textFieldID.getValue());
-					self.isSaved = true;
-					//
-					// Close window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) { //NOPMD
-					// Vaadin will display error
-					// TODO - Verify that Vaadin will display error and update this
-					//        inline documentation accordingly
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public VariableDefinitionType getVariable() {
-		return this.variable;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// textFieldID
-		textFieldID = new TextField();
-		textFieldID.setCaption("Variable ID");
-		textFieldID.setImmediate(false);
-		textFieldID.setWidth("-1px");
-		textFieldID.setHeight("-1px");
-		textFieldID.setInvalidAllowed(false);
-		textFieldID.setRequired(true);
-		textFieldID.setNullRepresentation("");
-		mainLayout.addComponent(textFieldID);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save and Continue");
-		buttonSave.setImmediate(false);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java b/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java
deleted file mode 100644
index 53b47c4..0000000
--- a/openaz-xacml-pap-admin/src/main/java/org/apache/openaz/xacml/admin/view/windows/VariableReferenceEditorWindow.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- *
- */
-
-package org.apache.openaz.xacml.admin.view.windows;
-
-import java.util.Map;
-
-import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
-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.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import com.vaadin.annotations.AutoGenerated;
-import com.vaadin.data.Buffered.SourceException;
-import com.vaadin.data.Property.ValueChangeEvent;
-import com.vaadin.data.Property.ValueChangeListener;
-import com.vaadin.data.Validator.InvalidValueException;
-import com.vaadin.event.FieldEvents.TextChangeEvent;
-import com.vaadin.event.FieldEvents.TextChangeListener;
-import com.vaadin.event.ShortcutAction.KeyCode;
-import com.vaadin.ui.Alignment;
-import com.vaadin.ui.Button;
-import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.ListSelect;
-import com.vaadin.ui.TextField;
-import com.vaadin.ui.VerticalLayout;
-import com.vaadin.ui.Window;
-
-public class VariableReferenceEditorWindow extends Window {
-	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
-
-	@AutoGenerated
-	private VerticalLayout mainLayout;
-	@AutoGenerated
-	private Button buttonSave;
-	@AutoGenerated
-	private TextField textFieldVariable;
-	@AutoGenerated
-	private ListSelect listSelectVariables;
-	/*
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	private static Log logger	= LogFactory.getLog(VariableReferenceEditorWindow.class);
-	private final VariableReferenceEditorWindow self = this;
-	private final VariableReferenceType variable;
-	private boolean isSaved = false;
-	/**
-	 * The constructor should first build the main layout, set the
-	 * composition root and then do any custom initialization.
-	 *
-	 * The constructor will not be automatically regenerated by the
-	 * visual editor.
-	 */
-	public VariableReferenceEditorWindow(VariableReferenceType variable, Map<VariableDefinitionType, PolicyType> variables) {
-		buildMainLayout();
-		//setCompositionRoot(mainLayout);
-		setContent(mainLayout);
-		//
-		// Save parameters
-		//
-		this.variable = variable;
-		//
-		// Set our shortcuts
-		//
-		this.setCloseShortcut(KeyCode.ESCAPE);
-		//
-		// Initialize
-		//
-		this.initializeTextField();
-		this.initializeSelect(variables);
-		this.initializeButtons();
-		//
-		// Focus
-		//
-		this.textFieldVariable.focus();
-	}
-	
-	protected void initializeTextField() {
-		this.textFieldVariable.setImmediate(true);
-		this.textFieldVariable.setNullRepresentation("");
-		this.textFieldVariable.addTextChangeListener(new TextChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void textChange(TextChangeEvent event) {
-				if (event.getText() != null && event.getText().isEmpty() == false) {
-					self.buttonSave.setEnabled(true);
-				} else {
-					self.buttonSave.setEnabled(false);
-				}
-			}
-			
-		});
-		this.textFieldVariable.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				String value = self.textFieldVariable.getValue();
-				if (value == null || value.isEmpty()) {
-					self.buttonSave.setEnabled(false);
-				} else {
-					self.buttonSave.setEnabled(true);
-				}
-			}
-		});
-		if (this.variable != null) {
-			this.textFieldVariable.setValue(this.variable.getVariableId());
-		}
-	}
-
-	protected void initializeSelect(Map<VariableDefinitionType, PolicyType> vars) {
-		//
-		// Add existing variables into the table
-		//
-		if (vars != null) {
-			for (VariableDefinitionType var : vars.keySet()) {
-				this.listSelectVariables.addItem(var.getVariableId());
-			}
-		}
-		//
-		// Respond to changes
-		//
-		this.listSelectVariables.setImmediate(true);
-		this.listSelectVariables.addValueChangeListener(new ValueChangeListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void valueChange(ValueChangeEvent event) {
-				Object value = self.listSelectVariables.getValue();
-				if (value != null) {
-					self.textFieldVariable.setValue(value.toString());
-				}
-			}			
-		});
-	}
-	
-	protected void initializeButtons() {
-		this.buttonSave.setClickShortcut(KeyCode.ENTER);
-		this.buttonSave.addClickListener(new ClickListener() {
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void buttonClick(ClickEvent event) {
-				try {
-					//
-					// Commit
-					//
-					self.textFieldVariable.commit();
-					//
-					// Now we can save
-					//
-					self.isSaved = true;
-					self.variable.setVariableId(self.textFieldVariable.getValue());
-					//
-					// And close the window
-					//
-					self.close();
-				} catch (SourceException | InvalidValueException e) {
-					logger.error("Commit variable id: " + e);
-				}
-			}			
-		});
-	}
-	
-	public boolean isSaved() {
-		return this.isSaved;
-	}
-	
-	public VariableReferenceType getVariableReference() {
-		return this.variable;
-	}
-
-	@AutoGenerated
-	private VerticalLayout buildMainLayout() {
-		// common part: create layout
-		mainLayout = new VerticalLayout();
-		mainLayout.setImmediate(false);
-		mainLayout.setWidth("-1px");
-		mainLayout.setHeight("-1px");
-		mainLayout.setMargin(true);
-		mainLayout.setSpacing(true);
-		
-		// top-level component properties
-		setWidth("-1px");
-		setHeight("-1px");
-		
-		// listSelectVariables
-		listSelectVariables = new ListSelect();
-		listSelectVariables.setCaption("Defined Variables");
-		listSelectVariables.setImmediate(false);
-		listSelectVariables.setWidth("100.0%");
-		listSelectVariables.setHeight("-1px");
-		mainLayout.addComponent(listSelectVariables);
-		mainLayout.setExpandRatio(listSelectVariables, 1.0f);
-		
-		// textFieldVariable
-		textFieldVariable = new TextField();
-		textFieldVariable.setCaption("Variable");
-		textFieldVariable.setImmediate(false);
-		textFieldVariable.setWidth("-1px");
-		textFieldVariable.setHeight("-1px");
-		textFieldVariable.setInvalidAllowed(false);
-		textFieldVariable.setRequired(true);
-		textFieldVariable.setInputPrompt("Eg. \"12345\" or \"myVariable1\"");
-		mainLayout.addComponent(textFieldVariable);
-		mainLayout.setExpandRatio(textFieldVariable, 1.0f);
-		
-		// buttonSave
-		buttonSave = new Button();
-		buttonSave.setCaption("Save");
-		buttonSave.setImmediate(true);
-		buttonSave.setWidth("-1px");
-		buttonSave.setHeight("-1px");
-		mainLayout.addComponent(buttonSave);
-		mainLayout.setComponentAlignment(buttonSave, new Alignment(48));
-		
-		return mainLayout;
-	}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql
deleted file mode 100644
index a679b4d..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/META-INF/data.sql
+++ /dev/null
@@ -1,723 +0,0 @@
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (1,'Range','Set a range of min and/or max integer/double values the attribute can be set to during policy creation.');
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (2,'Regular Expression','Define a regular expression the attribute must match against during policy creation.');
-INSERT INTO ConstraintType (id, constraint_type, description) VALUES (3,'Enumeration','Enumerate a set of values that the attribute may be set to during policy creation.');
-
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (4,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:intermediary-subject','intermediary-subject');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (5,'resource','S','urn:oasis:names:tc:xacml:3.0:attribute-category:resource','resource');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (6,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:codebase','codebase');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (7,'action','S','urn:oasis:names:tc:xacml:3.0:attribute-category:action','action');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (8,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:access-subject','access-subject');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (9,'environment','S','urn:oasis:names:tc:xacml:3.0:attribute-category:environment','environment');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (10,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:requesting-machine','requesting-machine');
-INSERT INTO Category (id, grouping, is_standard, xacml_id, short_name) VALUES (11,'subject','S','urn:oasis:names:tc:xacml:1.0:subject-category:recipient-subject','recipient-subject');
-
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (12,'S','integer','http://www.w3.org/2001/XMLSchema#integer');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (13,'S','base64Binary','http://www.w3.org/2001/XMLSchema#base64Binary');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (14,'S','x500Name','urn:oasis:names:tc:xacml:1.0:data-type:x500Name');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (15,'S','dayTimeDuration','http://www.w3.org/2001/XMLSchema#dayTimeDuration');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (16,'S','time','http://www.w3.org/2001/XMLSchema#time');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (17,'S','dnsName','urn:oasis:names:tc:xacml:2.0:data-type:dnsName');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (18,'S','boolean','http://www.w3.org/2001/XMLSchema#boolean');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (19,'S','dateTime','http://www.w3.org/2001/XMLSchema#dateTime');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (20,'S','rfc822Name','urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (21,'S','date','http://www.w3.org/2001/XMLSchema#date');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (22,'S','ipAddress','urn:oasis:names:tc:xacml:2.0:data-type:ipAddress');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (23,'S','yearMonthDuration','http://www.w3.org/2001/XMLSchema#yearMonthDuration');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (24,'S','hexBinary','http://www.w3.org/2001/XMLSchema#hexBinary');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (25,'S','double','http://www.w3.org/2001/XMLSchema#double');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (26,'S','string','http://www.w3.org/2001/XMLSchema#string');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (27,'S','anyURI','http://www.w3.org/2001/XMLSchema#anyURI');
-INSERT INTO Datatype (id, is_standard, short_name, xacml_id) VALUES (28,'S','xpathExpression','urn:oasis:names:tc:xacml:3.0:data-type:xpathExpression');
-
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (29,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-deny-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (30,'S','on-permit-apply-second','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:on-permit-apply-second');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (31,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (32,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (33,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:deny-unless-permit');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (34,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-overrides');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (35,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:only-one-applicable');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (36,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:policy-combining-algorithm:first-applicable');
-INSERT INTO PolicyAlgorithms (id, is_standard, short_name, xacml_id) VALUES (37,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:ordered-permit-overrides');
-
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (38,'S','permit-unless-deny','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (39,'S','permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (40,'S','deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (41,'S','ordered-permit-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-permit-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (42,'S','deny-unless-permit','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-unless-permit');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (43,'S','ordered-deny-overrides','urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:ordered-deny-overrides');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (44,'S','only-one-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:only-one-applicable');
-INSERT INTO RuleAlgorithms (id, is_standard, short_name, xacml_id) VALUES (45,'S','first-applicable','urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable');
-
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (1,'integer-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (2,'integer-subtract','urn:oasis:names:tc:xacml:1.0:function:integer-subtract',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (3,'double-to-integer','urn:oasis:names:tc:xacml:1.0:function:double-to-integer',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (4,'integer-one-and-only','urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (5,'double-one-and-only','urn:oasis:names:tc:xacml:1.0:function:double-one-and-only',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (6,'string-equal','urn:oasis:names:tc:xacml:1.0:function:string-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (7,'string-equal-ignore-case','urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (8,'string-starts-with','urn:oasis:names:tc:xacml:3.0:function:string-starts-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (9,'string-ends-with','urn:oasis:names:tc:xacml:3.0:function: string-ends-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (10,'string-concatenate','urn:oasis:names:tc:xacml:2.0:function:string-concatenate',26,0,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (11,'boolean-from-string','urn:oasis:names:tc:xacml:3.0:function:boolean-from-string',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (12,'string-from-boolean','urn:oasis:names:tc:xacml:3.0:function:string-from-boolean',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (13,'integer-from-string','urn:oasis:names:tc:xacml:3.0:function:integer-from-string',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (14,'string-from-integer','urn:oasis:names:tc:xacml:3.0:function:string-from-integer',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (15,'double-from-string','urn:oasis:names:tc:xacml:3.0:function:double-from-string',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (16,'string-from-double','urn:oasis:names:tc:xacml:3.0:function:string-from-double',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (17,'time-from-string','urn:oasis:names:tc:xacml:3.0:function:time-from-string',16,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (18,'string-from-time','urn:oasis:names:tc:xacml:3.0:function:string-from-time',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (19,'date-from-string','urn:oasis:names:tc:xacml:3.0:function:date-from-string',21,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (20,'string-from-date','urn:oasis:names:tc:xacml:3.0:function:string-from-date',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (21,'dateTime-from-string','urn:oasis:names:tc:xacml:3.0:function:dateTime-from-string',19,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (22,'string-from-dateTime','urn:oasis:names:tc:xacml:3.0:function:string-from-dateTime',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (23,'anyURI-from-string','urn:oasis:names:tc:xacml:3.0:function:anyURI-from-string',27,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (24,'string-from-anyURI','urn:oasis:names:tc:xacml:3.0:function:string-from-anyURI',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (25,'dayTimeDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-from-string',15,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (26,'string-from-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-dayTimeDuration',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (27,'yearMonthDuration-from-string','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-from-string',23,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (28,'string-from-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:string-from-yearMonthDuration',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (29,'x500Name-from-string','urn:oasis:names:tc:xacml:3.0:function:x500Name-from-string',14,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (30,'string-from-x500Name','urn:oasis:names:tc:xacml:3.0:function:string-from-x500Name',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (31,'rfc822Name-from-string','urn:oasis:names:tc:xacml:3.0:function:rfc822Name-from-string',20,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (32,'string-from-rfc822Name','urn:oasis:names:tc:xacml:3.0:function:string-from-rfc822Name',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (33,'ipAddress-from-string','urn:oasis:names:tc:xacml:3.0:function:ipAddress-from-string',22,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (34,'string-from-ipAddress','urn:oasis:names:tc:xacml:3.0:function:string-from-ipAddress',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (35,'dnsName-from-string','urn:oasis:names:tc:xacml:3.0:function:dnsName-from-string',17,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (36,'string-from-dnsName','urn:oasis:names:tc:xacml:3.0:function:string-from-dnsName',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (37,'anyURI-starts-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-starts-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (38,'anyURI-ends-with','urn:oasis:names:tc:xacml:3.0:function:anyURI-ends-with',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (39,'string-contains','urn:oasis:names:tc:xacml:3.0:function:string-contains',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (40,'anyURI-contains','urn:oasis:names:tc:xacml:3.0:function:anyURI-contains',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (41,'string-substring','urn:oasis:names:tc:xacml:3.0:function:string-substring',26,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (42,'anyURI-substring','urn:oasis:names:tc:xacml:3.0:function:anyURI-substring',26,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (43,'boolean-equal','urn:oasis:names:tc:xacml:1.0:function:boolean-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (44,'integer-equal','urn:oasis:names:tc:xacml:1.0:function:integer-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (45,'double-equal','urn:oasis:names:tc:xacml:1.0:function:double-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (46,'date-equal','urn:oasis:names:tc:xacml:1.0:function:date-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (47,'time-equal','urn:oasis:names:tc:xacml:1.0:function:time-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (48,'dateTime-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (49,'dayTimeDuration-equal','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (50,'yearMonthDuration-equal','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (51,'anyURI-equal','urn:oasis:names:tc:xacml:1.0:function:anyURI-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (52,'x500Name-equal','urn:oasis:names:tc:xacml:1.0:function:x500Name-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (53,'rfc822Name-equal','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (54,'hexBinary-equal','urn:oasis:names:tc:xacml:1.0:function:hexBinary-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (55,'base64Binary-equal','urn:oasis:names:tc:xacml:1.0:function:base64Binary-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (56,'integer-add','urn:oasis:names:tc:xacml:1.0:function:integer-add',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (57,'double-add','urn:oasis:names:tc:xacml:1.0:function:double-add',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (58,'double-subtract','urn:oasis:names:tc:xacml:1.0:function:double-subtract',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (59,'integer-multiply','urn:oasis:names:tc:xacml:1.0:function:integer-multiply',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (60,'double-multiply','urn:oasis:names:tc:xacml:1.0:function:double-multiply',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (61,'integer-divide','urn:oasis:names:tc:xacml:1.0:function:integer-divide',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (62,'double-divide','urn:oasis:names:tc:xacml:1.0:function:double-divide',25,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (63,'integer-mod','urn:oasis:names:tc:xacml:1.0:function:integer-mod',12,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (64,'integer-abs','urn:oasis:names:tc:xacml:1.0:function:integer-abs',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (65,'double-abs','urn:oasis:names:tc:xacml:1.0:function:double-abs',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (66,'round','urn:oasis:names:tc:xacml:1.0:function:round',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (67,'floor','urn:oasis:names:tc:xacml:1.0:function:floor',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (68,'string-normalize-space','urn:oasis:names:tc:xacml:1.0:function:string-normalize-space',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (69,'string-normalize-to-lower-case','urn:oasis:names:tc:xacml:1.0:function:string-normalize-to-lower-case',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (70,'integer-to-double','urn:oasis:names:tc:xacml:1.0:function:integer-to-double',25,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (71,'integer-greater-than','urn:oasis:names:tc:xacml:1.0:function:integer-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (72,'integer-less-than','urn:oasis:names:tc:xacml:1.0:function:integer-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (73,'integer-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:integer-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (74,'double-greater-than','urn:oasis:names:tc:xacml:1.0:function:double-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (75,'double-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (76,'double-less-than','urn:oasis:names:tc:xacml:1.0:function:double-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (77,'double-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:double-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (78,'dateTime-add-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (79,'dateTime-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-add-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (80,'dateTime-subtract-dayTimeDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-dayTimeDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (81,'dateTime-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:dateTime-subtract-yearMonthDuration',19,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (82,'date-add-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-add-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (83,'date-subtract-yearMonthDuration','urn:oasis:names:tc:xacml:3.0:function:date-subtract-yearMonthDuration',21,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (84,'string-greater-than','urn:oasis:names:tc:xacml:1.0:function:string-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (85,'string-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (86,'string-less-than','urn:oasis:names:tc:xacml:1.0:function:string-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (87,'string-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:string-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (88,'time-greater-than','urn:oasis:names:tc:xacml:1.0:function:time-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (89,'time-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (90,'time-less-than','urn:oasis:names:tc:xacml:1.0:function:time-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (91,'time-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:time-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (92,'time-in-range','urn:oasis:names:tc:xacml:2.0:function:time-in-range',18,0,0,3,3,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (93,'dateTime-greater-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (94,'dateTime-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (95,'dateTime-less-than','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (96,'dateTime-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:dateTime-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (97,'date-greater-than','urn:oasis:names:tc:xacml:1.0:function:date-greater-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (98,'date-greater-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-greater-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (99,'date-less-than','urn:oasis:names:tc:xacml:1.0:function:date-less-than',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (100,'date-less-than-or-equal','urn:oasis:names:tc:xacml:1.0:function:date-less-than-or-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (101,'string-one-and-only','urn:oasis:names:tc:xacml:1.0:function:string-one-and-only',26,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (102,'string-bag-size','urn:oasis:names:tc:xacml:1.0:function:string-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (103,'string-is-in','urn:oasis:names:tc:xacml:1.0:function:string-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (104,'string-bag','urn:oasis:names:tc:xacml:1.0:function:string-bag',26,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (105,'integer-bag-size','urn:oasis:names:tc:xacml:1.0:function:integer-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (106,'integer-is-in','urn:oasis:names:tc:xacml:1.0:function:integer-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (107,'integer-bag','urn:oasis:names:tc:xacml:1.0:function:integer-bag',12,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (108,'double-bag-size','urn:oasis:names:tc:xacml:1.0:function:double-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (109,'double-is-in','urn:oasis:names:tc:xacml:1.0:function:double-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (110,'double-bag','urn:oasis:names:tc:xacml:1.0:function:double-bag',25,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (111,'boolean-one-and-only','urn:oasis:names:tc:xacml:1.0:function:boolean-one-and-only',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (112,'boolean-bag-size','urn:oasis:names:tc:xacml:1.0:function:boolean-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (113,'boolean-is-in','urn:oasis:names:tc:xacml:1.0:function:boolean-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (114,'boolean-bag','urn:oasis:names:tc:xacml:1.0:function:boolean-bag',18,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (115,'time-one-and-only','urn:oasis:names:tc:xacml:1.0:function:time-one-and-only',16,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (116,'time-bag-size','urn:oasis:names:tc:xacml:1.0:function:time-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (117,'time-is-in','urn:oasis:names:tc:xacml:1.0:function:time-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (118,'time-bag','urn:oasis:names:tc:xacml:1.0:function:time-bag',16,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (119,'date-one-and-only','urn:oasis:names:tc:xacml:1.0:function:date-one-and-only',21,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (120,'date-bag-size','urn:oasis:names:tc:xacml:1.0:function:date-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (121,'date-is-in','urn:oasis:names:tc:xacml:1.0:function:date-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (122,'date-bag','urn:oasis:names:tc:xacml:1.0:function:date-bag',21,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (123,'dateTime-one-and-only','urn:oasis:names:tc:xacml:1.0:function:dateTime-one-and-only',19,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (124,'dateTime-bag-size','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (125,'dateTime-is-in','urn:oasis:names:tc:xacml:1.0:function:dateTime-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (126,'dateTime-bag','urn:oasis:names:tc:xacml:1.0:function:dateTime-bag',19,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (127,'anyURI-one-and-only','urn:oasis:names:tc:xacml:1.0:function:anyURI-one-and-only',27,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (128,'anyURI-bag-size','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (129,'anyURI-is-in','urn:oasis:names:tc:xacml:1.0:function:anyURI-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (130,'anyURI-bag','urn:oasis:names:tc:xacml:1.0:function:anyURI-bag',27,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (131,'hexBinary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:hexBinary-one-and-only',24,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (132,'hexBinary-bag-size','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (133,'hexBinary-is-in','urn:oasis:names:tc:xacml:1.0:function:hexBinary-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (134,'hexBinary-bag','urn:oasis:names:tc:xacml:1.0:function:hexBinary-bag',24,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (135,'base64Binary-one-and-only','urn:oasis:names:tc:xacml:1.0:function:base64Binary-one-and-only',13,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (136,'base64Binary-bag-size','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (137,'base64Binary-is-in','urn:oasis:names:tc:xacml:1.0:function:base64Binary-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (138,'base64Binary-bag','urn:oasis:names:tc:xacml:1.0:function:base64Binary-bag',13,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (139,'dayTimeDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-one-and-only',15,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (140,'dayTimeDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (141,'dayTimeDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (142,'dayTimeDuration-bag','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-bag',15,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (143,'yearMonthDuration-one-and-only','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-one-and-only',23,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (144,'yearMonthDuration-bag-size','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (145,'yearMonthDuration-is-in','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (146,'yearMonthDuration-bag','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-bag',23,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (147,'x500Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:x500Name-one-and-only',14,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (148,'x500Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (149,'x500Name-is-in','urn:oasis:names:tc:xacml:1.0:function:x500Name-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (150,'x500Name-bag','urn:oasis:names:tc:xacml:1.0:function:x500Name-bag',14,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (151,'rfc822Name-one-and-only','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-one-and-only',20,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (152,'rfc822Name-bag-size','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (153,'rfc822Name-is-in','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (154,'rfc822Name-bag','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-bag',20,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (155,'ipAddress-one-and-only','urn:oasis:names:tc:xacml:2.0:function:ipAddress-one-and-only',22,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (156,'ipAddress-bag-size','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (157,'ipAddress-is-in','urn:oasis:names:tc:xacml:2.0:function:ipAddress-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (158,'ipAddress-bag','urn:oasis:names:tc:xacml:2.0:function:ipAddress-bag',22,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (159,'dnsName-one-and-only','urn:oasis:names:tc:xacml:2.0:function:dnsName-one-and-only',17,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (160,'dnsName-bag-size','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag-size',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (161,'dnsName-is-in','urn:oasis:names:tc:xacml:2.0:function:dnsName-is-in',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (162,'dnsName-bag','urn:oasis:names:tc:xacml:2.0:function:dnsName-bag',17,1,0,1,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (163,'string-regexp-match','urn:oasis:names:tc:xacml:1.0:function:string-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (164,'anyURI-regexp-match','urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (165,'ipAddress-regexp-match','urn:oasis:names:tc:xacml:2.0:function:ipAddress-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (166,'dnsName-regexp-match','urn:oasis:names:tc:xacml:2.0:function:dnsName-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (167,'rfc822Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:rfc822Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (168,'x500Name-regexp-match','urn:oasis:names:tc:xacml:2.0:function:x500Name-regexp-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (169,'string-intersection','urn:oasis:names:tc:xacml:1.0:function:string-intersection',26,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (170,'string-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (171,'string-union','urn:oasis:names:tc:xacml:1.0:function:string-union',26,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (172,'string-subset','urn:oasis:names:tc:xacml:1.0:function:string-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (173,'string-set-equals','urn:oasis:names:tc:xacml:1.0:function:string-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (174,'integer-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:integer-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (175,'integer-union','urn:oasis:names:tc:xacml:1.0:function:integer-union',12,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (176,'integer-subset','urn:oasis:names:tc:xacml:1.0:function:integer-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (177,'integer-set-equals','urn:oasis:names:tc:xacml:1.0:function:integer-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (178,'double-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:double-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (179,'double-union','urn:oasis:names:tc:xacml:1.0:function:double-union',25,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (180,'double-subset','urn:oasis:names:tc:xacml:1.0:function:double-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (181,'double-set-equals','urn:oasis:names:tc:xacml:1.0:function:double-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (182,'boolean-intersection','urn:oasis:names:tc:xacml:1.0:function:boolean-intersection',18,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (183,'boolean-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:boolean-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (184,'boolean-union','urn:oasis:names:tc:xacml:1.0:function:boolean-union',18,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (185,'boolean-subset','urn:oasis:names:tc:xacml:1.0:function:boolean-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (186,'boolean-set-equals','urn:oasis:names:tc:xacml:1.0:function:boolean-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (187,'time-intersection','urn:oasis:names:tc:xacml:1.0:function:time-intersection',16,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (188,'time-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:time-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (189,'time-union','urn:oasis:names:tc:xacml:1.0:function:time-union',16,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (190,'time-subset','urn:oasis:names:tc:xacml:1.0:function:time-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (191,'time-set-equals','urn:oasis:names:tc:xacml:1.0:function:time-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (192,'date-intersection','urn:oasis:names:tc:xacml:1.0:function:date-intersection',21,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (193,'date-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:date-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (194,'date-union','urn:oasis:names:tc:xacml:1.0:function:date-union',21,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (195,'date-subset','urn:oasis:names:tc:xacml:1.0:function:date-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (196,'date-set-equals','urn:oasis:names:tc:xacml:1.0:function:date-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (197,'dateTime-intersection','urn:oasis:names:tc:xacml:1.0:function:dateTime-intersection',19,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (198,'dateTime-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:dateTime-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (199,'dateTime-union','urn:oasis:names:tc:xacml:1.0:function:dateTime-union',19,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (200,'dateTime-subset','urn:oasis:names:tc:xacml:1.0:function:dateTime-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (201,'dateTime-set-equals','urn:oasis:names:tc:xacml:1.0:function:dateTime-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (202,'anyURI-intersection','urn:oasis:names:tc:xacml:1.0:function:anyURI-intersection',27,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (203,'anyURI-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:anyURI-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (204,'anyURI-union','urn:oasis:names:tc:xacml:1.0:function:anyURI-union',27,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (205,'anyURI-subset','urn:oasis:names:tc:xacml:1.0:function:anyURI-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (206,'anyURI-set-equals','urn:oasis:names:tc:xacml:1.0:function:anyURI-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (207,'hexBinary-intersection','urn:oasis:names:tc:xacml:1.0:function:hexBinary-intersection',24,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (208,'hexBinary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:hexBinary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (209,'hexBinary-union','urn:oasis:names:tc:xacml:1.0:function:hexBinary-union',24,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (210,'hexBinary-subset','urn:oasis:names:tc:xacml:1.0:function:hexBinary-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (211,'hexBinary-set-equals','urn:oasis:names:tc:xacml:1.0:function:hexBinary-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (212,'base64Binary-intersection','urn:oasis:names:tc:xacml:1.0:function:base64Binary-intersection',13,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (213,'base64Binary-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:base64Binary-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (214,'base64Binary-union','urn:oasis:names:tc:xacml:1.0:function:base64Binary-union',13,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (215,'base64Binary-subset','urn:oasis:names:tc:xacml:1.0:function:base64Binary-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (216,'base64Binary-set-equals','urn:oasis:names:tc:xacml:1.0:function:base64Binary-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (217,'dayTimeDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-intersection',15,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (218,'dayTimeDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (219,'dayTimeDuration-union','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-union',15,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (220,'dayTimeDuration-subset','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (221,'dayTimeDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:dayTimeDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (222,'yearMonthDuration-intersection','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-intersection',23,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (223,'yearMonthDuration-at-least-one-member-of','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (224,'yearMonthDuration-union','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-union',23,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (225,'yearMonthDuration-subset','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (226,'yearMonthDuration-set-equals','urn:oasis:names:tc:xacml:3.0:function:yearMonthDuration-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (227,'x500Name-intersection','urn:oasis:names:tc:xacml:1.0:function:x500Name-intersection',14,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (228,'x500Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:x500Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (229,'x500Name-union','urn:oasis:names:tc:xacml:1.0:function:x500Name-union',14,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (230,'x500Name-subset','urn:oasis:names:tc:xacml:1.0:function:x500Name-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (231,'x500Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:x500Name-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (232,'rfc822Name-intersection','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-intersection',20,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (233,'rfc822Name-at-least-one-member-of','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-at-least-one-member-of',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (234,'rfc822Name-union','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-union',20,1,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (235,'rfc822Name-subset','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-subset',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (236,'rfc822Name-set-equals','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-set-equals',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (237,'x500Name-match','urn:oasis:names:tc:xacml:1.0:function:x500Name-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (238,'rfc822Name-match','urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (239,'integer-intersection','urn:oasis:names:tc:xacml:1.0:function:integer-intersection',12,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (240,'double-intersection','urn:oasis:names:tc:xacml:1.0:function:double-intersection',25,1,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (241,'or','urn:oasis:names:tc:xacml:1.0:function:or',18,0,0,0,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (242,'and','urn:oasis:names:tc:xacml:1.0:function:and',18,0,0,0,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (243,'n-of','urn:oasis:names:tc:xacml:1.0:function:n-of',18,0,0,2,-1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (244,'not','urn:oasis:names:tc:xacml:1.0:function:not',18,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (245,'any-of','urn:oasis:names:tc:xacml:3.0:function:any-of',18,0,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (246,'all-of','urn:oasis:names:tc:xacml:3.0:function:all-of',18,0,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (247,'any-of-any','urn:oasis:names:tc:xacml:3.0:function:any-of-any',18,0,1,2,-1,1,-1,0);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (248,'all-of-any','urn:oasis:names:tc:xacml:1.0:function:all-of-any',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (249,'any-of-all','urn:oasis:names:tc:xacml:1.0:function:any-of-all',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (250,'all-of-all','urn:oasis:names:tc:xacml:1.0:function:all-of-all',18,0,1,3,3,2,2,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (251,'map','urn:oasis:names:tc:xacml:3.0:function:map',NULL,1,1,2,-1,1,-1,1);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (252,'xpath-node-count','urn:oasis:names:tc:xacml:3.0:function:xpath-node-count',12,0,0,1,1,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (253,'xpath-node-equal','urn:oasis:names:tc:xacml:3.0:function:xpath-node-equal',18,0,0,2,2,NULL,NULL,NULL);
-INSERT INTO FunctionDefinition (id, short_name, xacml_id, return_datatype, is_bag_return, is_higher_order, arg_lb, arg_ub, ho_arg_lb, ho_arg_ub, ho_primitive) VALUES (254,'xpath-node-match','urn:oasis:names:tc:xacml:3.0:function:xpath-node-match',18,0,0,2,2,NULL,NULL,NULL);
-
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (1,0,1,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (2,0,1,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (3,0,2,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (4,0,2,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (5,0,3,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (6,1,4,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (7,1,5,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (8,0,6,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (9,0,6,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (10,0,7,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (11,0,7,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (12,0,8,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (13,0,8,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (14,0,9,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (15,0,9,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (16,0,10,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (17,0,11,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (18,0,12,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (19,0,13,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (20,0,14,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (21,0,15,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (22,0,16,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (23,0,17,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (24,0,18,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (25,0,19,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (26,0,20,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (27,0,21,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (28,0,22,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (29,0,23,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (30,0,24,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (31,0,25,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (32,0,26,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (33,0,27,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (34,0,28,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (35,0,29,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (36,0,30,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (37,0,31,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (38,0,32,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (39,0,33,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (40,0,34,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (41,0,35,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (42,0,36,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (43,0,37,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (44,0,37,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (45,0,38,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (46,0,38,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (47,0,39,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (48,0,39,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (49,0,40,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (50,0,40,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (51,0,41,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (52,0,41,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (53,0,41,3,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (54,0,42,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (55,0,42,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (56,0,42,3,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (57,0,43,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (58,0,43,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (59,0,44,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (60,0,44,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (61,0,45,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (62,0,45,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (63,0,46,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (64,0,46,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (65,0,47,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (66,0,47,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (67,0,48,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (68,0,48,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (69,0,49,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (70,0,49,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (71,0,50,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (72,0,50,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (73,0,51,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (74,0,51,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (75,0,52,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (76,0,52,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (77,0,53,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (78,0,53,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (79,0,54,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (80,0,54,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (81,0,55,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (82,0,55,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (83,0,56,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (84,0,56,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (85,0,57,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (86,0,57,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (89,0,58,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (90,0,58,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (91,0,59,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (92,0,59,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (93,0,60,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (94,0,60,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (95,0,61,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (96,0,61,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (97,0,62,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (98,0,62,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (99,0,63,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (100,0,63,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (101,0,64,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (102,0,65,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (103,0,66,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (104,0,67,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (125,0,68,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (126,0,69,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (128,0,70,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (129,0,71,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (130,0,71,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (131,0,72,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (132,0,72,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (133,0,73,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (134,0,73,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (135,0,74,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (136,0,74,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (137,0,75,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (138,0,75,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (139,0,76,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (140,0,76,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (141,0,77,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (142,0,77,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (143,0,78,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (144,0,78,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (145,0,79,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (146,0,79,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (147,0,80,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (148,0,80,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (149,0,81,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (150,0,81,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (151,0,82,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (152,0,82,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (153,0,83,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (154,0,83,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (155,0,84,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (156,0,84,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (157,0,85,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (158,0,85,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (159,0,86,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (160,0,86,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (161,0,87,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (162,0,87,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (163,0,88,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (164,0,88,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (165,0,89,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (166,0,89,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (167,0,90,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (168,0,90,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (169,0,91,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (170,0,91,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (171,0,92,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (172,0,92,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (173,0,93,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (174,0,93,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (175,0,94,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (176,0,94,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (177,0,95,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (178,0,95,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (179,0,96,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (180,0,96,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (181,0,97,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (182,0,97,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (183,0,98,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (184,0,98,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (185,0,99,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (186,0,99,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (187,0,100,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (188,0,100,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (189,1,101,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (190,1,102,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (191,0,103,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (192,1,103,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (193,0,104,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (194,1,105,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (195,0,106,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (196,1,106,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (197,0,107,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (198,1,108,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (199,0,109,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (200,1,109,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (201,0,110,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (202,1,111,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (203,1,112,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (204,0,113,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (205,1,113,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (206,0,114,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (207,1,115,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (208,1,116,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (209,0,117,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (210,1,117,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (211,0,118,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (212,1,119,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (213,1,120,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (214,0,121,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (215,1,121,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (216,0,122,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (217,1,123,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (218,1,124,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (219,0,125,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (220,1,125,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (221,0,126,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (222,1,127,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (223,1,128,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (224,0,129,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (225,1,129,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (226,0,130,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (227,1,131,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (228,1,132,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (229,0,133,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (230,1,133,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (231,0,134,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (232,1,135,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (233,1,136,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (234,0,137,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (235,1,137,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (236,0,138,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (237,1,139,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (238,1,140,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (239,0,141,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (240,1,141,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (241,0,142,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (242,1,143,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (243,1,144,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (244,1,145,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (245,0,145,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (246,0,146,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (247,1,147,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (248,1,148,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (249,0,149,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (250,1,149,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (251,0,150,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (252,1,151,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (253,1,152,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (254,0,153,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (255,1,153,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (256,0,154,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (257,1,155,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (258,1,156,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (259,0,157,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (260,1,157,2,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (261,0,158,1,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (262,1,159,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (263,1,160,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (264,0,161,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (265,1,161,2,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (266,0,162,1,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (267,0,163,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (268,0,163,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (269,0,164,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (270,0,164,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (271,0,165,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (272,0,165,2,22);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (273,0,166,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (274,0,166,2,17);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (275,0,167,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (276,0,167,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (277,0,168,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (278,0,168,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (279,1,169,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (280,1,169,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (281,1,170,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (282,1,170,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (283,1,171,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (284,1,172,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (285,1,172,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (286,1,173,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (287,1,173,2,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (288,1,174,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (289,1,174,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (290,1,175,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (292,1,176,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (293,1,176,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (294,1,177,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (295,1,177,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (296,1,178,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (297,1,178,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (298,1,179,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (299,1,180,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (300,1,180,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (301,1,181,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (302,1,181,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (303,1,182,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (304,1,182,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (305,1,183,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (306,1,183,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (307,1,184,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (308,1,185,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (309,1,185,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (310,1,186,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (311,1,186,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (312,1,187,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (313,1,187,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (314,1,188,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (315,1,188,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (316,1,189,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (317,1,190,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (318,1,190,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (319,1,191,1,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (320,1,191,2,16);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (321,1,192,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (322,1,192,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (323,1,193,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (324,1,193,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (325,1,194,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (326,1,195,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (327,1,195,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (328,1,196,1,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (329,1,196,2,21);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (330,1,197,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (331,1,197,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (332,1,198,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (333,1,198,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (334,1,199,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (335,1,200,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (336,1,200,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (337,1,201,1,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (338,1,201,2,19);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (339,1,202,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (340,1,202,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (341,1,203,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (342,1,203,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (343,1,204,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (344,1,205,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (345,1,205,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (346,1,206,1,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (347,1,206,2,27);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (348,1,207,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (349,1,207,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (350,1,208,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (351,1,208,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (352,1,209,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (353,1,210,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (354,1,210,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (355,1,211,1,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (356,1,211,2,24);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (357,1,212,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (358,1,212,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (359,1,213,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (360,1,213,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (361,1,214,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (362,1,215,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (363,1,215,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (364,1,216,1,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (365,1,216,2,13);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (366,1,217,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (367,1,217,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (368,1,218,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (369,1,218,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (370,1,219,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (371,1,220,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (372,1,220,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (373,1,221,1,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (374,1,221,2,15);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (375,1,222,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (376,1,222,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (377,1,223,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (378,1,223,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (380,1,224,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (381,1,225,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (382,1,225,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (383,1,226,2,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (384,1,226,1,23);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (385,1,227,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (386,1,227,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (387,1,228,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (388,1,228,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (389,1,229,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (390,1,230,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (391,1,230,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (392,1,231,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (393,1,231,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (394,1,232,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (395,1,232,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (396,1,233,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (397,1,233,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (398,1,234,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (399,1,235,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (400,1,235,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (401,1,236,1,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (402,1,236,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (403,0,237,1,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (404,0,237,2,14);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (405,0,238,1,26);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (406,0,238,2,20);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (407,1,239,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (408,1,239,2,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (409,1,240,1,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (410,1,240,2,25);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (411,0,241,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (412,0,242,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (413,0,243,1,12);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (414,0,243,2,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (415,0,244,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (416,0,245,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (417,0,245,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (418,1,245,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (419,0,246,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (420,0,246,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (421,1,246,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (422,0,247,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (423,1,247,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (424,1,247,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (433,0,248,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (434,1,248,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (435,1,248,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (436,0,249,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (437,1,249,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (438,1,249,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (439,0,250,1,18);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (440,1,250,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (441,1,250,3,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (442,0,251,1,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (447,1,251,2,NULL);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (448,0,252,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (449,0,253,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (450,0,253,2,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (451,0,254,1,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (452,0,254,2,28);
-INSERT INTO FunctionArguments (id, is_bag, function_id, arg_index, datatype_id) VALUES (453,0,92,3,16);
-
-INSERT INTO PIPType VALUES (500,'SQL'), (501,'LDAP'), (502,'CSV'), (503,'Hyper-CSV'), (504,'Custom');
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql
deleted file mode 100644
index 8aee7ee..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/META-INF/drop.sql
+++ /dev/null
@@ -1,21 +0,0 @@
-DROP TABLE IF EXISTS AttributeAssignment;
-DROP TABLE IF EXISTS ConstraintValues;
-DROP TABLE IF EXISTS ObadviceExpressions;
-DROP TABLE IF EXISTS Attribute;
-DROP TABLE IF EXISTS Category;
-DROP TABLE IF EXISTS ConstraintType;
-DROP VIEW IF EXISTS match_functions;
-DROP VIEW IF EXISTS higherorder_bag_functions;
-DROP VIEW IF EXISTS function_flattener;
-DROP TABLE IF EXISTS FunctionArguments;
-DROP TABLE IF EXISTS FunctionDefinition;
-DROP TABLE IF EXISTS Datatype;
-DROP TABLE IF EXISTS Obadvice;
-DROP TABLE IF EXISTS PIPConfigParams;
-DROP TABLE IF EXISTS PIPResolverParams;
-DROP TABLE IF EXISTS PIPResolver;
-DROP TABLE IF EXISTS PIPConfiguration;
-DROP TABLE IF EXISTS PIPType;
-DROP TABLE IF EXISTS PolicyAlgorithms;
-DROP TABLE IF EXISTS RuleAlgorithms;
-DROP TABLE IF EXISTS SEQUENCE;
\ No newline at end of file
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql
deleted file mode 100644
index e69de29..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/META-INF/empty.sql
+++ /dev/null
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml b/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 79594a9..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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-ADMIN">
-		<class>org.apache.openaz.xacml.admin.jpa.Attribute</class>
-		<class>org.apache.openaz.xacml.admin.jpa.AttributeAssignment</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Category</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ConstraintType</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ConstraintValue</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Datatype</class>
-		<class>org.apache.openaz.xacml.admin.jpa.Obadvice</class>
-		<class>org.apache.openaz.xacml.admin.jpa.ObadviceExpression</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PolicyAlgorithms</class>
-		<class>org.apache.openaz.xacml.admin.jpa.RuleAlgorithms</class>
-		<class>org.apache.openaz.xacml.admin.jpa.FunctionArgument</class>
-		<class>org.apache.openaz.xacml.admin.jpa.FunctionDefinition</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPConfigParam</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPConfiguration</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPResolver</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPResolverParam</class>
-		<class>org.apache.openaz.xacml.admin.jpa.PIPType</class>
-		<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>
diff --git a/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql b/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql
deleted file mode 100644
index 7c4a820..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/META-INF/views.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-
-CREATE VIEW match_functions AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.XACML_ID AS xacmlid,	D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return,	D.ARG_LB AS arg_lb,	D.ARG_UB AS arg_ub,	A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag,	A2.DATATYPE_ID AS arg2_datatype FROM (FunctionDefinition D left join FunctionArguments A1 on (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 on (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2)) where (D.ARG_LB = 2 and D.ARG_UB = 2 and D.RETURN_DATATYPE = 18 and A1.IS_BAG = 0) order by D.SHORT_NAME;
-
-CREATE VIEW function_flattener AS SELECT D.ID AS id, D.SHORT_NAME AS shortname, D.RETURN_DATATYPE AS return_datatype, D.IS_BAG_RETURN AS is_bag_return, D.IS_HIGHER_ORDER AS is_higher_order, D.ARG_LB AS arg_lb, D.ARG_UB AS arg_ub, A1.IS_BAG AS arg1_isbag, A1.DATATYPE_ID AS arg1_datatype, A2.IS_BAG AS arg2_isbag, A2.DATATYPE_ID AS arg2_datatype, A3.IS_BAG AS arg3_isbag, A3.DATATYPE_ID AS arg3_datatype FROM (FunctionDefinition D left join FunctionArguments A1 ON (A1.FUNCTION_ID = D.ID and A1.ARG_INDEX = 1) left join FunctionArguments A2 ON (A2.FUNCTION_ID = D.ID and A2.ARG_INDEX = 2) LEFT JOIN FunctionArguments A3 ON (A3.FUNCTION_ID = D.ID and A3.ARG_INDEX = 3)) ORDER BY D.ID;
-
-CREATE VIEW higherorder_bag_functions AS SELECT * FROM function_flattener WHERE is_higher_order = 1 AND is_bag_return = 1 AND return_datatype=18 AND arg_lb=2 AND arg_ub=2 AND arg1_isbag = 1 AND (arg2_isbag = 1 OR arg2_isbag IS NULL);
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss
deleted file mode 100644
index a5670b7..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/addons.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This file is automatically managed and will be overwritten from time to time. */
-/* Do not manually edit this file. */
-
-/* Import and include this mixin into your project theme to include the addon themes */
-@mixin addons {
-}
-
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico
deleted file mode 100644
index bfd212e..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png
deleted file mode 100644
index 9980604..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/MenuSeparator.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png
deleted file mode 100644
index c7443d1..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/add.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png
deleted file mode 100644
index 3de9e04..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png
deleted file mode 100644
index a3c243b..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/advice-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png
deleted file mode 100644
index bc7ad9e..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_blu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png
deleted file mode 100644
index ef73ffa..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_dkblu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png
deleted file mode 100644
index 7b22aa8..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_grn_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png
deleted file mode 100644
index e0592a6..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_mag_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png
deleted file mode 100644
index 65e4985..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_approval_icon_org_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png
deleted file mode 100644
index 282bba6..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_blu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png
deleted file mode 100644
index c033369..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_dkblu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png
deleted file mode 100644
index 05787f5..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_grn_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png
deleted file mode 100644
index 8d207b9..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_mag_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png
deleted file mode 100644
index f735262..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_lock_icon_org_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png
deleted file mode 100644
index 5feb76c..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_blu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png
deleted file mode 100644
index 69f72f9..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_dkblu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png
deleted file mode 100644
index 758257f..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_grn_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png
deleted file mode 100644
index 247d066..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_mag_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png
deleted file mode 100644
index 993faab..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_protect_icon_org_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png
deleted file mode 100644
index a5e228f..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_blu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png
deleted file mode 100644
index d8239e1..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_dkblu_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png
deleted file mode 100644
index 6e249f7..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_grn_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png
deleted file mode 100644
index b4fc229..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_mag_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png
deleted file mode 100644
index b7f0fa7..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/att_support_icon_org_rgb.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png
deleted file mode 100644
index ffeec58..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/combine.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png
deleted file mode 100644
index fa300a8..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png
deleted file mode 100644
index 2d8ba95..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/condition-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png
deleted file mode 100644
index 234f9f5..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png
deleted file mode 100644
index 1c53527..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/deny-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png
deleted file mode 100644
index 732d7b6..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/key.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png
deleted file mode 100644
index c35c84d..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/link.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png
deleted file mode 100644
index a1533f2..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png
deleted file mode 100644
index 189cc11..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/obligation-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png
deleted file mode 100644
index 4524177..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png
deleted file mode 100644
index a11fffd..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/permit-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png
deleted file mode 100644
index 99cd51b..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policy.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png
deleted file mode 100644
index 64693e2..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/policyset.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png
deleted file mode 100644
index 4a23967..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/refresh.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png
deleted file mode 100644
index 945e15c..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/remove.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png
deleted file mode 100644
index 01e9c68..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/rule.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png
deleted file mode 100644
index 48f3b6c..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png
deleted file mode 100644
index 7386e4f..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target-green-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png
deleted file mode 100644
index 74a6ca2..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/target.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png
deleted file mode 100644
index 43e92f9..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-16.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png
deleted file mode 100644
index c4affb6..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/icons/variable-32.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png
deleted file mode 100644
index 9f6e629..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png
deleted file mode 100644
index 8f612a7..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/img/att_globe_rgb_grd_pos.png
+++ /dev/null
Binary files differ
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss
deleted file mode 100644
index 77baa29..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/styles.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-@import "addons.scss";
-@import "xacml_pap_admin.scss";
-
-/* This file prefixes all rules with the theme name to avoid causing conflicts with other themes. */
-/* The actual styles should be defined in xacml_pap_admin.scss */
-.xacml_pap_admin {
-  @include addons;
-  @include xacml_pap_admin;
-}
diff --git a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss b/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss
deleted file mode 100644
index fb29c5d..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/VAADIN/themes/xacml_pap_admin/xacml_pap_admin.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Import the reindeer theme.*/
-/* This only allows us to use the mixins defined in it and does not add any styles by itself. */
-@import "../reindeer/reindeer.scss";
-
-/* This contains all of your theme.*/
-/* If somebody wants to extend the theme she will include this mixin. */
-@mixin xacml_pap_admin {
-  /* Include all the styles from the reindeer theme */
-  @include reindeer;
-
-  /* Insert your theme rules here */
-  
-  .v-textfield-dashing {
-    border:     thin dashed;
-    background: white; /* Has shading image by default */
-	}
-	
-/* Lay the options horizontally */
-.v-select-optiongroup-horizontal .v-select-option {
-    display: inline-block;
-}
-
-/* Avoid wrapping if the layout is too tight */
-.v-select-optiongroup-horizontal {
-    white-space: nowrap;
-}
-
-/* Some extra spacing is needed */
-.v-select-optiongroup-horizontal
-  .v-select-option.v-radiobutton {
-    padding-right: 10px;
-}
-
-.v-textfield { 
-	min-width:400px;
-}
-
-.v-textarea { 
-	min-width:250px;
-}
-
-}
diff --git a/openaz-xacml-pap-admin/src/main/resources/log4j.properties b/openaz-xacml-pap-admin/src/main/resources/log4j.properties
deleted file mode 100644
index aeee9f8..0000000
--- a/openaz-xacml-pap-admin/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-#
-# Use this properties for debugging and development.
-#
-#
-# Set root logger level
-log4j.rootLogger=DEBUG, MAIN_LOG
-
-# console is set to be a ConsoleAppender.
-log4j.appender.MAIN_LOG=org.apache.log4j.ConsoleAppender
-
-# A1 uses PatternLayout.
-log4j.appender.MAIN_LOG.layout=org.apache.log4j.PatternLayout
-log4j.appender.MAIN_LOG.layout.ConversionPattern=%d{yyyy_MM_dd_HH_mm_ss_SSS} [%t] %-5p %l- %m%n
diff --git a/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml b/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 9e06c81..0000000
--- a/openaz-xacml-pap-admin/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You 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.
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-  version="3.0"
-  metadata-complete="true">
-
-  <display-name>Apache OpenAZ</display-name>
-  <description></description>
-	<welcome-file-list>
-		<welcome-file>index.html</welcome-file>
-		<welcome-file>index.htm</welcome-file>
-		<welcome-file>index.jsp</welcome-file>
-		<welcome-file>default.html</welcome-file>
-		<welcome-file>default.htm</welcome-file>
-		<welcome-file>default.jsp</welcome-file>
-	</welcome-file-list>
-
-
-	<!-- Policy Engine PAP Administration -->
-	<servlet>
-		<servlet-name>PePapAdmin</servlet-name>
-
-		<!-- <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> -->
-		<servlet-class>org.apache.openaz.xacml.admin.XacmlAdminServlet</servlet-class>
-
-		<init-param>
-			<description>Vaadin UI Class: XacmlAdminUI</description>
-			<param-name>UI</param-name>
-			<param-value>org.apache.openaz.xacml.admin.XacmlAdminUI</param-value>
-		</init-param>
-
-		<init-param>
-			<description>The location of the properties file holding configuration information.</description>
-			<param-name>XACML_PROPERTIES_NAME</param-name>
-			<param-value>/opt/app/xacml/etc/xacml.admin.properties</param-value>
-		</init-param>
-
-	</servlet>
-
-	<servlet-mapping>
-		<servlet-name>PePapAdmin</servlet-name>
-		<url-pattern>/*</url-pattern>
-	</servlet-mapping>
-</web-app>
