diff --git a/pom.xml b/pom.xml
index a37cc0f..762995a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at
 
-     http://www.apache.org/licenses/LICENSE-2.0 
+     http://www.apache.org/licenses/LICENSE-2.0
 
     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
@@ -58,49 +58,6 @@
     <url>http://svn.apache.org/viewcvs.cgi/geronimo/specs/tags/geronimo-jpa_2.2_spec-1.0</url>
   </scm>
 
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.core</artifactId>
-      <version>1.4.0</version>
-      <scope>compile</scope>
-      <optional>true</optional>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>org.osgi.foundation</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.felix</groupId>
-      <artifactId>org.osgi.compendium</artifactId>
-      <version>1.2.0</version>
-      <scope>compile</scope>
-      <optional>true</optional>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>org.osgi.core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>org.osgi.foundation</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.felix</groupId>
-          <artifactId>javax.servlet</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.geronimo.specs</groupId>
-      <artifactId>geronimo-osgi-locator</artifactId>
-      <version>1.0</version>
-      <scope>provided</scope>
-    </dependency>
-  </dependencies>
-
   <build>
     <pluginManagement>
       <plugins>
@@ -117,43 +74,42 @@
       <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
-        <version>3.5.0</version>
+        <version>3.5.0</version><!--$NO-MVN-MAN-VER$-->
         <configuration>
           <instructions>
             <Bundle-SymbolicName>${project.groupId}.${project.artifactId};singleton=true</Bundle-SymbolicName>
-            <Bundle-Activator>org.apache.geronimo.specs.jpa.PersistenceActivator</Bundle-Activator>
-            <Specification-Title>JSR-338 Java Persistence API 2.1</Specification-Title>
+            <Specification-Title>JSR-338 Java Persistence API 2.2</Specification-Title>
             <Specification-Vendor>Sun Microsystems, Inc.</Specification-Vendor>
-            <Specification-Version>2.1</Specification-Version>
-            <Private-Package>org.apache.geronimo.specs.jpa.*;org.apache.geronimo.osgi.locator</Private-Package>
+            <Specification-Version>2.2</Specification-Version>
             <!-- The OSGi specification requires these packages be exported as 1.1.  Unfortunately,
                  there are bundles out there that are currently expecting to use a 2.0 version.  The duplicate
                  package exports are done to prevent breaking those packages -->
             <Export-Package>
-              javax.persistence;version=1.2;jpa=2.1,
-              javax.persistence.criteria;version=1.2;jpa=2.1,
-              javax.persistence.metamodel;version=1.2;jpa=2.1,
-              javax.persistence.spi;version=1.2;jpa=2.1,
-              javax.persistence;version=2.1,
-              javax.persistence.criteria;version=2.1,
-              javax.persistence.metamodel;version=2.1,
-              javax.persistence.spi;version=2.1
+              javax.persistence;version=1.3;jpa=2.2,
+              javax.persistence.criteria;version=1.3;jpa=2.2,
+              javax.persistence.metamodel;version=1.3;jpa=2.2,
+              javax.persistence.spi;version=1.3;jpa=2.2,
+              javax.persistence;version=2.2,
+              javax.persistence.criteria;version=2.2,
+              javax.persistence.metamodel;version=2.2,
+              javax.persistence.spi;version=2.2
             </Export-Package>
             <!-- bnd is not correctly handling these imports using wildcards, so they
                  need to be explicitly specified -->
             <Import-Package>
-              javax.persistence;version=1.2,
-              javax.persistence.criteria;version=1.2,
-              javax.persistence.metamodel;version=1.2,
-              javax.persistence.spi;version=1.2,
-              javax.sql;resolution:=optional,
-              org.osgi.framework;resolution:=optional,
-              org.osgi.util.tracker;resolution:=optional,
-              org.apache.geronimo.osgi.registry.api;resolution:=optional
+              javax.persistence;version=1.3,
+              javax.persistence.criteria;version=1.3,
+              javax.persistence.metamodel;version=1.3,
+              javax.persistence.spi;version=1.3,
+              javax.sql;resolution:=optional
             </Import-Package>
             <Provide-Capability><![CDATA[
-               osgi.contract;osgi.contract=JavaJPA;uses:="${packages;NAMED;javax.*}";version:List<Version>='2.1,2.0,1.0'
+              osgi.contract;osgi.contract=JavaJPA;uses:="${packages;NAMED;javax.*}";version:List<Version>='2.2,2.1,2.0,1.0'
             ]]></Provide-Capability>
