[CDI] update to latest changes

Signed-off-by: Raymond Auge <rotty3000@apache.org>

git-svn-id: https://svn.apache.org/repos/asf/aries/trunk@1838899 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/cdi-extender/bnd.bnd b/cdi-extender/bnd.bnd
index 98cbcfe..c92c409 100644
--- a/cdi-extender/bnd.bnd
+++ b/cdi-extender/bnd.bnd
@@ -10,8 +10,8 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
-Conditional-Package: \
+-conditionalpackage: \
 	org.apache.felix.utils.extender,\
 	org.osgi.util.converter
 
--contract: JavaAnnotation, JavaCDI, JavaEL, JavaInject, JavaInterceptor
\ No newline at end of file
+-contract: *
diff --git a/cdi-extender/pom.xml b/cdi-extender/pom.xml
index 5614c49..76e95a0 100644
--- a/cdi-extender/pom.xml
+++ b/cdi-extender/pom.xml
@@ -92,10 +92,6 @@
 					<artifactId>jboss-ejb-api_3.2_spec</artifactId>
 				</exclusion>
 				<exclusion>
-					<groupId>org.jboss.spec.javax.el</groupId>
-					<artifactId>jboss-el-api_3.0_spec</artifactId>
-				</exclusion>
-				<exclusion>
 					<groupId>org.jboss.spec.javax.interceptor</groupId>
 					<artifactId>jboss-interceptors-api_1.2_spec</artifactId>
 				</exclusion>
@@ -131,6 +127,12 @@
 		</dependency>
 		<dependency>
 			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.namespace.service</artifactId>
+			<version>1.0.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
 			<artifactId>org.osgi.service.cdi</artifactId>
 			<version>1.0.0-SNAPSHOT</version>
 		</dependency>
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
index c6bef99..9e53ffc 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
@@ -26,8 +26,6 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Executors;
 
-import javax.enterprise.inject.spi.CDI;
-
 import org.apache.aries.cdi.container.internal.command.CDICommand;
 import org.apache.aries.cdi.container.internal.container.CDIBundle;
 import org.apache.aries.cdi.container.internal.container.ConfigurationListener;
@@ -41,16 +39,15 @@
 import org.apache.aries.cdi.container.internal.model.SingleActivator;
 import org.apache.aries.cdi.container.internal.model.SingleComponent;
 import org.apache.aries.cdi.container.internal.util.Logs;
-import org.apache.aries.cdi.provider.CDIProvider;
 import org.apache.felix.utils.extender.AbstractExtender;
 import org.apache.felix.utils.extender.Extension;
 import org.osgi.annotation.bundle.Header;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
-import org.osgi.framework.wiring.BundleRequirement;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.service.cdi.runtime.CDIComponentRuntime;
@@ -68,9 +65,10 @@
 @RequireConfigurationAdmin
 public class Activator extends AbstractExtender {
 
-	static {
-		CDI.setCDIProvider(new CDIProvider());
-	}
+	private static final Logs _logs = new Logs.Builder(FrameworkUtil.getBundle(Activator.class).getBundleContext()).build();
+	private static final Logger _log = _logs.getLogger(Activator.class);
+	private static final PromiseFactory _promiseFactory = new PromiseFactory(Executors.newFixedThreadPool(1));
+	public static final CCR ccr = new CCR(_promiseFactory, _logs);
 
 	public Activator() {
 		setSynchronous(true);
@@ -78,15 +76,11 @@
 
 	@Override
 	public void start(BundleContext bundleContext) throws Exception {
-		_logs = new Logs.Builder(bundleContext).build();
-		_log = _logs.getLogger(getClass());
-
 		if (_log.isDebugEnabled()) {
 			_log.debug("CCR starting {}", bundleContext.getBundle());
 		}
 
-		_ccr = new CCR(_promiseFactory, _logs);
-		_command = new CDICommand(_ccr);
+		_command = new CDICommand(ccr);
 
 		_bundleContext = bundleContext;
 
@@ -158,7 +152,7 @@
 			bundle, _bundleContext.getBundle(), _ccrChangeCount, _promiseFactory, caTracker, _logs);
 
 		// the CDI bundle
-		return new CDIBundle(_ccr, containerState,
+		return new CDIBundle(ccr, containerState,
 			// handle extensions
 			new ExtensionPhase(containerState,
 				// listen for configurations of the container component
@@ -187,10 +181,16 @@
 
 	@Override
 	protected void debug(Bundle bundle, String msg) {
+		if (_log.isDebugEnabled()) {
+			_log.debug(msg, bundle);
+		}
 	}
 
 	@Override
 	protected void warn(Bundle bundle, String msg, Throwable t) {
+		if (_log.isWarnEnabled()) {
+			_log.warn(msg, bundle, t);
+		}
 	}
 
 	@Override
@@ -213,15 +213,7 @@
 				Bundle providerWiringBundle = bundleWire.getProviderWiring().getBundle();
 
 				if (providerWiringBundle.equals(_bundleContext.getBundle())) {
-					BundleRequirement requirement = bundleWire.getRequirement();
-					Map<String, Object> requirementAttributes = requirement.getAttributes();
-
-					@SuppressWarnings("unchecked")
-					List<String> beans = (List<String>)requirementAttributes.get(REQUIREMENT_OSGI_BEANS_ATTRIBUTE);
-
-					if (beans != null && !beans.isEmpty()) {
-						return true;
-					}
+					return true;
 				}
 			}
 		}
@@ -229,16 +221,11 @@
 		return false;
 	}
 
-
 	private BundleContext _bundleContext;
-	private volatile CCR _ccr;
 	private final ChangeCount _ccrChangeCount = new ChangeCount();
 	private ServiceRegistration<CDIComponentRuntime> _ccrRegistration;
 	private volatile CDICommand _command;
 	private ServiceRegistration<?> _commandRegistration;
-	private volatile Logs _logs;
-	private volatile Logger _log;
-	private final PromiseFactory _promiseFactory = new PromiseFactory(Executors.newFixedThreadPool(1));
 
 	private class ChangeObserverFactory implements Observer, ServiceFactory<CDIComponentRuntime> {
 
@@ -249,7 +236,7 @@
 
 			_registrations.add(registration);
 
-			return _ccr;
+			return ccr;
 		}
 
 		@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
index 5e07033..448da2c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
@@ -73,6 +73,10 @@
 		);
 	}
 
+	public ContainerState getContainerState(Bundle bundle) {
+		return _states.get(bundle);
+	}
+
 	public void remove(Bundle bundle) {
 		_states.remove(bundle);
 	}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
index aff706d..8398326 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
@@ -47,12 +47,14 @@
 import org.jboss.weld.serialization.spi.ProxyServices;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
 import org.osgi.framework.dto.BundleDTO;
 import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRequirement;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
+import org.osgi.resource.Namespace;
 import org.osgi.service.cdi.ComponentType;
 import org.osgi.service.cdi.ConfigurationPolicy;
 import org.osgi.service.cdi.MaximumCardinality;
@@ -73,7 +75,6 @@
 		private static final long serialVersionUID = 1L;
 	};
 
