diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 987588a6..c2e60bf4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - jakarta paths-ignore: - '.gitignore' - 'CODEOWNERS' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0febf759..12bd6a57 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,8 +28,7 @@ jobs: - uses: actions/setup-java@v1 with: - # https://issues.sonatype.org/browse/NEXUS-31214 - java-version: 12 + java-version: 17 - name: maven release ${{steps.metadata.outputs.current-version}} run: | diff --git a/api/pom.xml b/api/pom.xml index 459dfd73..19ffd587 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -1,13 +1,14 @@ + 4.0.0 smallrye-context-propagation-parent io.smallrye 2.0.1-SNAPSHOT - 4.0.0 smallrye-context-propagation-api + SmallRye Context Propagation: API diff --git a/api/src/main/java/io/smallrye/context/api/CurrentThreadContext.java b/api/src/main/java/io/smallrye/context/api/CurrentThreadContext.java index 210f75f8..18f82e3e 100644 --- a/api/src/main/java/io/smallrye/context/api/CurrentThreadContext.java +++ b/api/src/main/java/io/smallrye/context/api/CurrentThreadContext.java @@ -43,7 +43,7 @@ /** * Defines that the current thread context should be removed. This is mutually exclusive * with the other settings. - * + * * @return a boolean indicating if the current thread context should be removed. Defaults to false. */ @Nonbinding @@ -151,7 +151,7 @@ * For example, to run as the current application, but under the * transaction of the thread where the task executes: *

