Backport server side configuration. Is it worth it?
diff --git a/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 95fe661..032481c 100644
--- a/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -210,20 +210,28 @@
         return new ProviderCache(checkAll);
     }
     protected static void initFactory(ProviderFactory factory) {
+
+        final List<Object> providers = new ArrayList<>();
+        providers.add(new BinaryDataProvider<Object>());
+        providers.add(new SourceProvider<Object>());
+        providers.add(DATA_SOURCE_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+        providers.add(new FormEncodingProvider<Object>());
+        providers.add(new StringTextProvider());
+        providers.add(new PrimitiveTextProvider<Object>());
+        providers.add(JAXB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+        providers.add(MULTIPART_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+
+        // property set in CxfRsHttpListener
+        if (!PropertyUtils.isFalse(factory.getBus().getProperty("org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider.activated"))) {
+            providers.add(JSONP_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+        }
+        if (!PropertyUtils.isFalse(factory.getBus().getProperty("org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider.activated"))) {
+            providers.add(JSONB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+        }
+
         // ensure to not load providers not available in a module environment if not needed
-        factory.setProviders(false,
-                             false,
-                     new BinaryDataProvider<Object>(),
-                     new SourceProvider<Object>(),
-                     DATA_SOURCE_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
-                     new FormEncodingProvider<Object>(),
-                     new StringTextProvider(),
-                     new PrimitiveTextProvider<Object>(),
-                     JAXB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
-                     JAXB_ELEMENT_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
-                     JSONP_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
-                     JSONB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
-                     MULTIPART_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+        factory.setProviders(false, false, providers.toArray(new Object[0]));
+
         Object prop = factory.getBus().getProperty("skip.default.json.provider.registration");
         if (!PropertyUtils.isTrue(prop)) {
             factory.setProviders(false, false, createProvider(JSON_PROVIDER_NAME, factory.getBus()));
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index 6abf1e9..7f56b3e 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -130,7 +130,6 @@
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.net.HttpURLConnection;
 import java.net.URL;
@@ -760,7 +759,7 @@
                 factory.setProvider(new TomEESseEventSinkContextProvider());
 
                 server = factory.create();
-                fixProviderIfKnown();
+                fixProviders(serviceConfiguration);
                 fireServerCreated(oldLoader);
 
                 final ServerProviderFactory spf = ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
@@ -846,7 +845,13 @@
         return Singleton.class == scope || Dependent.class == scope;
     }
 
-    private void fixProviderIfKnown() {
+    /**
+     * Fix providers set in ProviderFactory
+     * - changes default Jonhzon by the TomEE specific one
+     * - remove deactivated providers
+     * @param serviceConfiguration
+     */
+    private void fixProviders(final ServiceConfiguration serviceConfiguration) {
         final ServerProviderFactory spf = ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
         for (final String field : asList("messageWriters", "messageReaders")) {
             final List<ProviderInfo<?>> values = List.class.cast(Reflections.get(spf, field));
@@ -863,21 +868,31 @@
                 }
             }
 
-            if (customJsonProvider) { // remove JohnzonProvider default versions
-                final Iterator<ProviderInfo<?>> it = values.iterator();
-                while (it.hasNext()) {
-                    final String name = it.next().getResourceClass().getName();
-                    if ("org.apache.johnzon.jaxrs.JohnzonProvider".equals(name) ||
-                            "org.apache.openejb.server.cxf.rs.CxfRSService$TomEEJohnzonProvider".equals(name)) {
-                        it.remove();
-                        break;
-                    }
+            final Iterator<ProviderInfo<?>> it = values.iterator();
+            while (it.hasNext()) {
+                final String name = it.next().getResourceClass().getName();
+
+                // remove JohnzonProvider default versions
+                if (("org.apache.johnzon.jaxrs.JohnzonProvider".equals(name) ||
+                        "org.apache.openejb.server.cxf.rs.CxfRSService$TomEEJohnzonProvider".equals(name)) && customJsonProvider) {
+                    it.remove();
+                }
+
+                // remove deactivated providers
+                if (!isActive(name, serviceConfiguration)) {
+                    it.remove();
                 }
             }
+
         }
 
     }
 
+    public boolean isActive(final String name, final ServiceConfiguration serviceConfiguration) {
+        final String key = name + ".activated";
+        return "true".equalsIgnoreCase(SystemInstance.get().getProperty(key, serviceConfiguration.getProperties().getProperty(key, "true")));
+    }
+
     private static Class<?> realClass(final Class<?> aClass) {
         Class<?> result = aClass;
         while (result.getName().contains("$$")) {
diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
index c6f0bc1..5fd13db 100644
--- a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
+++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
@@ -51,7 +51,8 @@
 @Classes(DisableTomEEJohnzonTest.Endpoint.class)
 @JaxrsProviders(DisableTomEEJohnzonTest.TestWriter.class)
 @ContainerProperties({
-        @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJohnzonProvider.activated", value = "false")
+        @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider.activated", value = "false"),
+        @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider.activated", value = "false")
 })
 @RunWith(ApplicationComposer.class)
 public class DisableTomEEJohnzonTest {