You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2019/11/25 18:43:27 UTC

[aries-cdi] 08/27: rewrite the extender not to use any particular CDI container impl

This is an automated email from the ASF dual-hosted git repository.

rotty3000 pushed a commit to branch rotty3000/cdi-spi
in repository https://gitbox.apache.org/repos/asf/aries-cdi.git

commit dc9eb675d3f5ca04c0cb38d47bc6b6f42475be63
Author: Raymond Augé <ro...@apache.org>
AuthorDate: Fri Nov 22 12:35:25 2019 -0500

    rewrite the extender not to use any particular CDI container impl
    
    Signed-off-by: Raymond Augé <ro...@apache.org>
    Signed-off-by: Romain Manni-Bucau <rm...@gmail.com>
---
 cdi-extender/pom.xml                               |  16 ++-
 .../aries/cdi/container/internal/Activator.java    |  76 ++++++++----
 .../internal/bean/ComponentPropertiesBean.java     |   4 +-
 .../cdi/container/internal/bean/ReferenceBean.java |  21 +---
 .../cdi/container/internal/command/CDICommand.java |  75 +++++++++---
 .../container/internal/container/CDIBundle.java    |  27 ++--
 .../internal/container/ConfigurationListener.java  |   1 -
 .../internal/container/ContainerBootstrap.java     | 131 +++++++++-----------
 .../internal/container/ContainerDeployment.java    |  66 ----------
 .../container/ContainerDeploymentArchive.java      |  84 -------------
 .../internal/container/ContainerEnvironment.java   |  43 -------
 .../internal/container/ContainerState.java         |  56 ++-------
 .../internal/container/ExtensionMetadata.java      |  41 -------
 .../internal/container/MarkedInjectionPoint.java   |  58 ---------
 .../internal/container/RuntimeExtension.java       |  68 +++++++----
 .../internal/loader/BundleClassLoader.java         | 110 +++++++++++++++--
 .../internal/loader/BundleResourcesLoader.java     | 136 ---------------------
 .../cdi/container/internal/model/BeansModel.java   |  17 +--
 .../internal/model/ComponentPropertiesModel.java   |   3 +-
 .../container/internal/provider/CDIProvider.java   |  40 +++---
 .../cdi/container/internal/util/Annotates.java     |  10 +-
 .../apache/aries/cdi/container/package-info.java   |   9 +-
 .../internal/phase/ContainerBootstrapTest.java     |  17 ++-
 .../container/internal/phase/TemplatesTests.java   |  10 +-
 .../container/test/MockBeanDeploymentArchive.java  |  69 -----------
 .../aries/cdi/container/test/MockCdiContainer.java |  89 --------------
 .../cdi/container/test/MockInjectionPoint.java     |   2 -
 .../apache/aries/cdi/container/test/TestUtil.java  |  10 +-
 28 files changed, 416 insertions(+), 873 deletions(-)

diff --git a/cdi-extender/pom.xml b/cdi-extender/pom.xml
index 7131fc6..e849995 100644
--- a/cdi-extender/pom.xml
+++ b/cdi-extender/pom.xml
@@ -53,6 +53,7 @@
 					<bnd><![CDATA[
 						-cdiannotations:
 						-conditionalpackage: \
+							aQute.lib.exceptions,\
 							org.apache.felix.utils.extender,\
 							org.osgi.util.converter
 					]]></bnd>
@@ -63,6 +64,11 @@
 
 	<dependencies>
 		<dependency>
+			<groupId>org.apache.aries.cdi</groupId>
+			<artifactId>org.apache.aries.cdi.spi</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.felix</groupId>
 			<artifactId>org.apache.felix.converter</artifactId>
 		</dependency>
@@ -87,10 +93,6 @@
 			<artifactId>geronimo-jcdi_2.0_spec</artifactId>
 		</dependency>
 		<dependency>
-			<groupId>org.jboss.weld</groupId>
-			<artifactId>weld-osgi-bundle</artifactId>
-		</dependency>
-		<dependency>
 			<groupId>org.osgi</groupId>
 			<artifactId>osgi.annotation</artifactId>
 		</dependency>
@@ -130,6 +132,12 @@
 			<groupId>org.osgi</groupId>
 			<artifactId>osgi.core</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>biz.aQute.bnd</groupId>
+			<artifactId>biz.aQute.bndlib</artifactId>
+			<version>${bnd.version}</version>
+			<scope>provided</scope>
+		</dependency>
 
 		<dependency>
 			<groupId>ch.qos.logback</groupId>
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 b0c7881..ca885f1 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
@@ -14,6 +14,7 @@
 
 package org.apache.aries.cdi.container.internal;
 
+import static org.apache.aries.cdi.container.internal.util.Filters.asFilter;
 import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE;
 import static org.osgi.service.cdi.CDIConstants.CDI_CAPABILITY_NAME;
 import static org.osgi.service.cdi.CDIConstants.REQUIREMENT_BEANS_ATTRIBUTE;
@@ -27,7 +28,9 @@ import java.util.Observer;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import javax.enterprise.inject.se.SeContainerInitializer;
 
 import org.apache.aries.cdi.container.internal.command.CDICommand;
 import org.apache.aries.cdi.container.internal.container.CDIBundle;
@@ -50,6 +53,8 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceObjects;
+import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.wiring.BundleRequirement;
 import org.osgi.framework.wiring.BundleWire;