- * + * *
      *  {@literal @}WithThreadContext(unchanged = ThreadContext.TRANSACTION,
      *                              propagated = ThreadContext.APPLICATION,
diff --git a/api/src/main/java/io/smallrye/context/api/ThreadContextConfig.java b/api/src/main/java/io/smallrye/context/api/ThreadContextConfig.java
index a4587d1a..5939d4c4 100644
--- a/api/src/main/java/io/smallrye/context/api/ThreadContextConfig.java
+++ b/api/src/main/java/io/smallrye/context/api/ThreadContextConfig.java
@@ -190,7 +190,7 @@
      * For example, to run as the current application, but under the
      * transaction of the thread where the task executes:
      * 

- * + * *
      *  {@literal @}Inject {@literal @}ThreadContextConfig(unchanged = ThreadContext.TRANSACTION,
      *                              propagated = ThreadContext.APPLICATION,
diff --git a/application/pom.xml b/application/pom.xml
index 1f756565..aab54602 100644
--- a/application/pom.xml
+++ b/application/pom.xml
@@ -6,39 +6,19 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
+
     smallrye-context-propagation-application
-    smallrye-context-propagation-application
+    SmallRye Context Propagation: Application
 
     
-        
-            junit
-            junit
-            test
-        
         
             ${project.groupId}
             smallrye-context-propagation
-            ${project.version}
         
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-api
         
     
-    
-        
-            
-                org.apache.maven.plugins
-                maven-jar-plugin
-                
-                    
-                        
-                            test-jar
-                        
-                    
-                
-            
-        
-    
 
 
diff --git a/cdi/pom.xml b/cdi/pom.xml
index 7df5426e..20c46f22 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -6,52 +6,26 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
+
     smallrye-context-propagation-cdi
-    smallrye-context-propagation-cdi
+    SmallRye Context Propagation: CDI
 
     
-        
-            junit
-            junit
-            test
-        
         
             ${project.groupId}
             smallrye-context-propagation
-            ${project.version}
         
         
             ${project.groupId}
             smallrye-context-propagation-api
-            ${project.version}
         
         
             jakarta.enterprise
             jakarta.enterprise.cdi-api
-            provided
         
         
             org.jboss.weld
             weld-spi
         
-        
-            org.jboss.weld
-            weld-api
-        
-        
-        
-            org.jboss.weld
-            weld-core-impl
-        
-        
-            org.eclipse.microprofile.config
-            microprofile-config-api
-            ${version.microprofile.config}
-        
-        
-            io.smallrye.config
-            smallrye-config
-            ${version.smallrye.config}
-        
     
 
diff --git a/cdi/src/test/java/io/smallrye/context/inject/AppTest.java b/cdi/src/test/java/io/smallrye/context/inject/AppTest.java
deleted file mode 100644
index 8f6c243c..00000000
--- a/cdi/src/test/java/io/smallrye/context/inject/AppTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.smallrye.context.inject;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest
-        extends TestCase {
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public AppTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite() {
-        return new TestSuite(AppTest.class);
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp() {
-        assertTrue(true);
-    }
-}
diff --git a/core/build-release-8 b/core/build-release-8
deleted file mode 100644
index e69de29b..00000000
diff --git a/core/pom.xml b/core/pom.xml
index f1ebb505..abf3216e 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -6,42 +6,34 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
-    smallrye-context-propagation
-    smallrye-context-propagation
 
-    
-        12
-    
+    smallrye-context-propagation
+    SmallRye Context Propagation: Core
 
     
-        
-            junit
-            junit
-            test
-        
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-api
         
+        
+            org.eclipse.microprofile.config
+            microprofile-config-api
+        
         
             ${project.groupId}
             smallrye-context-propagation-api
-            ${project.version}
         
         
             ${project.groupId}
             smallrye-context-propagation-storage
-            ${project.version}
         
         
-            org.eclipse.microprofile.config
-            microprofile-config-api
-            ${version.microprofile.config}
+            jakarta.enterprise
+            jakarta.enterprise.cdi-api
         
         
             org.jboss.threads
             jboss-threads
-            ${version.jboss.threads}
         
     
 
diff --git a/core/src/main/java/io/smallrye/context/FastStorageThreadContextProvider.java b/core/src/main/java/io/smallrye/context/FastStorageThreadContextProvider.java
index 88c6df14..46ec7d78 100644
--- a/core/src/main/java/io/smallrye/context/FastStorageThreadContextProvider.java
+++ b/core/src/main/java/io/smallrye/context/FastStorageThreadContextProvider.java
@@ -8,7 +8,7 @@
 /**
  * Special implementation of a {@link FastThreadContextProvider} if your context is using {@link StorageManager} to obtain its
  * ThreadLocal, in which case we can obtain it from there to propagate it, if we know its {@link StorageDeclaration}.
- * 
+ *
  * @param  The StorageDeclaration for that ThreadLocal
  */
 public interface FastStorageThreadContextProvider> extends FastThreadContextProvider {
diff --git a/core/src/main/java/io/smallrye/context/FastThreadContextProvider.java b/core/src/main/java/io/smallrye/context/FastThreadContextProvider.java
index 8c1361b6..d5cca3d0 100644
--- a/core/src/main/java/io/smallrye/context/FastThreadContextProvider.java
+++ b/core/src/main/java/io/smallrye/context/FastThreadContextProvider.java
@@ -15,7 +15,7 @@ public interface FastThreadContextProvider extends ThreadContextProvider {
     /**
      * Designates the ThreadLocal that we should capture/restore. Must always be
      * the same returned ThreadLocal.
-     * 
+     *
      * @param props properties
      * @return the ThreadLocal to capture/restore
      */
@@ -24,7 +24,7 @@ public interface FastThreadContextProvider extends ThreadContextProvider {
     /**
      * The cleared value. Defaults to null. Override this if your cleared value
      * is not null.
-     * 
+     *
      * @param props properties
      * @return the cleared value for the ThreadLocal
      */
diff --git a/core/src/main/java/io/smallrye/context/SmallRyeContextManager.java b/core/src/main/java/io/smallrye/context/SmallRyeContextManager.java
index 3140da1d..64686775 100644
--- a/core/src/main/java/io/smallrye/context/SmallRyeContextManager.java
+++ b/core/src/main/java/io/smallrye/context/SmallRyeContextManager.java
@@ -214,7 +214,7 @@ public DefaultValues getDefaultValues() {
     /**
      * Returns a {@link SmallRyeThreadContext} instance which propagates default contexts, possibly
      * configured via MP Config.
-     * 
+     *
      * @return a {@link SmallRyeThreadContext} instance which propagates default contexts, possibly
      *         configured via MP Config
      */
@@ -229,7 +229,7 @@ public SmallRyeThreadContext defaultThreadContext() {
 
     /**
      * Returns a {@link SmallRyeThreadContext} instance which propagates all thread contexts.
-     * 
+     *
      * @return a {@link SmallRyeThreadContext} instance which propagates all thread contexts.
      */
     public SmallRyeThreadContext allPropagatedThreadContext() {
@@ -246,7 +246,7 @@ public SmallRyeThreadContext allPropagatedThreadContext() {
 
     /**
      * Returns a {@link SmallRyeThreadContext} instance which clears all thread contexts.
-     * 
+     *
      * @return a {@link SmallRyeThreadContext} instance which clears all thread contexts.
      */
     public SmallRyeThreadContext allClearedThreadContext() {
@@ -345,7 +345,7 @@ public SmallRyeContextManager build() {
          * Registers the built instance to the current {@link SmallRyeContextManagerProvider} before any extensions
          * are loaded. This is useful because the extensions might require the built {@link SmallRyeContextManager}
          * to be registered on the current class loader in order to use it, so this prevents building two.
-         * 
+         *
          * @return this builder
          */
         public Builder registerOnProvider() {
@@ -359,7 +359,7 @@ public Builder registerOnProvider() {
          * {@link SmallRyeManagedExecutor.Builder#withExecutorService(ExecutorService)} and
          * {@link SmallRyeManagedExecutor.Builder#withNewExecutorService()}. Also serves as the default executor to use
          * by all {@link CompletionStage} and {@link CompletableFuture} wrapped by {@link ThreadContext}.
-         * 
+         *
          * @param executorService the executor service to delegate to. If null, all created {@link ManagedExecutor}
          *        will create new backing executor services, and all *Async methods of the
          *        {@link CompletionStage} and {@link CompletableFuture} wrapped by {@link ThreadContext} will throw due to a
@@ -373,7 +373,7 @@ public Builder withDefaultExecutorService(ExecutorService executorService) {
 
         /**
          * Enable or disable FastThreadContextProviders optimisations. Defaults to enabled.
-         * 
+         *
          * @param enable set to false to disable FastThreadContextProviders.
          * @return this builder.
          */
diff --git a/core/src/main/java/io/smallrye/context/SmallRyeManagedExecutor.java b/core/src/main/java/io/smallrye/context/SmallRyeManagedExecutor.java
index 44351fb9..929edf03 100644
--- a/core/src/main/java/io/smallrye/context/SmallRyeManagedExecutor.java
+++ b/core/src/main/java/io/smallrye/context/SmallRyeManagedExecutor.java
@@ -312,7 +312,7 @@ public  CompletionStage copy(CompletionStage stage) {
     /**
      * Returns a ThreadContext which has the same propagation settings as this ManagedExecutor,
      * which uses this ManagedExecutor as its default executor.
-     * 
+     *
      * @return a ThreadContext with the same propagation settings as this ManagedExecutor.
      */
     public SmallRyeThreadContext getThreadContext() {
@@ -399,7 +399,7 @@ public Builder injectionPointName(String name) {
          * {@link SmallRyeContextManager.Builder#withDefaultExecutorService(ExecutorService)}. Set to null to
          * disable delegation
          * and force creating a new executor service.
-         * 
+         *
          * @param executorService the executor service to delegate to, or null to force creating a new executor
          *        service.
          * @return this builder
@@ -415,7 +415,7 @@ public Builder withExecutorService(ExecutorService executorService) {
          * Forces the creation of a new executor service. This is has the same effect as calling
          * {@link #withExecutorService(ExecutorService)} with
          * null.
-         * 
+         *
          * @return this builder
          * @see #withExecutorService(ExecutorService)
          * @see SmallRyeContextManager.Builder#withDefaultExecutorService(ExecutorService)
diff --git a/core/src/main/java/io/smallrye/context/SmallRyeThreadContext.java b/core/src/main/java/io/smallrye/context/SmallRyeThreadContext.java
index 266e092c..ab0c7781 100644
--- a/core/src/main/java/io/smallrye/context/SmallRyeThreadContext.java
+++ b/core/src/main/java/io/smallrye/context/SmallRyeThreadContext.java
@@ -84,7 +84,7 @@ public void execute(Runnable command) {
     /**
      * Updates the current @{link SmallRyeThreadContext} in use by the current thread, and returns an
      * object suitable for use in try-with-resource to restore the previous value.
-     * 
+     *
      * @param threadContext the @{link SmallRyeThreadContext} to use
      * @return an object suitable for use in try-with-resource to restore the previous value.
      */
@@ -108,7 +108,7 @@ public void close() {
     /**
      * Invokes the given @{link Runnable} with the current @{link SmallRyeThreadContext} updated to the given value
      * for the current thread.
-     * 
+     *
      * @param threadContext the @{link SmallRyeThreadContext} to use
      * @param f the @{link Runnable} to invoke
      */
@@ -129,7 +129,7 @@ public static void withThreadContext(SmallRyeThreadContext threadContext, Runnab
     /**
      * Invokes the given @{link Supplier} with the current @{link SmallRyeThreadContext} updated to the given value
      * for the current thread.
-     * 
+     *
      * @param threadContext the @{link SmallRyeThreadContext} to use
      * @param f the @{link Supplier} to invoke
      * @param  The type of @{link Supplier} to return
@@ -152,7 +152,7 @@ public static  T withThreadContext(SmallRyeThreadContext threadContext, Suppl
     /**
      * Returns the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      * with default contexts, possibly configured via MP Config.
-     * 
+     *
      * @return the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      *         with default contexts, possibly configured via MP Config.
      */
@@ -163,7 +163,7 @@ public static SmallRyeThreadContext getCurrentThreadContextOrDefaultContexts() {
     /**
      * Returns the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      * which propagates all contexts.
-     * 
+     *
      * @return the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      *         which propagates all contexts.
      */
@@ -174,7 +174,7 @@ public static SmallRyeThreadContext getCurrentThreadContextOrPropagatedContexts(
     /**
      * Returns the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      * which clears all contexts.
-     * 
+     *
      * @return the current thread's @{link SmallRyeThreadContext} if set, or a @{link SmallRyeThreadContext}
      *         which clears all contexts.
      */
@@ -185,7 +185,7 @@ public static SmallRyeThreadContext getCurrentThreadContextOrClearedContexts() {
     /**
      * Returns the current thread's @{link SmallRyeThreadContext} if set, or the given @{link SmallRyeThreadContext}
      * default value.
-     * 
+     *
      * @param defaultValue the default value to use
      * @return the current thread's @{link SmallRyeThreadContext} if set, or the given @{link SmallRyeThreadContext}
      *         default value.
@@ -197,7 +197,7 @@ public static SmallRyeThreadContext getCurrentThreadContext(SmallRyeThreadContex
 
     /**
      * Returns the current thread's @{link SmallRyeThreadContext} if set, or null.
-     * 
+     *
      * @return the current thread's @{link SmallRyeThreadContext} if set, or null.
      */
     public static SmallRyeThreadContext getCurrentThreadContext() {
@@ -234,7 +234,7 @@ public ExecutorService getDefaultExecutor() {
     /**
      * Returns true if this thread context has no context to propagate nor clear, and so
      * will not contextualise anything.
-     * 
+     *
      * @return true if this thread context has no context to propagate nor clear
      */
     public boolean isEmpty() {
@@ -243,7 +243,7 @@ public boolean isEmpty() {
 
     /**
      * Returns true if the given lambda instance is already contextualized
-     * 
+     *
      * @param lambda the lambda to test
      * @return true if the given lambda instance is already contextualized
      */
@@ -270,7 +270,7 @@ public static Builder builder() {
      * or the default executor service as set by
      * {@link SmallRyeContextManager.Builder#withDefaultExecutorService(ExecutorService)},
      * or otherwise have no default executor.
-     * 
+     *
      * If this thread context has no default executor, the new stage and all dependent stages created from it, and so forth,
      * have no default asynchronous execution facility and must raise {@link java.lang.UnsupportedOperationException}
      * for all *Async methods that do not specify an executor. For example,
@@ -318,7 +318,7 @@ public  CompletableFuture withContextCapture(CompletableFuture future,
      * or the default executor service as set by
      * {@link SmallRyeContextManager.Builder#withDefaultExecutorService(ExecutorService)},
      * or otherwise have no default executor.
-     * 
+     *
      * If this thread context has no default executor, the new stage and all dependent stages created from it, and so forth,
      * and/or cleared as described in the documentation of the {@link ManagedExecutor} class, except that
      * this ThreadContext instance takes the place of the default asynchronous execution facility in
diff --git a/core/src/main/java/io/smallrye/context/impl/ContextHolder.java b/core/src/main/java/io/smallrye/context/impl/ContextHolder.java
index c7e06d5d..eca7078f 100644
--- a/core/src/main/java/io/smallrye/context/impl/ContextHolder.java
+++ b/core/src/main/java/io/smallrye/context/impl/ContextHolder.java
@@ -8,7 +8,7 @@ public interface ContextHolder {
     /**
      * Store a thread local and its current value while capturing, in a way that storage is flattend in the context wrapper with
      * minimal allocation.
-     * 
+     *
      * @param index the context provider index
      * @param threadLocal the context provider's threadLocal
      * @param value the current or cleared value of the threadLocal (depending on ThreadContext settings)
diff --git a/core/src/main/java/io/smallrye/context/impl/SlowActiveContextState.java b/core/src/main/java/io/smallrye/context/impl/SlowActiveContextState.java
index 3b2c9ab4..13d420ec 100644
--- a/core/src/main/java/io/smallrye/context/impl/SlowActiveContextState.java
+++ b/core/src/main/java/io/smallrye/context/impl/SlowActiveContextState.java
@@ -18,7 +18,7 @@ public class SlowActiveContextState implements CleanAutoCloseable {
 
     /**
      * Restores a previously captured context.
-     * 
+     *
      * @param threadContext the thread context
      * @param threadContextSnapshots the captured snapshots
      */
diff --git a/core/src/main/java/io/smallrye/context/impl/SlowCapturedContextState.java b/core/src/main/java/io/smallrye/context/impl/SlowCapturedContextState.java
index 676bdf80..cf0e92aa 100644
--- a/core/src/main/java/io/smallrye/context/impl/SlowCapturedContextState.java
+++ b/core/src/main/java/io/smallrye/context/impl/SlowCapturedContextState.java
@@ -17,7 +17,7 @@ public class SlowCapturedContextState implements CapturedContextState {
 
     /**
      * Captures the current context according to the given ThreadContext
-     * 
+     *
      * @param threadContext the thread context
      */
     public SlowCapturedContextState(SmallRyeThreadContext threadContext) {
@@ -27,7 +27,7 @@ public SlowCapturedContextState(SmallRyeThreadContext threadContext) {
 
     /**
      * Restores the captured context and returns an instance that can unrestore (cleanup) it.
-     * 
+     *
      * @return the captured context state
      */
     public SlowActiveContextState begin() {
diff --git a/core/src/main/java/io/smallrye/context/impl/ThreadContextProviderPlan.java b/core/src/main/java/io/smallrye/context/impl/ThreadContextProviderPlan.java
index e8f424d4..4e18c117 100644
--- a/core/src/main/java/io/smallrye/context/impl/ThreadContextProviderPlan.java
+++ b/core/src/main/java/io/smallrye/context/impl/ThreadContextProviderPlan.java
@@ -62,7 +62,7 @@ public ThreadContextProviderPlan(Set propagatedSet, Set takeThreadContextSnapshots() {
@@ -94,7 +94,7 @@ public boolean isFast() {
      * Use this if @{link {@link #isFast()} is true (it will throw otherwise) when you want to capture the current context
      * using the fast-path, and feed the captured context in the given @{link ContextHolder}, which must have a size compatible
      * with @{link {@link #size()}.
-     * 
+     *
      * @param threadContext The thread context settings
      * @param tcTl the current ThreadContext thread-local (for contextual settings)
      * @param contextHolder the contextual lambda in which we will capture context
diff --git a/core/src/main/java9/io/smallrye/context/Jdk9CompletableFutureWrapper.java b/core/src/main/java9/io/smallrye/context/Jdk9CompletableFutureWrapper.java
deleted file mode 100644
index f6425e3b..00000000
--- a/core/src/main/java9/io/smallrye/context/Jdk9CompletableFutureWrapper.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package io.smallrye.context;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.Executor;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-
-public class Jdk9CompletableFutureWrapper extends CompletableFutureWrapper {
-
-    public Jdk9CompletableFutureWrapper(SmallRyeThreadContext context, CompletableFuture f, Executor executor,
-            int flags) {
-        super(context, f, executor, flags);
-    }
-
-    // Java 9
-    
-    @Override
-    public  CompletableFuture newIncompleteFuture() {
-        CompletableFuture ret = new CompletableFuture<>();
-        return context.withContextCapture(ret, executor, flags);
-    }
-
-    @Override
-    public Executor defaultExecutor() {
-        return executor;
-    }
-
-    @Override
-    public CompletableFuture copy() {
-        return context.withContextCapture(f.copy(), executor, flags);
-    }
-
-    @Override
-    public CompletionStage minimalCompletionStage() {
-        // this creates a new MinimalStage we need to wrap
-        return context.withContextCapture(f.minimalCompletionStage());
-    }
-
-    @Override
-    public CompletableFuture completeAsync(Supplier supplier) {
-        // just forward 
-        return context.withContextCapture(f.completeAsync(context.contextualSupplierUnlessContextualized(supplier), executor),
-                executor, flags);
-    }
-
-    @Override
-    public CompletableFuture completeAsync(Supplier supplier, Executor executor) {
-        // just forward 
-        return context.withContextCapture(f.completeAsync(context.contextualSupplierUnlessContextualized(supplier), executor),
-                this.executor, flags);
-    }
-
-    @Override
-    public CompletableFuture orTimeout(long timeout, TimeUnit unit) {
-        // just forward 
-        return context.withContextCapture(f.orTimeout(timeout, unit), executor, flags);
-    }
-
-    @Override
-    public CompletableFuture completeOnTimeout(T value, long timeout, TimeUnit unit) {
-        // just forward 
-        return context.withContextCapture(f.completeOnTimeout(value, timeout, unit), executor, flags);
-    }
-}
diff --git a/core/src/main/java9/io/smallrye/context/impl/JdkSpecificImpl.java b/core/src/main/java9/io/smallrye/context/impl/JdkSpecificImpl.java
deleted file mode 100644
index 3f174d10..00000000
--- a/core/src/main/java9/io/smallrye/context/impl/JdkSpecificImpl.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package io.smallrye.context.impl;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.Executor;
-
-import io.smallrye.context.CompletionStageWrapper;
-import io.smallrye.context.Jdk9CompletableFutureWrapper;
-import io.smallrye.context.JdkSpecific;
-import io.smallrye.context.SmallRyeThreadContext;
-
-public class JdkSpecificImpl implements JdkSpecific.Contract {
-
-    @Override
-    public  CompletionStage newCompletionStageWrapper(SmallRyeThreadContext threadContext,
-            CompletionStage future, Executor executor) {
-        return new CompletionStageWrapper<>(threadContext, future, executor);
-    }
-
-    @Override
-    public  CompletableFuture newCompletableFutureWrapper(SmallRyeThreadContext threadContext,
-            CompletableFuture future, Executor executor, int flags) {
-        return new Jdk9CompletableFutureWrapper<>(threadContext, future, executor, flags);
-    }
-
-}
diff --git a/jta/pom.xml b/jta/pom.xml
index 16b7f610..a4cbfc6b 100644
--- a/jta/pom.xml
+++ b/jta/pom.xml
@@ -6,15 +6,11 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
+
     smallrye-context-propagation-jta
-    smallrye-context-propagation-jta
+    SmallRye Context Propagation: JTA
 
     
-        
-            junit
-            junit
-            test
-        
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-api
@@ -22,45 +18,10 @@
         
             jakarta.enterprise
             jakarta.enterprise.cdi-api
-            provided
         
         
             jakarta.transaction
             jakarta.transaction-api
-            ${version.jta}
-        
-        
-            org.jboss.weld.module
-            weld-jta
-            ${version.weld.core}
-            test
-        
-        
-            org.jboss.narayana.jta
-            narayana-jta-jakarta
-            ${version.narayana}
-            
-                
-                    org.jboss.logmanager
-                    jboss-logmanager
-                
-            
-            test
         
     
-    
-        
-            
-                org.apache.maven.plugins
-                maven-jar-plugin
-                
-                    
-                        
-                            test-jar
-                        
-                    
-                
-            
-        
-    
 
diff --git a/jta/src/test/java/io/smallrye/context/inject/AppTest.java b/jta/src/test/java/io/smallrye/context/inject/AppTest.java
deleted file mode 100644
index 8f6c243c..00000000
--- a/jta/src/test/java/io/smallrye/context/inject/AppTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package io.smallrye.context.inject;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest
-        extends TestCase {
-    /**
-     * Create the test case
-     *
-     * @param testName name of the test case
-     */
-    public AppTest(String testName) {
-        super(testName);
-    }
-
-    /**
-     * @return the suite of tests being tested
-     */
-    public static Test suite() {
-        return new TestSuite(AppTest.class);
-    }
-
-    /**
-     * Rigourous Test :-)
-     */
-    public void testApp() {
-        assertTrue(true);
-    }
-}
diff --git a/pom.xml b/pom.xml
index 30941c02..cf0d0b68 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,8 +4,8 @@
 
 	
 		io.smallrye
-        smallrye-jakarta-parent
-		36
+        smallrye-parent
+		39
 	
 
 	smallrye-context-propagation-parent
@@ -37,35 +37,24 @@
 	
 
 	
-		1.3
-		3.0.1
-		3.0.0
+        1.3
+        3.0.1
+
+        5.0.SP3
         3.4.2.Final
         2.0.0
         5.12.4.Final
         2.2.21
         1.3.8
-        4.0.SP1
-        4.0.2.Final
-
-        
-        2.0.0
-        5.0.5.Final
-        6.0.0.Beta1
-        2.0.0.Beta1
-        5.6.5.Final
-        2.5.0
-        4.3.3
-        2.2
 
         false
     
 
-	
-		
-			Stéphane Épardaud
-			stef@epardaud.fr
-		
+	  
+        
+          Stéphane Épardaud
+          stef@epardaud.fr
+        
         
             Matěj Novotný
             manovotn@redhat.com
@@ -74,86 +63,88 @@
 
     
         
+            
             
                 org.eclipse.microprofile.context-propagation
                 microprofile-context-propagation-api
                 ${version.microprofile.context-propagation}
             
-
             
                 org.eclipse.microprofile.context-propagation
                 microprofile-context-propagation-tck
                 ${version.microprofile.context-propagation}
             
-
             
-                io.reactivex.rxjava2
-                rxjava
-                ${version.rxjava2}
+                org.eclipse.microprofile.config
+                microprofile-config-api
+                ${version.microprofile.config}
             
             
-                io.reactivex
-                rxjava
-                ${version.rxjava1}
+                jakarta.enterprise
+                jakarta.enterprise.cdi-api
+                ${version.jakarta.enterprise.cdi.api}
+                provided
+            
+            
+                jakarta.transaction
+                jakarta.transaction-api
+                ${version.jta}
+                provided
             
 
-            
+            
             
-                org.jboss.weld
-                weld-api
-                ${version.weld-api}
+                ${project.groupId}
+                smallrye-context-propagation-api
+                ${project.version}
+            
+            
+                ${project.groupId}
+                smallrye-context-propagation
+                ${project.version}
             
+            
+                ${project.groupId}
+                smallrye-context-propagation-storage
+                ${project.version}
+            
+
+            
             
                 org.jboss.weld
                 weld-spi
                 ${version.weld-api}
             
             
-                org.jboss.weld
-                weld-core-impl
-                ${version.weld-core}
+                org.jboss.threads
+                jboss-threads
+                ${version.jboss.threads}
+            
+            
+                io.reactivex.rxjava2
+                rxjava
+                ${version.rxjava2}
+            
+            
+                io.reactivex
+                rxjava
+                ${version.rxjava1}
             
         
     
 
     
+        api
         core
         cdi
         jta
         application
         propagators-rxjava1
         propagators-rxjava2
-        tests
-        tck
-        api
         storage
+        testsuite
     
 
-    
-        
-            eclipse-snapshots
-            https://repo.eclipse.org/content/repositories/microprofile-snapshots
-            
-                false
-            
-            
-                true
-            
-        
-        
-        
-            jboss-public-repository-group
-            JBoss Public Maven Repository Group
-            https://repository.jboss.org/nexus/content/groups/public/
-            
-                true
-            
-            
-                true
-            
-        
-    
-
   
     
       
diff --git a/propagators-rxjava1/pom.xml b/propagators-rxjava1/pom.xml
index d3a7fa06..0f3a1bb3 100644
--- a/propagators-rxjava1/pom.xml
+++ b/propagators-rxjava1/pom.xml
@@ -6,21 +6,15 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
+
     smallrye-context-propagation-propagators-rxjava1
-    smallrye-context-propagation-propagators-rxjava1
+    SmallRye Context Propagation: Propagators RxJava
 
     
-        
-            junit
-            junit
-            test
-        
-
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-api
         
-
         
             io.reactivex
             rxjava
diff --git a/propagators-rxjava2/pom.xml b/propagators-rxjava2/pom.xml
index d9724387..cd8551f1 100644
--- a/propagators-rxjava2/pom.xml
+++ b/propagators-rxjava2/pom.xml
@@ -6,21 +6,15 @@
         smallrye-context-propagation-parent
         2.0.1-SNAPSHOT
     
+
     smallrye-context-propagation-propagators-rxjava2
-    smallrye-context-propagation-propagators-rxjava2
+    SmallRye Context Propagation: Propagators RxJava 2
 
     
-        
-            junit
-            junit
-            test
-        
-
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-api
         
-
         
             io.reactivex.rxjava2
             rxjava
diff --git a/storage/pom.xml b/storage/pom.xml
index a71ea9c1..24e50e79 100644
--- a/storage/pom.xml
+++ b/storage/pom.xml
@@ -8,6 +8,7 @@
     4.0.0
 
     smallrye-context-propagation-storage
+    SmallRye Context Propagation: Storage
 
     
         
diff --git a/storage/src/main/java/io/smallrye/context/storage/spi/StorageManager.java b/storage/src/main/java/io/smallrye/context/storage/spi/StorageManager.java
index 379392ea..21bd4382 100644
--- a/storage/src/main/java/io/smallrye/context/storage/spi/StorageManager.java
+++ b/storage/src/main/java/io/smallrye/context/storage/spi/StorageManager.java
@@ -7,7 +7,7 @@ public interface StorageManager {
 
     /**
      * Returns the currently registered StorageManager
-     * 
+     *
      * @return the currently registered StorageManager
      */
     public static StorageManager instance() {
@@ -19,7 +19,7 @@ public static StorageManager instance() {
      * may be a regular ThreadLocal, or one that this StorageManager manufactured for special dedicated
      * storage. The returned ThreadLocal is cached and all subsequent calls to this method with the same
      * storage declaration will always return the same ThreadLocal instance.
-     * 
+     *
      * @param storageDeclarationClass the declaration class which defines the type of item we want to store in the
      *        required ThreadLocal
      * @return the ThreadLocal, memoized
@@ -33,7 +33,7 @@ public static StorageManager instance() {
      * may be a regular ThreadLocal, or one that this StorageManager manufactured for special dedicated
      * storage. The returned ThreadLocal is cached and all subsequent calls to this method with the same
      * storage declaration will always return the same ThreadLocal instance.
-     * 
+     *
      * @param storageDeclarationClass the declaration class which defines the type of item we want to store in the
      *        required ThreadLocal
      * @return the ThreadLocal, memoized
diff --git a/storage/src/main/java/io/smallrye/context/storage/spi/StorageManagerProvider.java b/storage/src/main/java/io/smallrye/context/storage/spi/StorageManagerProvider.java
index 97b612d5..b7eb8dff 100644
--- a/storage/src/main/java/io/smallrye/context/storage/spi/StorageManagerProvider.java
+++ b/storage/src/main/java/io/smallrye/context/storage/spi/StorageManagerProvider.java
@@ -18,7 +18,7 @@ public interface StorageManagerProvider {
      * Returns the currently registered StorageManagerProvider. Will attempt to instantiate one based on
      * the ServiceLoader for StorageManagerProvider if it is not set. Will default to DefaultStorageManagerProvider
      * otherwise.
-     * 
+     *
      * @return the currently registered StorageManagerProvider, lazily created.
      */
     public static StorageManagerProvider instance() {
@@ -40,7 +40,7 @@ public static StorageManagerProvider instance() {
 
     /**
      * Registers and existing StorageManagerProvider
-     * 
+     *
      * @param provider the provider to register
      * @return a registration object allowing you to unregister it
      * @throws IllegalStateException when there already is a registered provider
@@ -66,7 +66,7 @@ public default StorageManager getStorageManager() {
 
     /**
      * Obtain the StorageManager registered for the given ClassLoader
-     * 
+     *
      * @param classloader the classloader to use for looking up the StorageManager
      * @return the StorageManager registered for the given ClassLoader
      */
diff --git a/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service b/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service
deleted file mode 100644
index 00948aec..00000000
--- a/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service
+++ /dev/null
@@ -1,2 +0,0 @@
-
-io.smallrye.context.inject.TransactionServicesImpl
diff --git a/tests/src/test/java/io/smallrye/context/test/FullStackTest.java b/tests/src/test/java/io/smallrye/context/test/FullStackTest.java
deleted file mode 100644
index 201e5182..00000000
--- a/tests/src/test/java/io/smallrye/context/test/FullStackTest.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package io.smallrye.context.test;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-
-import jakarta.enterprise.inject.spi.CDI;
-import jakarta.persistence.EntityManager;
-import jakarta.transaction.InvalidTransactionException;
-import jakarta.transaction.NotSupportedException;
-import jakarta.transaction.Status;
-import jakarta.transaction.SystemException;
-import jakarta.transaction.Transaction;
-import jakarta.transaction.TransactionManager;
-import jakarta.ws.rs.container.CompletionCallback;
-
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.util.EntityUtils;
-import org.jboss.resteasy.cdi.CdiInjectorFactory;
-import org.jboss.resteasy.cdi.ResteasyCdiExtension;
-import org.jboss.resteasy.core.ResteasyContext;
-import org.jboss.resteasy.core.SynchronousDispatcher;
-import org.jboss.resteasy.plugins.server.vertx.VertxJaxrsServer;
-import org.jboss.resteasy.plugins.server.vertx.VertxResteasyDeployment;
-import org.jboss.resteasy.spi.HttpRequest;
-import org.jboss.resteasy.spi.HttpResponse;
-import org.jboss.resteasy.spi.ResteasyProviderFactory;
-import org.jboss.weld.context.bound.BoundRequestContext;
-import org.jboss.weld.environment.se.Weld;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.arjuna.ats.jta.logging.jtaLogger;
-
-import io.smallrye.context.test.util.AbstractTest;
-import io.vertx.core.Vertx;
-import io.vertx.core.VertxOptions;
-
-public class FullStackTest extends AbstractTest {
-    private final class MyVertxJaxrsServer extends VertxJaxrsServer {
-        public Vertx getVertx() {
-            return vertx;
-        }
-    }
-
-    private MyVertxJaxrsServer vertxJaxrsServer;
-    private Weld weld;
-
-    @Before
-    public void before() {
-        VertxResteasyDeployment deployment = new VertxResteasyDeployment();
-
-        weld = new Weld();
-        weld.initialize();
-
-        JTAUtils.startJTATM();
-
-        ResteasyCdiExtension cdiExtension = CDI.current().select(ResteasyCdiExtension.class).get();
-        deployment.setActualResourceClasses(cdiExtension.getResources());
-        deployment.setInjectorFactoryClass(CdiInjectorFactory.class.getName());
-        deployment.getActualProviderClasses().addAll(cdiExtension.getProviders());
-        ResteasyProviderFactory providerFactory = ResteasyProviderFactory.newInstance();
-        deployment.setProviderFactory(providerFactory);
-        deployment.setDispatcher(new SynchronousDispatcher(providerFactory) {
-
-            @Override
-            public void invoke(HttpRequest req, HttpResponse response) {
-                ResteasyContext.pushContext(Vertx.class, vertxJaxrsServer.getVertx());
-
-                // set up CDI request context
-                BoundRequestContext cdiContext = CDI.current().select(BoundRequestContext.class).get();
-                Map contextMap = new HashMap();
-                cdiContext.associate(contextMap);
-                cdiContext.activate();
-
-                EntityManager entityManager = CDI.current().select(EntityManager.class).get();
-                TransactionManager transactionManager = CDI.current().select(TransactionManager.class).get();
-                Transaction transaction;
-                try {
-                    transactionManager.begin();
-                    transaction = transactionManager.getTransaction();
-                } catch (SystemException | NotSupportedException e) {
-                    throw new RuntimeException(e);
-                }
-                System.err.println("BEGIN transaction " + transaction);
-
-                boolean success = false;
-                try {
-                    Thread.currentThread().setContextClassLoader(new CPClassLoader());
-                    super.invoke(req, response);
-                    success = true;
-                } finally {
-                    // tear down request contexts
-                    if (req.getAsyncContext().isSuspended()) {
-                        // make sure we remove the CDI context
-                        cdiContext.deactivate();
-                        cdiContext.dissociate(contextMap);
-                        Transaction t2;
-                        try {
-                            t2 = transactionManager.suspend();
-                            System.err.println("SUSPEND " + t2);
-                        } catch (SystemException e) {
-                            throw new RuntimeException(e);
-                        }
-                        // clear it later
-                        req.getAsyncContext().getAsyncResponse().register((CompletionCallback) (t) -> {
-                            try {
-                                System.err.println("RESUME " + t2);
-                                Transaction currentTransaction = transactionManager.getTransaction();
-                                if (currentTransaction != t2) {
-                                    if (currentTransaction != null)
-                                        transactionManager.suspend();
-                                    transactionManager.resume(t2);
-                                }
-                            } catch (InvalidTransactionException | IllegalStateException | SystemException e) {
-                                e.printStackTrace();
-                            }
-                            terminateContext(cdiContext, contextMap, entityManager, transactionManager, t2, t == null);
-                        });
-                    } else {
-                        // clear it now
-                        terminateContext(cdiContext, contextMap, entityManager, transactionManager, transaction, success);
-                    }
-                }
-            }
-
-            private void terminateContext(BoundRequestContext cdiContext, Map contextMap,
-                    EntityManager entityManager,
-                    TransactionManager tm, Transaction tx, boolean success) {
-                System.err.println("END: " + success + " " + tx);
-                try {
-                    endTransaction(tm, tx, success);
-                } catch (Exception e) {
-                    // let's not throw here
-                    e.printStackTrace();
-                }
-                // only need to terminate CDI context for "/test/async", otherwise context propagation handles it
-                if (cdiContext.isActive()) {
-                    cdiContext.invalidate();
-                    cdiContext.deactivate();
-                    cdiContext.dissociate(contextMap);
-                }
-            }
-
-            protected void endTransaction(TransactionManager tm, Transaction tx, boolean success) throws Exception {
-
-                if (tx != tm.getTransaction()) {
-                    throw new RuntimeException(jtaLogger.i18NLogger.get_wrong_tx_on_thread());
-                }
-
-                if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK || !success) {
-                    tm.rollback();
-                } else {
-                    tm.commit();
-                }
-            }
-
-        });
-        deployment.start();
-
-        vertxJaxrsServer = new MyVertxJaxrsServer();
-        vertxJaxrsServer.setVertxOptions(new VertxOptions().setEventLoopPoolSize(1));
-        vertxJaxrsServer.setDeployment(deployment);
-        vertxJaxrsServer.setPort(8080);
-        vertxJaxrsServer.setRootResourcePath("/");
-        vertxJaxrsServer.setSecurityDomain(null);
-        vertxJaxrsServer.start();
-    }
-
-    @After
-    public void after() {
-        weld.shutdown();
-        vertxJaxrsServer.stop();
-        JTAUtils.stop();
-    }
-
-    @Test
-    public void fullStack() throws IOException {
-        try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
-            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test"))) {
-                assertEquals(200, response.getStatusLine().getStatusCode());
-                String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
-                assertEquals("OK", body);
-            }
-
-            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test/async"))) {
-                assertEquals(500, response.getStatusLine().getStatusCode());
-            }
-
-            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test/async-working"))) {
-                assertEquals(200, response.getStatusLine().getStatusCode());
-                String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
-                assertEquals("OK", body);
-            }
-        }
-
-        // TODO RestAssured depends on on Jakarta EE 8 classes (JAX-B specifically)
-        //  see https://github.com/rest-assured/rest-assured/issues/1510
-        //RestAssured.when().get("/test").then().statusCode(200).body(is("OK"));
-        //RestAssured.when().get("/test/async").then().statusCode(500);
-        //RestAssured.when().get("/test/async-working").then().statusCode(200).body(is("OK"));
-    }
-}
diff --git a/tests/src/test/java9/io/smallrye/context/test/CompletableFutureTest.java b/tests/src/test/java9/io/smallrye/context/test/CompletableFutureTest.java
deleted file mode 100644
index 69cc1faf..00000000
--- a/tests/src/test/java9/io/smallrye/context/test/CompletableFutureTest.java
+++ /dev/null
@@ -1,343 +0,0 @@
-package io.smallrye.context.test;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.eclipse.microprofile.context.ThreadContext;
-import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.Test;
-
-import io.smallrye.context.SmallRyeManagedExecutor;
-import io.smallrye.context.SmallRyeThreadContext;
-import io.smallrye.context.impl.Contextualized;
-import io.smallrye.context.impl.ThreadContextProviderPlan;
-import io.smallrye.context.test.util.AbstractTest;
-
-public class CompletableFutureTest extends AbstractTest {
-
-    private SmallRyeManagedExecutor managedExecutor;
-
-    @Before
-    public void before() {
-        managedExecutor = SmallRyeManagedExecutor.builder().propagated(MyThreadContextProvider.MY_CONTEXT_TYPE)
-                .cleared(ThreadContext.ALL_REMAINING).build();
-        MyContext.clear();
-    }
-
-    @Test
-    public void testContextPropagation() throws InterruptedException, ExecutionException {
-        // no context
-        Assert.assertNull(MyContext.get());
-        // nothing in the current thread
-        managedExecutor.completedFuture(null)
-                .thenApply(v -> {
-                    Assert.assertNull(MyContext.get());
-                    return v;
-                })
-                .get();
-        // nothing in the executor thread
-        managedExecutor.completedFuture(null)
-                .thenApplyAsync(v -> {
-                    Assert.assertNull(MyContext.get());
-                    return v;
-                })
-                .get();
-        // still no context
-        Assert.assertNull(MyContext.get());
-
-        // now with context
-        MyContext ctx = new MyContext();
-        MyContext.set(ctx);
-        Assert.assertEquals(ctx, MyContext.get());
-        try {
-            // context in the current thread
-            managedExecutor.completedFuture(null)
-                    .thenApply(v -> {
-                        Assert.assertEquals(ctx, MyContext.get());
-                        return v;
-                    })
-                    .get();
-            // context in the executor thread
-            managedExecutor.completedFuture(null)
-                    .thenApplyAsync(v -> {
-                        Assert.assertEquals(ctx, MyContext.get());
-                        return v;
-                    })
-                    .get();
-            // still with context
-            Assert.assertEquals(ctx, MyContext.get());
-
-            // now create a CF while we have a context
-            CompletableFuture cfCreatedWithContext = managedExecutor.completedFuture(null);
-            // remove the context
-            MyContext.clear();
-
-            // check that we get no context, since we're capturing at lambda creation time
-            // nothing in the current thread
-            cfCreatedWithContext
-                    .thenApply(v -> {
-                        Assert.assertNull(MyContext.get());
-                        return v;
-                    })
-                    .get();
-            // nothing in the executor thread
-            cfCreatedWithContext
-                    .thenApplyAsync(v -> {
-                        Assert.assertNull(MyContext.get());
-                        return v;
-                    })
-                    .get();
-
-            // now set it to another context and check we get the second context
-            MyContext ctx2 = new MyContext();
-            MyContext.set(ctx2);
-            // context in the current thread
-            cfCreatedWithContext
-                    .thenApply(v -> {
-                        Assert.assertEquals(ctx2, MyContext.get());
-                        return v;
-                    })
-                    .get();
-            // context in the executor thread
-            cfCreatedWithContext
-                    .thenApplyAsync(v -> {
-                        Assert.assertEquals(ctx2, MyContext.get());
-                        return v;
-                    })
-                    .get();
-        } finally {
-            MyContext.clear();
-        }
-    }
-
-    @Test
-    public void testJava9Methods() throws InterruptedException, ExecutionException {
-        // only run on JDK >= 9 which has that method
-        try {
-            CompletableFuture.class.getDeclaredMethod("copy");
-        } catch (NoSuchMethodException | SecurityException e) {
-            Assume.assumeTrue(false);
-        }
-
-        CompletableFuture cf = managedExecutor.completedFuture(null);
-        // check that this new CF is not linked to the original CF
-        CompletableFuture incomplete = cf.newIncompleteFuture();
-        Assert.assertTrue(cf.isDone());
-        Assert.assertFalse(incomplete.isDone());
-        Assert.assertTrue(incomplete instanceof Contextualized);
-
-        // check that the copy has the same completion as the original one
-        CompletableFuture copy = cf.copy();
-        Assert.assertTrue(copy.isDone());
-        Assert.assertTrue(copy instanceof Contextualized);
-
-        Assert.assertEquals(managedExecutor, cf.defaultExecutor());
-
-        CompletionStage minimalCS = cf.minimalCompletionStage();
-        // make sure we get in immediately since it's done just as the original cf
-        String[] hack = new String[1];
-        minimalCS.thenApply(v -> {
-            Assert.assertNull(v);
-            hack[0] = "OK";
-            return v;
-        });
-        Assert.assertEquals("OK", hack[0]);
-        Assert.assertTrue(minimalCS instanceof Contextualized);
-        Assert.assertTrue(minimalCS instanceof CompletableFuture);
-        Assert.assertThrows(UnsupportedOperationException.class, () -> ((CompletableFuture) minimalCS).complete(null));
-
-        MyContext ctx = new MyContext();
-        MyContext.set(ctx);
-        try {
-            CompletableFuture asyncCompleteCF = managedExecutor.newIncompleteFuture().completeAsync(() -> {
-                Assert.assertEquals(ctx, MyContext.get());
-                return null;
-            });
-            Assert.assertTrue(asyncCompleteCF instanceof Contextualized);
-            Assert.assertNull(asyncCompleteCF.get());
-
-            ExecutorService executor = Executors.newSingleThreadExecutor();
-            asyncCompleteCF = managedExecutor.newIncompleteFuture().completeAsync(() -> {
-                Assert.assertEquals(ctx, MyContext.get());
-                return null;
-            }, executor);
-            Assert.assertTrue(asyncCompleteCF instanceof Contextualized);
-            Assert.assertNull(asyncCompleteCF.get());
-            executor.awaitTermination(2, TimeUnit.SECONDS);
-
-            CompletableFuture timeoutCF = managedExecutor.newIncompleteFuture().orTimeout(100, TimeUnit.MILLISECONDS);
-            Assert.assertTrue(timeoutCF instanceof Contextualized);
-            try {
-                timeoutCF.get();
-                Assert.fail();
-            } catch (ExecutionException x) {
-                Assert.assertTrue(x.getCause() instanceof TimeoutException);
-            }
-
-            timeoutCF = managedExecutor.newIncompleteFuture().completeOnTimeout(null, 100, TimeUnit.MILLISECONDS);
-            Assert.assertTrue(timeoutCF instanceof Contextualized);
-            Assert.assertNull(timeoutCF.get());
-        } finally {
-            MyContext.clear();
-        }
-    }
-
-    @Test
-    public void testJava12Methods() throws InterruptedException, ExecutionException {
-        // only run on JDK >= 12 which has that method
-        try {
-            CompletionStage.class.getDeclaredMethod("exceptionallyCompose");
-        } catch (NoSuchMethodException | SecurityException e) {
-            Assume.assumeTrue(false);
-        }
-
-        Throwable t = new Throwable();
-        CompletableFuture cf = managedExecutor.newIncompleteFuture();
-
-        MyContext ctx = new MyContext();
-        MyContext.set(ctx);
-        ExecutorService executor = Executors.newSingleThreadExecutor();
-        try {
-            CompletableFuture exceptionallyCompose = cf.exceptionallyCompose(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                // make sure we contextualise even non-contextualised compositions
-                return new CompletableFuture<>();
-            });
-            Assert.assertTrue(exceptionallyCompose instanceof Contextualized);
-
-            CompletableFuture exceptionallyComposeAsync1 = cf.exceptionallyComposeAsync(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                // make sure we contextualise even non-contextualised compositions
-                return new CompletableFuture<>();
-            });
-            Assert.assertTrue(exceptionallyComposeAsync1 instanceof Contextualized);
-
-            CompletableFuture exceptionallyComposeAsync2 = cf.exceptionallyComposeAsync(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                // make sure we contextualise even non-contextualised compositions
-                return new CompletableFuture<>();
-            }, executor);
-            Assert.assertTrue(exceptionallyComposeAsync2 instanceof Contextualized);
-
-            CompletableFuture exceptionally = cf.exceptionally(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                return null;
-            });
-            Assert.assertTrue(exceptionally instanceof Contextualized);
-
-            CompletableFuture exceptionallyAsync1 = cf.exceptionallyAsync(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                return null;
-            });
-            Assert.assertTrue(exceptionallyAsync1 instanceof Contextualized);
-
-            CompletableFuture exceptionallyAsync2 = cf.exceptionallyAsync(ex -> {
-                Assert.assertEquals(t, ex);
-                Assert.assertEquals(ctx, MyContext.get());
-                return null;
-            }, executor);
-            Assert.assertTrue(exceptionallyAsync1 instanceof Contextualized);
-
-            // now clear the context to simulate a change and make sure they all already captured it
-            MyContext.clear();
-
-            Assert.assertNull(exceptionally.get());
-            Assert.assertNull(exceptionallyAsync1.get());
-            Assert.assertNull(exceptionallyAsync2.get());
-            Assert.assertNull(exceptionallyCompose.get());
-            Assert.assertNull(exceptionallyComposeAsync1.get());
-            Assert.assertNull(exceptionallyComposeAsync2.get());
-
-        } finally {
-            MyContext.clear();
-        }
-    }
-
-    @Test
-    public void testExistingCFWrapping() throws InterruptedException, ExecutionException {
-        CompletableFuture cf = new CompletableFuture<>();
-        CompletableFuture copy = managedExecutor.copy(cf);
-        Assert.assertFalse(cf.isDone());
-        Assert.assertFalse(copy.isDone());
-
-        MyContext ctx = new MyContext();
-        MyContext.set(ctx);
-        try {
-            CompletableFuture cfNoContext = cf.thenApplyAsync(v -> {
-                // no context prop on new thread
-                Assert.assertNull(MyContext.get());
-                return v;
-            });
-            CompletableFuture copyThisContext = copy.thenApplyAsync(v -> {
-                // context prop
-                Assert.assertEquals(ctx, MyContext.get());
-                return v;
-            });
-            // change the context to verify that we get the old context
-            MyContext ctx2 = new MyContext();
-            MyContext.set(ctx2);
-
-            // check that completing cf completes both
-            cf.complete("OK");
-            Assert.assertEquals("OK", cfNoContext.get());
-            Assert.assertEquals("OK", copyThisContext.get());
-
-            // make sure it has the same contexts
-            SmallRyeThreadContext threadContext = managedExecutor.getThreadContext();
-            Assert.assertNotNull(threadContext);
-            ThreadContextProviderPlan plan = threadContext.getPlan();
-            Assert.assertEquals(4, plan.clearedProviders.size());
-            Assert.assertTrue(plan.unchangedProviders.isEmpty());
-            Assert.assertEquals(1, plan.propagatedProviders.size());
-
-            // now make sure ThreadContext can also copy those
-            CompletableFuture cf2 = new CompletableFuture<>();
-            CompletableFuture cf3 = new CompletableFuture<>();
-            CompletableFuture cf2Copy = threadContext.withContextCapture(cf2);
-            // make it pass for a CS
-            CompletionStage cf3Copy = threadContext.withContextCapture((CompletionStage) cf3);
-            Assert.assertFalse(cf2.isDone());
-            Assert.assertFalse(cf2Copy.isDone());
-
-            MyContext.set(ctx);
-            CompletableFuture cf2NoContext = cf2.thenApplyAsync(v -> {
-                // no context prop on new thread
-                Assert.assertNull(MyContext.get());
-                return v;
-            });
-            CompletableFuture cf2CopyThisContext = cf2Copy.thenApplyAsync(v -> {
-                // context prop
-                Assert.assertEquals(ctx, MyContext.get());
-                return v;
-            });
-            CompletionStage cf3CopyThisContext = cf3Copy.thenApplyAsync(v -> {
-                // context prop
-                Assert.assertEquals(ctx, MyContext.get());
-                return v;
-            });
-            // change the context to verify that we get the old context
-            MyContext.set(ctx2);
-
-            // check that completing cf completes both
-            cf2.complete("OK");
-            cf3.complete("OK");
-            Assert.assertEquals("OK", cf2NoContext.get());
-            Assert.assertEquals("OK", cf2CopyThisContext.get());
-            Assert.assertEquals("OK", cf3CopyThisContext.toCompletableFuture().get());
-        } finally {
-            MyContext.clear();
-        }
-    }
-}
diff --git a/tests/build-test-java12 b/testsuite/extra/build-test-java12
similarity index 100%
rename from tests/build-test-java12
rename to testsuite/extra/build-test-java12
diff --git a/tests/pom.xml b/testsuite/extra/pom.xml
similarity index 79%
rename from tests/pom.xml
rename to testsuite/extra/pom.xml
index fa6ccb42..ab293a51 100644
--- a/tests/pom.xml
+++ b/testsuite/extra/pom.xml
@@ -3,49 +3,51 @@
     4.0.0
     
         io.smallrye
-        smallrye-context-propagation-parent
+        smallrye-context-propagation-testsuite
         2.0.1-SNAPSHOT
     
-    smallrye-context-propagation-test
-    smallrye-context-propagation-test
 
-    
-        true
-        12
-    
+    smallrye-context-propagation-test
+    SmallRye Context Propagation: Test Suite - Extra
 
     
+        
         
-            junit
-            junit
-            test
+            ${project.groupId}
+            smallrye-context-propagation
+            ${project.version}
         
-
         
-            org.jboss.arquillian.core
-            arquillian-core-spi
-            test
+            jakarta.enterprise
+            jakarta.enterprise.cdi-api
+        
+        
+            jakarta.ws.rs
+            jakarta.ws.rs-api
+        
+        
+            jakarta.persistence
+            jakarta.persistence-api
         
 
+        
+        
+            org.junit.jupiter
+            junit-jupiter
+        
         
             org.jboss.shrinkwrap
             shrinkwrap-impl-base
             test
         
 
-        
-            ${project.groupId}
-            smallrye-context-propagation
-            ${project.version}
-        
-
+        
         
             ${project.groupId}
             smallrye-context-propagation-propagators-rxjava1
             ${project.version}
             test
         
-
         
             ${project.groupId}
             smallrye-context-propagation-propagators-rxjava2
@@ -70,66 +72,68 @@
             ${project.version}
             test
         
-        
-            ${project.groupId}
-            smallrye-context-propagation-jta
-            ${project.version}
-            test
-            tests
-            test-jar
-        
+
+        
         
             org.jboss.weld.se
             weld-se-shaded
-            ${version.weld.core}
+            ${version.weld-core}
             test
         
         
             org.jboss.weld.module
             weld-jta
-            ${version.weld.core}
+            ${version.weld-core}
             test
         
-
         
             io.smallrye.common
             smallrye-common-function
             ${version.smallrye.common}
+            test
+        
+        
+            io.smallrye.config
+            smallrye-config
+            ${version.smallrye.config}
+            test
         
-
         
             org.jboss.resteasy
             resteasy-core
             ${version.resteasy}
+            test
         
         
             org.jboss.resteasy.microprofile
             microprofile-context-propagation
             ${version.resteasy-microprofile}
+            test
         
         
             org.jboss.resteasy
             resteasy-vertx
             ${version.resteasy}
+            test
         
         
             org.jboss.resteasy
             resteasy-cdi
             ${version.resteasy}
+            test
         
-
         
             org.hibernate
-            hibernate-core-jakarta
+            hibernate-core
             ${version.hibernate}
+            test
         
-
         
             org.hsqldb
             hsqldb
             ${version.hsqldb}
+            test
         
-
         
             io.rest-assured
             rest-assured
@@ -141,29 +145,25 @@
             ${version.hamcrest}
             test
         
-
         
             io.vertx
             vertx-core
             ${version.vertx}
         
-
         
             io.vertx
             vertx-web-client
             ${version.vertx}
         
-
         
             jakarta.transaction
             jakarta.transaction-api
-            ${version.jta}
         
-
         
             org.jboss.narayana.jta
             narayana-jta-jakarta
             ${version.narayana}
+            test
             
                 
                     org.jboss.logmanager
@@ -171,12 +171,12 @@
                 
             
         
-
         
         
             org.jboss.naming
             jnpserver
             ${version.jnpserver}
+            test
             
                 
                     org.jboss.logging
@@ -185,23 +185,4 @@
             
         
     
-
-    
-        
-            
-                org.apache.maven.plugins
-                maven-install-plugin
-                
-                    true
-                
-            
-            
-                org.sonatype.plugins
-                nexus-staging-maven-plugin
-                
-                    true
-                
-            
-        
-    
 
diff --git a/tests/src/main/java/io/smallrye/context/test/CPClassLoader.java b/testsuite/extra/src/main/java/io/smallrye/context/test/CPClassLoader.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/CPClassLoader.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/CPClassLoader.java
diff --git a/tests/src/main/java/io/smallrye/context/test/EntityManagerProvider.java b/testsuite/extra/src/main/java/io/smallrye/context/test/EntityManagerProvider.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/EntityManagerProvider.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/EntityManagerProvider.java
diff --git a/tests/src/main/java/io/smallrye/context/test/FullStackResource.java b/testsuite/extra/src/main/java/io/smallrye/context/test/FullStackResource.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/FullStackResource.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/FullStackResource.java
diff --git a/tests/src/main/java/io/smallrye/context/test/MyBean.java b/testsuite/extra/src/main/java/io/smallrye/context/test/MyBean.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/MyBean.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/MyBean.java
diff --git a/tests/src/main/java/io/smallrye/context/test/MyBeanImpl.java b/testsuite/extra/src/main/java/io/smallrye/context/test/MyBeanImpl.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/MyBeanImpl.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/MyBeanImpl.java
diff --git a/tests/src/main/java/io/smallrye/context/test/MyContext.java b/testsuite/extra/src/main/java/io/smallrye/context/test/MyContext.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/MyContext.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/MyContext.java
diff --git a/tests/src/main/java/io/smallrye/context/test/MyEntity.java b/testsuite/extra/src/main/java/io/smallrye/context/test/MyEntity.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/MyEntity.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/MyEntity.java
diff --git a/tests/src/main/java/io/smallrye/context/test/MyThreadContextProvider.java b/testsuite/extra/src/main/java/io/smallrye/context/test/MyThreadContextProvider.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/MyThreadContextProvider.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/MyThreadContextProvider.java
diff --git a/tests/src/main/java/io/smallrye/context/test/jta/TransactionalBean.java b/testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalBean.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/jta/TransactionalBean.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalBean.java
diff --git a/tests/src/main/java/io/smallrye/context/test/jta/TransactionalBeanImpl.java b/testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalBeanImpl.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/jta/TransactionalBeanImpl.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalBeanImpl.java
diff --git a/tests/src/main/java/io/smallrye/context/test/jta/TransactionalService.java b/testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalService.java
similarity index 100%
rename from tests/src/main/java/io/smallrye/context/test/jta/TransactionalService.java
rename to testsuite/extra/src/main/java/io/smallrye/context/test/jta/TransactionalService.java
diff --git a/tests/src/main/resources/META-INF/beans.xml b/testsuite/extra/src/main/resources/META-INF/beans.xml
similarity index 100%
rename from tests/src/main/resources/META-INF/beans.xml
rename to testsuite/extra/src/main/resources/META-INF/beans.xml
diff --git a/tests/src/main/resources/META-INF/persistence.xml b/testsuite/extra/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from tests/src/main/resources/META-INF/persistence.xml
rename to testsuite/extra/src/main/resources/META-INF/persistence.xml
diff --git a/tests/src/main/resources/META-INF/services/org.eclipse.microprofile.context.spi.ThreadContextProvider b/testsuite/extra/src/main/resources/META-INF/services/org.eclipse.microprofile.context.spi.ThreadContextProvider
similarity index 100%
rename from tests/src/main/resources/META-INF/services/org.eclipse.microprofile.context.spi.ThreadContextProvider
rename to testsuite/extra/src/main/resources/META-INF/services/org.eclipse.microprofile.context.spi.ThreadContextProvider
diff --git a/tests/src/test/java/io/smallrye/context/ManagerTest.java b/testsuite/extra/src/test/java/io/smallrye/context/ManagerTest.java
similarity index 54%
rename from tests/src/test/java/io/smallrye/context/ManagerTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/ManagerTest.java
index 6527a8d8..5864a9a8 100644
--- a/tests/src/test/java/io/smallrye/context/ManagerTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/ManagerTest.java
@@ -1,19 +1,21 @@
 package io.smallrye.context;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.microprofile.context.spi.ThreadContextProvider;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.impl.ThreadContextProviderPlan;
 import io.smallrye.context.test.DefaultThreadContextProvider;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class ManagerTest extends AbstractTest {
+class ManagerTest extends AbstractTest {
 
     List record = new ArrayList<>();
 
@@ -22,42 +24,42 @@ public class ManagerTest extends AbstractTest {
     ThreadContextProvider B = new DefaultThreadContextProvider("B", record);
 
     @Test
-    public void testContext() {
+    void testContext() {
         SmallRyeContextManager manager = new SmallRyeContextManager(Arrays.asList(A, B), Collections.emptyList(), null, false,
                 null, true);
 
         // all providers
         ThreadContextProviderPlan providers = manager.getProviderPlan();
-        Assert.assertEquals(2, providers.propagatedProviders.size());
-        Assert.assertTrue(providers.propagatedProviders.contains(A));
-        Assert.assertTrue(providers.propagatedProviders.contains(B));
-        Assert.assertEquals(0, providers.clearedProviders.size());
+        assertEquals(2, providers.propagatedProviders.size());
+        assertTrue(providers.propagatedProviders.contains(A));
+        assertTrue(providers.propagatedProviders.contains(B));
+        assertEquals(0, providers.clearedProviders.size());
 
         // A propagated, B cleared, none unchanged
         providers = manager.getProviderPlan(new String[] { "A" }, SmallRyeContextManager.NO_STRING,
                 SmallRyeContextManager.ALL_REMAINING_ARRAY);
-        Assert.assertEquals(1, providers.propagatedProviders.size());
-        Assert.assertTrue(providers.propagatedProviders.contains(A));
-        Assert.assertEquals(1, providers.clearedProviders.size());
-        Assert.assertTrue(providers.clearedProviders.contains(B));
+        assertEquals(1, providers.propagatedProviders.size());
+        assertTrue(providers.propagatedProviders.contains(A));
+        assertEquals(1, providers.clearedProviders.size());
+        assertTrue(providers.clearedProviders.contains(B));
 
         // A propagated, none cleared, B unchanged
         providers = manager.getProviderPlan(new String[] { "A" }, new String[] { "B" }, SmallRyeContextManager.NO_STRING);
-        Assert.assertEquals(1, providers.propagatedProviders.size());
-        Assert.assertTrue(providers.propagatedProviders.contains(A));
-        Assert.assertEquals(0, providers.clearedProviders.size());
+        assertEquals(1, providers.propagatedProviders.size());
+        assertTrue(providers.propagatedProviders.contains(A));
+        assertEquals(0, providers.clearedProviders.size());
 
         // none propagated, A,B cleared, none unchanged
         providers = manager.getProviderPlan(new String[] {}, new String[0], SmallRyeContextManager.ALL_REMAINING_ARRAY);
-        Assert.assertEquals(0, providers.propagatedProviders.size());
-        Assert.assertEquals(2, providers.clearedProviders.size());
-        Assert.assertTrue(providers.clearedProviders.contains(A));
-        Assert.assertTrue(providers.clearedProviders.contains(B));
+        assertEquals(0, providers.propagatedProviders.size());
+        assertEquals(2, providers.clearedProviders.size());
+        assertTrue(providers.clearedProviders.contains(A));
+        assertTrue(providers.clearedProviders.contains(B));
 
         // none propagated, A cleared, B unchanged
         providers = manager.getProviderPlan(new String[] {}, new String[] { "B" }, SmallRyeContextManager.ALL_REMAINING_ARRAY);
-        Assert.assertEquals(0, providers.propagatedProviders.size());
-        Assert.assertEquals(1, providers.clearedProviders.size());
-        Assert.assertTrue(providers.clearedProviders.contains(A));
+        assertEquals(0, providers.propagatedProviders.size());
+        assertEquals(1, providers.clearedProviders.size());
+        assertTrue(providers.clearedProviders.contains(A));
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/storage/CloseableContext.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/CloseableContext.java
similarity index 86%
rename from tests/src/test/java/io/smallrye/context/storage/CloseableContext.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/CloseableContext.java
index c4cfb8ed..44f2ef6c 100644
--- a/tests/src/test/java/io/smallrye/context/storage/CloseableContext.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/storage/CloseableContext.java
@@ -5,5 +5,5 @@
  */
 public interface CloseableContext extends AutoCloseable {
     @Override
-    public void close();
+    void close();
 }
diff --git a/tests/src/test/java/io/smallrye/context/storage/QuarkusStorageManager.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusStorageManager.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/QuarkusStorageManager.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusStorageManager.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/QuarkusStorageManagerProvider.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusStorageManagerProvider.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/QuarkusStorageManagerProvider.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusStorageManagerProvider.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/QuarkusThread.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusThread.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/QuarkusThread.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusThread.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/QuarkusThreadImpl.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusThreadImpl.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/QuarkusThreadImpl.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/QuarkusThreadImpl.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/RESTEasyContext.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyContext.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/RESTEasyContext.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyContext.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/RESTEasyStorageDeclaration.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyStorageDeclaration.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/RESTEasyStorageDeclaration.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyStorageDeclaration.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/RESTEasyThreadContextProvider.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyThreadContextProvider.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/RESTEasyThreadContextProvider.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasyThreadContextProvider.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/RESTEasy_QuarkusStorage.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasy_QuarkusStorage.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/RESTEasy_QuarkusStorage.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/RESTEasy_QuarkusStorage.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/SmallRyeThreadContext_QuarkusStorage.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/SmallRyeThreadContext_QuarkusStorage.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/storage/SmallRyeThreadContext_QuarkusStorage.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/SmallRyeThreadContext_QuarkusStorage.java
diff --git a/tests/src/test/java/io/smallrye/context/storage/StorageTest.java b/testsuite/extra/src/test/java/io/smallrye/context/storage/StorageTest.java
similarity index 75%
rename from tests/src/test/java/io/smallrye/context/storage/StorageTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/storage/StorageTest.java
index ef850a91..0c153538 100644
--- a/tests/src/test/java/io/smallrye/context/storage/StorageTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/storage/StorageTest.java
@@ -1,5 +1,8 @@
 package io.smallrye.context.storage;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
@@ -9,25 +12,24 @@
 import org.eclipse.microprofile.context.spi.ContextManager;
 import org.eclipse.microprofile.context.spi.ContextManager.Builder;
 import org.eclipse.microprofile.context.spi.ContextManagerProvider;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.storage.spi.StorageManagerProvider;
 import io.smallrye.context.storage.spi.StorageManagerProviderRegistration;
 
-public class StorageTest {
+class StorageTest {
 
     private static StorageManagerProviderRegistration registration;
 
-    @BeforeClass
-    public static void beforeAll() {
+    @BeforeAll
+    static void beforeAll() {
         registration = StorageManagerProvider.register(new QuarkusStorageManagerProvider());
     }
 
-    @AfterClass
-    public static void afterAll() {
+    @AfterAll
+    static void afterAll() {
         registration.unregister();
         registration = null;
     }
@@ -42,7 +44,7 @@ public Thread newThread(Runnable r) {
     }
 
     @Test
-    public void test() throws InterruptedException {
+    void test() throws InterruptedException {
         ExecutorService executor = Executors.newFixedThreadPool(4, new QuarkusThreadFactory());
         Builder builder = ContextManagerProvider.instance().getContextManagerBuilder();
         builder.withThreadContextProviders(new RESTEasyThreadContextProvider());
@@ -62,9 +64,9 @@ public void test() throws InterruptedException {
 
     private void testContext(ThreadContext tc) {
         // make sure we have no context
-        Assert.assertNull(RESTEasyContext.getContext(Integer.class));
+        assertNull(RESTEasyContext.getContext(Integer.class));
         // make sure we can capture the lack of context
-        Runnable noContext = tc.contextualRunnable(() -> Assert.assertNull(RESTEasyContext.getContext(Integer.class)));
+        Runnable noContext = tc.contextualRunnable(() -> assertNull(RESTEasyContext.getContext(Integer.class)));
         Runnable withContext;
 
         // add a new context level
@@ -72,15 +74,15 @@ private void testContext(ThreadContext tc) {
             // put some context
             RESTEasyContext.pushContext(Integer.class, 42);
             // make sure we have context
-            Assert.assertEquals((Integer) 42, RESTEasyContext.getContext(Integer.class));
+            assertEquals((Integer) 42, RESTEasyContext.getContext(Integer.class));
             // make sure we can capture this context
             withContext = tc
-                    .contextualRunnable(() -> Assert.assertEquals((Integer) 42, RESTEasyContext.getContext(Integer.class)));
+                    .contextualRunnable(() -> assertEquals((Integer) 42, RESTEasyContext.getContext(Integer.class)));
             // make sure we have no context when running this
             noContext.run();
         }
         // make sure the context is gone
-        Assert.assertNull(RESTEasyContext.getContext(Integer.class));
+        assertNull(RESTEasyContext.getContext(Integer.class));
         // make sure we have context when running this
         withContext.run();
     }
diff --git a/tests/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java
similarity index 81%
rename from tests/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java
index 3f865fd2..c8c92c07 100644
--- a/tests/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/BackPressureExceptionTest.java
@@ -4,24 +4,24 @@
 
 import java.util.concurrent.TimeUnit;
 
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import io.reactivex.observers.TestObserver;
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.test.util.AbstractTest;
 import rx.observers.AssertableSubscriber;
 
-public class BackPressureExceptionTest extends AbstractTest {
+class BackPressureExceptionTest extends AbstractTest {
 
-    @BeforeClass
-    public static void before() {
+    @BeforeAll
+    static void before() {
         // initialise
         SmallRyeContextManagerProvider.getManager();
     }
 
     @Test
-    public void testBackPressureRxJava1() {
+    void backPressureRxJava1() {
         AssertableSubscriber test = rx.Observable.from(asList(1, 2, 3, 4, 5, 6))
                 .concatMap(integer -> rx.Observable.just(integer).delay(100, TimeUnit.MILLISECONDS))
                 .test();
@@ -33,7 +33,7 @@ public void testBackPressureRxJava1() {
     }
 
     @Test
-    public void testBackPressureRxJava2() {
+    void backPressureRxJava2() {
         TestObserver test = io.reactivex.Observable.just(1, 2, 3, 4, 5, 6)
                 .concatMap(integer -> io.reactivex.Observable.just(integer).delay(100, TimeUnit.MILLISECONDS))
                 .test();
diff --git a/tests/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java
similarity index 61%
rename from tests/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java
index fee06238..2569303d 100644
--- a/tests/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/CurrentThreadContextTest.java
@@ -1,64 +1,66 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.CleanAutoCloseable;
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.SmallRyeThreadContext;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class CurrentThreadContextTest extends AbstractTest {
+class CurrentThreadContextTest extends AbstractTest {
     @Test
-    public void testCurrentThreadContext() throws InterruptedException, ExecutionException {
+    void currentThreadContext() throws InterruptedException, ExecutionException {
         MyContext ctx = new MyContext();
         MyContext.set(ctx);
-        Assert.assertEquals(ctx, MyContext.get());
+        assertEquals(ctx, MyContext.get());
 
         ExecutorService executorService = Executors.newFixedThreadPool(2);
         try {
             // all propagated contexts
             SmallRyeThreadContext allTC = SmallRyeContextManagerProvider.getManager().allPropagatedThreadContext();
-            Assert.assertNull(SmallRyeThreadContext.getCurrentThreadContext());
+            assertNull(SmallRyeThreadContext.getCurrentThreadContext());
             Runnable r = allTC.contextualRunnable(() -> {
-                Assert.assertEquals(ctx, MyContext.get());
-                Assert.assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertEquals(ctx, MyContext.get());
+                assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
             });
             executorService.submit(r).get();
 
             // default contexts
             SmallRyeThreadContext defaultTC = SmallRyeContextManagerProvider.getManager().defaultThreadContext();
-            Assert.assertNull(SmallRyeThreadContext.getCurrentThreadContext());
+            assertNull(SmallRyeThreadContext.getCurrentThreadContext());
             r = defaultTC.contextualRunnable(() -> {
-                Assert.assertEquals(ctx, MyContext.get());
-                Assert.assertEquals(defaultTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertEquals(ctx, MyContext.get());
+                assertEquals(defaultTC, SmallRyeThreadContext.getCurrentThreadContext());
             });
             executorService.submit(r).get();
 
             // all cleared contexts
             SmallRyeThreadContext noTC = SmallRyeContextManagerProvider.getManager().allClearedThreadContext();
-            Assert.assertNull(SmallRyeThreadContext.getCurrentThreadContext());
+            assertNull(SmallRyeThreadContext.getCurrentThreadContext());
             r = noTC.contextualRunnable(() -> {
-                Assert.assertNull(MyContext.get());
-                Assert.assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertNull(MyContext.get());
+                assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
             });
             executorService.submit(r).get();
 
             // start with all, then change to no context
             r = allTC.contextualRunnable(() -> {
                 // all TC
-                Assert.assertEquals(ctx, MyContext.get());
-                Assert.assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertEquals(ctx, MyContext.get());
+                assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
                 try (CleanAutoCloseable ac = SmallRyeThreadContext.withThreadContext(noTC)) {
-                    Assert.assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
+                    assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
                     // no TC
                     Runnable r2 = SmallRyeThreadContext.getCurrentThreadContext().contextualRunnable(() -> {
-                        Assert.assertNull(MyContext.get());
-                        Assert.assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
+                        assertNull(MyContext.get());
+                        assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
                     });
                     executorService.submit(r2).get();
                 } catch (Exception e) {
diff --git a/tests/src/test/java/io/smallrye/context/test/DefaultThreadContextProvider.java b/testsuite/extra/src/test/java/io/smallrye/context/test/DefaultThreadContextProvider.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/test/DefaultThreadContextProvider.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/DefaultThreadContextProvider.java
diff --git a/testsuite/extra/src/test/java/io/smallrye/context/test/FullStackTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/FullStackTest.java
new file mode 100644
index 00000000..56d323ea
--- /dev/null
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/FullStackTest.java
@@ -0,0 +1,218 @@
+package io.smallrye.context.test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import jakarta.enterprise.inject.spi.CDI;
+import jakarta.persistence.EntityManager;
+import jakarta.transaction.InvalidTransactionException;
+import jakarta.transaction.NotSupportedException;
+import jakarta.transaction.Status;
+import jakarta.transaction.SystemException;
+import jakarta.transaction.Transaction;
+import jakarta.transaction.TransactionManager;
+import jakarta.ws.rs.container.CompletionCallback;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.jboss.jandex.Index;
+import org.jboss.resteasy.cdi.CdiInjectorFactory;
+import org.jboss.resteasy.core.ResteasyContext;
+import org.jboss.resteasy.core.SynchronousDispatcher;
+import org.jboss.resteasy.core.scanner.ResourceScanner;
+import org.jboss.resteasy.plugins.server.vertx.VertxJaxrsServer;
+import org.jboss.resteasy.plugins.server.vertx.VertxResteasyDeployment;
+import org.jboss.resteasy.spi.HttpRequest;
+import org.jboss.resteasy.spi.HttpResponse;
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
+import org.jboss.weld.context.bound.BoundRequestContext;
+import org.jboss.weld.environment.se.Weld;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import com.arjuna.ats.jta.logging.jtaLogger;
+
+import io.smallrye.context.test.util.AbstractTest;
+import io.vertx.core.Vertx;
+import io.vertx.core.VertxOptions;
+
+class FullStackTest extends AbstractTest {
+    private final class MyVertxJaxrsServer extends VertxJaxrsServer {
+        public Vertx getVertx() {
+            return vertx;
+        }
+    }
+
+    private MyVertxJaxrsServer vertxJaxrsServer;
+    private Weld weld;
+
+    @BeforeEach
+    void before() throws Exception {
+        VertxResteasyDeployment deployment = new VertxResteasyDeployment();
+
+        weld = new Weld();
+        weld.initialize();
+
+        JTAUtils.startJTATM();
+
+        ResourceScanner scanner = ResourceScanner.of(Index.of(FullStackResource.class));
+
+        deployment.setInjectorFactoryClass(CdiInjectorFactory.class.getName());
+        ResteasyProviderFactory providerFactory = ResteasyProviderFactory.newInstance();
+        deployment.setProviderFactory(providerFactory);
+        VertxSynchronousDispatcher dispatcher = new VertxSynchronousDispatcher(providerFactory);
+        deployment.setDispatcher(dispatcher);
+        deployment.setRegistry(dispatcher.getRegistry());
+        deployment.setScannedResourceClasses(new ArrayList<>(scanner.getResources()));
+        deployment.start();
+
+        vertxJaxrsServer = new MyVertxJaxrsServer();
+        vertxJaxrsServer.setVertxOptions(new VertxOptions().setEventLoopPoolSize(1));
+        vertxJaxrsServer.setDeployment(deployment);
+        vertxJaxrsServer.setPort(8080);
+        vertxJaxrsServer.setRootResourcePath("/");
+        vertxJaxrsServer.setSecurityDomain(null);
+        vertxJaxrsServer.start();
+    }
+
+    @AfterEach
+    public void after() {
+        weld.shutdown();
+        vertxJaxrsServer.stop();
+        JTAUtils.stop();
+    }
+
+    @Test
+    public void fullStack() throws IOException {
+        try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
+            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test"))) {
+                assertEquals(200, response.getStatusLine().getStatusCode());
+                String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+                assertEquals("OK", body);
+            }
+
+            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test/async"))) {
+                assertEquals(500, response.getStatusLine().getStatusCode());
+            }
+
+            try (CloseableHttpResponse response = client.execute(new HttpGet("http://localhost:8080/test/async-working"))) {
+                assertEquals(200, response.getStatusLine().getStatusCode());
+                String body = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
+                assertEquals("OK", body);
+            }
+        }
+
+        // TODO RestAssured depends on on Jakarta EE 8 classes (JAX-B specifically)
+        //  see https://github.com/rest-assured/rest-assured/issues/1510
+        //RestAssured.when().get("/test").then().statusCode(200).body(is("OK"));
+        //RestAssured.when().get("/test/async").then().statusCode(500);
+        //RestAssured.when().get("/test/async-working").then().statusCode(200).body(is("OK"));
+    }
+
+    private class VertxSynchronousDispatcher extends SynchronousDispatcher {
+        public VertxSynchronousDispatcher(final ResteasyProviderFactory providerFactory) {
+            super(providerFactory);
+        }
+
+        @Override
+        public void invoke(HttpRequest req, HttpResponse response) {
+            ResteasyContext.pushContext(Vertx.class, vertxJaxrsServer.getVertx());
+
+            // set up CDI request context
+            BoundRequestContext cdiContext = CDI.current().select(BoundRequestContext.class).get();
+            Map contextMap = new HashMap();
+            cdiContext.associate(contextMap);
+            cdiContext.activate();
+
+            EntityManager entityManager = CDI.current().select(EntityManager.class).get();
+            TransactionManager transactionManager = CDI.current().select(TransactionManager.class).get();
+            Transaction transaction;
+            try {
+                transactionManager.begin();
+                transaction = transactionManager.getTransaction();
+            } catch (SystemException | NotSupportedException e) {
+                throw new RuntimeException(e);
+            }
+            System.err.println("BEGIN transaction " + transaction);
+
+            boolean success = false;
+            try {
+                Thread.currentThread().setContextClassLoader(new CPClassLoader());
+                super.invoke(req, response);
+                success = true;
+            } finally {
+                // tear down request contexts
+                if (req.getAsyncContext().isSuspended()) {
+                    // make sure we remove the CDI context
+                    cdiContext.deactivate();
+                    cdiContext.dissociate(contextMap);
+                    Transaction t2;
+                    try {
+                        t2 = transactionManager.suspend();
+                        System.err.println("SUSPEND " + t2);
+                    } catch (SystemException e) {
+                        throw new RuntimeException(e);
+                    }
+                    // clear it later
+                    req.getAsyncContext().getAsyncResponse().register((CompletionCallback) (t) -> {
+                        try {
+                            System.err.println("RESUME " + t2);
+                            Transaction currentTransaction = transactionManager.getTransaction();
+                            if (currentTransaction != t2) {
+                                if (currentTransaction != null)
+                                    transactionManager.suspend();
+                                transactionManager.resume(t2);
+                            }
+                        } catch (InvalidTransactionException | IllegalStateException | SystemException e) {
+                            e.printStackTrace();
+                        }
+                        terminateContext(cdiContext, contextMap, entityManager, transactionManager, t2, t == null);
+                    });
+                } else {
+                    // clear it now
+                    terminateContext(cdiContext, contextMap, entityManager, transactionManager, transaction, success);
+                }
+            }
+        }
+
+        private void terminateContext(BoundRequestContext cdiContext, Map contextMap,
+                EntityManager entityManager,
+                TransactionManager tm, Transaction tx, boolean success) {
+            System.err.println("END: " + success + " " + tx);
+            try {
+                endTransaction(tm, tx, success);
+            } catch (Exception e) {
+                // let's not throw here
+                e.printStackTrace();
+            }
+            // only need to terminate CDI context for "/test/async", otherwise context propagation handles it
+            if (cdiContext.isActive()) {
+                cdiContext.invalidate();
+                cdiContext.deactivate();
+                cdiContext.dissociate(contextMap);
+            }
+        }
+
+        protected void endTransaction(TransactionManager tm, Transaction tx, boolean success) throws Exception {
+
+            if (tx != tm.getTransaction()) {
+                throw new RuntimeException(jtaLogger.i18NLogger.get_wrong_tx_on_thread());
+            }
+
+            if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK || !success) {
+                tm.rollback();
+            } else {
+                tm.commit();
+            }
+        }
+    }
+}
diff --git a/tests/src/test/java/io/smallrye/context/test/JTATest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/JTATest.java
similarity index 81%
rename from tests/src/test/java/io/smallrye/context/test/JTATest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/JTATest.java
index 88421f91..9f9c68cf 100644
--- a/tests/src/test/java/io/smallrye/context/test/JTATest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/JTATest.java
@@ -1,5 +1,10 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
@@ -15,34 +20,32 @@
 import org.eclipse.microprofile.context.ThreadContext;
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
-import io.smallrye.context.inject.TransactionServicesImpl;
 import io.smallrye.context.test.jta.TransactionalService;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class JTATest extends AbstractTest {
+class JTATest extends AbstractTest {
     private static Weld weld;
 
-    @BeforeClass
-    public static void beforeClass() throws Exception {
+    @BeforeAll
+    static void beforeClass() {
         JTAUtils.startJTATM(); // initialise a transaction manager
 
         weld = new Weld(); // CDI implementation
         weld.addServices(new TransactionServicesImpl());
     }
 
-    @AfterClass
-    public static void afterClass() {
+    @AfterAll
+    static void afterClass() {
         JTAUtils.stop();
     }
 
-    @After
-    public void afterTest() {
+    @AfterEach
+    void afterTest() {
         try (WeldContainer container = weld.initialize()) {
             // lookup the transaction manager and the test service
             TransactionManager transactionManager = container.select(TransactionManager.class).get();
@@ -51,7 +54,7 @@ public void afterTest() {
                 // verify that there is no active transaction
                 Transaction transaction = transactionManager.getTransaction();
 
-                Assert.assertNull("transaction still associated", transaction);
+                assertNull(transaction, "transaction still associated");
             } catch (SystemException ignore) {
                 // expected
             }
@@ -59,7 +62,7 @@ public void afterTest() {
     }
 
     @Test
-    public void testBasic() throws Exception {
+    void basic() {
         try {
             ManagedExecutor executor = ManagedExecutor.builder()
                     .maxAsync(2)
@@ -69,7 +72,7 @@ public void testBasic() throws Exception {
 
             try (WeldContainer container = weld.initialize()) {
                 TransactionalService service = container.select(TransactionalService.class).get();
-                Assert.assertEquals(1, service.testAsync(executor));
+                assertEquals(1, service.testAsync(executor));
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -78,7 +81,7 @@ public void testBasic() throws Exception {
     }
 
     @Test
-    public void testTransaction() throws Exception {
+    void transaction() throws Exception {
         try {
             ManagedExecutor executor = ManagedExecutor.builder()
                     .maxAsync(2)
@@ -92,7 +95,7 @@ public void testTransaction() throws Exception {
                 TransactionalService service = container.select(TransactionalService.class).get();
 
                 transactionManager.begin();
-                Assert.assertEquals(0, service.getValue());
+                assertEquals(0, service.getValue());
 
                 CompletableFuture stage = executor.runAsync(service::required);
                 stage.join();
@@ -100,7 +103,7 @@ public void testTransaction() throws Exception {
                 try {
                     transactionManager.rollback();
                     if (transactionManager.getTransaction() != null)
-                        Assert.fail("transaction still active");
+                        fail("transaction still active");
                 } catch (SystemException e) {
                     e.printStackTrace();
                 }
@@ -112,7 +115,7 @@ public void testTransaction() throws Exception {
     }
 
     @Test
-    public void testTransactionPropagation() throws Exception {
+    void transactionPropagation() throws Exception {
         // create an executor that propagates the transaction context
         ManagedExecutor executor = ManagedExecutor.builder()
                 .maxAsync(2)
@@ -130,34 +133,34 @@ public void testTransactionPropagation() throws Exception {
             transaction = transactionManager.getTransaction();
 
             // the service which managages a transaction scoped bean should now be available
-            Assert.assertEquals(0, service.getValue());
+            assertEquals(0, service.getValue());
 
             try {
                 // run various transactional updates on the executor
                 CompletableFuture stage0 = executor.runAsync(() -> {
                     service.required(); // invoke a method that requires a transaction
                     // the service call should have updated the bean in this transaction scope
-                    Assert.assertEquals(1, service.getValue());
+                    assertEquals(1, service.getValue());
                 }).thenRunAsync(() -> {
                     service.requiresNew();
                     // the service call should have updated a different bean in a different transaction scope
-                    Assert.assertEquals(1, service.getValue());
+                    assertEquals(1, service.getValue());
                 }).thenRunAsync(() -> {
                     // the service call should have updated the bean in this transaction scope
                     service.supports();
-                    Assert.assertEquals(2, service.getValue());
+                    assertEquals(2, service.getValue());
                 }).thenRunAsync(() -> {
                     // updating a transaction scoped bean outside of a transacction should fail
                     callServiceExpectFailure((tm, svc) -> svc.never(), transactionManager, service);
-                    Assert.assertEquals(2, service.getValue());
+                    assertEquals(2, service.getValue());
                 }).thenRunAsync(() -> {
                     // updating a transaction scoped bean outside of a transacction should fail
                     callServiceExpectFailure((tm, svc) -> svc.notSupported(), transactionManager, service);
-                    Assert.assertEquals(2, service.getValue());
+                    assertEquals(2, service.getValue());
                 }).thenRunAsync(() -> {
                     service.mandatory();
                     // the service call should have updated the bean in this transaction scope
-                    Assert.assertEquals(3, service.getValue());
+                    assertEquals(3, service.getValue());
                 });
 
                 stage0.join();
@@ -168,17 +171,17 @@ public void testTransactionPropagation() throws Exception {
                 // the executor finishes.
                 try {
                     // the bean increments should have happened
-                    Assert.assertEquals(3, service.getValue());
+                    assertEquals(3, service.getValue());
                     transactionManager.rollback();
 
                     try {
                         // since the transactio has finished verify that the transaction scoped bean is no longer bound
                         service.getValue();
-                        Assert.fail("TransactionScoped bean should only be available from transaction scope");
+                        fail("TransactionScoped bean should only be available from transaction scope");
                     } catch (Exception ignore) {
                     }
                 } finally {
-                    Assert.assertNull("transaction still activet", transactionManager.getTransaction());
+                    assertNull(transactionManager.getTransaction(), "transaction still active");
                 }
             }
         } finally {
@@ -197,19 +200,19 @@ private void callServiceExpectFailure(TransactionalServiceCall stage0 = executor.runAsync(service::required);
@@ -238,16 +241,16 @@ public void testConcurrentTransactionPropagation() throws Exception {
                 // the executor finishes.
                 try {
                     // the two bean increments should have happened
-                    Assert.assertEquals(2, service.getValue());
+                    assertEquals(2, service.getValue());
                     transactionManager.rollback();
 
                     try {
                         service.getValue();
-                        Assert.fail("TransactionScoped bean should only be available from transaction scope");
+                        fail("TransactionScoped bean should only be available from transaction scope");
                     } catch (Exception ignore) {
                     }
                 } finally {
-                    Assert.assertNull("transaction still activet", transactionManager.getTransaction());
+                    assertNull(transactionManager.getTransaction(), "transaction still active");
                 }
             }
         } finally {
@@ -256,7 +259,7 @@ public void testConcurrentTransactionPropagation() throws Exception {
     }
 
     @Test
-    public void testRunUnderTransactionOfExecutingThread() {
+    void runUnderTransactionOfExecutingThread() {
         /*
          * ThreadContext threadContext = ThreadContext.builder()
          * .propagated(ThreadContext.TRANSACTION)
@@ -275,16 +278,16 @@ public void testRunUnderTransactionOfExecutingThread() {
             try {
                 transactionManager.begin();
                 transactionManager.getTransaction();
-                Assert.assertTrue("The callable did not run in a transaction", transactionCallable.call());
+                assertTrue(transactionCallable.call(), "The callable did not run in a transaction");
             } catch (Exception e) {
                 e.printStackTrace();
-                Assert.fail(e.getMessage());
+                fail(e.getMessage());
             }
 
             try {
                 transactionManager.rollback();
                 if (transactionManager.getTransaction() != null)
-                    Assert.fail("transaction still active");
+                    fail("transaction still active");
             } catch (SystemException e) {
                 e.printStackTrace();
             }
@@ -292,7 +295,7 @@ public void testRunUnderTransactionOfExecutingThread() {
     }
 
     @Test
-    public void testTransactionWithUT() throws Exception {
+    void transactionWithUT() throws Exception {
         try {
             ManagedExecutor executor = ManagedExecutor.builder()
                     .maxAsync(2)
@@ -306,15 +309,14 @@ public void testTransactionWithUT() throws Exception {
                 TransactionalService service = container.select(TransactionalService.class).get();
 
                 ut.begin();
-                Assert.assertEquals(0, service.getValue());
+                assertEquals(0, service.getValue());
 
                 CompletableFuture stage = executor.runAsync(service::required);
                 stage.join();
 
                 try {
                     ut.rollback();
-                    Assert.assertEquals("transaction still active",
-                            ut.getStatus(), Status.STATUS_NO_TRANSACTION);
+                    assertEquals(ut.getStatus(), Status.STATUS_NO_TRANSACTION, "transaction still active");
                 } catch (SystemException e) {
                     e.printStackTrace();
                 }
@@ -326,7 +328,7 @@ public void testTransactionWithUT() throws Exception {
     }
 
     @Test
-    public void testTransactionWithSuspend() throws Exception {
+    void transactionWithSuspend() throws Exception {
         ManagedExecutor executor = ManagedExecutor.builder()
                 .maxAsync(2)
                 .propagated(ThreadContext.TRANSACTION)
diff --git a/tests/src/test/java/io/smallrye/context/test/JTAUtils.java b/testsuite/extra/src/test/java/io/smallrye/context/test/JTAUtils.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/test/JTAUtils.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/JTAUtils.java
diff --git a/tests/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java
similarity index 86%
rename from tests/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java
index 86f7857f..962cf5d6 100644
--- a/tests/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/ManualPropagationMultipleRequestTest.java
@@ -1,5 +1,7 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
@@ -9,21 +11,20 @@
 import org.eclipse.microprofile.context.ManagedExecutor;
 import org.eclipse.microprofile.context.ThreadContext;
 import org.eclipse.microprofile.context.spi.ContextManagerProvider;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.SmallRyeThreadContext;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class ManualPropagationMultipleRequestTest extends AbstractTest {
+class ManualPropagationMultipleRequestTest extends AbstractTest {
 
     private static SmallRyeThreadContext threadContext;
     private static SmallRyeThreadContext minimalThreadContext;
 
-    @BeforeClass
-    public static void init() {
+    @BeforeAll
+    static void init() {
         threadContext = (SmallRyeThreadContext) ContextManagerProvider.instance().getContextManager().newThreadContextBuilder()
                 .build();
         minimalThreadContext = SmallRyeContextManagerProvider.instance().getContextManagerBuilder()
@@ -47,12 +48,12 @@ public void endOfRequest() {
     }
 
     @Test
-    public void testRunnableOnSingleWorkerThread() throws Throwable {
+    void runnableOnSingleWorkerThread() throws Throwable {
         testRunnable(Executors.newFixedThreadPool(1));
     }
 
     @Test
-    public void testRunnableOnTwoWorkerThread() throws Throwable {
+    void runnableOnTwoWorkerThread() throws Throwable {
         testRunnable(Executors.newFixedThreadPool(2));
     }
 
@@ -75,12 +76,12 @@ private void testRunnable(ExecutorService executor) throws Throwable {
     }
 
     @Test
-    public void testFastRunnableOnSingleWorkerThread() throws Throwable {
+    void fastRunnableOnSingleWorkerThread() throws Throwable {
         testFastRunnable(Executors.newFixedThreadPool(1));
     }
 
     @Test
-    public void testFastRunnableOnTwoWorkerThread() throws Throwable {
+    void fastRunnableOnTwoWorkerThread() throws Throwable {
         testFastRunnable(Executors.newFixedThreadPool(2));
     }
 
@@ -103,14 +104,14 @@ private void testFastRunnable(ExecutorService executor) throws Throwable {
     }
 
     @Test
-    public void testCompletionStageOnSingleWorkerThread() throws Throwable {
+    void completionStageOnSingleWorkerThread() throws Throwable {
         ManagedExecutor executor = ContextManagerProvider.instance().getContextManager().newManagedExecutorBuilder().maxAsync(1)
                 .build();
         testCompletionStage(executor);
     }
 
     @Test
-    public void testCompletionStageOnTwoWorkerThread() throws Throwable {
+    void completionStageOnTwoWorkerThread() throws Throwable {
         ManagedExecutor executor = ContextManagerProvider.instance().getContextManager().newManagedExecutorBuilder().maxAsync(2)
                 .build();
         testCompletionStage(executor);
@@ -160,6 +161,6 @@ private void testCompletionStage(ManagedExecutor executor) throws Throwable {
     }
 
     private void checkContextCaptured(String reqId) {
-        Assert.assertEquals(reqId, MyContext.get().getReqId());
+        assertEquals(reqId, MyContext.get().getReqId());
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/MiscTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/MiscTest.java
similarity index 72%
rename from tests/src/test/java/io/smallrye/context/test/MiscTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/MiscTest.java
index cdf2eb79..a42d0fa6 100644
--- a/tests/src/test/java/io/smallrye/context/test/MiscTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/MiscTest.java
@@ -1,5 +1,9 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ExecutionException;
@@ -9,36 +13,35 @@
 import org.eclipse.microprofile.context.ThreadContext;
 import org.eclipse.microprofile.context.spi.ContextManager;
 import org.eclipse.microprofile.context.spi.ContextManagerProvider;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.SmallRyeContextManager;
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class MiscTest extends AbstractTest {
+class MiscTest extends AbstractTest {
 
     @Test
-    public void testCFWrapping() {
+    void testCFWrapping() {
         ContextManager contextManager = ContextManagerProvider.instance().getContextManager();
         ThreadContext threadContext = contextManager.newThreadContextBuilder().build();
 
         CompletionStage cs = CompletableFuture.completedFuture("foo");
         CompletionStage wrapped = threadContext.withContextCapture(cs);
-        Assert.assertTrue(wrapped instanceof CompletableFuture);
+        assertTrue(wrapped instanceof CompletableFuture);
     }
 
     /**
      * Verify that dependent stages created via withContextCapture can be completed independently
      * of the original stage.
-     * 
+     *
      * Modified from the spec to specify a default executor, which appears to make it fail.
      *
      * @throws ExecutionException indicates test failure
      * @throws InterruptedException indicates test failure
      */
     @Test
-    public void withContextCaptureDependentStageForcedCompletion() throws ExecutionException, InterruptedException {
+    void contextCaptureDependentStageForcedCompletion() throws ExecutionException, InterruptedException {
         ExecutorService executorService = Executors.newSingleThreadExecutor();
         SmallRyeContextManager contextManager = SmallRyeContextManagerProvider.instance().getContextManagerBuilder()
                 .withDefaultExecutorService(executorService).build();
@@ -51,27 +54,19 @@ public void withContextCaptureDependentStageForcedCompletion() throws ExecutionE
         CompletableFuture stage1 = new CompletableFuture();
         CompletableFuture stage2 = contextPropagator.withContextCapture(stage1);
 
-        Assert.assertTrue(
-                "It should be possible to complete a CompletableFuture created via withContextCapture without completing the original stage.",
-                stage2.complete("stage_2_done"));
+        assertTrue(stage2.complete("stage_2_done"),
+                "It should be possible to complete a CompletableFuture created via withContextCapture without completing the original stage.");
 
-        Assert.assertFalse(
-                "Completion of the dependent stage must not imply completion of the original stage.",
-                stage1.isDone());
+        assertFalse(stage1.isDone(), "Completion of the dependent stage must not imply completion of the original stage.");
 
-        Assert.assertTrue(
-                "It should be possible to complete the original stage with a different result after dependent stage was forcibly completed.",
-                stage1.complete("stage_1_done"));
+        assertTrue(stage1.complete("stage_1_done"),
+                "It should be possible to complete the original stage with a different result after dependent stage was forcibly completed.");
 
-        Assert.assertEquals(
-                "Completion stage result does not match the result with which it was forcibly completed.",
-                "stage_1_done",
-                stage1.get());
+        assertEquals("stage_1_done", stage1.get(),
+                "Completion stage result does not match the result with which it was forcibly completed.");
 
-        Assert.assertEquals(
-                "Completion stage result does not match the result with which it was forcibly completed.",
-                "stage_2_done",
-                stage2.get());
+        assertEquals("stage_2_done", stage2.get(),
+                "Completion stage result does not match the result with which it was forcibly completed.");
 
         executorService.shutdown();
     }
diff --git a/tests/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java
similarity index 87%
rename from tests/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java
index 305d07c3..a6d939d1 100644
--- a/tests/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1MultipleRequestTest.java
@@ -1,12 +1,13 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.test.util.AbstractTest;
@@ -15,10 +16,10 @@
 import rx.Scheduler;
 import rx.schedulers.Schedulers;
 
-public class RxJava1MultipleRequestTest extends AbstractTest {
+class RxJava1MultipleRequestTest extends AbstractTest {
 
-    @BeforeClass
-    public static void init() {
+    @BeforeAll
+    static void init() {
         // initialise
         SmallRyeContextManagerProvider.getManager();
     }
@@ -35,13 +36,13 @@ public void endOfRequest() {
     }
 
     @Test
-    public void testObservableOnSingleWorkerThread() throws Throwable {
+    void observableOnSingleWorkerThread() throws Throwable {
         Executor myExecutor = Executors.newSingleThreadExecutor();
         testObservable(Schedulers.from(myExecutor));
     }
 
     @Test
-    public void testObservableOnNewWorkerThreads() throws Throwable {
+    void observableOnNewWorkerThreads() throws Throwable {
         testObservable(Schedulers.newThread());
     }
 
@@ -108,6 +109,6 @@ private void testObservable(Scheduler scheduler) throws Throwable {
     }
 
     private void checkContextCaptured(String reqId) {
-        Assert.assertEquals(reqId, MyContext.get().getReqId());
+        assertEquals(reqId, MyContext.get().getReqId());
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/RxJava1Test.java b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1Test.java
similarity index 81%
rename from tests/src/test/java/io/smallrye/context/test/RxJava1Test.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1Test.java
index b9aca550..e42d2ed6 100644
--- a/tests/src/test/java/io/smallrye/context/test/RxJava1Test.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava1Test.java
@@ -1,12 +1,13 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.concurrent.CountDownLatch;
 
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.test.util.AbstractTest;
@@ -16,27 +17,27 @@
 import rx.Single;
 import rx.schedulers.Schedulers;
 
-public class RxJava1Test extends AbstractTest {
+class RxJava1Test extends AbstractTest {
 
-    @BeforeClass
-    public static void init() {
+    @BeforeAll
+    static void init() {
         // initialise
         SmallRyeContextManagerProvider.getManager();
     }
 
-    @Before
-    public void before() {
+    @BeforeEach
+    void before() {
         MyContext.init();
         MyContext.get().set("test");
     }
 
-    @After
-    public void after() {
+    @AfterEach
+    void after() {
         MyContext.clear();
     }
 
     @Test
-    public void testCompletable() throws Throwable {
+    void completable() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -60,7 +61,7 @@ public void testCompletable() throws Throwable {
     }
 
     @Test
-    public void testSingle() throws Throwable {
+    void single() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -84,7 +85,7 @@ public void testSingle() throws Throwable {
     }
 
     @Test
-    public void testObservable() throws Throwable {
+    void observable() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -109,6 +110,6 @@ public void testObservable() throws Throwable {
     }
 
     private void checkContextCaptured() {
-        Assert.assertEquals("test", MyContext.get().getReqId());
+        assertEquals("test", MyContext.get().getReqId());
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/RxJava2Test.java b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava2Test.java
similarity index 85%
rename from tests/src/test/java/io/smallrye/context/test/RxJava2Test.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/RxJava2Test.java
index 7ac13165..3c3129a0 100644
--- a/tests/src/test/java/io/smallrye/context/test/RxJava2Test.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/RxJava2Test.java
@@ -1,12 +1,13 @@
 package io.smallrye.context.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.concurrent.CountDownLatch;
 
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import io.reactivex.BackpressureStrategy;
 import io.reactivex.Completable;
@@ -18,27 +19,26 @@
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class RxJava2Test extends AbstractTest {
-
-    @BeforeClass
-    public static void init() {
+class RxJava2Test extends AbstractTest {
+    @BeforeAll
+    static void init() {
         // initialise
         SmallRyeContextManagerProvider.getManager();
     }
 
-    @Before
-    public void before() {
+    @BeforeEach
+    void before() {
         MyContext.init();
         MyContext.get().set("test");
     }
 
-    @After
-    public void after() {
+    @AfterEach
+    void after() {
         MyContext.clear();
     }
 
     @Test
-    public void testCompletable() throws Throwable {
+    void completable() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -62,7 +62,7 @@ public void testCompletable() throws Throwable {
     }
 
     @Test
-    public void testSingle() throws Throwable {
+    void single() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -86,7 +86,7 @@ public void testSingle() throws Throwable {
     }
 
     @Test
-    public void testObservable() throws Throwable {
+    void observable() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -111,7 +111,7 @@ public void testObservable() throws Throwable {
     }
 
     @Test
-    public void testFlowable() throws Throwable {
+    void flowable() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -136,7 +136,7 @@ public void testFlowable() throws Throwable {
     }
 
     @Test
-    public void testMaybe() throws Throwable {
+    void maybe() throws Throwable {
         // check initial state
         checkContextCaptured();
         CountDownLatch latch = new CountDownLatch(1);
@@ -161,6 +161,6 @@ public void testMaybe() throws Throwable {
     }
 
     private void checkContextCaptured() {
-        Assert.assertEquals("test", MyContext.get().getReqId());
+        assertEquals("test", MyContext.get().getReqId());
     }
 }
diff --git a/jta/src/test/java/io/smallrye/context/inject/TransactionServicesImpl.java b/testsuite/extra/src/test/java/io/smallrye/context/test/TransactionServicesImpl.java
similarity index 98%
rename from jta/src/test/java/io/smallrye/context/inject/TransactionServicesImpl.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/TransactionServicesImpl.java
index 360f4ddc..7532ee69 100644
--- a/jta/src/test/java/io/smallrye/context/inject/TransactionServicesImpl.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/TransactionServicesImpl.java
@@ -1,4 +1,4 @@
-package io.smallrye.context.inject;
+package io.smallrye.context.test;
 
 import jakarta.transaction.RollbackException;
 import jakarta.transaction.Status;
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java
similarity index 79%
rename from tests/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java
index 2a3ebf04..9e381d2d 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/context/propagation/CdiContextPropagatesTest.java
@@ -1,5 +1,8 @@
 package io.smallrye.context.test.cdi.context.propagation;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -10,20 +13,19 @@
 import org.eclipse.microprofile.context.ThreadContext;
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.test.JTAUtils;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class CdiContextPropagatesTest extends AbstractTest {
+class CdiContextPropagatesTest extends AbstractTest {
 
     private static Weld weld;
 
-    @BeforeClass
-    public static void init() {
+    @BeforeAll
+    static void init() {
         JTAUtils.startJTATM();
         // with smallrye-conc-cdi on CP, the CDI thread context provider gets
         // discovered
@@ -31,13 +33,13 @@ public static void init() {
         weld.addBeanClasses(MyReqScopedBean.class);
     }
 
-    @AfterClass
-    public static void stop() {
+    @AfterAll
+    static void stop() {
         JTAUtils.stop();
     }
 
     @Test
-    public void testRequestContextPropagates() throws InterruptedException {
+    void requestContextPropagates() throws InterruptedException {
         ManagedExecutor executor = ManagedExecutor.builder().maxAsync(2).propagated(ThreadContext.CDI).build();
         CountDownLatch latch = new CountDownLatch(1);
 
@@ -56,7 +58,7 @@ public void testRequestContextPropagates() throws InterruptedException {
             });
 
             if (!latch.await(20, TimeUnit.SECONDS)) {
-                Assert.fail("Waiting for CountDownLatch failed!");
+                fail("Waiting for CountDownLatch failed!");
             }
             finalState = reqScopedBean.getState();
 
@@ -65,6 +67,6 @@ public void testRequestContextPropagates() throws InterruptedException {
         }
         // assert the state of the same bean was changed by another thread via
         // executor
-        Assert.assertTrue(finalState == 2);
+        assertEquals(2, finalState);
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/context/propagation/MyReqScopedBean.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/context/propagation/MyReqScopedBean.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/test/cdi/context/propagation/MyReqScopedBean.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/context/propagation/MyReqScopedBean.java
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java
similarity index 74%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java
index 41d7e298..61a6c75f 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithCurrentContextMethods.java
@@ -1,5 +1,9 @@
 package io.smallrye.context.test.cdi.providedBeans;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -7,8 +11,6 @@
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.inject.spi.CDI;
 
-import org.junit.Assert;
-
 import io.smallrye.context.CleanAutoCloseable;
 import io.smallrye.context.SmallRyeContextManagerProvider;
 import io.smallrye.context.SmallRyeThreadContext;
@@ -22,17 +24,17 @@ public class BeanWithCurrentContextMethods {
     public void assertCurrentContext() throws InterruptedException, ExecutionException {
         // default is to propagate everything
         SmallRyeThreadContext allTC = SmallRyeThreadContext.getCurrentThreadContext();
-        Assert.assertNotNull(allTC);
+        assertNotNull(allTC);
         MyContext ctx = new MyContext();
         MyContext.set(ctx);
-        Assert.assertEquals(ctx, MyContext.get());
+        assertEquals(ctx, MyContext.get());
 
         ExecutorService executorService = Executors.newFixedThreadPool(2);
         try {
             // all propagated contexts
             Runnable r = allTC.contextualRunnable(() -> {
-                Assert.assertEquals(ctx, MyContext.get());
-                Assert.assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertEquals(ctx, MyContext.get());
+                assertEquals(allTC, SmallRyeThreadContext.getCurrentThreadContext());
             });
             executorService.submit(r).get();
         } finally {
@@ -44,17 +46,17 @@ public void assertCurrentContext() throws InterruptedException, ExecutionExcepti
     public void assertCurrentContextAllCleared() throws InterruptedException, ExecutionException {
         // default is to propagate nothing
         SmallRyeThreadContext noTC = SmallRyeThreadContext.getCurrentThreadContext();
-        Assert.assertNotNull(noTC);
+        assertNotNull(noTC);
         MyContext ctx = new MyContext();
         MyContext.set(ctx);
-        Assert.assertEquals(ctx, MyContext.get());
+        assertEquals(ctx, MyContext.get());
 
         ExecutorService executorService = Executors.newFixedThreadPool(2);
         try {
             // no propagated contexts
             Runnable r = noTC.contextualRunnable(() -> {
-                Assert.assertNull(MyContext.get());
-                Assert.assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
+                assertNull(MyContext.get());
+                assertEquals(noTC, SmallRyeThreadContext.getCurrentThreadContext());
             });
             executorService.submit(r).get();
         } finally {
@@ -65,18 +67,18 @@ public void assertCurrentContextAllCleared() throws InterruptedException, Execut
     @CurrentThreadContext(remove = true)
     public void assertCurrentContextRemoved() throws InterruptedException, ExecutionException {
         // no current context
-        Assert.assertNull(SmallRyeThreadContext.getCurrentThreadContext());
+        assertNull(SmallRyeThreadContext.getCurrentThreadContext());
     }
 
     public void assertNoCurrentContext() throws InterruptedException, ExecutionException {
         // no current context
-        Assert.assertNull(SmallRyeThreadContext.getCurrentThreadContext());
+        assertNull(SmallRyeThreadContext.getCurrentThreadContext());
 
         SmallRyeThreadContext clearedTC = SmallRyeContextManagerProvider.getManager().allClearedThreadContext();
         // make sure we can also remove it via the interceptor
         try (CleanAutoCloseable ac = SmallRyeThreadContext.withThreadContext(clearedTC)) {
-            Assert.assertEquals(clearedTC, SmallRyeThreadContext.getCurrentThreadContext());
-            // this.calls are not intercepted in Weld 
+            assertEquals(clearedTC, SmallRyeThreadContext.getCurrentThreadContext());
+            // this.calls are not intercepted in Weld
             CDI.current().select(BeanWithCurrentContextMethods.class).get().assertCurrentContextRemoved();
         }
     }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java
similarity index 74%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java
index c39be944..3de82466 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/BeanWithInjectionPoints.java
@@ -3,6 +3,9 @@
 import static io.smallrye.context.test.cdi.providedBeans.Utils.providersToStringSet;
 import static io.smallrye.context.test.cdi.providedBeans.Utils.unwrapExecutor;
 import static io.smallrye.context.test.cdi.providedBeans.Utils.unwrapThreadContext;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Set;
 
@@ -11,7 +14,6 @@
 
 import org.eclipse.microprofile.context.ManagedExecutor;
 import org.eclipse.microprofile.context.ThreadContext;
-import org.junit.Assert;
 
 import io.smallrye.context.SmallRyeManagedExecutor;
 import io.smallrye.context.SmallRyeThreadContext;
@@ -62,59 +64,59 @@ public class BeanWithInjectionPoints {
 
     public void assertDefaultExecutor() {
         SmallRyeManagedExecutor exec = unwrapExecutor(defaultConfigExecutor);
-        Assert.assertEquals(-1, exec.getMaxAsync());
-        Assert.assertEquals(-1, exec.getMaxQueued());
+        assertEquals(-1, exec.getMaxAsync());
+        assertEquals(-1, exec.getMaxQueued());
         ThreadContextProviderPlan plan = exec.getThreadContextProviderPlan();
-        Assert.assertEquals(0, plan.unchangedProviders.size());
-        Assert.assertEquals(0, plan.clearedProviders.size());
+        assertEquals(0, plan.unchangedProviders.size());
+        assertEquals(0, plan.clearedProviders.size());
         Set propagated = providersToStringSet(plan.propagatedProviders);
-        Assert.assertTrue(propagated.contains(ThreadContext.CDI));
-        Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+        assertTrue(propagated.contains(ThreadContext.CDI));
+        assertTrue(propagated.contains(ThreadContext.TRANSACTION));
     }
 
     public void assertSharedExecutorsAreTheSame() {
         // simply unwrap both and compare reference
         SmallRyeManagedExecutor shared1 = unwrapExecutor(executor2);
         SmallRyeManagedExecutor shared2 = unwrapExecutor(executor3);
-        Assert.assertSame(shared1, shared2);
+        assertSame(shared1, shared2);
     }
 
     public void assertConfiguredManagedExecutor() {
         SmallRyeManagedExecutor exec = unwrapExecutor(configuredExecutor);
-        Assert.assertEquals(2, exec.getMaxAsync());
-        Assert.assertEquals(3, exec.getMaxQueued());
+        assertEquals(2, exec.getMaxAsync());
+        assertEquals(3, exec.getMaxQueued());
         ThreadContextProviderPlan plan = exec.getThreadContextProviderPlan();
-        Assert.assertEquals(0, plan.unchangedProviders.size());
+        assertEquals(0, plan.unchangedProviders.size());
         Set propagated = providersToStringSet(plan.propagatedProviders);
         Set cleared = providersToStringSet(plan.clearedProviders);
-        Assert.assertTrue(cleared.contains(ThreadContext.CDI));
-        Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+        assertTrue(cleared.contains(ThreadContext.CDI));
+        assertTrue(propagated.contains(ThreadContext.TRANSACTION));
     }
 
     public void assertSharedThreadContextsAreTheSame() {
         //unwrap and compare references
         SmallRyeThreadContext shared1 = unwrapThreadContext(threadContext1);
         SmallRyeThreadContext shared2 = unwrapThreadContext(threadContext2);
-        Assert.assertSame(shared1, shared2);
+        assertSame(shared1, shared2);
     }
 
     public void assertConfiguredThreadContext() {
         SmallRyeThreadContext context = unwrapThreadContext(configuredThreadContext);
         ThreadContextProviderPlan plan = context.getPlan();
-        Assert.assertEquals(0, plan.unchangedProviders.size());
+        assertEquals(0, plan.unchangedProviders.size());
         Set propagated = providersToStringSet(plan.propagatedProviders);
         Set cleared = providersToStringSet(plan.clearedProviders);
-        Assert.assertTrue(propagated.contains(ThreadContext.CDI));
-        Assert.assertTrue(cleared.contains(ThreadContext.TRANSACTION));
+        assertTrue(propagated.contains(ThreadContext.CDI));
+        assertTrue(cleared.contains(ThreadContext.TRANSACTION));
     }
 
     public void assertDefaultThreadContext() {
         SmallRyeThreadContext context = unwrapThreadContext(defaultThreadContext);
         ThreadContextProviderPlan plan = context.getPlan();
-        Assert.assertEquals(0, plan.unchangedProviders.size());
-        Assert.assertEquals(0, plan.clearedProviders.size());
+        assertEquals(0, plan.unchangedProviders.size());
+        assertEquals(0, plan.clearedProviders.size());
         Set propagated = providersToStringSet(plan.propagatedProviders);
-        Assert.assertTrue(propagated.contains(ThreadContext.CDI));
-        Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+        assertTrue(propagated.contains(ThreadContext.CDI));
+        assertTrue(propagated.contains(ThreadContext.TRANSACTION));
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java
similarity index 72%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java
index 8b0a5a1f..d72cb135 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/CurrentThreadContextInterceptorTest.java
@@ -4,33 +4,33 @@
 
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.test.JTAUtils;
 
 /**
- * Tests usage of {@link io.smallrye.context.api.WithCurrentContext}
+ * Tests usage of {@link io.smallrye.context.api.CurrentThreadContext}
  * on methods
  */
-public class CurrentThreadContextInterceptorTest {
+class CurrentThreadContextInterceptorTest {
 
-    @Before
-    public void before() {
+    @BeforeEach
+    void before() {
         // This is required because even if the JTA ThreadContextProvider can figure out that JTA is not available,
         // CDI will try to contact JTA via JNDI for its TransactionContext scope, which will break when propagating
         // the CDI context
         JTAUtils.startJTATM();
     }
 
-    @After
-    public void after() {
+    @AfterEach
+    void after() {
         JTAUtils.stop();
     }
 
     @Test
-    public void testInterceptor() throws InterruptedException, ExecutionException {
+    void interceptor() throws InterruptedException, ExecutionException {
         try (WeldContainer container = new Weld().addBeanClass(BeanWithCurrentContextMethods.class).initialize()) {
             BeanWithCurrentContextMethods bean = container.select(BeanWithCurrentContextMethods.class).get();
             bean.assertCurrentContext();
@@ -38,5 +38,4 @@ public void testInterceptor() throws InterruptedException, ExecutionException {
             bean.assertNoCurrentContext();
         }
     }
-
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java
similarity index 89%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java
index b8e54dd1..f07dd84e 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/ExecutorAndThreadContextInjectionTest.java
@@ -2,7 +2,7 @@
 
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests usage of {@link io.smallrye.context.api.ManagedExecutorConfig}
@@ -10,10 +10,10 @@
  *
  * @author Matej Novotny
  */
-public class ExecutorAndThreadContextInjectionTest {
+class ExecutorAndThreadContextInjectionTest {
 
     @Test
-    public void testInjectionWithConfigurationAndSharing() {
+    void injectionWithConfigurationAndSharing() {
         try (WeldContainer container = new Weld().addBeanClass(BeanWithInjectionPoints.class).initialize()) {
             // being able to select the bean verifies that injection points are satisfied
             BeanWithInjectionPoints bean = container.select(BeanWithInjectionPoints.class).get();
@@ -28,5 +28,4 @@ public void testInjectionWithConfigurationAndSharing() {
             bean.assertSharedThreadContextsAreTheSame();
         }
     }
-
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/Utils.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/Utils.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/Utils.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/Utils.java
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java
similarity index 68%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java
index e2652ca2..3f0d03d0 100644
--- a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/MpConfigOverridingConfigurationTest.java
@@ -1,22 +1,24 @@
 package io.smallrye.context.test.cdi.providedBeans.microprofileConfiguration;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.Set;
 
 import org.eclipse.microprofile.context.ThreadContext;
 import org.jboss.weld.environment.se.Weld;
 import org.jboss.weld.environment.se.WeldContainer;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import io.smallrye.context.SmallRyeManagedExecutor;
 import io.smallrye.context.SmallRyeThreadContext;
 import io.smallrye.context.impl.ThreadContextProviderPlan;
 import io.smallrye.context.test.cdi.providedBeans.Utils;
 
-public class MpConfigOverridingConfigurationTest {
+class MpConfigOverridingConfigurationTest {
 
     @Test
-    public void testOverridingIPsWithMpConfig() {
+    void overridingIPsWithMpConfig() {
         try (WeldContainer container = new Weld().addBeanClass(SomeBean.class).initialize()) {
             SomeBean bean = container.select(SomeBean.class).get();
             // verify standard field IPs
@@ -26,41 +28,41 @@ public void testOverridingIPsWithMpConfig() {
             verifyThreadContext(Utils.unwrapThreadContext(bean.getOverrideConfiguredTC()));
             // verify IP as method parameter where we set empty value via MP config
             container.event().select(String.class).fire("foo");
-            Assert.assertTrue(SomeBean.OBSERVER_NOTIFIED);
+            assertTrue(SomeBean.OBSERVER_NOTIFIED);
             ThreadContextProviderPlan plan = Utils.unwrapExecutor(bean.getExecutorFromObserverMethod())
                     .getThreadContextProviderPlan();
             Set propagated = Utils.providersToStringSet(plan.propagatedProviders);
-            Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
-            Assert.assertTrue(propagated.contains(ThreadContext.CDI));
-            Assert.assertTrue(plan.clearedProviders.size() == 0);
-            Assert.assertTrue(plan.unchangedProviders.size() == 0);
+            assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+            assertTrue(propagated.contains(ThreadContext.CDI));
+            assertEquals(0, plan.clearedProviders.size());
+            assertEquals(0, plan.unchangedProviders.size());
         }
     }
 
     private void verifyManagedExecutor(SmallRyeManagedExecutor me) {
-        Assert.assertEquals(-1, me.getMaxQueued());
+        assertEquals(-1, me.getMaxQueued());
         // max async is overriden by MP config
-        Assert.assertEquals(2, me.getMaxAsync());
+        assertEquals(2, me.getMaxAsync());
         ThreadContextProviderPlan threadContextProviderPlan = me.getThreadContextProviderPlan();
         // CDI context is moved to cleared contexts by MP config
-        Assert.assertTrue(threadContextProviderPlan.clearedProviders.size() == 1);
-        Assert.assertEquals(ThreadContext.CDI,
+        assertEquals(1, threadContextProviderPlan.clearedProviders.size());
+        assertEquals(ThreadContext.CDI,
                 threadContextProviderPlan.clearedProviders.iterator().next().getThreadContextType());
         // indirectly verify that propagated contained all remaining, e.g. transactions will be there
         Set propagated = Utils.providersToStringSet(threadContextProviderPlan.propagatedProviders);
-        Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
-        Assert.assertTrue(threadContextProviderPlan.unchangedProviders.size() == 0);
+        assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+        assertEquals(0, threadContextProviderPlan.unchangedProviders.size());
     }
 
     private void verifyThreadContext(SmallRyeThreadContext tc) {
         ThreadContextProviderPlan threadContextProviderPlan = tc.getPlan();
         // CDI context is moved to cleared contexts by MP config
-        Assert.assertTrue(threadContextProviderPlan.clearedProviders.size() == 1);
-        Assert.assertEquals(ThreadContext.CDI,
+        assertEquals(1, threadContextProviderPlan.clearedProviders.size());
+        assertEquals(ThreadContext.CDI,
                 threadContextProviderPlan.clearedProviders.iterator().next().getThreadContextType());
         // indirectly verify that propagated contained all remaining, e.g. transactions will be there
         Set propagated = Utils.providersToStringSet(threadContextProviderPlan.propagatedProviders);
-        Assert.assertTrue(propagated.contains(ThreadContext.TRANSACTION));
-        Assert.assertTrue(threadContextProviderPlan.unchangedProviders.size() == 0);
+        assertTrue(propagated.contains(ThreadContext.TRANSACTION));
+        assertEquals(0, threadContextProviderPlan.unchangedProviders.size());
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/SomeBean.java b/testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/SomeBean.java
similarity index 100%
rename from tests/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/SomeBean.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/cdi/providedBeans/microprofileConfiguration/SomeBean.java
diff --git a/tests/src/test/java/io/smallrye/context/test/classloading/ATest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/ATest.java
similarity index 59%
rename from tests/src/test/java/io/smallrye/context/test/classloading/ATest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/classloading/ATest.java
index 465d6f6f..ade09c63 100644
--- a/tests/src/test/java/io/smallrye/context/test/classloading/ATest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/ATest.java
@@ -1,11 +1,14 @@
 package io.smallrye.context.test.classloading;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.List;
 import java.util.function.BiConsumer;
 
 import org.eclipse.microprofile.context.spi.ContextManagerExtension;
 import org.eclipse.microprofile.context.spi.ContextManagerProvider;
-import org.junit.Assert;
 
 import io.smallrye.context.SmallRyeContextManager;
 import io.smallrye.context.SmallRyeContextManagerProvider;
@@ -15,21 +18,21 @@ public class ATest implements BiConsumer {
 
     @Override
     public void accept(ClassLoader thisClassLoader, ClassLoader parentClassLoader) {
-        Assert.assertEquals(thisClassLoader, ATest.class.getClassLoader());
+        assertEquals(thisClassLoader, ATest.class.getClassLoader());
         ContextManagerProvider contextProvider = ContextManagerProvider.instance();
         System.err.println("A CP: " + contextProvider);
         System.err.println("A CM: " + contextProvider.getContextManager());
-        Assert.assertEquals(parentClassLoader, contextProvider.getClass().getClassLoader());
+        assertEquals(parentClassLoader, contextProvider.getClass().getClassLoader());
 
         SmallRyeContextManager contextManager = (SmallRyeContextManager) contextProvider.getContextManager();
         ThreadContextProviderPlan plan = contextManager.getProviderPlan();
-        Assert.assertEquals(1, plan.propagatedProviders.size());
-        Assert.assertEquals("A", plan.propagatedProviders.iterator().next().getThreadContextType());
-        Assert.assertTrue(plan.unchangedProviders.isEmpty());
-        Assert.assertTrue(plan.clearedProviders.isEmpty());
+        assertEquals(1, plan.propagatedProviders.size());
+        assertEquals("A", plan.propagatedProviders.iterator().next().getThreadContextType());
+        assertTrue(plan.unchangedProviders.isEmpty());
+        assertTrue(plan.clearedProviders.isEmpty());
 
         List propagators = SmallRyeContextManagerProvider.getManager().getExtensions();
-        Assert.assertEquals(1, propagators.size());
-        Assert.assertTrue(propagators.get(0).getClass() == MultiClassloadingTest.AThreadContextPropagator.class);
+        assertEquals(1, propagators.size());
+        assertSame(propagators.get(0).getClass(), MultiClassloadingTest.AThreadContextPropagator.class);
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/classloading/BTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/BTest.java
similarity index 59%
rename from tests/src/test/java/io/smallrye/context/test/classloading/BTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/classloading/BTest.java
index 6758bda7..e2a0d955 100644
--- a/tests/src/test/java/io/smallrye/context/test/classloading/BTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/BTest.java
@@ -1,11 +1,14 @@
 package io.smallrye.context.test.classloading;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.List;
 import java.util.function.BiConsumer;
 
 import org.eclipse.microprofile.context.spi.ContextManagerExtension;
 import org.eclipse.microprofile.context.spi.ContextManagerProvider;
-import org.junit.Assert;
 
 import io.smallrye.context.SmallRyeContextManager;
 import io.smallrye.context.SmallRyeContextManagerProvider;
@@ -15,21 +18,21 @@ public class BTest implements BiConsumer {
 
     @Override
     public void accept(ClassLoader thisClassLoader, ClassLoader parentClassLoader) {
-        Assert.assertEquals(thisClassLoader, BTest.class.getClassLoader());
+        assertEquals(thisClassLoader, BTest.class.getClassLoader());
         ContextManagerProvider contextProvider = ContextManagerProvider.instance();
         System.err.println("B CP: " + contextProvider);
         System.err.println("B CM: " + contextProvider.getContextManager());
-        Assert.assertEquals(parentClassLoader, contextProvider.getClass().getClassLoader());
+        assertEquals(parentClassLoader, contextProvider.getClass().getClassLoader());
 
         SmallRyeContextManager contextManager = (SmallRyeContextManager) contextProvider.getContextManager();
         ThreadContextProviderPlan plan = contextManager.getProviderPlan();
-        Assert.assertEquals(1, plan.propagatedProviders.size());
-        Assert.assertEquals("B", plan.propagatedProviders.iterator().next().getThreadContextType());
-        Assert.assertTrue(plan.unchangedProviders.isEmpty());
-        Assert.assertTrue(plan.clearedProviders.isEmpty());
+        assertEquals(1, plan.propagatedProviders.size());
+        assertEquals("B", plan.propagatedProviders.iterator().next().getThreadContextType());
+        assertTrue(plan.unchangedProviders.isEmpty());
+        assertTrue(plan.clearedProviders.isEmpty());
 
         List propagators = SmallRyeContextManagerProvider.getManager().getExtensions();
-        Assert.assertEquals(1, propagators.size());
-        Assert.assertTrue(propagators.get(0).getClass() == MultiClassloadingTest.BThreadContextPropagator.class);
+        assertEquals(1, propagators.size());
+        assertSame(propagators.get(0).getClass(), MultiClassloadingTest.BThreadContextPropagator.class);
     }
 }
diff --git a/tests/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java
similarity index 93%
rename from tests/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java
index 5aecb5ca..ec51c2a9 100644
--- a/tests/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/classloading/MultiClassloadingTest.java
@@ -36,8 +36,9 @@
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.classloader.ShrinkWrapClassLoader;
 import org.jboss.shrinkwrap.api.spec.JavaArchive;
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.opentest4j.AssertionFailedError;
 
 import io.smallrye.common.classloader.ClassPathUtils;
 import io.smallrye.common.function.Functions;
@@ -48,7 +49,7 @@
 import io.smallrye.context.impl.DefaultValues;
 import io.smallrye.context.test.util.AbstractTest;
 
-public class MultiClassloadingTest extends AbstractTest {
+class MultiClassloadingTest extends AbstractTest {
 
     public static class AThreadContextPropagator implements ContextManagerExtension {
 
@@ -113,12 +114,13 @@ public String getThreadContextType() {
     }
 
     @Test
-    public void test() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+    void test() throws Exception {
         String thisPackage = MultiClassloadingTest.class.getPackage().getName();
 
         JavaArchive parentJar = ShrinkWrap.create(JavaArchive.class)
                 .addPackages(true, ThreadContext.class.getPackage().getName())
-                .addPackages(true, Assert.class.getPackage().getName())
+                .addPackages(true, Assertions.class.getPackage().getName())
+                .addPackages(true, AssertionFailedError.class.getPackage().getName())
                 .addPackages(true, ConfigProvider.class.getPackage().getName())
                 .addPackages(true, SmallRyeConfig.class.getPackage().getName())
                 .addPackages(true, Logger.class.getPackage().getName())
@@ -157,13 +159,13 @@ public void test() throws InstantiationException, IllegalAccessException, ClassN
             Thread.currentThread().setContextClassLoader(aCL);
             BiConsumer aTest = (BiConsumer) aCL
                     .loadClass(thisPackage + ".ATest")
-                    .newInstance();
+                    .getDeclaredConstructor().newInstance();
             aTest.accept(aCL, parentCL);
 
             Thread.currentThread().setContextClassLoader(bCL);
             BiConsumer bTest = (BiConsumer) bCL
                     .loadClass(thisPackage + ".BTest")
-                    .newInstance();
+                    .getDeclaredConstructor().newInstance();
             bTest.accept(bCL, parentCL);
         } finally {
             Thread.currentThread().setContextClassLoader(contextClassLoader);
diff --git a/tests/src/test/java/io/smallrye/context/test/util/AbstractTest.java b/testsuite/extra/src/test/java/io/smallrye/context/test/util/AbstractTest.java
similarity index 87%
rename from tests/src/test/java/io/smallrye/context/test/util/AbstractTest.java
rename to testsuite/extra/src/test/java/io/smallrye/context/test/util/AbstractTest.java
index 1d5c5a41..62b4e2db 100644
--- a/tests/src/test/java/io/smallrye/context/test/util/AbstractTest.java
+++ b/testsuite/extra/src/test/java/io/smallrye/context/test/util/AbstractTest.java
@@ -1,6 +1,6 @@
 package io.smallrye.context.test.util;
 
-import org.junit.BeforeClass;
+import org.junit.jupiter.api.BeforeAll;
 
 import io.smallrye.context.SmallRyeContextManagerProvider;
 
@@ -14,8 +14,8 @@
  */
 public abstract class AbstractTest {
 
-    @BeforeClass
-    public static void performContextManagerCleanup() {
+    @BeforeAll
+    static void performContextManagerCleanup() {
         SmallRyeContextManagerProvider.instance().releaseContextManager(SmallRyeContextManagerProvider.getManager());
     }
 
diff --git a/tests/src/test/resources/META-INF/microprofile-config.properties b/testsuite/extra/src/test/resources/META-INF/microprofile-config.properties
similarity index 100%
rename from tests/src/test/resources/META-INF/microprofile-config.properties
rename to testsuite/extra/src/test/resources/META-INF/microprofile-config.properties
diff --git a/tck/src/test/resources/jndi.properties b/testsuite/extra/src/test/resources/jndi.properties
similarity index 100%
rename from tck/src/test/resources/jndi.properties
rename to testsuite/extra/src/test/resources/jndi.properties
diff --git a/testsuite/pom.xml b/testsuite/pom.xml
new file mode 100644
index 00000000..cb7411f0
--- /dev/null
+++ b/testsuite/pom.xml
@@ -0,0 +1,113 @@
+
+
+
+    4.0.0
+
+    
+        io.smallrye
+        smallrye-context-propagation-parent
+        2.0.1-SNAPSHOT
+    
+
+    smallrye-context-propagation-testsuite
+    SmallRye Context Propagation: Test Suite
+    pom
+
+    
+        2.3.0
+        1.2.6
+
+        3.1.0
+
+        2.0.0
+        3.1.3
+        5.1.0.Final
+        6.2.0.Final
+        2.0.0.Beta1
+        6.2.0.CR2
+        4.3.3
+        2.5.0
+        5.0.5.Final
+        2.2
+    
+
+    
+        extra
+        tck
+    
+
+    
+        
+            
+                org.apache.maven.plugins
+                maven-install-plugin
+                
+                    true
+                
+            
+            
+                org.sonatype.plugins
+                nexus-staging-maven-plugin
+                
+                    true
+                
+            
+        
+    
+
+    
+        
+            
+                io.smallrye.testing
+                smallrye-testing-bom-tck
+                ${version.smallrye.testing}
+                import
+                pom
+            
+
+            
+                org.jboss.shrinkwrap
+                shrinkwrap-bom
+                ${version.shrinkwrap}
+                pom
+                import
+            
+
+            
+                jakarta.persistence
+                jakarta.persistence-api
+                ${version.jakarta.persistence}
+            
+        
+    
+
+    
+        
+        
+            jboss-public-repository-group
+            JBoss Public Maven Repository Group
+            https://repository.jboss.org/nexus/content/groups/public/
+            
+                true
+            
+            
+                true
+            
+        
+    
+
diff --git a/tck/pom.xml b/testsuite/tck/pom.xml
similarity index 60%
rename from tck/pom.xml
rename to testsuite/tck/pom.xml
index 0f3b3090..f9257d1a 100644
--- a/tck/pom.xml
+++ b/testsuite/tck/pom.xml
@@ -3,152 +3,107 @@
     4.0.0
     
         io.smallrye
-        smallrye-context-propagation-parent
+        smallrye-context-propagation-testsuite
         2.0.1-SNAPSHOT
     
-    smallrye-context-propagation-tck
-    smallrye-context-propagation-tck
 
-    
-        true
-    
+    smallrye-context-propagation-tck
+    SmallRye Context Propagation: MicroProfile Context Propagation TCK
 
     
-        
-            org.testng
-            testng
-            test
-        
-        
         
             org.eclipse.microprofile.context-propagation
             microprofile-context-propagation-tck
             test
         
-        
         
             ${project.groupId}
             smallrye-context-propagation
             ${project.version}
             test
         
-        
         
             ${project.groupId}
             smallrye-context-propagation-cdi
             ${project.version}
             test
         
-        
         
             ${project.groupId}
             smallrye-context-propagation-application
             ${project.version}
             test
         
-
-        
-            ${project.groupId}
-            smallrye-context-propagation-jta
-            ${project.version}
-            test
-        
-
         
             ${project.groupId}
             smallrye-context-propagation-jta
             ${project.version}
-            tests
-            test-jar
             test
         
 
         
-            org.jboss.weld
-            weld-api
-            test
-        
-        
-        
-            org.jboss.weld
-            weld-spi
-            test
-        
-        
-        
-            org.jboss.weld
-            weld-core-impl
+            org.jboss.shrinkwrap.resolver
+            shrinkwrap-resolver-spi
             test
         
-
         
-            org.jboss.weld.module
-            weld-jta
-            ${version.weld.core}
+            org.jboss.shrinkwrap.resolver
+            shrinkwrap-resolver-api-maven
             test
         
-
         
-            org.jboss.arquillian.core
-            arquillian-core-spi
+            org.jboss.shrinkwrap.resolver
+            shrinkwrap-resolver-impl-maven
             test
         
 
-        
-            org.jboss.arquillian.junit
-            arquillian-junit-container
-            test
-        
+        
         
             org.jboss.arquillian.container
-            arquillian-container-spi
+            arquillian-weld-embedded
             test
         
         
-            junit
-            junit
+            org.jboss.weld.se
+            weld-se-shaded
+            ${version.weld-core}
             test
         
         
-            org.jboss.arquillian.test
-            arquillian-test-spi
+            org.jboss.weld.module
+            weld-jta
+            ${version.weld-core}
+            test
         
         
             org.jboss.narayana.jta
             narayana-jta-jakarta
             ${version.narayana}
+            test
             
                 
                     org.jboss.logmanager
                     jboss-logmanager
                 
             
-            test
         
-
         
         
             org.jboss.naming
             jnpserver
             ${version.jnpserver}
+            test
             
                 
                     org.jboss.logging
                     jboss-logging-spi
                 
             
-            test
         
-
         
-            org.jboss.shrinkwrap.resolver
-            shrinkwrap-resolver-depchain
-            pom
-        
-        
-        
-            org.jboss.arquillian.container
-            arquillian-weld-embedded
+            io.smallrye.config
+            smallrye-config
+            ${version.smallrye.config}
             test
         
     
@@ -164,21 +119,6 @@
                     
                 
             
-
-            
-                org.apache.maven.plugins
-                maven-install-plugin
-                
-                    true
-                
-            
-            
-                org.sonatype.plugins
-                nexus-staging-maven-plugin
-                
-                    true
-                
-            
         
     
 
diff --git a/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextArchiveProcessor.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextArchiveProcessor.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/SmallRyeContextArchiveProcessor.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextArchiveProcessor.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextLoadableExtension.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextLoadableExtension.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/SmallRyeContextLoadableExtension.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/SmallRyeContextLoadableExtension.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/TckContextManagerTest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/TckContextManagerTest.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/TckContextManagerTest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/TckContextManagerTest.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/TckMPConfigTest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/TckMPConfigTest.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/TckMPConfigTest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/TckMPConfigTest.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/TckManagedExecutorTest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/TckManagedExecutorTest.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/TckManagedExecutorTest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/TckManagedExecutorTest.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/TckThreadContextTest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/TckThreadContextTest.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/TckThreadContextTest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/TckThreadContextTest.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java
index 96c81aad..3fbe1a15 100644
--- a/tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/ThreadContextCSCFTest.java
@@ -463,7 +463,7 @@ public void contextOfContextualFunctionOverridesContextOfManagedExecutor()
      * by the ManagedExecutor's failedFuture implementation. Thread context is captured
      * at each point where a dependent stage is added, rather than solely upon creation of the
      * initial stage or construction of the builder.
-     * 
+     *
      * @throws ExecutionException indicates test failure
      * @throws InterruptedException indicates test failure
      * @throws TimeoutException indicates test failure
@@ -749,7 +749,7 @@ public void newIncompleteFutureDependentStagesRunWithContext() throws ExecutionE
 
     /**
      * Verify that we can copy a CompletableFuture and get context propagation in the copy's dependent stages.
-     * 
+     *
      * @throws InterruptedException indicates test failure
      * @throws ExecutionException indicates test failure
      * @throws TimeoutException indicates test failure
@@ -796,7 +796,7 @@ public void copyCompletableFuture() throws InterruptedException, ExecutionExcept
 
     /**
      * Verify that we can copy a CompletionStage and get context propagation in the copy's dependent stages.
-     * 
+     *
      * @throws InterruptedException indicates test failure
      * @throws ExecutionException indicates test failure
      * @throws TimeoutException indicates test failure
diff --git a/testsuite/tck/src/test/java/io/smallrye/context/tck/TransactionServicesImpl.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/TransactionServicesImpl.java
new file mode 100644
index 00000000..42026e4c
--- /dev/null
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/TransactionServicesImpl.java
@@ -0,0 +1,74 @@
+package io.smallrye.context.tck;
+
+import jakarta.transaction.RollbackException;
+import jakarta.transaction.Status;
+import jakarta.transaction.Synchronization;
+import jakarta.transaction.SystemException;
+import jakarta.transaction.Transaction;
+import jakarta.transaction.TransactionManager;
+import jakarta.transaction.UserTransaction;
+
+import org.jboss.weld.transaction.spi.TransactionServices;
+
+public class TransactionServicesImpl implements TransactionServices {
+    private Transaction getTransaction() {
+        try {
+            TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
+
+            return tm == null ? null : tm.getTransaction();
+        } catch (SystemException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void registerSynchronization(Synchronization synchronization) {
+        Transaction transaction = getTransaction();
+
+        if (transaction == null) {
+            throw new RuntimeException("No active transaction");
+        }
+
+        try {
+            transaction.registerSynchronization(synchronization);
+        } catch (RollbackException | SystemException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public boolean isTransactionActive() {
+        try {
+            Transaction transaction = getTransaction();
+            int status;
+
+            if (transaction == null) {
+                return false;
+            }
+
+            status = transaction.getStatus();
+
+            return status == Status.STATUS_ACTIVE ||
+                    status == Status.STATUS_COMMITTING ||
+                    status == Status.STATUS_MARKED_ROLLBACK ||
+                    status == Status.STATUS_PREPARED ||
+                    status == Status.STATUS_PREPARING ||
+                    status == Status.STATUS_ROLLING_BACK;
+        } catch (SystemException | RuntimeException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public UserTransaction getUserTransaction() {
+        try {
+            return com.arjuna.ats.jta.UserTransaction.userTransaction();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public void cleanup() {
+    }
+}
diff --git a/tck/src/test/java/io/smallrye/context/tck/cdi/TckBasicCDITest.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/cdi/TckBasicCDITest.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/cdi/TckBasicCDITest.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/cdi/TckBasicCDITest.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExecuter.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExecuter.java
similarity index 100%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExecuter.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExecuter.java
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java
index e8b2a84a..6e9eec93 100644
--- a/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/LifecycleExtension.java
@@ -10,7 +10,7 @@
  * 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,  
+ * 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.
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java
index 556f6396..96068e3c 100644
--- a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterDeploy.java
@@ -10,7 +10,7 @@
  * 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,  
+ * 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.
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java
index 2fe4354e..8431e56a 100644
--- a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/AfterUnDeploy.java
@@ -10,7 +10,7 @@
  * 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,  
+ * 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.
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java
index 674430cc..bfaa526d 100644
--- a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeDeploy.java
@@ -10,7 +10,7 @@
  * 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,  
+ * 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.
diff --git a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java
similarity index 99%
rename from tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java
rename to testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java
index aab9eb8b..b2b4d4c1 100644
--- a/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java
+++ b/testsuite/tck/src/test/java/io/smallrye/context/tck/lifecycle/api/BeforeUnDeploy.java
@@ -10,7 +10,7 @@
  * 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,  
+ * 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.
diff --git a/tck/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/testsuite/tck/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
similarity index 100%
rename from tck/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
rename to testsuite/tck/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
diff --git a/testsuite/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service b/testsuite/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service
new file mode 100644
index 00000000..61d52b8c
--- /dev/null
+++ b/testsuite/tck/src/test/resources/META-INF/services/org.jboss.weld.bootstrap.api.Service
@@ -0,0 +1 @@
+io.smallrye.context.tck.TransactionServicesImpl
diff --git a/tck/src/test/resources/arquillian.xml b/testsuite/tck/src/test/resources/arquillian.xml
similarity index 100%
rename from tck/src/test/resources/arquillian.xml
rename to testsuite/tck/src/test/resources/arquillian.xml
diff --git a/tests/src/test/resources/jndi.properties b/testsuite/tck/src/test/resources/jndi.properties
similarity index 100%
rename from tests/src/test/resources/jndi.properties
rename to testsuite/tck/src/test/resources/jndi.properties