+            <Require-Capability><![CDATA[
+              osgi.serviceloader;filter:="(osgi.serviceloader=javax.persistence.spi.PersistenceProvider)";cardinality:=multiple,
+              osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"
+            ]]></Require-Capability>
           </instructions>
           <unpackBundle>true</unpackBundle>
         </configuration>
diff --git a/src/main/java/javax/persistence/Persistence.java b/src/main/java/javax/persistence/Persistence.java
index 27a89ff..067a5b5 100644
--- a/src/main/java/javax/persistence/Persistence.java
+++ b/src/main/java/javax/persistence/Persistence.java
@@ -26,8 +26,6 @@
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -41,8 +39,6 @@
 import javax.persistence.spi.PersistenceProviderResolverHolder;
 import javax.persistence.spi.ProviderUtil;
 
-import org.apache.geronimo.osgi.locator.ProviderLocator;
-
 /**
  * Bootstrap class to obtain {@link javax.persistence.EntityManagerFactory}
  * references.
@@ -88,45 +84,6 @@
         List<PersistenceProvider> providers = getProviders();
 
         /*
-         * Geronimo/OpenJPA 1.0 unique behavior - Start by loading a provider
-         * explicitly specified in the properties and return any exceptions.
-         * The spec doesn't forbid providers that aren't a service - it only
-         * states that they "should" be implemented as services in Sect. 9.2.
-         *
-         * For 2.0 - We only perform the above behavior if the specified
-         * provider is not in the discovered list.
-         *
-         * Note: This special non-spec defined case will rethrow any encountered
-         * Exceptions as a PersistenceException.
-         */
-        Object propVal = props.get(PERSISTENCE_PROVIDER_PROPERTY);
-        if ((propVal != null) && (propVal instanceof String)) {
-            boolean isLoaded = false;
-            String providerName = propVal.toString();
-            // search the discovered providers for this explicit provider
-            for (PersistenceProvider provider : providers) {
-                if (provider.getClass().getName().compareTo(providerName) == 0) {
-                    isLoaded = true;
-                    break;
-                }
-            }
-            /*
-             * Only try to explicitly create this provider if we didn't
-             * find it as a service, while rethrowing any exceptions to
-             * match the old 1.0 behavior
-             */
-            if (!isLoaded) {
-                factory = createFactory(
-                    providerName.toString(),
-                    persistenceUnitName,
-                    props);
-                if (factory != null) {
-                    return factory;
-                }
-            }
-        }
-
-        /*
          * Now, the default JPA2 behavior of loading a provider from our resolver
          *
          * Note:  Change in behavior from 1.0, which always returned exceptions:
@@ -187,38 +144,6 @@
         }
     }
 
-    /*
-     * Geronimo/OpenJPA private helper code for PERSISTENCE_PROVIDER_PROPERTY
-     * @return EntityManagerFactory or null
-     * @throws PersistenceException
-     */
-    private static EntityManagerFactory createFactory(String providerName,
-            String persistenceUnitName, Map properties)
-            throws PersistenceException {
-
-        Class<?> providerClass;
-
-        // get our class loader
-        ClassLoader cl = PrivClassLoader.get(null);
-        if (cl == null)
-            cl = PrivClassLoader.get(Persistence.class);
-
-        try {
-            providerClass = ProviderLocator.loadClass(providerName, Persistence.class, cl);
-        } catch (Exception e) {
-            throw new PersistenceException("Invalid or inaccessible explicit provider class: " +
-                providerName, e);
-        }
-        try {
-            PersistenceProvider provider = (PersistenceProvider) providerClass.newInstance();
-            return provider.createEntityManagerFactory(persistenceUnitName, properties);
-        } catch (Exception e) {
-            throw new PersistenceException("Explicit error returned from provider: " +
-                providerName + " for PU: " + persistenceUnitName, e);
-        }
-    }
-
-
     /**
      * Geronimo/OpenJPA private helper code for creating a PersistenceException
      * @param msg String to use as the exception message
@@ -285,8 +210,6 @@
          * @see javax.persistence.PersistenceUtil#isLoaded(java.lang.Object, java.lang.String)
          */
             public boolean isLoaded(Object entity, String attributeName) {
-                boolean isLoaded = true;
-
                 // Get the list of persistence providers from the resolver
                 List<PersistenceProvider> pps = getProviders();
 
@@ -352,30 +275,5 @@
             }
     }
 
