diff --git a/framework/META-INF/MANIFEST.MF b/framework/META-INF/MANIFEST.MF
index f870fdd..481190a 100644
--- a/framework/META-INF/MANIFEST.MF
+++ b/framework/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: Gemini Naming
 Bundle-SymbolicName: org.eclipse.gemini.naming
 Bundle-Vendor: Eclipse.org
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 1.0.0.RC1
 Bundle-Activator: org.eclipse.gemini.naming.Activator
 Bundle-Description: Gemini Naming bundle
 Bundle-Category: jndi
diff --git a/framework/pom.xml b/framework/pom.xml
index 4541b0a..3ecd710 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -4,14 +4,14 @@
   <groupId>org.eclipse.gemini.naming</groupId>
   <artifactId>org.eclipse.gemini.naming</artifactId>
   <packaging>eclipse-plugin</packaging>
-  <version>1.0.0-SNAPSHOT</version>
+  <version>1.0.0.RC1</version>
   <name>Gemini Naming Bundle</name>
   <url>http://maven.apache.org</url>
 
    <parent>
       <groupId>org.eclipse.gemini.naming</groupId>
       <artifactId>org.eclipse.gemini.naming.parent</artifactId>
-      <version>1.0.0-SNAPSHOT</version>
+      <version>1.0.0.RC1</version>
    </parent>
 
    <build>