-	@SuppressWarnings("unchecked")
 	public ContainerState(
 		Bundle bundle,
 		Bundle extenderBundle,
@@ -112,6 +113,28 @@
 			}
 		}
 
+		wires = bundleWiring.getRequiredWires(CDI_EXTENSION_PROPERTY);
+
+		List<String> extensionRequirements = new ArrayList<>();
+
+		for (BundleWire wire : wires) {
+			String filter = wire.getRequirement().getDirectives().get(
+				Namespace.REQUIREMENT_FILTER_DIRECTIVE);
+			Bundle extensionProvider = wire.getProvider().getBundle();
+
+			StringBuilder sb = new StringBuilder();
+
+			sb.append("(&");
+			sb.append(filter);
+			sb.append("(");
+			sb.append(Constants.SERVICE_BUNDLEID);
+			sb.append("=");
+			sb.append(extensionProvider.getBundleId());
+			sb.append("))");
+
+			extensionRequirements.add(sb.toString());
+		}
+
 		_containerDTO = new ContainerDTO();
 		_containerDTO.bundle = _bundle.adapt(BundleDTO.class);
 		_containerDTO.changeCount = _changeCount.get();
@@ -127,24 +150,20 @@
 			_bundle.getSymbolicName()
 		);
 
-		Optional.ofNullable(
-			(List<String>)cdiAttributes.get(REQUIREMENT_EXTENSIONS_ATTRIBUTE)
-		).ifPresent(
-			list -> list.stream().forEach(
-				extensionFilter -> {
-					ExtendedExtensionTemplateDTO extensionTemplateDTO = new ExtendedExtensionTemplateDTO();
+		extensionRequirements.forEach(
+			extensionFilter -> {
+				ExtendedExtensionTemplateDTO extensionTemplateDTO = new ExtendedExtensionTemplateDTO();
 
-					try {
-						extensionTemplateDTO.filter = asFilter(extensionFilter);
-						extensionTemplateDTO.serviceFilter = extensionFilter;
+				try {
+					extensionTemplateDTO.filter = asFilter(extensionFilter);
+					extensionTemplateDTO.serviceFilter = extensionFilter;
 
-						_containerDTO.template.extensions.add(extensionTemplateDTO);
-					}
-					catch (Exception e) {
-						_containerDTO.errors.add(Throw.asString(e));
-					}
+					_containerDTO.template.extensions.add(extensionTemplateDTO);
 				}
-			)
+				catch (Exception e) {
+					_containerDTO.errors.add(Throw.asString(e));
+				}
+			}
 		);
 
 		_containerComponentTemplateDTO = new ComponentTemplateDTO();
@@ -185,6 +204,8 @@
 
 			_containerDTO.errors.add(Throw.asString(e));
 		}
+
+		_beanManagerDeferred = _promiseFactory.deferred();
 	}
 
 	public <T, R> Promise<R> addCallback(CheckedCallback<T, R> checkedCallback) {
@@ -194,11 +215,18 @@
 	}
 
 	public BeanManager beanManager() {
-		return _beanManager;
+		try {
+			return _beanManagerDeferred.getPromise().timeout(5000).getValue();
+		} catch (InvocationTargetException | InterruptedException e) {
+			return Throw.exception(e);
+		}
 	}
 
 	public void beanManager(BeanManager beanManager) {
-		_beanManager = beanManager;
+		if (_beanManagerDeferred.getPromise().isDone()) {
+			_beanManagerDeferred = _promiseFactory.deferred();
+		}
+		_beanManagerDeferred.resolve(beanManager);
 	}
 
 	public BeansModel beansModel() {
@@ -371,7 +399,7 @@
 	}
 
 	private final ClassLoader _aggregateClassLoader;
-	private volatile BeanManager _beanManager;
+	private volatile Deferred<BeanManager> _beanManagerDeferred;
 	private final BeansModel _beansModel;
 	private final Bundle _bundle;
 	private final ClassLoader _bundleClassLoader;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java
index 091f075..dd98744 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java
@@ -50,7 +50,7 @@
 		List<URL> beanDescriptorURLs = new ArrayList<URL>();
 		Map<String, Object> attributes = getAttributes();
 
-		List<String> beanDescriptorPaths = cast(attributes.get(REQUIREMENT_BEANS_ATTRIBUTE));
+		List<String> beanDescriptorPaths = cast(attributes.get(REQUIREMENT_DESCRIPTOR_ATTRIBUTE));
 
 		if (beanDescriptorPaths != null) {
 			for (String descriptorPath : beanDescriptorPaths) {
@@ -64,7 +64,7 @@
 
 		@SuppressWarnings("unchecked")
 		List<String> beanClassNames = Optional.ofNullable(
-			_attributes.get(REQUIREMENT_OSGI_BEANS_ATTRIBUTE)
+			_attributes.get(REQUIREMENT_BEANS_ATTRIBUTE)
 		).map(v -> (List<String>)v).orElse(Collections.emptyList());
 
 		Map<String, OSGiBean> beans = new HashMap<>();
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/provider/CDIProvider.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
similarity index 62%
rename from cdi-extender/src/main/java/org/apache/aries/cdi/provider/CDIProvider.java
rename to cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
index 661aca3..c350c0c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/provider/CDIProvider.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
@@ -12,23 +12,21 @@
  * limitations under the License.
  */
 
-package org.apache.aries.cdi.provider;
+package org.apache.aries.cdi.container.internal.provider;
 
 import java.lang.annotation.Annotation;
+import java.util.Collections;
 import java.util.Iterator;
+import java.util.Optional;
 
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.CDI;
 import javax.enterprise.util.TypeLiteral;
 
-import org.apache.aries.cdi.container.internal.util.Filters;
-import org.jboss.weld.exceptions.IllegalStateException;
+import org.apache.aries.cdi.container.internal.Activator;
 import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleReference;
-import org.osgi.framework.Filter;
-import org.osgi.util.tracker.ServiceTracker;
 
 public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
 
@@ -36,12 +34,12 @@
 
 		@Override
 		public void destroy(Object instance) {
-			throw new UnsupportedOperationException();
+			// NOOP
 		}
 
 		@Override
 		public Object get() {
-			throw new UnsupportedOperationException();
+			return this;
 		}
 
 		@Override
@@ -52,57 +50,46 @@
 				BundleReference br = (BundleReference)contextClassLoader;
 
 				Bundle bundle = br.getBundle();
-				BundleContext bundleContext = bundle.getBundleContext();
 
-				Filter filter = Filters.asFilter(
-					"(&(objectClass=%s)(service.bundleid=%d))",
-					BeanManager.class.getName(), bundle.getBundleId());
-
-				ServiceTracker<BeanManager, BeanManager> bmt = new ServiceTracker<>(
-					bundleContext, filter, null);
-
-				bmt.open();
-
-				try {
-					return bmt.waitForService(1000);
-				}
-				catch (InterruptedException e) {
-					return null;
-				}
+				return Optional.ofNullable(
+					Activator.ccr.getContainerState(bundle)
+				).map(
+					cs -> cs.beanManager()
+				).orElse(null);
 			}
 
 			throw new IllegalStateException(
-				"This method can only be used when the Thread context classloader has been set to a bundle's classloader.");
+				"This method can only be used when the Thread context class loader has been set to a Bundle's classloader.");
 		}
 
 		@Override
 		public boolean isAmbiguous() {
-			throw new UnsupportedOperationException();
+			return false;
 		}
 
 		@Override
 		public boolean isUnsatisfied() {
-			throw new UnsupportedOperationException();
+			return false;
 		}
 
 		@Override
 		public Iterator<Object> iterator() {
-			throw new UnsupportedOperationException();
+			return Collections.singleton((Object)this).iterator();
 		}
 
 		@Override
 		public Instance<Object> select(Annotation... qualifiers) {
-			throw new UnsupportedOperationException();
+			return getBeanManager().createInstance().select(qualifiers);
 		}
 
 		@Override
 		public <U> Instance<U> select(Class<U> subtype, Annotation... qualifiers) {
-			throw new UnsupportedOperationException();
+			return getBeanManager().createInstance().select(subtype, qualifiers);
 		}
 
 		@Override
 		public <U> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