-    /**
-     * Geronimo/OpenJPA private helper code for handling class loaders
-     */
-    private static class PrivClassLoader implements PrivilegedAction<ClassLoader> {
-        private final Class<?> c;
-
-        public static ClassLoader get(Class<?> c) {
-            final PrivClassLoader action = new PrivClassLoader(c);
-            if (System.getSecurityManager() != null)
-                return AccessController.doPrivileged(action);
-            else
-                return action.run();
-        }
-
-        private PrivClassLoader(Class<?> c) {
-            this.c = c;
-        }
-
-        public ClassLoader run() {
-            if (c != null)
-                return c.getClassLoader();
-            else
-                return Thread.currentThread().getContextClassLoader();
-        }
-    }
 }
 
diff --git a/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java b/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java
index c91efa4..5d8133c 100644
--- a/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java
+++ b/src/main/java/javax/persistence/spi/PersistenceProviderResolverHolder.java
@@ -25,22 +25,15 @@
 
 package javax.persistence.spi;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.List;
+import java.util.ServiceLoader;
 import java.util.WeakHashMap;
 
 import javax.persistence.PersistenceException;
 
-import org.apache.geronimo.osgi.locator.ProviderLocator;
-
 /**
  * Contains Geronimo implemented code as required by the JPA spec.
  *
@@ -80,9 +73,6 @@
      */
     private static class DefaultPersistenceProviderResolver implements PersistenceProviderResolver {
 
-        private static final String SERVICES_FILENAME = "META-INF/services/" +
-            PersistenceProvider.class.getName();
-
         // cache of providers per class loader
         private volatile WeakHashMap<ClassLoader, List<PersistenceProvider>> providerCache =
             new WeakHashMap<ClassLoader, List<PersistenceProvider>>();
@@ -105,18 +95,11 @@
                 providers = new ArrayList<PersistenceProvider>();
                 try {
                     // add each one to our list
-                    List<Object> serviceProviders = ProviderLocator.getServices(PersistenceProvider.class.getName(), this.getClass(), cl);
-                    for (Object o : serviceProviders) {
-                        providers.add((PersistenceProvider)o);
+                    for (PersistenceProvider provider : ServiceLoader.load(PersistenceProvider.class, cl)) {
+                        providers.add(provider);
                     }
                     // cache the discovered providers
                     providerCache.put(cl, providers);
-                } catch (ClassNotFoundException e) {
-                    throw new PersistenceException("Failed to load provider from META-INF/services", e);
-                } catch (InstantiationException e) {
-                    throw new PersistenceException("Failed to load provider from META-INF/services", e);
-                } catch (IllegalAccessException e) {
-                    throw new PersistenceException("Failed to load provider from META-INF/services", e);
                 } catch (Exception e) {
                     throw new PersistenceException("Failed to load provider from META-INF/services", e);
                 }
diff --git a/src/main/java/org/apache/geronimo/specs/jpa/PersistenceActivator.java b/src/main/java/org/apache/geronimo/specs/jpa/PersistenceActivator.java
deleted file mode 100644
index 1c4e123..0000000
--- a/src/main/java/org/apache/geronimo/specs/jpa/PersistenceActivator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.geronimo.specs.jpa;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-import javax.persistence.spi.PersistenceProvider;
-import javax.persistence.spi.PersistenceProviderResolver;
-import javax.persistence.spi.PersistenceProviderResolverHolder;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.apache.geronimo.osgi.locator.Activator;
-
-/**
- * Used to discover/resolve JPA providers in an OSGi environment.
- *
- * @version $Rev$ $Date$
- */
-public class PersistenceActivator extends Activator implements BundleActivator, PersistenceProviderResolver {
-
-    public static final String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName();
-
-    private Map<String, PersistenceProvider> providers = new WeakHashMap<String, PersistenceProvider>();
-    private BundleContext ctx = null;
-    private ServiceTracker tracker = null;
-
-    /* (non-Javadoc)
-     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-     */
-    public void start(BundleContext arg0) throws Exception {
-        super.start(arg0);
-        // bundle context for later ServiceReference lookups
-        ctx = arg0;
-
-        // track providers as they register themselves
-        ServiceTrackerCustomizer customizer = new PersistenceTracker(this);
-        tracker = new ServiceTracker(ctx, PERSISTENCE_PROVIDER, customizer);
-        tracker.open();
-
-        // configure JPA provider resolver for OSGi
-        PersistenceProviderResolverHolder.setPersistenceProviderResolver(this);
-    }
-
-    /* (non-Javadoc)
-     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(BundleContext arg0) throws Exception {
-        // cleanup provider tracker
-        tracker.close();
-        tracker = null;
-
-        // cleanup providers and remove ourselves as a JPA provider resolver
-        PersistenceProviderResolverHolder.setPersistenceProviderResolver(null);
-        providers.clear();
-
-        // cleanup context
-        ctx = null;
-
-        super.stop(arg0);
-    }
-
-
-    /* (non-Javadoc)
-     * @see javax.persistence.spi.PersistenceProviderResolver#clearCachedProviders()
-     */
-    public void clearCachedProviders() {
-        // no-op - handled by stop() in OSGi environment
-    }
-
-    /* (non-Javadoc)
-     * @see javax.persistence.spi.PersistenceProviderResolver#getPersistenceProviders()
-     */
-    public List<PersistenceProvider> getPersistenceProviders() {
-        return new ArrayList<PersistenceProvider>(providers.values());
-    }
-
-    protected PersistenceProvider addProvider(ServiceReference ref) {
-        PersistenceProvider provider = (PersistenceProvider) ctx.getService(ref);
-        String name = (String) ref.getProperty(PERSISTENCE_PROVIDER);
-        providers.put(name, provider);
-        return provider;
-    }
-
-    protected void removeProvider(ServiceReference ref) {
-        String name = (String) ref.getProperty(PERSISTENCE_PROVIDER);
-        providers.remove(name);
-    }
-
-}
diff --git a/src/main/java/org/apache/geronimo/specs/jpa/PersistenceTracker.java b/src/main/java/org/apache/geronimo/specs/jpa/PersistenceTracker.java
deleted file mode 100644
index b71692c..0000000
--- a/src/main/java/org/apache/geronimo/specs/jpa/PersistenceTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.geronimo.specs.jpa;
-
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-
-/**
- * Used to track JPA service providers in an OSGi environment.
- *
- * @version $Rev$ $Date$
- */
-public class PersistenceTracker implements ServiceTrackerCustomizer {
-
-    private PersistenceActivator activator;
-    
-    public PersistenceTracker(PersistenceActivator activator) {
-        this.activator = activator;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
-     */
-    public Object addingService(ServiceReference arg0) {
-        return activator.addProvider(arg0);
-    }
-
-    /* (non-Javadoc)
-     * @see org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
-     */
-    public void modifiedService(ServiceReference arg0, Object arg1) {
-        // handle as a remove - modify is unsupported
-        removedService(arg0, arg1);
-    }
-
-    /* (non-Javadoc)
-     * @see org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
-     */
-    public void removedService(ServiceReference arg0, Object arg1) {
-        activator.removeProvider(arg0);
-    }
-
-}
