diff --git a/pom.xml b/pom.xml
index 0e13aa1..8a1dd16 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
 	</parent>
 	<groupId>org.apache.juddi.scout</groupId>
 	<artifactId>scout</artifactId>
-	<version>1.2.6-SNAPSHOT</version>
+	<version>1.2.5-SNAPSHOT</version>
 	<packaging>bundle</packaging>
 
 	<properties>
diff --git a/src/main/java/org/apache/ws/scout/registry/ConnectionFactoryImpl.java b/src/main/java/org/apache/ws/scout/registry/ConnectionFactoryImpl.java
index 07c4a21..93036f4 100644
--- a/src/main/java/org/apache/ws/scout/registry/ConnectionFactoryImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/ConnectionFactoryImpl.java
@@ -23,6 +23,7 @@
 import javax.xml.registry.Connection;
 import javax.xml.registry.ConnectionFactory;
 import javax.xml.registry.FederatedConnection;
+import javax.xml.registry.InvalidRequestException;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.UnsupportedCapabilityException;
 
@@ -63,6 +64,9 @@
 
     public Connection createConnection() throws JAXRException
     {
+        //The JAXR spec requires the queryManagerURL to be defined
+        String queryManagerURL = properties.getProperty(QUERYMANAGER_PROPERTY);
+        if (queryManagerURL==null) throw new InvalidRequestException("Missing required property " + QUERYMANAGER_PROPERTY);
         return new ConnectionImpl(properties);
     }
 
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 29c1c68..5cd0fca 100644
--- a/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/ConnectionImpl.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 
 import javax.xml.registry.Connection;
+import javax.xml.registry.InvalidRequestException;
 import javax.xml.registry.JAXRException;
 import javax.xml.registry.RegistryService;
 
@@ -53,7 +54,7 @@
     private String uddiVersion;
     UDDIClerkManager manager = null;
 