-			throw new UnsupportedOperationException();
+			return getBeanManager().createInstance().select(subtype, qualifiers);
 		}
 
 	}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/SeContainerInitializer.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/SeContainerInitializer.java
new file mode 100644
index 0000000..1c33bf4
--- /dev/null
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/SeContainerInitializer.java
@@ -0,0 +1,111 @@
+/**
+ * Licensed 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.aries.cdi.container.internal.provider;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.spi.Extension;
+
+public class SeContainerInitializer extends javax.enterprise.inject.se.SeContainerInitializer {
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addBeanClasses(Class<?>... classes) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addPackages(Class<?>... packageClasses) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addPackages(
+		boolean scanRecursively, Class<?>... packageClasses) {
+
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addPackages(Package... packages) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addPackages(boolean scanRecursively, Package... packages) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addExtensions(Extension... extensions) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public javax.enterprise.inject.se.SeContainerInitializer addExtensions(Class<? extends Extension>... extensions) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer enableInterceptors(Class<?>... interceptorClasses) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer enableDecorators(Class<?>... decoratorClasses) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer selectAlternatives(Class<?>... alternativeClasses) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	@SuppressWarnings("unchecked")
+	public javax.enterprise.inject.se.SeContainerInitializer selectAlternativeStereotypes(
+		Class<? extends Annotation>... alternativeStereotypeClasses) {
+
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer addProperty(String key, Object value) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer setProperties(Map<String, Object> properties) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer disableDiscovery() {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public javax.enterprise.inject.se.SeContainerInitializer setClassLoader(ClassLoader classLoader) {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+	@Override
+	public SeContainer initialize() {
+		throw new UnsupportedOperationException("This API is not supported in OSGi");
+	}
+
+}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java
new file mode 100644
index 0000000..29473bf
--- /dev/null
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/package-info.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed 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.
+ */
+
+@Capability(
+	name = CDIConstants.CDI_CAPABILITY_NAME,
+	namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
+	uses = {
+		org.osgi.service.cdi.ServiceScope.class,
+		org.osgi.service.cdi.annotations.Reference.class,
+		org.osgi.service.cdi.reference.BindService.class,
+		org.osgi.service.cdi.runtime.CDIComponentRuntime.class,
+		org.osgi.service.cdi.runtime.dto.ActivationDTO.class,
+		org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO.class
+	},
+	version = CDIConstants.CDI_SPECIFICATION_VERSION
+)
+@Capability(
+	name = CDIConstants.CDI_CAPABILITY_NAME,
+	namespace = ImplementationNamespace.IMPLEMENTATION_NAMESPACE,
+	uses = {
+		org.osgi.service.cdi.ServiceScope.class,
+		org.osgi.service.cdi.annotations.Reference.class,
+		org.osgi.service.cdi.reference.BindService.class,
+		org.osgi.service.cdi.runtime.CDIComponentRuntime.class,
+		org.osgi.service.cdi.runtime.dto.ActivationDTO.class,
+		org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO.class
+	},
+	version = CDIConstants.CDI_SPECIFICATION_VERSION
+)
+@Capability(
+	namespace = ServiceNamespace.SERVICE_NAMESPACE,
+	attribute = "objectClass:List<String>=javax.enterprise.inject.spi.BeanManager",
+	uses = {
+		javax.el.Expression.class,
+		javax.enterprise.context.ApplicationScoped.class,
+		javax.enterprise.context.spi.Context.class,
+		javax.enterprise.event.Event.class,
+		javax.enterprise.inject.Any.class,
+		javax.enterprise.inject.spi.Annotated.class,
+		javax.enterprise.util.TypeLiteral.class
+	}
+)
+@Capability(
+	namespace = ServiceNamespace.SERVICE_NAMESPACE,
+	attribute = "objectClass:List<String>=org.osgi.service.cdi.runtime.CDIComponentRuntime",
+	uses = {
+		org.osgi.service.cdi.runtime.CDIComponentRuntime.class,
+		org.osgi.service.cdi.runtime.dto.ContainerDTO.class,
+		org.osgi.service.cdi.runtime.dto.template.ContainerTemplateDTO.class
+	}
+)
+@Capability(
+	namespace = "osgi.serviceloader",
+	name = "javax.enterprise.inject.se.SeContainerInitializer",
+	uses = {
+		javax.enterprise.inject.se.SeContainerInitializer.class,
+		javax.enterprise.inject.spi.CDI.class
+	}
+)
+@Capability(
+	namespace = "osgi.serviceloader",
+	name = "javax.enterprise.inject.spi.CDIProvider",
+	uses = {
+		javax.enterprise.inject.Any.class,
+		javax.enterprise.inject.spi.Annotated.class,
+		javax.enterprise.util.TypeLiteral.class
+	}
+)
+@Requirement(
+	namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
+	name = "osgi.serviceloader.registrar"
+)
+package org.apache.aries.cdi.container;
+
+import org.osgi.annotation.bundle.Capability;
+import org.osgi.annotation.bundle.Requirement;
+import org.osgi.namespace.extender.ExtenderNamespace;
+import org.osgi.namespace.implementation.ImplementationNamespace;
+import org.osgi.namespace.service.ServiceNamespace;
+import org.osgi.service.cdi.CDIConstants;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/provider/package-info.java b/cdi-extender/src/main/java/org/apache/aries/cdi/provider/package-info.java
deleted file mode 100644
index 5d901af..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/provider/package-info.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Licensed 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.
- */
-
-@Capability(
-	name = CDIConstants.CDI_CAPABILITY_NAME,
-	namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
-	uses = {
-		org.osgi.service.cdi.ServiceScope.class,
-		org.osgi.service.cdi.annotations.Reference.class,
-		org.osgi.service.cdi.reference.BindService.class,
-		org.osgi.service.cdi.runtime.CDIComponentRuntime.class,
-		org.osgi.service.cdi.runtime.dto.ActivationDTO.class,
-		org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO.class
-	},
-	version = CDIConstants.CDI_SPECIFICATION_VERSION
-)
-@Capability(
-	name = CDIConstants.CDI_CAPABILITY_NAME,
-	namespace = ImplementationNamespace.IMPLEMENTATION_NAMESPACE,
-	uses = {
-		org.osgi.service.cdi.ServiceScope.class,
-		org.osgi.service.cdi.annotations.Reference.class,
-		org.osgi.service.cdi.reference.BindService.class,
-		org.osgi.service.cdi.runtime.CDIComponentRuntime.class,
-		org.osgi.service.cdi.runtime.dto.ActivationDTO.class,
-		org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO.class
-	},
-	version = CDIConstants.CDI_SPECIFICATION_VERSION
-)
-@Export
-@Version("1.0.0")
-package org.apache.aries.cdi.provider;
-
-import org.osgi.annotation.bundle.Capability;
-import org.osgi.annotation.bundle.Export;
-import org.osgi.annotation.versioning.Version;
-import org.osgi.namespace.extender.ExtenderNamespace;
-import org.osgi.namespace.implementation.ImplementationNamespace;
-import org.osgi.service.cdi.CDIConstants;
diff --git a/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.se.SeContainerInitializer b/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.se.SeContainerInitializer
new file mode 100644
index 0000000..01119f8
--- /dev/null
+++ b/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.se.SeContainerInitializer
@@ -0,0 +1,13 @@
+# Licensed 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.
+
+org.apache.aries.cdi.container.internal.provider.SeContainerInitializer
\ No newline at end of file
diff --git a/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.spi.CDIProvider b/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.spi.CDIProvider
new file mode 100644
index 0000000..77348d0
--- /dev/null
+++ b/cdi-extender/src/main/resources/META-INF/services/javax.enterprise.inject.spi.CDIProvider
@@ -0,0 +1,13 @@
+# Licensed 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.
+
+org.apache.aries.cdi.container.internal.provider.CDIProvider
\ No newline at end of file
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/CDIBundlePhaseTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/CDIBundlePhaseTest.java
index 28e5974..6a92a02 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/CDIBundlePhaseTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/CDIBundlePhaseTest.java
@@ -18,6 +18,7 @@
 import static org.mockito.Mockito.*;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,8 +28,12 @@
 import org.apache.aries.cdi.container.test.BaseCDIBundleTest;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.wiring.BundleRequirement;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.namespace.extender.ExtenderNamespace;
