diff --git a/core-common/src/main/java/org/glassfish/jersey/JerseyPriorities.java b/core-common/src/main/java/org/glassfish/jersey/JerseyPriorities.java
index 6bcde01..941b383 100644
--- a/core-common/src/main/java/org/glassfish/jersey/JerseyPriorities.java
+++ b/core-common/src/main/java/org/glassfish/jersey/JerseyPriorities.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,6 +16,7 @@
 
 package org.glassfish.jersey;
 
+import jakarta.annotation.Priority;
 import jakarta.ws.rs.Priorities;
 
 /**
@@ -36,4 +37,15 @@
      * processing after the components with {@code Priorities.ENTITY_CODER} are processed.
      */
     public static final int POST_ENTITY_CODER = Priorities.ENTITY_CODER + 100;
+
+    /**
+     * Return the value of priority annotation on a given class, if exists. Return the default value if not present.
+     * @param prioritized the provider class that potentially has a priority.
+     * @param defaultValue the default priority value if not {@link @Priority) present
+     * @return the value of Priority annotation if present or the default otherwise.
+     */
+    public static int getPriorityValue(Class<?> prioritized, int defaultValue) {
+        final Priority priority = prioritized.getAnnotation(Priority.class);
+        return priority != null ? priority.value() : defaultValue;
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
index 7c51af4..55e5a68 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/ExceptionMapperFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -28,9 +28,11 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import jakarta.ws.rs.Priorities;
 import jakarta.ws.rs.ProcessingException;
 import jakarta.ws.rs.ext.ExceptionMapper;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.inject.Bindings;
 import org.glassfish.jersey.internal.inject.InjectionManager;
 import org.glassfish.jersey.internal.inject.InstanceBinding;
@@ -111,19 +113,18 @@
     private <T extends Throwable> ExceptionMapper<T> find(final Class<T> type, final T exceptionInstance) {
         ExceptionMapper<T> mapper = null;
         int minDistance = Integer.MAX_VALUE;
+        int priority = Priorities.USER;
 
         for (final ExceptionMapperType mapperType : exceptionMapperTypes.get()) {
             final int d = distance(type, mapperType.exceptionType);
             if (d >= 0 && d <= minDistance) {
                 final ExceptionMapper<T> candidate = mapperType.mapper.getInstance();
+                final int p = mapperType.mapper.getRank() > 0 ? mapperType.mapper.getRank() : Priorities.USER;
 
-                if (isPreferredCandidate(exceptionInstance, candidate, d == minDistance)) {
+                if (isPreferredCandidate(exceptionInstance, candidate, d == minDistance && p >= priority)) {
                     mapper = candidate;
                     minDistance = d;
-                    if (d == 0) {
-                        // slight optimization: if the distance is 0, it is already the best case, so we can exit
-                        return mapper;
-                    }
+                    priority = p;
                 }
             }
         }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java b/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
index 89e7089..db16be8 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/RuntimeDelegateImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -87,6 +87,7 @@
         for (RuntimeDelegate delegate : ServiceFinder.find(RuntimeDelegate.class)) {
             // try to find runtime delegate from core-server
             if (delegate.getClass() != RuntimeDelegateImpl.class) {
+                RuntimeDelegate.setInstance(delegate);
                 return delegate;
             }
         }
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/config/ExternalPropertiesConfigurationFactory.java b/core-common/src/main/java/org/glassfish/jersey/internal/config/ExternalPropertiesConfigurationFactory.java
index f5c2bd7..1a83e23 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/config/ExternalPropertiesConfigurationFactory.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/config/ExternalPropertiesConfigurationFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -16,11 +16,11 @@
 
 package org.glassfish.jersey.internal.config;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.ServiceFinder;
 import org.glassfish.jersey.spi.ExternalConfigurationModel;
 import org.glassfish.jersey.spi.ExternalConfigurationProvider;
 
-import jakarta.annotation.Priority;
 import jakarta.ws.rs.Priorities;
 import jakarta.ws.rs.core.Configurable;
 import java.util.ArrayList;
@@ -152,19 +152,8 @@
 
         @Override
         public int compare(ExternalConfigurationProvider config1, ExternalConfigurationProvider config2) {
-
-            boolean config1PriorityPresent = config1.getClass().isAnnotationPresent(Priority.class);
-            boolean config2PriorityPresent = config2.getClass().isAnnotationPresent(Priority.class);
-
-            int priority1 = Priorities.USER;
-            int priority2 = Priorities.USER;
-
-            if (config1PriorityPresent) {
-                priority1 = config1.getClass().getAnnotation(Priority.class).value();
-            }
-            if (config2PriorityPresent) {
-                priority2 = config2.getClass().getAnnotation(Priority.class).value();
-            }
+            int priority1 = JerseyPriorities.getPriorityValue(config1.getClass(), Priorities.USER);
+            int priority2 = JerseyPriorities.getPriorityValue(config2.getClass(), Priorities.USER);
 
             if (priority1 == priority2) {
                 return config1.getClass().getName().compareTo(config2.getClass().getName());
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Providers.java b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Providers.java
index e157d12..4bbab3e 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/inject/Providers.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/inject/Providers.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -42,6 +42,7 @@
 
 import jakarta.annotation.Priority;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.model.ContractProvider;
 import org.glassfish.jersey.model.internal.RankedComparator;
@@ -357,13 +358,7 @@
     }
 
     private static int getPriority(Class<?> serviceClass) {
-        Priority annotation = serviceClass.getAnnotation(Priority.class);
-        if (annotation != null) {
-            return annotation.value();
-        }
-
-        // default priority
-        return Priorities.USER;
+        return JerseyPriorities.getPriorityValue(serviceClass, /* default priority */ Priorities.USER);
     }
 
     private static <T> Class<T> getImplementationClass(Class<T> contract, ServiceHolder<T> serviceHolder) {
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/TracingLogger.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/TracingLogger.java
index 1249432..b1ed54f 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/TracingLogger.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/TracingLogger.java
@@ -23,8 +23,7 @@
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
 
-import jakarta.annotation.Priority;
-
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.PropertiesDelegate;
 
 /**
@@ -315,8 +314,9 @@
             } else {
                 textSB.append('[');
                 formatInstance(instance, textSB);
-                if (instance.getClass().isAnnotationPresent(Priority.class)) {
-                    textSB.append(" #").append(instance.getClass().getAnnotation(Priority.class).value());
+                final int priority = JerseyPriorities.getPriorityValue(instance.getClass(), -1);
+                if (priority != -1) {
+                    textSB.append(" #").append(priority);
                 }
                 if (instance instanceof WebApplicationException) {
                     formatResponse(((WebApplicationException) instance).getResponse(), textSB);
diff --git a/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java b/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
index 328b899..1afa8c1 100644
--- a/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
+++ b/core-common/src/main/java/org/glassfish/jersey/model/internal/CommonConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -45,6 +45,7 @@
 import jakarta.annotation.Priority;
 
 import org.glassfish.jersey.ExtendedConfig;
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.LocalizationMessages;
 import org.glassfish.jersey.internal.ServiceFinder;
 import org.glassfish.jersey.internal.inject.Binder;
@@ -131,12 +132,7 @@
             if (priority != ContractProvider.NO_PRIORITY) {
                 return priority;
             }
-            final Priority priorityAnnotation = featureClass.getAnnotation(Priority.class);
-            if (priorityAnnotation != null) {
-                return priorityAnnotation.value();
-            } else {
-                return Priorities.USER;
-            }
+            return JerseyPriorities.getPriorityValue(featureClass, Priorities.USER);
         }
 
         /**
@@ -592,10 +588,8 @@
         // Check whether meta providers have been initialized for a config this config has been loaded from.
         if (!disableMetaProviderConfiguration) {
             final Set<AutoDiscoverable> providers = new TreeSet<>((o1, o2) -> {
-                final int p1 = o1.getClass().isAnnotationPresent(Priority.class)
-                        ? o1.getClass().getAnnotation(Priority.class).value() : Priorities.USER;
-                final int p2 = o2.getClass().isAnnotationPresent(Priority.class)
-                        ? o2.getClass().getAnnotation(Priority.class).value() : Priorities.USER;
+                final int p1 = JerseyPriorities.getPriorityValue(o1.getClass(), Priorities.USER);
+                final int p2 = JerseyPriorities.getPriorityValue(o2.getClass(), Priorities.USER);
 
                 return (p1 < p2 || p1 == p2) ? -1 : 1;
             });
diff --git a/core-common/src/main/java/org/glassfish/jersey/model/internal/RankedProvider.java b/core-common/src/main/java/org/glassfish/jersey/model/internal/RankedProvider.java
index 56b3470..cc255f2 100644
--- a/core-common/src/main/java/org/glassfish/jersey/model/internal/RankedProvider.java
+++ b/core-common/src/main/java/org/glassfish/jersey/model/internal/RankedProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,6 +23,7 @@
 
 import jakarta.annotation.Priority;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.model.ContractProvider;
 
 /**
@@ -84,11 +85,7 @@
                 clazz = clazz.getSuperclass();
             }
 
-            if (clazz.isAnnotationPresent(Priority.class)) {
-                return clazz.getAnnotation(Priority.class).value();
-            } else {
-                return Priorities.USER;
-            }
+            return JerseyPriorities.getPriorityValue(clazz, Priorities.USER);
         }
     }
 
diff --git a/core-common/src/main/java/org/glassfish/jersey/uri/internal/UriTemplateParser.java b/core-common/src/main/java/org/glassfish/jersey/uri/internal/UriTemplateParser.java
index b438023..0f5f759 100644
--- a/core-common/src/main/java/org/glassfish/jersey/uri/internal/UriTemplateParser.java
+++ b/core-common/src/main/java/org/glassfish/jersey/uri/internal/UriTemplateParser.java
@@ -395,9 +395,14 @@
                     //               groupCounts.add(1 + skipGroup);
 
                     if (variables.hasLength(0)) {
-                        int len = TEMPLATE_VALUE_PATTERN.pattern().length() - 1;
-                        String pattern = TEMPLATE_VALUE_PATTERN.pattern().substring(0, len) + '{' + variables.getLength(0) + '}';
-                        namePattern = Pattern.compile(pattern);
+                        if (variables.getLength(0) != 0) {
+                            int len = TEMPLATE_VALUE_PATTERN.pattern().length() - 1;
+                            String pattern = TEMPLATE_VALUE_PATTERN.pattern().substring(0, len)
+                                    + '{' + variables.getLength(0) + '}';
+                            namePattern = Pattern.compile(pattern);
+                        } else {
+                            namePattern = TEMPLATE_VALUE_PATTERN;
+                        }
                         templateVariable.setLength(variables.getLength(0));
                     } else {
                         namePattern = (!variables.hasRegexp(0))
@@ -462,7 +467,10 @@
                         if (argIndex != 0) {
                             regexBuilder.append(")");
                         }
-                        regexBuilder.append("{0,1}");
+
+                        if (!variables.hasRegexp(argIndex)) {
+                            regexBuilder.append("{0,1}");
+                        }
 
                         argIndex++;
                         groupCounts.add(2);
@@ -571,6 +579,7 @@
 
             StringBuilder regexBuilder = new StringBuilder();
             State state = State.TEMPLATE;
+            State previousState;
             boolean star = false;
             boolean whiteSpace = false;
             boolean ignoredLastComma = false;
@@ -579,6 +588,7 @@
             int regExpRound = 0;   // (
             boolean reqExpSlash = false; // \
             while ((state.value & (State.ERROR.value | State.EXIT.value)) == 0) {
+                previousState = state;
                 c = ci.next();
                 // "\\{(\\w[-\\w\\.]*)
                 if (Character.isLetterOrDigit(c)) {
@@ -702,8 +712,8 @@
                                 regexps.add(regex);
                             }
                         } else {
-                            regexps.add(null);
-                            lengths.add(null);
+                            regexps.add(previousState == State.REGEXP ? "" : null);
+                            lengths.add(previousState == State.REGEXP ? 0 : null);
                         }
 
                         names.add(nameBuilder.toString());
diff --git a/core-common/src/test/java/org/glassfish/jersey/uri/UriTemplateTest.java b/core-common/src/test/java/org/glassfish/jersey/uri/UriTemplateTest.java
index 7846c11..cdd965b 100644
--- a/core-common/src/test/java/org/glassfish/jersey/uri/UriTemplateTest.java
+++ b/core-common/src/test/java/org/glassfish/jersey/uri/UriTemplateTest.java
@@ -31,6 +31,8 @@
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.opentest4j.AssertionFailedError;
+
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -257,7 +259,7 @@
         final Map<String, String> m = new HashMap<String, String>();
 
         boolean isMatch = t.match(uri, m);
-        assertTrue(isMatch);
+        assertTrue(isMatch, "No match for '" + uri + "' & params '" + Arrays.toString(values) + "`");
         assertEquals(values.length, t.getTemplateVariables().size());
 
         final Iterator<String> names = t.getTemplateVariables().iterator();
@@ -982,6 +984,7 @@
         _testTemplateNames("/{a,b,c}", "a", "b", "c");
         _testMatching("/uri/{a}", "/uri/hello", "hello");
         _testMatching("/uri/{a,b}", "/uri/hello,world", "hello", "world");
+        _testMatching("/uri/{a,b}", "/uri/x", "x", null);
         _testMatching("/uri{?a,b}", "/uri?a=hello&b=world", "hello", "world");
         _testMatching("/uri/{a,b,c}", "/uri/hello,world,!", "hello", "world", "!");
         _testMatching("/uri/{a,b,c}", "/uri/hello,world", "hello", "world", null);
@@ -990,6 +993,12 @@
     }
 
     @Test
+    public void testRegularExpressionIsNotOptional() {
+        Assertions.assertThrows(AssertionFailedError.class,
+                () -> _testMatching("/{name: [a-z0-9]{3,128}}", "/", new String[]{null}));
+    }
+
+    @Test
     void testRfc6570PathLength() {
         _testMatching("/uri/{a:5}", "/uri/hello", "hello");
         _testMatching("/uri/{a:5,b:6}", "/uri/hello,world!", "hello", "world!");
diff --git a/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java b/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java
new file mode 100644
index 0000000..8bed349
--- /dev/null
+++ b/core-server/src/test/java/org/glassfish/jersey/server/model/ExceptionMapperPriorityTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.server.model;
+
+import org.glassfish.jersey.internal.ExceptionMapperFactory;
+import org.glassfish.jersey.internal.inject.AbstractBinder;
+import org.glassfish.jersey.internal.inject.CustomAnnotationLiteral;
+import org.glassfish.jersey.internal.inject.InjectionManager;
+import org.glassfish.jersey.internal.inject.Injections;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.server.TestInjectionManagerFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.annotation.Priority;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
+
+public class ExceptionMapperPriorityTest {
+    @Test
+    void testExceptionMapperOverridePriority() {
+        for (int order = 0; order != 2; order++) {
+            final ResourceConfig rc = new ResourceConfig();
+            if (order == 0) {
+                rc.register(HigherPriorityExceptionMapper.class, 200);
+                rc.register(LowerPriorityExceptionMapper.class, 100);
+            } else {
+                rc.register(LowerPriorityExceptionMapper.class, 100);
+                rc.register(HigherPriorityExceptionMapper.class, 200);
+            }
+
+            final TestInjectionManagerFactory.BootstrapResult bootstrap = TestInjectionManagerFactory.createInjectionManager(rc);
+            final ExceptionMapperFactory mapperFactory = new ExceptionMapperFactory(bootstrap.injectionManager);
+
+            final ExceptionMapper mapper = mapperFactory.findMapping(new NullPointerException());
+            Assertions.assertTrue(mapper instanceof LowerPriorityExceptionMapper,
+                    "LowerPriorityExceptionMapper should be returned, got " + mapper.getClass().getSimpleName());
+        }
+    }
+
+    @Test
+    void testExceptionMapperPriority() {
+        for (int order = 0; order != 2; order++) {
+            final ResourceConfig rc = new ResourceConfig();
+
+            if (order == 0) {
+                rc.register(HigherPriorityExceptionMapper.class);
+                rc.register(LowerPriorityExceptionMapper.class);
+            } else {
+                rc.register(LowerPriorityExceptionMapper.class);
+                rc.register(HigherPriorityExceptionMapper.class);
+            }
+
+            final TestInjectionManagerFactory.BootstrapResult bootstrap = TestInjectionManagerFactory.createInjectionManager(rc);
+            final ExceptionMapperFactory mapperFactory = new ExceptionMapperFactory(bootstrap.injectionManager);
+
+            final ExceptionMapper mapper = mapperFactory.findMapping(new NullPointerException());
+            Assertions.assertTrue(mapper instanceof HigherPriorityExceptionMapper,
+                    "HigherPriorityExceptionMapper should be returned, got " + mapper.getClass().getSimpleName());
+        }
+    }
+
+    @Test
+    public void testFindPriorityExceptionMapper() {
+        for (int order = 0; order != 2; order++) {
+            int finalOrder = order;
+            final InjectionManager injectionManager = Injections.createInjectionManager(new AbstractBinder() {
+                @Override
+                protected void configure() {
+                    if (finalOrder == 0) {
+                        bind(LowerPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(HigherPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(HighDistanceExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                    } else if (finalOrder == 1) {
+                        bind(HighDistanceExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(HigherPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(LowerPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                    }
+                }
+            });
+            injectionManager.completeRegistration();
+            final ExceptionMapperFactory mapperFactory = new ExceptionMapperFactory(injectionManager);
+
+            final ExceptionMapper mapper = mapperFactory.findMapping(new NullPointerException());
+            Assertions.assertTrue(mapper instanceof HigherPriorityExceptionMapper,
+                    "HigherPriorityExceptionMapper should be returned, got " + mapper.getClass().getSimpleName());
+        }
+    }
+
+    @Test
+    public void testFindPriorityExceptionMapperPrioritiesOverUSER() {
+        for (int order = 0; order != 2; order++) {
+            int finalOrder = order;
+            final InjectionManager injectionManager = Injections.createInjectionManager(new AbstractBinder() {
+                @Override
+                protected void configure() {
+                    if (finalOrder == 0) {
+                        bind(LowerOverUSERPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(HigherOverUSERPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                    } else {
+                        bind(HigherOverUSERPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                        bind(LowerOverUSERPriorityExceptionMapper.class).to(ExceptionMapper.class).in(Singleton.class)
+                                .qualifiedBy(CustomAnnotationLiteral.INSTANCE);
+                    }
+                }
+            });
+            injectionManager.completeRegistration();
+            final ExceptionMapperFactory mapperFactory = new ExceptionMapperFactory(injectionManager);
+
+            final ExceptionMapper mapper = mapperFactory.findMapping(new NullPointerException());
+            Assertions.assertTrue(mapper instanceof HigherOverUSERPriorityExceptionMapper,
+                    "HigherPriorityExceptionMapper should be returned, got " + mapper.getClass().getSimpleName());
+        }
+    }
+
+    abstract static class NPEExceptionMapper implements ExceptionMapper<NullPointerException> {
+        @Override
+        public Response toResponse(NullPointerException exception) {
+            return null;
+        }
+    }
+
+    @Priority(100)
+    static class HigherPriorityExceptionMapper extends NPEExceptionMapper {
+    }
+
+    @Priority(200)
+    static class LowerPriorityExceptionMapper extends NPEExceptionMapper {
+    }
+
+    @Priority(5500)
+    static class HigherOverUSERPriorityExceptionMapper extends NPEExceptionMapper {
+    }
+
+    @Priority(6000)
+    static class LowerOverUSERPriorityExceptionMapper extends NPEExceptionMapper {
+    }
+
+    @Priority(50)
+    static class HighDistanceExceptionMapper implements ExceptionMapper<RuntimeException> {
+        @Override
+        public Response toResponse(RuntimeException exception) {
+            return null;
+        }
+    }
+}
diff --git a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java
index 1a3504e..1e81f52 100644
--- a/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java
+++ b/ext/microprofile/mp-rest-client/src/main/java/org/glassfish/jersey/microprofile/restclient/RestClientBuilderImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2019, 2021 Payara Foundation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -39,7 +39,6 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import jakarta.annotation.Priority;
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.SSLContext;
 import jakarta.ws.rs.Priorities;
@@ -61,6 +60,7 @@
 import org.eclipse.microprofile.rest.client.ext.QueryParamStyle;
 import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
 import org.eclipse.microprofile.rest.client.spi.RestClientListener;
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
 import org.glassfish.jersey.client.Initializable;
@@ -299,8 +299,7 @@
         } else if (providerPriorityJersey instanceof Integer) {
             return (int) providerPriorityJersey;
         }
-        Priority priority = providerClass.getAnnotation(Priority.class);
-        return priority == null ? -1 : priority.value();
+        return JerseyPriorities.getPriorityValue(providerClass, -1);
     }
 
     @Override
@@ -524,9 +523,7 @@
 
         Integer getPriority() {
             if (priority == null) {
-                priority = Optional.ofNullable(factory.getClass().getAnnotation(Priority.class))
-                        .map(Priority::value)
-                        .orElse(Priorities.USER);
+                priority = JerseyPriorities.getPriorityValue(factory.getClass(), Priorities.USER);
             }
             return priority;
         }
diff --git a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
index a56f23b..66594f9 100644
--- a/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
+++ b/incubator/cdi-inject-weld/src/main/java/org/glassfish/jersey/inject/weld/internal/bean/JerseyBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import jakarta.annotation.Priority;
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.RequestScoped;
 import jakarta.enterprise.context.spi.CreationalContext;
@@ -36,6 +35,7 @@
 import jakarta.inject.Singleton;
 import jakarta.ws.rs.RuntimeType;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.internal.inject.PerThread;
@@ -161,15 +161,13 @@
             return binding.getRank();
         }
 
+        int defaultValue = 1;
         Class<T> type = binding.getImplementationType();
         if (type != null) {
-            Priority priority = type.getAnnotation(Priority.class);
-            if (priority != null) {
-                return priority.value();
-            }
+            return JerseyPriorities.getPriorityValue(type, defaultValue);
         }
 
-        return 1;
+        return defaultValue;
     }
 
     @Override
diff --git a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
index c6bd602..8f3fc55 100644
--- a/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
+++ b/inject/cdi2-se/src/main/java/org/glassfish/jersey/inject/cdi/se/bean/JerseyBean.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2022 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -22,7 +22,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import jakarta.annotation.Priority;
 import jakarta.enterprise.context.Dependent;
 import jakarta.enterprise.context.RequestScoped;
 import jakarta.enterprise.context.spi.CreationalContext;
@@ -34,6 +33,7 @@
 import jakarta.enterprise.util.AnnotationLiteral;
 import jakarta.inject.Singleton;
 
+import org.glassfish.jersey.JerseyPriorities;
 import org.glassfish.jersey.internal.inject.Binding;
 import org.glassfish.jersey.internal.inject.PerLookup;
 import org.glassfish.jersey.internal.inject.PerThread;
@@ -151,16 +151,14 @@
         if (binding.getRank() != null) {
             return binding.getRank();
         }
+        int defaultValue = 1;
 
         Class<T> type = binding.getImplementationType();
         if (type != null) {
-            Priority priority = type.getAnnotation(Priority.class);
-            if (priority != null) {
-                return priority.value();
-            }
+            return JerseyPriorities.getPriorityValue(type, defaultValue);
         }
 
-        return 1;
+        return defaultValue;
     }
 
     @Override
