diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..2125666
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d4954dd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,22 @@
+target
+**/target/*
+**/derby.log
+**/.project
+**/.classpath
+**/.settings/
+.gradle/
+.svn/
+.idea
+**/*.iml
+docs/db/ddl/*.ddl
+*.ddl
+uddi-tck/pref-rpt-*.txt
+nb-configuration.xml
+*.orig
+uddi-tck/drivers/
+*.releaseBackup
+*.versionsBackup
+**/bin/Debug/*
+**/obj/**
+*.suo
+juddi-client.net/.vs/juddi-client.net/v15/**
diff --git a/KEYS b/KEYS
index 17bdcde..e3b0a17 100644
--- a/KEYS
+++ b/KEYS
@@ -62,3 +62,37 @@
 f+bKmTLT7oLzf+sAoIeCfFt8vA6ovF3RkvN05O65WPcD
 =5V68
 -----END PGP PUBLIC KEY BLOCK-----
+
+
+pub   rsa4096 2018-11-23 [SC] [expires: 2023-11-22]
+      3A1AAFA9B89A1D1DDD5F3A4B98AD2E19BFF4106D
+uid           [ultimate] Alex O'Ree <alexoree@apache.org>
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBFv3+7oBEADXMQXwYMxs45ePjno3XcOouM5NMCYsKk6qmrCBr2ffLLTPER6M
+9KtyYAqCqe1DQmB0BRau1GuBRN6mydzILjVaJ6B1S+SsDGHOTDpTVyKUKSkQ292X
+KzGq3w5xqvQ1ZP1Iob38XvGQDR2vKnqDeZhVcCsDrbMPBpO3bxCCwrztwHogGZiA
+wejypOGlYz3stRY7SKvFkuuH75An6KGx/C9VDh8EH0tUT3hQ09On1/m6+I/8X3YR
+WUhCj5WuUg9oaI0MCd9CjgKRH7PEnemFhb1iXBxcOn8vC8hRmYqsl54gIhfF9T8P
+HdyTfqji7AKNu3zz3yiiaqlteZewxFyjhwnjvmJMQ+D5Mt9ZfexuDIMY7319psiY
+w8x8CuDb1NPq3vR/P0oo5baldIk2r3K0uOdXBGOls1bbqUTv2V+fFdAzk7qC+kxU
+PrEpkFKMKd2jtkcO/0Qfgn5r5r7aU1AyGRbXT7fySMT2/6GFu4XSrVWBtjFP9u7F
+5ELb19dFaQk6eUCr+ZMTwz5TP6pajDp3NSBX+lXZipYHQEIcwk0P8kSwHwqVUhgr
+uAlyy5E/bvmBxX0nFZVbGwlUedT2OkwhU2FeQKfMG9Ohimpx0qK0XQbRRAaJ8AI9
+ws3rC/RkPdfOZvgIdGScf+aNJNb9/5pnSUx+bpBppg7MhbWTnRkkCR1qsQARAQAB
+tCBBbGV4IE8nUmVlIDxhbGV4b3JlZUBhcGFjaGUub3JnPokCVAQTAQgAPhYhBDoa
+r6m4mh0d3V86S5itLhm/9BBtBQJb9/u6AhsDBQkJZgGABQsJCAcCBhUKCQgLAgQW
+AgMBAh4BAheAAAoJEJitLhm/9BBt8jEQAKU8DFRyiVFVK+k+TwVIFgS7ZF3uV48p
+6I6VSCZUQsWYJWu0LnT8k/vi1lSz3i4080J5vB/8pkuYtJW3Bfv15BcZ6xDg9Asm
+XcAvt/sS315x+TyjBeqvfi3yJEVlCySduc3PeoMVLOZmtPcmbeajAmHh9P1TkZ7g
+f9sXtdzXrnViwMYMs+CN91qlWCfZJopfomEf1aazhJixYfjjh12wwSfLRsa7cHWd
+XeuTdXg7xAOnegLLdfzgzpQdRC67QM6K6GmucqY0dCKIWIgN1UuV5n33336fI0WB
+RR+LKGTZK39l2ddh0iizurJO9QYM4m8FmhVmym2e/2ClY3N1QniXU1a8ZGIPlSIS
+/tbyMYXt+3CiP9P+nyrQKoilCX54L1RdwOrDb7Z1B4DnQqls6MrdEphHtZMdDkeX
+INBX9q3P7J4SrwA5xAbvevaVHJ5mk7rgmG2V1FVGmDeX8ACF4ONfOs4T4C1bTMhw
+SOM+ulVAtr1nsrDZWO7/Kv9LlVXr1/pbOZuRp6ioveQlZZNzzfjLm4WxpeTqeQ4w
+PJzYFhDkrJXyb4GOhnsyVyHclxnMWP3xB0iV4BFyY92SMIPfnaoLoI4sBui+Ua7i
+PUwMIH473BaLm7fvqothns0DAmXYd+VKpAx0zta0ucya0wtBXY0xaz7h4vVHB6zJ
+Ui44RuYe758D
+=LGw7
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/README b/README
index dfdf991..ed3827e 100644
--- a/README
+++ b/README
@@ -87,6 +87,15 @@
   
     dev-subscribe@juddi.apache.org
 
+Release Notes - Scout - Version 1.2.8
+
+Bug
+
+	[SCOUT-136] - Scout adds sort by name desc to findBinding UDDI requests, which is invalid 
+	[SCOUT-135] - Fix for mismatch with UDDI Address Line
+	[SCOUT-134] - Updates dependencies and code to match the jUDDI 3.1.5 APIs
+
+	
 Release Notes - Scout - Version 1.2.7
 
 Bug
diff --git a/pom.xml b/pom.xml
index a9bb06c..64814fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,825 +1,867 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache</groupId>
-		<artifactId>apache</artifactId>
-		<version>6</version>
-	</parent>
-	<groupId>org.apache.juddi.scout</groupId>
-	<artifactId>scout</artifactId>
-	<version>1.2.8-SNAPSHOT</version>
-	<packaging>bundle</packaging>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>19</version>
+    </parent>
+    <groupId>org.apache.juddi.scout</groupId>
+    <artifactId>scout</artifactId>
+    <version>1.2.8-SNAPSHOT</version>
+    <packaging>jar</packaging>
 
-	<properties>
-		<juddi.registry.version>3.1.3</juddi.registry.version>
-	</properties>
+    <properties>
+        <javadoc.extra.settings />
+        <juddi.registry.version>3.3.6-SNAPSHOT</juddi.registry.version>
+    </properties>
 
-	<prerequisites>
-		<maven>3.0.3</maven>
-	</prerequisites>
 
-	<name>Apache Scout</name>
-	<description>
+    <name>Apache Scout</name>
+    <description>
         Apache Scout is an implementation of the JSR 93 - JavaTM API for
         XML Registries 1.0 (JAXR)
     </description>
-	<url>http://juddi.apache.org/scout/</url>
-	<issueManagement>
-		<system>JIRA</system>
-		<url>http://issues.apache.org/jira/browse/SCOUT</url>
-	</issueManagement>
-	<ciManagement>
-		<system>Continuum</system>
-		<url>http://vmbuild.apache.org</url>
-		<notifiers>
-			<notifier>
-				<sendOnError>true</sendOnError>
-				<sendOnFailure>true</sendOnFailure>
-				<sendOnSuccess>true</sendOnSuccess>
-				<sendOnWarning>true</sendOnWarning>
-				<configuration>
-					<address>juddi-dev@apache.org</address>
-				</configuration>
-			</notifier>
-		</notifiers>
-	</ciManagement>
-	<inceptionYear>2004</inceptionYear>
-	<mailingLists>
-		<mailingList>
-			<name>jUDDI/Scout Developers</name>
-			<subscribe>juddi-dev-subscribe@apache.org</subscribe>
-			<unsubscribe>juddi-dev-unsubscribe@apache.org</unsubscribe>
-			<post>juddi-dev@apache.org</post>
-			<archive>http://mail-archives.apache.org/mod_mbox/juddi-dev/</archive>
-		</mailingList>
-	</mailingLists>
-	<developers>
-		<developer>
-			<id>anil</id>
-			<name>Anil Saldhana</name>
-			<email>anil@apache.org</email>
-			<organization />
-		</developer>
-		<developer>
-			<id>djencks</id>
-			<name>David Jencks</name>
-			<email>djencks@apache.org</email>
-			<organization />
-		</developer>
-		<developer>
-			<id>kstam</id>
-			<name>Kurt T Stam</name>
-			<email>kstam@apache.org</email>
-			<organization />
-		</developer>
-		<developer>
-			<id>jfaath</id>
-			<name>Jeff Faath</name>
-			<email>jfaath@apache.org</email>
-			<organization />
-		</developer>
-		<developer>
-			<name>Steve Viens</name>
-			<email>sviens@apache.org</email>
-			<organization />
-		</developer>
-		<developer>
-			<id>tcunning</id>
-			<name>Tom Cunningham</name>
-			<email>tcunning@apache.org</email>
-			<organization />
-		</developer>
-	</developers>
-	<contributors>
-		<contributor>
-			<name>Deepack Bhole</name>
-			<email>dbhole@apache.org</email>
-			<organization />
-		</contributor>
-		<contributor>
-			<name>Davanum Srinivas</name>
-			<email>dims@yahoo.com</email>
-			<organization />
-		</contributor>
-		<contributor>
-			<name>Geir Magnusson Jr.</name>
-			<email>geirm@apache.org</email>
-			<organization />
-		</contributor>
-		<contributor>
-			<name>Lin Sun</name>
-			<email>linsun@apache.org</email>
-			<organization />
-		</contributor>
-		<contributor>
-			<name>Jarek Gawor</name>
-			<email>gawor@apache.org</email>
-			<organization />
-		</contributor>
-		<contributor>
-			<name>Jeremy Boynes</name>
-			<email>jboynes@apache.org</email>
-			<organization />
-		</contributor>
-	</contributors>
-	<licenses>
-		<license>
-			<name>The Apache Software License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
-	<scm>
-		<connection>scm:svn:https://svn.apache.org/repos/asf/juddi/scout/trunk</connection>
-		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/juddi/scout/trunk</developerConnection>
-		<url>http://svn.apache.org/viewcvs.cgi/juddi/scout/trunk</url>
-	</scm>
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-activation_1.1_spec</artifactId>
-			<version>1.0.2</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-jaxb_2.1_spec</artifactId>
-			<version>1.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-jaxr_1.0_spec</artifactId>
-			<version>2.0.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-jaxrpc_1.1_spec</artifactId>
-			<version>2.0.0</version>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-saaj_1.3_spec</artifactId>
-			<version>1.0.1</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.geronimo.specs</groupId>
-			<artifactId>geronimo-stax-api_1.0_spec</artifactId>
-			<version>1.0.1</version>
-		</dependency>
+    <url>http://juddi.apache.org/scout/</url>
+    <issueManagement>
+        <system>JIRA</system>
+        <url>http://issues.apache.org/jira/browse/SCOUT</url>
+    </issueManagement>
+    <ciManagement>
+        <system>Continuum</system>
+        <url>http://vmbuild.apache.org</url>
+        <notifiers>
+            <notifier>
+                <sendOnError>true</sendOnError>
+                <sendOnFailure>true</sendOnFailure>
+                <sendOnSuccess>true</sendOnSuccess>
+                <sendOnWarning>true</sendOnWarning>
+                <configuration>
+                    <address>juddi-dev@apache.org</address>
+                </configuration>
+            </notifier>
+        </notifiers>
+    </ciManagement>
+    <inceptionYear>2004</inceptionYear>
+    <mailingLists>
+        <mailingList>
+            <name>jUDDI/Scout Developers</name>
+            <subscribe>juddi-dev-subscribe@apache.org</subscribe>
+            <unsubscribe>juddi-dev-unsubscribe@apache.org</unsubscribe>
+            <post>juddi-dev@apache.org</post>
+            <archive>http://mail-archives.apache.org/mod_mbox/juddi-dev/</archive>
+        </mailingList>
+    </mailingLists>
+    <developers>
+        <developer>
+            <id>anil</id>
+            <name>Anil Saldhana</name>
+            <email>anil@apache.org</email>
+            <organization />
+        </developer>
+        <developer>
+            <id>djencks</id>
+            <name>David Jencks</name>
+            <email>djencks@apache.org</email>
+            <organization />
+        </developer>
+        <developer>
+            <id>kstam</id>
+            <name>Kurt T Stam</name>
+            <email>kstam@apache.org</email>
+            <organization />
+        </developer>
+        <developer>
+            <id>jfaath</id>
+            <name>Jeff Faath</name>
+            <email>jfaath@apache.org</email>
+            <organization />
+        </developer>
+        <developer>
+            <name>Steve Viens</name>
+            <email>sviens@apache.org</email>
+            <organization />
+        </developer>
+        <developer>
+            <id>tcunning</id>
+            <name>Tom Cunningham</name>
+            <email>tcunning@apache.org</email>
+            <organization />
+        </developer>
+    </developers>
+    <contributors>
+        <contributor>
+            <name>Deepack Bhole</name>
+            <email>dbhole@apache.org</email>
+            <organization />
+        </contributor>
+        <contributor>
+            <name>Davanum Srinivas</name>
+            <email>dims@yahoo.com</email>
+            <organization />
+        </contributor>
+        <contributor>
+            <name>Geir Magnusson Jr.</name>
+            <email>geirm@apache.org</email>
+            <organization />
+        </contributor>
+        <contributor>
+            <name>Lin Sun</name>
+            <email>linsun@apache.org</email>
+            <organization />
+        </contributor>
+        <contributor>
+            <name>Jarek Gawor</name>
+            <email>gawor@apache.org</email>
+            <organization />
+        </contributor>
+        <contributor>
+            <name>Jeremy Boynes</name>
+            <email>jboynes@apache.org</email>
+            <organization />
+        </contributor>
+    </contributors>
+    <licenses>
+        <license>
+            <name>The Apache Software License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+    <scm>
+        <connection>scm:svn:https://svn.apache.org/repos/asf/juddi/scout/trunk</connection>
+        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/juddi/scout/trunk</developerConnection>
+        <url>http://svn.apache.org/viewcvs.cgi/juddi/scout/trunk</url>
+    </scm>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-activation_1.1_spec</artifactId>
+            <version>1.0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxb_2.1_spec</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxr_1.0_spec</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-jaxrpc_1.1_spec</artifactId>
+            <version>2.0.0</version>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-saaj_1.3_spec</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-stax-api_1.0_spec</artifactId>
+            <version>1.0.1</version>
+        </dependency>
 
-		<dependency>
-			<groupId>axis</groupId>
-			<artifactId>axis</artifactId>
-			<version>1.4</version>
-			<optional>true</optional>
-			<exclusions>
-				<exclusion>
-					<groupId>org.apache.axis</groupId>
-					<artifactId>axis-jaxrpc</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.axis</groupId>
-					<artifactId>axis-saaj</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.axis</groupId>
-					<artifactId>axis-wsdl4j</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>commons-discovery</groupId>
-					<artifactId>commons-discovery</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
-			<groupId>axis</groupId>
-			<artifactId>axis-saaj</artifactId>
-			<version>1.4</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>axis</groupId>
-			<artifactId>axis-jaxrpc</artifactId>
-			<version>1.4</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>commons-discovery</groupId>
-			<artifactId>commons-discovery</artifactId>
-			<version>0.2</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>commons-logging</groupId>
-			<artifactId>commons-logging</artifactId>
-			<version>1.1</version>
-			<optional>true</optional>
-			<exclusions>
-				<exclusion>
-					<groupId>logkit</groupId>
-					<artifactId>logkit</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>avalon-framework</groupId>
-					<artifactId>avalon-framework</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>javax.servlet</groupId>
-					<artifactId>servlet-api</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-    <dependency>
-      <groupId>org.apache.juddi</groupId>
-      <artifactId>juddi-client</artifactId>
-      <version>${juddi.registry.version}</version>
-    </dependency>
+        <dependency>
+            <groupId>axis</groupId>
+            <artifactId>axis</artifactId>
+            <version>1.4</version>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.axis</groupId>
+                    <artifactId>axis-jaxrpc</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.axis</groupId>
+                    <artifactId>axis-saaj</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.axis</groupId>
+                    <artifactId>axis-wsdl4j</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>commons-discovery</groupId>
+                    <artifactId>commons-discovery</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>axis</groupId>
+            <artifactId>axis-saaj</artifactId>
+            <version>1.4</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>axis</groupId>
+            <artifactId>axis-jaxrpc</artifactId>
+            <version>1.4</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-discovery</groupId>
+            <artifactId>commons-discovery</artifactId>
+            <version>0.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.1</version>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>logkit</groupId>
+                    <artifactId>logkit</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>avalon-framework</groupId>
+                    <artifactId>avalon-framework</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>javax.servlet</groupId>
+                    <artifactId>servlet-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.juddi</groupId>
+            <artifactId>juddi-client</artifactId>
+            <version>${juddi.registry.version}</version>
+        </dependency>
 
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.5</version>
-			<scope>test</scope>
-		</dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
 
 	
 
-		<dependency>
-			<groupId>org.apache.derby</groupId>
-			<artifactId>derby</artifactId>
-			<version>10.1.2.1</version>
-			<scope>test</scope>
-		</dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <version>10.14.2.0</version>
+            <scope>test</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>log4j</groupId>
-			<artifactId>log4j</artifactId>
-			<version>1.2.13</version>
-			<scope>test</scope>
-		</dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+            <scope>test</scope>
+        </dependency>
 
-		<dependency>
-			<groupId>org.aspectj</groupId>
-			<artifactId>aspectjrt</artifactId>
-			<version>1.6.1</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>aspectj</groupId>
-			<artifactId>aspectjweaver</artifactId>
-			<version>1.5.2</version>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-	<repositories>
-		<repository>
-			<id>maven2-repository.dev.java.net</id>
-			<name>Java.net Maven 2 Repository</name>
-			<url>http://download.java.net/maven/2</url>
-			<layout>default</layout>
-		</repository>
-		<repository>
-			<id>apache.nexus</id>
-			<name>Apache NEXUS Maven 2 Repository</name>
-			<url>https://repository.apache.org/content/repositories/releases/</url>
-			<layout>default</layout>
-			<snapshots> 
-				<enabled>false</enabled> 
-			</snapshots>
-		</repository>
-	</repositories>
-	<build>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.codehaus.mojo</groupId>
-					<artifactId>aspectj-maven-plugin</artifactId>
-					<version>1.3</version>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>1.6.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>1.5.2</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <repositories>
+        <repository>
+            <id>maven2-repository.dev.java.net</id>
+            <name>Java.net Maven 2 Repository</name>
+            <url>http://download.java.net/maven/2</url>
+            <layout>default</layout>
+        </repository>
+        <repository>
+            <id>apache.nexus</id>
+            <name>Apache NEXUS Maven 2 Repository</name>
+            <url>https://repository.apache.org/content/repositories/releases/</url>
+            <layout>default</layout>
+            <snapshots> 
+                <enabled>false</enabled> 
+            </snapshots>
+        </repository>
+    </repositories>
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<configuration>
+						<aggregate>true</aggregate>
+						<additionalparam>${javadoc.extra.settings}</additionalparam>
+					</configuration>
 					<executions>
 						<execution>
+							<id>aggregate</id>
 							<goals>
-								<goal>test-compile</goal> <!-- use this goal to weave all your test classes -->
+								<goal>aggregate</goal>
 							</goals>
+							<phase>site</phase>
 						</execution>
 					</executions>
 				</plugin>
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-release-plugin</artifactId>
-					<version>2.1</version>
-					<configuration>
-						<autoVersionSubmodules>true</autoVersionSubmodules>
-						<preparationGoals>clean install</preparationGoals>
-						<goals>deploy</goals>
-						<releaseProfiles>apache-release</releaseProfiles>
-					</configuration>
-				</plugin>
+                <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        <version>2.6</version>
+                </plugin>
+                <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-site-plugin</artifactId>
+                        <version>3.6</version>
+                        
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>aspectj-maven-plugin</artifactId>
+                    <version>1.3</version>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>test-compile</goal> <!-- use this goal to weave all your test classes -->
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-release-plugin</artifactId>
+                    <version>2.1</version>
+                    <configuration>
+                        <autoVersionSubmodules>true</autoVersionSubmodules>
+                        <preparationGoals>clean install</preparationGoals>
+                        <goals>deploy</goals>
+                        <releaseProfiles>apache-release</releaseProfiles>
+                    </configuration>
+                </plugin>
 
-			</plugins>
-		</pluginManagement>
-		<plugins>
-			<plugin>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<inherited>true</inherited>
-				<configuration>
-					<source>1.5</source>
-					<target>1.5</target>
-				</configuration>
-			</plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <version>3.0.0-M1</version>
+                <executions>
+                  <execution>
+                        <id>enforce-versions</id>
+                        <goals>
+                          <goal>enforce</goal>
+                        </goals>
+                        <phase>validate</phase>
+                        <configuration>
+                          <rules>
 
-
-			<plugin>
-				<groupId>org.apache.felix</groupId>
-				<artifactId>maven-bundle-plugin</artifactId>
-				<version>2.0.0</version>
-				<extensions>true</extensions>
-				<configuration>
-					<instructions>
-						<Import-Package>org.apache.axis.*;resolution:=optional,*</Import-Package>
-					</instructions>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>ianal-maven-plugin</artifactId>
-				<version>1.0-alpha-1</version>
-			</plugin>
-
-		</plugins>
-	</build>
-	<distributionManagement>
-		<site>
-			<id>website</id>
-			<url>scpexe://people.apache.org/www/juddi.apache.org/scout</url>
-		</site>
-	</distributionManagement>
-
-	<profiles>
-		<profile>
-			<id>uddiv2</id>
-			<activation>
-				<activeByDefault>true</activeByDefault>
-			</activation>
-			<dependencies>
-				<dependency>
-					<groupId>org.apache.juddi</groupId>
-					<artifactId>juddi</artifactId>
-					<version>2.0.1</version>
-					<scope>test</scope>
-				</dependency>
-				    <!--  have to figure out which dependencies of 3.0.2 make the uddiv2 build work -->
-					<dependency>
-						<groupId>org.apache.juddi</groupId>
-						<artifactId>uddi-ws</artifactId>
-						<version>3.0.2</version>
-					</dependency>
-			</dependencies>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-surefire-plugin</artifactId>
-						<version>2.4</version>
-						<configuration>
-							<skip>true</skip>
-							<includes>
-								<include>**/*Test.java</include>
-							</includes>
-							<systemProperties>
-								<property>
-									<name>derby.stream.error.file</name>
-									<value>target/derby.log</value>
-								</property>
-								<property>
-									<name>java.io.tmpdir</name>
-									<value>${basedir}/temp</value>
-								</property>
-							</systemProperties>
-							<environmentVariables>
-								<uddi.version>2</uddi.version>
-							</environmentVariables>
-						</configuration>
-						<executions>
-							<execution>
-								<id>surefire-it</id>
-								<phase>integration-test</phase>
-								<goals>
-									<goal>test</goal>
-								</goals>
-								<configuration>
-									<skip>false</skip>
-									<systemProperties>
-										<property>
-											<name>cactus.contextURL</name>
-											<value>http://localhost:8880/juddi</value>
-										</property>
-										<property>
-											<name>java.io.tmpdir</name>
-											<value>${basedir}/temp</value>
-										</property>
-									</systemProperties>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-		<profile>
-			<id>uddiv3</id>
-			<activation>
-				<activeByDefault>false</activeByDefault>
-			</activation>
-			<dependencies>
-				<dependency>
-					<groupId>org.apache.juddi</groupId>
-					<artifactId>juddi-tomcat</artifactId>
-					<version>${juddi.registry.version}</version>
-					<scope>test</scope>
-					<type>zip</type>
-				</dependency>
-					<dependency>
-						<groupId>org.apache.juddi</groupId>
-						<artifactId>uddi-ws</artifactId>
-						<version>${juddi.registry.version}</version>
-					</dependency>
-			</dependencies>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-dependency-plugin</artifactId>
-						<version>2.1</version>
-						<executions>
-							<execution>
-								<id>copy</id>
-								<phase>package</phase>
-								<goals>
-									<goal>copy</goal>
-								</goals>
-								<configuration>
-									<artifactItems>
-										<artifactItem>
-											<groupId>org.apache.juddi</groupId>
-											<artifactId>juddi-tomcat</artifactId>
-											<version>${juddi.registry.version}</version>
-											<type>zip</type>
-											<outputDirectory>${basedir}/target</outputDirectory>
-										</artifactItem>
-									</artifactItems>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-antrun-plugin</artifactId>
-						<version>1.3</version>
-						<executions>
-							<execution>
-								<id>test</id>
-								<phase>pre-integration-test</phase>
-								<configuration>
-									<tasks>
-										<unzip dest="target" src="target/juddi-tomcat-${juddi.registry.version}.zip" />
-										<copy file="${basedir}/server.xml" todir="target/juddi-tomcat-${juddi.registry.version}/conf" overwrite="true" />
-										<copy file="${basedir}/log4j.properties" todir="target/juddi-tomcat-${juddi.registry.version}/webapps/juddiv3/WEB-INF/classes" overwrite="true" />
-									</tasks>
-								</configuration>
-								<goals>
-									<goal>run</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-					<plugin>
-						<groupId>org.codehaus.cargo</groupId>
-						<artifactId>cargo-maven2-plugin</artifactId>
-						<version>1.0</version>
-						<configuration>
-							<wait>false</wait>
-							<container>
-								<containerId>tomcat6x</containerId>
-								<home>${basedir}/target/juddi-tomcat-${juddi.registry.version}</home>
-							</container>
-							<configuration>
-								<type>existing</type>
-								<home>${project.build.directory}/juddi-tomcat-${juddi.registry.version}</home>
-								<properties>
-									<cargo.logging>high</cargo.logging>
-									<cargo.hostname>localhost</cargo.hostname>
-									<cargo.servlet.port>8880</cargo.servlet.port>
-									<cargo.jvmargs>-Xms256m -Xmx256m -XX:MaxPermSize=256M</cargo.jvmargs>
-								</properties>
-							</configuration>
-						</configuration>
-						<executions>
-							<execution>
-								<id>start-container</id>
-								<phase>pre-integration-test</phase>
-								<goals>
-									<goal>start</goal>
-								</goals>
-							</execution>
-							<execution>
-								<id>stop-container</id>
-								<phase>post-integration-test</phase>
-								<goals>
-									<goal>stop</goal>
-								</goals>
-							</execution>
-						</executions>
-					</plugin>
-
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-surefire-plugin</artifactId>
-						<version>2.4</version>
-						<configuration>
-							<skip>true</skip>
-							<includes>
-								<include>**/*Test.java</include>
-							</includes>
-							<systemProperties>
-								<property>
-									<name>derby.stream.error.file</name>
-									<value>target/derby.log</value>
-								</property>
-								<property>
-									<name>java.io.tmpdir</name>
-									<value>${basedir}/temp</value>
-								</property>
-							</systemProperties>
-							<environmentVariables>
-								<uddi.version>3</uddi.version>
-							</environmentVariables>
-						</configuration>
-						<executions>
-							<execution>
-								<id>surefire-it</id>
-								<phase>integration-test</phase>
-								<goals>
-									<goal>test</goal>
-								</goals>
-								<configuration>
-									<skip>false</skip>
-									<systemProperties>
-										<property>
-											<name>cactus.contextURL</name>
-											<value>http://localhost:8880/juddi</value>
-										</property>
-										<property>
-											<name>java.io.tmpdir</name>
-											<value>${basedir}/temp</value>
-										</property>
-									</systemProperties>
-								</configuration>
-							</execution>
-						</executions>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-		<profile>
-			<id>apache-release</id>
-			<activation>
-				<property>
-					<name>apache-release</name>
-				</property>
-			</activation>
-			<dependencies>
-        <dependency>
-          <groupId>org.apache.juddi</groupId>
-          <artifactId>juddi</artifactId>
-          <version>2.0.1</version>
-          <scope>test</scope>
-        </dependency>
-            <!--  have to figure out which dependencies of 3.0.2 make the uddiv2 build work -->
-          <dependency>
-            <groupId>org.apache.juddi</groupId>
-            <artifactId>uddi-ws</artifactId>
-            <version>3.0.2</version>
-          </dependency>
-      </dependencies>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-assembly-plugin</artifactId>
-						<version>2.2-beta-4</version>
-						<executions>
-							<execution>
-								<goals>
-									<goal>single</goal>
-								</goals>
-								<phase>package</phase>
-								<configuration>
-									<runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
-									<descriptorRefs>
-										<descriptorRef>
-											source-release
-                    </descriptorRef>
-									</descriptorRefs>
-									<tarLongFileMode>gnu</tarLongFileMode>
-								</configuration>
-							</execution>
-						</executions>
-						<dependencies>
-							<dependency>
-								<!-- apache version not yet released -->
-								<!--<groupId>org.apache</groupId> -->
-								<groupId>org.apache.geronimo.genesis</groupId>
-								<artifactId>apache-source-release-assembly-descriptor</artifactId>
-								<!-- apache version not yet known -->
-								<version>2.0</version>
-							</dependency>
-						</dependencies>
-					</plugin>
-					         <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <version>2.4</version>
-            <configuration>
-              <skip>true</skip>
-              <includes>
-                <include>**/*Test.java</include>
-              </includes>
-              <systemProperties>
-                <property>
-                  <name>derby.stream.error.file</name>
-                  <value>target/derby.log</value>
-                </property>
-                <property>
-                  <name>java.io.tmpdir</name>
-                  <value>${basedir}/temp</value>
-                </property>
-              </systemProperties>
-              <environmentVariables>
-                <uddi.version>2</uddi.version>
-              </environmentVariables>
-            </configuration>
-            <executions>
-              <execution>
-                <id>surefire-it</id>
-                <phase>integration-test</phase>
-                <goals>
-                  <goal>test</goal>
-                </goals>
+                                <requireMavenVersion>
+                                  <version>[3.0.3,)</version>
+                                </requireMavenVersion>
+                                <requireJavaVersion>
+                                  <version>[1.5,)</version>
+                                </requireJavaVersion>
+                          </rules>
+                        </configuration>
+                  </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <inherited>true</inherited>
                 <configuration>