+import org.osgi.resource.Namespace;
 import org.osgi.service.cdi.CDIConstants;
 import org.osgi.service.cdi.runtime.dto.ContainerDTO;
 
@@ -70,8 +75,7 @@
 	public void extensions_simple() throws Exception {
 		Map<String, Object> attributes = new HashMap<>();
 
-		attributes.put(CDIConstants.REQUIREMENT_EXTENSIONS_ATTRIBUTE, Arrays.asList("(foo=name)", "(fum=bar)"));
-		attributes.put(CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+		attributes.put(CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.BarAnnotated",
 				"org.apache.aries.cdi.container.test.beans.FooAnnotated",
@@ -86,6 +90,44 @@
 						0).getRequirement().getAttributes()
 		).thenReturn(attributes);
 
+		BundleWire wire0 = mock(BundleWire.class);
+		BundleRequirement req0 = mock(BundleRequirement.class);
+		BundleRevision rev0 = mock(BundleRevision.class);
+		BundleWire wire1 = mock(BundleWire.class);
+		BundleRequirement req1 = mock(BundleRequirement.class);
+		BundleRevision rev1 = mock(BundleRevision.class);
+
+		when(
+			bundle.adapt(
+				BundleWiring.class).getRequiredWires(CDIConstants.CDI_EXTENSION_PROPERTY)
+		).thenReturn(Arrays.asList(wire0, wire1));
+
+		when(
+			wire0.getRequirement()
+		).thenReturn(req0);
+		when(
+			wire0.getProvider()
+		).thenReturn(rev0);
+		when(
+			rev0.getBundle()
+		).thenReturn(bundle);
+		when(
+			req0.getDirectives()
+		).thenReturn(Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(foo=name)"));
+
+		when(
+			wire1.getRequirement()
+		).thenReturn(req1);
+		when(
+			wire1.getProvider()
+		).thenReturn(rev1);
+		when(
+			rev1.getBundle()
+		).thenReturn(bundle);
+		when(
+			req1.getDirectives()
+		).thenReturn(Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(fum=bar)"));
+
 		ContainerState containerState = new ContainerState(bundle, ccrBundle, ccrChangeCount, promiseFactory, null, new Logs.Builder(bundle.getBundleContext()).build());
 
 		CDIBundle cdiBundle = new CDIBundle(ccr, containerState, null);
@@ -111,8 +153,8 @@
 		assertNotNull(containerDTO.template);
 		assertEquals(2, containerDTO.template.components.size());
 		assertEquals(2, containerDTO.template.extensions.size());
-		assertEquals("(foo=name)", containerDTO.template.extensions.get(0).serviceFilter);
-		assertEquals("(fum=bar)", containerDTO.template.extensions.get(1).serviceFilter);
+		assertEquals("(&(foo=name)(service.bundleid=1))", containerDTO.template.extensions.get(0).serviceFilter);
+		assertEquals("(&(fum=bar)(service.bundleid=1))", containerDTO.template.extensions.get(1).serviceFilter);
 		assertEquals("foo", containerDTO.template.id);
 
 		cdiBundle.destroy();
@@ -122,8 +164,6 @@
 	public void extensions_invalidsyntax() throws Exception {
 		Map<String, Object> attributes = new HashMap<>();
 
-		attributes.put(CDIConstants.REQUIREMENT_EXTENSIONS_ATTRIBUTE, Arrays.asList("(foo=name)", "fum=bar)"));
-
 		when(
 			bundle.adapt(
 				BundleWiring.class).getRequiredWires(
@@ -131,6 +171,44 @@
 						0).getRequirement().getAttributes()
 		).thenReturn(attributes);
 
+		BundleWire wire0 = mock(BundleWire.class);
+		BundleRequirement req0 = mock(BundleRequirement.class);
+		BundleRevision rev0 = mock(BundleRevision.class);
+		BundleWire wire1 = mock(BundleWire.class);
+		BundleRequirement req1 = mock(BundleRequirement.class);
+		BundleRevision rev1 = mock(BundleRevision.class);
+
+		when(
+			bundle.adapt(
+				BundleWiring.class).getRequiredWires(CDIConstants.CDI_EXTENSION_PROPERTY)
+		).thenReturn(Arrays.asList(wire0, wire1));
+
+		when(
+			wire0.getRequirement()
+		).thenReturn(req0);
+		when(
+			wire0.getProvider()
+		).thenReturn(rev0);
+		when(
+			rev0.getBundle()
+		).thenReturn(bundle);
+		when(
+			req0.getDirectives()
+		).thenReturn(Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(foo=name)"));
+
+		when(
+			wire1.getRequirement()
+		).thenReturn(req1);
+		when(
+			wire1.getProvider()
+		).thenReturn(rev1);
+		when(
+			rev1.getBundle()
+		).thenReturn(bundle);
+		when(
+			req1.getDirectives()
+		).thenReturn(Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "fum=bar)"));
+
 		ContainerState containerState = new ContainerState(bundle, ccrBundle, ccrChangeCount, promiseFactory, null, new Logs.Builder(bundle.getBundleContext()).build());
 
 		CDIBundle cdiBundle = new CDIBundle(ccr, containerState, null);
@@ -153,7 +231,7 @@
 		assertFalse(containerDTO.errors + "", containerDTO.errors.isEmpty());
 		assertEquals(1, containerDTO.errors.size());
 		assertFalse(containerDTO.template.extensions.isEmpty());
-		assertEquals("(foo=name)", containerDTO.template.extensions.get(0).serviceFilter);
+		assertEquals("(&(foo=name)(service.bundleid=1))", containerDTO.template.extensions.get(0).serviceFilter);
 
 		cdiBundle.destroy();
 	}
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
index 5956f8c..74b70db 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
@@ -52,7 +52,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				FooService.class.getName()
 			)
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
index ba7a598..6cde5e7 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
@@ -249,7 +249,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.Reference_S_R_M_U_Service"
 			)
@@ -391,7 +391,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.Reference_D_R_M_U_Service"
 			)
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
index 20f7589..c3e7a98 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
@@ -20,8 +20,7 @@
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.Collections;
 
 import javax.enterprise.inject.spi.Extension;
 
