update CI scripts

Signed-off-by: Raymond Augé <rotty3000@apache.org>
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index bd7817d..23708d0 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -10,20 +10,121 @@
 #    See the License for the specific language governing permissions and
 #    limitations under the License.
 
-name: Java CI
+name: CI Build
 
 on: [push, pull_request]
 
+env:
+  LC_ALL: en_US.UTF-8
+
 jobs:
-  build:
-
+  OpenJDK8_Linux:
+    name: OpenJDK8 Linux
     runs-on: ubuntu-latest
-
     steps:
-    - uses: actions/checkout@v1
-    - name: Set up JDK 1.8
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
       uses: actions/setup-java@v1
       with:
         java-version: 1.8
-    - name: Build with Maven - Java 8
-      run: mvn -U -e -B -ntp verify
+    - name: Build OpenJDK8 Linux
+      run: mvn -U -e -B -ntp install -Pitests
+  OpenJDK11_Linux:
+    name: OpenJDK11 Linux
+    runs-on: ubuntu-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 11
+    - name: Build OpenJDK11 Linux
+      run: mvn -U -e -B -ntp install -Pitests
+  OpenJDK13_Linux:
+    name: OpenJDK13 Linux
+    runs-on: ubuntu-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 13
+    - name: Build OpenJDK13 Linux
+      run: mvn -U -e -B -ntp install -Pitests
+  OpenJDK8_Windows:
+    name: OpenJDK8 Windows
+    runs-on: windows-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 1.8
+    - name: Build OpenJDK8 Windows
+      shell: bash
+      run: mvn -U -e -B -ntp install -Pitests
+  OpenJDK8_macOS:
+    name: OpenJDK8 macOS
+    runs-on: macos-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 1.8
+    - name: Build OpenJDK8 macOS
+      shell: bash
+      run: mvn -U -e -B -ntp install -Pitests
+  OpenJDK8_Linux_Experimental:
+    name: OpenJDK8 Linux Experimental
+    runs-on: ubuntu-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 1.8
+    - name: Build OpenJDK8 Linux Experimental
+      run: mvn -U -e -B -ntp install -Pexperimental
+  OpenJDK11_Linux_Experimental:
+    name: OpenJDK11 Linux Experimental
+    runs-on: ubuntu-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 11
+    - name: Build OpenJDK11 Linux Experimental
+      run: mvn -U -e -B -ntp install -Pexperimental
+  OpenJDK13_Linux_Experimental:
+    name: OpenJDK13 Linux Experimental
+    runs-on: ubuntu-latest
+    steps:
+    - name: Git Checkout
+      uses: actions/checkout@v1
+    - name: Set up Java
+      uses: actions/setup-java@v1
+      with:
+        java-version: 13
+    - name: Build OpenJDK13 Linux Experimental
+      run: mvn -U -e -B -ntp install -Pexperimental
+#  OpenJDK14_Linux_Experimental:
+#    name: OpenJDK14 Linux Experimental
+#    runs-on: ubuntu-latest
+#    steps:
+#    - name: Git Checkout
+#      uses: actions/checkout@v1
+#    - name: Set up Java
+#      uses: actions/setup-java@v1
+#      with:
+#        java-version: 14.0.0-ea
+#    - name: Build OpenJDK14 Linux Experimental
+#      run: mvn -U -e -B -ntp install -Pexperimental
diff --git a/cdi-executable/base.bndrun b/cdi-executable/base.bndrun
index 6216eda..0219519 100644
--- a/cdi-executable/base.bndrun
+++ b/cdi-executable/base.bndrun
@@ -14,7 +14,7 @@
 #-runvm: -Xdebug, "-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"
 
 -standalone: true
--runee: JavaSE-1.8
+-runee: JavaSE-${if;${startswith;${java.version};1.};${substring;${java.version};0;3};${subst;${java.version};\\..*}}
 -runfw: org.eclipse.osgi
 -runkeep: true
 -runproperties: \