@@ -61,6 +66,7 @@ import org.osgi.service.log.Logger;
 import org.osgi.service.log.LoggerFactory;
 import org.osgi.util.promise.PromiseFactory;
 import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 @Header(
 	name = Constants.BUNDLE_ACTIVATOR,
@@ -69,26 +75,48 @@ import org.osgi.util.tracker.ServiceTracker;
 @RequireConfigurationAdmin
 public class Activator extends AbstractExtender {
 
-	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 ThreadGroup _threadGroup = new ThreadGroup("Apache Aries CCR - CDI");
-	private static final ExecutorService _executorService = Executors.newFixedThreadPool(
-		1,
-		new ThreadFactory() {
-
-			@Override
-			public Thread newThread(Runnable r) {
-				Thread t = new Thread(_threadGroup, r, "Aries CCR Thread");
-				t.setDaemon(true);
-				return t;
-			}
-
-		}
-	);
-	private static final PromiseFactory _promiseFactory = new PromiseFactory(_executorService);
-	public static final CCR ccr = new CCR(_promiseFactory, _logs);
+	private final CCR _ccr;
+	private final ExecutorService _executorService;
+	private final Logger _log;
+	private final Logs _logs;
+	private final PromiseFactory _promiseFactory;
+	private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
 
 	public Activator() {
+		final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext();
+		_logs = new Logs.Builder(bundleContext).build();
+		_log = _logs.getLogger(Activator.class);
+		_containerTracker = new ServiceTracker<>(
+			bundleContext,
+			asFilter("(&(objectClass=%s)(aries.cdi.spi=*))", SeContainerInitializer.class.getName()),
+			new ServiceTrackerCustomizer<SeContainerInitializer, ServiceObjects<SeContainerInitializer>>() {
+
+				@Override
+				public ServiceObjects<SeContainerInitializer> addingService(
+						ServiceReference<SeContainerInitializer> reference) {
+					return bundleContext.getServiceObjects(reference);
+				}
+
+				@Override
+				public void modifiedService(ServiceReference<SeContainerInitializer> reference,
+						ServiceObjects<SeContainerInitializer> service) {
+				}
+
+				@Override
+				public void removedService(ServiceReference<SeContainerInitializer> reference,
+						ServiceObjects<SeContainerInitializer> service) {
+				}
+			}
+		);
+		_containerTracker.open();
+		_executorService = Executors.newSingleThreadExecutor(worker -> {
+			Thread t = new Thread(new ThreadGroup("Apache Aries CCR - CDI"), worker, "Aries CCR Thread (" + hashCode() + ")");
+			t.setDaemon(false);
+			return t;
+		});
+		_promiseFactory = new PromiseFactory(_executorService);
+		_ccr = new CCR(_promiseFactory, _logs);
+		_command = new CDICommand(_ccr);
 		setSynchronous(true);
 	}
 
@@ -98,8 +126,6 @@ public class Activator extends AbstractExtender {
 			_log.debug("CCR starting {}", bundleContext.getBundle());
 		}
 
-		_command = new CDICommand(ccr);
-
 		_bundleContext = bundleContext;
 
 		registerCCR();
@@ -150,6 +176,8 @@ public class Activator extends AbstractExtender {
 		if (_log.isDebugEnabled()) {
 			_log.debug("CCR stoped {}", bundleContext.getBundle());
 		}
+		_executorService.shutdownNow();
+		_executorService.awaitTermination(2, TimeUnit.SECONDS); // not important but just to avoid to quit too fast
 	}
 
 	@Override
@@ -172,7 +200,7 @@ public class Activator extends AbstractExtender {
 			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
@@ -183,7 +211,7 @@ public class Activator extends AbstractExtender {
 						new ContainerActivator.Builder(containerState,
 							// when the active container bootstraps CDI
 							new ContainerBootstrap(
-								containerState,
+								containerState, _containerTracker,
 								// when CDI is bootstrapping is complete and is up and running
 								// activate the configuration listeners for single and factory components
 								new ConfigurationListener.Builder(containerState),
@@ -264,7 +292,7 @@ public class Activator extends AbstractExtender {
 
 			_registrations.add(registration);
 
-			return ccr;
+			return _ccr;
 		}
 
 		@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
index 8155ac9..db9d8d5 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ComponentPropertiesBean.java
@@ -21,7 +21,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
-import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Default;
 import javax.enterprise.inject.spi.Bean;
@@ -98,7 +98,7 @@ public class ComponentPropertiesBean implements Bean<Object> {
 		ExtendedActivationDTO current = ComponentContext.With.current();
 
 		if (current == null) {
-			return ApplicationScoped.class;
+			return Dependent.class;
 		}
 
 		return ComponentScoped.class;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
index c1ac4b8..c6d7a76 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
@@ -149,26 +149,7 @@ public class ReferenceBean implements Bean<Object> {
 
 //		TODO do we want to support decorators/interceptors on in-bound services one day???
 //		==================================================================================
-
-//		if (s == null) return null;
-//
-//		List<javax.enterprise.inject.spi.Decorator<?>> decorators = _bm.resolveDecorators(
-//			Collections.singleton(_template.serviceClass),
-//			new Annotation[0]);
-//
-//		if (decorators.isEmpty()) {
-//			return s;
-//		}
-//
-//		org.jboss.weld.manager.BeanManagerImpl bmi =
-//			((org.jboss.weld.bean.builtin.BeanManagerProxy)_bm).delegate();
-//		org.jboss.weld.injection.CurrentInjectionPoint cip = bmi.getServices().get(
-//			org.jboss.weld.injection.CurrentInjectionPoint.class);
-//		InjectionPoint ip = cip.peek();
-//		return org.jboss.weld.util.Decorators.getOuterDelegate(
-//			(Bean<S>)this, s, c, (Class<S>)_template.serviceClass,
-//			(org.jboss.weld.injection.EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip),
-//			bmi, decorators);
+//  	If so, use InterceptionFactory instead of doing it manually
 	}
 
 	@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
index 8631e3a..4a642b0 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
@@ -14,7 +14,8 @@
 
 package org.apache.aries.cdi.container.internal.command;
 
-import static java.util.stream.Collectors.*;
+import static java.util.stream.Collectors.partitioningBy;
+import static java.util.stream.Collectors.toList;
 
 import java.util.Collection;
 import java.util.Formatter;
@@ -33,10 +34,12 @@ import org.osgi.service.cdi.runtime.dto.ComponentDTO;
 import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
 import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
 import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
 import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
 import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ExtensionTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
 
 public class CDICommand {
@@ -93,10 +96,34 @@ public class CDICommand {
 			containerDTO.bundle.symbolicName,
 			containerDTO.bundle.id);
 
+		if (!containerDTO.template.extensions.isEmpty()) {
+			f.format(
+				"%s%sEXTENSIONS%n",
+				(hasNext ? PSSS : SSSS),
+				TLLS);
+
+			for (Iterator<ExtensionTemplateDTO> itr1 = containerDTO.template.extensions.iterator(); itr1.hasNext();) {
+				ExtensionTemplateDTO templateDTO = itr1.next();
+				ExtensionDTO extensionDTO = containerDTO.extensions.stream().filter(extInstance -> templateDTO == extInstance.template).findFirst().orElse(null);
+
+				f.format(
+					"%s%sFILTER: %s%n",
+					(hasNext ? PSSS : SSSS) + PSSS,
+					(itr1.hasNext() ? TLLS : CLLS),
+					templateDTO.serviceFilter);
+				f.format(
+					"%s%s%sMATCH: %s%n",
+					(hasNext ? PSSS : SSSS) + PSSS,
+					(itr1.hasNext() ? PSSS : SSSS),
+					CLLS,
+					(extensionDTO == null) ? "null*" : extensionDTO.service);
+			}
+		}
+
 		f.format(
 			"%s%sCOMPONENTS%n",
 			(hasNext ? PSSS : SSSS),
-			curb);
+			CLLS);
 
 		Map<Boolean, List<ComponentTemplateDTO>> componentTemplateDTOs = containerDTO.template.components.stream().collect(
 			partitioningBy(c -> c.type == ComponentType.CONTAINER)
@@ -160,20 +187,35 @@ public class CDICommand {
 			c -> c.template.name.equals(componentTemplateDTO.name)
 		).findFirst().orElse(null);
 
-		if ((componentDTO != null) && !componentDTO.instances.isEmpty()) {
-			Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
+		if (componentDTO != null) {
+			if (!componentDTO.instances.isEmpty()) {
+				Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
 
-			for (;itr3.hasNext();) {
-				ComponentInstanceDTO instanceDTO = itr3.next();
+				for (;itr3.hasNext();) {
+					ComponentInstanceDTO instanceDTO = itr3.next();
 
+					formatInstance(
+						f,
+						prefix,
+						componentDTO,
+						componentTemplateDTO,
+						instanceDTO,
+						pids(instanceDTO, configMap),
+						hasNext,
+						itr3.hasNext(),
+						verbose);
+				}
+			}
+			else {
 				formatInstance(
 					f,
 					prefix,
 					componentDTO,
-					instanceDTO,
-					pids(instanceDTO, configMap),
+					componentTemplateDTO,
+					null,
+					configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
 					hasNext,
-					itr3.hasNext(),
+					false,
 					verbose);
 			}
 		}
@@ -182,6 +224,7 @@ public class CDICommand {
 				f,
 				prefix,
 				componentDTO,
+				componentTemplateDTO,
 				null,
 				configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
 				hasNext,
@@ -191,7 +234,7 @@ public class CDICommand {
 	}
 
 	private void formatInstance(
-		Formatter f, String prefix, ComponentDTO componentDTO,
+		Formatter f, String prefix, ComponentDTO componentDTO, ComponentTemplateDTO templateDTO,
 		ComponentInstanceDTO instanceDTO, String pids,
 		boolean hasNext, boolean hasNext2, boolean verbose) {
 
@@ -201,7 +244,7 @@ public class CDICommand {
 				prefix,
 				(hasNext ? PSSS : SSSS),
 				TLLS,
-				componentDTO.template.beans.toString());
+				templateDTO.beans.toString());
 
 			f.format(
 				"%s%s%sCONFIGURATIONS%n",
@@ -209,7 +252,7 @@ public class CDICommand {
 				(hasNext ? PSSS : SSSS),
 				TLLS);
 
-			for (Iterator<ConfigurationTemplateDTO> itr = componentDTO.template.configurations.iterator();itr.hasNext();) {
+			for (Iterator<ConfigurationTemplateDTO> itr = templateDTO.configurations.iterator();itr.hasNext();) {
 				ConfigurationTemplateDTO conf = itr.next();
 
 				ConfigurationDTO configurationDTO = null;
@@ -266,14 +309,14 @@ public class CDICommand {
 				}
 			}
 
-			if (!componentDTO.template.references.isEmpty()) {
+			if (!templateDTO.references.isEmpty()) {
 				f.format(
 					"%s%s%sREFERENCES%n",
 					prefix,
 					(hasNext ? PSSS : SSSS),
 					TLLS);
 
-				for (Iterator<ReferenceTemplateDTO> itr = componentDTO.template.references.iterator(); itr.hasNext();) {
+				for (Iterator<ReferenceTemplateDTO> itr = templateDTO.references.iterator(); itr.hasNext();) {
 					ReferenceTemplateDTO dto = itr.next();
 
 					ReferenceDTO referenceDTO = null;
@@ -345,14 +388,14 @@ public class CDICommand {
 				}
 			}
 
-			if (!componentDTO.template.activations.isEmpty()) {
+			if (!templateDTO.activations.isEmpty()) {
 				f.format(
 					"%s%s%sACTIVATIONS%n",
 					prefix,
 					(hasNext ? PSSS : SSSS),
 					TLLS);
 
-				for (Iterator<ActivationTemplateDTO> itr = componentDTO.template.activations.iterator(); itr.hasNext();) {
+				for (Iterator<ActivationTemplateDTO> itr = templateDTO.activations.iterator(); itr.hasNext();) {
 					ActivationTemplateDTO dto = itr.next();
 
 					ActivationDTO activationDTO = null;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
index c9816bd..3c58d88 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
@@ -31,23 +31,25 @@ public class CDIBundle extends Phase implements Extension {
 	@Override
 	public boolean close() {
 		try (Syncro open = syncro.open()) {
+			if (!running) return false;
+
 			containerState.closing();
 
 			return next.map(
-					next -> {
-						submit(next.closeOp(), next::close).onFailure(
-								f -> {
-									_log.error(l -> l.error("CCR Error in cdibundle CLOSE on {}", bundle(), f));
+				next -> {
+					submit(next.closeOp(), next::close).onFailure(
+						f -> {
+							_log.error(l -> l.error("CCR Error in cdibundle CLOSE on {}", bundle(), f));
 
-									error(f);
-								}
-								);
+							error(f);
+						}
+					);
 
-						_ccr.remove(bundle());
+					_ccr.remove(bundle());
 
-						return true;
-					}
-					).orElse(true);
+					return true;
+				}
+			).orElse(true);
 		}
 	}
 
@@ -64,7 +66,7 @@ public class CDIBundle extends Phase implements Extension {
 	@Override
 	public boolean open() {
 		try (Syncro open = syncro.open()) {
-			return next.map(
+			return running = next.map(
 				next -> {
 					_ccr.add(containerState.bundle(), containerState);
 
@@ -94,5 +96,6 @@ public class CDIBundle extends Phase implements Extension {
 
 	private final CCR _ccr;
 	private final Logger _log;
+	private volatile boolean running = false;
 
 }
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
index 9a89301..494de1c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
@@ -29,7 +29,6 @@ import org.apache.aries.cdi.container.internal.util.Maps;
 import org.apache.aries.cdi.container.internal.util.Predicates;
 import org.apache.aries.cdi.container.internal.util.Syncro;
 import org.apache.aries.cdi.container.internal.util.Throw;
-import org.jboss.weld.exceptions.IllegalArgumentException;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cdi.ConfigurationPolicy;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
index c67a26e..4d573da 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
@@ -14,29 +14,33 @@
 
 package org.apache.aries.cdi.container.internal.container;
 
+import static org.apache.aries.cdi.spi.Keys.BEANS_XML_PROPERTY;
+import static org.apache.aries.cdi.spi.Keys.BUNDLECONTEXT_PROPERTY;
+
+import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.ServiceLoader;
 
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.se.SeContainerInitializer;
 import javax.enterprise.inject.spi.Extension;
 
 import org.apache.aries.cdi.container.internal.container.Op.Mode;
 import org.apache.aries.cdi.container.internal.container.Op.Type;
-import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader;
 import org.apache.aries.cdi.container.internal.model.ExtendedExtensionDTO;
 import org.apache.aries.cdi.container.internal.model.FactoryComponent;
+import org.apache.aries.cdi.container.internal.model.OSGiBean;
 import org.apache.aries.cdi.container.internal.model.SingleComponent;
 import org.apache.aries.cdi.container.internal.util.Syncro;
-import org.jboss.weld.bootstrap.WeldBootstrap;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.Deployment;
-import org.jboss.weld.bootstrap.spi.Metadata;
-import org.jboss.weld.util.ServiceLoader;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.service.log.Logger;
+import org.osgi.util.tracker.ServiceTracker;
 
 public class ContainerBootstrap extends Phase {
 
 	public ContainerBootstrap(
 		ContainerState containerState,
+		ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> containerTracker,
 		ConfigurationListener.Builder configurationBuilder,
 		SingleComponent.Builder singleBuilder,
 		FactoryComponent.Builder factoryBuilder) {
@@ -44,24 +48,34 @@ public class ContainerBootstrap extends Phase {
 		super(containerState, null);
 
 		_configurationBuilder = configurationBuilder;
+		_containerTracker = containerTracker;
 		_singleBuilder = singleBuilder;
 		_factoryBuilder = factoryBuilder;
 		_log = containerState.containerLogs().getLogger(getClass());
+
+		_serviceObjects = _containerTracker.getService();
+		_seContainerInitializerInstance = _serviceObjects.getService();
 	}
 
 	@Override
 	public boolean close() {
 		try (Syncro syncro = _lock.open()) {
-			if (_bootstrap != null) {
-				_log.debug(l -> l.debug("CCR container bootstrap shutdown on {}", _bootstrap));
-				_bootstrap.shutdown();
-				_bootstrap = null;
+			if (_seContainer != null) {
+				_log.debug(l -> l.debug("CCR container shutdown for {}", bundle()));
+				_seContainer.close();
+				try {
+					_serviceObjects.ungetService(_seContainerInitializerInstance);
+				}
+				catch (Throwable t) {
+					_log.trace(l -> l.trace("CCR Failure in returning initializer instance on {}", bundle(), t));
+				}
+				_seContainer = null;
 			}
 
 			return true;
 		}
 		catch (Throwable t) {
-			_log.error(l -> l.error("CCR Failure in container bootstrap shutdown on {}", _bootstrap, t));
+			_log.error(l -> l.error("CCR Failure in container bootstrap shutdown on {}", bundle(), t));
 
 			return false;
 		}
@@ -80,7 +94,7 @@ public class ContainerBootstrap extends Phase {
 				return false;
 			}
 
-			if (_bootstrap != null) {
+			if (_seContainer != null) {
 				return true;
 			}
 
@@ -88,62 +102,16 @@ public class ContainerBootstrap extends Phase {
 				return false;
 			}
 
-			List<Metadata<Extension>> extensions = new CopyOnWriteArrayList<>();
-
-			// Add the internal extensions
-			extensions.add(
-				new ExtensionMetadata(
-					new BundleContextExtension(containerState.bundleContext()),
-					containerState.id()));
-			extensions.add(
-				new ExtensionMetadata(
-					new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder),
-					containerState.id()));
-			extensions.add(
-				new ExtensionMetadata(
-					new LoggerExtension(containerState),
-					containerState.id()));
-
-			Thread currentThread = Thread.currentThread();
-			ClassLoader current = currentThread.getContextClassLoader();
-			BundleResourcesLoader.Builder builder = new BundleResourcesLoader.Builder(containerState.bundle(), containerState.extenderBundle());
-
-			try {
-				currentThread.setContextClassLoader(containerState.classLoader());
-
-				// Add extensions found from the bundle's class loader, such as those in the Bundle-ClassPath
-				ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extensions::add);
-
-				// Add external extensions
-				containerState.containerDTO().extensions.stream().map(
-					ExtendedExtensionDTO.class::cast
-				).map(
-					e -> {
-						builder.add(e.serviceReference.getBundle());
-						return new ExtensionMetadata(e.extension.getService(), e.template.serviceFilter);
-					}
-				).forEach(extensions::add);
-
-				_bootstrap = new WeldBootstrap();
-
-				BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive(
-					builder.build(),
-					containerState.id(),
-					containerState.beansModel().getBeanClassNames(),
-					containerState.beansModel().getBeansXml());
-
-				Deployment deployment = new ContainerDeployment(extensions, beanDeploymentArchive);
-
-				_bootstrap.startExtensions(extensions);
-				_bootstrap.startContainer(containerState.id(), new ContainerEnvironment(), deployment);
-				_bootstrap.startInitialization();
-				_bootstrap.deployBeans();
-				_bootstrap.validateBeans();
-				_bootstrap.endInitialization();
-			}
-			finally {
-				currentThread.setContextClassLoader(current);
-			}
+			_log.debug(log -> log.debug("CCR container startup for {}", bundle()));
+
+			_seContainer = _seContainerInitializerInstance
+				.setClassLoader(containerState.classLoader())
+				.addBeanClasses(containerState.beansModel().getOSGiBeans().stream().map(OSGiBean::getBeanClass).toArray(Class<?>[]::new))
+				.setProperties(containerState.containerComponentTemplateDTO().properties)
+				.addProperty(BEANS_XML_PROPERTY, containerState.beansModel().getBeansXml())
+				.addProperty(BUNDLECONTEXT_PROPERTY, bundle().getBundleContext())
+				.addExtensions(getExtensions().toArray(new Extension[0]))
+				.initialize();
 
 			return true;
 		}
@@ -154,10 +122,33 @@ public class ContainerBootstrap extends Phase {
 		return Op.of(Mode.OPEN, Type.CONTAINER_BOOTSTRAP, containerState.id());
 	}
 
+	protected List<Extension> getExtensions() {
+		List<Extension> extensions = new ArrayList<>();
+
+		// Add the internal extensions
+		extensions.add(new BundleContextExtension(containerState.bundleContext()));
+		extensions.add(new RuntimeExtension(containerState, _configurationBuilder, _singleBuilder, _factoryBuilder));
+		extensions.add(new LoggerExtension(containerState));
+
+		// Add extensions found from the bundle's class loader, such as those in the Bundle-ClassPath
+		ServiceLoader.load(Extension.class, containerState.classLoader()).forEach(extensions::add);
+
+		// Add external extensions
+		containerState.containerDTO().extensions.stream().map(
+			ExtendedExtensionDTO.class::cast
+		).map(
+			e -> e.extension.getService()
+		).forEach(extensions::add);
+
+		return extensions;
+	}
 
-	private volatile WeldBootstrap _bootstrap;
+	private volatile SeContainer _seContainer;
+	private final ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> _containerTracker;
 	private final ConfigurationListener.Builder _configurationBuilder;
 	private final FactoryComponent.Builder _factoryBuilder;
+	private final SeContainerInitializer _seContainerInitializerInstance;
+	private final ServiceObjects<SeContainerInitializer> _serviceObjects;
 	private final SingleComponent.Builder _singleBuilder;
 	private final Syncro _lock = new Syncro(true);
 	private final Logger _log;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java
deleted file mode 100644
index 7e838a5..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java
+++ /dev/null
@@ -1,66 +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.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.enterprise.inject.spi.Extension;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.CDI11Deployment;
-import org.jboss.weld.bootstrap.spi.Metadata;
-
-public class ContainerDeployment implements CDI11Deployment {
-
-	public ContainerDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) {
-		_extensions = extensions;
-		_beanDeploymentArchive = beanDeploymentArchive;
-
-		_beanDeploymentArchives = new ArrayList<BeanDeploymentArchive>();
-		_beanDeploymentArchives.add(beanDeploymentArchive);
-	}
-
-	@Override
-	public BeanDeploymentArchive getBeanDeploymentArchive(Class<?> beanClass) {
-		return _beanDeploymentArchive;
-	}
-
-	@Override
-	public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
-		return _beanDeploymentArchives;
-	}
-
-	@Override
-	public Iterable<Metadata<Extension>> getExtensions() {
-		return _extensions;
-	}
-
-	@Override
-	public ServiceRegistry getServices() {
-		return _beanDeploymentArchive.getServices();
-	}
-
-	@Override
-	public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> aClass) {
-		return _beanDeploymentArchive;
-	}
-
-	private final BeanDeploymentArchive _beanDeploymentArchive;
-	private final Collection<BeanDeploymentArchive> _beanDeploymentArchives;
-	private final Iterable<Metadata<Extension>> _extensions;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java
deleted file mode 100644
index 4fbca9b..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java
+++ /dev/null
@@ -1,84 +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.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.bootstrap.spi.EEModuleDescriptor;
-import org.jboss.weld.bootstrap.spi.EEModuleDescriptor.ModuleType;
-import org.jboss.weld.bootstrap.spi.helpers.EEModuleDescriptorImpl;
-import org.jboss.weld.ejb.spi.EjbDescriptor;
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.serialization.spi.ProxyServices;
-
-public class ContainerDeploymentArchive
-	implements BeanDeploymentArchive {
-
-	public <T extends ResourceLoader & ProxyServices> ContainerDeploymentArchive(
-		T loader, String id, Collection<String> beanClassNames, BeansXml beansXml) {
-
-		_id = id;
-		_beanClassNames = beanClassNames;
-		_beansXml = beansXml;
-		_services = new SimpleServiceRegistry();
-
-		if (loader != null) {
-			_services.add(ResourceLoader.class, loader);
-			_services.add(ProxyServices.class, loader);
-			_services.add(EEModuleDescriptor.class, new EEModuleDescriptorImpl(id, ModuleType.WEB));
-		}
-	}
-
-	@Override
-	public Collection<String> getBeanClasses() {
-		return _beanClassNames;
-	}
-
-	@Override
-	public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
-		return Collections.emptyList();
-	}
-
-	@Override
-	public BeansXml getBeansXml() {
-		return _beansXml;
-	}
-
-	@Override
-	public Collection<EjbDescriptor<?>> getEjbs() {
-		return Collections.emptyList();
-	}
-
-	@Override
-	public String getId() {
-		return _id;
-	}
-
-	@Override
-	public ServiceRegistry getServices() {
-		return _services;
-	}
-
-	private final Collection<String> _beanClassNames;
-	private final BeansXml _beansXml;
-	private final String _id;
-	private final ServiceRegistry _services;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java
deleted file mode 100644
index a968c32..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java
+++ /dev/null
@@ -1,43 +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.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.jboss.weld.bootstrap.api.Environment;
-import org.jboss.weld.bootstrap.api.Service;
-
-public class ContainerEnvironment implements Environment {
-
-	public ContainerEnvironment() {
-		_requiredBeanDeploymentArchiveServices = new HashSet<Class<? extends Service>>();
-		_requiredDeploymentServices = new HashSet<Class<? extends Service>>();
-	}
-
-	@Override
-	public Set<Class<? extends Service>> getRequiredBeanDeploymentArchiveServices() {
-		return _requiredBeanDeploymentArchiveServices;
-	}
-
-	@Override
-	public Set<Class<? extends Service>> getRequiredDeploymentServices() {
-		return _requiredDeploymentServices;
-	}
-
-	private final Set<Class<? extends Service>> _requiredBeanDeploymentArchiveServices;
-	private final Set<Class<? extends Service>> _requiredDeploymentServices;
-
-}
\ No newline at end of file
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 f04cb9e..bd3a8a2 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
@@ -14,9 +14,11 @@
 
 package org.apache.aries.cdi.container.internal.container;
 
-import static org.apache.aries.cdi.container.internal.util.Filters.*;
-import static org.osgi.namespace.extender.ExtenderNamespace.*;
-import static org.osgi.service.cdi.CDIConstants.*;
+import static org.apache.aries.cdi.container.internal.util.Filters.asFilter;
+import static org.osgi.namespace.extender.ExtenderNamespace.EXTENDER_NAMESPACE;
+import static org.osgi.service.cdi.CDIConstants.CDI_CAPABILITY_NAME;
+import static org.osgi.service.cdi.CDIConstants.CDI_CONTAINER_ID;
+import static org.osgi.service.cdi.CDIConstants.CDI_EXTENSION_PROPERTY;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
@@ -30,26 +32,20 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import javax.enterprise.inject.Any;
 import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.util.AnnotationLiteral;
 
 import org.apache.aries.cdi.container.internal.ChangeCount;
 import org.apache.aries.cdi.container.internal.loader.BundleClassLoader;
-import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader;
 import org.apache.aries.cdi.container.internal.model.BeansModel;
 import org.apache.aries.cdi.container.internal.model.BeansModelBuilder;
 import org.apache.aries.cdi.container.internal.model.ExtendedConfigurationTemplateDTO;
 import org.apache.aries.cdi.container.internal.model.ExtendedExtensionTemplateDTO;
 import org.apache.aries.cdi.container.internal.util.Logs;
 import org.apache.aries.cdi.container.internal.util.Throw;
-import org.jboss.weld.resources.spi.ResourceLoader;
-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;
@@ -71,10 +67,6 @@ import org.osgi.util.tracker.ServiceTracker;
 
 public class ContainerState {
 
-	public static final AnnotationLiteral<Any> ANY = new AnnotationLiteral<Any>() {
-		private static final long serialVersionUID = 1L;
-	};
-
 	public ContainerState(
 		Bundle bundle,
 		Bundle extenderBundle,
@@ -195,8 +187,6 @@ public class ContainerState {
 
 		_beansModel = new BeansModelBuilder(this, _aggregateClassLoader, bundleWiring, cdiAttributes).build();
 
-		_bundleClassLoader = bundleWiring.getClassLoader();
-
 		try {
 			new Discovery(this).discover();
 		}
@@ -238,10 +228,6 @@ public class ContainerState {
 		return _bundle;
 	}
 
-	public ClassLoader bundleClassLoader() {
-		return _bundleClassLoader;
-	}
-
 	public BundleContext bundleContext() {
 		return _bundleContext;
 	}
@@ -254,7 +240,7 @@ public class ContainerState {
 		return _ccrLogs;
 	}
 
-	public ClassLoader classLoader() {
+	public BundleClassLoader classLoader() {
 		return _aggregateClassLoader;
 	}
 
@@ -328,11 +314,6 @@ public class ContainerState {
 		_changeCount.incrementAndGet();
 	}
 
-	@SuppressWarnings("unchecked")
-	public <T extends ResourceLoader & ProxyServices> T loader() {
-		return (T)new BundleResourcesLoader.Builder(_bundle, _extenderBundle).build();
-	}
-
 	public PromiseFactory promiseFactory() {
 		return _promiseFactory;
 	}
@@ -378,39 +359,20 @@ public class ContainerState {
 		return promise;
 	}
 
-	private static Bundle[] getBundles(Bundle bundle, Bundle extenderBundle) {
+	private static List<Bundle> getBundles(Bundle bundle, Bundle extenderBundle) {
 		List<Bundle> bundles = new ArrayList<>();
 
 		bundles.add(bundle);
 		bundles.add(extenderBundle);
 
-		BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
-
-		List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
-
-		for (BundleWire bundleWire : requiredWires) {
-			BundleCapability capability = bundleWire.getCapability();
-			Map<String, Object> attributes = capability.getAttributes();
-			String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE);
-			if (!packageName.startsWith("org.jboss.weld.")) {
-				continue;
-			}
-
-			Bundle wireBundle = bundleWire.getProvider().getBundle();
-			if (!bundles.contains(wireBundle)) {
-				bundles.add(wireBundle);
-			}
-		}
-
-		return bundles.toArray(new Bundle[0]);
+		return bundles;
 	}
 
-	private final ClassLoader _aggregateClassLoader;
+	private final BundleClassLoader _aggregateClassLoader;
 	private volatile Deferred<BeanManager> _beanManagerDeferred;
 	private final BeansModel _beansModel;
 	private final Bundle _bundle;
 	private final BundleContext _bundleContext;
-	private final ClassLoader _bundleClassLoader;
 	private final Map<CheckedCallback<?, ?>, Deferred<?>> _callbacks = new ConcurrentHashMap<>();
 	private final ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> _caTracker;
 	private final Logger _log;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java
deleted file mode 100644
index 7ae345c..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java
+++ /dev/null
@@ -1,41 +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.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import javax.enterprise.inject.spi.Extension;
-
-import org.jboss.weld.bootstrap.spi.Metadata;
-
-public class ExtensionMetadata implements Metadata<Extension> {
-
-	public ExtensionMetadata(Extension extension, String location) {
-		_extension = extension;
-		_location = location;
-	}
-
-	@Override
-	public Extension getValue() {
-		return _extension;
-	}
-
-	@Override
-	public String getLocation() {
-		return _location;
-	}
-
-	private final Extension _extension;
-	private final String _location;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java
deleted file mode 100644
index 0433f2e..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/MarkedInjectionPoint.java
+++ /dev/null
@@ -1,58 +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.
- */
-
-package org.apache.aries.cdi.container.internal.container;
-
-import java.lang.annotation.Annotation;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.enterprise.inject.spi.InjectionPoint;
-
-import org.apache.aries.cdi.container.internal.util.Sets;
-import org.jboss.weld.injection.ForwardingInjectionPoint;
-
-public class MarkedInjectionPoint extends ForwardingInjectionPoint {
-
-	public MarkedInjectionPoint(InjectionPoint injectionPoint) {
-		_delegate = injectionPoint;
-		_mark = Mark.Literal.from(counter.incrementAndGet());
-		_qualifiers = Sets.hashSet(injectionPoint.getQualifiers(), _mark);
-	}
-
-	@Override
-	protected InjectionPoint delegate() {
-		return _delegate;
-	}
-
-	public InjectionPoint getDelegate() {
-		return delegate();
-	}
-
-	public Mark getMark() {
-		return _mark;
-	}
-
-	@Override
-	public Set<Annotation> getQualifiers() {
-		return _qualifiers;
-	}
-
-	private static final AtomicInteger counter = new AtomicInteger();
-
-	private final InjectionPoint _delegate;
-	private final Mark _mark;
-	private final Set<Annotation> _qualifiers;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
index 697b6f6..02d44ab 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
@@ -14,7 +14,7 @@
 
 package org.apache.aries.cdi.container.internal.container;
 
-import static javax.interceptor.Interceptor.Priority.*;
+import static javax.interceptor.Interceptor.Priority.PLATFORM_AFTER;
 
 import java.util.ArrayList;
 import java.util.Dictionary;
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
@@ -182,10 +183,7 @@ public class RuntimeExtension implements Extension {
 				for (ActivationTemplateDTO at : _containerTemplate.activations) {
 					ExtendedActivationTemplateDTO extended = (ExtendedActivationTemplateDTO)at;
 					if (extended.declaringClass.equals(declaringClass) &&
-						(((extended.producer == null) && (producer == null)) ||
-						(extended.producer != null) &&
-						(producer != null) &&
-						Objects.equals(extended.producer.getJavaMember(), producer.getJavaMember()))) {
+							equals(extended.producer, producer)) {
 
 						activationTemplate = extended;
 						break;
@@ -245,6 +243,8 @@ public class RuntimeExtension implements Extension {
 
 			registerService(serviceTypes, bm, properties);
 
+			_log.debug(l -> l.debug("CCR Container READY for {}", _containerState.bundle()));
+
 			return s;
 		});
 	}
@@ -292,7 +292,7 @@ public class RuntimeExtension implements Extension {
 					).findFirst().map(
 						ExtendedReferenceDTO.class::cast
 					).ifPresent(
-						r -> bean.setReferenceDTO(r)
+						bean::setReferenceDTO
 					);
 				}
 
@@ -329,6 +329,18 @@ public class RuntimeExtension implements Extension {
 		return producerFactory.createProducer(bean);
 	}
 
+	// Objects.equals(producer, producer1) is not expected to work so impl it as expected there
+	private boolean equals(AnnotatedMember<?> producerA, AnnotatedMember<?> producerB) {
+		if ((producerA == null) && (producerB == null)) return true;
+		if (!Objects.equals(producerA.getJavaMember(), producerB.getJavaMember())) {
+			return false;
+		}
+		if (!Objects.equals(producerA.getAnnotations(), producerB.getAnnotations())) {
+			return false;
+		}
+		return true;
+	}
+
 	private Promise<Boolean> initComponents() {
 		_containerState.containerDTO().template.components.stream().filter(
 			t -> t.type != ComponentType.CONTAINER
@@ -368,7 +380,7 @@ public class RuntimeExtension implements Extension {
 		return _containerState.submit(cl.openOp(), cl::open);
 	}
 
-	private boolean matchConfiguration(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
+	private void processConfiguration(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
 		InjectionPoint injectionPoint = pip.getInjectionPoint();
 
 		Class<?> declaringClass = Annotates.declaringClass(injectionPoint.getAnnotated());
@@ -379,22 +391,18 @@ public class RuntimeExtension implements Extension {
 			injectionPoint.getQualifiers()
 		).build().toDTO();
 
-		return osgiBean.getComponent().configurations.stream().map(
+		osgiBean.getComponent().configurations.stream().map(
 			t -> (ExtendedConfigurationTemplateDTO)t
 		).filter(
 			t -> current.equals(t)
-		).findFirst().map(
+		).findFirst().ifPresent(
 			t -> {
-				MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint(injectionPoint);
-
-				pip.setInjectionPoint(markedInjectionPoint);
-
-				t.bean.setInjectionPoint(injectionPoint);
-				t.bean.setMark(markedInjectionPoint.getMark());
+				final Mark mark = Mark.Literal.from(MARK_IP_COUNTER.incrementAndGet());
+				pip.configureInjectionPoint().addQualifiers(mark);
 
-				return true;
+				t.bean.setMark(mark);
 			}
-		).orElse(false);
+		);
 	}
 
 	private boolean matchReference(OSGiBean osgiBean, ProcessInjectionPoint<?, ?> pip) {
@@ -414,11 +422,10 @@ public class RuntimeExtension implements Extension {
 			t -> current.equals(t)
 		).findFirst().map(
 			t -> {
-				MarkedInjectionPoint markedInjectionPoint = new MarkedInjectionPoint(injectionPoint);
+				final Mark mark = Mark.Literal.from(MARK_IP_COUNTER.incrementAndGet());
+				pip.configureInjectionPoint().addQualifier(mark);
 
-				pip.setInjectionPoint(markedInjectionPoint);
-
-				t.bean.setMark(markedInjectionPoint.getMark());
+				t.bean.setMark(mark);
 
 				_log.debug(l -> l.debug("CCR maping InjectionPoint {} to reference template {}", injectionPoint, t));
 
@@ -449,7 +456,21 @@ public class RuntimeExtension implements Extension {
 		}
 
 		if (componentProperties != null) {
-			matchConfiguration(osgiBean, pip);
+			processConfiguration(osgiBean, pip);
+		}
+	}
+
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	private void registerServiceHandleFailure(
+		ExtendedComponentInstanceDTO componentInstance,
+		ExtendedActivationTemplateDTO activationTemplate,
+		BeanManager bm) {
+
+		try {
+			registerService(componentInstance, activationTemplate, bm);
+		}
+		catch (Throwable t) {
+			_log.error("CDI - An error occured", t);
 		}
 	}
 
@@ -553,7 +574,7 @@ public class RuntimeExtension implements Extension {
 		componentDTO.template.activations.stream().map(
 			ExtendedActivationTemplateDTO.class::cast
 		).forEach(
-			a -> registerService((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
+			a -> registerServiceHandleFailure((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
 		);
 
 		return true;
@@ -568,4 +589,5 @@ public class RuntimeExtension implements Extension {
 	private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>();
 	private final SingleComponent.Builder _singleBuilder;
 
+	private static final AtomicInteger MARK_IP_COUNTER = new AtomicInteger();
 }
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
index 9246c04..bf8f863 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
@@ -14,22 +14,26 @@
 
 package org.apache.aries.cdi.container.internal.loader;
 
+import static java.util.Objects.requireNonNull;
+
 import java.io.IOException;
 import java.net.URL;
-import java.net.URLClassLoader;
+import java.security.ProtectionDomain;
 import java.util.Collections;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
+import org.apache.aries.cdi.spi.loader.SpiLoader;
 import org.osgi.framework.Bundle;
 
-public class BundleClassLoader extends URLClassLoader {
-
-	public BundleClassLoader(Bundle[] bundles) {
-		super(new URL[0]);
+public class BundleClassLoader extends SpiLoader {
 
-		if (bundles.length == 0) {
+	public BundleClassLoader(List<Bundle> bundles) {
+		if (bundles.isEmpty()) {
 			throw new IllegalArgumentException(
 				"At least one bundle is required");
 		}
@@ -53,6 +57,9 @@ public class BundleClassLoader extends URLClassLoader {
 	@Override
 	public Enumeration<URL> findResources(String name) {
 		for (Bundle bundle : _bundles) {
+			if ((bundle.getState() & Bundle.UNINSTALLED) == Bundle.UNINSTALLED) {
+				continue;
+			}
 			try {
 				Enumeration<URL> enumeration = bundle.getResources(name);
 
@@ -62,12 +69,17 @@ public class BundleClassLoader extends URLClassLoader {
 			}
 			catch (IOException ioe) {
 			}
+
+			if (resourcePredicate != null && resourcePredicate.test(name)) {
+				return resourceFunction.apply(name);
+			}
 		}
 
 		return Collections.emptyEnumeration();
 	}
 
-	public Bundle[] getBundles() {
+	@Override
+	public List<Bundle> getBundles() {
 		return _bundles;
 	}
 
@@ -82,11 +94,34 @@ public class BundleClassLoader extends URLClassLoader {
 	}
 
 	@Override
+	public BundleClassLoader handleResources(
+		Predicate<String> predicate, Function<String, Enumeration<URL>> function) {
+
+		resourcePredicate = requireNonNull(predicate);
+		resourceFunction = requireNonNull(function);
+
+		return this;
+	}
+
+	@Override
+	public BundleClassLoader findClass(
+		Predicate<String> predicate, Function<String, Class<?>> function) {
+
+		classPredicate = requireNonNull(predicate);
+		classFunction = requireNonNull(function);
+
+		return this;
+	}
+
+	@Override
 	protected Class<?> findClass(String name) throws ClassNotFoundException {
 		Object classLoadingLock = getClassLoadingLock(name);
 
 		synchronized (classLoadingLock) {
 			for (Bundle bundle : _bundles) {
+				if ((bundle.getState() & Bundle.UNINSTALLED) == Bundle.UNINSTALLED) {
+					continue;
+				}
 				try {
 					return bundle.loadClass(name);
 				}
@@ -95,6 +130,10 @@ public class BundleClassLoader extends URLClassLoader {
 				}
 			}
 
+			if (classPredicate != null && classPredicate.test(name)) {
+				return classFunction.apply(name);
+			}
+
 			throw new ClassNotFoundException(name);
 		}
 	}
@@ -122,7 +161,62 @@ public class BundleClassLoader extends URLClassLoader {
 		}
 	}
 
-	private final Bundle[] _bundles;
+	@Override
+	public Class<?> getOrRegister(final String proxyClassName, final byte[] proxyBytes,
+								final Package pck, final ProtectionDomain protectionDomain) {
+		final String key = proxyClassName.replace('/', '.');
+		Class<?> existing = _cache.get(key);
+		if (existing == null) {
+			Object classLoadingLock = getClassLoadingLock(key);
+			synchronized (classLoadingLock) {
+				existing = _cache.get(key);
+				if (existing == null) {
+					definePackageFor(pck, protectionDomain);
+					existing = super.defineClass(proxyClassName, proxyBytes, 0, proxyBytes.length);
+					resolveClass(existing);
+					_cache.put(key, existing);
+				}
+			}
+		}
+		return existing;
+	}
+
+	private void definePackageFor(final Package model, final ProtectionDomain protectionDomain) {
+		if (model == null) {
+			return;
+		}
+		if (getPackage(model.getName()) == null) {
+			if (model.isSealed() && protectionDomain != null &&
+					protectionDomain.getCodeSource() != null &&
+					protectionDomain.getCodeSource().getLocation() != null) {
+				definePackage(
+						model.getName(),
+						model.getSpecificationTitle(),
+						model.getSpecificationVersion(),
+						model.getSpecificationVendor(),
+						model.getImplementationTitle(),
+						model.getImplementationVersion(),
+						model.getImplementationVendor(),
+						protectionDomain.getCodeSource().getLocation());
+			} else {
+				definePackage(
+						model.getName(),
+						model.getSpecificationTitle(),
+						model.getSpecificationVersion(),
+						model.getSpecificationVendor(),
+						model.getImplementationTitle(),
+						model.getImplementationVersion(),
+						model.getImplementationVendor(),
+						null);
+			}
+		}
+	}
+
+	private final List<Bundle> _bundles;
 	private final ConcurrentMap<String, Class<?>> _cache = new ConcurrentHashMap<>();
+	private volatile Predicate<String> classPredicate;
+	private volatile Function<String, Class<?>> classFunction;
+	private volatile Function<String, Enumeration<URL>> resourceFunction;
+	private volatile Predicate<String> resourcePredicate;
 
 }
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java
deleted file mode 100644
index 621ac34..0000000
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java
+++ /dev/null
@@ -1,136 +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.
- */
-
-package org.apache.aries.cdi.container.internal.loader;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.resources.spi.ResourceLoadingException;
-import org.jboss.weld.serialization.spi.ProxyServices;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.namespace.PackageNamespace;
-import org.osgi.framework.wiring.BundleCapability;
-import org.osgi.framework.wiring.BundleWire;
-import org.osgi.framework.wiring.BundleWiring;
-
-public class BundleResourcesLoader implements ProxyServices, ResourceLoader {
-
-	public static class Builder {
-
-		public Builder(Bundle bundle, Bundle extenderBundle) {
-			this.bundle = bundle;
-			this.extenderBundle = extenderBundle;
-		}
-
-		public Builder add(Bundle bundle) {
-			additionalBundles.add(bundle);
-			return this;
-		}
-
-		public BundleResourcesLoader build() {
-			return new BundleResourcesLoader(bundle, extenderBundle, additionalBundles);
-		}
-
-		private final Bundle bundle;
-		private final Bundle extenderBundle;
-		private final List<Bundle> additionalBundles = new ArrayList<>();
-	}
-
-	BundleResourcesLoader(Bundle bundle, Bundle extenderBundle, List<Bundle> additionalBundles) {
-		BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class);
-
-		List<Bundle> bundles = new ArrayList<>();
-
-		bundles.add(bundle);
-		bundles.add(extenderBundle);
-
-		List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE);
-
-		for (BundleWire bundleWire : requiredWires) {
-			BundleCapability capability = bundleWire.getCapability();
-			Map<String, Object> attributes = capability.getAttributes();
-			String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE);
-			if (!packageName.startsWith("org.jboss.weld.")) {
-				continue;
-			}
-
-			Bundle wireBundle = bundleWire.getProvider().getBundle();
-			if (!bundles.contains(wireBundle)) {
-				bundles.add(wireBundle);
-			}
-		}
-
-		bundles.addAll(additionalBundles);
-
-		_classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0]));
-	}
-
-
-	@Override
-	public void cleanup() {
-	}
-
-	@Override
-	public Class<?> classForName(String className) {
-		try {
-			return _classLoader.loadClass(className);
-		}
-		catch (ClassNotFoundException e) {
-			throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
-		}
-		catch (LinkageError e) {
-			throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
-		}
-		catch (TypeNotPresentException e) {
-			throw new ResourceLoadingException(ERROR_LOADING_CLASS + className, e);
-		}
-	}
-
-	@Override
-	public ClassLoader getClassLoader(Class<?> proxiedBeanType) {
-		return _classLoader;
-	}
-
-	@Override
-	public Class<?> loadBeanClass(String className) {
-		return classForName(className);
-	}
-
-	@Override
-	public URL getResource(String name) {
-		return _classLoader.getResource(name);
-	}
-
-	@Override
-	public Collection<URL> getResources(String name) {
-		try {
-			return Collections.list(_classLoader.getResources(name));
-		}
-		catch (IOException e) {
-			return Collections.emptyList();
-		}
-	}
-
-	private static final String ERROR_LOADING_CLASS = "Error loading class ";
-
-	private final ClassLoader _classLoader;
-
-}
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
index 4933d14..f39a5ff 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java
@@ -18,9 +18,6 @@ import java.net.URL;
 import java.util.Collection;
 import java.util.Map;
 
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.xml.BeansXmlParser;
-
 public class BeansModel {
 
 	public BeansModel(
@@ -28,22 +25,14 @@ public class BeansModel {
 		Collection<URL> beanDescriptorURLs) {
 
 		_beans = beans;
-
-		BeansXml beansXml = BeansXml.EMPTY_BEANS_XML;
-
-		if (!beanDescriptorURLs.isEmpty()) {
-			BeansXmlParser beansXmlParser = new BeansXmlParser();
-			beansXml = beansXmlParser.parse(beanDescriptorURLs);
-		}
-
-		_beansXml = beansXml;
+		_beansXml = beanDescriptorURLs;
 	}
 
 	public Collection<String> getBeanClassNames() {
 		return _beans.keySet();
 	}
 
-	public BeansXml getBeansXml() {
+	public Collection<URL> getBeansXml() {
 		return _beansXml;
 	}
 
@@ -60,6 +49,6 @@ public class BeansModel {
 	}
 
 	private final Map<String, OSGiBean> _beans;
-	private final BeansXml _beansXml;
+	private final Collection<URL> _beansXml;
 
 }
\ No newline at end of file
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
index 59c691d..2b7deb3 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ComponentPropertiesModel.java
@@ -26,7 +26,6 @@ import java.util.Set;
 import org.osgi.service.cdi.ConfigurationPolicy;
 import org.osgi.service.cdi.MaximumCardinality;
 import org.osgi.service.cdi.annotations.PID;
-import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 
 public class ComponentPropertiesModel {
 
@@ -98,7 +97,7 @@ public class ComponentPropertiesModel {
 		return _injectionPointType;
 	}
 
-	public ConfigurationTemplateDTO toDTO() {
+	public ExtendedConfigurationTemplateDTO toDTO() {
 		ExtendedConfigurationTemplateDTO dto = new ExtendedConfigurationTemplateDTO();
 
 		dto.beanClass = _beanClass;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
index c350c0c..dc3b430 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
@@ -14,19 +14,21 @@
 
 package org.apache.aries.cdi.container.internal.provider;
 
+import static java.util.Optional.ofNullable;
+
 import java.lang.annotation.Annotation;
+import java.util.Arrays;
 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.Activator;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleReference;
+import org.osgi.framework.Constants;
 
 public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
 
@@ -44,22 +46,24 @@ public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
 
 		@Override
 		public BeanManager getBeanManager() {
-			ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
-
-			if (contextClassLoader instanceof BundleReference) {
-				BundleReference br = (BundleReference)contextClassLoader;
-
-				Bundle bundle = br.getBundle();
-
-				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 class loader has been set to a Bundle's classloader.");
+			Bundle bundle = ofNullable(
+				Thread.currentThread().getContextClassLoader()
+			).map(BundleReference.class::cast).map(BundleReference::getBundle).orElseThrow(
+				() -> new IllegalStateException(
+					"No Bundle found for Thread.ContextClassLoader " + Thread.currentThread())
+			);
+
+			return Arrays.stream(bundle.getRegisteredServices()).filter(
+				sr -> ofNullable(
+					sr.getProperty(Constants.OBJECTCLASS)
+				).map(String[].class::cast).map(Arrays::asList).filter(
+					list -> list.contains(BeanManager.class.getName())
+				).isPresent()
+			).findFirst().map(
+				bundle.getBundleContext()::getService
+			).map(BeanManager.class::cast).orElseThrow(
+				() -> new IllegalStateException("No BeanManager service for bundle " + bundle)
+			);
 		}
 
 		@Override
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
index e4facbe..e2b7035 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/Annotates.java
@@ -14,6 +14,8 @@
 
 package org.apache.aries.cdi.container.internal.util;
 
+import static org.apache.aries.cdi.container.internal.util.Reflection.*;
+
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Executable;
 import java.lang.reflect.Parameter;
@@ -46,7 +48,6 @@ import javax.inject.Named;
 import javax.inject.Qualifier;
 import javax.inject.Scope;
 
-import org.jboss.weld.util.Types;
 import org.osgi.service.cdi.ServiceScope;
 import org.osgi.service.cdi.annotations.Service;
 import org.osgi.service.cdi.annotations.ServiceInstance;
@@ -94,8 +95,7 @@ public class Annotates {
 		}
 		else if (instance instanceof Annotated) {
 			Annotated annotated = (Annotated)instance;
-
-			declaringClass = Types.getRawTypes(new Type[] {annotated.getBaseType()})[0];
+			declaringClass = getRawType(annotated.getBaseType());
 		}
 		else if (instance instanceof ProcessManagedBean) {
 			ProcessManagedBean<?> bean = (ProcessManagedBean<?>)instance;
@@ -256,9 +256,7 @@ public class Annotates {
 	}
 
 	public static List<String> serviceClassNames(Annotated annotated) {
-		return serviceClasses(annotated).stream().map(
-			st -> st.getName()
-		).sorted().collect(Collectors.toList());
+		return serviceClasses(annotated).stream().map(Class::getName).sorted().collect(Collectors.toList());
 	}
 
 	public static ServiceScope serviceScope(Annotated annotated) {
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
index fbc8be2..66ef70b 100644
--- 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
@@ -60,7 +60,7 @@
 	}
 )
 @Capability(
-	attribute = "register:=javax.enterprise.inject.se.SeContainerInitializer",
+	attribute = "register:=org.apache.aries.cdi.container.internal.provider.SeContainerInitializer",
 	namespace = "osgi.serviceloader",
 	name = "javax.enterprise.inject.se.SeContainerInitializer",
 	uses = {
@@ -69,7 +69,7 @@
 	}
 )
 @Capability(
-	attribute = "register:=javax.enterprise.inject.spi.CDIProvider",
+	attribute = "register:=org.apache.aries.cdi.container.internal.provider.CDIProvider",
 	namespace = "osgi.serviceloader",
 	name = "javax.enterprise.inject.spi.CDIProvider",
 	uses = {
@@ -82,6 +82,11 @@
 	namespace = ExtenderNamespace.EXTENDER_NAMESPACE,
 	name = "osgi.serviceloader.registrar"
 )
+@Requirement(
+	namespace = ServiceNamespace.SERVICE_NAMESPACE,
+	filter = "(&(objectClass=javax.enterprise.inject.se.SeContainerInitializer)(aries.cdi.spi=*))",
+	effective = "active"
+)
 package org.apache.aries.cdi.container;
 
 import org.osgi.annotation.bundle.Capability;
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 74b70db..2170176 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
@@ -14,14 +14,19 @@
 
 package org.apache.aries.cdi.container.internal.phase;
 
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import javax.enterprise.inject.se.SeContainerInitializer;
+
 import org.apache.aries.cdi.container.internal.container.CheckedCallback;
 import org.apache.aries.cdi.container.internal.container.ConfigurationListener;
 import org.apache.aries.cdi.container.internal.container.ContainerBootstrap;
@@ -35,7 +40,9 @@ import org.apache.aries.cdi.container.internal.util.Logs;
 import org.apache.aries.cdi.container.test.BaseCDIBundleTest;
 import org.apache.aries.cdi.container.test.TestUtil;
 import org.apache.aries.cdi.container.test.beans.FooService;
+import org.junit.Ignore;
 import org.junit.Test;
+import org.osgi.framework.ServiceObjects;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.namespace.extender.ExtenderNamespace;
 import org.osgi.service.cdi.CDIConstants;
@@ -47,6 +54,7 @@ import org.osgi.util.tracker.ServiceTracker;
 
 public class ContainerBootstrapTest extends BaseCDIBundleTest {
 
+	@Ignore
 	@Test
 	public void test_publishServices() throws Exception {
 		Map<String, Object> attributes = new HashMap<>();
@@ -73,8 +81,11 @@ public class ContainerBootstrapTest extends BaseCDIBundleTest {
 		componentDTO.instances = new CopyOnWriteArrayList<>();
 		componentDTO.template = containerState.containerDTO().template.components.get(0);
 
+		@SuppressWarnings("unchecked")
+		ServiceTracker<SeContainerInitializer, ServiceObjects<SeContainerInitializer>> serviceTracker = mock(ServiceTracker.class);
+
 		ContainerBootstrap containerBootstrap = new ContainerBootstrap(
-			containerState,
+			containerState, serviceTracker,
 			new ConfigurationListener.Builder(containerState),
 			new SingleComponent.Builder(containerState, null),
 			new FactoryComponent.Builder(containerState, null));
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 b4d4892..4e4b7fd 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
@@ -14,10 +14,12 @@
 
 package org.apache.aries.cdi.container.internal.phase;
 
+import static java.util.Collections.singletonList;
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +62,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
 
 		assertNotNull(containerDTO.template);
 		List<ComponentTemplateDTO> components = TestUtil.sort(
-			containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+			containerDTO.template.components, Comparator.comparing(a -> a.name));
 		assertEquals(2, components.size());
 
 		{
@@ -134,7 +136,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
 
 		assertNotNull(containerDTO.template);
 		List<ComponentTemplateDTO> components = TestUtil.sort(
-			containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+			containerDTO.template.components, Comparator.comparing(a -> a.name));
 		assertEquals(3, components.size());
 
 		{
@@ -175,7 +177,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
 				ActivationTemplateDTO at = ct.activations.get(0);
 				assertEquals(Maps.of(), at.properties);
 				assertEquals(ServiceScope.SINGLETON, at.scope);
-				assertEquals(Arrays.asList("org.apache.aries.cdi.container.test.beans.Foo"), at.serviceClasses);
+				assertEquals(singletonList("org.apache.aries.cdi.container.test.beans.Foo"), at.serviceClasses);
 			}
 
 			assertEquals(2, ct.beans.size());
@@ -219,7 +221,7 @@ public class TemplatesTests extends BaseCDIBundleTest {
 		assertNotNull(containerDTO.template);
 
 		List<ComponentTemplateDTO> components = TestUtil.sort(
-			containerDTO.template.components, (a, b) -> a.name.compareTo(b.name));
+			containerDTO.template.components, Comparator.comparing(a -> a.name));
 		assertEquals(3, components.size());
 
 		{ // component "barService"
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java
deleted file mode 100644
index 0558319..0000000
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockBeanDeploymentArchive.java
+++ /dev/null
@@ -1,69 +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.
- */
-
-package org.apache.aries.cdi.container.test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.jboss.weld.bootstrap.api.ServiceRegistry;
-import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.BeansXml;
-import org.jboss.weld.ejb.spi.EjbDescriptor;
-
-public class MockBeanDeploymentArchive implements BeanDeploymentArchive {
-
-	public MockBeanDeploymentArchive(String id, String... beanClasses) {
-		_id = id;
-		_beanClasses = Arrays.asList(beanClasses);
-	}
-
-	@Override
-	public Collection<BeanDeploymentArchive> getBeanDeploymentArchives() {
-		return Collections.emptyList();
-	}
-
-	@Override
-	public Collection<String> getBeanClasses() {
-		return _beanClasses;
-	}
-
-	@Override
-	public BeansXml getBeansXml() {
-		return BeansXml.EMPTY_BEANS_XML;
-	}
-
-	@Override
-	public Collection<EjbDescriptor<?>> getEjbs() {
-		return Collections.emptyList();
-	}
-
-	@Override
-	public ServiceRegistry getServices() {
-		return _services;
-	}
-
-	@Override
-	public String getId() {
-		return _id;
-	}
-
-	private final List<String> _beanClasses;
-	private final String _id;
-	private final ServiceRegistry _services = new SimpleServiceRegistry();
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java
deleted file mode 100644
index 331b726..0000000
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockCdiContainer.java
+++ /dev/null
@@ -1,89 +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.
- */
-
-package org.apache.aries.cdi.container.test;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.Extension;
-
-import org.apache.aries.cdi.container.internal.container.ContainerDeployment;
-import org.apache.aries.cdi.container.internal.container.ContainerEnvironment;
-import org.jboss.weld.bootstrap.WeldBootstrap;
-import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
-import org.jboss.weld.bootstrap.spi.Deployment;
-import org.jboss.weld.bootstrap.spi.Metadata;
-import org.junit.Assert;
-
-public class MockCdiContainer implements AutoCloseable {
-
-	public MockCdiContainer(String name, String... beanClasses) {
-		this(name, Collections.emptyList(), beanClasses);
-	}
-
-	public MockCdiContainer(String name, List<Metadata<Extension>> extensions, String... beanClasses) {
-		_bda = new MockBeanDeploymentArchive(name, beanClasses);
-
-		Deployment deployment = new ContainerDeployment(extensions, _bda);
-
-		WeldBootstrap bootstrap = new WeldBootstrap();
-
-		bootstrap.startExtensions(extensions);
-		bootstrap.startContainer(new ContainerEnvironment(), deployment);
-		bootstrap.startInitialization();
-		bootstrap.deployBeans();
-		bootstrap.validateBeans();
-		bootstrap.endInitialization();
-
-		_bootstrap = bootstrap;
-	}
-
-	@Override
-	public void close() {
-		_bootstrap.shutdown();
-	}
-
-	public Bean<?> getBean(Class<?> clazz) {
-		final BeanManager managerImpl = getBeanManager();
-
-		Set<javax.enterprise.inject.spi.Bean<?>> beans =
-			managerImpl.getBeans(clazz, Any.Literal.INSTANCE);
-
-		Assert.assertFalse(beans.isEmpty());
-
-		return managerImpl.resolve(beans);
-	}
-
-	public BeanManager getBeanManager() {
-		if (_beanManager != null) {
-			return _beanManager;
-		}
-
-		return _beanManager = _bootstrap.getManager(_bda);
-	}
-
-	public WeldBootstrap getBootstrap() {
-		return _bootstrap;
-	}
-
-	private final BeanDeploymentArchive _bda;
-	private BeanManager _beanManager;
-	private final WeldBootstrap _bootstrap;
-
-}
\ No newline at end of file
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
index 413062b..edf0c55 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/MockInjectionPoint.java
@@ -28,8 +28,6 @@ import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.inject.Qualifier;
 
-import org.jboss.weld.exceptions.IllegalArgumentException;
-
 public class MockInjectionPoint implements InjectionPoint {
 
 	public MockInjectionPoint(AnnotatedElement annotatedElement) {
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
index 293a4e9..5da1cd3 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/test/TestUtil.java
@@ -41,8 +41,6 @@ import org.apache.aries.cdi.container.internal.model.BeansModel;
 import org.apache.aries.cdi.container.internal.util.Filters;
 import org.apache.aries.cdi.container.internal.util.Logs;
 import org.apache.aries.cdi.container.internal.util.Sfl4jLogger;
-import org.jboss.weld.resources.spi.ResourceLoader;
-import org.jboss.weld.serialization.spi.ProxyServices;
 import org.mockito.stubbing.Answer;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -71,7 +69,7 @@ import org.osgi.util.tracker.ServiceTracker;
 public class TestUtil {
 
 	public static <T extends Comparable<T>> List<T> sort(Collection<T> set) {
-		return sort(set, (c1, c2) -> c1.getClass().getName().compareTo(c2.getClass().getName()));
+		return sort(set, Comparator.comparing(c -> c.getClass().getName()));
 	}
 
 	public static <T> List<T> sort(Collection<T> set, Comparator<T> comparator) {
@@ -126,12 +124,6 @@ public class TestUtil {
 			public BeansModel beansModel() {
 				return beansModel;
 			}
-
-			@Override
-			public <T extends ResourceLoader & ProxyServices> T loader() {
-				return null;
-			}
-
 		};
 	}