@@ -38,8 +37,11 @@
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
+import org.osgi.framework.wiring.BundleRequirement;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
-import org.osgi.namespace.extender.ExtenderNamespace;
+import org.osgi.resource.Namespace;
 import org.osgi.service.cdi.CDIConstants;
 import org.osgi.service.cdi.runtime.dto.ContainerDTO;
 import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
@@ -49,15 +51,26 @@
 
 	@Test
 	public void extensions_tracking() throws Exception {
-		Map<String, Object> attributes = new HashMap<>();
-		attributes.put(CDIConstants.REQUIREMENT_EXTENSIONS_ATTRIBUTE, Arrays.asList("(foo=name)"));
+		BundleWire wire0 = mock(BundleWire.class);
+		BundleRequirement req0 = mock(BundleRequirement.class);
+		BundleRevision rev0 = mock(BundleRevision.class);
 
 		when(
 			bundle.adapt(
-				BundleWiring.class).getRequiredWires(
-					ExtenderNamespace.EXTENDER_NAMESPACE).get(
-						0).getRequirement().getAttributes()
-		).thenReturn(attributes);
+				BundleWiring.class).getRequiredWires(CDIConstants.CDI_EXTENSION_PROPERTY)
+		).thenReturn(Arrays.asList(wire0));
+		when(
+			wire0.getRequirement()
+		).thenReturn(req0);
+		when(
+			wire0.getProvider()
+		).thenReturn(rev0);
+		when(
+			rev0.getBundle()
+		).thenReturn(bundle);
+		when(
+			req0.getDirectives()
+		).thenReturn(Collections.singletonMap(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(foo=name)"));
 
 		ContainerState containerState = new ContainerState(bundle, ccrBundle, ccrChangeCount, promiseFactory, null, new Logs.Builder(bundle.getBundleContext()).build());
 
@@ -86,7 +99,7 @@
 
 		assertNotNull(containerDTO.template);
 		assertEquals(1, containerDTO.template.extensions.size());
-		assertEquals("(foo=name)", containerDTO.template.extensions.get(0).serviceFilter);
+		assertEquals("(&(foo=name)(service.bundleid=1))", containerDTO.template.extensions.get(0).serviceFilter);
 
 		final MockServiceRegistration<Extension> regA = cast(bundle.getBundleContext().registerService(
 			Extension.class, new Extension(){}, Maps.dict("foo", "name")));
@@ -97,7 +110,7 @@
 			TestUtil.serviceListeners.stream().filter(
 				en -> en.getValue().matches(
 					Maps.of(Constants.OBJECTCLASS, Extension.class.getName(),
-					"foo", "name"))
+					"foo", "name", Constants.SERVICE_BUNDLEID, bundle.getBundleId()))
 			).map(
 				en -> en.getKey()
 			).findFirst().ifPresent(
@@ -105,9 +118,9 @@
 			);
 
 			Thread.sleep(10);
-		} while(!slD.getPromise().isDone());
+		} while(!slD.getPromise().timeout(500).isDone());
 
