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 486a589..d45f001 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
@@ -36,7 +36,6 @@
 import org.apache.cxf.jaxrs.model.MethodDispatcher;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
 import org.apache.cxf.jaxrs.model.ProviderInfo;
-import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
 import org.apache.cxf.jaxrs.sse.SseContextProvider;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
@@ -117,30 +116,22 @@
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.ClientRequestFilter;
 import javax.ws.rs.core.Application;
-import javax.ws.rs.core.Configuration;
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedHashMap;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.MessageBodyWriter;
 import javax.ws.rs.ext.Provider;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -155,7 +146,6 @@
 import java.util.stream.Stream;
 
 import static java.util.Arrays.asList;
-import static org.apache.openejb.loader.JarLocation.jarLocation;
 
 public class CxfRsHttpListener implements RsHttpListener {
 
@@ -991,12 +981,6 @@
                                   final ServiceConfiguration serviceConfiguration,
                                   final JAXRSServerFactoryBean factory,
                                   final WebBeansContext ctx) {
-        if (!"true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cxf.rs.skip-provider-sorting", "false"))) {
-            final Comparator<?> providerComparator = findProviderComparator(serviceConfiguration, ctx);
-            if (providerComparator != null) {
-                factory.setProviderComparator(providerComparator);
-            }
-        }
         CxfUtil.configureEndpoint(factory, serviceConfiguration, CXF_JAXRS_PREFIX);
 
         boolean enforceCxfBvalMapper = false;
@@ -1175,213 +1159,6 @@
         return o != null || !OpenEJBPerRequestPojoResourceProvider.class.isInstance(resourceProvider) ? o : resourceProvider.getInstance(message);
     }
 