-                  <skip>false</skip>
-                  <systemProperties>
-                    <property>
-                      <name>cactus.contextURL</name>
-                      <value>http://localhost:8880/juddi</value>
-                    </property>
-                    <property>
-                      <name>java.io.tmpdir</name>
-                      <value>${basedir}/temp</value>
-                    </property>
-                  </systemProperties>
+                    <source>1.5</source>
+                    <target>1.5</target>
                 </configuration>
-              </execution>
-            </executions>
-          </plugin>
+            </plugin>
+
+
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.0.0</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Import-Package>org.apache.axis.*;resolution:=optional,*</Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>ianal-maven-plugin</artifactId>
+                <version>1.0-alpha-1</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.19.1</version>
+            </plugin>
+        </plugins>
+    </build>
+    <distributionManagement>
+        <site>
+            <id>website</id>
+            <url>scpexe://people.apache.org/www/juddi.apache.org/scout</url>
+        </site>
+    </distributionManagement>
+
+    <profiles>
+        <profile>
+                <id>doclint-java8-disable</id>
+                <activation>
+                        <jdk>[1.8,)</jdk>
+                </activation>
+                
+
+                <properties>
+                        <javadoc.extra.settings>-Xdoclint:none</javadoc.extra.settings>
+                </properties>
+        </profile>
+        <profile>
+            <id>uddiv2</id>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>juddi</artifactId>
+                    <version>2.0.1</version>
+                    <scope>test</scope>
+                </dependency>
+                <!--  have to figure out which dependencies of 3.0.2 make the uddiv2 build work -->
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>uddi-ws</artifactId>
+                    <version>${juddi.registry.version}</version>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skip>true</skip>
+                            <includes>
+                                <include>**/*Test.java</include>
+                            </includes>
+                            <systemProperties>
+                                <property>
+                                    <name>derby.stream.error.file</name>
+                                    <value>target/derby.log</value>
+                                </property>
+                                <property>
+                                    <name>java.io.tmpdir</name>
+                                    <value>${basedir}/temp</value>
+                                </property>
+                            </systemProperties>
+                            <environmentVariables>
+                                <uddi.version>2</uddi.version>
+                            </environmentVariables>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>surefire-it</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>false</skip>
+                                    <systemProperties>
+                                        <property>
+                                            <name>cactus.contextURL</name>
+                                            <value>http://localhost:8880/juddi</value>
+                                        </property>
+                                        <property>
+                                            <name>java.io.tmpdir</name>
+                                            <value>${basedir}/temp</value>
+                                        </property>
+                                    </systemProperties>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>uddiv3</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>juddi-tomcat</artifactId>
+                    <version>${juddi.registry.version}</version>
+                    <scope>test</scope>
+                    <type>zip</type>
+                </dependency>
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>uddi-ws</artifactId>
+                    <version>${juddi.registry.version}</version>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-dependency-plugin</artifactId>
+                        <version>2.1</version>
+                        <executions>
+                            <execution>
+                                <id>copy</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>copy</goal>
+                                </goals>
+                                <configuration>
+                                    <artifactItems>
+                                        <artifactItem>
+                                            <groupId>org.apache.juddi</groupId>
+                                            <artifactId>juddi-tomcat</artifactId>
+                                            <version>${juddi.registry.version}</version>
+                                            <type>zip</type>
+                                            <outputDirectory>${basedir}/target</outputDirectory>
+                                        </artifactItem>
+                                    </artifactItems>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-antrun-plugin</artifactId>
+                        <version>1.3</version>
+                        <executions>
+                            <execution>
+                                <id>test</id>
+                                <phase>pre-integration-test</phase>
+                                <configuration>
+                                    <tasks>
+                                        <unzip dest="target" src="target/juddi-tomcat-${juddi.registry.version}.zip" />
+                                        <copy file="${basedir}/server.xml" todir="target/juddi-tomcat-${juddi.registry.version}/conf" overwrite="true" />
+                                        <copy file="${basedir}/log4j.properties" todir="target/juddi-tomcat-${juddi.registry.version}/webapps/juddiv3/WEB-INF/classes" overwrite="true" />
+                                    </tasks>
+                                </configuration>
+                                <goals>
+                                    <goal>run</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.codehaus.cargo</groupId>
+                        <artifactId>cargo-maven2-plugin</artifactId>
+                        <version>1.7.0</version>
+                        
+                        <executions>
+                            <execution>
+                                <id>start-container</id>
+                                <phase>pre-integration-test</phase>
+                                <goals>
+                                    <goal>start</goal>
+                                </goals>
+                                <configuration>
+                                    <wait>false</wait>
+                                    <container>
+                                        <containerId>tomcat9x</containerId>
+                                        <home>${basedir}/target/juddi-tomcat-${juddi.registry.version}</home>
+                                    </container>
+                                    <configuration>
+                                        <type>existing</type>
+                                        <home>${project.build.directory}/juddi-tomcat-${juddi.registry.version}</home>
+                                        <properties>
+                                            <cargo.logging>high</cargo.logging>
+                                            <cargo.hostname>localhost</cargo.hostname>
+                                            <cargo.servlet.port>8880</cargo.servlet.port>
+                                            <cargo.jvmargs>-Xms256m -Xmx256m -XX:MaxPermSize=256M</cargo.jvmargs>
+                                        </properties>
+                                    </configuration>
+                                </configuration>
+                            </execution>
+                            <execution>
+                                <id>stop-container</id>
+                                <phase>post-integration-test</phase>
+                                <goals>
+                                    <goal>stop</goal>
+                                </goals>
+                                <configuration>
+                                    <container>
+                                        <containerId>tomcat9x</containerId>
+                                    </container>
+                                    <configuration>
+                                        <properties>
+                                            <cargo.servlet.port>8880</cargo.servlet.port>
+                                        </properties>
+                                        <home>${project.build.directory}/juddi-tomcat-${juddi.registry.version}</home>
+                                    </configuration>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skip>true</skip>
+                            <includes>
+                                <include>**/*Test.java</include>
+                            </includes>
+                            <systemProperties>
+                                <property>
+                                    <name>derby.stream.error.file</name>
+                                    <value>target/derby.log</value>
+                                </property>
+                                <property>
+                                    <name>java.io.tmpdir</name>
+                                    <value>${basedir}/temp</value>
+                                </property>
+                            </systemProperties>
+                            <environmentVariables>
+                                <uddi.version>3</uddi.version>
+                            </environmentVariables>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>surefire-it</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>false</skip>
+                                    <systemProperties>
+                                        <property>
+                                            <name>cactus.contextURL</name>
+                                            <value>http://localhost:8880/juddi</value>
+                                        </property>
+                                        <property>
+                                            <name>java.io.tmpdir</name>
+                                            <value>${basedir}/temp</value>
+                                        </property>
+                                    </systemProperties>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>apache-release</id>
+            <activation>
+                <property>
+                    <name>apache-release</name>
+                </property>
+            </activation>
+            <dependencies>
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>juddi</artifactId>
+                    <version>2.0.1</version>
+                    <scope>test</scope>
+                </dependency>
+                <!--  have to figure out which dependencies of 3.0.2 make the uddiv2 build work -->
+                <dependency>
+                    <groupId>org.apache.juddi</groupId>
+                    <artifactId>uddi-ws</artifactId>
+                    <version>${juddi.registry.version}</version>
+                </dependency>
+            </dependencies>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-assembly-plugin</artifactId>
+                        
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>single</goal>
+                                </goals>
+                                <phase>package</phase>
+                                <configuration>
+                                    <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
+                                    <descriptorRefs>
+                                        <descriptorRef>
+                                            source-release
+                                        </descriptorRef>
+                                    </descriptorRefs>
+                                    <tarLongFileMode>gnu</tarLongFileMode>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <dependencies>
+                            <dependency>
+                                <!-- apache version not yet released -->
+                                <!--<groupId>org.apache</groupId> -->
+                                <groupId>org.apache.geronimo.genesis</groupId>
+                                <artifactId>apache-source-release-assembly-descriptor</artifactId>
+                                <!-- apache version not yet known -->
+                                <version>2.0</version>
+                            </dependency>
+                        </dependencies>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <skip>true</skip>
+                            <includes>
+                                <include>**/*Test.java</include>
+                            </includes>
+                            <systemProperties>
+                                <property>
+                                    <name>derby.stream.error.file</name>
+                                    <value>target/derby.log</value>
+                                </property>
+                                <property>
+                                    <name>java.io.tmpdir</name>
+                                    <value>${basedir}/temp</value>
+                                </property>
+                            </systemProperties>
+                            <environmentVariables>
+                                <uddi.version>2</uddi.version>
+                            </environmentVariables>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>surefire-it</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <skip>false</skip>
+                                    <systemProperties>
+                                        <property>
+                                            <name>cactus.contextURL</name>
+                                            <value>http://localhost:8880/juddi</value>
+                                        </property>
+                                        <property>
+                                            <name>java.io.tmpdir</name>
+                                            <value>${basedir}/temp</value>
+                                        </property>
+                                    </systemProperties>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
 					
-				</plugins>
-			</build>
-		</profile>
-		<profile>
-			<id>testcache</id>
-			<activation>
-				<activeByDefault>false</activeByDefault>
-				<property>
-					<name>testcache</name>
-					<value>true</value>
-				</property>
-			</activation>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-surefire-plugin</artifactId>
-						<configuration>
-							<forkMode>pertest</forkMode>
-							<argLine>-javaagent:${settings.localRepository}/aspectj/aspectjweaver/1.5.2/aspectjweaver-1.5.2.jar</argLine>
-						</configuration>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>testcache</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+                <property>
+                    <name>testcache</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <forkMode>pertest</forkMode>
+                            <argLine>-javaagent:${settings.localRepository}/aspectj/aspectjweaver/1.5.2/aspectjweaver-1.5.2.jar</argLine>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 
-	<reporting>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<version>2.5</version>
+    <reporting>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-javadoc-plugin</artifactId>
+            </plugin>
 
-				<reportSets>
-					<reportSet>
-						<reports>
-							<report>javadoc</report>
-							<report>test-javadoc</report>
-						</reports>
-					</reportSet>
-				</reportSets>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jxr-plugin</artifactId>
+                <version>3.0.0</version>
+            </plugin>
 
-				<configuration>
-					<quiet>true</quiet>
-					<tags>
-						<tag>
-							<name>goal</name>
-							<placement>Xt</placement>
-						</tag>
-						<tag>
-							<name>phase</name>
-							<placement>Xt</placement>
-						</tag>
-						<tag>
-							<name>execute</name>
-							<placement>Xt</placement>
-						</tag>
-						<tag>
-							<name>requiresDependencyResolution</name>
-							<placement>Xt</placement>
-						</tag>
-						<tag>
-							<name>parameter</name>
-							<placement>Xf</placement>
-						</tag>
-						<tag>
-							<name>required</name>
-							<placement>Xf</placement>
-						</tag>
-						<tag>
-							<name>readonly</name>
-							<placement>Xf</placement>
-						</tag>
-						<tag>
-							<name>component</name>
-							<placement>Xf</placement>
-						</tag>
-						<tag>
-							<name>plexus.component</name>
-							<placement>Xf</placement>
-						</tag>
-						<tag>
-							<name>plexus.requirement</name>
-							<placement>Xf</placement>
-						</tag>
-					</tags>
-				</configuration>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-pmd-plugin</artifactId>
+                <version>3.11.0</version>
+                <configuration>
+                    <sourceEncoding>utf-8</sourceEncoding>
+                    <minimumTokens>100</minimumTokens>
+                    <targetJdk>1.5</targetJdk>
+                    <linkXRef>true</linkXRef>
+                </configuration>
+            </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-jxr-plugin</artifactId>
-				<version>2.1</version>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-project-info-reports-plugin</artifactId>
+                <version>2.9</version>
+                <configuration>
+                    <dependencyLocationsEnabled>false</dependencyLocationsEnabled>
+                </configuration>
+            </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-pmd-plugin</artifactId>
-				<version>2.4</version>
-				<configuration>
-					<sourceEncoding>utf-8</sourceEncoding>
-					<minimumTokens>100</minimumTokens>
-					<targetJdk>1.5</targetJdk>
-					<linkXRef>true</linkXRef>
-				</configuration>
-			</plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-report-plugin</artifactId>
+                <version>2.22.1</version>
+            </plugin>
 
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-project-info-reports-plugin</artifactId>
-				<version>2.1</version>
-				<configuration>
-					<dependencyLocationsEnabled>false</dependencyLocationsEnabled>
-				</configuration>
-			</plugin>
-
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-report-plugin</artifactId>
-				<version>2.4.3</version>
-			</plugin>
-
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>cobertura-maven-plugin</artifactId>
-				<version>2.2</version>
-				<configuration>
-					<quiet>true</quiet>
-				</configuration>
-			</plugin>
-			<plugin>
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>jdepend-maven-plugin</artifactId>
-				<version>2.0-beta-2</version>
-			</plugin>
-		</plugins>
-	</reporting>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>cobertura-maven-plugin</artifactId>
+                <version>2.7</version>
+                <configuration>
+                    <quiet>true</quiet>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>jdepend-maven-plugin</artifactId>
+                <version>2.0</version>
+            </plugin>
+            <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>findbugs-maven-plugin</artifactId>
+                    <version>3.0.5</version>
+                    <configuration>
+                            <xmlOutput>true</xmlOutput>
+                            <!-- Optional directory to put findbugs xdoc xml report -->
+                            <xmlOutputDirectory>target/site</xmlOutputDirectory>
+                    </configuration>
+            </plugin>
+            <!-- doesn't work with asf<plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-changes-plugin</artifactId>
+                    <version>2.12.1</version>
+                    <reportSets>
+                            <reportSet>
+                                    <reports>
+                                            <report>jira-report</report>
+                                    </reports>
+                            </reportSet>
+                    </reportSets>
+            </plugin>
+                        -->
+        </plugins>
+    </reporting>
 </project>
diff --git a/server.xml b/server.xml
index 6c98bd7..8260211 100644
--- a/server.xml
+++ b/server.xml
@@ -1,4 +1,4 @@
-<?xml version='1.0' encoding='utf-8'?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -20,14 +20,16 @@
      Documentation at /docs/config/server.html
  -->
 <Server port="8005" shutdown="SHUTDOWN">
-
+  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+  <!-- Security listener. Documentation at /docs/config/listeners.html
+  <Listener className="org.apache.catalina.security.SecurityListener" />
+  -->
   <!--APR library loader. Documentation at /docs/apr.html -->
   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
-  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
-  <Listener className="org.apache.catalina.core.JasperListener" />
-  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
-  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
+  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
   <!-- Global JNDI resources
        Documentation at /docs/jndi-resources-howto.html
@@ -44,44 +46,70 @@
   </GlobalNamingResources>
 
   <!-- A "Service" is a collection of one or more "Connectors" that share
-       a single "Container" Note:  A "Service" is not itself a "Container", 
+       a single "Container" Note:  A "Service" is not itself a "Container",
        so you may not define subcomponents such as "Valves" at this level.
        Documentation at /docs/config/service.html
    -->
   <Service name="Catalina">
-  
+
     <!--The connectors can use a shared executor, you can define one or more named thread pools-->
     <!--
-    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
+    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
         maxThreads="150" minSpareThreads="4"/>
     -->
-    
-    
+
+
     <!-- A "Connector" represents an endpoint by which requests are received
          and responses are returned. Documentation at :
-         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
+         Java HTTP Connector: /docs/config/http.html
          Java AJP  Connector: /docs/config/ajp.html
          APR (HTTP/AJP) Connector: /docs/apr.html
-         Define a non-SSL HTTP/1.1 Connector on port 8080
+         Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
     -->
-    <Connector port="8880" protocol="HTTP/1.1" 
-               connectionTimeout="20000" 
+    <Connector port="8880" protocol="HTTP/1.1"
+               connectionTimeout="20000"
                redirectPort="8443" />
     <!-- A "Connector" using the shared thread pool-->
     <!--
     <Connector executor="tomcatThreadPool"
-               port="8080" protocol="HTTP/1.1" 
-               connectionTimeout="20000" 
+               port="8080" protocol="HTTP/1.1"
+               connectionTimeout="20000"
                redirectPort="8443" />
-    -->           
-    <!-- Define a SSL HTTP/1.1 Connector on port 8443
-         This connector uses the JSSE configuration, when using APR, the 
-         connector should be using the OpenSSL style configuration
-         described in the APR documentation -->
+    -->
+    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
+         This connector uses the NIO implementation. The default
+         SSLImplementation will depend on the presence of the APR/native
+         library and the useOpenSSL attribute of the
+         AprLifecycleListener.
+         Either JSSE or OpenSSL style configuration may be used regardless of
+         the SSLImplementation selected. JSSE style configuration is used below.
+    -->
     <!--
-    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
-               maxThreads="150" scheme="https" secure="true"
-               clientAuth="false" sslProtocol="TLS" />
+    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
+               maxThreads="150" SSLEnabled="true">
+        <SSLHostConfig>
+            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
+    -->
+    <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
+         This connector uses the APR/native implementation which always uses
+         OpenSSL for TLS.
+         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
+         configuration is used below.
+    -->
+    <!--
+    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
+               maxThreads="150" SSLEnabled="true" >
+        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
+        <SSLHostConfig>
+            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
+                         certificateFile="conf/localhost-rsa-cert.pem"
+                         certificateChainFile="conf/localhost-rsa-chain.pem"
+                         type="RSA" />
+        </SSLHostConfig>
+    </Connector>
     -->
 
     <!-- Define an AJP 1.3 Connector on port 8009 -->
@@ -95,8 +123,8 @@
          Documentation at /docs/config/engine.html -->
 
     <!-- You should set jvmRoute to support load-balancing via AJP ie :
-    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">         
-    --> 
+    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
+    -->
     <Engine name="Catalina" defaultHost="localhost">
 
       <!--For clustering, please take a look at documentation at:
@@ -104,39 +132,34 @@
           /docs/config/cluster.html (reference documentation) -->
       <!--
       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-      -->        
-
-      <!-- The request dumper valve dumps useful debugging information about
-           the request and response data received and sent by Tomcat.
-           Documentation at: /docs/config/valve.html -->
-      <!--
-      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
       -->
 
-      <!-- This Realm uses the UserDatabase configured in the global JNDI
-           resources under the key "UserDatabase".  Any edits
-           that are performed against this UserDatabase are immediately
-           available for use by the Realm.  -->
-      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
-             resourceName="UserDatabase"/>
+      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
+           via a brute-force attack -->
+      <Realm className="org.apache.catalina.realm.LockOutRealm">
+        <!-- This Realm uses the UserDatabase configured in the global JNDI
+             resources under the key "UserDatabase".  Any edits
+             that are performed against this UserDatabase are immediately
+             available for use by the Realm.  -->
+        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
+               resourceName="UserDatabase"/>
+      </Realm>
 
-      <!-- Define the default virtual host
-           Note: XML Schema validation will not work with Xerces 2.2.
-       -->
       <Host name="localhost"  appBase="webapps"
-            unpackWARs="true" autoDeploy="true"
-            xmlValidation="false" xmlNamespaceAware="false">
+            unpackWARs="true" autoDeploy="true">
 
         <!-- SingleSignOn valve, share authentication between web applications
              Documentation at: /docs/config/valve.html -->
+        <!--
         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
+        -->
 
         <!-- Access log processes all example.
-             Documentation at: /docs/config/valve.html -->
-        <!--
-        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
-               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
-        -->
+             Documentation at: /docs/config/valve.html
+             Note: The pattern used is equivalent to using pattern="common" -->
+        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
+               prefix="localhost_access_log" suffix=".txt"
+               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 
       </Host>
     </Engine>
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
index f85a182..58bce2d 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
@@ -333,7 +333,7 @@
         List<TModel> tmodelList = td.getTModel();
         entityarr = new TModel[tmodelList.size()];
         tmodelList.toArray(entityarr); 
-        log.debug("After Saving TModel. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving TModel. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             TModel tm = (TModel) entityarr[i];
             coll.add(new KeyImpl(tm.getTModelKey()));
@@ -382,7 +382,7 @@
         entityarr = new TModel[tmodelList.size()];
         tmodelList.toArray(entityarr);
         
-        log.debug("After Saving TModel. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving TModel. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             TModel tm = (TModel) entityarr[i];
             coll.add(new KeyImpl(tm.getTModelKey()));
@@ -433,7 +433,7 @@
         entityarr = new BusinessEntity[bizEntityList.size()];
         bizEntityList.toArray(entityarr);
         
-        log.debug("After Saving Business. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving Business. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             BusinessEntity entity = (BusinessEntity) entityarr[i];
             coll.add(new KeyImpl(entity.getBusinessKey()));
@@ -803,7 +803,7 @@
             keyResultArr = new Result[resultList.size()];
             resultList.toArray(keyResultArr); 
             
-            log.debug("After deleting Business. Obtained vector size:" + keyResultArr != null ? keyResultArr.length : 0);
+            log.debug("After deleting Business. Obtained vector size:" + ((keyResultArr != null) ? keyResultArr.length : 0));
             for (int i = 0; keyResultArr != null && i < keyResultArr.length; i++) {
                 Result result = (Result) keyResultArr[i];
                 int errno = result.getErrno();
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
index ea9c850..c8eee4f 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
@@ -332,7 +332,7 @@
         List<TModel> tmodelList = td.getTModel();
         entityarr = new TModel[tmodelList.size()];
         tmodelList.toArray(entityarr); 
-        log.debug("After Saving TModel. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving TModel. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             TModel tm = (TModel) entityarr[i];
             coll.add(new KeyImpl(tm.getTModelKey()));
@@ -381,7 +381,7 @@
         entityarr = new TModel[tmodelList.size()];
         tmodelList.toArray(entityarr);
         
-        log.debug("After Saving TModel. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving TModel. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             TModel tm = (TModel) entityarr[i];
             coll.add(new KeyImpl(tm.getTModelKey()));
@@ -431,7 +431,7 @@
         entityarr = new BusinessEntity[bizEntityList.size()];
         bizEntityList.toArray(entityarr);
         
-        log.debug("After Saving Business. Obtained vector size:" + entityarr != null ? entityarr.length : 0);
+        log.debug("After Saving Business. Obtained vector size:" + ((entityarr != null) ? entityarr.length : 0));
         for (int i = 0; entityarr != null && i < entityarr.length; i++) {
             BusinessEntity entity = (BusinessEntity) entityarr[i];
             coll.add(new KeyImpl(entity.getBusinessKey()));
@@ -829,7 +829,7 @@
             keyResultArr = new Result[resultList.size()];
             resultList.toArray(keyResultArr); 
             
-            log.debug("After deleting Business. Obtained vector size:" + keyResultArr != null ? keyResultArr.length : 0);
+            log.debug("After deleting Business. Obtained vector size:" + ((keyResultArr != null) ? keyResultArr.length : 0));
             for (int i = 0; keyResultArr != null && i < keyResultArr.length; i++) {
                 Result result = (Result) keyResultArr[i];
                 int errno = result.getErrno();
diff --git a/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java b/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java
index 6d2be0d..0d0daf3 100644
--- a/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java
@@ -28,7 +28,7 @@
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.juddi.v3.client.config.UDDIClerkManager;
+import org.apache.juddi.v3.client.config.UDDIClient;
 
 /**
  * Apache Scout Implementation of a JAXR Connection.
@@ -52,7 +52,7 @@
     private final String postalScheme;
     private final int maxRows;
     private String uddiVersion;
-    UDDIClerkManager manager = null;
+    UDDIClient manager = null;
 
     public ConnectionImpl(Properties properties) throws InvalidRequestException
     {
@@ -77,7 +77,7 @@
             String managerName = null;
             if (manager==null && uddiConfigFile!=null) {
                 try {
-                    manager = new UDDIClerkManager(uddiConfigFile, properties);
+                    manager = new UDDIClient(uddiConfigFile, properties);
                     manager.start();
                 } catch (ConfigurationException e) {
                     log.error(e.getMessage(),e);
diff --git a/src/main/java/org/apache/ws/scout/registry/Constants.java b/src/main/java/org/apache/ws/scout/registry/Constants.java
index 07dcda5..4ee64b5 100644
--- a/src/main/java/org/apache/ws/scout/registry/Constants.java
+++ b/src/main/java/org/apache/ws/scout/registry/Constants.java
@@ -43,14 +43,14 @@
 	 * UDDI Type Taxonomy [uddi-org:types] This taxonomy assists in general
 	 * categorization of the tModels themselves.
 	 */