diff --git a/cdi-extender/pom.xml b/cdi-extender/pom.xml
index 9e47dbf..c373daf 100644
--- a/cdi-extender/pom.xml
+++ b/cdi-extender/pom.xml
@@ -210,7 +210,7 @@
 		<dependency>
 			<groupId>org.mockito</groupId>
 			<artifactId>mockito-core</artifactId>
-			<version>2.13.0</version>
+			<version>3.2.4</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java
index a4ef0dc..5a8d14c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java
@@ -140,7 +140,7 @@
 		}
 
 		try (Syncro open = _syncro.open()) {
-			_referenceDTO.matches.removeIf(d -> d.id == SRs.id(reference));
+			_referenceDTO.matches.removeIf(d -> SRs.id(reference) == d.id);
 
 			if (collectionType == CollectionType.BINDER_SERVICE ||
 				collectionType == CollectionType.BINDER_REFERENCE ||
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java
index d358161..68b782c 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java
@@ -14,6 +14,8 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
+import static java.util.Objects.requireNonNull;
+
 import java.lang.annotation.Annotation;
 import java.util.Arrays;
 import java.util.Map;
@@ -69,14 +71,15 @@
 				serviceRegistration = null;
 			}
 
-			_instance.activations.removeIf(
+			_instance.activations.forEach(
 				a -> {
 					ExtendedActivationDTO extended = (ExtendedActivationDTO)a;
-					extended.onClose.accept(extended);
-					return true;
+					requireNonNull(extended.onClose).accept(extended);
 				}
 			);
 
+			_instance.activations.clear();
+
 			_instance.active = false;
 
 			return true;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java
index a59d5a3..ee02cfd 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java
@@ -14,11 +14,12 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
+import static java.util.Objects.requireNonNull;
+
 import java.lang.annotation.Annotation;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -69,16 +70,15 @@
 				serviceRegistration = null;
 			}
 
-			_instance.activations.removeIf(
+			_instance.activations.forEach(
 				a -> {
 					ExtendedActivationDTO extended = (ExtendedActivationDTO)a;
-					Objects.requireNonNull(extended);
-					Objects.requireNonNull(extended.onClose);
-					extended.onClose.accept(extended);
-					return true;
+					requireNonNull(extended.onClose).accept(extended);
 				}
 			);
 
+			_instance.activations.clear();
+
 			_instance.active = false;
 
 			return true;
diff --git a/cdi-extension-mp-config/base-itest.bndrun b/cdi-extension-mp-config/base-itest.bndrun
index b12de6f..f7dc2a3 100644
--- a/cdi-extension-mp-config/base-itest.bndrun
+++ b/cdi-extension-mp-config/base-itest.bndrun
@@ -13,7 +13,7 @@
 #-runjdb: 8000
 
 -standalone: true
--runee: JavaSE-1.8
+-runee: JavaSE-${if;${startswith;${java.version};1.};${substring;${java.version};0;3};${subst;${java.version};\\..*}}
 -runfw: org.eclipse.osgi
 -runproperties: \
 	eclipse.log.enabled=false,\
diff --git a/cdi-extension-mp-config/pom.xml b/cdi-extension-mp-config/pom.xml
index 34ce7c3..0c62b97 100644
--- a/cdi-extension-mp-config/pom.xml
+++ b/cdi-extension-mp-config/pom.xml
@@ -209,6 +209,12 @@
 					<artifactId>org.osgi.test.assertj</artifactId>
 					<version>1.0.0-SNAPSHOT</version>
 					<scope>test</scope>
+					<exclusions>
+						<exclusion>
+							<groupId>org.osgi</groupId>
+							<artifactId>osgi.promise</artifactId>
+						</exclusion>
+					</exclusions>
 				</dependency>
 				<dependency>
 					<groupId>org.osgi</groupId>
@@ -228,7 +234,7 @@
 							<execution>
 								<id>bnd-process-test</id>
 								<goals>
-									<goal>bnd-process-test</goal>
+									<goal>bnd-process-tests</goal>
 								</goals>
 								<configuration>
 									<bnd><![CDATA[
diff --git a/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/BaseTestCase.java b/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/BaseTestCase.java
index ad8165d..b2075d7 100644
--- a/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/BaseTestCase.java
+++ b/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/BaseTestCase.java
@@ -35,7 +35,7 @@
 @RequireCDIExtension("eclipse.microprofile.config")
 public abstract class BaseTestCase {
 
-	public static final long timeout = 500;
+	public static final long timeout = 5000;
 
 	@Rule
 	public BundleContextRule bcr = new BundleContextRule();
@@ -55,6 +55,18 @@
 		}
 	};
 
+	public <S,T> CloseableTracker<S, T> track(Class<S> typeToTrack) {
+		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), typeToTrack);
+		tracker.open();
+		return tracker;
+	}
+
+	public <S,T> CloseableTracker<S, T> track(Class<S> typeToTrack, String pattern, Object... objects) {
+		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), format("(&(objectClass=%s)%s)", typeToTrack.getName(), format(pattern, objects)));
+		tracker.open();
+		return tracker;
+	}
+
 	public <S,T> CloseableTracker<S, T> track(Filter filter) {
 		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), filter);
 		tracker.open();