-    private Comparator<?> findProviderComparator(final ServiceConfiguration serviceConfiguration, final WebBeansContext ctx) {
-        final String comparatorKey = CXF_JAXRS_PREFIX + "provider-comparator";
-        final String comparatorClass = serviceConfiguration.getProperties()
-                .getProperty(comparatorKey, SystemInstance.get().getProperty(comparatorKey));
-
-        Comparator<Object> comparator = null;
-        if (comparatorClass == null) {
-            return null; // try to rely on CXF behavior otherwise just reactivate DefaultProviderComparator.INSTANCE if it is an issue
-        } else {
-            final BeanManagerImpl bm = ctx == null ? null : ctx.getBeanManagerImpl();
-            if (bm != null && bm.isInUse()) {
-                try {
-                    final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(comparatorClass);
-                    final Set<Bean<?>> beans = bm.getBeans(clazz);
-                    if (beans != null && !beans.isEmpty()) {
-                        final Bean<?> bean = bm.resolve(beans);
-                        final CreationalContextImpl<?> creationalContext = bm.createCreationalContext(bean);
-                        comparator = Comparator.class.cast(bm.getReference(bean, clazz, creationalContext));
-                        toRelease.add(creationalContext);
-                    }
-                } catch (final Throwable th) {
-                    LOGGER.debug("Can't use CDI to load comparator " + comparatorClass);
-                }
-            }
-
-            if (comparator == null) {
-                comparator = Comparator.class.cast(ServiceInfos.resolve(serviceConfiguration.getAvailableServices(), comparatorClass));
-            }
-            if (comparator == null) {
-                try {
-                    comparator = Comparator.class.cast(Thread.currentThread().getContextClassLoader().loadClass(comparatorClass).newInstance());
-                } catch (final Exception e) {
-                    throw new IllegalArgumentException(e);
-                }
-            }
-
-            for (final Type itf : comparator.getClass().getGenericInterfaces()) {
-                if (!ParameterizedType.class.isInstance(itf)) {
-                    continue;
-                }
-
-                final ParameterizedType pt = ParameterizedType.class.cast(itf);
-                if (Comparator.class == pt.getRawType() && pt.getActualTypeArguments().length > 0) {
-                    final Type t = pt.getActualTypeArguments()[0];
-                    if (Class.class.isInstance(t) && ProviderInfo.class == t) {
-                        return comparator;
-                    }
-                    if (ParameterizedType.class.isInstance(t) && ProviderInfo.class == ParameterizedType.class.cast(t).getRawType()) {
-                        return comparator;
-                    }
-                }
-            }
-
-            return new ProviderComparatorWrapper(comparator);
-        }
-    }
-
-    // public to ensure it can be configured since not setup by default anymore
-    public static final class DefaultProviderComparator extends ProviderFactory implements Comparator<ProviderInfo<?>> {
-        private static final ClassLoader SYSTEM_LOADER = ClassLoader.getSystemClassLoader();
-
-        public DefaultProviderComparator() {
-            super(CxfUtil.getBus());
-        }
-
-        @Override
-        public int compare(final ProviderInfo<?> o1, final ProviderInfo<?> o2) {
-            if (o1 == o2 || (o1 != null && o1.equals(o2))) {
-                return 0;
-            }
-            if (o1 == null) {
-                return -1;
-            }
-            if (o2 == null) {
-                return 1;
-            }
-
-            final Class<?> c1 = o1.getProvider().getClass();
-            final Class<?> c2 = o2.getProvider().getClass();
-            if (c1.getName().startsWith("org.apache.cxf.")) {
-                if (!c2.getName().startsWith("org.apache.cxf.")) {
-                    return 1;
-                }
-                return -1;
-            }
-            if (c2.getName().startsWith("org.apache.cxf.")) {
-                return -1;
-            }
-
-            final ClassLoader classLoader1 = c1.getClassLoader();
-            final ClassLoader classLoader2 = c2.getClassLoader();
-
-            final boolean loadersNotNull = classLoader1 != null && classLoader2 != null;
-
-            if (classLoader1 != classLoader2
-                    && loadersNotNull
-                    && !classLoader1.equals(classLoader2) && !classLoader2.equals(classLoader1)) {
-                if (isParent(classLoader1, classLoader2)) {
-                    return 1;
-                }
-                if (isParent(classLoader2, classLoader1)) {
-                    return -1;
-                }
-            } else {
-                int result = compareClasses(o1.getProvider(), o2.getProvider());
-                if (result != 0) {
-                    return result;
-                }
-
-                if (MessageBodyWriter.class.isInstance(o1.getProvider())) {
-                    final List<MediaType> types1 =
-                            JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderProduceTypes(MessageBodyWriter.class.cast(o1.getProvider())), JAXRSUtils.MEDIA_TYPE_QS_PARAM);
-                    final List<MediaType> types2 =
-                            JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderProduceTypes(MessageBodyWriter.class.cast(o2.getProvider())), JAXRSUtils.MEDIA_TYPE_QS_PARAM);
-
-                    if (types1.contains(MediaType.WILDCARD_TYPE) && !types2.contains(MediaType.WILDCARD_TYPE)) {
-                        return 1;
-                    }
-                    if (types2.contains(MediaType.WILDCARD_TYPE) && !types1.contains(MediaType.WILDCARD_TYPE)) {
-                        return -1;
-                    }
-
-                    result = JAXRSUtils.compareSortedMediaTypes(types1, types2, JAXRSUtils.MEDIA_TYPE_QS_PARAM);
-                    if (result != 0) {
-                        return result;
-                    }
-                } else if (MessageBodyReader.class.isInstance(o1.getProvider())) { // else is not super good but using both is not sa well so let it be for now
-                    final List<MediaType> types1 =
-                            JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderConsumeTypes(MessageBodyReader.class.cast(o1.getProvider())), null);
-                    final List<MediaType> types2 =
-                            JAXRSUtils.sortMediaTypes(JAXRSUtils.getProviderConsumeTypes(MessageBodyReader.class.cast(o2.getProvider())), null);
-
-                    if (types1.contains(MediaType.WILDCARD_TYPE) && !types2.contains(MediaType.WILDCARD_TYPE)) {
-                        return 1;
-                    }
-                    if (types2.contains(MediaType.WILDCARD_TYPE) && !types1.contains(MediaType.WILDCARD_TYPE)) {
-                        return -1;
-                    }
-
-                    result = JAXRSUtils.compareSortedMediaTypes(types1, types2, JAXRSUtils.MEDIA_TYPE_QS_PARAM);
-                    if (result != 0) {
-                        return result;
-                    }
-                }
-
-                final Boolean custom1 = o1.isCustom();
-                final Boolean custom2 = o2.isCustom();
-                final int customComp = custom1.compareTo(custom2) * -1;
-                if (customComp != 0) {
-                    return customComp;
-                }
-
-                try { // WEB-INF/classes will be before WEB-INF/lib
-                    final File file1 = jarLocation(c1);
-                    final File file2 = jarLocation(c2);
-                    if ("classes".equals(file1.getName())) {
-                        if ("classes".equals(file2.getName())) {
-                            return c1.getName().compareTo(c2.getName());
-                        }
-                        return -1;
-                    }
-                    if ("classes".equals(file2.getName())) {
-                        return 1;
-                    }
-                } catch (final Exception e) {
-                    // no-op: sort by class name
-                }
-            }
-            return c1.getName().compareTo(c2.getName());
-        }
-
-        private static boolean isParent(final ClassLoader l1, ClassLoader l2) {
-            ClassLoader current = l2;
-            while (current != null && current != SYSTEM_LOADER) {
-                if (current.equals(l1) || l1.equals(current)) {
-                    return true;
-                }
-                current = current.getParent();
-            }
-            return false;
-        }
-
-        @Override
-        public Configuration getConfiguration(final Message message) {
-            throw new UnsupportedOperationException("not a real inheritance");
-        }
-
-        @Override
-        protected void setProviders(final boolean b, final boolean b1, final Object... objects) {
-            throw new UnsupportedOperationException("not a real inheritance");
-        }
-    }
-
-    // we use Object cause an app with a custom comparator can desire to compare instances
-    private static final class ProviderComparatorWrapper implements Comparator<ProviderInfo<?>> {
-        private final Comparator<Object> delegate;
-
-        private ProviderComparatorWrapper(final Comparator<Object> delegate) {
-            this.delegate = delegate;
-        }
-
-        @Override
-        public int compare(final ProviderInfo<?> o1, final ProviderInfo<?> o2) {
-            return delegate.compare(o1.getProvider(), o2.getProvider());
-        }
-    }
-
     private static class OpenEJBProviderFactory implements ServiceInfos.Factory {
         private static final ServiceInfos.Factory INSTANCE = new OpenEJBProviderFactory();
 