-	public static final String TMODEL_TYPES_TMODEL_KEY = "UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4";
+	public static final String TMODEL_TYPES_TMODEL_KEY = "uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4";
 
 	/**
 	 * Business Taxonomy: NAICS (1997 Release) [ntis-gov:naics:1997] This tModel
 	 * defines the NAICS (North American Industry Classification System) 1997
 	 * Release industry taxonomy.
 	 */
-	public static final String TMODEL_NAICS_TMODEL_KEY = "UUID:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2";
+	public static final String TMODEL_NAICS_TMODEL_KEY = "uuid:C0B9FE13-179F-413D-8A5B-5004DB8E5BB2";
 
 	/**
 	 * Product Taxonomy: UNSPSC (Version 3.1) [unspsc-org:unspsc:3-1] This
@@ -59,26 +59,26 @@
 	 * superceeded by the Universal Standard Products and Services
 	 * Classification (see {@link #TMODEL_UNSPSC_73_TMODEL_KEY}) taxonomy.
 	 */
-	public static final String TMODEL_UNSPSC_TMODEL_KEY = "UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384";
+	public static final String TMODEL_UNSPSC_TMODEL_KEY = "uuid:DB77450D-9FA8-45D4-A7BC-04411D14E384";
 
 	/**
 	 * Product and Services Taxonomy:UNSPSC (Version 7.3) [unspsc-org:unspsc]
 	 * This tModel defines the UNSPSC (Universal Standard Products and Services
 	 * Classification) version 7.3 product and services taxonomy.
 	 */
-	public static final String TMODEL_UNSPSC_73_TMODEL_KEY = "UUID:CD153257-086A-4237-B336-6BDCBDCC6634";
+	public static final String TMODEL_UNSPSC_73_TMODEL_KEY = "uuid:CD153257-086A-4237-B336-6BDCBDCC6634";
 
 	/**
 	 * ISO 3166 Geographic Taxonomy [uddi-org:iso-ch:3166-1999] This tModel
 	 * defines the ISO 3166 geographic classification taxonomy.
 	 */
-	public static final String TMODEL_ISO_CH_TMODEL_KEY = "UUID:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88";
+	public static final String TMODEL_ISO_CH_TMODEL_KEY = "uuid:4E49A8D6-D5A2-4FC2-93A0-0411D8D19E88";
 
 	/**
 	 * UDDI Other Taxonomy [uddi-org:misc-taxomony] This tModel defines an
 	 * unidentified taxonomy.
 	 */
-	public static final String TMODEL_GENERAL_KEYWORDS_TMODEL_KEY = "UUID:A035A07C-F362-44dd-8F95-E2B134BF43B4";
+	public static final String TMODEL_GENERAL_KEYWORDS_TMODEL_KEY = "uuid:A035A07C-F362-44dd-8F95-E2B134BF43B4";
 
 	/**
 	 * UDDI Owning Business [uddi-org:owningBusiness] This tModel identifies the
@@ -86,79 +86,79 @@
 	 * tModels to establish an 'owned' relationship with a registered
 	 * businessEntity.
 	 */
-	public static final String TMODEL_OWNING_BUSINESS_TMODEL_KEY = "UUID:4064C064-6D14-4F35-8953-9652106476A9";
+	public static final String TMODEL_OWNING_BUSINESS_TMODEL_KEY = "uuid:4064C064-6D14-4F35-8953-9652106476A9";
 
 	/**
 	 * UDDI businessEntity relationship [uddi-org:relationships] This tModel is
 	 * used to describe business relationships. Used in the publisher assertion
 	 * messages.
 	 */
-	public static final String TMODEL_RELATIONSHIPS_TMODEL_KEY = "UUID:807A2C6A-EE22-470D-ADC7-E0424A337C03";
+	public static final String TMODEL_RELATIONSHIPS_TMODEL_KEY = "uuid:807A2C6A-EE22-470D-ADC7-E0424A337C03";
 
 	/**
 	 * UDDI Operators [uddi-org:operators] This checked value set is used to
 	 * identify UDDI operators.
 	 */
-	public static final String TMODEL_OPERATORS_TMODEL_KEY = "UUID:327A56F0-3299-4461-BC23-5CD513E95C55";
+	public static final String TMODEL_OPERATORS_TMODEL_KEY = "uuid:327A56F0-3299-4461-BC23-5CD513E95C55";
 
 	/**
 	 * D-U-N-S� Number Identifier System [dnb-com:D-U-N-S] This tModel is used
 	 * for the Dun & Bradstreet D-U-N-S� Number identifier.
 	 */
-	public static final String TMODEL_D_U_N_S_TMODEL_KEY = "UUID:8609C81E-EE1F-4D5A-B202-3EB13AD01823";
+	public static final String TMODEL_D_U_N_S_TMODEL_KEY = "uuid:8609C81E-EE1F-4D5A-B202-3EB13AD01823";
 
 	/**
 	 * Thomas Register Supplier Identifier Code System
 	 * [thomasregister-com:supplierID] This tModel is used for the Thomas
 	 * Register supplier identifier codes.
 	 */
-	public static final String TMODEL_THOMAS_REGISTER_TMODEL_KEY = "UUID:B1B1BAF5-2329-43E6-AE13-BA8E97195039";
+	public static final String TMODEL_THOMAS_REGISTER_TMODEL_KEY = "uuid:B1B1BAF5-2329-43E6-AE13-BA8E97195039";
 
 	/**
 	 * UDDI IsReplacedBy [uddi-org:isReplacedBy] An identifier system used to
 	 * point (using UDDI keys) to the tModel (or businessEntity) that is the
 	 * logical replacement for the one in which isReplacedBy is used.
 	 */
-	public static final String TMODEL_IS_REPLACED_BY_TMODEL_KEY = "UUID:E59AE320-77A5-11D5-B898-0004AC49CC1E";
+	public static final String TMODEL_IS_REPLACED_BY_TMODEL_KEY = "uuid:E59AE320-77A5-11D5-B898-0004AC49CC1E";
 
 	/**
 	 * Email based web service [uddi-org:smtp] This tModel is used to describe a
 	 * web service that is invoked through SMTP email transmissions. These
 	 * transmissions may be between people or applications.
 	 */
-	public static final String TMODEL_SMTP_TMODEL_KEY = "UUID:93335D49-3EFB-48A0-ACEA-EA102B60DDC6";
+	public static final String TMODEL_SMTP_TMODEL_KEY = "uuid:93335D49-3EFB-48A0-ACEA-EA102B60DDC6";
 
 	/**
 	 * Fax based web service [uddi-org:fax] This tModel is used to describe a
 	 * web service that is invoked through fax transmissions. These
 	 * transmissions may be between people or applications.
 	 */
-	public static final String TMODEL_FAX_TMODEL_KEY = "UUID:1A2B00BE-6E2C-42F5-875B-56F32686E0E7";
+	public static final String TMODEL_FAX_TMODEL_KEY = "uuid:1A2B00BE-6E2C-42F5-875B-56F32686E0E7";
 
 	/**
 	 * FTP based web service [uddi-org:ftp] This tModel is used to describe a
 	 * web service that is invoked through file transfers via the ftp protocol.
 	 */
-	public static final String TMODEL_FTP_TMODEL_KEY = "UUID:5FCF5CD0-629A-4C50-8B16-F94E9CF2A674";
+	public static final String TMODEL_FTP_TMODEL_KEY = "uuid:5FCF5CD0-629A-4C50-8B16-F94E9CF2A674";
 
 	/**
 	 * Telephone based web service [uddi-org:telephone] This tModel is used to
 	 * describe a web service that is invoked through a telephone call and
 	 * interaction by voice and/or touch-tone.
 	 */
-	public static final String TMODEL_TELEPHONE_TMODEL_KEY = "UUID:38E12427-5536-4260-A6F9-B5B530E63A07";
+	public static final String TMODEL_TELEPHONE_TMODEL_KEY = "uuid:38E12427-5536-4260-A6F9-B5B530E63A07";
 
 	/**
 	 * Web browser or HTTP based web service [uddi-org:http] This tModel is used
 	 * to describe a web service that is invoked through a web browser and/or
 	 * the HTTP protocol.
 	 */
-	public static final String TMODEL_HTTP_TMODEL_KEY = "UUID:68DE9E80-AD09-469D-8A37-088422BFBC36";
+	public static final String TMODEL_HTTP_TMODEL_KEY = "uuid:68DE9E80-AD09-469D-8A37-088422BFBC36";
 
 	/**
 	 * HTTP Web Home Page URL [uddi-org:homepage] This tModel is used as the
 	 * bindingTemplate fingerprint for a web home page reference.
 	 */
-	public static final String TMODEL_HOMEPAGE_TMODEL_KEY = "UUID:4CEC1CEF-1F68-4B23-8CB7-8BAA763AEB89";
+	public static final String TMODEL_HOMEPAGE_TMODEL_KEY = "uuid:4CEC1CEF-1F68-4B23-8CB7-8BAA763AEB89";
 
 }
diff --git a/src/main/java/org/apache/ws/scout/registry/IRegistryV3.java b/src/main/java/org/apache/ws/scout/registry/IRegistryV3.java
index 9c21765..ed305ff 100644
--- a/src/main/java/org/apache/ws/scout/registry/IRegistryV3.java
+++ b/src/main/java/org/apache/ws/scout/registry/IRegistryV3.java
@@ -214,11 +214,19 @@
 	  throws RegistryV3Exception;
 	  
 	  /**
+           * 
 	   * "Used to locate specific bindings within a registered
 	   *  businessService. Returns a bindingDetail message."
 	   *
 	   * @exception RegistryV3Exception
-	   */
+           * @param serviceKey
+           * @param categoryBag
+           * @param tModelBag
+           * @param findQualifiers
+           * @param maxRows
+           * @return
+           * @throws RegistryV3Exception 
+           */
 	  BindingDetail findBinding(String serviceKey,CategoryBag categoryBag,TModelBag tModelBag,FindQualifiers findQualifiers,int maxRows)
 	  throws RegistryV3Exception;
 	  
diff --git a/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java b/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java
index 9d42986..333861c 100644
--- a/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java
@@ -709,12 +709,12 @@
 		}
 		request.setMaxRows(maxRows);
 
-        BindingDetail bd = null;
-        JAXBElement<?> o = execute(this.objectFactory.createFindBinding(request), 
-        		this.getInquiryURI());
-        if (o != null) bd = (BindingDetail) o.getValue();
+                BindingDetail bd = null;
+                JAXBElement<?> o = execute(this.objectFactory.createFindBinding(request), 
+                                this.getInquiryURI());
+                if (o != null) bd = (BindingDetail) o.getValue();
 
-        return bd;
+                return bd;
 	}
 
 	/**
@@ -1084,9 +1084,11 @@
 		if (businessArray != null) {
 			for (int i = 0; i < businessArray.length; i++) {
 				BusinessEntity be = businessArray[i];
-				if (be.getBusinessServices().getBusinessService().size() == 0) {
-					be.setBusinessServices(null);
-				}
+                                if (be.getBusinessServices()!=null)
+                                    
+                                    if (be.getBusinessServices().getBusinessService().size() == 0) {
+                                            be.setBusinessServices(null);
+                                    }
 			}
 
 			request.getBusinessEntity().addAll(Arrays.asList(businessArray));
diff --git a/src/main/java/org/apache/ws/scout/registry/infomodel/KeyImpl.java b/src/main/java/org/apache/ws/scout/registry/infomodel/KeyImpl.java
index fc8ee9e..58b4f48 100644
--- a/src/main/java/org/apache/ws/scout/registry/infomodel/KeyImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/infomodel/KeyImpl.java
@@ -20,7 +20,7 @@
 
 /**
  * Implements JAXR Interface.
- * For futher details, look into the JAXR API Javadoc.
+ * For further details, look into the JAXR API Javadoc.
  *
  * @author Anil Saldhana  <anil@apache.org>
  */
diff --git a/src/main/java/org/apache/ws/scout/util/EnumerationHelper.java b/src/main/java/org/apache/ws/scout/util/EnumerationHelper.java
index 156f8bb..eea4c1c 100644
--- a/src/main/java/org/apache/ws/scout/util/EnumerationHelper.java
+++ b/src/main/java/org/apache/ws/scout/util/EnumerationHelper.java
@@ -45,7 +45,7 @@
     private static Log log = LogFactory.getLog(EnumerationHelper.class);
    
 
-    private final static String UDDI_ORG_TYPES		      = "C1ACF26D-9672-4404-9D70-39B756E62AB4"; 
+    private final static String UDDI_ORG_TYPES		      = "uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4"; 
     private final static String OBJECT_TYPE                   = "ObjectType";
     private final static String ASSOCIATION_TYPE              = "AssociationType";
     private final static String URL_TYPE                      = "URLType";
@@ -120,7 +120,7 @@
             throws JAXRException, IllegalArgumentException
     {
         if (!TYPES_LIST.contains(firstToken)) throw new IllegalArgumentException("Expected the path to " +
-                "start with one of " + TYPES);
+                "start with one of " + Arrays.toString(TYPES));
         
         //get the predefined classificationscheme
         ClassificationScheme cs = new ClassificationSchemeImpl(null);
@@ -129,7 +129,7 @@
 
         ArrayList<String> conceptStrings = typesMap.get(firstToken);
         if (!conceptStrings.contains(secondToken)) throw new IllegalArgumentException("Expected the path to " +
-                "end with one of " + conceptStrings.toArray());
+                "end with one of " + Arrays.toString(conceptStrings.toArray()));
                 
         Concept concept = new ConceptImpl(null);
         concept.setName(new InternationalStringImpl(secondToken.toLowerCase()));
diff --git a/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiHelper.java b/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiHelper.java
index ede6768..d0e4e79 100644
--- a/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiHelper.java
+++ b/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiHelper.java
@@ -84,19 +84,17 @@
  * @author <a href="mailto:kstam@apache.org">Kurt T Stam</a>
  * @author <a href="mailto:tcunning@apache.org">Tom Cunningham</a>
  */