diff --git a/framework/src/main/java/org/eclipse/gemini/naming/Activator.java b/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
index 357f100..1efdc77 100644
--- a/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
+++ b/framework/src/main/java/org/eclipse/gemini/naming/Activator.java
@@ -1,267 +1,288 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2012 Oracle.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution. 
- * The Eclipse Public License is available at
- *     http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at 
- *     http://www.opensource.org/licenses/apache2.0.php.
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *     Bob Nettleton (Oracle) - Initial Reference Implementation
- ******************************************************************************/
-
-package org.eclipse.gemini.naming;
-
-import java.lang.reflect.Field;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.naming.NamingException;
-import javax.naming.spi.InitialContextFactoryBuilder;
-import javax.naming.spi.NamingManager;
-import javax.naming.spi.ObjectFactory;
-import javax.naming.spi.ObjectFactoryBuilder;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.jndi.JNDIConstants;
-import org.osgi.service.jndi.JNDIContextManager;
-import org.osgi.service.jndi.JNDIProviderAdmin;
-
-/**
- * Activator implementation for the Gemini Naming Bundle.
- * 
- * This activator's main purpose is to register the JNDI Builder singleton
- * implementations that allow the Factory Manager to override the default JNDI
- * framework.
- * 
- * 
- */
-public class Activator implements BundleActivator {
-
-	private static final String					OSGI_URL_SCHEME					= "osgi";
-	
-	private static Logger logger = Logger.getLogger(Activator.class.getName());
-
-	private BundleContext						m_bundleContext					= null;
-	private final List                          m_listOfServiceRegistrations = new LinkedList();
-
-	private CloseableProviderAdmin	m_providerAdminService;
-	private ContextManagerServiceFactoryImpl m_contextManagerServiceFactory;
-	
-	/*
-	 * Create the Factory Manager's builder implementation, and register it with
-	 * the JNDI NamingManager.
-	 * 
-	 * @see
-	 * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
-	 * )
-	 */
-	public void start(BundleContext context) throws Exception {
-		logger.info("Initializing Gemini Naming Factory Manager Bundle");
-		
-		m_bundleContext = context;
-
-		// register static singletons with the JNDI framework
-		logger.info("Installing Static Singletons");
-		registerInitialContextFactoryBuilderSingleton();
-		registerObjectFactoryBuilderSingleton();
-
-		logger.info("Registering URL Context Factory for 'osgi' URL scheme");
-		registerOSGiURLContextFactory();
-		
-		logger.info("Registering Default Runtime Builder for JRE-provided factories");
-		registerDefaultRuntimeBuilder();
-		
-		logger.info("Registering ContextManager service");
-		// register the JNDIContextManager service once all Factory
-		// Manager initialization is complete
-		registerContextManager();
-		
-		logger.info("Registering ProviderAdmin service");
-		// register the JNDIProviderAdmin interface, used by OSGi-aware
-		// context implementations to resolve JNDI references
-		registerProviderAdmin();
-	}
-	
-
-	/*
-	 * Allow the Builder implementation to clean up any
-	 * ServiceListener/ServiceTracker instances.
-	 * 
-	 * @see
-	 * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		logger.info("Shutting down Gemini Naming Factory Manager Bundle");
-		
-		// close all known Contexts associated with the JNDIContextManager service
-		m_contextManagerServiceFactory.closeAll();
-		
-		// close the JNDIProviderAdmin service
-		m_providerAdminService.close();
-
-		// unregister all the JNDI services registered by this Activator
-		Iterator iterator = m_listOfServiceRegistrations.iterator();
-		while(iterator.hasNext()) {
-			ServiceRegistration serviceRegistration = 
-				(ServiceRegistration)iterator.next();
-			serviceRegistration.unregister();
-		}
-		
-		unregisterSingletons();
-	}
-
-
-	/**
-	 * Registers the InitialContextFactoryBuilder static singleton
-	 * @throws NamingException on any error that occurs during the setting
-	 *         of the builder.  
-	 */
-	private static void registerInitialContextFactoryBuilderSingleton() throws NamingException {
-		try {
-			NamingManager.setInitialContextFactoryBuilder(new TraditionalInitialContextFactoryBuilder());
-		}
-		catch (IllegalStateException illegalStateException) {
-			logger.log(Level.SEVERE, 
-			           "Gemini Naming Implementation cannot set the InitialContextFactoryBuilder - another builder was already installed",
-			           illegalStateException);
-			NamingException namingException = 
-				new NamingException("Error occurred while attempting to set the IntialContextFactoryBuilder.");
-			namingException.setRootCause(illegalStateException);
-			throw namingException;
-		} 
-		catch(SecurityException securityException) {
-			logger.log(Level.SEVERE, 
-					   "Gemini Naming Implementation did not have the proper security permissions to install the InitialContextFactoryBuilder",
-					   securityException);
-			NamingException namingException = 
-				new NamingException("Error occurred while attempting to set the IntialContextFactoryBuilder.");
-			namingException.setRootCause(securityException);
-			throw namingException;
-		}
-	}
-	
-	
-	/**
-	 * Registers the ObjectFactoryBuilder static singleton
-	 * @throws NamingException on any error that occurs during the setting
-	 *         of the builder.  
-	 */
-	private static void registerObjectFactoryBuilderSingleton() throws NamingException {
-		try {
-			NamingManager.setObjectFactoryBuilder(new TraditionalObjectFactoryBuilder());
-		}
-		catch (IllegalStateException illegalStateException) {
-			logger.log(Level.SEVERE, 
-			           "Gemini Naming Implementation cannot set the ObjectFactoryBuilder - another builder was already installed",
-			           illegalStateException);
-			NamingException namingException = 
-				new NamingException("Error occurred while attempting to set the ObjectFactoryBuilder.");
-			namingException.setRootCause(illegalStateException);
-			throw namingException;
-		} 
-		catch(SecurityException securityException) {
-			logger.log(Level.SEVERE, 
-					   "Gemini Naming Implementation did not have the proper security permissions to install the ObjectFactoryBuilder",
-					   securityException);
-			NamingException namingException = 
-				new NamingException("Error occurred while attempting to set the ObjectFactoryBuilder.");
-			namingException.setRootCause(securityException);
-			throw namingException;
-		}
-	}
-		
-	/**
-	 * Unregisters the InitialContextFactoryBuilder static singleton
-	 * and the ObjectFactoryBuilder static singleton.
-	 */
-	private static void unregisterSingletons() {
-		Field[] fields = NamingManager.class.getDeclaredFields();
-		if (fields != null && fields.length > 0) {
-			for (Field field: fields) {
-				if (InitialContextFactoryBuilder.class.equals(field.getType()) 
-						|| ObjectFactoryBuilder.class.equals(field.getType())){
-					field.setAccessible(true);
-					try {
-						field.set(null, null);
-					} catch (IllegalArgumentException e) {
-						logger.log(Level.SEVERE,
-								   "Unable to reset NamingManager static singleton " + field.getType(),
-								   e);
-					} catch (IllegalAccessException e) {
-						logger.log(Level.SEVERE,
-								   "Unable to reset NamingManager static singleton " + field.getType(),
-								   e);
-					}
-				}
-			}
-		}
-	}
-	
-	
-	
-	
-	/**
-	 * Registers the OSGi URL Context Factory.
-	 * 
-	 */
-	private void registerOSGiURLContextFactory() {
-		Hashtable serviceProperties = new Hashtable();
-		serviceProperties.put(JNDIConstants.JNDI_URLSCHEME, OSGI_URL_SCHEME);
-
-		ServiceRegistration serviceRegistration = 
-			m_bundleContext.registerService(ObjectFactory.class.getName(), 
-										    new OSGiURLContextFactoryServiceFactory(), 
-										    serviceProperties);
-		m_listOfServiceRegistrations.add(serviceRegistration);
-	}
-	
-	
-	/**
-	 * Registers the InitialContextFactoryBuilder implementation that 
-	 * is responsible for loading the JDK-defined providers that must be
-	 * loaded from the boot classpath.  
-	 * 
-	 */
-	private void registerDefaultRuntimeBuilder() {
-		ServiceRegistration serviceRegistration = 
-			m_bundleContext.registerService(InitialContextFactoryBuilder.class.getName(), 
-					                        new DefaultRuntimeInitialContextFactoryBuilder(), 
-					                        null);
-		m_listOfServiceRegistrations.add(serviceRegistration);
-	}
-	
-	
-	private void registerContextManager() {
-		m_contextManagerServiceFactory = 
-			new ContextManagerServiceFactoryImpl(m_bundleContext);
-		ServiceRegistration serviceRegistration = 
-			m_bundleContext.registerService(JNDIContextManager.class.getName(),
-											m_contextManagerServiceFactory,
-					                        null);
-		m_listOfServiceRegistrations.add(serviceRegistration);
-	}
-	
-
-	private void registerProviderAdmin() {
-		m_providerAdminService = 
-			new SecurityAwareProviderAdminImpl(new ProviderAdminImpl(m_bundleContext));
-		
-		
-		ServiceRegistration serviceRegistration =  
-			m_bundleContext.registerService(JNDIProviderAdmin.class.getName(),
-					                        m_providerAdminService,
-					                        null);
-		m_listOfServiceRegistrations.add(serviceRegistration);
-	}
-
+/*******************************************************************************
+ * Copyright (c) 2010, 2012 Oracle.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     Bob Nettleton (Oracle) - Initial Reference Implementation
+ ******************************************************************************/
+
+package org.eclipse.gemini.naming;
+
+import java.lang.reflect.Field;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactoryBuilder;
+import javax.naming.spi.NamingManager;
+import javax.naming.spi.ObjectFactory;
+import javax.naming.spi.ObjectFactoryBuilder;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.jndi.JNDIConstants;
+import org.osgi.service.jndi.JNDIContextManager;
+import org.osgi.service.jndi.JNDIProviderAdmin;
+
+/**
+ * Activator implementation for the Gemini Naming Bundle.
+ * 
+ * This activator's main purpose is to register the JNDI Builder singleton
+ * implementations that allow the Factory Manager to override the default JNDI
+ * framework.
+ * 
+ * 
+ */
+public class Activator implements BundleActivator {
+
+	private static final String					OSGI_URL_SCHEME					= "osgi";
+	private static final String					RMI_URL_SCHEME					= "rmi";
+	private static final String					RMI_URL_CONTEXT_FACTORY			= "com.sun.jndi.url.rmi.rmiURLContextFactory";
+	
+	private static Logger logger = Logger.getLogger(Activator.class.getName());
+
+	private BundleContext						m_bundleContext					= null;
+	private final List<ServiceRegistration>        m_listOfServiceRegistrations = new LinkedList<ServiceRegistration>();
+
+	private CloseableProviderAdmin	m_providerAdminService;
+	private ContextManagerServiceFactoryImpl m_contextManagerServiceFactory;
+	
+	/*
+	 * Create the Factory Manager's builder implementation, and register it with
+	 * the JNDI NamingManager.
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext
+	 * )
+	 */
+	public void start(BundleContext context) throws Exception {
+		logger.info("Initializing Gemini Naming Factory Manager Bundle");
+		
+		m_bundleContext = context;
+
+		// register static singletons with the JNDI framework
+		logger.info("Installing Static Singletons");
+		registerInitialContextFactoryBuilderSingleton();
+		registerObjectFactoryBuilderSingleton();
+
+		logger.info("Registering URL Context Factory for 'osgi' URL scheme");
+		registerOSGiURLContextFactory();
+		
+		logger.info("Registering Default Runtime Builder for JRE-provided factories");
+		registerDefaultRuntimeBuilder();
+		
+		logger.info("Registering ContextManager service");
+		// register the JNDIContextManager service once all Factory
+		// Manager initialization is complete
+		registerContextManager();
+		
+		logger.info("Registering ProviderAdmin service");
+		// register the JNDIProviderAdmin interface, used by OSGi-aware
+		// context implementations to resolve JNDI references
+		registerProviderAdmin();
+	}
+	
+
+	/*
+	 * Allow the Builder implementation to clean up any
+	 * ServiceListener/ServiceTracker instances.
+	 * 
+	 * @see
+	 * org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		logger.info("Shutting down Gemini Naming Factory Manager Bundle");
+		
+		// close all known Contexts associated with the JNDIContextManager service
+		m_contextManagerServiceFactory.closeAll();
+		
+		// close the JNDIProviderAdmin service
+		m_providerAdminService.close();
+
+		// unregister all the JNDI services registered by this Activator
+		Iterator<ServiceRegistration> iterator = m_listOfServiceRegistrations.iterator();
+		while(iterator.hasNext()) {
+			ServiceRegistration serviceRegistration = 
+				(ServiceRegistration)iterator.next();
+			serviceRegistration.unregister();
+		}
+		
+		unregisterSingletons();
+	}
+
+
+	/**
+	 * Registers the InitialContextFactoryBuilder static singleton
+	 * @throws NamingException on any error that occurs during the setting
+	 *         of the builder.  
+	 */
+	private static void registerInitialContextFactoryBuilderSingleton() throws NamingException {
+		try {
+			NamingManager.setInitialContextFactoryBuilder(new TraditionalInitialContextFactoryBuilder());
+		}
+		catch (IllegalStateException illegalStateException) {
+			logger.log(Level.SEVERE, 
+			           "Gemini Naming Implementation cannot set the InitialContextFactoryBuilder - another builder was already installed",
+			           illegalStateException);
+			NamingException namingException = 
+				new NamingException("Error occurred while attempting to set the IntialContextFactoryBuilder.");
+			namingException.setRootCause(illegalStateException);
+			throw namingException;
+		} 
+		catch(SecurityException securityException) {
+			logger.log(Level.SEVERE, 
+					   "Gemini Naming Implementation did not have the proper security permissions to install the InitialContextFactoryBuilder",
+					   securityException);
+			NamingException namingException = 
+				new NamingException("Error occurred while attempting to set the IntialContextFactoryBuilder.");
+			namingException.setRootCause(securityException);
+			throw namingException;
+		}
+	}
+	
+	
+	/**
+	 * Registers the ObjectFactoryBuilder static singleton
+	 * @throws NamingException on any error that occurs during the setting
+	 *         of the builder.  
+	 */
+	private static void registerObjectFactoryBuilderSingleton() throws NamingException {
+		try {
+			NamingManager.setObjectFactoryBuilder(new TraditionalObjectFactoryBuilder());
+		}
+		catch (IllegalStateException illegalStateException) {
+			logger.log(Level.SEVERE, 
+			           "Gemini Naming Implementation cannot set the ObjectFactoryBuilder - another builder was already installed",
+			           illegalStateException);
+			NamingException namingException = 
+				new NamingException("Error occurred while attempting to set the ObjectFactoryBuilder.");
+			namingException.setRootCause(illegalStateException);
+			throw namingException;
+		} 
+		catch(SecurityException securityException) {
+			logger.log(Level.SEVERE, 
+					   "Gemini Naming Implementation did not have the proper security permissions to install the ObjectFactoryBuilder",
+					   securityException);
+			NamingException namingException = 
+				new NamingException("Error occurred while attempting to set the ObjectFactoryBuilder.");
+			namingException.setRootCause(securityException);
+			throw namingException;
+		}
+	}
+		
+	/**
+	 * Unregisters the InitialContextFactoryBuilder static singleton
+	 * and the ObjectFactoryBuilder static singleton.
+	 */
+	private static void unregisterSingletons() {
+		Field[] fields = NamingManager.class.getDeclaredFields();
+		if (fields != null && fields.length > 0) {
+			for (Field field: fields) {
+				if (InitialContextFactoryBuilder.class.equals(field.getType()) 
+						|| ObjectFactoryBuilder.class.equals(field.getType())){
+					field.setAccessible(true);
+					try {
+						field.set(null, null);
+					} catch (IllegalArgumentException e) {
+						logger.log(Level.SEVERE,
+								   "Unable to reset NamingManager static singleton " + field.getType(),
+								   e);
+					} catch (IllegalAccessException e) {
+						logger.log(Level.SEVERE,
+								   "Unable to reset NamingManager static singleton " + field.getType(),
+								   e);
+					}
+				}
+			}
+		}
+	}
+	
+	
+	
+	
+	/**
+	 * Registers the OSGi URL Context Factory.
+	 * 
+	 */
+	private void registerOSGiURLContextFactory() {
+		Hashtable<Object, Object> serviceProperties = new Hashtable<Object, Object>();
+		serviceProperties.put(JNDIConstants.JNDI_URLSCHEME, OSGI_URL_SCHEME);
+
+		ServiceRegistration serviceRegistration = 
+			m_bundleContext.registerService(ObjectFactory.class.getName(), 
+										    new OSGiURLContextFactoryServiceFactory(), 
+										    serviceProperties);
+		m_listOfServiceRegistrations.add(serviceRegistration);
+	}
+	
+	
+	/**
+	 * Registers the InitialContextFactoryBuilder implementation that 
+	 * is responsible for loading the JDK-defined providers that must be
+	 * loaded from the boot classpath.  
+	 * 
+	 */
+	private void registerDefaultRuntimeBuilder() {
+		ServiceRegistration serviceRegistration = 
+			m_bundleContext.registerService(InitialContextFactoryBuilder.class.getName(), 
+					                        new DefaultRuntimeInitialContextFactoryBuilder(), 
+					                        null);
+		m_listOfServiceRegistrations.add(serviceRegistration);
+		
+		Hashtable<Object, Object> props = new Hashtable<Object, Object>();
+        props.put(JNDIConstants.JNDI_URLSCHEME, RMI_URL_SCHEME);
+		try {
+			ServiceRegistration rmiRegistration = 
+				m_bundleContext.registerService(ObjectFactory.class.getName(),
+												ClassLoader.getSystemClassLoader().loadClass(RMI_URL_CONTEXT_FACTORY).newInstance(),
+												props);
+			m_listOfServiceRegistrations.add(rmiRegistration);
+		}
+		catch(ClassNotFoundException e) {
+			logger.log(Level.SEVERE, RMI_URL_CONTEXT_FACTORY + " cannot be found through the system classloader.", e);
+		}
+		catch(InstantiationException e) {
+			logger.log(Level.SEVERE, "Exception occurred while instantiating " + RMI_URL_CONTEXT_FACTORY, e);
+		}
+		catch(IllegalAccessException e) {
+			logger.log(Level.SEVERE, "Exception occured while instantiating " + RMI_URL_CONTEXT_FACTORY, e);
+		}
+	}
+	
+	
+	private void registerContextManager() {
+		m_contextManagerServiceFactory = 
+			new ContextManagerServiceFactoryImpl(m_bundleContext);
+		ServiceRegistration serviceRegistration = 
+			m_bundleContext.registerService(JNDIContextManager.class.getName(),
+											m_contextManagerServiceFactory,
+					                        null);
+		m_listOfServiceRegistrations.add(serviceRegistration);
+	}
+	
+
+	private void registerProviderAdmin() {
+		m_providerAdminService = 
+			new SecurityAwareProviderAdminImpl(new ProviderAdminImpl(m_bundleContext));
+		
+		
+		ServiceRegistration serviceRegistration =  
+			m_bundleContext.registerService(JNDIProviderAdmin.class.getName(),
+					                        m_providerAdminService,
+					                        null);
+		m_listOfServiceRegistrations.add(serviceRegistration);
+	}
+
 }
\ No newline at end of file
diff --git a/framework/src/main/java/org/eclipse/gemini/naming/ContextWrapperImpl.java b/framework/src/main/java/org/eclipse/gemini/naming/ContextWrapperImpl.java
index af2683e..2af7d76 100644
--- a/framework/src/main/java/org/eclipse/gemini/naming/ContextWrapperImpl.java
+++ b/framework/src/main/java/org/eclipse/gemini/naming/ContextWrapperImpl.java
@@ -1,250 +1,250 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution. 
- * The Eclipse Public License is available at
- *     http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at 
- *     http://www.opensource.org/licenses/apache2.0.php.
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *     Bob Nettleton (Oracle) - Initial Reference Implementation
- ******************************************************************************/ 
-
-package org.eclipse.gemini.naming;
-
-import javax.naming.*;
-import javax.naming.spi.ObjectFactory;
-
-import java.security.PrivilegedExceptionAction;
-import java.util.Hashtable;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * A Decorated Context class that will allow the Gemini Naming Framework to handle
- * requests for URL context factory lookups.
- * 
- */
-class ContextWrapperImpl implements Context {
-
-	private static Logger logger = Logger.getLogger(ContextWrapperImpl.class.getName());
-	
-	private final Context			m_context;
-	private final FactoryManager	m_factoryManager;
-	
-	public ContextWrapperImpl(Context context, FactoryManager factoryManager) {
-		m_context = context;
-		m_factoryManager = factoryManager;
-	}
-
-
-	public Object lookup(Name name) throws NamingException {
-		return m_context.lookup(name);
-	}
-
-	public Object lookup(String name) throws NamingException {
-		if (isURLRequest(name)) {
-			// attempt to find a URL Context Factory to satisfy this lookup
-			// request
-			ObjectFactory objectFactory = null;
-			try {
-				// obtain URL Context Factory in a doPrivilieged() block
-				objectFactory = (ObjectFactory)SecurityUtils.invokePrivilegedAction(new GetObjectFactoryAction(m_factoryManager, name));
-			} catch (Exception e) {
-				logger.log(Level.FINE, 
-						   "Exception occurred while trying to obtain a reference to a URL Context Factory.",
-						   e);
-			}
-			
-			if (objectFactory == null) {
-				throw new NameNotFoundException(
-						"Name: "
-								+ name
-								+ " was not found.  A URL Context Factory was not registered to handle "
-								+ "this URL scheme");
-			}
-
-			try {
-				Context context = 
-					(Context) objectFactory.getObjectInstance(null, null, 
-															  null, m_context.getEnvironment());
-				if (context != null) {
-					return context.lookup(name);
-				}
-				else {
-					throw new NamingException("Name = " + name
-							+ "was not found using the URL Context factory.");
-				}
-			}
-			catch (Exception e) {
-				if (e instanceof NamingException) {
-					// re-throw naming exceptions
-					throw (NamingException) e;
-				}
-
-				NamingException namingException = 
-					new NameNotFoundException("Exception occurred during URL Context Factory Resolution for name = "
-								              + name);
-				namingException.initCause(e);
-				throw namingException;
-			}
-		}
-		else {
-			// treat this lookup as a normal lookup
-			return m_context.lookup(name);
-		}
-
-	}
-
-
-	
-
-	public void bind(Name name, Object obj) throws NamingException {
-		m_context.bind(name, obj);
-	}
-
-	public void bind(String name, Object obj) throws NamingException {
-		m_context.bind(name, obj);
-	}
-
-	public void rebind(Name name, Object obj) throws NamingException {
-		m_context.rebind(name, obj);
-	}
-
-	public void rebind(String name, Object obj) throws NamingException {
-		m_context.rebind(name, obj);
-	}
-
-	public void unbind(Name name) throws NamingException {
-		m_context.unbind(name);
-	}
-
-	public void unbind(String name) throws NamingException {
-		m_context.unbind(name);
-	}
-
-	public void rename(Name oldName, Name newName) throws NamingException {
-		m_context.rename(oldName, newName);
-	}
-
-	public void rename(String oldName, String newName) throws NamingException {
-		m_context.rename(oldName, newName);
-	}
-
-	public NamingEnumeration list(Name name) throws NamingException {
-		return m_context.list(name);
-	}
-
-	public NamingEnumeration list(String name) throws NamingException {
-		return m_context.list(name);
-	}
-
-	public NamingEnumeration listBindings(Name name) throws NamingException {
-		return m_context.listBindings(name);
-	}
-
-	public NamingEnumeration listBindings(String name) throws NamingException {
-		return m_context.listBindings(name);
-	}
-
-	public void destroySubcontext(Name name) throws NamingException {
-		m_context.destroySubcontext(name);
-	}
-
-	public void destroySubcontext(String name) throws NamingException {
-		m_context.destroySubcontext(name);
-	}
-
-	public Context createSubcontext(Name name) throws NamingException {
-		return m_context.createSubcontext(name);
-	}
-
-	public Context createSubcontext(String name) throws NamingException {
-		return m_context.createSubcontext(name);
-	}
-
-	public Object lookupLink(Name name) throws NamingException {
-		return m_context.lookupLink(name);
-	}
-
-	public Object lookupLink(String name) throws NamingException {
-		return m_context.lookupLink(name);
-	}
-
-	public NameParser getNameParser(Name name) throws NamingException {
-		return m_context.getNameParser(name);
-	}
-
-	public NameParser getNameParser(String name) throws NamingException {
-		return m_context.getNameParser(name);
-	}
-
-	public Name composeName(Name name, Name prefix) throws NamingException {
-		return m_context.composeName(name, prefix);
-	}
-
-	public String composeName(String name, String prefix)
-			throws NamingException {
-		return m_context.composeName(name, prefix);
-	}
-
-	public Object addToEnvironment(String propName, Object propVal)
-			throws NamingException {
-		return m_context.addToEnvironment(propName, propVal);
-	}
-
-	public Object removeFromEnvironment(String propName) throws NamingException {
-		return m_context.removeFromEnvironment(propName);
-	}
-
-	public Hashtable getEnvironment() throws NamingException {
-		return m_context.getEnvironment();
-	}
-
-	public void close() throws NamingException {
-		m_context.close();
-	}
-
-	public String getNameInNamespace() throws NamingException {
-		return m_context.getNameInNamespace();
-	}
-
-	private static boolean isURLRequest(String name) {
-		int indexOfColon = name.indexOf(":");
-		return (indexOfColon != -1);
-	}
-
-	private static String getScheme(String name) {
-		int indexOfColon = name.indexOf(":");
-		if (indexOfColon != -1) {
-			return name.substring(0, indexOfColon);
-		}
-
-		return null;
-	}
-	
-	private static class GetObjectFactoryAction implements PrivilegedExceptionAction {
-		private final FactoryManager m_factoryManager;
-		private final String m_name;
-		
-		GetObjectFactoryAction(FactoryManager factoryManager, String name) {
-			m_factoryManager = factoryManager;
-			m_name = name;
-		}
-
-		public Object run() throws Exception {
-			return obtainObjectFactory(m_name);
-		}
-		
-		private ObjectFactory obtainObjectFactory(String name) {
-			ObjectFactory objectFactory;
-			synchronized (m_factoryManager) {
-				objectFactory = m_factoryManager.getURLContextFactory(getScheme(name));
-			}
-			return objectFactory;
-		}
-	}
-}
+/*******************************************************************************
+ * Copyright (c) 2010, 2012 Oracle.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     Bob Nettleton (Oracle) - Initial Reference Implementation
+ ******************************************************************************/ 
+
+package org.eclipse.gemini.naming;
+
+import javax.naming.*;
+import javax.naming.spi.ObjectFactory;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.Hashtable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * A Decorated Context class that will allow the Gemini Naming Framework to handle
+ * requests for URL context factory lookups.
+ * 
+ */
+class ContextWrapperImpl implements Context {
+
+	private static Logger logger = Logger.getLogger(ContextWrapperImpl.class.getName());
+	
+	private final Context			m_context;
+	private final FactoryManager	m_factoryManager;
+	
+	public ContextWrapperImpl(Context context, FactoryManager factoryManager) {
+		m_context = context;
+		m_factoryManager = factoryManager;
+	}
+
+
+	public Object lookup(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).lookup(name);
+	}
+
+	public Object lookup(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).lookup(name);
+	}
+
+	public void bind(Name name, Object obj) throws NamingException {
+		getURLContextOrDefaultContext(name.toString()).bind(name, obj);
+	}
+
+	public void bind(String name, Object obj) throws NamingException {
+		getURLContextOrDefaultContext(name).bind(name, obj);
+	}
+
+	public void rebind(Name name, Object obj) throws NamingException {
+		getURLContextOrDefaultContext(name.toString()).rebind(name, obj);
+	}
+
+	public void rebind(String name, Object obj) throws NamingException {
+		getURLContextOrDefaultContext(name).rebind(name, obj);
+	}
+
+	public void unbind(Name name) throws NamingException {
+		getURLContextOrDefaultContext(name.toString()).unbind(name);
+	}
+
+	public void unbind(String name) throws NamingException {
+		getURLContextOrDefaultContext(name).unbind(name);
+	}
+
+	public void rename(Name oldName, Name newName) throws NamingException {
+		getURLContextOrDefaultContext(oldName.toString()).rename(oldName, newName);
+	}
+
+	public void rename(String oldName, String newName) throws NamingException {
+		getURLContextOrDefaultContext(oldName).rename(oldName, newName);
+	}
+
+	public NamingEnumeration list(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).list(name);
+	}
+
+	public NamingEnumeration list(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).list(name);
+	}
+
+	public NamingEnumeration listBindings(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).listBindings(name);
+	}
+
+	public NamingEnumeration listBindings(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).listBindings(name);
+	}
+
+	public void destroySubcontext(Name name) throws NamingException {
+		getURLContextOrDefaultContext(name.toString()).destroySubcontext(name);
+	}
+
+	public void destroySubcontext(String name) throws NamingException {
+		getURLContextOrDefaultContext(name).destroySubcontext(name);
+	}
+
+	public Context createSubcontext(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).createSubcontext(name);
+	}
+
+	public Context createSubcontext(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).createSubcontext(name);
+	}
+
+	public Object lookupLink(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).lookupLink(name);
+	}
+
+	public Object lookupLink(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).lookupLink(name);
+	}
+
+	public NameParser getNameParser(Name name) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).getNameParser(name);
+	}
+
+	public NameParser getNameParser(String name) throws NamingException {
+		return getURLContextOrDefaultContext(name).getNameParser(name);
+	}
+
+	public Name composeName(Name name, Name prefix) throws NamingException {
+		return getURLContextOrDefaultContext(name.toString()).composeName(name, prefix);
+	}
+
+	public String composeName(String name, String prefix)
+			throws NamingException {
+		return getURLContextOrDefaultContext(name).composeName(name, prefix);
+	}
+
+	public Object addToEnvironment(String propName, Object propVal)
+			throws NamingException {
+		return m_context.addToEnvironment(propName, propVal);
+	}
+
+	public Object removeFromEnvironment(String propName) throws NamingException {
+		return m_context.removeFromEnvironment(propName);
+	}
+
+	public Hashtable getEnvironment() throws NamingException {
+		return m_context.getEnvironment();
+	}
+
+	public void close() throws NamingException {
+		m_context.close();
+	}
+
+	public String getNameInNamespace() throws NamingException {
+		return m_context.getNameInNamespace();
+	}
+
+	private static boolean isURLRequest(String name) {
+		int indexOfColon = name.indexOf(":");
+		return (indexOfColon != -1);
+	}
+
+	private static String getScheme(String name) {
+		int indexOfColon = name.indexOf(":");
+		if (indexOfColon != -1) {
+			return name.substring(0, indexOfColon);
+		}
+
+		return null;
+	}
+
+	private Context getURLContextOrDefaultContext(String name)
+			throws NameNotFoundException, NamingException {
+		if (isURLRequest(name)) {
+			// attempt to find a URL Context Factory to satisfy this request
+			ObjectFactory objectFactory = null;
+			try {
+				// obtain URL Context Factory in a doPrivilieged() block
+				objectFactory = (ObjectFactory)SecurityUtils.invokePrivilegedAction(new GetObjectFactoryAction(m_factoryManager, name));
+			} catch (Exception e) {
+				logger.log(Level.FINE, 
+						   "Exception occurred while trying to obtain a reference to a URL Context Factory.",
+						   e);
+			}
+			
+			if (objectFactory == null) {
+				throw new NameNotFoundException(
+						"Name: "
+								+ name
+								+ " was not found.  A URL Context Factory was not registered to handle "
+								+ "this URL scheme");
+			}
+
+			try {
+				Context context = 
+					(Context) objectFactory.getObjectInstance(null, null, 
+															  null, m_context.getEnvironment());
+				if (context != null) {
+					return context;
+				}
+				else {
+					throw new NamingException("Name = " + name
+							+ "was not found using the URL Context factory = " + objectFactory);
+				}
+			}
+			catch (Exception e) {
+				if (e instanceof NamingException) {
+					// re-throw naming exceptions
+					throw (NamingException) e;
+				}
+
+				NamingException namingException = 
+					new NameNotFoundException("Exception occurred during URL Context Factory Resolution for name = "
+								              + name);
+				namingException.initCause(e);
+				throw namingException;
+			}
+		}
+		else {
+			// treat this lookup as a normal lookup
+			return m_context;
+		}
+	}
+	
+	private static class GetObjectFactoryAction implements PrivilegedExceptionAction {
+		private final FactoryManager m_factoryManager;
+		private final String m_name;
+		
+		GetObjectFactoryAction(FactoryManager factoryManager, String name) {
+			m_factoryManager = factoryManager;
+			m_name = name;
+		}
+
+		public Object run() throws Exception {
+			return obtainObjectFactory(m_name);
+		}
+		
+		private ObjectFactory obtainObjectFactory(String name) {
+			ObjectFactory objectFactory;
+			synchronized (m_factoryManager) {
+				objectFactory = m_factoryManager.getURLContextFactory(getScheme(name));
+			}
+			return objectFactory;
+		}
+	}
+}
diff --git a/integration-testing/pom.xml b/integration-testing/pom.xml
index 53ac7c7..fd5a9f2 100644
--- a/integration-testing/pom.xml
+++ b/integration-testing/pom.xml
@@ -6,7 +6,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.naming</groupId>
 		<artifactId>org.eclipse.gemini.naming.parent</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