-		slD.getPromise().thenAccept(
+		slD.getPromise().timeout(500).thenAccept(
 			sl -> {
 				assertEquals(2, containerState.containerDTO().changeCount);
 				assertEquals(1, containerState.containerDTO().extensions.size());
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
index 800dd66..d854f66 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/TemplatesTests.java
@@ -107,7 +107,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.BarAnnotated",
 				"org.apache.aries.cdi.container.test.beans.BarProducer",
@@ -192,7 +192,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.BarAnnotated",
 				"org.apache.aries.cdi.container.test.beans.BarProducer",
@@ -411,7 +411,7 @@
 		Map<String, Object> attributes = new HashMap<>();
 
 		attributes.put(
-			CDIConstants.REQUIREMENT_OSGI_BEANS_ATTRIBUTE,
+			CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 			Arrays.asList(
 				"org.apache.aries.cdi.container.test.beans.BarAnnotated",
 				"org.apache.aries.cdi.container.test.beans.FooAnnotated",
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/BaseCDIBundleTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/BaseCDIBundleTest.java
index 1aa33ed..820e047 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/BaseCDIBundleTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/BaseCDIBundleTest.java
@@ -93,7 +93,7 @@
 				when(extenderWire.getRequirement()).thenReturn(extenderRequirement);
 				when(extenderRequirement.getAttributes()).thenReturn(
 					Maps.of(
-						"osgi.beans",
+						CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE,
 						Arrays.asList(
 							"org.apache.aries.cdi.container.test.beans.BarAnnotated",
 							"org.apache.aries.cdi.container.test.beans.FooAnnotated",
diff --git a/cdi-extension-http/bnd.bnd b/cdi-extension-http/bnd.bnd
index 9e6f4f7..b004d8f 100644
--- a/cdi-extension-http/bnd.bnd
+++ b/cdi-extension-http/bnd.bnd
@@ -10,4 +10,4 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
--contract: JavaAnnotation, JavaCDI, JavaServlet
\ No newline at end of file
+-contract: *
\ No newline at end of file
diff --git a/cdi-extension-http/pom.xml b/cdi-extension-http/pom.xml
index 52c176d..566f482 100644
--- a/cdi-extension-http/pom.xml
+++ b/cdi-extension-http/pom.xml
@@ -96,7 +96,7 @@
 		<dependency>
 			<groupId>org.osgi</groupId>
 			<artifactId>org.osgi.service.http.whiteboard</artifactId>
-			<version>1.0.0</version>
+			<version>1.1.0</version>
 			<scope>provided</scope>
 		</dependency>
 		<dependency>
diff --git a/cdi-extension-http/src/main/java/org/apache/aries/cdi/extension/http/HttpActivator.java b/cdi-extension-http/src/main/java/org/apache/aries/cdi/extension/http/HttpActivator.java
index 2efdbbb..5c4e563 100644
--- a/cdi-extension-http/src/main/java/org/apache/aries/cdi/extension/http/HttpActivator.java
+++ b/cdi-extension-http/src/main/java/org/apache/aries/cdi/extension/http/HttpActivator.java
@@ -28,17 +28,47 @@
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.namespace.implementation.ImplementationNamespace;
 import org.osgi.namespace.service.ServiceNamespace;
+import org.osgi.service.cdi.CDIConstants;
 import org.osgi.service.cdi.annotations.RequireCDIImplementation;
 
 @Capability(
-	attribute = {
-		"objectClass:List<String>=javax.enterprise.inject.spi.Extension",
-		"osgi.cdi.extension=aries.cdi.http"},
-	namespace = ServiceNamespace.SERVICE_NAMESPACE
+	attribute = "objectClass:List<String>=javax.enterprise.inject.spi.Extension",
+	namespace = ServiceNamespace.SERVICE_NAMESPACE,
+	uses= {
+		javax.annotation.Priority.class,
+		javax.enterprise.context.Initialized.class,
+		javax.enterprise.event.Observes.class,
+		javax.enterprise.inject.spi.Extension.class,
+		javax.naming.Context.class,
+		javax.naming.spi.ObjectFactory.class,
+		javax.servlet.ServletContextListener.class,
+		javax.servlet.http.HttpSessionListener.class,
+		org.jboss.weld.module.web.servlet.WeldInitialListener.class,
+		org.osgi.service.cdi.CDIConstants.class,
+		org.osgi.service.http.whiteboard.HttpWhiteboardConstants.class,
+	}
+)
+@Capability(
+	name = "aries.cdi.http",
+	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
+	uses= {
+		javax.annotation.Priority.class,
+		javax.enterprise.context.Initialized.class,
+		javax.enterprise.event.Observes.class,
+		javax.enterprise.inject.spi.Extension.class,
+		javax.naming.Context.class,
+		javax.naming.spi.ObjectFactory.class,
+		javax.servlet.ServletContextListener.class,
+		javax.servlet.http.HttpSessionListener.class,
+		org.jboss.weld.module.web.servlet.WeldInitialListener.class,
+		org.osgi.service.cdi.CDIConstants.class,
+		org.osgi.service.http.whiteboard.HttpWhiteboardConstants.class,
+	},
+	version = "0.0.2"
 )
 @Header(
 	name = Constants.BUNDLE_ACTIVATOR,
-	value = "org.apache.aries.cdi.extension.http.HttpActivator"
+	value = "${@class}"
 )
 @Requirement(
 	name = "osgi.http",
@@ -51,7 +81,7 @@
 	@Override
 	public void start(BundleContext context) throws Exception {
 		Dictionary<String, Object> properties = new Hashtable<>();
-		properties.put("osgi.cdi.extension", "aries.cdi.http");
+		properties.put(CDIConstants.CDI_EXTENSION_PROPERTY, "aries.cdi.http");
 		_serviceRegistration = context.registerService(
 			Extension.class, new HttpExtensionFactory(), properties);
 	}
diff --git a/cdi-extension-jndi/bnd.bnd b/cdi-extension-jndi/bnd.bnd
index 7c0d221..b004d8f 100644
--- a/cdi-extension-jndi/bnd.bnd
+++ b/cdi-extension-jndi/bnd.bnd
@@ -10,4 +10,4 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
--contract: JavaCDI
\ No newline at end of file
+-contract: *
\ No newline at end of file
diff --git a/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiActivator.java b/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiActivator.java
index b65de4b..767020f 100644
--- a/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiActivator.java
+++ b/cdi-extension-jndi/src/main/java/org/apache/aries/cdi/extension/jndi/JndiActivator.java
@@ -34,14 +34,39 @@
 import org.osgi.util.tracker.ServiceTracker;
 
 @Capability(
-	attribute = {
-		"objectClass:List<String>=javax.enterprise.inject.spi.Extension",
-		"osgi.cdi.extension=aries.cdi.jndi"},
-	namespace = ServiceNamespace.SERVICE_NAMESPACE
+	attribute = "objectClass:List<String>=javax.enterprise.inject.spi.Extension",
+	namespace = ServiceNamespace.SERVICE_NAMESPACE,
+	uses= {
+		javax.enterprise.context.Initialized.class,
+		javax.enterprise.event.Observes.class,
+		javax.enterprise.inject.spi.Extension.class,
+		javax.naming.Context.class,
+		javax.naming.spi.ObjectFactory.class,
+		org.osgi.service.cdi.CDIConstants.class,
+		org.osgi.service.jndi.JNDIConstants.class,
+		org.osgi.service.log.LoggerFactory.class,
+		org.osgi.util.promise.Promise.class
+	}
+)
+@Capability(
+	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
+	name = "aries.cdi.jndi",
+	uses= {
+		javax.enterprise.context.Initialized.class,
+		javax.enterprise.event.Observes.class,
+		javax.enterprise.inject.spi.Extension.class,
+		javax.naming.Context.class,
+		javax.naming.spi.ObjectFactory.class,
+		org.osgi.service.cdi.CDIConstants.class,
+		org.osgi.service.jndi.JNDIConstants.class,
+		org.osgi.service.log.LoggerFactory.class,
+		org.osgi.util.promise.Promise.class
+	},
+	version = "0.0.2"
 )
 @Header(
 	name = Constants.BUNDLE_ACTIVATOR,
-	value = "org.apache.aries.cdi.extension.jndi.JndiActivator"
+	value = "${@class}"
 )
 @RequireCDIImplementation
 public class JndiActivator implements BundleActivator {
@@ -63,6 +88,7 @@
 	@Override
 	public void stop(BundleContext context) throws Exception {
 		_serviceRegistration.unregister();
+		_lft.close();
 	}
 
 	private volatile ServiceTracker<LoggerFactory, LoggerFactory> _lft;
diff --git a/cdi-extra/src/main/java/org/apache/aries/cdi/extra/propertytypes/JSONRequired.java b/cdi-extra/src/main/java/org/apache/aries/cdi/extra/propertytypes/JSONRequired.java
index 775dea5..c008411 100644
--- a/cdi-extra/src/main/java/org/apache/aries/cdi/extra/propertytypes/JSONRequired.java
+++ b/cdi-extra/src/main/java/org/apache/aries/cdi/extra/propertytypes/JSONRequired.java
@@ -19,7 +19,6 @@
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
 import static javax.ws.rs.core.MediaType.*;
-import static org.osgi.annotation.bundle.Requirement.Resolution.*;
 import static org.osgi.namespace.service.ServiceNamespace.*;
 import static org.osgi.resource.Namespace.*;
 
@@ -45,7 +44,7 @@
 @Requirement(
 	namespace = SERVICE_NAMESPACE, //
 	filter = JSONRequired.FILTER, //
-	resolution = OPTIONAL, //
+	// resolution = OPTIONAL, // this changed diverges from the original
 	effective = EFFECTIVE_ACTIVE
 )
 @Retention(RUNTIME)
diff --git a/cdi-itests/bnd/basic-beans.bnd b/cdi-itests/bnd/basic-beans.bnd
index 8574e69..10d08c6 100644
--- a/cdi-itests/bnd/basic-beans.bnd
+++ b/cdi-itests/bnd/basic-beans.bnd
@@ -14,5 +14,5 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		extensions:List<String>='(osgi.cdi.extension=aries.cdi.jndi)';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.beans.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.beans.*}',\
+	osgi.cdi.extension;filter:="(osgi.cdi.extension=aries.cdi.jndi)"
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb1.bnd b/cdi-itests/bnd/tb1.bnd
index 14e3487..9cb8887 100644
--- a/cdi-itests/bnd/tb1.bnd
+++ b/cdi-itests/bnd/tb1.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb1.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb1.*}'
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb10.bnd b/cdi-itests/bnd/tb10.bnd
index 10d5ce4..dd0f7d3 100644
--- a/cdi-itests/bnd/tb10.bnd
+++ b/cdi-itests/bnd/tb10.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb10.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb10.*}'
diff --git a/cdi-itests/bnd/tb11.bnd b/cdi-itests/bnd/tb11.bnd
index 6da1530..dbdd502 100644
--- a/cdi-itests/bnd/tb11.bnd
+++ b/cdi-itests/bnd/tb11.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb11.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb11.*}'
diff --git a/cdi-itests/bnd/tb2.bnd b/cdi-itests/bnd/tb2.bnd
index 0dfb157..526090e 100644
--- a/cdi-itests/bnd/tb2.bnd
+++ b/cdi-itests/bnd/tb2.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb2.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb2.*}'
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb3.bnd b/cdi-itests/bnd/tb3.bnd
index 5a6f560..9577c5c 100644
--- a/cdi-itests/bnd/tb3.bnd
+++ b/cdi-itests/bnd/tb3.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb3.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb3.*}'
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb4.bnd b/cdi-itests/bnd/tb4.bnd
index c0a5753..50e124e 100644
--- a/cdi-itests/bnd/tb4.bnd
+++ b/cdi-itests/bnd/tb4.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb4.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb4.*}'
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb5.bnd b/cdi-itests/bnd/tb5.bnd
index 27831a2..e4746d0 100644
--- a/cdi-itests/bnd/tb5.bnd
+++ b/cdi-itests/bnd/tb5.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb5.*}'
\ No newline at end of file
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb5.*}'
\ No newline at end of file
diff --git a/cdi-itests/bnd/tb6.bnd b/cdi-itests/bnd/tb6.bnd
index 2a3b465..981553a 100644
--- a/cdi-itests/bnd/tb6.bnd
+++ b/cdi-itests/bnd/tb6.bnd
@@ -14,5 +14,5 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		extensions:List<String>='(osgi.cdi.extension=aries.cdi.http)';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb6.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb6.*}',\
+	osgi.cdi.extension;filter:="(osgi.cdi.extension=aries.cdi.http)"
diff --git a/cdi-itests/bnd/tb7.bnd b/cdi-itests/bnd/tb7.bnd
index 0df451a..c381285 100644
--- a/cdi-itests/bnd/tb7.bnd
+++ b/cdi-itests/bnd/tb7.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb7.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb7.*}'
diff --git a/cdi-itests/bnd/tb8.bnd b/cdi-itests/bnd/tb8.bnd
index 284748a..15acc75 100644
--- a/cdi-itests/bnd/tb8.bnd
+++ b/cdi-itests/bnd/tb8.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb8.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb8.*}'
diff --git a/cdi-itests/bnd/tb9.bnd b/cdi-itests/bnd/tb9.bnd
index 7bb5f91..dd69e5b 100644
--- a/cdi-itests/bnd/tb9.bnd
+++ b/cdi-itests/bnd/tb9.bnd
@@ -14,4 +14,4 @@
 Require-Capability:\
 	osgi.extender;\
 		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