-public class ScoutJaxrUddiHelper 
-{
+public class ScoutJaxrUddiHelper {
+
     private static final String UDDI_ORG_TYPES = "uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4";
-	private static Log log = LogFactory.getLog(ScoutJaxrUddiHelper.class);
-	private static ObjectFactory objectFactory = new ObjectFactory();
-	
+    private static Log log = LogFactory.getLog(ScoutJaxrUddiHelper.class);
+    private static ObjectFactory objectFactory = new ObjectFactory();
+
     /**
      * Get UDDI Address given JAXR Postal Address
      */
-	public static Address getAddress(PostalAddress postalAddress) throws JAXRException {
-		Address address = objectFactory.createAddress();
-
-		AddressLine[] addarr = new AddressLine[6];
+    public static Address getAddress(PostalAddress postalAddress) throws JAXRException {
+        Address address = objectFactory.createAddress();
 
         String stnum = postalAddress.getStreetNumber();
         String st = postalAddress.getStreet();
@@ -105,116 +103,119 @@
         String code = postalAddress.getPostalCode();
         String state = postalAddress.getStateOrProvince();
 
-		AddressLine stnumAL = objectFactory.createAddressLine();
-        stnumAL.setKeyName("STREET_NUMBER");
-		if (stnum != null) {
-        stnumAL.setKeyValue(stnum);
-		}
+        if (stnum != null && stnum.length() > 0) {
+            AddressLine stnumAL = objectFactory.createAddressLine();
+            stnumAL.setValue(stnum);
+            stnumAL.setKeyValue("STREET_NUMBER");
+            stnumAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            address.getAddressLine().add(stnumAL);
+        }
 
-		AddressLine stAL = objectFactory.createAddressLine();
-        stAL.setKeyName("STREET");
-		if (st != null) {
-        stAL.setKeyValue(st);
-		}
+        if (st != null && st.length() > 0) {
+            AddressLine stAL = objectFactory.createAddressLine();
+            stAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            stAL.setValue(st);
+            stAL.setKeyValue("STREET");
+            address.getAddressLine().add(stAL);
+        }
 
-		AddressLine cityAL = objectFactory.createAddressLine();
-        cityAL.setKeyName("CITY");
-		if (city != null) {
-        cityAL.setKeyValue(city);
-		}
+        if (city != null && city.length() > 0) {
+            AddressLine cityAL = objectFactory.createAddressLine();
+            cityAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            cityAL.setValue(city);
+            cityAL.setKeyValue("CITY");
+            address.getAddressLine().add(cityAL);
+        }
 
-		AddressLine countryAL = objectFactory.createAddressLine();
-        countryAL.setKeyName("COUNTRY");
-		if (country != null) {
-        countryAL.setKeyValue(country);
-		}
+        if (country != null && country.length() > 0) {
+            AddressLine countryAL = objectFactory.createAddressLine();
+            countryAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            countryAL.setValue(country);
+            countryAL.setKeyValue("COUNTRY");
+            address.getAddressLine().add(countryAL);
+        }
 
-		AddressLine codeAL = objectFactory.createAddressLine();
-        codeAL.setKeyName("POSTALCODE");
-		if (code != null) {
-        codeAL.setKeyValue(code);
-		}
+        if (code != null && code.length() > 0) {
+            AddressLine codeAL = objectFactory.createAddressLine();
+            codeAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            codeAL.setValue(code);
+            codeAL.setKeyValue("POSTALCODE");
+            address.getAddressLine().add(codeAL);
 
-		AddressLine stateAL = objectFactory.createAddressLine();
-        stateAL.setKeyName("STATE");
-		if (state != null) {
-        stateAL.setKeyValue(state);
-		}
+        }
 
-		// Add the AddressLine to vector
-		addarr[0] = stnumAL;
-		addarr[1] = stAL;
-		addarr[2] = cityAL;
-		addarr[3] = countryAL;
-		addarr[4] = codeAL;
-		addarr[5] = stateAL;
-
-		address.getAddressLine().addAll(Arrays.asList(addarr));
+        if (state != null && state.length() > 0) {
+            AddressLine stateAL = objectFactory.createAddressLine();
+            stateAL.setKeyName("uuid:48eb2518-c1bd-354f-92c9-21a53b0ff2b1");
+            stateAL.setValue(state);
+            stateAL.setKeyValue("STATE");
+            address.getAddressLine().add(stateAL);
+        }
 
         return address;
     }
 
-	public static BindingTemplate getBindingTemplateFromJAXRSB(
-			ServiceBinding serviceBinding) throws JAXRException {
-		BindingTemplate bt = objectFactory.createBindingTemplate();
-		if (serviceBinding.getKey() != null && serviceBinding.getKey().getId() != null) {
-			bt.setBindingKey(serviceBinding.getKey().getId());
-		} else {
-			bt.setBindingKey("");
-		}
-	
-		try {
-			// Set Access URI
+    public static BindingTemplate getBindingTemplateFromJAXRSB(
+            ServiceBinding serviceBinding) throws JAXRException {
+        BindingTemplate bt = objectFactory.createBindingTemplate();
+        if (serviceBinding.getKey() != null && serviceBinding.getKey().getId() != null) {
+            bt.setBindingKey(serviceBinding.getKey().getId());
+        } else {
+            bt.setBindingKey("");
+        }
+
+        try {
+            // Set Access URI
             String accessuri = serviceBinding.getAccessURI();
-			if (accessuri != null) {
-				AccessPoint accessPoint = objectFactory.createAccessPoint();
+            if (accessuri != null) {
+                AccessPoint accessPoint = objectFactory.createAccessPoint();
                 accessPoint.setURLType(getURLType(accessuri));
-				accessPoint.setValue(accessuri);
+                accessPoint.setValue(accessuri);
                 bt.setAccessPoint(accessPoint);
             }
             ServiceBinding sb = serviceBinding.getTargetBinding();
-			if (sb != null) {
-				HostingRedirector red = objectFactory.createHostingRedirector();
+            if (sb != null) {
+                HostingRedirector red = objectFactory.createHostingRedirector();
                 Key key = sb.getKey();
-				if (key != null && key.getId() != null) {
-					red.setBindingKey(key.getId());
+                if (key != null && key.getId() != null) {
+                    red.setBindingKey(key.getId());
                 } else {
                     red.setBindingKey("");
                 }
                 bt.setHostingRedirector(red);
             } else {
-            	if (bt.getAccessPoint() == null) {
-            		bt.setAccessPoint(objectFactory.createAccessPoint());
-            	}
+                if (bt.getAccessPoint() == null) {
+                    bt.setAccessPoint(objectFactory.createAccessPoint());
+                }
             }
-			// TODO:Need to look further at the mapping b/w BindingTemplate and
-			// Jaxr ServiceBinding
+            // TODO:Need to look further at the mapping b/w BindingTemplate and
+            // Jaxr ServiceBinding
 
-			// Get Service information
-           Service svc = serviceBinding.getService();
-			if (svc != null && svc.getKey() != null && svc.getKey().getId() != null) {
-              bt.setServiceKey(svc.getKey().getId());
-           }
-			
-			InternationalString idesc = serviceBinding.getDescription();
-            
+            // Get Service information
+            Service svc = serviceBinding.getService();
+            if (svc != null && svc.getKey() != null && svc.getKey().getId() != null) {
+                bt.setServiceKey(svc.getKey().getId());
+            }
+
+            InternationalString idesc = serviceBinding.getDescription();
+
             addDescriptions(bt.getDescription(), idesc);
 
-			// SpecificationLink
-           Collection<SpecificationLink> slcol = serviceBinding.getSpecificationLinks();
-			TModelInstanceDetails tid = objectFactory.createTModelInstanceDetails();
-			if (slcol != null && !slcol.isEmpty()) {
-              Iterator<SpecificationLink> iter = slcol.iterator();
-				while (iter.hasNext()) {
-					SpecificationLink slink = (SpecificationLink) iter.next();
+            // SpecificationLink
+            Collection<SpecificationLink> slcol = serviceBinding.getSpecificationLinks();
+            TModelInstanceDetails tid = objectFactory.createTModelInstanceDetails();
+            if (slcol != null && !slcol.isEmpty()) {
+                Iterator<SpecificationLink> iter = slcol.iterator();
+                while (iter.hasNext()) {
+                    SpecificationLink slink = (SpecificationLink) iter.next();
 
-					TModelInstanceInfo emptyTInfo = objectFactory.createTModelInstanceInfo();
-					tid.getTModelInstanceInfo().add(emptyTInfo);
+                    TModelInstanceInfo emptyTInfo = objectFactory.createTModelInstanceInfo();
+                    tid.getTModelInstanceInfo().add(emptyTInfo);
 
                     RegistryObject specificationObject = slink.getSpecificationObject();
-					if (specificationObject.getKey() != null && specificationObject.getKey().getId() != null) {
-						emptyTInfo.setTModelKey(specificationObject.getKey().getId());
-                        if (specificationObject.getDescription()!=null) {
+                    if (specificationObject.getKey() != null && specificationObject.getKey().getId() != null) {
+                        emptyTInfo.setTModelKey(specificationObject.getKey().getId());
+                        if (specificationObject.getDescription() != null) {
                             for (Object o : specificationObject.getDescription().getLocalizedStrings()) {
                                 LocalizedString locDesc = (LocalizedString) o;
                                 Description description = objectFactory.createDescription();
@@ -224,107 +225,108 @@
                             }
                         }
                         Collection<ExternalLink> externalLinks = slink.getExternalLinks();
-                        if (externalLinks!=null && externalLinks.size()>0) {
+                        if (externalLinks != null && externalLinks.size() > 0) {
                             for (ExternalLink link : externalLinks) {
                                 InstanceDetails ids = objectFactory.createInstanceDetails();
                                 emptyTInfo.setInstanceDetails(ids);
-                                if (link.getDescription()!=null) {
+                                if (link.getDescription() != null) {
                                     Description description = objectFactory.createDescription();
                                     ids.getDescription().add(description);
                                     description.setValue(link.getDescription().getValue());
                                 }
-                                if (link.getExternalURI()!=null) {
+                                if (link.getExternalURI() != null) {
                                     OverviewDoc overviewDoc = objectFactory.createOverviewDoc();
                                     ids.setOverviewDoc(overviewDoc);
                                     overviewDoc.setOverviewURL(link.getExternalURI());
                                 }
-                            } 
+                            }
                         }
-					}
-              }
+                    }
+                }
             }
-			bt.setTModelInstanceDetails(tid);
-			log.debug("BindingTemplate=" + bt.toString());
-		} catch (Exception ud) {
+            bt.setTModelInstanceDetails(tid);
+            log.debug("BindingTemplate=" + bt.toString());
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return bt;
     }
 
-	public static PublisherAssertion getPubAssertionFromJAXRAssociation(
-			Association association) throws JAXRException {
-		PublisherAssertion pa = objectFactory.createPublisherAssertion();
-		try {
-			if (association.getSourceObject().getKey() != null && 
-				association.getSourceObject().getKey().getId() != null) {
-            pa.setFromKey(association.getSourceObject().getKey().getId());
-			}
-			
-			if (association.getTargetObject().getKey() != null &&
-				association.getTargetObject().getKey().getId() != null) {
-            pa.setToKey(association.getTargetObject().getKey().getId());
-			}
+    public static PublisherAssertion getPubAssertionFromJAXRAssociation(
+            Association association) throws JAXRException {
+        PublisherAssertion pa = objectFactory.createPublisherAssertion();
+        try {
+            if (association.getSourceObject().getKey() != null
+                    && association.getSourceObject().getKey().getId() != null) {
+                pa.setFromKey(association.getSourceObject().getKey().getId());
+            }
+
+            if (association.getTargetObject().getKey() != null
+                    && association.getTargetObject().getKey().getId() != null) {
+                pa.setToKey(association.getTargetObject().getKey().getId());
+            }
             Concept c = association.getAssociationType();
             String v = c.getValue();
-			KeyedReference kr = objectFactory.createKeyedReference();
+            KeyedReference kr = objectFactory.createKeyedReference();
             Key key = c.getKey();
-			if (key == null) {
-				// TODO:Need to check this. If the concept is a predefined
-				// enumeration, the key can be the parent classification scheme
+            if (key == null) {
+                // TODO:Need to check this. If the concept is a predefined
+                // enumeration, the key can be the parent classification scheme
                 key = c.getClassificationScheme().getKey();
             }
-			if (key != null && key.getId() != null) {
-				kr.setTModelKey(key.getId());
-			} 
+            if (key != null && key.getId() != null) {
+                kr.setTModelKey(key.getId());
+            }
             kr.setKeyName("Concept");
 
-			if (v != null) {
-				kr.setKeyValue(v);
-			}
-
-            pa.setKeyedReference(kr);
-		} catch (Exception ud) {
-            throw new JAXRException("Apache JAXR Impl:", ud);
-        }
-        return pa;
-    }
-
-	public static PublisherAssertion getPubAssertionFromJAXRAssociationKey(
-			String key) throws JAXRException {
-		PublisherAssertion pa = objectFactory.createPublisherAssertion();
-		try {
-			StringTokenizer token = new StringTokenizer(key, "|");
-			if (token.hasMoreTokens()) {
-               pa.setFromKey(getToken(token.nextToken()));
-               pa.setToKey(getToken(token.nextToken()));
-				KeyedReference kr = objectFactory.createKeyedReference();
-				// Sometimes the Key is UUID:something
-               String str = getToken(token.nextToken());
-				if ("UUID".equals(str))
-					str += ":" + getToken(token.nextToken());
-               kr.setTModelKey(str);
-               kr.setKeyName(getToken(token.nextToken()));
-               kr.setKeyValue(getToken(token.nextToken()));
-               pa.setKeyedReference(kr);
+            if (v != null) {
+                kr.setKeyValue(v);
             }
 
-		} catch (Exception ud) {
+            pa.setKeyedReference(kr);
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return pa;
     }
 
-	public static BusinessService getBusinessServiceFromJAXRService(
-			Service service) throws JAXRException {
-		BusinessService bs = objectFactory.createBusinessService();
-		try {
-			InternationalString iname = service.getName();
-						
-			addNames(bs.getName(), iname);
-	         
+    public static PublisherAssertion getPubAssertionFromJAXRAssociationKey(
+            String key) throws JAXRException {
+        PublisherAssertion pa = objectFactory.createPublisherAssertion();
+        try {
+            StringTokenizer token = new StringTokenizer(key, "|");
+            if (token.hasMoreTokens()) {
+                pa.setFromKey(getToken(token.nextToken()));
+                pa.setToKey(getToken(token.nextToken()));
+                KeyedReference kr = objectFactory.createKeyedReference();
+                // Sometimes the Key is UUID:something
+                String str = getToken(token.nextToken());
+                if ("UUID".equals(str)) {
+                    str += ":" + getToken(token.nextToken());
+                }
+                kr.setTModelKey(str);
+                kr.setKeyName(getToken(token.nextToken()));
+                kr.setKeyValue(getToken(token.nextToken()));
+                pa.setKeyedReference(kr);
+            }
+
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
+        return pa;
+    }
+
+    public static BusinessService getBusinessServiceFromJAXRService(
+            Service service) throws JAXRException {
+        BusinessService bs = objectFactory.createBusinessService();
+        try {
+            InternationalString iname = service.getName();
+
+            addNames(bs.getName(), iname);
+
             InternationalString idesc = service.getDescription();
-    
-           addDescriptions(bs.getDescription(), idesc);
+
+            addDescriptions(bs.getDescription(), idesc);
 
             Organization o = service.getProvidingOrganization();
 
@@ -334,26 +336,26 @@
             if (o != null) {
                 Key k = o.getKey();
 
-				if (k != null && k.getId() != null) {
+                if (k != null && k.getId() != null) {
                     bs.setBusinessKey(k.getId());
-                } 
-                    
-			} else {
+                }
+
+            } else {
                 /*
                  * gmj - I *think* this is the right thing to do
                  */
-				throw new JAXRException(
-						"Service has no associated organization");
+                throw new JAXRException(
+                        "Service has no associated organization");
             }
 
-			if (service.getKey() != null && service.getKey().getId() != null) {
+            if (service.getKey() != null && service.getKey().getId() != null) {
                 bs.setServiceKey(service.getKey().getId());
             } else {
                 bs.setServiceKey("");
             }
 
             CategoryBag catBag = getCategoryBagFromClassifications(service.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 bs.setCategoryBag(catBag);
             }
 
@@ -362,18 +364,18 @@
             if (bt != null) {
                 bs.setBindingTemplates(bt);
             }
-   		    
+
             log.debug("BusinessService=" + bs.toString());
-		} catch (Exception ud) {
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return bs;
     }
 
-	public static TModel getTModelFromJAXRClassificationScheme(
-			ClassificationScheme classificationScheme) throws JAXRException {
-		TModel tm = objectFactory.createTModel();
-		try {
+    public static TModel getTModelFromJAXRClassificationScheme(
+            ClassificationScheme classificationScheme) throws JAXRException {
+        TModel tm = objectFactory.createTModel();
+        try {
             /*
              * a fresh scheme might not have a key
              */
@@ -389,85 +391,87 @@
             /*
              * There's no reason to believe these are here either
              */
-
             Slot s = classificationScheme.getSlot("authorizedName");
 
-			if (s != null && s.getName() != null) {
+            if (s != null && s.getName() != null) {
                 tm.setAuthorizedName(s.getName());
             }
 
             s = classificationScheme.getSlot("operator");
 
-			if (s != null && s.getName() != null) {
+            if (s != null && s.getName() != null) {
                 tm.setOperator(s.getName());
             }
 
-			InternationalString iname = classificationScheme.getName();
-			 
+            InternationalString iname = classificationScheme.getName();
+
             tm.setName(getFirstName(iname));
 
-			InternationalString idesc = classificationScheme.getDescription();
-			
-		    addDescriptions(tm.getDescription(), idesc);
+            InternationalString idesc = classificationScheme.getDescription();
+
+            addDescriptions(tm.getDescription(), idesc);
 
             IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(classificationScheme.getExternalIdentifiers());
-            if (idBag!=null) {
+            if (idBag != null) {
                 tm.setIdentifierBag(idBag);
             }
             CategoryBag catBag = getCategoryBagFromClassifications(classificationScheme.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 tm.setCategoryBag(catBag);
             }
-			
-			// ToDO: overviewDoc
-		} catch (Exception ud) {
+
+            // ToDO: overviewDoc
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return tm;
     }
 
     public static TModel getTModelFromJAXRConcept(Concept concept)
-			throws JAXRException {
-    	TModel tm = objectFactory.createTModel();
-		if (concept == null)
-			return null;
-		try {
+            throws JAXRException {
+        TModel tm = objectFactory.createTModel();
+        if (concept == null) {
+            return null;
+        }
+        try {
             Key key = concept.getKey();
-			if (key != null && key.getId() != null)
-				tm.setTModelKey(key.getId());
+            if (key != null && key.getId() != null) {
+                tm.setTModelKey(key.getId());
+            }
             Slot sl1 = concept.getSlot("authorizedName");
-			if (sl1 != null && sl1.getName() != null)
-				tm.setAuthorizedName(sl1.getName());
+            if (sl1 != null && sl1.getName() != null) {
+                tm.setAuthorizedName(sl1.getName());
+            }
 
             Slot sl2 = concept.getSlot("operator");
-			if (sl2 != null && sl2.getName() != null)
-				tm.setOperator(sl2.getName());
+            if (sl2 != null && sl2.getName() != null) {
+                tm.setOperator(sl2.getName());
+            }
 
-			InternationalString iname = concept.getName();
+            InternationalString iname = concept.getName();
 
             tm.setName(getFirstName(iname));
 
             InternationalString idesc = concept.getDescription();
-			
+
             addDescriptions(tm.getDescription(), idesc);
 
 //          External Links
-            Collection<ExternalLink> externalLinks = concept.getExternalLinks(); 
-            if(externalLinks != null && externalLinks.size() > 0)
-            {
-                tm.setOverviewDoc(getOverviewDocFromExternalLink((ExternalLink)externalLinks.iterator().next()));
-            }  
+            Collection<ExternalLink> externalLinks = concept.getExternalLinks();
+            if (externalLinks != null && externalLinks.size() > 0) {
+                tm.setOverviewDoc(getOverviewDocFromExternalLink((ExternalLink) externalLinks.iterator().next()));
+            }
 
             IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(concept.getExternalIdentifiers());
-            if (idBag!=null) {
+            if (idBag != null) {
                 tm.setIdentifierBag(idBag);
             }
             CategoryBag catBag = getCategoryBagFromClassifications(concept.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 tm.setCategoryBag(catBag);
             }
 
-		} catch (Exception ud) {
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return tm;
@@ -495,6 +499,7 @@
         }
         return null;
     }
+
     private static void addNames(List<Name> names, InternationalString iname) throws JAXRException {
         for (Object o : iname.getLocalizedStrings()) {
             LocalizedString locName = (LocalizedString) o;
@@ -506,52 +511,52 @@
     }
 
     public static BusinessEntity getBusinessEntityFromJAXROrg(Organization organization)
-			throws JAXRException {
-		BusinessEntity biz = objectFactory.createBusinessEntity();
-		BusinessServices bss = objectFactory.createBusinessServices();
-		BusinessService[] barr = new BusinessService[0];
+            throws JAXRException {
+        BusinessEntity biz = objectFactory.createBusinessEntity();
+        BusinessServices bss = objectFactory.createBusinessServices();
+        BusinessService[] barr = new BusinessService[0];
 
-		try {
-			// It may just be an update
+        try {
+            // It may just be an update
             Key key = organization.getKey();
-			if (key != null && key.getId() != null) {
-				biz.setBusinessKey(key.getId());
+            if (key != null && key.getId() != null) {
+                biz.setBusinessKey(key.getId());
             } else {
                 biz.setBusinessKey("");
             }
-			// Lets get the Organization attributes at the top level
-			
-			InternationalString iname = organization.getName();
-			
-			if (iname != null) {
+            // Lets get the Organization attributes at the top level
+
+            InternationalString iname = organization.getName();
+
+            if (iname != null) {
                 addNames(biz.getName(), iname);
-			}
-			
-			InternationalString idesc = organization.getDescription();
-			
+            }
+
+            InternationalString idesc = organization.getDescription();
+
             addDescriptions(biz.getDescription(), idesc);
 
-			if (organization.getPrimaryContact() != null && 
-				organization.getPrimaryContact().getPersonName()!= null &&
-				organization.getPrimaryContact().getPersonName().getFullName() != null) {
+            if (organization.getPrimaryContact() != null
+                    && organization.getPrimaryContact().getPersonName() != null
+                    && organization.getPrimaryContact().getPersonName().getFullName() != null) {
 
-				biz.setAuthorizedName(organization.getPrimaryContact().getPersonName()
-						.getFullName());
-			}
+                biz.setAuthorizedName(organization.getPrimaryContact().getPersonName()
+                        .getFullName());
+            }
 
             Collection<Service> s = organization.getServices();
             log.debug("?Org has services=" + s.isEmpty());
 
-			barr = new BusinessService[s.size()];
+            barr = new BusinessService[s.size()];
 
             Iterator<Service> iter = s.iterator();
-			int barrPos = 0;
-			while (iter.hasNext()) {
-				BusinessService bs = ScoutJaxrUddiHelper
-						.getBusinessServiceFromJAXRService((Service) iter
-								.next());
-				barr[barrPos] = bs;
-				barrPos++;
+            int barrPos = 0;
+            while (iter.hasNext()) {
+                BusinessService bs = ScoutJaxrUddiHelper
+                        .getBusinessServiceFromJAXRService((Service) iter
+                                .next());
+                barr[barrPos] = bs;
+                barrPos++;
             }
 
             /*
@@ -559,16 +564,14 @@
              * special designation for one of the users, and D6.1 seems to say
              * that the first UDDI user is the primary contact
              */
-
-			Contacts cts = objectFactory.createContacts();
-			Contact[] carr = new Contact[0];
+            Contacts cts = objectFactory.createContacts();
+            Contact[] carr = new Contact[0];
 
             User primaryContact = organization.getPrimaryContact();
             Collection<User> users = organization.getUsers();
 
             // Expand array to necessary size only (xmlbeans does not like
             // null items in cases like this)
-
             int carrSize = 0;
 
             if (primaryContact != null) {
@@ -606,8 +609,8 @@
                 }
             }
 
-			bss.getBusinessService().addAll(Arrays.asList(barr));
-            if (carr.length>0) {
+            bss.getBusinessService().addAll(Arrays.asList(barr));
+            if (carr.length > 0) {
                 cts.getContact().addAll(Arrays.asList(carr));
                 biz.setContacts(cts);
             }
@@ -619,7 +622,9 @@
             boolean first = true;
             while (exiter.hasNext()) {
                 ExternalLink link = (ExternalLink) exiter.next();
-                /** Note: jUDDI adds its own discoverURL as the businessEntity* */
+                /**
+                 * Note: jUDDI adds its own discoverURL as the businessEntity*
+                 */
                 if (first) {
                     emptyDUs = objectFactory.createDiscoveryURLs();
                     biz.setDiscoveryURLs(emptyDUs);
@@ -628,22 +633,22 @@
                 DiscoveryURL emptyDU = objectFactory.createDiscoveryURL();
                 emptyDUs.getDiscoveryURL().add(emptyDU);
                 emptyDU.setUseType("businessEntityExt");
-				
+
                 if (link.getExternalURI() != null) {
                     emptyDU.setValue(link.getExternalURI());
                 }
             }
-			
-          IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(organization.getExternalIdentifiers());
-          if (idBag!=null) {
-              biz.setIdentifierBag(idBag);
-          }
-          CategoryBag catBag = getCategoryBagFromClassifications(organization.getClassifications());
-          if (catBag!=null) {
-              biz.setCategoryBag(catBag);
-          }
-			
-		} catch (Exception ud) {
+
+            IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(organization.getExternalIdentifiers());
+            if (idBag != null) {
+                biz.setIdentifierBag(idBag);
+            }
+            CategoryBag catBag = getCategoryBagFromClassifications(organization.getClassifications());
+            if (catBag != null) {
+                biz.setCategoryBag(catBag);
+            }
+
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return biz;
@@ -651,203 +656,214 @@
 
     /**
      *
-     * Convert JAXR User Object to UDDI  Contact
+     * Convert JAXR User Object to UDDI Contact
      */
     public static Contact getContactFromJAXRUser(User user)
-			throws JAXRException {
-		Contact ct = objectFactory.createContact();
+            throws JAXRException {
+        Contact ct = objectFactory.createContact();
         if (user == null) {
             return null;
         }
 
-		Address[] addarr = new Address[0];
-		Phone[] phonearr = new Phone[0];
-		Email[] emailarr = new Email[0];
-		try {
-			
-			if (user.getPersonName() != null && user.getPersonName().getFullName() != null) {
-				ct.setPersonName(user.getPersonName().getFullName());
-			}
-			
-			if (user.getType() != null) {
-            ct.setUseType(user.getType());
-			}
-			// Postal Address
+        Address[] addarr = new Address[0];
+        Phone[] phonearr = new Phone[0];
+        Email[] emailarr = new Email[0];
+        try {
+
+            if (user.getPersonName() != null && user.getPersonName().getFullName() != null) {
+                ct.setPersonName(user.getPersonName().getFullName());
+            }
+
+            if (user.getType() != null) {
+                ct.setUseType(user.getType());
+            }
+            // Postal Address
             Collection<PostalAddress> postc = user.getPostalAddresses();
 
-			addarr = new Address[postc.size()];
+            addarr = new Address[postc.size()];
 
             Iterator<PostalAddress> iterator = postc.iterator();
-			int addarrPos = 0;
-			while (iterator.hasNext()) {
+            int addarrPos = 0;
+            while (iterator.hasNext()) {
                 PostalAddress post = (PostalAddress) iterator.next();
-				addarr[addarrPos] = ScoutJaxrUddiHelper.getAddress(post);
-				addarrPos++;
+                addarr[addarrPos] = ScoutJaxrUddiHelper.getAddress(post);
+                addarrPos++;
             }
-			// Phone Numbers
+            // Phone Numbers
             Collection ph = user.getTelephoneNumbers(null);
 
-			phonearr = new Phone[ph.size()];
+            phonearr = new Phone[ph.size()];
 
             Iterator it = ph.iterator();
-			int phonearrPos = 0;
-			while (it.hasNext()) {
+            int phonearrPos = 0;
+            while (it.hasNext()) {
                 TelephoneNumber t = (TelephoneNumber) it.next();
-				Phone phone = objectFactory.createPhone();
+                Phone phone = objectFactory.createPhone();
                 String str = t.getNumber();
                 log.debug("Telephone=" + str);
-				
-				// FIXME: If phone number is null, should the phone 
-				// not be set at all, or set to empty string?
-				if (str != null) {
-					phone.setValue(str);
-				} else {
-					phone.setValue("");
-				}
 
-				phonearr[phonearrPos] = phone;
-				phonearrPos++;
+                // FIXME: If phone number is null, should the phone 
+                // not be set at all, or set to empty string?
+                if (str != null) {
+                    phone.setValue(str);
+                } else {
+                    phone.setValue("");
+                }
+
+                phonearr[phonearrPos] = phone;
+                phonearrPos++;
             }
 
-			// Email Addresses
+            // Email Addresses
             Collection ec = user.getEmailAddresses();
 
-			emailarr = new Email[ec.size()];
+            emailarr = new Email[ec.size()];
 
             Iterator iter = ec.iterator();
-			int emailarrPos = 0;
-			while (iter.hasNext()) {
+            int emailarrPos = 0;
+            while (iter.hasNext()) {
                 EmailAddress ea = (EmailAddress) iter.next();
-				Email email = objectFactory.createEmail();
-				
-				if (ea.getAddress() != null) {
-					email.setValue(ea.getAddress());
-				}
-				// email.setText( ea.getAddress() );
-				
-				if (ea.getType() != null) {
-                email.setUseType(ea.getType());
-            }
+                Email email = objectFactory.createEmail();
 
-				emailarr[emailarrPos] = email;
-				emailarrPos++;
-			}
-			ct.getAddress().addAll(Arrays.asList(addarr));
-			ct.getPhone().addAll(Arrays.asList(phonearr));
-			ct.getEmail().addAll(Arrays.asList(emailarr));
-		} catch (Exception ud) {
+                if (ea.getAddress() != null) {
+                    email.setValue(ea.getAddress());
+                }
+                // email.setText( ea.getAddress() );
+
+                if (ea.getType() != null) {
+                    email.setUseType(ea.getType());
+                }
+
+                emailarr[emailarrPos] = email;
+                emailarrPos++;
+            }
+            ct.getAddress().addAll(Arrays.asList(addarr));
+            ct.getPhone().addAll(Arrays.asList(phonearr));
+            ct.getEmail().addAll(Arrays.asList(emailarr));
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return ct;
     }
 
-	private static String getToken(String tokenstr) {
-		// Token can have the value NULL which need to be converted into null
-		if (tokenstr.equals("NULL"))
-			tokenstr = "";
-      return tokenstr;
-   }
+    private static String getToken(String tokenstr) {
+        // Token can have the value NULL which need to be converted into null
+        if (tokenstr.equals("NULL")) {
+            tokenstr = "";
+        }
+        return tokenstr;
+    }
 
-	private static URLType getURLType(String accessuri) {
-       String acc = accessuri.toLowerCase();
-		URLType uri = URLType.OTHER;
-		if (acc.startsWith("http:"))
-			uri = URLType.HTTP;
-		else if (acc.startsWith("https:"))
-			uri = URLType.HTTPS;
-		else if (acc.startsWith("ftp:"))
-			uri = URLType.FTP;
-		else if (acc.startsWith("phone:"))
-			uri = URLType.PHONE;// TODO:Handle this better
+    private static URLType getURLType(String accessuri) {
+        String acc = accessuri.toLowerCase();
+        URLType uri = URLType.OTHER;
+        if (acc.startsWith("http:")) {
+            uri = URLType.HTTP;
+        } else if (acc.startsWith("https:")) {
+            uri = URLType.HTTPS;
+        } else if (acc.startsWith("ftp:")) {
+            uri = URLType.FTP;
+        } else if (acc.startsWith("phone:")) {
+            uri = URLType.PHONE;// TODO:Handle this better
+        }
+        return uri;
+    }
 
-       return uri;
-   }
-    
-	/**
-     * According to JAXR Javadoc, there are two types of classification, internal and external and they use the Classification, Concept,     
-     * and ClassificationScheme objects.  It seems the only difference between internal and external (as related to UDDI) is that the
-     * name/value pair of the categorization is held in the Concept for internal classifications and the Classification for external (bypassing
-     * the Concept entirely).
-     * 
-     * The translation to UDDI is simple.  Relevant objects have a category bag which contains a bunch of KeyedReferences (name/value pairs).  
-     * These KeyedReferences optionally refer to a tModel that identifies the type of category (translates to the ClassificationScheme key).  If
-     * this is set and the tModel doesn't exist in the UDDI registry, then an invalid key error will occur when trying to save the object.
-     * 
+    /**
+     * According to JAXR Javadoc, there are two types of classification,
+     * internal and external and they use the Classification, Concept, and
+     * ClassificationScheme objects. It seems the only difference between
+     * internal and external (as related to UDDI) is that the name/value pair of
+     * the categorization is held in the Concept for internal classifications
+     * and the Classification for external (bypassing the Concept entirely).
+     *
+     * The translation to UDDI is simple. Relevant objects have a category bag
+     * which contains a bunch of KeyedReferences (name/value pairs). These
+     * KeyedReferences optionally refer to a tModel that identifies the type of
+     * category (translates to the ClassificationScheme key). If this is set and
+     * the tModel doesn't exist in the UDDI registry, then an invalid key error
+     * will occur when trying to save the object.
+     *
      * @param classifications classifications to turn into categories
      * @throws JAXRException
      */
-	public static CategoryBag getCategoryBagFromClassifications(Collection classifications) throws JAXRException {
-    	try {
-			if (classifications == null || classifications.size()==0)
-				return null;
-    		
-    		// Classifications
-			CategoryBag cbag = objectFactory.createCategoryBag();
-			Iterator classiter = classifications.iterator();
-			while (classiter.hasNext()) {
-				Classification classification = (Classification) classiter.next();
-				if (classification != null ) {
-					KeyedReference keyr = objectFactory.createKeyedReference();
-					cbag.getKeyedReference().add(keyr);
-	
-					InternationalStringImpl iname = null;
-					String value = null;
-					ClassificationScheme scheme = classification.getClassificationScheme();
-                    if (scheme==null || (classification.isExternal() && classification.getConcept()==null)) {
+    public static CategoryBag getCategoryBagFromClassifications(Collection classifications) throws JAXRException {
+        try {
+            if (classifications == null || classifications.size() == 0) {
+                return null;
+            }
+
+            // Classifications
+            CategoryBag cbag = objectFactory.createCategoryBag();
+            Iterator classiter = classifications.iterator();
+            while (classiter.hasNext()) {
+                Classification classification = (Classification) classiter.next();
+                if (classification != null) {
+                    KeyedReference keyr = objectFactory.createKeyedReference();
+                    cbag.getKeyedReference().add(keyr);
+
+                    InternationalStringImpl iname = null;
+                    String value = null;
+                    ClassificationScheme scheme = classification.getClassificationScheme();
+                    if (scheme == null || (classification.isExternal() && classification.getConcept() == null)) {
                         /*
                         * JAXR 1.0 Specification: Section D6.4.4
                         * Specification related tModels mapped from Concept may be automatically
                         * categorized by the well-known uddi-org:types taxonomy in UDDI (with
                         * tModelKey uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4) as follows:
                         * The keyed reference is assigned a taxonomy value of specification.
-                        */
+                         */
                         keyr.setTModelKey(UDDI_ORG_TYPES);
-                        keyr.setKeyValue("specification"); 
+                        keyr.setKeyValue("specification");
                     } else {
-    					if (classification.isExternal()) {
+                        if (classification.isExternal()) {
                             iname = (InternationalStringImpl) ((RegistryObject) classification).getName();
                             value = classification.getValue();
-    					} else {
-    						Concept concept = classification.getConcept();
-    						if (concept != null) {
-    							iname = (InternationalStringImpl) ((RegistryObject) concept).getName();
-    							value = concept.getValue();
-    							scheme = concept.getClassificationScheme();
-    						}
-    					}
-    	
-    					String name = iname.getValue();
-    					if (name != null)
-    						keyr.setKeyName(name);
-    	
-    					if (value != null)
-    						keyr.setKeyValue(value);
-    					
-    					if (scheme != null) {
-    						Key key = scheme.getKey();
-    						if (key != null && key.getId() != null)
-    							keyr.setTModelKey(key.getId());
-    					}
-    				}
+                        } else {
+                            Concept concept = classification.getConcept();
+                            if (concept != null) {
+                                iname = (InternationalStringImpl) ((RegistryObject) concept).getName();
+                                value = concept.getValue();
+                                scheme = concept.getClassificationScheme();
+                            }
+                        }
+
+                        String name = iname.getValue();
+                        if (name != null) {
+                            keyr.setKeyName(name);
+                        }
+
+                        if (value != null) {
+                            keyr.setKeyValue(value);
+                        }
+
+                        if (scheme != null) {
+                            Key key = scheme.getKey();
+                            if (key != null && key.getId() != null) {
+                                keyr.setTModelKey(key.getId());
+                            }
+                        }
+                    }
                 }
-			}
-			return cbag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+            }
+            return cbag;
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
 
-	public static TModelBag getTModelBagFromSpecifications(Collection specifications) throws JAXRException {
-    	try {
-			if (specifications == null || specifications.size()==0)
-				return null;
-    		
-    		// Classifications
-			TModelBag tbag = objectFactory.createTModelBag();
-			Iterator speciter = specifications.iterator();
-			while (speciter.hasNext()) {
-				RegistryObject registryobject = (RegistryObject) speciter.next();
-				if (registryobject instanceof Concept) {
+    public static TModelBag getTModelBagFromSpecifications(Collection specifications) throws JAXRException {
+        try {
+            if (specifications == null || specifications.size() == 0) {
+                return null;
+            }
+
+            // Classifications
+            TModelBag tbag = objectFactory.createTModelBag();
+            Iterator speciter = specifications.iterator();
+            while (speciter.hasNext()) {
+                RegistryObject registryobject = (RegistryObject) speciter.next();
+                if (registryobject instanceof Concept) {
                     Concept concept = (Concept) registryobject;
                     if (concept.getKey() != null) {
                         tbag.getTModelKey().add(concept.getKey().toString());
@@ -861,87 +877,90 @@
 //							tbag.getTModelKey().add(key.toString());
 //						}
 //					}
-				} else {
-					log.info("ebXML case - the RegistryObject is an ExtrinsicObject, Not implemented");
-				}
-			}
-			return tbag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+                } else {
+                    log.info("ebXML case - the RegistryObject is an ExtrinsicObject, Not implemented");
+                }
+            }
+            return tbag;
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
 
-	
-	/**
+    /**
      * Adds the objects identifiers from JAXR's external identifier collection
-     * 
+     *
      * @param identifiers external identifiers to turn into identifiers
      * @throws JAXRException
      */
-	public static IdentifierBag getIdentifierBagFromExternalIdentifiers(Collection identifiers) throws JAXRException {
-    	try {
-			if (identifiers == null || identifiers.size()==0)
-				return null;
-    		
-    		// Identifiers
-			IdentifierBag ibag = objectFactory.createIdentifierBag();
-			Iterator iditer = identifiers.iterator();
-			while (iditer.hasNext()) {
-				ExternalIdentifier extid = (ExternalIdentifier) iditer.next();
-				if (extid != null ) {
-					KeyedReference keyr = objectFactory.createKeyedReference();
-					ibag.getKeyedReference().add(keyr);
-	
-					InternationalStringImpl iname = (InternationalStringImpl) ((RegistryObject) extid).getName();
-					String value = extid.getValue();
-					ClassificationScheme scheme = extid.getIdentificationScheme();
-	
-					String name = iname.getValue();
-					if (name != null)
-						keyr.setKeyName(name);
-	
-					if (value != null)
-						keyr.setKeyValue(value);
-					
-					if (scheme != null) {
-						Key key = scheme.getKey();
-						if (key != null && key.getId() != null)
-							keyr.setTModelKey(key.getId());
-					}
-				}
-			}
-			return ibag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+    public static IdentifierBag getIdentifierBagFromExternalIdentifiers(Collection identifiers) throws JAXRException {
+        try {
+            if (identifiers == null || identifiers.size() == 0) {
+                return null;
+            }
+
+            // Identifiers
+            IdentifierBag ibag = objectFactory.createIdentifierBag();
+            Iterator iditer = identifiers.iterator();
+            while (iditer.hasNext()) {
+                ExternalIdentifier extid = (ExternalIdentifier) iditer.next();
+                if (extid != null) {
+                    KeyedReference keyr = objectFactory.createKeyedReference();
+                    ibag.getKeyedReference().add(keyr);
+
+                    InternationalStringImpl iname = (InternationalStringImpl) ((RegistryObject) extid).getName();
+                    String value = extid.getValue();
+                    ClassificationScheme scheme = extid.getIdentificationScheme();
+
+                    String name = iname.getValue();
+                    if (name != null) {
+                        keyr.setKeyName(name);
+                    }
+
+                    if (value != null) {
+                        keyr.setKeyValue(value);
+                    }
+
+                    if (scheme != null) {
+                        Key key = scheme.getKey();
+                        if (key != null && key.getId() != null) {
+                            keyr.setTModelKey(key.getId());
+                        }
+                    }
+                }
+            }
+            return ibag;
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
-    
+
     private static OverviewDoc getOverviewDocFromExternalLink(ExternalLink link)
-       throws JAXRException
-       {
-           OverviewDoc od = objectFactory.createOverviewDoc();
-           String url = link.getExternalURI();
-           if(url != null)
-               od.setOverviewURL(url);
-           InternationalString extDesc = link.getDescription();
-           if(extDesc != null) {
-               Description description = objectFactory.createDescription();
-               od.getDescription().add(description);
-               description.setValue(extDesc.getValue());
-           }
-           return od;
-       }
+            throws JAXRException {
+        OverviewDoc od = objectFactory.createOverviewDoc();
+        String url = link.getExternalURI();
+        if (url != null) {
+            od.setOverviewURL(url);
+        }
+        InternationalString extDesc = link.getDescription();
+        if (extDesc != null) {
+            Description description = objectFactory.createDescription();
+            od.getDescription().add(description);
+            description.setValue(extDesc.getValue());
+        }
+        return od;
+    }
 
     private static BindingTemplates getBindingTemplates(Collection serviceBindings)
-        throws JAXRException {
+            throws JAXRException {
         BindingTemplates bt = null;
-        if(serviceBindings != null && serviceBindings.size() > 0) {
+        if (serviceBindings != null && serviceBindings.size() > 0) {
             bt = objectFactory.createBindingTemplates();
             Iterator iter = serviceBindings.iterator();
             int currLoc = 0;
             BindingTemplate[] bindingTemplateArray = new BindingTemplate[serviceBindings.size()];
-            while(iter.hasNext()) {
-                ServiceBinding sb = (ServiceBinding)iter.next();
+            while (iter.hasNext()) {
+                ServiceBinding sb = (ServiceBinding) iter.next();
                 bindingTemplateArray[currLoc] = getBindingTemplateFromJAXRSB(sb);
                 currLoc++;
             }
@@ -949,6 +968,6 @@
                 bt.getBindingTemplate().addAll(Arrays.asList(bindingTemplateArray));
             }
         }
-        return bt; 
+        return bt;
     }
 }
diff --git a/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiV3Helper.java b/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiV3Helper.java
index cc8a6f4..ac81f42 100644
--- a/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiV3Helper.java
+++ b/src/main/java/org/apache/ws/scout/util/ScoutJaxrUddiV3Helper.java
@@ -19,6 +19,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.StringTokenizer;
 
@@ -56,19 +57,18 @@
  * @author <a href="mailto:kstam@apache.org">Kurt T Stam</a>
  * @author <a href="mailto:tcunning@apache.org">Tom Cunningham</a>
  */
-public class ScoutJaxrUddiV3Helper 
-{
+public class ScoutJaxrUddiV3Helper {
+
     private static final String UDDI_ORG_TYPES = "uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4";
-	private static Log log = LogFactory.getLog(ScoutJaxrUddiV3Helper.class);
-	private static ObjectFactory objectFactory = new ObjectFactory();
-	
+    private static Log log = LogFactory.getLog(ScoutJaxrUddiV3Helper.class);
+    private static ObjectFactory objectFactory = new ObjectFactory();
+
     /**
      * Get UDDI Address given JAXR Postal Address
      */
-	public static Address getAddress(PostalAddress postalAddress) throws JAXRException {
-		Address address = objectFactory.createAddress();
-
-		AddressLine[] addarr = new AddressLine[7];
+    public static Address getAddress(PostalAddress postalAddress) throws JAXRException {
+        Address address = objectFactory.createAddress();
+        List<AddressLine> list = new LinkedList<AddressLine>();
 
         String stnum = postalAddress.getStreetNumber();
         String st = postalAddress.getStreet();
@@ -78,135 +78,150 @@
         String state = postalAddress.getStateOrProvince();
         String type = postalAddress.getType();
 
-		AddressLine stnumAL = objectFactory.createAddressLine();
-        stnumAL.setKeyName("STREET_NUMBER");
-		if (stnum != null) {
-			stnumAL.setKeyValue("STREET_NUMBER");
-			stnumAL.setValue(stnum);
-		}
+        AddressLine stnumAL = null;
 
-		AddressLine stAL = objectFactory.createAddressLine();
-        stAL.setKeyName("STREET");
-		if (st != null) {
-			stAL.setKeyValue("STREET");
-			stAL.setValue(st);
-		}
-
-		AddressLine cityAL = objectFactory.createAddressLine();
-        cityAL.setKeyName("CITY");
-		if (city != null) {
-			cityAL.setKeyValue("CITY");
-			cityAL.setValue(city);
-		}
-
-		AddressLine countryAL = objectFactory.createAddressLine();
-        countryAL.setKeyName("COUNTRY");
-		if (country != null) {
-			countryAL.setKeyValue("COUNTRY");
-			countryAL.setValue(country);
-		}
-
-		AddressLine codeAL = objectFactory.createAddressLine();
-        codeAL.setKeyName("POSTALCODE");
-		if (code != null) {
-			codeAL.setKeyValue("POSTALCODE");
-			codeAL.setValue(code);
-		}
-
-		AddressLine stateAL = objectFactory.createAddressLine();
-        stateAL.setKeyName("STATE");
-		if (state != null) {
-			stateAL.setKeyValue("STATE");
-			stateAL.setValue(state);
-		}
-		
-        AddressLine typeAL = objectFactory.createAddressLine();
-        typeAL.setKeyName("TYPE");
-        if (type != null) {
-                typeAL.setKeyValue("TYPE");
-                typeAL.setValue(type);
+        if (stnum != null && stnum.length() > 0) {
+            stnumAL = objectFactory.createAddressLine();
+            stnumAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            stnumAL.setKeyValue("STREET_NUMBER");
+            stnumAL.setValue(stnum);
+            list.add(stnumAL);
         }
 
-		// Add the AddressLine to vector
-		addarr[0] = stnumAL;
-		addarr[1] = stAL;
-		addarr[2] = cityAL;
-		addarr[3] = countryAL;
-		addarr[4] = codeAL;
-		addarr[5] = stateAL;
-		addarr[6] = typeAL;
-		
-		address.getAddressLine().addAll(Arrays.asList(addarr));
+        AddressLine stAL = null;
+
+        if (st != null && st.length() > 0) {
+            stAL = objectFactory.createAddressLine();
+            stAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            stAL.setKeyValue("STREET");
+            stAL.setValue(st);
+            list.add(stAL);
+        }
+
+        AddressLine cityAL = null;
+
+        if (city != null && city.length() > 0) {
+            cityAL = objectFactory.createAddressLine();
+            cityAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            cityAL.setKeyValue("CITY");
+            cityAL.setValue(city);
+            list.add(cityAL);
+        }
+
+        AddressLine countryAL = null;
+
+        if (country != null && country.length() > 0) {
+            countryAL = objectFactory.createAddressLine();
+            countryAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            countryAL.setKeyValue("COUNTRY");
+            countryAL.setValue(country);
+            list.add(countryAL);
+
+        }
+
+        AddressLine codeAL = null;
+
+        if (code != null&& code.length() > 0) {
+            codeAL = objectFactory.createAddressLine();
+            codeAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            codeAL.setKeyValue("POSTALCODE");
+            codeAL.setValue(code);
+            list.add(codeAL);
+        }
+
+        AddressLine stateAL = null;
+        if (state != null && state.length()>0) {
+            stateAL = objectFactory.createAddressLine();
+            stateAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+            stateAL.setKeyValue("STATE");
+            stateAL.setValue(state);
+            list.add(stateAL);
+
+        }
+
+        AddressLine typeAL = null;
+        if (type != null && type.length()>0) {
+            typeAL = objectFactory.createAddressLine();
+            typeAL.setKeyName("uddi:uddi.org:ubr:postaladdress");
+
+            typeAL.setValue(type);
+            typeAL.setKeyValue("TYPE");
+            list.add(typeAL);
+        }
+
+        //FIXME this may need v2 vs v3 support?
+        address.setTModelKey("uddi:uddi.org:ubr:postaladdress");
+        address.getAddressLine().addAll(list);
 
         return address;
     }
 
-	public static BindingTemplate getBindingTemplateFromJAXRSB(
-			ServiceBinding serviceBinding) throws JAXRException {
-		BindingTemplate bt = objectFactory.createBindingTemplate();
-		if (serviceBinding.getKey() != null && serviceBinding.getKey().getId() != null) {
-			bt.setBindingKey(serviceBinding.getKey().getId());
-		} else {
-			bt.setBindingKey("");
-		}
-	
-		try {
-			// Set Access URI
+    public static BindingTemplate getBindingTemplateFromJAXRSB(
+            ServiceBinding serviceBinding) throws JAXRException {
+        BindingTemplate bt = objectFactory.createBindingTemplate();
+        if (serviceBinding.getKey() != null && serviceBinding.getKey().getId() != null) {
+            bt.setBindingKey(serviceBinding.getKey().getId());
+        } else {
+            bt.setBindingKey("");
+        }
+
+        try {
+            // Set Access URI
             String accessuri = serviceBinding.getAccessURI();
-			if (accessuri != null) {
-				AccessPoint accessPoint = objectFactory.createAccessPoint();
+            if (accessuri != null) {
+                AccessPoint accessPoint = objectFactory.createAccessPoint();
                 accessPoint.setUseType(getUseType(accessuri));
-				accessPoint.setValue(accessuri);
+                accessPoint.setValue(accessuri);
                 bt.setAccessPoint(accessPoint);
             }
             ServiceBinding sb = serviceBinding.getTargetBinding();
-			if (sb != null) {
-				HostingRedirector red = objectFactory.createHostingRedirector();
+            if (sb != null) {
+                HostingRedirector red = objectFactory.createHostingRedirector();
                 Key key = sb.getKey();
-				if (key != null && key.getId() != null) {
-					red.setBindingKey(key.getId());
+                if (key != null && key.getId() != null) {
+                    red.setBindingKey(key.getId());
                 } else {
                     red.setBindingKey("");
                 }
                 bt.setHostingRedirector(red);
             } else {
-            	if (bt.getAccessPoint() == null) {
-            		bt.setAccessPoint(objectFactory.createAccessPoint());
-            	}
+                if (bt.getAccessPoint() == null) {
+                    bt.setAccessPoint(objectFactory.createAccessPoint());
+                }
             }
-			// TODO:Need to look further at the mapping b/w BindingTemplate and
-			// Jaxr ServiceBinding
+            // TODO:Need to look further at the mapping b/w BindingTemplate and
+            // Jaxr ServiceBinding
 
             CategoryBag catBag = getCategoryBagFromClassifications(serviceBinding.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 bt.setCategoryBag(catBag);
             }
-			
+
             // Get Service information
             Service svc = serviceBinding.getService();
             if (svc != null && svc.getKey() != null && svc.getKey().getId() != null) {
-              bt.setServiceKey(svc.getKey().getId());
+                bt.setServiceKey(svc.getKey().getId());
             }
-			
-			InternationalString idesc = serviceBinding.getDescription();
-            
+
+            InternationalString idesc = serviceBinding.getDescription();
+
             addDescriptions(bt.getDescription(), idesc);
 
-			// SpecificationLink
-           Collection<SpecificationLink> slcol = serviceBinding.getSpecificationLinks();
-			TModelInstanceDetails tid = objectFactory.createTModelInstanceDetails();
-			if (slcol != null && !slcol.isEmpty()) {
-              Iterator<SpecificationLink> iter = slcol.iterator();
-				while (iter.hasNext()) {
-					SpecificationLink slink = (SpecificationLink) iter.next();
+            // SpecificationLink
+            Collection<SpecificationLink> slcol = serviceBinding.getSpecificationLinks();
+            TModelInstanceDetails tid = objectFactory.createTModelInstanceDetails();
+            if (slcol != null && !slcol.isEmpty()) {
+                Iterator<SpecificationLink> iter = slcol.iterator();
+                while (iter.hasNext()) {
+                    SpecificationLink slink = (SpecificationLink) iter.next();
 
-					TModelInstanceInfo emptyTInfo = objectFactory.createTModelInstanceInfo();
-					tid.getTModelInstanceInfo().add(emptyTInfo);
+                    TModelInstanceInfo emptyTInfo = objectFactory.createTModelInstanceInfo();
+                    tid.getTModelInstanceInfo().add(emptyTInfo);
 
                     RegistryObject specificationObject = slink.getSpecificationObject();
-					if (specificationObject.getKey() != null && specificationObject.getKey().getId() != null) {
-						emptyTInfo.setTModelKey(specificationObject.getKey().getId());
-                        if (specificationObject.getDescription()!=null) {
+                    if (specificationObject.getKey() != null && specificationObject.getKey().getId() != null) {
+                        emptyTInfo.setTModelKey(specificationObject.getKey().getId());
+                        if (specificationObject.getDescription() != null) {
                             for (Object o : specificationObject.getDescription().getLocalizedStrings()) {
                                 LocalizedString locDesc = (LocalizedString) o;
                                 Description description = objectFactory.createDescription();
@@ -216,16 +231,16 @@
                             }
                         }
                         Collection<ExternalLink> externalLinks = slink.getExternalLinks();
-                        if (externalLinks!=null && externalLinks.size()>0) {
+                        if (externalLinks != null && externalLinks.size() > 0) {
                             for (ExternalLink link : externalLinks) {
                                 InstanceDetails ids = objectFactory.createInstanceDetails();
                                 emptyTInfo.setInstanceDetails(ids);
-                                if (link.getDescription()!=null) {
+                                if (link.getDescription() != null) {
                                     Description description = objectFactory.createDescription();
                                     ids.getDescription().add(description);
                                     description.setValue(link.getDescription().getValue());
                                 }
-                                if (link.getExternalURI()!=null) {
+                                if (link.getExternalURI() != null) {
                                     OverviewDoc overviewDoc = objectFactory.createOverviewDoc();
                                     ids.getOverviewDoc().add(overviewDoc);
                                     org.uddi.api_v3.OverviewURL ourl = new org.uddi.api_v3.OverviewURL();
@@ -240,95 +255,96 @@
                                     }
                                     ids.setInstanceParms(buffer.toString().trim());
                                 }
-                            } 
+                            }
                         }
-					}
-              }
+                    }
+                }
             }
-			if (tid.getTModelInstanceInfo().size() != 0) {
-				bt.setTModelInstanceDetails(tid);
-			}
-			log.debug("BindingTemplate=" + bt.toString());
-		} catch (Exception ud) {
+            if (tid.getTModelInstanceInfo().size() != 0) {
+                bt.setTModelInstanceDetails(tid);
+            }
+            log.debug("BindingTemplate=" + bt.toString());
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return bt;
     }
 
-	public static PublisherAssertion getPubAssertionFromJAXRAssociation(
-			Association association) throws JAXRException {
-		PublisherAssertion pa = objectFactory.createPublisherAssertion();
-		try {
-			if (association.getSourceObject().getKey() != null && 
-				association.getSourceObject().getKey().getId() != null) {
-            pa.setFromKey(association.getSourceObject().getKey().getId());
-			}
-			
-			if (association.getTargetObject().getKey() != null &&
-				association.getTargetObject().getKey().getId() != null) {
-            pa.setToKey(association.getTargetObject().getKey().getId());
-			}
+    public static PublisherAssertion getPubAssertionFromJAXRAssociation(
+            Association association) throws JAXRException {
+        PublisherAssertion pa = objectFactory.createPublisherAssertion();
+        try {
+            if (association.getSourceObject().getKey() != null
+                    && association.getSourceObject().getKey().getId() != null) {
+                pa.setFromKey(association.getSourceObject().getKey().getId());
+            }
+
+            if (association.getTargetObject().getKey() != null
+                    && association.getTargetObject().getKey().getId() != null) {
+                pa.setToKey(association.getTargetObject().getKey().getId());
+            }
             Concept c = association.getAssociationType();
             String v = c.getValue();
-			KeyedReference kr = objectFactory.createKeyedReference();
+            KeyedReference kr = objectFactory.createKeyedReference();
             Key key = c.getKey();
-			if (key == null) {
-				// TODO:Need to check this. If the concept is a predefined
-				// enumeration, the key can be the parent classification scheme
+            if (key == null) {
+                // TODO:Need to check this. If the concept is a predefined
+                // enumeration, the key can be the parent classification scheme
                 key = c.getClassificationScheme().getKey();
             }
-			if (key != null && key.getId() != null) {
-				kr.setTModelKey(key.getId());
-			} 
+            if (key != null && key.getId() != null) {
+                kr.setTModelKey(key.getId());
+            }
             kr.setKeyName("Concept");
 
-			if (v != null) {
-				kr.setKeyValue(v);
-			}
-
-            pa.setKeyedReference(kr);
-		} catch (Exception ud) {
-            throw new JAXRException("Apache JAXR Impl:", ud);
-        }
-        return pa;
-    }
-
-	public static PublisherAssertion getPubAssertionFromJAXRAssociationKey(
-			String key) throws JAXRException {
-		PublisherAssertion pa = objectFactory.createPublisherAssertion();
-		try {
-			StringTokenizer token = new StringTokenizer(key, "|");
-			if (token.hasMoreTokens()) {
-               pa.setFromKey(getToken(token.nextToken()));
-               pa.setToKey(getToken(token.nextToken()));
-				KeyedReference kr = objectFactory.createKeyedReference();
-				// Sometimes the Key is UUID:something
-               String str = getToken(token.nextToken());
-				if ("UUID".equalsIgnoreCase(str))
-					str += ":" + getToken(token.nextToken());
-               kr.setTModelKey(str);
-               kr.setKeyName(getToken(token.nextToken()));
-               kr.setKeyValue(getToken(token.nextToken()));
-               pa.setKeyedReference(kr);
+            if (v != null) {
+                kr.setKeyValue(v);
             }
 
-		} catch (Exception ud) {
+            pa.setKeyedReference(kr);
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return pa;
     }
 
-	public static BusinessService getBusinessServiceFromJAXRService(
-			Service service) throws JAXRException {
-		BusinessService bs = objectFactory.createBusinessService();
-		try {
-			InternationalString iname = service.getName();
-						
-			addNames(bs.getName(), iname);
-	         
+    public static PublisherAssertion getPubAssertionFromJAXRAssociationKey(
+            String key) throws JAXRException {
+        PublisherAssertion pa = objectFactory.createPublisherAssertion();
+        try {
+            StringTokenizer token = new StringTokenizer(key, "|");
+            if (token.hasMoreTokens()) {
+                pa.setFromKey(getToken(token.nextToken()));
+                pa.setToKey(getToken(token.nextToken()));
+                KeyedReference kr = objectFactory.createKeyedReference();
+                // Sometimes the Key is UUID:something
+                String str = getToken(token.nextToken());
+                if ("UUID".equalsIgnoreCase(str)) {
+                    str += ":" + getToken(token.nextToken());
+                }
+                kr.setTModelKey(str);
+                kr.setKeyName(getToken(token.nextToken()));
+                kr.setKeyValue(getToken(token.nextToken()));
+                pa.setKeyedReference(kr);
+            }
+
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
+        return pa;
+    }
+
+    public static BusinessService getBusinessServiceFromJAXRService(
+            Service service) throws JAXRException {
+        BusinessService bs = objectFactory.createBusinessService();
+        try {
+            InternationalString iname = service.getName();
+
+            addNames(bs.getName(), iname);
+
             InternationalString idesc = service.getDescription();
-    
-           addDescriptions(bs.getDescription(), idesc);
+
+            addDescriptions(bs.getDescription(), idesc);
 
             Organization o = service.getProvidingOrganization();
 
@@ -338,26 +354,26 @@
             if (o != null) {
                 Key k = o.getKey();
 
-				if (k != null && k.getId() != null) {
+                if (k != null && k.getId() != null) {
                     bs.setBusinessKey(k.getId());
-                } 
-                    
-			} else {
+                }
+
+            } else {
                 /*
                  * gmj - I *think* this is the right thing to do
                  */
-				throw new JAXRException(
-						"Service has no associated organization");
+                throw new JAXRException(
+                        "Service has no associated organization");
             }
 
-			if (service.getKey() != null && service.getKey().getId() != null) {
+            if (service.getKey() != null && service.getKey().getId() != null) {
                 bs.setServiceKey(service.getKey().getId());
             } else {
                 bs.setServiceKey("");
             }
 
             CategoryBag catBag = getCategoryBagFromClassifications(service.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 bs.setCategoryBag(catBag);
             }
 
@@ -366,18 +382,18 @@
             if (bt != null) {
                 bs.setBindingTemplates(bt);
             }
-   		    
+
             log.debug("BusinessService=" + bs.toString());
-		} catch (Exception ud) {
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return bs;
     }
 
-	public static TModel getTModelFromJAXRClassificationScheme(
-			ClassificationScheme classificationScheme) throws JAXRException {
-		TModel tm = objectFactory.createTModel();
-		try {
+    public static TModel getTModelFromJAXRClassificationScheme(
+            ClassificationScheme classificationScheme) throws JAXRException {
+        TModel tm = objectFactory.createTModel();
+        try {
             /*
              * a fresh scheme might not have a key
              */
@@ -393,52 +409,53 @@
             /*
              * There's no reason to believe these are here either
              */
-
             Slot s = classificationScheme.getSlot("authorizedName");
-/*
+            /*
 			if (s != null && s.getName() != null) {
                 tm.setAuthorizedName(s.getName());
             }
-*/
+             */
             s = classificationScheme.getSlot("operator");
-/*
+            /*
 			if (s != null && s.getName() != null) {
                 tm.setOperator(s.getName());
             }
-*/
-			InternationalString iname = classificationScheme.getName();
-			 
+             */
+            InternationalString iname = classificationScheme.getName();
+
             tm.setName(getFirstName(iname));
 
-			InternationalString idesc = classificationScheme.getDescription();
-			
-		    addDescriptions(tm.getDescription(), idesc);
+            InternationalString idesc = classificationScheme.getDescription();
+
+            addDescriptions(tm.getDescription(), idesc);
 
             IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(classificationScheme.getExternalIdentifiers());
-            if (idBag!=null) {
+            if (idBag != null) {
                 tm.setIdentifierBag(idBag);
             }
             CategoryBag catBag = getCategoryBagFromClassifications(classificationScheme.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 tm.setCategoryBag(catBag);
             }
-			
-			// ToDO: overviewDoc
-		} catch (Exception ud) {
+
+            // ToDO: overviewDoc
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return tm;
     }
 
     public static TModel getTModelFromJAXRConcept(Concept concept)
-			throws JAXRException {
-    	TModel tm = objectFactory.createTModel();
-		if (concept == null)
-			return null;
-		try {
+            throws JAXRException {
+        TModel tm = objectFactory.createTModel();
+        if (concept == null) {
+            return null;
+        }
+        try {
             Key key = concept.getKey();
-			if (key != null && key.getId() != null)
-				tm.setTModelKey(key.getId());
+            if (key != null && key.getId() != null) {
+                tm.setTModelKey(key.getId());
+            }
             Slot sl1 = concept.getSlot("authorizedName");
             /*
 			if (sl1 != null && sl1.getName() != null)
@@ -447,32 +464,31 @@
             Slot sl2 = concept.getSlot("operator");
 			if (sl2 != null && sl2.getName() != null)
 				tm.setOperator(sl2.getName());
-			*/
-			InternationalString iname = concept.getName();
+             */
+            InternationalString iname = concept.getName();
 
             tm.setName(getFirstName(iname));
 
             InternationalString idesc = concept.getDescription();
-			
+
             addDescriptions(tm.getDescription(), idesc);
 
 //          External Links
-            Collection<ExternalLink> externalLinks = concept.getExternalLinks(); 
-            if(externalLinks != null && externalLinks.size() > 0)
-            {
-                tm.getOverviewDoc().add(getOverviewDocFromExternalLink((ExternalLink)externalLinks.iterator().next()));
-            }  
+            Collection<ExternalLink> externalLinks = concept.getExternalLinks();
+            if (externalLinks != null && externalLinks.size() > 0) {
+                tm.getOverviewDoc().add(getOverviewDocFromExternalLink((ExternalLink) externalLinks.iterator().next()));
+            }
 
             IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(concept.getExternalIdentifiers());
-            if (idBag!=null) {
+            if (idBag != null) {
                 tm.setIdentifierBag(idBag);
             }
             CategoryBag catBag = getCategoryBagFromClassifications(concept.getClassifications());
-            if (catBag!=null) {
+            if (catBag != null) {
                 tm.setCategoryBag(catBag);
             }
 
-		} catch (Exception ud) {
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return tm;
@@ -500,6 +516,7 @@
         }
         return null;
     }
+
     private static void addNames(List<Name> names, InternationalString iname) throws JAXRException {
         for (Object o : iname.getLocalizedStrings()) {
             LocalizedString locName = (LocalizedString) o;
@@ -511,52 +528,52 @@
     }
 
     public static BusinessEntity getBusinessEntityFromJAXROrg(Organization organization)
-			throws JAXRException {
-		BusinessEntity biz = objectFactory.createBusinessEntity();
-		BusinessServices bss = objectFactory.createBusinessServices();
-		BusinessService[] barr = new BusinessService[0];
+            throws JAXRException {
+        BusinessEntity biz = objectFactory.createBusinessEntity();
+        BusinessServices bss = objectFactory.createBusinessServices();
+        BusinessService[] barr = new BusinessService[0];
 
-		try {
-			// It may just be an update
+        try {
+            // It may just be an update
             Key key = organization.getKey();
-			if (key != null && key.getId() != null) {
-				biz.setBusinessKey(key.getId());
+            if (key != null && key.getId() != null) {
+                biz.setBusinessKey(key.getId());
             } else {
                 biz.setBusinessKey("");
             }
-			// Lets get the Organization attributes at the top level
-			
-			InternationalString iname = organization.getName();
-			
-			if (iname != null) {
+            // Lets get the Organization attributes at the top level
+
+            InternationalString iname = organization.getName();
+
+            if (iname != null) {
                 addNames(biz.getName(), iname);
-			}
-			
-			InternationalString idesc = organization.getDescription();
-			
+            }
+
+            InternationalString idesc = organization.getDescription();
+
             addDescriptions(biz.getDescription(), idesc);
 
-			if (organization.getPrimaryContact() != null && 
-				organization.getPrimaryContact().getPersonName()!= null &&
-				organization.getPrimaryContact().getPersonName().getFullName() != null) {
+            if (organization.getPrimaryContact() != null
+                    && organization.getPrimaryContact().getPersonName() != null
+                    && organization.getPrimaryContact().getPersonName().getFullName() != null) {
 
-				//biz.setAuthorizedName(organization.getPrimaryContact().getPersonName()
-				//		.getFullName());
-			}
+                //biz.setAuthorizedName(organization.getPrimaryContact().getPersonName()
+                //		.getFullName());
+            }
 
             Collection<Service> s = organization.getServices();
             log.debug("?Org has services=" + s.isEmpty());
 
-			barr = new BusinessService[s.size()];
+            barr = new BusinessService[s.size()];
 
             Iterator<Service> iter = s.iterator();
-			int barrPos = 0;
-			while (iter.hasNext()) {
-				BusinessService bs = ScoutJaxrUddiV3Helper
-						.getBusinessServiceFromJAXRService((Service) iter
-								.next());
-				barr[barrPos] = bs;
-				barrPos++;
+            int barrPos = 0;
+            while (iter.hasNext()) {
+                BusinessService bs = ScoutJaxrUddiV3Helper
+                        .getBusinessServiceFromJAXRService((Service) iter
+                                .next());
+                barr[barrPos] = bs;
+                barrPos++;
             }
 
             /*
@@ -564,16 +581,14 @@
              * special designation for one of the users, and D6.1 seems to say
              * that the first UDDI user is the primary contact
              */
-
-			Contacts cts = objectFactory.createContacts();
-			Contact[] carr = new Contact[0];
+            Contacts cts = objectFactory.createContacts();
+            Contact[] carr = new Contact[0];
 
             User primaryContact = organization.getPrimaryContact();
             Collection<User> users = organization.getUsers();
 
             // Expand array to necessary size only (xmlbeans does not like
             // null items in cases like this)
-
             int carrSize = 0;
 
             if (primaryContact != null) {
@@ -611,8 +626,8 @@
                 }
             }
 
-			bss.getBusinessService().addAll(Arrays.asList(barr));
-            if (carr.length>0) {
+            bss.getBusinessService().addAll(Arrays.asList(barr));
+            if (carr.length > 0) {
                 cts.getContact().addAll(Arrays.asList(carr));
                 biz.setContacts(cts);
             }
@@ -624,7 +639,9 @@
             boolean first = true;
             while (exiter.hasNext()) {
                 ExternalLink link = (ExternalLink) exiter.next();
-                /** Note: jUDDI adds its own discoverURL as the businessEntity* */
+                /**
+                 * Note: jUDDI adds its own discoverURL as the businessEntity*
+                 */
                 if (first) {
                     emptyDUs = objectFactory.createDiscoveryURLs();
                     biz.setDiscoveryURLs(emptyDUs);
@@ -633,22 +650,22 @@
                 DiscoveryURL emptyDU = objectFactory.createDiscoveryURL();
                 emptyDUs.getDiscoveryURL().add(emptyDU);
                 emptyDU.setUseType("businessEntityExt");
-				
+
                 if (link.getExternalURI() != null) {
                     emptyDU.setValue(link.getExternalURI());
                 }
             }
-			
-          IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(organization.getExternalIdentifiers());
-          if (idBag!=null) {
-              biz.setIdentifierBag(idBag);
-          }
-          CategoryBag catBag = getCategoryBagFromClassifications(organization.getClassifications());
-          if (catBag!=null) {
-              biz.setCategoryBag(catBag);
-          }
-			
-		} catch (Exception ud) {
+
+            IdentifierBag idBag = getIdentifierBagFromExternalIdentifiers(organization.getExternalIdentifiers());
+            if (idBag != null) {
+                biz.setIdentifierBag(idBag);
+            }
+            CategoryBag catBag = getCategoryBagFromClassifications(organization.getClassifications());
+            if (catBag != null) {
+                biz.setCategoryBag(catBag);
+            }
+
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return biz;
@@ -656,210 +673,225 @@
 
     /**
      *
-     * Convert JAXR User Object to UDDI  Contact
+     * Convert JAXR User Object to UDDI Contact
      */
     public static Contact getContactFromJAXRUser(User user)
-			throws JAXRException {
-		Contact ct = objectFactory.createContact();
+            throws JAXRException {
+        Contact ct = objectFactory.createContact();
         if (user == null) {
             return null;
         }
 
-		Address[] addarr = new Address[0];
-		Phone[] phonearr = new Phone[0];
-		Email[] emailarr = new Email[0];
-		try {
-			
-			if (user.getPersonName() != null && user.getPersonName().getFullName() != null) {
-				org.uddi.api_v3.PersonName pn = new org.uddi.api_v3.PersonName();
-				pn.setValue(user.getPersonName().getFullName());
-				ct.getPersonName().add(pn);
-			}
-			
-			if (user.getType() != null) {
-            ct.setUseType(user.getType());
-			}
-			// Postal Address
+        Address[] addarr = new Address[0];
+        Phone[] phonearr = new Phone[0];
+        Email[] emailarr = new Email[0];
+        try {
+
+            if (user.getPersonName() != null && user.getPersonName().getFullName() != null) {
+                org.uddi.api_v3.PersonName pn = new org.uddi.api_v3.PersonName();
+                pn.setValue(user.getPersonName().getFullName());
+                ct.getPersonName().add(pn);
+            }
+
+            if (user.getType() != null) {
+                ct.setUseType(user.getType());
+            }
+            // Postal Address
             Collection<PostalAddress> postc = user.getPostalAddresses();
 
-			addarr = new Address[postc.size()];
+            addarr = new Address[postc.size()];
 
             Iterator<PostalAddress> iterator = postc.iterator();
-			int addarrPos = 0;
-			while (iterator.hasNext()) {
+            int addarrPos = 0;
+            while (iterator.hasNext()) {
                 PostalAddress post = (PostalAddress) iterator.next();
-				addarr[addarrPos] = ScoutJaxrUddiV3Helper.getAddress(post);
-				addarrPos++;
+                addarr[addarrPos] = ScoutJaxrUddiV3Helper.getAddress(post);
+                addarrPos++;
             }
-			// Phone Numbers
+            // Phone Numbers
             Collection ph = user.getTelephoneNumbers(null);
 
-			phonearr = new Phone[ph.size()];
+            phonearr = new Phone[ph.size()];
 
             Iterator it = ph.iterator();
-			int phonearrPos = 0;
-			while (it.hasNext()) {
+            int phonearrPos = 0;
+            while (it.hasNext()) {
                 TelephoneNumber t = (TelephoneNumber) it.next();
-				Phone phone = objectFactory.createPhone();
+                Phone phone = objectFactory.createPhone();
                 String str = t.getNumber();
                 log.debug("Telephone=" + str);
-				
-				// FIXME: If phone number is null, should the phone 
-				// not be set at all, or set to empty string?
-				if (str != null) {
-					phone.setValue(str);
-				} else {
-					phone.setValue("");
-				}
 
-				phonearr[phonearrPos] = phone;
-				phonearrPos++;
+                // FIXME: If phone number is null, should the phone 
+                // not be set at all, or set to empty string?
+                if (str != null) {
+                    phone.setValue(str);
+                } else {
+                    phone.setValue("");
+                }
+
+                phonearr[phonearrPos] = phone;
+                phonearrPos++;
             }
 
-			// Email Addresses
+            // Email Addresses
             Collection ec = user.getEmailAddresses();
 
-			emailarr = new Email[ec.size()];
+            emailarr = new Email[ec.size()];
 
             Iterator iter = ec.iterator();
-			int emailarrPos = 0;
-			while (iter.hasNext()) {
+            int emailarrPos = 0;
+            while (iter.hasNext()) {
                 EmailAddress ea = (EmailAddress) iter.next();
-				Email email = objectFactory.createEmail();
-				
-				if (ea.getAddress() != null) {
-					email.setValue(ea.getAddress());
-				}
-				// email.setText( ea.getAddress() );
-				
-				if (ea.getType() != null) {
-                email.setUseType(ea.getType());
-            }
+                Email email = objectFactory.createEmail();
 
-				emailarr[emailarrPos] = email;
-				emailarrPos++;
-			}
-			ct.getAddress().addAll(Arrays.asList(addarr));
-			ct.getPhone().addAll(Arrays.asList(phonearr));
-			ct.getEmail().addAll(Arrays.asList(emailarr));
-		} catch (Exception ud) {
+                if (ea.getAddress() != null) {
+                    email.setValue(ea.getAddress());
+                }
+                // email.setText( ea.getAddress() );
+
+                if (ea.getType() != null) {
+                    email.setUseType(ea.getType());
+                }
+
+                emailarr[emailarrPos] = email;
+                emailarrPos++;
+            }
+            ct.getAddress().addAll(Arrays.asList(addarr));
+            ct.getPhone().addAll(Arrays.asList(phonearr));
+            ct.getEmail().addAll(Arrays.asList(emailarr));
+        } catch (Exception ud) {
             throw new JAXRException("Apache JAXR Impl:", ud);
         }
         return ct;
     }
 
-	private static String getToken(String tokenstr) {
-		// Token can have the value NULL which need to be converted into null
-		if (tokenstr.equals("NULL"))
-			tokenstr = "";
-      return tokenstr;
-   }
+    private static String getToken(String tokenstr) {
+        // Token can have the value NULL which need to be converted into null
+        if (tokenstr.equals("NULL")) {
+            tokenstr = "";
+        }
+        return tokenstr;
+    }
 
-	private static String getUseType(String accessuri) {
-       String acc = accessuri.toLowerCase();
-		String uri = "other";
-		if (acc.startsWith("http:"))
-			uri = "http:";
-		else if (acc.startsWith("https:"))
-			uri = "https:";
-		else if (acc.startsWith("ftp:"))
-			uri = "ftp:";
-		else if (acc.startsWith("phone:"))
-			uri = "phone:";
+    private static String getUseType(String accessuri) {
+        String acc = accessuri.toLowerCase();
+        String uri = "other";
+        if (acc.startsWith("http:")) {
+            uri = "http:";
+        } else if (acc.startsWith("https:")) {
+            uri = "https:";
+        } else if (acc.startsWith("ftp:")) {
+            uri = "ftp:";
+        } else if (acc.startsWith("phone:")) {
+            uri = "phone:";
+        }
 
-       return uri;
-   }
-    
-	/**
-     * According to JAXR Javadoc, there are two types of classification, internal and external and they use the Classification, Concept,     
-     * and ClassificationScheme objects.  It seems the only difference between internal and external (as related to UDDI) is that the
-     * name/value pair of the categorization is held in the Concept for internal classifications and the Classification for external (bypassing
-     * the Concept entirely).
-     * 
-     * The translation to UDDI is simple.  Relevant objects have a category bag which contains a bunch of KeyedReferences (name/value pairs).  
-     * These KeyedReferences optionally refer to a tModel that identifies the type of category (translates to the ClassificationScheme key).  If
-     * this is set and the tModel doesn't exist in the UDDI registry, then an invalid key error will occur when trying to save the object.
-     * 
+        return uri;
+    }
+
+    /**
+     * According to JAXR Javadoc, there are two types of classification,
+     * internal and external and they use the Classification, Concept, and
+     * ClassificationScheme objects. It seems the only difference between
+     * internal and external (as related to UDDI) is that the name/value pair of
+     * the categorization is held in the Concept for internal classifications
+     * and the Classification for external (bypassing the Concept entirely).
+     *
+     * The translation to UDDI is simple. Relevant objects have a category bag
+     * which contains a bunch of KeyedReferences (name/value pairs). These
+     * KeyedReferences optionally refer to a tModel that identifies the type of
+     * category (translates to the ClassificationScheme key). If this is set and
+     * the tModel doesn't exist in the UDDI registry, then an invalid key error
+     * will occur when trying to save the object.
+     *
      * @param classifications classifications to turn into categories
      * @throws JAXRException
      */
-	public static CategoryBag getCategoryBagFromClassifications(Collection classifications) throws JAXRException {
-    	try {
-			if (classifications == null || classifications.size()==0)
-				return null;
-    		
-    		// Classifications
-			CategoryBag cbag = objectFactory.createCategoryBag();
-			Iterator classiter = classifications.iterator();
-			while (classiter.hasNext()) {
-				Classification classification = (Classification) classiter.next();
-				if (classification != null ) {
-					KeyedReference keyr = objectFactory.createKeyedReference();
-					cbag.getKeyedReference().add(keyr);
-	
-					InternationalStringImpl iname = null;
-					String value = null;
-					ClassificationScheme scheme = classification.getClassificationScheme();
-                    if (scheme==null || (classification.isExternal() && classification.getConcept()==null)) {
+    public static CategoryBag getCategoryBagFromClassifications(Collection classifications) throws JAXRException {
+        try {
+            if (classifications == null || classifications.size() == 0) {
+                return null;
+            }
+
+            // Classifications
+            CategoryBag cbag = objectFactory.createCategoryBag();
+            Iterator classiter = classifications.iterator();
+            while (classiter.hasNext()) {
+                Classification classification = (Classification) classiter.next();
+                if (classification != null) {
+                    KeyedReference keyr = objectFactory.createKeyedReference();
+                    cbag.getKeyedReference().add(keyr);
+
+                    InternationalStringImpl iname = null;
+                    String value = null;
+                    ClassificationScheme scheme = classification.getClassificationScheme();
+                    if (scheme == null || (classification.isExternal() && classification.getConcept() == null)) {
                         /*
                         * JAXR 1.0 Specification: Section D6.4.4
                         * Specification related tModels mapped from Concept may be automatically
                         * categorized by the well-known uddi-org:types taxonomy in UDDI (with
                         * tModelKey uuid:C1ACF26D-9672-4404-9D70-39B756E62AB4) as follows:
                         * The keyed reference is assigned a taxonomy value of specification.
-                        */
+                         */
                         keyr.setTModelKey(UDDI_ORG_TYPES);
-                        keyr.setKeyValue("specification"); 
+                        keyr.setKeyValue("specification");
                     } else {
-    					if (classification.isExternal()) {
+                        if (classification.isExternal()) {
                             iname = (InternationalStringImpl) ((RegistryObject) classification).getName();
                             value = classification.getValue();
-    					} else {
-    						Concept concept = classification.getConcept();
-    						if (concept != null) {
-    							iname = (InternationalStringImpl) ((RegistryObject) concept).getName();
-    							value = concept.getValue();
-    							scheme = concept.getClassificationScheme();
-    						}
-    					}
-    	
-    					String name = iname.getValue();
-    					if (name != null)
-    						keyr.setKeyName(name);
-    	
-    					if (value != null)
-    						keyr.setKeyValue(value);
-    					
-    					if (scheme != null) {
-    						Key key = scheme.getKey();
-    						if (key != null && key.getId() != null)
-    							keyr.setTModelKey(key.getId());
-    					}
-    				}
+                        } else {
+                            Concept concept = classification.getConcept();
+                            if (concept != null) {
+                                iname = (InternationalStringImpl) ((RegistryObject) concept).getName();
+                                value = concept.getValue();
+                                scheme = concept.getClassificationScheme();
+                            }
+                        }
+
+                        String name = iname.getValue();
+                        if (name != null) {
+                            keyr.setKeyName(name);
+                        }
+
+                        if (value != null) {
+                            keyr.setKeyValue(value);
+                        }
+
+                        if (scheme != null) {
+                            Key key = scheme.getKey();
+                            if (key != null && key.getId() != null) {
+                                keyr.setTModelKey(key.getId());
+                            }
+                        }
+                    }
                 }
-			}
-			if (cbag.getKeyedReference().isEmpty()) return null;
-			else return cbag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+            }
+            if (cbag.getKeyedReference().isEmpty()) {
+                return null;
+            } else {
+                return cbag;
+            }
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
 
-	public static TModelBag getTModelBagFromSpecifications(Collection specifications) throws JAXRException {
-    	try {
-			if (specifications == null || specifications.size()==0)
-				return null;
-    		
-    		// Classifications
-			TModelBag tbag = objectFactory.createTModelBag();
-			Iterator speciter = specifications.iterator();
-			while (speciter.hasNext()) {
-				RegistryObject registryobject = (RegistryObject) speciter.next();
-				if (registryobject instanceof Concept) {
-				    Concept concept = (Concept) registryobject;
-				    if (concept.getKey() != null) {
-				        tbag.getTModelKey().add(concept.getKey().toString());
-				    }
+    public static TModelBag getTModelBagFromSpecifications(Collection specifications) throws JAXRException {
+        try {
+            if (specifications == null || specifications.size() == 0) {
+                return null;
+            }
+
+            // Classifications
+            TModelBag tbag = objectFactory.createTModelBag();
+            Iterator speciter = specifications.iterator();
+            while (speciter.hasNext()) {
+                RegistryObject registryobject = (RegistryObject) speciter.next();
+                if (registryobject instanceof Concept) {
+                    Concept concept = (Concept) registryobject;
+                    if (concept.getKey() != null) {
+                        tbag.getTModelKey().add(concept.getKey().toString());
+                    }
 //					SpecificationLink specificationlink = (SpecificationLink) registryobject;
 //					if (specificationlink.getSpecificationObject() != null) {
 //						RegistryObject ro = specificationlink.getSpecificationObject();
@@ -868,91 +900,96 @@
 //							tbag.getTModelKey().add(key.toString());
 //						}
 //					}
-				} else {
-					log.info("ebXML case - the RegistryObject is an ExtrinsicObject, Not implemented");
-				}
-			}
-			if (tbag.getTModelKey().isEmpty()) return null;
-			else return tbag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+                } else {
+                    log.info("ebXML case - the RegistryObject is an ExtrinsicObject, Not implemented");
+                }
+            }
+            if (tbag.getTModelKey().isEmpty()) {
+                return null;
+            } else {
+                return tbag;
+            }
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
 
-	
-	/**
+    /**
      * Adds the objects identifiers from JAXR's external identifier collection
-     * 
+     *
      * @param identifiers external identifiers to turn into identifiers
      * @throws JAXRException
      */
-	public static IdentifierBag getIdentifierBagFromExternalIdentifiers(Collection identifiers) throws JAXRException {
-    	try {
-			if (identifiers == null || identifiers.size()==0)
-				return null;
-    		
-    		// Identifiers
-			IdentifierBag ibag = objectFactory.createIdentifierBag();
-			Iterator iditer = identifiers.iterator();
-			while (iditer.hasNext()) {
-				ExternalIdentifier extid = (ExternalIdentifier) iditer.next();
-				if (extid != null ) {
-					KeyedReference keyr = objectFactory.createKeyedReference();
-					ibag.getKeyedReference().add(keyr);
-	
-					InternationalStringImpl iname = (InternationalStringImpl) ((RegistryObject) extid).getName();
-					String value = extid.getValue();
-					ClassificationScheme scheme = extid.getIdentificationScheme();
-	
-					String name = iname.getValue();
-					if (name != null)
-						keyr.setKeyName(name);
-	
-					if (value != null)
-						keyr.setKeyValue(value);
-					
-					if (scheme != null) {
-						Key key = scheme.getKey();
-						if (key != null && key.getId() != null)
-							keyr.setTModelKey(key.getId());
-					}
-				}
-			}
-			return ibag;
-    	} catch (Exception ud) {
-			throw new JAXRException("Apache JAXR Impl:", ud);
-		}
+    public static IdentifierBag getIdentifierBagFromExternalIdentifiers(Collection identifiers) throws JAXRException {
+        try {
+            if (identifiers == null || identifiers.size() == 0) {
+                return null;
+            }
+
+            // Identifiers
+            IdentifierBag ibag = objectFactory.createIdentifierBag();
+            Iterator iditer = identifiers.iterator();
+            while (iditer.hasNext()) {
+                ExternalIdentifier extid = (ExternalIdentifier) iditer.next();
+                if (extid != null) {
+                    KeyedReference keyr = objectFactory.createKeyedReference();
+                    ibag.getKeyedReference().add(keyr);
+
+                    InternationalStringImpl iname = (InternationalStringImpl) ((RegistryObject) extid).getName();
+                    String value = extid.getValue();
+                    ClassificationScheme scheme = extid.getIdentificationScheme();
+
+                    String name = iname.getValue();
+                    if (name != null) {
+                        keyr.setKeyName(name);
+                    }
+
+                    if (value != null) {
+                        keyr.setKeyValue(value);
+                    }
+
+                    if (scheme != null) {
+                        Key key = scheme.getKey();
+                        if (key != null && key.getId() != null) {
+                            keyr.setTModelKey(key.getId());
+                        }
+                    }
+                }
+            }
+            return ibag;
+        } catch (Exception ud) {
+            throw new JAXRException("Apache JAXR Impl:", ud);
+        }
     }
-    
+
     private static OverviewDoc getOverviewDocFromExternalLink(ExternalLink link)
-       throws JAXRException
-       {
-           OverviewDoc od = objectFactory.createOverviewDoc();
-           String url = link.getExternalURI();
-           if(url != null) {
-        	   org.uddi.api_v3.OverviewURL ourl = new org.uddi.api_v3.OverviewURL();
-        	   ourl.setValue(url.toString());
-        	   od.setOverviewURL(ourl);
-           }
-           InternationalString extDesc = link.getDescription();
-           if(extDesc != null) {
-               Description description = objectFactory.createDescription();
-               od.getDescription().add(description);
-               description.setValue(extDesc.getValue());
-           }
-           return od;
-       }
+            throws JAXRException {
+        OverviewDoc od = objectFactory.createOverviewDoc();
+        String url = link.getExternalURI();
+        if (url != null) {
+            org.uddi.api_v3.OverviewURL ourl = new org.uddi.api_v3.OverviewURL();
+            ourl.setValue(url.toString());
+            od.setOverviewURL(ourl);
+        }
+        InternationalString extDesc = link.getDescription();
+        if (extDesc != null) {
+            Description description = objectFactory.createDescription();
+            od.getDescription().add(description);
+            description.setValue(extDesc.getValue());
+        }
+        return od;
+    }
 
     private static BindingTemplates getBindingTemplates(Collection serviceBindings)
-        throws JAXRException {
+            throws JAXRException {
         BindingTemplates bt = null;
-        if(serviceBindings != null && serviceBindings.size() > 0) {
+        if (serviceBindings != null && serviceBindings.size() > 0) {
             bt = objectFactory.createBindingTemplates();
             Iterator iter = serviceBindings.iterator();
             int currLoc = 0;
             BindingTemplate[] bindingTemplateArray = new BindingTemplate[serviceBindings.size()];
-            while(iter.hasNext()) {
-                ServiceBinding sb = (ServiceBinding)iter.next();
+            while (iter.hasNext()) {
+                ServiceBinding sb = (ServiceBinding) iter.next();
                 bindingTemplateArray[currLoc] = getBindingTemplateFromJAXRSB(sb);
                 currLoc++;
             }
@@ -960,6 +997,6 @@
                 bt.getBindingTemplate().addAll(Arrays.asList(bindingTemplateArray));
             }
         }
-        return bt; 
+        return bt;
     }
 }
diff --git a/src/main/java/org/apache/ws/scout/util/ScoutUddiJaxrHelper.java b/src/main/java/org/apache/ws/scout/util/ScoutUddiJaxrHelper.java
index 13e56e3..5093b25 100644
--- a/src/main/java/org/apache/ws/scout/util/ScoutUddiJaxrHelper.java
+++ b/src/main/java/org/apache/ws/scout/util/ScoutUddiJaxrHelper.java
@@ -319,7 +319,7 @@
 		PostalAddress pa = new PostalAddressImpl();
 		HashMap<String, String> hm = new HashMap<String, String>();
 		for (AddressLine anAddressLineArr : addressLineArr) {
-			hm.put(anAddressLineArr.getKeyName(), anAddressLineArr.getKeyValue());
+			hm.put(anAddressLineArr.getKeyValue(), anAddressLineArr.getValue());
 		}
 
 		if (hm.containsKey("STREET_NUMBER")) {
diff --git a/src/main/java/org/apache/ws/scout/util/ScoutUddiV3JaxrHelper.java b/src/main/java/org/apache/ws/scout/util/ScoutUddiV3JaxrHelper.java
index 2455950..f1f26d4 100644
--- a/src/main/java/org/apache/ws/scout/util/ScoutUddiV3JaxrHelper.java
+++ b/src/main/java/org/apache/ws/scout/util/ScoutUddiV3JaxrHelper.java
@@ -303,7 +303,7 @@
 		PostalAddress pa = new PostalAddressImpl();
 		HashMap<String, String> hm = new HashMap<String, String>();
 		for (AddressLine anAddressLineArr : addressLineArr) {
-			hm.put(anAddressLineArr.getKeyName(), anAddressLineArr.getValue());
+			hm.put(anAddressLineArr.getKeyValue(), anAddressLineArr.getValue());
 		}
 
 		if (hm.containsKey("STREET_NUMBER")) {
diff --git a/src/site/site.xml b/src/site/site.xml
index 704960a..8cc79c8 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -19,7 +19,8 @@
   -->
 
 <project name="Apache Scout">
-
+	
+	<version position="right"/>
     <bannerLeft>
         <name>Apache Scout</name>
         <src>images/juddi_logo_v3.png</src>
@@ -28,11 +29,27 @@
     <bannerRight>
         <src>images/scout.jpg</src>
     </bannerRight>
-    <skin>
-        <groupId>org.apache.maven.skins</groupId>
-        <artifactId>maven-default-skin</artifactId>
-        <version>1.0</version>
-    </skin>
+   <skin>
+		<groupId>org.apache.maven.skins</groupId>
+		<artifactId>maven-fluido-skin</artifactId>
+		<version>1.6</version>
+	</skin>
+	<custom>
+		<fluidoSkin>
+			<googleSearch>
+				<sitesearch/>
+			</googleSearch>
+			<sourceLineNumbersEnabled>true</sourceLineNumbersEnabled>
+			<gitHub>
+				<projectId>apache/maven-skins</projectId>
+				<ribbonOrientation>right</ribbonOrientation>
+				<ribbonColor>black</ribbonColor>
+				<projectId>apache/juddi</projectId>
+			</gitHub>
+			<topBarEnabled>true</topBarEnabled>
+			<sideBarEnabled>true</sideBarEnabled>
+		</fluidoSkin>
+	</custom>
 
     <publishDate format="dd MMM yyyy" position="right"/>
 
@@ -52,7 +69,7 @@
             <item name="Wiki" href="http://wiki.apache.org/juddi/scout"/>
         </menu>
         <menu name="Related Projects">
-            <item name="Apache jUDDI" href="http://juddi.apache.org/" description="Apache jUDDI"/>
+            <item name="Apache jUDDI" href="http://juddi.apache.org/" />
         </menu>
         <menu ref="reports"/>
 
diff --git a/src/site/xdoc/releases.xml b/src/site/xdoc/releases.xml
index b88947b..37681e4 100644
--- a/src/site/xdoc/releases.xml
+++ b/src/site/xdoc/releases.xml
@@ -16,6 +16,11 @@
           <td><strong>Date</strong></td>
           <td><strong>Description</strong></td>
         </tr>
+		<tr>
+          <td><a href="https://repository.apache.org/content/groups/public/org/apache/juddi/scout/scout/1.2.6/">scout-1.2.6</a></td>
+          <td>Nov 30, 2012</td>
+          <td>Version 1.2.7 of Scout, stable release</td>
+        </tr>
         <tr>
           <td><a href="https://repository.apache.org/content/groups/public/org/apache/juddi/scout/scout/1.2.6/">scout-1.2.6</a></td>
           <td>March 6, 2012</td>
diff --git a/src/test/java/org/apache/ws/scout/Finder.java b/src/test/java/org/apache/ws/scout/Finder.java
index 0c6802c..d2fd790 100644
--- a/src/test/java/org/apache/ws/scout/Finder.java
+++ b/src/test/java/org/apache/ws/scout/Finder.java
@@ -177,7 +177,6 @@
     {
         Collection<ServiceBinding> serviceBindings=null;
         Collection<String> findQualifiers = new ArrayList<String>();
-        findQualifiers.add(FindQualifier.SORT_BY_NAME_ASC);
         Collection<Classification> classifications = new ArrayList<Classification>();
         classifications.add(classification);
         BulkResponse bulkResponse = bqm.findServiceBindings(serviceKey,findQualifiers,classifications,null);
@@ -194,7 +193,6 @@
     {
         Collection<ServiceBinding> serviceBindings=null;
         Collection<String> findQualifiers = new ArrayList<String>();
-        findQualifiers.add(FindQualifier.SORT_BY_NAME_ASC);
         Collection<SpecificationLink> specifications = new ArrayList<SpecificationLink>();
         specifications.add(specLink);
         BulkResponse bulkResponse = bqm.findServiceBindings(serviceKey,findQualifiers,null,specifications);
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/JAXR010OrganizationTest.java b/src/test/java/org/apache/ws/scout/registry/qa/JAXR010OrganizationTest.java
index 7a762ac..0f2f78d 100644
--- a/src/test/java/org/apache/ws/scout/registry/qa/JAXR010OrganizationTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/qa/JAXR010OrganizationTest.java
@@ -16,25 +16,30 @@
  */
 package org.apache.ws.scout.registry.qa;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 
 import javax.xml.registry.BulkResponse;
+import javax.xml.registry.FindQualifier;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.JAXRResponse;
+import static javax.xml.registry.LifeCycleManager.PERSON_NAME;
 import javax.xml.registry.RegistryService;
 import javax.xml.registry.infomodel.Classification;
 import javax.xml.registry.infomodel.ClassificationScheme;
+import javax.xml.registry.infomodel.EmailAddress;
 import javax.xml.registry.infomodel.Key;
 import javax.xml.registry.infomodel.Organization;
+import javax.xml.registry.infomodel.PersonName;
+import javax.xml.registry.infomodel.PostalAddress;
 import javax.xml.registry.infomodel.Service;
 import javax.xml.registry.infomodel.ServiceBinding;
+import javax.xml.registry.infomodel.TelephoneNumber;
+import javax.xml.registry.infomodel.User;
 
 import junit.framework.JUnit4TestAdapter;
 
@@ -43,13 +48,23 @@
 import org.apache.ws.scout.Finder;
 import org.apache.ws.scout.Printer;
 import org.apache.ws.scout.Remover;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.CITY;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.COUNTRY;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.EMAIL;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.PHONE_NUMBER;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.POSTAL_CODE;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.STATE;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.STREET;
+import static org.apache.ws.scout.registry.qa.JAXR015PrimaryContactTest.STREET_NUMBER;
 import org.junit.After;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Test;
 
 /**
  * Test to check Jaxr Publish
- * Open source UDDI Browser  <http://www.uddibrowser.org>
+ * Open source UDDI Browser  http://www.uddibrowser.org or using the juddi-gui project
  * can be used to check your results
  * @author <mailto:anil@apache.org>Anil Saldhana
  * @since Nov 20, 2004
@@ -57,15 +72,42 @@
 public class JAXR010OrganizationTest extends BaseTestCase
 {
     @Before
-    public void setUp()
-    {
+    public void setUp() {
         super.setUp();
+        login();
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            ClassificationScheme cScheme = blm.createClassificationScheme("org.jboss.soa.esb.:testcategory", "JBossESB Classification Scheme");
+            ArrayList<ClassificationScheme> cSchemes = new ArrayList<ClassificationScheme>();
+            cSchemes.add(cScheme);
+            BulkResponse br = blm.saveClassificationSchemes(cSchemes);
+            assertEquals(JAXRResponse.STATUS_SUCCESS, br.getStatus());
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
     }
-    
+
     @After
-    public void tearDown()
-    {
-      super.tearDown();
+    public void tearDown() {
+        super.tearDown();
+        login();
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            Collection<String> findQualifiers = new ArrayList<String>();
+            findQualifiers.add(FindQualifier.AND_ALL_KEYS);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
+            Remover remover = new Remover(blm);
+            remover.removeClassificationScheme(cScheme);
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
     }
     
     @Test 
@@ -136,11 +178,13 @@
                 System.err.println("JAXRExceptions " +
                         "occurred during save:");
                 Collection exceptions = br.getExceptions();
-                Iterator iter = exceptions.iterator();
-                while (iter.hasNext())
-                {
-                    Exception e = (Exception) iter.next();
-                    System.err.println(e.toString());
+                if (exceptions!=null) {
+                    Iterator iter = exceptions.iterator();
+                    while (iter.hasNext())
+                    {
+                        Exception e = (Exception) iter.next();
+                        System.err.println(e.toString());
+                    }
                 }
             }
             
@@ -157,18 +201,60 @@
         login();
         try
         {
-            // Get registry service and business query manager
             RegistryService rs = connection.getRegistryService();
+            blm = rs.getBusinessLifeCycleManager();
+            bqm = rs.getBusinessQueryManager();
+            Creator creator = new Creator(blm);
+            Finder finder = new Finder(bqm, uddiversion);
+
+            Collection<Organization> orgs = new ArrayList<Organization>();
+            Organization organization = creator.createOrganization(this.getClass().getName());
+//          Add a Service
+            Service service = creator.createService(this.getClass().getName());
+            ServiceBinding serviceBinding = creator.createServiceBinding();
+            service.addServiceBinding(serviceBinding);
+            organization.addService(service);
+            
+
+            User user = blm.createUser();
+            PersonName personName = blm.createPersonName(PERSON_NAME);
+            TelephoneNumber telephoneNumber = blm.createTelephoneNumber();
+            telephoneNumber.setNumber(PHONE_NUMBER);
+            telephoneNumber.setType(null);
+            PostalAddress address = blm.createPostalAddress(STREET_NUMBER,
+                    STREET, CITY, STATE, COUNTRY, POSTAL_CODE, "");
+
+            Collection<PostalAddress> postalAddresses = new ArrayList<PostalAddress>();
+            postalAddresses.add(address);
+            Collection<EmailAddress> emailAddresses = new ArrayList<EmailAddress>();
+            EmailAddress emailAddress = blm.createEmailAddress(EMAIL);
+            emailAddresses.add(emailAddress);
+
+            Collection<TelephoneNumber> numbers = new ArrayList<TelephoneNumber>();
+            numbers.add(telephoneNumber);
+            user.setPersonName(personName);
+            user.setPostalAddresses(postalAddresses);
+            user.setEmailAddresses(emailAddresses);
+            user.setTelephoneNumbers(numbers);
+            organization.setPrimaryContact(user);
+
+            orgs.add(organization);
+
+            //Now save the Organization along with a Service, ServiceBinding and Classification
+            BulkResponse br = blm.saveOrganizations(orgs);
+            
+            // Get registry service and business query manager
+             rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             System.out.println("We have the Business Query Manager");
             Printer printer = new Printer();
-            Finder finder = new Finder(bqm, uddiversion);
+             finder = new Finder(bqm, uddiversion);
 
-            Collection orgs = finder.findOrganizationsByName(this.getClass().getName());
+             orgs = finder.findOrganizationsByName(this.getClass().getName());
             if (orgs == null) {
                 fail("Only Expecting 1 Organization");
             } else {
-                assertEquals(1,orgs.size());
+                assertTrue(orgs.size()>=1);
                 // then step through them
                 for (Iterator orgIter = orgs.iterator(); orgIter.hasNext();)
                 {
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/JAXR015PrimaryContactTest.java b/src/test/java/org/apache/ws/scout/registry/qa/JAXR015PrimaryContactTest.java
index 6fc7668..d0fd0e6 100644
--- a/src/test/java/org/apache/ws/scout/registry/qa/JAXR015PrimaryContactTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/qa/JAXR015PrimaryContactTest.java
@@ -26,6 +26,7 @@
 import java.util.Iterator;
 
 import javax.xml.registry.BulkResponse;
+import javax.xml.registry.FindQualifier;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.JAXRResponse;
 import javax.xml.registry.RegistryService;
@@ -49,76 +50,101 @@
 import org.apache.ws.scout.Printer;
 import org.apache.ws.scout.Remover;
 import org.junit.After;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Test;
 
 /**
  * Test to check that the primary contact is added
+ *
  * @author <a href="mailto:tcunning@redhat.com">Tom Cunningham</a>
  * @since Dec 6, 2007
  */
-public class JAXR015PrimaryContactTest extends BaseTestCase
-{
-	private static final String PERSON_NAME = "John AXel Rose";
-	private static final String PHONE_NUMBER = "111-222-3333";
-	private static final String STREET_NUMBER = "1";
-	private static final String STREET = "Uddi Drive";
-	private static final String CITY = "Apache Town";
-	private static final String STATE = "CA";
-	private static final String COUNTRY = "USA";
-	private static final String POSTAL_CODE = "00000-1111";
+public class JAXR015PrimaryContactTest extends BaseTestCase {
 
-	private static final String EMAIL = "jaxr@apache.org";
+    public static final String PERSON_NAME = "John AXel Rose";
+    public static final String PHONE_NUMBER = "111-222-3333";
+    public static final String STREET_NUMBER = "1";
+    public static final String STREET = "Uddi Drive";
+    public static final String CITY = "Apache Town";
+    public static final String STATE = "CA";
+    public static final String COUNTRY = "USA";
+    public static final String POSTAL_CODE = "00000-1111";
+
+    public static final String EMAIL = "jaxr@apache.org";
 
     @Before
-    public void setUp()
-    {
+    public void setUp() {
         super.setUp();
-    }
-    
-    @After
-    public void tearDown()
-    {
-      super.tearDown();
-    }
-    
-    @Test 
-    public void publishClassificationScheme()
-    {
         login();
-        try
-        {
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            ClassificationScheme cScheme = blm.createClassificationScheme("org.jboss.soa.esb.:testcategory", "JBossESB Classification Scheme");
+            ArrayList<ClassificationScheme> cSchemes = new ArrayList<ClassificationScheme>();
+            cSchemes.add(cScheme);
+            BulkResponse br = blm.saveClassificationSchemes(cSchemes);
+            assertEquals(JAXRResponse.STATUS_SUCCESS, br.getStatus());
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
+    }
+
+    @After
+    public void tearDown() {
+        super.tearDown();
+        login();
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            Collection<String> findQualifiers = new ArrayList<String>();
+            findQualifiers.add(FindQualifier.AND_ALL_KEYS);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
+            Remover remover = new Remover(blm);
+            remover.removeClassificationScheme(cScheme);
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
+    }
+
+    @Test
+    public void publishClassificationScheme() {
+        login();
+        try {
             RegistryService rs = connection.getRegistryService();
             blm = rs.getBusinessLifeCycleManager();
             Creator creator = new Creator(blm);
-            
+
             Collection<ClassificationScheme> schemes = new ArrayList<ClassificationScheme>();
             ClassificationScheme classificationScheme = creator.createClassificationScheme(this.getClass().getName());
             schemes.add(classificationScheme);
-            
+
             BulkResponse bulkResponse = blm.saveClassificationSchemes(schemes);
-            assertEquals(JAXRResponse.STATUS_SUCCESS,bulkResponse.getStatus());
-            
-            
+            assertEquals(JAXRResponse.STATUS_SUCCESS, bulkResponse.getStatus());
+
         } catch (JAXRException e) {
             e.printStackTrace();
             assertTrue(false);
-        }   
+        }
     }
-    
+
     @Test
-    public void publishOrganization()
-    {
+    public void publishOrganization() {
         BulkResponse response = null;
         login();
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             blm = rs.getBusinessLifeCycleManager();
             bqm = rs.getBusinessQueryManager();
             Creator creator = new Creator(blm);
             Finder finder = new Finder(bqm, uddiversion);
-            
+
             Collection<Organization> orgs = new ArrayList<Organization>();
             Organization organization = creator.createOrganization(this.getClass().getName());
 //          Add a Service
@@ -130,14 +156,14 @@
             ClassificationScheme cs = finder.findClassificationSchemeByName(this.getClass().getName());
             Classification classification = creator.createClassification(cs);
             organization.addClassification(classification);
-            
+
             User user = blm.createUser();
             PersonName personName = blm.createPersonName(PERSON_NAME);
             TelephoneNumber telephoneNumber = blm.createTelephoneNumber();
             telephoneNumber.setNumber(PHONE_NUMBER);
             telephoneNumber.setType(null);
             PostalAddress address = blm.createPostalAddress(STREET_NUMBER,
-                STREET, CITY, STATE, COUNTRY, POSTAL_CODE, "");
+                    STREET, CITY, STATE, COUNTRY, POSTAL_CODE, "");
 
             Collection<PostalAddress> postalAddresses = new ArrayList<PostalAddress>();
             postalAddresses.add(address);
@@ -153,99 +179,136 @@
             user.setTelephoneNumbers(numbers);
             organization.setPrimaryContact(user);
 
-            orgs.add(organization);            
-            
+            orgs.add(organization);
+
             //Now save the Organization along with a Service, ServiceBinding and Classification
             BulkResponse br = blm.saveOrganizations(orgs);
-            if (br.getStatus() == JAXRResponse.STATUS_SUCCESS)
-            {
+            if (br.getStatus() == JAXRResponse.STATUS_SUCCESS) {
                 System.out.println("Organization Saved");
                 Collection coll = br.getCollection();
                 Iterator iter = coll.iterator();
-                while (iter.hasNext())
-                {
+                while (iter.hasNext()) {
                     Key key = (Key) iter.next();
                     System.out.println("Saved Key=" + key.getId());
                 }//end while
-            } else
-            {
-                System.err.println("JAXRExceptions " +
-                        "occurred during save:");
+            } else {
+                System.err.println("JAXRExceptions "
+                        + "occurred during save:");
                 Collection exceptions = br.getExceptions();
-                Iterator iter = exceptions.iterator();
-                while (iter.hasNext())
-                {
-                    Exception e = (Exception) iter.next();
-                    System.err.println(e.toString());
+                if (exceptions != null) {
+                    Iterator iter = exceptions.iterator();
+                    while (iter.hasNext()) {
+                        Exception e = (Exception) iter.next();
+                        System.err.println(e.toString());
+                    }
                 }
             }
-            
+
         } catch (JAXRException e) {
             e.printStackTrace();
-			assertTrue(false);
+            fail(e.getMessage());
         }
         assertNull(response);
     }
-    
+
     @SuppressWarnings("unchecked")
     @Test
-    public void queryOrganization()
-    {
+    public void queryOrganization() {
         login();
-        try
-        {
-            // Get registry service and business query manager
+        try {
+            
             RegistryService rs = connection.getRegistryService();
+            blm = rs.getBusinessLifeCycleManager();
+            bqm = rs.getBusinessQueryManager();
+            Creator creator = new Creator(blm);
+            Finder finder = new Finder(bqm, uddiversion);
+
+            Collection<Organization> orgs = new ArrayList<Organization>();
+            Organization organization = creator.createOrganization(this.getClass().getName());
+//          Add a Service
+            Service service = creator.createService(this.getClass().getName());
+            ServiceBinding serviceBinding = creator.createServiceBinding();
+            service.addServiceBinding(serviceBinding);
+            organization.addService(service);
+            
+
+            User user = blm.createUser();
+            PersonName personName = blm.createPersonName(PERSON_NAME);
+            TelephoneNumber telephoneNumber = blm.createTelephoneNumber();
+            telephoneNumber.setNumber(PHONE_NUMBER);
+            telephoneNumber.setType(null);
+            PostalAddress address = blm.createPostalAddress(STREET_NUMBER,
+                    STREET, CITY, STATE, COUNTRY, POSTAL_CODE, "");
+
+            Collection<PostalAddress> postalAddresses = new ArrayList<PostalAddress>();
+            postalAddresses.add(address);
+            Collection<EmailAddress> emailAddresses = new ArrayList<EmailAddress>();
+            EmailAddress emailAddress = blm.createEmailAddress(EMAIL);
+            emailAddresses.add(emailAddress);
+
+            Collection<TelephoneNumber> numbers = new ArrayList<TelephoneNumber>();
+            numbers.add(telephoneNumber);
+            user.setPersonName(personName);
+            user.setPostalAddresses(postalAddresses);
+            user.setEmailAddresses(emailAddresses);
+            user.setTelephoneNumbers(numbers);
+            organization.setPrimaryContact(user);
+
+            orgs.add(organization);
+
+            //Now save the Organization along with a Service, ServiceBinding and Classification
+            BulkResponse br = blm.saveOrganizations(orgs);
+            
+            
             bqm = rs.getBusinessQueryManager();
             System.out.println("We have the Business Query Manager");
             Printer printer = new Printer();
-            Finder finder = new Finder(bqm, uddiversion);
+            finder = new Finder(bqm, uddiversion);
 
-            Collection orgs = finder.findOrganizationsByName(this.getClass().getName());
+            orgs = finder.findOrganizationsByName(this.getClass().getName());
             if (orgs == null) {
                 fail("Only Expecting 1 Organization");
             } else {
-                assertEquals(1,orgs.size());
+                assertTrue(orgs.size() >= 1);
                 // then step through them
-                for (Iterator orgIter = orgs.iterator(); orgIter.hasNext();)
-                {
+                for (Iterator orgIter = orgs.iterator(); orgIter.hasNext();) {
                     Organization org = (Organization) orgIter.next();
                     System.out.println("Org name: " + printer.getName(org));
                     System.out.println("Org description: " + printer.getDescription(org));
                     System.out.println("Org key id: " + printer.getKey(org));
 
-                    User user = org.getPrimaryContact();
+                    user = org.getPrimaryContact();
                     System.out.println("Primary Contact Full Name : " + user.getPersonName().getFullName());
-					assertEquals("User name does not match", user.getPersonName().getFullName(), PERSON_NAME);
-					
-                    Collection<EmailAddress> emailAddresses = user.getEmailAddresses();
-					System.out.println("Found " + emailAddresses.size() + " email addresses.");
+                    assertEquals("User name does not match", user.getPersonName().getFullName(), PERSON_NAME);
+
+                    emailAddresses = user.getEmailAddresses();
+                    System.out.println("Found " + emailAddresses.size() + " email addresses.");
                     assertEquals("Should have found 1 email address, found " + emailAddresses.size(), 1, emailAddresses.size());
-					for (EmailAddress email : emailAddresses) {
-                    	System.out.println("Primary Contact email : " + email.getAddress());
-						assertEquals("Email should be " + EMAIL, EMAIL, email.getAddress());
+                    for (EmailAddress email : emailAddresses) {
+                        System.out.println("Primary Contact email : " + email.getAddress());
+                        assertEquals("Email should be " + EMAIL, EMAIL, email.getAddress());
                     }
-					
-                    Collection<PostalAddress> postalAddresses = user.getPostalAddresses();
-					System.out.println("Found " + postalAddresses.size() + " postal addresses.");
+
+                    postalAddresses = user.getPostalAddresses();
+                    System.out.println("Found " + postalAddresses.size() + " postal addresses.");
                     assertEquals("Should have found 1 postal address, found " + postalAddresses.size(), 1, postalAddresses.size());
-					for (PostalAddress postalAddress : postalAddresses) {
-						System.out.println("Postal Address is " + postalAddress);
-						assertEquals("Street number should be " + STREET_NUMBER, STREET_NUMBER, postalAddress.getStreetNumber());
-						assertEquals("Street should be " + STREET, STREET, postalAddress.getStreet());
-						assertEquals("City should be " + CITY, CITY, postalAddress.getCity());
-						assertEquals("State should be " + STATE, STATE, postalAddress.getStateOrProvince());
-						assertEquals("Country should be " + COUNTRY, COUNTRY, postalAddress.getCountry());
-						assertEquals("Postal code should be " + POSTAL_CODE, POSTAL_CODE, postalAddress.getPostalCode());
+                    for (PostalAddress postalAddress : postalAddresses) {
+                        System.out.println("Postal Address is " + postalAddress);
+                        assertEquals("Street number should be " + STREET_NUMBER, STREET_NUMBER, postalAddress.getStreetNumber());
+                        assertEquals("Street should be " + STREET, STREET, postalAddress.getStreet());
+                        assertEquals("City should be " + CITY, CITY, postalAddress.getCity());
+                        assertEquals("State should be " + STATE, STATE, postalAddress.getStateOrProvince());
+                        assertEquals("Country should be " + COUNTRY, COUNTRY, postalAddress.getCountry());
+                        assertEquals("Postal code should be " + POSTAL_CODE, POSTAL_CODE, postalAddress.getPostalCode());
                     }
-					
-					Collection<TelephoneNumber> numbers = user.getTelephoneNumbers(null);
-					System.out.println("Found " + numbers.size() + " telephone numbers.");
+
+                    numbers = user.getTelephoneNumbers(null);
+                    System.out.println("Found " + numbers.size() + " telephone numbers.");
                     assertEquals("Should have found 1 phone number, found " + numbers.size(), 1, numbers.size());
-					for (TelephoneNumber tele : numbers) {
-						System.out.println("Phone number is " + tele.getNumber());
-						assertEquals("Telephone number should be " + PHONE_NUMBER, PHONE_NUMBER, tele.getNumber());
-					}
+                    for (TelephoneNumber tele : numbers) {
+                        System.out.println("Phone number is " + tele.getNumber());
+                        assertEquals("Telephone number should be " + PHONE_NUMBER, PHONE_NUMBER, tele.getNumber());
+                    }
                     printer.printServices(org);
                     printer.printClassifications(org);
                 }
@@ -253,38 +316,34 @@
         } catch (JAXRException e) {
             e.printStackTrace();
             fail(e.getMessage());
-        } 
+        }
     }
-    
+
     @Test
-    public void deleteOrganization()
-    {
+    public void deleteOrganization() {
         login();
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             blm = rs.getBusinessLifeCycleManager();
-    //      Get registry service and business query manager
+            //      Get registry service and business query manager
             bqm = rs.getBusinessQueryManager();
             System.out.println("We have the Business Query Manager");
             Finder finder = new Finder(bqm, uddiversion);
             Remover remover = new Remover(blm);
             Collection orgs = finder.findOrganizationsByName(this.getClass().getName());
-            for (Iterator orgIter = orgs.iterator(); orgIter.hasNext();)
-            {
+            for (Iterator orgIter = orgs.iterator(); orgIter.hasNext();) {
                 Organization org = (Organization) orgIter.next();
                 remover.removeOrganization(org);
             }
-            
+
         } catch (Exception e) {
             e.printStackTrace();
             fail(e.getMessage());
         }
     }
-    
+
     @Test
-    public void deleteClassificationScheme()
-    {
+    public void deleteClassificationScheme() {
         login();
         try {
             RegistryService rs = connection.getRegistryService();
@@ -294,18 +353,17 @@
             Finder finder = new Finder(bqm, uddiversion);
             Remover remover = new Remover(blm);
             Collection schemes = finder.findClassificationSchemesByName(this.getClass().getName());
-            for (Iterator iter = schemes.iterator(); iter.hasNext();)
-            {
+            for (Iterator iter = schemes.iterator(); iter.hasNext();) {
                 ClassificationScheme scheme = (ClassificationScheme) iter.next();
                 remover.removeClassificationScheme(scheme);
             }
-            
+
         } catch (Exception e) {
             e.printStackTrace();
             fail(e.getMessage());
         }
     }
-    
+
     public static junit.framework.Test suite() {
         return new JUnit4TestAdapter(JAXR015PrimaryContactTest.class);
     }
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/JAXR030AssociationsTest.java b/src/test/java/org/apache/ws/scout/registry/qa/JAXR030AssociationsTest.java
index 848e060..73fa58c 100644
--- a/src/test/java/org/apache/ws/scout/registry/qa/JAXR030AssociationsTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/qa/JAXR030AssociationsTest.java
@@ -40,6 +40,7 @@
 import org.apache.ws.scout.BaseTestCase;
 import org.apache.ws.scout.Creator;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -117,6 +118,7 @@
            
 			System.out.println("\nSearching for newly created organizations...\n");
 			ArrayList<Organization> newOrgs = findTempOrgs();
+                        Assert.assertEquals(2, newOrgs.size());
 			sOrg = newOrgs.get(0);
 			tOrg = newOrgs.get(1);
 
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/JAXR050ServiceBindingTest.java b/src/test/java/org/apache/ws/scout/registry/qa/JAXR050ServiceBindingTest.java
index 0a173a2..44a56c1 100644
--- a/src/test/java/org/apache/ws/scout/registry/qa/JAXR050ServiceBindingTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/qa/JAXR050ServiceBindingTest.java
@@ -24,9 +24,11 @@
 
 import javax.xml.registry.BulkResponse;
 import javax.xml.registry.BusinessLifeCycleManager;
+import javax.xml.registry.FindQualifier;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.JAXRResponse;
 import javax.xml.registry.RegistryService;
+import javax.xml.registry.infomodel.ClassificationScheme;
 import javax.xml.registry.infomodel.Concept;
 import javax.xml.registry.infomodel.ExternalLink;
 import javax.xml.registry.infomodel.InternationalString;
@@ -40,7 +42,10 @@
 
 import org.apache.ws.scout.BaseTestCase;
 import org.apache.ws.scout.Finder;
+import org.apache.ws.scout.Remover;
 import org.junit.After;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -67,14 +72,42 @@
 	String tempOrgName = "Apache JAXR Service Org -- APACHE SCOUT TEST";
 
     @Before
-    public void setUp()
-    {
-       super.setUp();
+    public void setUp() {
+        super.setUp();
+        login();
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            ClassificationScheme cScheme = blm.createClassificationScheme("org.jboss.soa.esb.:testcategory", "JBossESB Classification Scheme");
+            ArrayList<ClassificationScheme> cSchemes = new ArrayList<ClassificationScheme>();
+            cSchemes.add(cScheme);
+            BulkResponse br = blm.saveClassificationSchemes(cSchemes);
+            assertEquals(JAXRResponse.STATUS_SUCCESS, br.getStatus());
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
     }
+
     @After
-    public void tearDown()
-    {
+    public void tearDown() {
         super.tearDown();
+        login();
+        try {
+            RegistryService rs = connection.getRegistryService();
+            bqm = rs.getBusinessQueryManager();
+            blm = rs.getBusinessLifeCycleManager();
+            Collection<String> findQualifiers = new ArrayList<String>();
+            findQualifiers.add(FindQualifier.AND_ALL_KEYS);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
+            Remover remover = new Remover(blm);
+            remover.removeClassificationScheme(cScheme);
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
     }
 
 	/**
@@ -109,13 +142,13 @@
                        
             
             SpecificationLink specLink = blm.createSpecificationLink();            
-            Concept concept = null;
+            /*Concept concept = null;
             if ("3.0".equals(uddiversion)) {
             	concept = (Concept)bqm.getRegistryObject("uddi:uddi.org:findqualifier:orlikekeys", BusinessLifeCycleManager.CONCEPT);
             } else {
             	concept = (Concept)bqm.getRegistryObject("uuid:AD61DE98-4DB8-31B2-A299-A2373DC97212",BusinessLifeCycleManager.CONCEPT);
             }
-            specLink.setSpecificationObject(concept);
+            specLink.setSpecificationObject(concept);*/
             
             //find serviceBinding
             Collection<ServiceBinding> serviceBindings2 = finder.findServiceBindings(tmpSvcKey, specLink);
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/JAXR060RegistryTest.java b/src/test/java/org/apache/ws/scout/registry/qa/JAXR060RegistryTest.java
index b78199b..1366ca8 100644
--- a/src/test/java/org/apache/ws/scout/registry/qa/JAXR060RegistryTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/qa/JAXR060RegistryTest.java
@@ -18,7 +18,7 @@
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
+ */
 package org.apache.ws.scout.registry.qa;
 
 import static org.junit.Assert.assertEquals;
@@ -53,18 +53,17 @@
 
 /**
  * Testing the registry.
- * 
+ *
  * @author kstam
  *
  */
-public class JAXR060RegistryTest extends BaseTestCase
-{
+public class JAXR060RegistryTest extends BaseTestCase {
+
     @Before
     public void setUp() {
         super.setUp();
         login();
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             blm = rs.getBusinessLifeCycleManager();
@@ -73,7 +72,8 @@
             cSchemes.add(cScheme);
             BulkResponse br = blm.saveClassificationSchemes(cSchemes);
             assertEquals(JAXRResponse.STATUS_SUCCESS, br.getStatus());
-        } catch (JAXRException je) {
+        } catch (Exception je) {
+            je.printStackTrace();
             fail(je.getMessage());
         }
     }
@@ -88,74 +88,72 @@
             blm = rs.getBusinessLifeCycleManager();
             Collection<String> findQualifiers = new ArrayList<String>();
             findQualifiers.add(FindQualifier.AND_ALL_KEYS);
-            findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
             ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
             Remover remover = new Remover(blm);
             remover.removeClassificationScheme(cScheme);
-        } catch (JAXRException je) {
+        } catch (Exception je) {
+            je.printStackTrace();
             fail(je.getMessage());
         }
     }
-   
-	/**
-	 * Tests the successful creation of the RED HAT/JBossESB Organization.
-	 */
-	@SuppressWarnings("unchecked")
+
+    /**
+     * Tests the successful creation of the RED HAT/JBossESB Organization.
+     */
+    @SuppressWarnings("unchecked")
     @Test
-	public void publishCheckAndDelete() 
-	{
+    public void publishCheckAndDelete() {
         login();
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             blm = rs.getBusinessLifeCycleManager();
             Creator creator = new Creator(blm);
-            
+
             Collection<Organization> organizations = new ArrayList<Organization>();
             Organization organization = creator.createOrganization("Red Hat/JBossESB");
             organizations.add(organization);
             BulkResponse br = blm.saveOrganizations(organizations);
-			assertEquals(BulkResponse.STATUS_SUCCESS, br.getStatus());
-		} catch (JAXRException je) {
-			je.printStackTrace();
-			assertTrue(false);
-		}
-	    //find organization
-        try
-        {
+            assertEquals(BulkResponse.STATUS_SUCCESS, br.getStatus());
+        } catch (JAXRException je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
+        //find organization
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             Finder finder = new Finder(bqm, uddiversion);
-			Collection<Organization> orgs = finder.findOrganizationsByName("Red Hat/JBossESB");
-			Organization org = orgs.iterator().next();
-			assertEquals("Red Hat/JBossESB", org.getName().getValue());
-		} catch (JAXRException je) {
-			fail(je.getMessage());
-		}
-		try {
+            Collection<Organization> orgs = finder.findOrganizationsByName("Red Hat/JBossESB");
+            Organization org = orgs.iterator().next();
+            assertEquals("Red Hat/JBossESB", org.getName().getValue());
+        } catch (JAXRException je) {
+            fail(je.getMessage());
+        }
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             Finder finder = new Finder(bqm, uddiversion);
             Collection<Organization> orgs = finder.findOrganizationsByName("Not Existing Org");
-			assertEquals(0, orgs.size());
-		} catch (JAXRException je) {
-			fail(je.getMessage());
-		}
+            assertEquals(0, orgs.size());
+        } catch (JAXRException je) {
+            fail(je.getMessage());
+        }
         //Publish a service
-		try {
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             Finder finder = new Finder(bqm, uddiversion);
             Collection<Organization> orgs = finder.findOrganizationsByName("Red Hat/JBossESB");
             Organization organization = orgs.iterator().next();
-            
+
             blm = rs.getBusinessLifeCycleManager();
             //Adding the category as prefix for the name
             Service service = blm.createService(blm.createInternationalString("Registry Test ServiceName"));
             service.setDescription(blm.createInternationalString("Registry Test Service Description"));
             Collection<String> findQualifiers = new ArrayList<String>();
             findQualifiers.add(FindQualifier.AND_ALL_KEYS);
-            findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
             ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
             Classification classification = blm.createClassification(cScheme, "category", "registry");
             service.addClassification(classification);
@@ -164,18 +162,18 @@
             services.add(service);
             BulkResponse br = blm.saveServices(services);
             assertEquals(BulkResponse.STATUS_SUCCESS, br.getStatus());
-		} catch (JAXRException je) {
-			fail(je.getMessage());
-		}
-	    //find Service
-        try
-        {
+        } catch (JAXRException je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
+        //find Service
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             blm = rs.getBusinessLifeCycleManager();
             Finder finder = new Finder(bqm, uddiversion);
             //Find the service
-            Service service = finder.findService("registry","Registry Test ServiceName", blm);
+            Service service = finder.findService("registry", "Registry Test ServiceName", blm);
             assertEquals("Registry Test ServiceName", service.getName().getValue());
         } catch (JAXRException je) {
             fail(je.getMessage());
@@ -187,89 +185,93 @@
             blm = rs.getBusinessLifeCycleManager();
             Finder finder = new Finder(bqm, uddiversion);
             //Find the service
-            Service service = finder.findService("registry","Registry Test ServiceName", blm);
-            
+            Service service = finder.findService("registry", "Registry Test ServiceName", blm);
+
             ServiceBinding serviceBinding = blm.createServiceBinding();
             serviceBinding.setDescription(blm.createInternationalString("eprDescription"));
             String xml = "<epr>epr uri</epr>";
             serviceBinding.setAccessURI(xml);
-        
+
             ArrayList<ServiceBinding> serviceBindings = new ArrayList<ServiceBinding>();
             serviceBindings.add(serviceBinding);
             service.addServiceBindings(serviceBindings);
             Collection<String> findQualifiers = new ArrayList<String>();
             findQualifiers.add(FindQualifier.AND_ALL_KEYS);
-            findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
+            //findQualifiers.add(FindQualifier.SORT_BY_NAME_DESC);
             ClassificationScheme cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
             Classification classification = blm.createClassification(cScheme, "category", "registry");
             service.addClassification(classification);
-           
-            BulkResponse br  = blm.saveServiceBindings(serviceBindings);
+
+            BulkResponse br = blm.saveServiceBindings(serviceBindings);
             assertEquals(BulkResponse.STATUS_SUCCESS, br.getStatus());
-            BulkResponse br2  = blm.saveServiceBindings(serviceBindings); //Save one more
+            BulkResponse br2 = blm.saveServiceBindings(serviceBindings); //Save one more
             assertEquals(BulkResponse.STATUS_SUCCESS, br2.getStatus());
-           
+
+            findQualifiers = new ArrayList<String>();
+            findQualifiers.add(FindQualifier.AND_ALL_KEYS);
+            
+            cScheme = bqm.findClassificationSchemeByName(findQualifiers, "org.jboss.soa.esb.:testcategory");
             //Delete one binding            
-            Collection<ServiceBinding> serviceBindings2 = finder.findServiceBindings(service.getKey(),classification);
-            if ((serviceBindings2 != null) && (serviceBindings2.iterator() != null) 
-            		&& (serviceBindings2.iterator().hasNext())) {
-            	ServiceBinding serviceBinding2 = serviceBindings2.iterator().next();
-            	Remover remover = new Remover(blm);
-            	remover.removeServiceBinding(serviceBinding2);
+            Collection<ServiceBinding> serviceBindings2 = finder.findServiceBindings(service.getKey(), classification);
+            if ((serviceBindings2 != null) && (serviceBindings2.iterator() != null)
+                    && (serviceBindings2.iterator().hasNext())) {
+                ServiceBinding serviceBinding2 = serviceBindings2.iterator().next();
+                Remover remover = new Remover(blm);
+                remover.removeServiceBinding(serviceBinding2);
             }
-		} catch (JAXRException re) {
-			fail(re.getMessage());
-		}
+        } catch (JAXRException re) {
+            re.printStackTrace();
+            fail(re.getMessage());
+        }
         //find all services for this organization
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             Finder finder = new Finder(bqm, uddiversion);
-			Collection<Organization> orgs = finder.findOrganizationsByName("Red Hat/JBossESB");
+            Collection<Organization> orgs = finder.findOrganizationsByName("Red Hat/JBossESB");
             Organization org = orgs.iterator().next();
-			//Listing out the services and their Bindings
-			System.out.println("-------------------------------------------------");
+            //Listing out the services and their Bindings
+            System.out.println("-------------------------------------------------");
             System.out.println("Organization name: " + org.getName().getValue());
             System.out.println("Description: " + org.getDescription().getValue());
             System.out.println("Key id: " + org.getKey().getId());
-			User primaryContact = org.getPrimaryContact();
+            User primaryContact = org.getPrimaryContact();
             System.out.println("Primary Contact: " + primaryContact.getPersonName().getFullName());
-			Collection services = org.getServices();
-			for (Iterator serviceIter = services.iterator();serviceIter.hasNext();) {
-				Service service = (Service) serviceIter.next();
+            Collection services = org.getServices();
+            for (Iterator serviceIter = services.iterator(); serviceIter.hasNext();) {
+                Service service = (Service) serviceIter.next();
                 System.out.println("- Service Name: " + service.getName().getValue());
                 System.out.println("  Service Key : " + service.getKey().getId());
-				Collection serviceBindings = service.getServiceBindings();
-				for (Iterator serviceBindingIter = serviceBindings.iterator();serviceBindingIter.hasNext();){
-					ServiceBinding serviceBinding = (ServiceBinding) serviceBindingIter.next();
+                Collection serviceBindings = service.getServiceBindings();
+                for (Iterator serviceBindingIter = serviceBindings.iterator(); serviceBindingIter.hasNext();) {
+                    ServiceBinding serviceBinding = (ServiceBinding) serviceBindingIter.next();
                     System.out.println("  ServiceBinding Description: " + serviceBinding.getDescription().getValue());
-					String xml = serviceBinding.getAccessURI();
+                    String xml = serviceBinding.getAccessURI();
                     System.out.println("  ServiceBinding URI: " + xml);
-					assertEquals("<epr>epr uri</epr>",xml);
-				}
-			}
+                    assertEquals("<epr>epr uri</epr>", xml);
+                }
+            }
             System.out.println("-------------------------------------------------");
-	    } catch (Exception je) {
-	    	fail(je.getMessage());
-		}
+        } catch (Exception je) {
+            je.printStackTrace();
+            fail(je.getMessage());
+        }
         //delete the service
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             blm = rs.getBusinessLifeCycleManager();
             Finder finder = new Finder(bqm, uddiversion);
             //Find the service
-            Service service = finder.findService("registry","Registry Test ServiceName", blm);
+            Service service = finder.findService("registry", "Registry Test ServiceName", blm);
             Remover remover = new Remover(blm);
             remover.removeService(service);
         } catch (JAXRException je) {
+            je.printStackTrace();
             fail(je.getMessage());
         }
         //delete the organization
-        try
-        {
+        try {
             RegistryService rs = connection.getRegistryService();
             bqm = rs.getBusinessQueryManager();
             blm = rs.getBusinessLifeCycleManager();
@@ -279,14 +281,13 @@
             Remover remover = new Remover(blm);
             remover.removeOrganization(org);
         } catch (JAXRException je) {
+            je.printStackTrace();
             fail(je.getMessage());
         }
     }
-    
-  
 
-	public static junit.framework.Test suite() {
-		return new JUnit4TestAdapter(JAXR060RegistryTest.class);
-	}
+    public static junit.framework.Test suite() {
+        return new JUnit4TestAdapter(JAXR060RegistryTest.class);
+    }
 
 }
diff --git a/src/test/resources/META-INF/jaxr-uddi.xml b/src/test/resources/META-INF/jaxr-uddi.xml
index 79c4201..691f239 100644
--- a/src/test/resources/META-INF/jaxr-uddi.xml
+++ b/src/test/resources/META-INF/jaxr-uddi.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <uddi>
   <reloadDelay>5000</reloadDelay>
-  <manager name="jaxr">
+  <client name="jaxr">
     <nodes>
       <node isHomeJUDDI="true">
       <name>jaxr-client</name>
@@ -12,5 +12,5 @@
       <securityUrl>${javax.xml.registry.securityManagerURL}</securityUrl>
     </node>
     </nodes>
-  </manager>
+  </client>
 </uddi>
\ No newline at end of file