+		<version>1.0.0.RC1</version>
 	</parent>
 
 	<modelVersion>4.0.0</modelVersion>
diff --git a/integration-testing/src/test/java/org/eclipse/gemini/naming/test/FactoryResolutionTestCase.java b/integration-testing/src/test/java/org/eclipse/gemini/naming/test/FactoryResolutionTestCase.java
index 457de82..05253bb 100644
--- a/integration-testing/src/test/java/org/eclipse/gemini/naming/test/FactoryResolutionTestCase.java
+++ b/integration-testing/src/test/java/org/eclipse/gemini/naming/test/FactoryResolutionTestCase.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2010 Oracle.
+ * Copyright (c) 2012 Oracle.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * and Apache License v2.0 which accompanies this distribution. 
@@ -19,16 +19,25 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.management.ManagementFactory;
 import java.net.ConnectException;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLStreamHandler;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
 import java.util.Dictionary;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
+import javax.management.MBeanServer;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXConnectorServerFactory;
+import javax.management.remote.JMXServiceURL;
 import javax.naming.CommunicationException;
 import javax.naming.Context;
 import javax.naming.InitialContext;
@@ -383,6 +392,52 @@
 			sysProperties.remove(Context.INITIAL_CONTEXT_FACTORY);
 		}
 	}