-    public ConnectionImpl(Properties properties)
+    public ConnectionImpl(Properties properties) throws InvalidRequestException
     {
         postalScheme = properties.getProperty(ConnectionFactoryImpl.POSTALADDRESSSCHEME_PROPERTY);
         String val = properties.getProperty(ConnectionFactoryImpl.MAXROWS_PROPERTY);
diff --git a/src/main/java/org/apache/ws/scout/registry/RegistryImpl.java b/src/main/java/org/apache/ws/scout/registry/RegistryImpl.java
index 7d8397c..cfa017b 100644
--- a/src/main/java/org/apache/ws/scout/registry/RegistryImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/RegistryImpl.java
@@ -34,6 +34,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.registry.InvalidRequestException;
 import javax.xml.transform.stream.StreamSource;
 
 import org.apache.commons.logging.Log;
@@ -105,8 +106,6 @@
 
 public class RegistryImpl implements IRegistry {
 
-	public static final String DEFAULT_INQUIRY_ENDPOINT        = "http://localhost:8080/juddi/inquiry";
-	public static final String DEFAULT_PUBLISH_ENDPOINT        = "http://localhost:8080/juddi/publish";
 	public static final String DEFAULT_ADMIN_ENDPOINT          = "http://localhost:8080/juddi/admin";
 	public static final String DEFAULT_TRANSPORT_CLASS         = "org.apache.ws.scout.transport.SaajTransport";
 	public static final String DEFAULT_SECURITY_PROVIDER       = "com.sun.net.ssl.internal.ssl.Provider";
@@ -135,26 +134,32 @@
 
 	/**
 	 * Creates a new instance of RegistryImpl.
+	 * @throws InvalidRequestException 
 	 */
-	public RegistryImpl(Properties props) {
+	public RegistryImpl(Properties props) throws InvalidRequestException {
 		super();
 
 		this.init(props);
 	}
 
 	/**
+	 * @throws InvalidRequestException 
 	 * 
 	 */
-	private void init(Properties props) {
+	private void init(Properties props) throws InvalidRequestException {
 		// We need to have a non-null Properties
 		// instance so initialization takes place.
 		if (props == null) props = new Properties();
 
 		// Override defaults with specific specific values
 		try {
-			setInquiryURI(new URI(props.getProperty(ConnectionFactoryImpl.QUERYMANAGER_PROPERTY,DEFAULT_INQUIRY_ENDPOINT)));
-			setPublishURI(new URI(props.getProperty(ConnectionFactoryImpl.LIFECYCLEMANAGER_PROPERTY, DEFAULT_PUBLISH_ENDPOINT)));
-			setSecurityURI(new URI(props.getProperty(ConnectionFactoryImpl.SECURITYMANAGER_PROPERTY, getPublishURI().toString())));
+			setInquiryURI(new URI(props.getProperty(ConnectionFactoryImpl.QUERYMANAGER_PROPERTY)));
+			if (props.containsKey(ConnectionFactoryImpl.LIFECYCLEMANAGER_PROPERTY)) {
+			    setPublishURI(new URI(props.getProperty(ConnectionFactoryImpl.LIFECYCLEMANAGER_PROPERTY)));
+			}
+			String securityURL = props.getProperty(ConnectionFactoryImpl.SECURITYMANAGER_PROPERTY, 
+			        props.getProperty(ConnectionFactoryImpl.LIFECYCLEMANAGER_PROPERTY));
+			if (securityURL!=null) setSecurityURI(new URI(securityURL));
 			setAdminURI(new URI(props.getProperty(ConnectionFactoryImpl.ADMIN_ENDPOINT_PROPERTY, DEFAULT_ADMIN_ENDPOINT)));
 			setSecurityProvider(props.getProperty(ConnectionFactoryImpl.SECURITY_PROVIDER_PROPERTY, DEFAULT_SECURITY_PROVIDER));
 			setProtocolHandler(props.getProperty(ConnectionFactoryImpl.PROTOCOL_HANDLER_PROPERTY, DEFAULT_PROTOCOL_HANDLER));
@@ -165,9 +170,8 @@
 			JAXBContext context = JAXBContextUtil.getContext(JAXBContextUtil.UDDI_V2_VERSION);
             unmarshaller = context.createUnmarshaller(); 
             marshaller = context.createMarshaller();
-            
 		} catch (URISyntaxException muex) {
-			throw new RuntimeException(muex);
+			throw new InvalidRequestException(muex.getMessage(),muex);
 		} catch(JAXBException e) {
            throw new RuntimeException(e);
         }
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 bb471e4..9d42986 100644
--- a/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/RegistryV3Impl.java
@@ -35,6 +35,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.registry.InvalidRequestException;
 import javax.xml.transform.stream.StreamSource;
 
 import org.apache.commons.logging.Log;
@@ -144,17 +145,19 @@
 
 	/**
 	 * Creates a new instance of RegistryImpl.
+	 * @throws InvalidRequestException 
 	 */
-	public RegistryV3Impl(Properties props, String nodeName, String managerName) {
+	public RegistryV3Impl(Properties props, String nodeName, String managerName) throws InvalidRequestException {
 		super();
 
 		this.init(props, nodeName, managerName);
 	}
 
 	/**
+	 * @throws InvalidRequestException 
 	 * 
 	 */
-	private void init(Properties props, String nodeName, String managerName) {
+	private void init(Properties props, String nodeName, String managerName) throws InvalidRequestException {
 	    this.nodeName = nodeName;
 	    this.managerName = managerName;
         // We need to have a non-null Properties
@@ -182,7 +185,7 @@
             marshaller = context.createMarshaller();
             
         } catch (URISyntaxException muex) {
-            throw new RuntimeException(muex);
+            throw new InvalidRequestException(muex.getMessage(), muex);
         } catch(JAXBException e) {
            throw new RuntimeException(e);
         }
diff --git a/src/test/java/org/apache/ws/scout/registry/ConnectionFactoryTest.java b/src/test/java/org/apache/ws/scout/registry/ConnectionFactoryTest.java
index 5e29e29..3dedd40 100644
--- a/src/test/java/org/apache/ws/scout/registry/ConnectionFactoryTest.java
+++ b/src/test/java/org/apache/ws/scout/registry/ConnectionFactoryTest.java
@@ -141,18 +141,24 @@
     public void testCreateConnectionWithNullLifeCycleURL() throws JAXRException {
         Properties properties = new Properties();
         properties.setProperty(ConnectionFactoryImpl.QUERYMANAGER_PROPERTY, "http://localhost");
-        factory.setProperties(properties);
-        Connection c = factory.createConnection();
+        Connection c = null;
         try {
+            factory.setProperties(properties);
+            c = factory.createConnection();
             assertEquals(ConnectionImpl.class, c.getClass());
+        } catch (Exception e) {
+            fail("it's ok to have a null lifeCycleURL");
         } finally {
-            c.close();
+            if (c!=null) c.close();
         }
     }
 
     public void testCreateConnectionWithNullQueryURL() {
         try {
             factory.createConnection();
+            fail("should have thrown an InvalidRequestException");
+        } catch (InvalidRequestException ire) {
+            //expected
         } catch (Exception e) {
             fail("threw Exception");
         }