-		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb9.*}'
+		beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb9.*}'
diff --git a/cdi-itests/cdi-executable.bndrun b/cdi-itests/cdi-executable.bndrun
index a60b08d..cff2376 100644
--- a/cdi-itests/cdi-executable.bndrun
+++ b/cdi-itests/cdi-executable.bndrun
@@ -41,6 +41,7 @@
 	org.apache.aries.javax.cdi-api;version='[0.0.2,0.0.3)',\
 	org.apache.aries.javax.el-api;version='[0.0.2,0.0.3)',\
 	org.apache.aries.javax.interceptor-api;version='[0.0.2,0.0.3)',\
+	org.apache.aries.spifly.dynamic.framework.extension;version='[1.0.14,1.0.15)',\
 	org.apache.felix.configadmin;version='[1.9.0,1.9.1)',\
 	org.apache.felix.gogo.command;version='[1.0.2,1.0.3)',\
 	org.apache.felix.gogo.jline;version='[1.0.2,1.0.3)',\
diff --git a/cdi-itests/itest.bndrun b/cdi-itests/itest.bndrun
index 2cd7ab7..e65bcaf 100644
--- a/cdi-itests/itest.bndrun
+++ b/cdi-itests/itest.bndrun
@@ -16,12 +16,8 @@
 -standalone: true
 
 -runrequires: \
-	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.extender)',\
-	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.extension.http)',\
-	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.extension.jndi)',\
 	osgi.identity;filter:='(osgi.identity=org.apache.aries.cdi.itests)',\
 	osgi.identity;filter:='(osgi.identity=org.apache.aries.jndi.core)',\
-	osgi.identity;filter:='(osgi.identity=org.apache.felix.fileinstall)',\
 	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\
 	osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)'
 
@@ -50,10 +46,10 @@
 	org.apache.aries.javax.interceptor-api;version='[0.0.2,0.0.3)',\
 	org.apache.aries.jndi.api;version='[1.1.0,1.1.1)',\
 	org.apache.aries.jndi.core;version='[1.0.2,1.0.3)',\
+	org.apache.aries.spifly.dynamic.framework.extension;version='[1.0.14,1.0.15)',\
 	org.apache.aries.util;version='[1.0.0,1.0.1)',\
 	org.apache.commons.logging;version='[1.2.0,1.2.1)',\
 	org.apache.felix.configadmin;version='[1.9.0,1.9.1)',\
-	org.apache.felix.fileinstall;version='[3.6.0,3.6.1)',\
 	org.apache.felix.gogo.command;version='[1.0.2,1.0.3)',\
 	org.apache.felix.gogo.runtime;version='[1.0.2,1.0.3)',\
 	org.apache.felix.gogo.shell;version='[1.0.0,1.0.1)',\
@@ -76,7 +72,7 @@
 -resolve.effective: resolve, active
 -runee: JavaSE-1.8
 -runsystemcapabilities: ${native_capability}