@@ -114,6 +126,10 @@
 
 	public static class CloseableTracker<S, T> extends ServiceTracker<S, T> implements AutoCloseable {
 
+		public CloseableTracker(BundleContext context, Class<S> typeToTrack) {
+			super(context, typeToTrack, null);
+		}
+
 		public CloseableTracker(BundleContext context, Filter filter) {
 			super(context, filter, null);
 		}
diff --git a/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/MpConfigTests.java b/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/MpConfigTests.java
index 917179e..87690c8 100644
--- a/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/MpConfigTests.java
+++ b/cdi-extension-mp-config/src/test/java/org/apache/aries/cdi/extension/mp/config/test/MpConfigTests.java
@@ -16,19 +16,26 @@
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import javax.enterprise.inject.spi.BeanManager;
+
 import org.apache.aries.cdi.extension.mp.config.test.interfaces.Pojo;
 import org.junit.Test;
+import org.osgi.framework.Bundle;
 
 public class MpConfigTests extends BaseTestCase {
 
 	@Test
 	public void testConfigIsSet() throws Exception {
-		bcr.installBundle("tb01.jar");
+		Bundle bundle = bcr.installBundle("tb01.jar");
 
-		try (CloseableTracker<Pojo, Pojo> tracker = track("(objectClass=%s)", Pojo.class.getName())) {
-			Pojo pojo = tracker.waitForService(timeout);
+		try (CloseableTracker<BeanManager, BeanManager> bmt = track(BeanManager.class, "(service.bundleid=%d)", bundle.getBundleId())) {
+			assertThat(bmt.waitForService(timeout)).isNotNull();
 
-			assertThat(pojo).extracting(it -> it.foo(null)).isEqualTo("[foo]");
+			try (CloseableTracker<Pojo, Pojo> tracker = track("(objectClass=%s)", Pojo.class.getName())) {
+				Pojo pojo = tracker.waitForService(timeout);
+
+				assertThat(pojo).isNotNull().extracting(it -> it.foo(null)).isEqualTo("[foo]");
+			}
 		}
 	}
 
diff --git a/cdi-extension-mp-jwt-auth/base-itest.bndrun b/cdi-extension-mp-jwt-auth/base-itest.bndrun
index b12de6f..f7dc2a3 100644
--- a/cdi-extension-mp-jwt-auth/base-itest.bndrun
+++ b/cdi-extension-mp-jwt-auth/base-itest.bndrun
@@ -13,7 +13,7 @@
 #-runjdb: 8000
 
 -standalone: true
--runee: JavaSE-1.8
+-runee: JavaSE-${if;${startswith;${java.version};1.};${substring;${java.version};0;3};${subst;${java.version};\\..*}}
 -runfw: org.eclipse.osgi
 -runproperties: \
 	eclipse.log.enabled=false,\
diff --git a/cdi-extension-mp-jwt-auth/pom.xml b/cdi-extension-mp-jwt-auth/pom.xml
index 42da435..a40f057 100644
--- a/cdi-extension-mp-jwt-auth/pom.xml
+++ b/cdi-extension-mp-jwt-auth/pom.xml
@@ -365,7 +365,7 @@
 							<execution>
 								<id>bnd-process-test</id>
 								<goals>
-									<goal>bnd-process-test</goal>
+									<goal>bnd-process-tests</goal>
 								</goals>
 								<configuration>
 									<bnd><![CDATA[
diff --git a/cdi-extension-mp-jwt-auth/src/test/java/org/apache/aries/cdi/extension/mp/jwt/test/BaseTestCase.java b/cdi-extension-mp-jwt-auth/src/test/java/org/apache/aries/cdi/extension/mp/jwt/test/BaseTestCase.java
index b5f6d0f..f36e8ed 100644
--- a/cdi-extension-mp-jwt-auth/src/test/java/org/apache/aries/cdi/extension/mp/jwt/test/BaseTestCase.java
+++ b/cdi-extension-mp-jwt-auth/src/test/java/org/apache/aries/cdi/extension/mp/jwt/test/BaseTestCase.java
@@ -33,7 +33,7 @@
 
 public abstract class BaseTestCase {
 
-	public static final long timeout = 500;
+	public static final long timeout = 5000;
 
 	@Rule
 	public BundleContextRule bcr = new BundleContextRule();
diff --git a/cdi-extension-mp-metrics/base-itest.bndrun b/cdi-extension-mp-metrics/base-itest.bndrun
index b12de6f..f7dc2a3 100644
--- a/cdi-extension-mp-metrics/base-itest.bndrun
+++ b/cdi-extension-mp-metrics/base-itest.bndrun
@@ -13,7 +13,7 @@
 #-runjdb: 8000
 
 -standalone: true
--runee: JavaSE-1.8
+-runee: JavaSE-${if;${startswith;${java.version};1.};${substring;${java.version};0;3};${subst;${java.version};\\..*}}
 -runfw: org.eclipse.osgi
 -runproperties: \
 	eclipse.log.enabled=false,\
diff --git a/cdi-extension-mp-metrics/pom.xml b/cdi-extension-mp-metrics/pom.xml
index 7b808d0..d57b04d 100644
--- a/cdi-extension-mp-metrics/pom.xml
+++ b/cdi-extension-mp-metrics/pom.xml
@@ -270,7 +270,7 @@
 							<execution>
 								<id>bnd-process-test</id>
 								<goals>
-									<goal>bnd-process-test</goal>
+									<goal>bnd-process-tests</goal>
 								</goals>
 								<configuration>
 									<bnd><![CDATA[
diff --git a/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/BaseTestCase.java b/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/BaseTestCase.java
index 392c44d..b4a9161 100644
--- a/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/BaseTestCase.java
+++ b/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/BaseTestCase.java
@@ -33,7 +33,7 @@
 
 public abstract class BaseTestCase {
 
-	public static final long timeout = 500;
+	public static final long timeout = 5000;
 
 	@Rule
 	public BundleContextRule bcr = new BundleContextRule();
@@ -53,6 +53,18 @@
 		}
 	};
 
+	public <S,T> CloseableTracker<S, T> track(Class<S> typeToTrack) {
+		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), typeToTrack);
+		tracker.open();
+		return tracker;
+	}
+
+	public <S,T> CloseableTracker<S, T> track(Class<S> typeToTrack, String pattern, Object... objects) {
+		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), format("(&(objectClass=%s)%s)", typeToTrack.getName(), format(pattern, objects)));
+		tracker.open();
+		return tracker;
+	}
+
 	public <S,T> CloseableTracker<S, T> track(Filter filter) {
 		CloseableTracker<S, T> tracker = new CloseableTracker<>(bcr.getBundleContext(), filter);
 		tracker.open();
@@ -112,6 +124,10 @@
 
 	public static class CloseableTracker<S, T> extends ServiceTracker<S, T> implements AutoCloseable {
 
+		public CloseableTracker(BundleContext context, Class<S> typeToTrack) {
+			super(context, typeToTrack, null);
+		}
+
 		public CloseableTracker(BundleContext context, Filter filter) {
 			super(context, filter, null);
 		}
diff --git a/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/MpMetricsTests.java b/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/MpMetricsTests.java
index 8d004fa..d7b8751 100644
--- a/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/MpMetricsTests.java
+++ b/cdi-extension-mp-metrics/src/test/java/org/apache/aries/cdi/extension/mp/metrics/test/MpMetricsTests.java
@@ -14,45 +14,68 @@
 
 package org.apache.aries.cdi.extension.mp.metrics.test;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.osgi.service.jaxrs.whiteboard.JaxrsWhiteboardConstants.JAX_RS_MEDIA_TYPE;
 
+import javax.enterprise.inject.spi.BeanManager;
+import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.MessageBodyReader;
 
 import org.apache.aries.cdi.extension.mp.metrics.test.interfaces.Pojo;
 import org.assertj.core.api.Assertions;
+import org.junit.Rule;
 import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.test.junit4.service.ServiceUseRule;
 
 public class MpMetricsTests extends JaxrsBaseTestCase {
 
+	@Rule
+	@SuppressWarnings("rawtypes")
+	public ServiceUseRule<MessageBodyReader> mbr = new ServiceUseRule.Builder<>(MessageBodyReader.class) //
+		.filter("(%s=%s)", JAX_RS_MEDIA_TYPE, APPLICATION_JSON)
+		.build();
+
 	@Test
 	public void testMetrics() throws Exception {
-		bcr.installBundle("tb01.jar");
+		Bundle bundle = bcr.installBundle("tb01.jar");
 
-		try (CloseableTracker<Pojo, Pojo> tracker = track("(objectClass=%s)", Pojo.class.getName())) {
-			Pojo pojo = tracker.waitForService(timeout);
-			assertNotNull(pojo);
+		try (CloseableTracker<BeanManager, BeanManager> bmt = track(BeanManager.class, "(service.bundleid=%d)", bundle.getBundleId())) {
+			assertThat(bmt.waitForService(timeout)).isNotNull();
 
-			WebTarget webTarget = cbr.getService().build().target(getJaxrsEndpoint()).path("/metrics/application");
+			try (CloseableTracker<Pojo, Pojo> tracker = track("(objectClass=%s)", Pojo.class.getName())) {
+				Pojo pojo = tracker.waitForService(timeout);
+				assertNotNull(pojo);
 
-			Response response = webTarget.request().get();
+				final ClientBuilder cb = cbr.getService();
+				cb.register(mbr.getService());
 
-			assertEquals(response.readEntity(String.class),200, response.getStatus());
+				WebTarget webTarget = cb.build().target(getJaxrsEndpoint()).path("/metrics/application");
 
-			String result = response.readEntity(String.class);
+				Response response = webTarget.request(APPLICATION_JSON_TYPE).get();
 
-			assertEquals("{\"org.apache.aries.cdi.extension.mp.metrics.test.tb01.A.applicationCount\":0}", result);
+				assertEquals(response.readEntity(String.class),200, response.getStatus());
 
-			Assertions.assertThat(pojo.foo("Count: ")).isEqualTo("Count: 1");
+				String result = response.readEntity(String.class);
 
-			response = webTarget.request().get();
+				assertEquals("{\"org.apache.aries.cdi.extension.mp.metrics.test.tb01.A.applicationCount\":0}", result);
 
-			assertEquals(200, response.getStatus());
+				Assertions.assertThat(pojo.foo("Count: ")).isEqualTo("Count: 1");
 
-			result = response.readEntity(String.class);
+				response = webTarget.request(APPLICATION_JSON_TYPE).get();
 
-			assertEquals("{\"org.apache.aries.cdi.extension.mp.metrics.test.tb01.A.applicationCount\":1}", result);
+				assertEquals(200, response.getStatus());
+
+				result = response.readEntity(String.class);
+
+				assertEquals("{\"org.apache.aries.cdi.extension.mp.metrics.test.tb01.A.applicationCount\":1}", result);
+			}
 		}
 	}
 
diff --git a/cdi-extension-servlet-weld/src/main/java/org/apache/aries/cdi/extension/servlet/weld/WeldServletExtension.java b/cdi-extension-servlet-weld/src/main/java/org/apache/aries/cdi/extension/servlet/weld/WeldServletExtension.java
index c1c1e8d..a91af52 100644
--- a/cdi-extension-servlet-weld/src/main/java/org/apache/aries/cdi/extension/servlet/weld/WeldServletExtension.java
+++ b/cdi-extension-servlet-weld/src/main/java/org/apache/aries/cdi/extension/servlet/weld/WeldServletExtension.java
@@ -23,6 +23,8 @@
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.annotation.Priority;
@@ -135,6 +137,7 @@
 		implements HttpSessionListener, ServletContextListener, ServletRequestListener {
 
 		private final T delegate;
+		private final CountDownLatch latch = new CountDownLatch(1);
 
 		public ListenerWrapper(T delegate) {
 			this.delegate = delegate;
@@ -143,7 +146,9 @@
 		@Override
 		public void contextDestroyed(ServletContextEvent sce) {
 			try {
+				latch.await(20, TimeUnit.SECONDS);
 				delegate.contextDestroyed(sce);
+			} catch (InterruptedException e) {
 			}
 			finally {
 				destroyed.set(true);
@@ -153,26 +158,43 @@
 		@Override
 		public void contextInitialized(ServletContextEvent sce) {
 			delegate.contextInitialized(sce);
+			latch.countDown();
 		}
 
 		@Override
 		public void requestDestroyed(ServletRequestEvent sre) {
-			delegate.requestDestroyed(sre);
+			try {
+				latch.await(20, TimeUnit.SECONDS);
+				delegate.requestDestroyed(sre);
+			} catch (InterruptedException e) {
+			}
 		}
 
 		@Override
 		public void requestInitialized(ServletRequestEvent sre) {
-			delegate.requestInitialized(sre);
+			try {
+				latch.await(20, TimeUnit.SECONDS);
+				delegate.requestInitialized(sre);
+			} catch (InterruptedException e) {
+			}
 		}
 
 		@Override
 		public void sessionCreated(HttpSessionEvent se) {
-			delegate.sessionCreated(se);
+			try {
+				latch.await(20, TimeUnit.SECONDS);
+				delegate.sessionCreated(se);
+			} catch (InterruptedException e) {
+			}
 		}
 
 		@Override
 		public void sessionDestroyed(HttpSessionEvent se) {
-			delegate.sessionDestroyed(se);
+			try {
+				latch.await(20, TimeUnit.SECONDS);
+				delegate.sessionDestroyed(se);
+			} catch (InterruptedException e) {
+			}
 		}
 
 	}
diff --git a/cdi-itests/base-itest.bndrun b/cdi-itests/base-itest.bndrun
index 9a421cb..92a9782 100644
--- a/cdi-itests/base-itest.bndrun
+++ b/cdi-itests/base-itest.bndrun
@@ -13,7 +13,7 @@
 #-runjdb: 8000
 
 -standalone: true
--runee: JavaSE-1.8
+-runee: JavaSE-${if;${startswith;${java.version};1.};${substring;${java.version};0;3};${subst;${java.version};\\..*}}
 -runfw: org.eclipse.osgi
 -runproperties: \
 	eclipse.log.enabled=false,\
diff --git a/cdi-itests/pom.xml b/cdi-itests/pom.xml
index d478c15..40459a0 100644
--- a/cdi-itests/pom.xml
+++ b/cdi-itests/pom.xml
@@ -357,15 +357,4 @@
 			</plugin>
 		</plugins>
 	</build>
-
-	<repositories>
-		<repository>
-			<id>Sonatype OSSR</id>
-			<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-			<layout>default</layout>
-			<releases>
-				<enabled>false</enabled>
-			</releases>
-		</repository>
-	</repositories>
 </project>
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiExtenderTests.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiExtenderTests.java
index 0a83e39..f195bbb 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiExtenderTests.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/CdiExtenderTests.java
@@ -30,7 +30,7 @@
 	public void testStopExtender() throws Exception {
 		Bundle cdiExtenderBundle = getCdiExtenderBundle();
 
-		try (CloseableTracker<BeanManager, BeanManager> tracker = trackBM(cdiBundle);) {
+		try (CloseableTracker<BeanManager, BeanManager> tracker = trackBM(cdiBundle.getBundleId());) {
 			BeanManager beanManager = tracker.waitForService(timeout);
 
 			assertNotNull(beanManager);
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
index e4680fc..de0928e 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
@@ -18,6 +18,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 
+import java.util.Arrays;
+
 import javax.enterprise.inject.spi.BeanManager;
 import javax.naming.InitialContext;
 
@@ -34,9 +36,7 @@
 
 	@Test
 	public void testGetBeanManagerThroughJNDI() throws Exception {
-		Bundle testBundle = bcr.installBundle("tb21.jar", false);
-
-		testBundle.start();
+		Bundle testBundle = bcr.installBundle("tb21.jar");
 
 		assertNotNull(getBeanManager(testBundle));
 
@@ -68,26 +68,40 @@
 			}
 		};
 		bundleTracker.open();
+		assertFalse(bundleTracker.isEmpty());
 
-		Bundle testBundle = bcr.installBundle("tb21.jar", false);
-
-		testBundle.start();
 
 		try (CloseableTracker<Pojo, Pojo> tracker = track("(objectClass=%s)", Pojo.class.getName())) {
-			assertFalse(bundleTracker.isEmpty());
-
 			Bundle extensionBundle = bundleTracker.getBundles()[0];
 
-			try (CloseableTracker<BeanManager, BeanManager> bmTracker = trackBM(testBundle);) {
-				assertNotNull(bmTracker.waitForService(timeout));
+			Bundle testBundle = bcr.installBundle("tb21.jar", false);
+
+			try (CloseableTracker<BeanManager, BeanManager> bmTracker = trackBM(testBundle.getBundleId());) {
+				assertThat(bmTracker).matches(CloseableTracker::isEmpty, "BeanManager tracker is empty");
+
+				int trackingCount = bmTracker.getTrackingCount();
+
+				testBundle.start();
+
+				for (int i = 1000; (i > 0) && bmTracker.getTrackingCount() == trackingCount; i--) {
+					Thread.sleep(20);
+				}
+
+				assertThat(bmTracker).matches(t -> !t.isEmpty(), "BeanManager tracker is not empty");
+
+				trackingCount = bmTracker.getTrackingCount();
 
 				extensionBundle.stop();
 
-				for (int i = 100; (i > 0) && !bmTracker.isEmpty(); i--) {
-					Thread.sleep(100);
+				for (int i = 1000; (i > 0) && bmTracker.getTrackingCount() == trackingCount; i--) {
+					Thread.sleep(20);
 				}
 
-				assertThat(bmTracker).matches(CloseableTracker::isEmpty, "Is empty");
+				assertThat(extensionBundle).matches(b -> (b.getState() & Bundle.ACTIVE) == 0, "JNDI Extension Bundle is not Active");
+
+				assertThat(bmTracker).matches(
+					CloseableTracker::isEmpty, String.format("Is empty: <%s>", Arrays.toString(bmTracker.getServiceReferences()))
+				);
 
 				extensionBundle.start();
 
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/base/BaseTestCase.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/base/BaseTestCase.java
index 62de0f3..ece8cf0 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/base/BaseTestCase.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/base/BaseTestCase.java
@@ -182,16 +182,20 @@
 	}
 
 	public BeanManager getBeanManager(Bundle bundle) throws Exception {
-		return trackBM(bundle).waitForService(timeout);
+		return trackBM(bundle.getBundleId()).waitForService(timeout);
 	}
 
-	public CloseableTracker<BeanManager, BeanManager> trackBM(Bundle bundle) throws Exception {
+	public BeanManager getBeanManager(long bundleId) throws Exception {
+		return trackBM(bundleId).waitForService(timeout);
+	}
+
+	public CloseableTracker<BeanManager, BeanManager> trackBM(long bundleId) throws Exception {
 		CloseableTracker<BeanManager, BeanManager> serviceTracker = new CloseableTracker<>(
-			bundle.getBundleContext(),
+			bcr.getBundleContext(),
 			format(
 				"(&(objectClass=%s)(service.bundleid=%d))",
 				BeanManager.class.getName(),
-				bundle.getBundleId()),
+				bundleId),
 			null);
 		serviceTracker.open();
 		return serviceTracker;
diff --git a/pom.xml b/pom.xml
index 9730e3a..bc29786 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,10 +33,10 @@
 	<packaging>pom</packaging>
 
 	<properties>
-		<java.version>1.8</java.version>
-		<!-- <maven.compiler.release>${java.version}</maven.compiler.release> -->
-		<maven.compiler.source>${java.version}</maven.compiler.source>
-		<maven.compiler.target>${java.version}</maven.compiler.target>
+		<java.build.version>1.8</java.build.version>
+		<!-- <maven.compiler.release>${java.build.version}</maven.compiler.release> -->
+		<maven.compiler.source>${java.build.version}</maven.compiler.source>
+		<maven.compiler.target>${java.build.version}</maven.compiler.target>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.site.skip>true</maven.site.skip>
 		<maven.site.deploy.skip>true</maven.site.deploy.skip>
@@ -45,6 +45,8 @@
 		<bnd.version>4.3.1</bnd.version>
 		<byte.buddy.version>1.10.6</byte.buddy.version>
 		<jax.rs.whiteboard.version>1.0.6</jax.rs.whiteboard.version>
+		<jaxb.api.version>2.3.2</jaxb.api.version>
+		<jakarta.xml.ws-api>2.3.2</jakarta.xml.ws-api>
 		<jsp.version>2.0</jsp.version>
 		<mp.config.version>1.3</mp.config.version>
 		<mp.jwt.auth.version>1.1.1</mp.jwt.auth.version>
@@ -90,6 +92,27 @@
 	<dependencyManagement>
 		<dependencies>
 			<dependency>
+				<groupId>com.sun.xml.bind</groupId>
+				<artifactId>jaxb-impl</artifactId>
+				<version>${jaxb.api.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>jakarta.xml.ws</groupId>
+				<artifactId>jakarta.xml.ws-api</artifactId>
+				<version>${jakarta.xml.ws-api}</version>
+				<scope>runtime</scope>
+				<exclusions>
+					<exclusion>
+						<groupId>jakarta.activation</groupId>
+						<artifactId>jakarta.activation-api</artifactId>
+					</exclusion>
+					<exclusion>
+						<groupId>jakarta.annotation</groupId>
+						<artifactId>jakarta.annotation-api</artifactId>
+					</exclusion>
+				</exclusions>
+			</dependency>
+			<dependency>
 				<groupId>org.apache.felix</groupId>
 				<artifactId>org.apache.felix.converter</artifactId>
 				<version>1.0.12</version>
@@ -112,6 +135,11 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.geronimo.specs</groupId>
+				<artifactId>geronimo-activation_1.1_spec</artifactId>
+				<version>1.1</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.geronimo.specs</groupId>
 				<artifactId>geronimo-atinject_1.0_spec</artifactId>
 				<version>1.1</version>
 			</dependency>
@@ -222,6 +250,16 @@
 			<modules>
 				<module>cdi-itests</module>
 			</modules>
+			<repositories>
+				<repository>
+					<id>Sonatype OSSR</id>
+					<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+					<layout>default</layout>
+					<releases>
+						<enabled>false</enabled>
+					</releases>
+				</repository>
+			</repositories>
 		</profile>
 
 		<profile>
@@ -246,6 +284,22 @@
 						<enabled>false</enabled>
 					</releases>
 				</repository>
+				<repository>
+					<id>bnd-snapshots</id>
+					<url>https://bndtools.jfrog.io/bndtools/libs-snapshot/</url>
+					<layout>default</layout>
+					<releases>
+						<enabled>false</enabled>
+					</releases>
+				</repository>
+				<repository>
+					<id>Sonatype OSSR</id>
+					<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+					<layout>default</layout>
+					<releases>
+						<enabled>false</enabled>
+					</releases>
+				</repository>
 			</repositories>
 
 			<pluginRepositories>