diff --git a/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java b/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java
index 3fa4d9c..cd61b8d 100644
--- a/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java
+++ b/stax-api-1.0/src/main/java/javax/xml/stream/FactoryLocator.java
@@ -20,6 +20,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 
+import java.util.Arrays;
 import java.util.Properties;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
@@ -46,13 +47,13 @@
 		return locate(factoryId, null);
 	}
 
-	static Object locate(String factoryId, String altClassName)
+	static Object locate(String factoryId, String[] altClassName)
 			throws FactoryConfigurationError {
 		return locate(factoryId, altClassName,
                               Thread.currentThread().getContextClassLoader());
 	}
 
-	static Object locate(String factoryId, String altClassName,
+	static Object locate(String factoryId, String[] altClassName,
                          ClassLoader classLoader) throws FactoryConfigurationError {
         try {
             // If we are deployed into an OSGi environment, leverage it
@@ -120,6 +121,22 @@
 		return loadFactory(altClassName, classLoader);
 	}
 
+    private static Object loadFactory(String[] classNames, ClassLoader classLoader)
+            throws FactoryConfigurationError {
+        for (String className : classNames) {
+            try {
+                Class factoryClass = classLoader == null ? Class.forName(className)
+                        : classLoader.loadClass(className);
+
+                return factoryClass.newInstance();
+            } catch (Exception x) {
+            }
+        }
+        throw new FactoryConfigurationError("Requested factory "
+                + Arrays.asList(classNames).toString()
+                + " could not be instantiated");
+    }
+
 	private static Object loadFactory(String className, ClassLoader classLoader)
 			throws FactoryConfigurationError {
 		try {
diff --git a/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java b/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java
index 9f0bd04..61ebacc 100644
--- a/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java
+++ b/stax-api-1.0/src/main/java/javax/xml/stream/XMLEventFactory.java
@@ -43,12 +43,15 @@
 
 	public static XMLEventFactory newInstance()
 			throws FactoryConfigurationError {
-            return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory", "com.sun.xml.internal.stream.events.XMLEventFactoryImpl");
+            return (XMLEventFactory)FactoryLocator.locate("javax.xml.stream.XMLEventFactory",
+                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" });
 	}
 
 	public static XMLEventFactory newInstance(String factoryId,
 			ClassLoader classLoader) throws FactoryConfigurationError {
-            return (XMLEventFactory)FactoryLocator.locate(factoryId, "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", classLoader);
+            return (XMLEventFactory)FactoryLocator.locate(factoryId,
+                    new String[] { "com.sun.xml.internal.stream.events.XMLEventFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLEventFactoryImpl" },
+                    classLoader);
 	}
 
 	public abstract void setLocation(Location location);
diff --git a/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java b/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java
index 335d91d..e0e123c 100644
--- a/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java
+++ b/stax-api-1.0/src/main/java/javax/xml/stream/XMLInputFactory.java
@@ -38,13 +38,16 @@
 	public static XMLInputFactory newInstance()
 			throws FactoryConfigurationError {
 		// We'll assume the XMLInputFactory from the RI as a backup.
-		return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory", "com.sun.xml.internal.stream.XMLInputFactoryImpl");
+		return (XMLInputFactory)FactoryLocator.locate("javax.xml.stream.XMLInputFactory",
+                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" });
 	}
 
 	public static XMLInputFactory newInstance(java.lang.String factoryId,
 			java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
 		// We'll assume the XMLInputFactory from the RI as a backup.
-		return (XMLInputFactory)FactoryLocator.locate(factoryId, "com.sun.xml.internal.stream.XMLInputFactoryImpl", classLoader);
+		return (XMLInputFactory)FactoryLocator.locate(factoryId,
+                new String[] { "com.sun.xml.internal.stream.XMLInputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLInputFactoryImpl" },
+                classLoader);
 	}
 
 	public abstract XMLStreamReader createXMLStreamReader(java.io.Reader reader)
diff --git a/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java b/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java
index f7de49f..e8a27ff 100644
--- a/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java
+++ b/stax-api-1.0/src/main/java/javax/xml/stream/XMLOutputFactory.java
@@ -26,12 +26,15 @@
 	
 	public static XMLOutputFactory newInstance()
 			throws FactoryConfigurationError {
-		return (XMLOutputFactory) FactoryLocator.locate("javax.xml.stream.XMLOutputFactory", "com.sun.xml.internal.stream.XMLOutputFactoryImpl");
+		return (XMLOutputFactory) FactoryLocator.locate("javax.xml.stream.XMLOutputFactory",
+                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" });
 	}
 
 	public static XMLInputFactory newInstance(String factoryId,
 			java.lang.ClassLoader classLoader) throws FactoryConfigurationError {
-		return (XMLInputFactory) FactoryLocator.locate(factoryId, "com.sun.xml.internal.stream.XMLOutputFactoryImpl", classLoader);
+		return (XMLInputFactory) FactoryLocator.locate(factoryId,
+                new String[] { "com.sun.xml.internal.stream.XMLOutputFactoryImpl", "com.ibm.xml.xlxp.api.stax.XMLOutputFactoryImpl" },
+                classLoader);
 	}
 
 	public abstract XMLStreamWriter createXMLStreamWriter(java.io.Writer stream)