--runfw: org.eclipse.osgi;version='[3.13.0,4.0.0)'
+-runfw: org.eclipse.osgi;version=3.13.0
 -runproperties: \
 	eclipse.log.enabled=false,\
 	logback.configurationFile=file:${.}/logback.xml,\
diff --git a/cdi-itests/pom.xml b/cdi-itests/pom.xml
index 9089385..8bce0d9 100644
--- a/cdi-itests/pom.xml
+++ b/cdi-itests/pom.xml
@@ -38,74 +38,6 @@
 	<build>
 		<plugins>
 			<plugin>
-				<groupId>com.googlecode.maven-download-plugin</groupId>
-				<artifactId>download-maven-plugin</artifactId>
-				<version>1.4.0</version>
-				<executions>
-					<execution>
-						<id>get-equinox-3.13.0</id>
-						<phase>pre-integration-test</phase>
-						<goals>
-							<goal>wget</goal>
-						</goals>
-						<configuration>
-							<url>http://download.eclipse.org/eclipse/updates/4.8milestones/S-4.8RC2-201805240900/plugins/org.eclipse.osgi_3.13.0.v20180409-1500.jar</url>
-							<outputDirectory>${project.build.directory}/equinox</outputDirectory>
-						</configuration>
-					</execution>
-					<execution>
-						<id>get-equinox-3.13.0-sources</id>
-						<phase>pre-integration-test</phase>
-						<goals>
-							<goal>wget</goal>
-						</goals>
-						<configuration>
-							<url>http://download.eclipse.org/eclipse/updates/4.8milestones/S-4.8RC2-201805240900/plugins/org.eclipse.osgi.source_3.13.0.v20180409-1500.jar</url>
-							<outputDirectory>${project.build.directory}/equinox</outputDirectory>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-install-plugin</artifactId>
-				<version>2.5.2</version>
-				<executions>
-					<execution>
-						<id>install-equinox</id>
-						<phase>pre-integration-test</phase>
-						<goals>
-							<goal>install-file</goal>
-						</goals>
-						<configuration>
-							<repositoryLayout>default</repositoryLayout>
-							<groupId>org.eclipse.platform</groupId>
-							<artifactId>org.eclipse.osgi</artifactId>
-							<version>3.13.0.v20180409-1500</version>
-							<file>${project.build.directory}/equinox/org.eclipse.osgi_3.13.0.v20180409-1500.jar</file>
-							<packaging>jar</packaging>
-							<generatePom>true</generatePom>
-						</configuration>
-					</execution>
-					<execution>
-						<id>install-equinox-sources</id>
-						<phase>pre-integration-test</phase>
-						<goals>
-							<goal>install-file</goal>
-						</goals>
-						<configuration>
-							<repositoryLayout>default</repositoryLayout>
-							<groupId>org.eclipse.platform</groupId>
-							<artifactId>org.eclipse.osgi</artifactId>
-							<version>3.13.0.v20180409-1500</version>
-							<file>${project.build.directory}/equinox/org.eclipse.osgi.source_3.13.0.v20180409-1500.jar</file>
-							<packaging>jar</packaging>
-							<classifier>sources</classifier>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
 				<groupId>biz.aQute.bnd</groupId>
 				<artifactId>bnd-maven-plugin</artifactId>
 			</plugin>
@@ -206,9 +138,9 @@
 			<scope>runtime</scope>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.felix</groupId>
-			<artifactId>org.apache.felix.fileinstall</artifactId>
-			<version>3.6.0</version>
+			<groupId>org.apache.aries.spifly</groupId>
+			<artifactId>org.apache.aries.spifly.dynamic.framework.extension</artifactId>
+			<version>1.0.14</version>
 			<scope>runtime</scope>
 		</dependency>
 		<dependency>
@@ -265,7 +197,7 @@
 		<dependency>
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.logback</artifactId>
-			<version>1.0.0-SNAPSHOT</version>
+			<version>1.0.0</version>
 			<scope>runtime</scope>
 		</dependency>
 		<dependency>
@@ -293,7 +225,7 @@
 		<dependency>
 			<groupId>org.eclipse.platform</groupId>
 			<artifactId>org.eclipse.osgi</artifactId>
-			<version>3.13.0.v20180409-1500</version>
+			<version>3.13.0</version>
 			<scope>runtime</scope>
 		</dependency>
 		<dependency>
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/AbstractTestCase.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/AbstractTestCase.java
index 5bc5d89..44b0e7c 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/AbstractTestCase.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/AbstractTestCase.java
@@ -24,6 +24,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Any;
@@ -58,6 +59,14 @@
 	filter = "(objectClass=org.osgi.service.cm.ConfigurationAdmin)",
 	namespace = ServiceNamespace.SERVICE_NAMESPACE
 )
+@Requirement(
+	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
+	name = "aries.cdi.http"
+)
+@Requirement(
+	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
+	name = "aries.cdi.jndi"
+)
 public class AbstractTestCase {
 
 	@Rule public TestName testName = new TestName();
@@ -222,6 +231,18 @@
 		).longValue();
 	}
 
+	<T> T with(ClassLoader classLoader, Supplier<T> supplier) {
+		Thread currentThread = Thread.currentThread();
+		ClassLoader original = currentThread.getContextClassLoader();
+		try {
+			currentThread.setContextClassLoader(classLoader);
+			return supplier.get();
+		}
+		finally {
+			currentThread.setContextClassLoader(original);
+		}
+	}
+
 	static final Bundle bundle = FrameworkUtil.getBundle(CdiBeanTests.class);
 	static final BundleContext bundleContext = bundle.getBundleContext();
 	static final long timeout = 5000;
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiContainerTests.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiContainerTests.java
index 416d3c1..b543a62 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiContainerTests.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiContainerTests.java
@@ -20,6 +20,7 @@
 import javax.enterprise.inject.spi.CDI;
 
 import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.service.cdi.ComponentType;
@@ -38,23 +39,16 @@
 	}
 
 	@Test
+	@Ignore("Due to a Service Loader Mediator incompatibility in the official CDI 2.0 API")
 	public void testGetBeanManagerFromCDI() throws Exception {
-		Thread currentThread = Thread.currentThread();
-		ClassLoader contextClassLoader = currentThread.getContextClassLoader();
+		BeanManager beanManager = with(
+			cdiBundle.adapt(BundleWiring.class).getClassLoader(),
+			() ->
+				CDI.current().getBeanManager()
+		);
 
-		try {
-			BundleWiring bundleWiring = cdiBundle.adapt(BundleWiring.class);
-
-			currentThread.setContextClassLoader(bundleWiring.getClassLoader());
-
-			BeanManager beanManager = CDI.current().getBeanManager();
-
-			assertNotNull(beanManager);
-			assertBeanExists(Pojo.class, beanManager);
-		}
-		finally {
-			currentThread.setContextClassLoader(contextClassLoader);
-		}
+		assertNotNull(beanManager);
+		assertBeanExists(Pojo.class, beanManager);
 	}
 
 	@Test