+    
+    /**
+     * Verify that RMI URL Context Factory can be used by default.
+     */
+    public void testRMIURLContextFactory() throws Exception {
+        MBeanServer theMBeanServer = ManagementFactory.getPlatformMBeanServer();
+		// Create the RMI registry
+		try {
+			LocateRegistry.createRegistry(1515);
+		} catch (RemoteException e) {
+			fail("Can't create registry: " + e.toString());
+		}
+        
+		// Build the connection string with fixed ports
+		StringBuilder url = new StringBuilder();
+		url.append("service:jmx:rmi://localhost:");
+		url.append(1516);
+		url.append("/jndi/rmi://localhost:");
+		url.append(1515);
+		url.append("/jmxrmi");
+		
+        JMXServiceURL serviceUrl = null;
+		try {
+			serviceUrl = new JMXServiceURL(url.toString());
+		} catch (MalformedURLException e) {
+			fail("Can't create registry: " + e.toString());
+		}
+        
+		Map<String, Object> env = new HashMap<String, Object>();
+		ClassLoader currentTCCL = Thread.currentThread().getContextClassLoader();
+        JMXConnectorServer cs = null;
+		try {
+			Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+			cs = JMXConnectorServerFactory.newJMXConnectorServer(serviceUrl, env, theMBeanServer);
+			cs.start();
+			System.out.println("Start MBean JMX registry with ports: registry=" + 1515 + ", server=" + 1516);
+            assertTrue(cs.isActive());
+		} catch (IOException e) {
+			fail("Can't create registry: " + e.toString());
+		} finally {
+			Thread.currentThread().setContextClassLoader(currentTCCL);
+            if (cs != null) {
+                cs.stop();
+            }
+		}
+    }
 	
 	// Stub implementations of JNDI factories used for simpler unit testing
 	static class TestContextFactoryBuilder implements InitialContextFactoryBuilder {
diff --git a/integration-testing/src/test/java/org/eclipse/gemini/naming/test/NamingTestCase.java b/integration-testing/src/test/java/org/eclipse/gemini/naming/test/NamingTestCase.java
index e0d17c6..b718edb 100644
--- a/integration-testing/src/test/java/org/eclipse/gemini/naming/test/NamingTestCase.java
+++ b/integration-testing/src/test/java/org/eclipse/gemini/naming/test/NamingTestCase.java
@@ -33,7 +33,7 @@
 
 public abstract class NamingTestCase extends AbstractConfigurableBundleCreatorTests {
 
-	private static String VERSION = "1.0.0-SNAPSHOT";
+	private static String VERSION = "1.0.0.RC1";
 	
 	private Map m_mapOfServicesToRegistrations = 
 		new HashMap();
diff --git a/org.eclipse.gemini.naming.feature/feature.xml b/org.eclipse.gemini.naming.feature/feature.xml
index ca3ae71..4463a96 100644
--- a/org.eclipse.gemini.naming.feature/feature.xml
+++ b/org.eclipse.gemini.naming.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
 	id="org.eclipse.gemini.naming.feature"
 	label="%featureName"
-	version="1.0.0.qualifier"
+	version="1.0.0.RC1"
 	provider-name="%providerName"
 	image="eclipse_update_120.jpg">
 
diff --git a/org.eclipse.gemini.naming.feature/pom.xml b/org.eclipse.gemini.naming.feature/pom.xml
index ee90e17..9606e28 100644
--- a/org.eclipse.gemini.naming.feature/pom.xml
+++ b/org.eclipse.gemini.naming.feature/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.naming</groupId>
 		<artifactId>org.eclipse.gemini.naming.parent</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
+		<version>1.0.0.RC1</version>
 	</parent>
 
 	<artifactId>org.eclipse.gemini.naming.feature</artifactId>
diff --git a/org.eclipse.gemini.naming.repository/category.xml b/org.eclipse.gemini.naming.repository/category.xml
index d7f65b0..6ad7014 100644
--- a/org.eclipse.gemini.naming.repository/category.xml
+++ b/org.eclipse.gemini.naming.repository/category.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <site>
-	<feature url="features/org.eclipse.gemini.naming.feature_1.0.0.qualifier.jar" id="org.eclipse.gemini.naming.feature" version="1.0.0.qualifier">
+	<feature url="features/org.eclipse.gemini.naming.feature_1.0.0.RC1.jar" id="org.eclipse.gemini.naming.feature" version="1.0.0.RC1">
 		<category name="gemini.naming"/>
 	</feature>
 	<category-def name="gemini.naming" label="Gemini Naming"/>
diff --git a/org.eclipse.gemini.naming.repository/pom.xml b/org.eclipse.gemini.naming.repository/pom.xml
index 4dd2f24..3085f45 100644
--- a/org.eclipse.gemini.naming.repository/pom.xml
+++ b/org.eclipse.gemini.naming.repository/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.naming</groupId>
 		<artifactId>org.eclipse.gemini.naming.parent</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
+		<version>1.0.0.RC1</version>
 	</parent>
 
 	<artifactId>org.eclipse.gemini.naming.repository</artifactId>
diff --git a/org.eclipse.gemini.naming.target/pom.xml b/org.eclipse.gemini.naming.target/pom.xml
index 44b0770..e72bc03 100644
--- a/org.eclipse.gemini.naming.target/pom.xml
+++ b/org.eclipse.gemini.naming.target/pom.xml
@@ -5,7 +5,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.naming</groupId>
 		<artifactId>org.eclipse.gemini.naming.parent</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
+		<version>1.0.0.RC1</version>
 	</parent>
 
 	<artifactId>target-platform</artifactId>
diff --git a/org.eclipse.gemini.naming.utests/pom.xml b/org.eclipse.gemini.naming.utests/pom.xml
index 19b77a8..dbd6f01 100644
--- a/org.eclipse.gemini.naming.utests/pom.xml
+++ b/org.eclipse.gemini.naming.utests/pom.xml
@@ -4,7 +4,7 @@
 	<parent>
 		<groupId>org.eclipse.gemini.naming</groupId>
 		<artifactId>org.eclipse.gemini.naming.parent</artifactId>
-		<version>1.0.0-SNAPSHOT</version>
+		<version>1.0.0.RC1</version>
 	</parent>
 
 	<artifactId>org.eclipse.gemini.naming.utests</artifactId>
diff --git a/org.eclipse.gemini.naming.utests/src/test/java/org/eclipse/gemini/naming/ActivatorTestCase.java b/org.eclipse.gemini.naming.utests/src/test/java/org/eclipse/gemini/naming/ActivatorTestCase.java
index 4f1c6fd..9bc20d9 100644
--- a/org.eclipse.gemini.naming.utests/src/test/java/org/eclipse/gemini/naming/ActivatorTestCase.java
+++ b/org.eclipse.gemini.naming.utests/src/test/java/org/eclipse/gemini/naming/ActivatorTestCase.java
@@ -1,255 +1,261 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Apache License v2.0 which accompanies this distribution. 
- * The Eclipse Public License is available at
- *     http://www.eclipse.org/legal/epl-v10.html
- * and the Apache License v2.0 is available at 
- *     http://www.opensource.org/licenses/apache2.0.php.
- * You may elect to redistribute this code under either of these licenses.
- *
- * Contributors:
- *     Bob Nettleton (Oracle) - Initial Reference Implementation Unit Tests
- ******************************************************************************/
-
-package org.eclipse.gemini.naming;
-
-import java.lang.reflect.Field;
-import java.util.Dictionary;
-import java.util.Hashtable;
-
-import javax.naming.NamingException;
-import javax.naming.spi.DirObjectFactory;
-import javax.naming.spi.InitialContextFactory;
-import javax.naming.spi.InitialContextFactoryBuilder;
-import javax.naming.spi.NamingManager;
-import javax.naming.spi.ObjectFactory;
-import javax.naming.spi.ObjectFactoryBuilder;
-
-import org.easymock.EasyMockSupport;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.jndi.JNDIConstants;
-import org.osgi.service.jndi.JNDIContextManager;
-import org.osgi.service.jndi.JNDIProviderAdmin;
-
-import static org.easymock.EasyMock.*;
-
-import junit.framework.TestCase;
-
-public class ActivatorTestCase extends TestCase {
-
-	public void setUp() {
-		setNamingManagerStaticFieldToNull("initctx_factory_builder");
-		setNamingManagerStaticFieldToNull("object_factory_builder");
-	}
-
-	public void tearDown() {
-		setNamingManagerStaticFieldToNull("initctx_factory_builder");
-		setNamingManagerStaticFieldToNull("object_factory_builder");
-	}
-	
-	
-	/**
-	 * Verify the basic startup of the Gemini Naming Activator.  
-	 *  
-	 * This test method verifies that all the expected services are 
-	 * registered using the correct interface, actual type, and service
-	 * properties.  
-	 */
-	public void testStart() throws Exception {
-		EasyMockSupport mockSupport = new EasyMockSupport();
-		BundleContext bundleContextMock = 
-			mockSupport.createMock(BundleContext.class);
-		
-		setupBundleContextMock(mockSupport, bundleContextMock);
-		// expect OSGi URLContextFactory 
-		Hashtable<String, Object> serviceProperties = new Hashtable<String, Object>();
-		serviceProperties.put(JNDIConstants.JNDI_URLSCHEME, "osgi");
-		setServiceRegistrationExpectation(mockSupport, bundleContextMock,
-				                          ObjectFactory.class.getName(), 
-				                          OSGiURLContextFactoryServiceFactory.class, 
-				                          serviceProperties);
-
-		// expect the "default" InitialContextFactoryBuilder
-		setServiceRegistrationExpectation(mockSupport, bundleContextMock,
-				                          InitialContextFactoryBuilder.class.getName(),
-				                          DefaultRuntimeInitialContextFactoryBuilder.class,
-				                          null);
-		
-		// expect the JNDIContextManager service registration
-		setServiceRegistrationExpectation(mockSupport, bundleContextMock, 
-				                          JNDIContextManager.class.getName(),
-				                          ContextManagerServiceFactoryImpl.class, 
-                						  null);
-		// expect the JNDIProviderAdmin service registration
-		setServiceRegistrationExpectation(mockSupport, bundleContextMock, 
-                						  JNDIProviderAdmin.class.getName(),
-                						  SecurityAwareProviderAdminImpl.class, 
-                						  null);
-				
-		
-		mockSupport.replayAll();
-		
-		// begin test
-		Activator activator = new Activator();
-		activator.start(bundleContextMock);
-		
-		// verify that the static singletons are set as expected
-		assertTrue("Activator did not set the InitialContextFactoryBuilder singleton correctly",
-				    getPrivateStaticField(NamingManager.class, "initctx_factory_builder") instanceof TraditionalInitialContextFactoryBuilder);
-		assertTrue("Activator did not set the ObjectFactoryBuilder singleton correctly",
-			       getPrivateStaticField(NamingManager.class, "object_factory_builder") instanceof TraditionalObjectFactoryBuilder);
-		
-		// stop() should complete without any exceptions
-		activator.stop(bundleContextMock);
-		
-		mockSupport.verifyAll();
-	}
-	
-	public void testRegistrationOfContextBuilderError() throws Exception {
-		// setup test mocks
-		EasyMockSupport mockSupport = new EasyMockSupport();
-		InitialContextFactoryBuilder builderMock = 
-			mockSupport.createMock(InitialContextFactoryBuilder.class);
-		if(!NamingManager.hasInitialContextFactoryBuilder()) {
-			NamingManager.setInitialContextFactoryBuilder(builderMock);
-		}
-		
-		BundleContext bundleContextMock = 
-			mockSupport.createMock(BundleContext.class);
-		mockSupport.replayAll();
-		
-		// begin test
-		Activator activator = new Activator();
-		try {
-			activator.start(bundleContextMock);
-			fail("NamingException should have been thrown");
-		} catch (NamingException namingException) {
-			// expected exception
-		}
-		
-		mockSupport.verifyAll();
-		
-	}
-	
-	
-	public void testRegistrationOfObjectFactoryBuilderError() throws Exception {
-		// setup test mocks
-		EasyMockSupport mockSupport = new EasyMockSupport();
-		ObjectFactoryBuilder builderMock = 
-			mockSupport.createMock(ObjectFactoryBuilder.class);
-		
-		try {
-			// try to set builder, to guarantee
-			// that Activator's attempt to set this will fail
-			NamingManager.setObjectFactoryBuilder(builderMock);
-		} catch (Throwable throwable) {
-			// if already set, test can continue
-		}
-		
-		BundleContext bundleContextMock = 
-			mockSupport.createMock(BundleContext.class);
-		mockSupport.replayAll();
-		
-		// begin test
-		Activator activator = new Activator();
-		try {
-			activator.start(bundleContextMock);
-			fail("NamingException should have been thrown");
-		} catch (NamingException namingException) {
-			// expected exception
-		}
-		
-		mockSupport.verifyAll();
-		
-	}
-
-	/* test utility methods/classes */
-	
-	private static void setupBundleContextMock(EasyMockSupport mockSupport, BundleContext bundleContextMock) throws InvalidSyntaxException {
-		Filter filterMock = 
-			mockSupport.createMock(Filter.class);
-		expect(bundleContextMock.createFilter("(objectClass=" + InitialContextFactory.class.getName() + ")")).andReturn(filterMock);
-		expect(bundleContextMock.createFilter("(objectClass=" + InitialContextFactoryBuilder.class.getName() + ")")).andReturn(filterMock);
-		expect(bundleContextMock.createFilter("(objectClass=" + ObjectFactory.class.getName() + ")")).andReturn(filterMock).anyTimes();
-		expect(bundleContextMock.createFilter("(objectClass=" + DirObjectFactory.class.getName() + ")")).andReturn(filterMock);
-		expect(bundleContextMock.createFilter("(objectClass=" + ObjectFactoryBuilder.class.getName() + ")")).andReturn(filterMock);
-		
-		bundleContextMock.addServiceListener(isA(ServiceListener.class), isA(String.class));
-		expectLastCall().anyTimes();
-		
-		bundleContextMock.removeServiceListener(isA(ServiceListener.class));
-		expectLastCall().anyTimes();
-		
-		expect(bundleContextMock.getServiceReferences(isA(String.class), isA(String.class))).andReturn(new ServiceReference[0]).anyTimes();
-		expect(bundleContextMock.getServiceReferences(isA(String.class), (String)isNull())).andReturn(new ServiceReference[0]).anyTimes();
-	}
-
-	private static <T> void setServiceRegistrationExpectation(EasyMockSupport mockSupport, BundleContext bundleContextMock, String serviceName, Class<T> serviceType, Dictionary<String, Object> serviceProperties) {
-		ServiceRegistration serviceRegistrationMock = 
-			mockSupport.createMock(ServiceRegistration.class);
-		// required for stop() method
-		serviceRegistrationMock.unregister();
-		if(serviceProperties != null) {
-			expect(bundleContextMock.registerService(eq(serviceName),
-	                isA(serviceType), eq(serviceProperties))).andReturn(serviceRegistrationMock);
-		} else {
-			expect(bundleContextMock.registerService(eq(serviceName),
-	                isA(serviceType), (Dictionary)isNull())).andReturn(serviceRegistrationMock);
-		}
-		
-	}
-	
-	/**
-	 * This method should be used only for unit testing the Gemini Naming Activator.  
-	 * 
-	 * This method sets the static singleton fields on the NamingManger class to null.  This facilitates
-	 * simpler unit-testing of the Activator, which attempts to set these singletons.  The NamingManager usually
-	 * throws and Exception on the set() methods for these singletons after they've been set once.  
-	 * 
-	 * This utility method is meant to make unit testing simpler, but should not be used in production code. 
-	 * 
-	 * This utility method will probably not work properly if a security manager is enabled.  
-	 * 
-	 * @param fieldName the name of the static field to set to null.
-	 */
-	private static void setNamingManagerStaticFieldToNull(String fieldName) {
-		try {
-			final Field field = NamingManager.class.getDeclaredField(fieldName);
-			if(field != null) {
-				field.setAccessible(true);
-				// reset this static field to null
-				field.set(null, null);
-			}
-		} catch (Throwable throwable) {
-			throwable.printStackTrace();
-		}
-	}
-	
-	/*
-	 * Utility method used to access the private static singletons on the NamingManager class.  
-	 * 
-	 * This method should only be used for unit-testing the Gemini Naming code.  
-	 *
-	 * This utility method will probably not work properly if a security manager is enabled.
-	 * 
-	 * @param type the Class type that contains the field
-	 * @param fieldName a String name that identifies the field
-	 */
-	private static Object getPrivateStaticField(Class type, String fieldName) throws Exception {
-		Field field = type.getDeclaredField(fieldName);
-		if(field != null) {
-			field.setAccessible(true);
-			return field.get(null);
-		}
-		
-		return null;
-	}
-	
-}
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     Bob Nettleton (Oracle) - Initial Reference Implementation Unit Tests
+ ******************************************************************************/
+
+package org.eclipse.gemini.naming;
+
+import java.lang.reflect.Field;
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import javax.naming.NamingException;
+import javax.naming.spi.DirObjectFactory;
+import javax.naming.spi.InitialContextFactory;
+import javax.naming.spi.InitialContextFactoryBuilder;
+import javax.naming.spi.NamingManager;
+import javax.naming.spi.ObjectFactory;
+import javax.naming.spi.ObjectFactoryBuilder;
+
+import org.easymock.EasyMockSupport;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.jndi.JNDIConstants;
+import org.osgi.service.jndi.JNDIContextManager;
+import org.osgi.service.jndi.JNDIProviderAdmin;
+
+import static org.easymock.EasyMock.*;
+
+import junit.framework.TestCase;
+
+public class ActivatorTestCase extends TestCase {
+
+	public void setUp() {
+		setNamingManagerStaticFieldToNull("initctx_factory_builder");
+		setNamingManagerStaticFieldToNull("object_factory_builder");
+	}
+
+	public void tearDown() {
+		setNamingManagerStaticFieldToNull("initctx_factory_builder");
+		setNamingManagerStaticFieldToNull("object_factory_builder");
+	}
+	
+	
+	/**
+	 * Verify the basic startup of the Gemini Naming Activator.  
+	 *  
+	 * This test method verifies that all the expected services are 
+	 * registered using the correct interface, actual type, and service
+	 * properties.  
+	 */
+	public void testStart() throws Exception {
+		EasyMockSupport mockSupport = new EasyMockSupport();
+		BundleContext bundleContextMock = 
+			mockSupport.createMock(BundleContext.class);
+		
+		setupBundleContextMock(mockSupport, bundleContextMock);
+		// expect OSGi URLContextFactory 
+		Hashtable<String, Object> serviceProperties = new Hashtable<String, Object>();
+		serviceProperties.put(JNDIConstants.JNDI_URLSCHEME, "osgi");
+		setServiceRegistrationExpectation(mockSupport, bundleContextMock,
+				                          ObjectFactory.class.getName(), 
+				                          OSGiURLContextFactoryServiceFactory.class, 
+				                          serviceProperties);
+
+		// expect the "default" InitialContextFactoryBuilder
+		setServiceRegistrationExpectation(mockSupport, bundleContextMock,
+				                          InitialContextFactoryBuilder.class.getName(),
+				                          DefaultRuntimeInitialContextFactoryBuilder.class,
+				                          null);
+		
+		// expect the JNDIContextManager service registration
+		setServiceRegistrationExpectation(mockSupport, bundleContextMock, 
+				                          JNDIContextManager.class.getName(),
+				                          ContextManagerServiceFactoryImpl.class, 
+                						  null);
+		// expect the JNDIProviderAdmin service registration
+		setServiceRegistrationExpectation(mockSupport, bundleContextMock, 
+                						  JNDIProviderAdmin.class.getName(),
+                						  SecurityAwareProviderAdminImpl.class, 
+                						  null);
+		// expect the rmiURLContextFactory service registration
+		Hashtable<String, Object> props = new Hashtable<String, Object>();
+        props.put(JNDIConstants.JNDI_URLSCHEME, "rmi");
+		setServiceRegistrationExpectation(mockSupport, bundleContextMock, 
+										  ObjectFactory.class.getName(),
+										  ClassLoader.getSystemClassLoader().loadClass("com.sun.jndi.url.rmi.rmiURLContextFactory"), 
+                						  props);				
+		
+		mockSupport.replayAll();
+		
+		// begin test
+		Activator activator = new Activator();
+		activator.start(bundleContextMock);
+		
+		// verify that the static singletons are set as expected
+		assertTrue("Activator did not set the InitialContextFactoryBuilder singleton correctly",
+				    getPrivateStaticField(NamingManager.class, "initctx_factory_builder") instanceof TraditionalInitialContextFactoryBuilder);
+		assertTrue("Activator did not set the ObjectFactoryBuilder singleton correctly",
+			       getPrivateStaticField(NamingManager.class, "object_factory_builder") instanceof TraditionalObjectFactoryBuilder);
+		
+		// stop() should complete without any exceptions
+		activator.stop(bundleContextMock);
+		
+		mockSupport.verifyAll();
+	}
+	
+	public void testRegistrationOfContextBuilderError() throws Exception {
+		// setup test mocks
+		EasyMockSupport mockSupport = new EasyMockSupport();
+		InitialContextFactoryBuilder builderMock = 
+			mockSupport.createMock(InitialContextFactoryBuilder.class);
+		if(!NamingManager.hasInitialContextFactoryBuilder()) {
+			NamingManager.setInitialContextFactoryBuilder(builderMock);
+		}
+		
+		BundleContext bundleContextMock = 
+			mockSupport.createMock(BundleContext.class);
+		mockSupport.replayAll();
+		
+		// begin test
+		Activator activator = new Activator();
+		try {
+			activator.start(bundleContextMock);
+			fail("NamingException should have been thrown");
+		} catch (NamingException namingException) {
+			// expected exception
+		}
+		
+		mockSupport.verifyAll();
+		
+	}
+	
+	
+	public void testRegistrationOfObjectFactoryBuilderError() throws Exception {
+		// setup test mocks
+		EasyMockSupport mockSupport = new EasyMockSupport();
+		ObjectFactoryBuilder builderMock = 
+			mockSupport.createMock(ObjectFactoryBuilder.class);
+		
+		try {
+			// try to set builder, to guarantee
+			// that Activator's attempt to set this will fail
+			NamingManager.setObjectFactoryBuilder(builderMock);
+		} catch (Throwable throwable) {
+			// if already set, test can continue
+		}
+		
+		BundleContext bundleContextMock = 
+			mockSupport.createMock(BundleContext.class);
+		mockSupport.replayAll();
+		
+		// begin test
+		Activator activator = new Activator();
+		try {
+			activator.start(bundleContextMock);
+			fail("NamingException should have been thrown");
+		} catch (NamingException namingException) {
+			// expected exception
+		}
+		
+		mockSupport.verifyAll();
+		
+	}
+
+	/* test utility methods/classes */
+	
+	private static void setupBundleContextMock(EasyMockSupport mockSupport, BundleContext bundleContextMock) throws InvalidSyntaxException {
+		Filter filterMock = 
+			mockSupport.createMock(Filter.class);
+		expect(bundleContextMock.createFilter("(objectClass=" + InitialContextFactory.class.getName() + ")")).andReturn(filterMock);
+		expect(bundleContextMock.createFilter("(objectClass=" + InitialContextFactoryBuilder.class.getName() + ")")).andReturn(filterMock);
+		expect(bundleContextMock.createFilter("(objectClass=" + ObjectFactory.class.getName() + ")")).andReturn(filterMock).anyTimes();
+		expect(bundleContextMock.createFilter("(objectClass=" + DirObjectFactory.class.getName() + ")")).andReturn(filterMock);
+		expect(bundleContextMock.createFilter("(objectClass=" + ObjectFactoryBuilder.class.getName() + ")")).andReturn(filterMock);
+		
+		bundleContextMock.addServiceListener(isA(ServiceListener.class), isA(String.class));
+		expectLastCall().anyTimes();
+		
+		bundleContextMock.removeServiceListener(isA(ServiceListener.class));
+		expectLastCall().anyTimes();
+		
+		expect(bundleContextMock.getServiceReferences(isA(String.class), isA(String.class))).andReturn(new ServiceReference[0]).anyTimes();
+		expect(bundleContextMock.getServiceReferences(isA(String.class), (String)isNull())).andReturn(new ServiceReference[0]).anyTimes();
+	}
+
+	private static <T> void setServiceRegistrationExpectation(EasyMockSupport mockSupport, BundleContext bundleContextMock, String serviceName, Class<T> serviceType, Dictionary<String, Object> serviceProperties) {
+		ServiceRegistration serviceRegistrationMock = 
+			mockSupport.createMock(ServiceRegistration.class);
+		// required for stop() method
+		serviceRegistrationMock.unregister();
+		if(serviceProperties != null) {
+			expect(bundleContextMock.registerService(eq(serviceName),
+	                isA(serviceType), eq(serviceProperties))).andReturn(serviceRegistrationMock);
+		} else {
+			expect(bundleContextMock.registerService(eq(serviceName),
+	                isA(serviceType), (Dictionary)isNull())).andReturn(serviceRegistrationMock);
+		}
+		
+	}
+	
+	/**
+	 * This method should be used only for unit testing the Gemini Naming Activator.  
+	 * 
+	 * This method sets the static singleton fields on the NamingManger class to null.  This facilitates
+	 * simpler unit-testing of the Activator, which attempts to set these singletons.  The NamingManager usually
+	 * throws and Exception on the set() methods for these singletons after they've been set once.  
+	 * 
+	 * This utility method is meant to make unit testing simpler, but should not be used in production code. 
+	 * 
+	 * This utility method will probably not work properly if a security manager is enabled.  
+	 * 
+	 * @param fieldName the name of the static field to set to null.
+	 */
+	private static void setNamingManagerStaticFieldToNull(String fieldName) {
+		try {
+			final Field field = NamingManager.class.getDeclaredField(fieldName);
+			if(field != null) {
+				field.setAccessible(true);
+				// reset this static field to null
+				field.set(null, null);
+			}
+		} catch (Throwable throwable) {
+			throwable.printStackTrace();
+		}
+	}
+	
+	/*
+	 * Utility method used to access the private static singletons on the NamingManager class.  
+	 * 
+	 * This method should only be used for unit-testing the Gemini Naming code.  
+	 *
+	 * This utility method will probably not work properly if a security manager is enabled.
+	 * 
+	 * @param type the Class type that contains the field
+	 * @param fieldName a String name that identifies the field
+	 */
+	private static Object getPrivateStaticField(Class type, String fieldName) throws Exception {
+		Field field = type.getDeclaredField(fieldName);
+		if(field != null) {
+			field.setAccessible(true);
+			return field.get(null);
+		}
+		
+		return null;
+	}
+	
+}
diff --git a/pom.xml b/pom.xml
index 8ff0d20..3b1d66b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
   <groupId>org.eclipse.gemini.naming</groupId>
   <artifactId>org.eclipse.gemini.naming.parent</artifactId>
   <packaging>pom</packaging>
-  <version>1.0.0-SNAPSHOT</version>
+  <version>1.0.0.RC1</version>
   <name>Gemini Naming parent project</name>
   <url>http://maven.apache.org</url>
 
