[java-idp-plugin-duo] 01/01: JDUO-71 - Upgrade for IdP V5 compatibility

Phil Smart philip.smart at jisc.ac.uk
Tue Jul 4 14:47:48 UTC 2023


This is an automated email from the git hooks/post-receive script.

philsmart pushed a commit to branch dev/JDUO-71
in repository java-idp-plugin-duo.

View the commit online:
http://git.shibboleth.net/view/?p=java-idp-plugin-duo.git;a=commit;h=e05e0834b147c899263ff377babddd88cde749e5

commit e05e0834b147c899263ff377babddd88cde749e5
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Thu Jun 29 17:19:43 2023 +0100

    JDUO-71 - Upgrade for IdP V5 compatibility
    
     - Update HttpClient to V5
     - net.shibboleth.utilities.java.support -> net.shibboleth.shared
     - net.shibboleth.ext.spring -> net.shibboleth.shared.spring
     - Update internal dependencies
     - Remove repositories from POM
    
    https://shibboleth.atlassian.net/browse/JDUO-71
---
 idp-duo-api/pom.xml                                | 11 +++-
 .../authn/duo/AbstractDuoAuthenticationAction.java |  9 ++-
 .../plugin/authn/duo/AbstractDuoOIDCClient.java    |  3 +-
 .../authn/duo/DefaultDuoOIDCIntegration.java       | 48 ++++++++------
 .../idp/plugin/authn/duo/DuoOIDCAuthAPI.java       |  3 +-
 .../idp/plugin/authn/duo/DuoOIDCClient.java        |  3 +-
 .../idp/plugin/authn/duo/DuoOIDCIntegration.java   |  3 +-
 .../authn/duo/DynamicDuoOIDCIntegration.java       |  7 +-
 .../plugin/authn/duo/SimpleDuoOIDCIntegration.java | 42 +++++++-----
 .../idp/plugin/authn/duo/URISupport.java           | 13 ++--
 .../idp/plugin/authn/duo/audit/AuditFields.java    |  5 +-
 .../duo/context/DuoOIDCAuthenticationContext.java  |  1 +
 .../idp/plugin/authn/duo/model/DuoHealthCheck.java |  3 +-
 .../authn/duo/DefaultDuoOIDCIntegrationTest.java   |  6 +-
 idp-duo-impl/pom.xml                               | 39 +++++-------
 .../duo/audit/impl/FixedStringAuditExtractor.java  |  6 +-
 .../duo/impl/DefaultDuoOIDCClientRegistry.java     | 17 +++--
 .../impl/DefaultRedirectURICreationStrategy.java   |  8 +--
 .../duo/impl/DuoIssuerClaimLookupStrategy.java     |  6 +-
 .../authn/duo/impl/DuoOIDCAuthnController.java     | 15 ++---
 .../idp/plugin/authn/duo/impl/DuoSupport.java      |  2 +-
 .../authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java  |  2 +-
 .../duo/impl/PopulateDuoAuthenticationContext.java | 32 +++++-----
 .../authn/duo/impl/ValidateDuoResponseState.java   |  2 +-
 .../impl/ValidateDuoTokenAuthenticationResult.java |  9 ++-
 .../plugin/authn/duo/impl/ValidateTokenClaims.java | 15 ++---
 .../authn/duo/impl/ValidateTokenSignature.java     | 11 ++--
 .../META-INF/net.shibboleth.idp/postconfig.xml     |  8 ---
 .../flows/authn/DuoOIDC/duo-oidc-authn-beans.xml   |  6 +-
 .../impl/AbstractAuthnXmlFlowExecutionTests.java   | 35 +++++-----
 .../authn/duo/impl/AbstractDuoActionTest.java      |  9 ++-
 .../duo/impl/DefaultDuoOIDCClientRegistryTest.java |  3 +-
 .../DefaultRedirectURICreationStrategyTest.java    | 17 +++++
 .../authn/duo/impl/DualDuoIntegrationStrategy.java |  4 +-
 .../impl/DuoAudienceClaimLookupStrategyTest.java   | 11 ++--
 .../plugin/authn/duo/impl/DuoAuthnFlowTest.java    | 12 ++--
 .../duo/impl/DuoIssuerClaimLookupStrategyTest.java | 11 ++--
 .../duo/impl/DuoNonceClaimLookupStrategyTest.java  | 11 ++--
 .../authn/duo/impl/DuoOIDCAuthnControllerTest.java | 14 ++--
 .../impl/DuoUsernameClaimLookupStrategyTest.java   | 11 ++--
 .../duo/impl/ExchangeCodeForDuoTokenTest.java      |  9 ++-
 .../duo/impl/HealthCheckDuoOIDCAuthAPITest.java    |  2 +-
 .../duo/impl/InMemoryCredentialValidator.java      |  6 +-
 .../impl/PopulateDuoAuthenticationContextTest.java | 21 +++---
 .../duo/impl/ValidateDuoResponseStateTest.java     |  2 +-
 .../ValidateDuoTokenAuthenticationResultTest.java  |  4 +-
 .../authn/duo/impl/ValidateTokenClaimsTest.java    |  2 +-
 .../authn/duo/impl/ValidateTokenSignatureTest.java |  6 +-
 .../plugin/authn/mock/MockDuoOIDCClient_FAIL.java  |  4 +-
 .../plugin/authn/mock/MockDuoOIDCClient_OK.java    |  4 +-
 .../mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java   |  4 +-
 .../authn/mock/MockDuoOIDCClient_UNKNOWN.java      |  4 +-
 .../idp/plugin/authn/mock/MockFlowBuilder.java     |  2 +-
 .../authn/spring/CustomFlowModelFlowBuilder.java   |  4 +-
 .../duo-oidc-authn-config-principal-mapping.xml    |  2 +-
 idp-duo-nimbus-client-impl/pom.xml                 | 24 +++----
 .../authn/duo/nimbus/DuoOIDCNimbusModule.java      |  2 +-
 .../authn/duo/nimbus/DuoOIDCNimbusPlugin.java      |  4 +-
 .../duo/nimbus/impl/DuoHttpClientFactoryBean.java  |  2 +-
 .../plugin/authn/duo/nimbus/impl/NimbusClient.java | 38 +++++------
 .../authn/duo/nimbus/impl/NimbusClientFactory.java | 23 ++++---
 .../authn/duo/nimbus/impl/NimbusClientSupport.java |  6 +-
 .../duo/nimbus/impl/NimbusClientFactoryTest.java   |  4 +-
 .../duo/nimbus/impl/NimbusClientSupportTest.java   |  4 +-
 .../authn/duo/nimbus/impl/NimbusClientTest.java    | 74 +++++++++-------------
 idp-duo-nimbus-distribution/pom.xml                |  2 +-
 idp-duo-sdk-client-impl/pom.xml                    | 14 ++--
 .../plugin/authn/duo/sdk/DuoOIDCWebSDKModule.java  |  3 +-
 .../plugin/authn/duo/sdk/DuoOIDCWebSDKPlugin.java  |  4 +-
 .../authn/duo/sdk/impl/DuoSDKClientAdaptor.java    |  7 +-
 .../authn/duo/sdk/impl/DuoSDKClientFactory.java    | 14 ++--
 idp-duo-sdk-distribution/pom.xml                   |  2 +-
 pom.xml                                            | 40 ++----------
 73 files changed, 392 insertions(+), 424 deletions(-)

diff --git a/idp-duo-api/pom.xml b/idp-duo-api/pom.xml
index 839a59b..61d3ed5 100644
--- a/idp-duo-api/pom.xml
+++ b/idp-duo-api/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>1.4.1-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-api</artifactId>
@@ -46,8 +46,13 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>${shib-shared.groupId}</groupId>
+            <artifactId>shib-attribute-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <!-- Test dependencies -->
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoAuthenticationAction.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoAuthenticationAction.java
index d239983..9709e3f 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoAuthenticationAction.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoAuthenticationAction.java
@@ -32,9 +32,8 @@ import net.shibboleth.idp.authn.AbstractAuthenticationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * <p>A base class for Duo 2FA authentication related actions.</p>
@@ -77,8 +76,8 @@ public abstract class AbstractDuoAuthenticationAction extends AbstractAuthentica
      */
     public void setDuoContextLookupStrategy(
             @Nonnull final Function<ProfileRequestContext,DuoOIDCAuthenticationContext> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         duoContextLookupStrategy = Constraint.isNotNull(strategy, "DuoContextLookuplookup strategy cannot be null");
     }
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoOIDCClient.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoOIDCClient.java
index fed6324..8d540af 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoOIDCClient.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/AbstractDuoOIDCClient.java
@@ -21,7 +21,8 @@ import java.util.UUID;
 
 import javax.annotation.Nonnull;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * Abstract base class for {@link DuoOIDCClient} implementations. Handles the clientId and
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
index 8da13f7..0e6ced1 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegration.java
@@ -32,16 +32,17 @@ import javax.security.auth.Subject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.component.AbstractInitializableComponent;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.StringSupport;
+
+
 
 /**
  * Data wrapper for use with Duo OIDC integrations. Holds shared-state. 
@@ -99,7 +100,8 @@ public final class DefaultDuoOIDCIntegration
      * @param hosts the hostnames to allow.
      */
     public synchronized void setAllowedOrigins(@Nullable @NonnullElements final Collection<String> hosts) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         allowedOrigins = Set.copyOf(StringSupport.normalizeStringCollection(
                 Constraint.isNotNull(hosts, "Types cannot be null")));
@@ -122,7 +124,8 @@ public final class DefaultDuoOIDCIntegration
      * @param host API host
      */
     public synchronized void setAPIHost(@Nonnull @NotEmpty final String host) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         apiHost = Constraint.isNotNull(StringSupport.trimOrNull(host), "API host cannot be null or empty");
     }
@@ -138,7 +141,8 @@ public final class DefaultDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setHealthCheckEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         healthEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Health check endpoint cannot be null or empty");
@@ -155,7 +159,8 @@ public final class DefaultDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setAuthorizeEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         authorizeEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Authorize endpoint cannot be null or empty");
@@ -172,7 +177,8 @@ public final class DefaultDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setTokenEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         tokenEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Token endpoint cannot be null or empty");
@@ -189,7 +195,8 @@ public final class DefaultDuoOIDCIntegration
      * @param uri the redirect_uri
      */
     public synchronized void setRegisteredRedirectURI(@Nullable final String uri) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
        
         registeredRedirectURI = StringSupport.trimOrNull(uri);
     }
@@ -224,7 +231,8 @@ public final class DefaultDuoOIDCIntegration
      * @param id the client identifier.
      */
     public synchronized void setClientId(@Nonnull @NotEmpty final String id) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         clientId = Constraint.isNotNull(StringSupport.trimOrNull(id), "ClientID cannot be null or empty");
     }
@@ -240,7 +248,8 @@ public final class DefaultDuoOIDCIntegration
      * @param key secret key
      */
     public synchronized void setSecretKey(@Nonnull @NotEmpty final String key) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         secretKey = Constraint.isNotNull(StringSupport.trimOrNull(key), "Secret key cannot be null or empty");
     }
@@ -268,7 +277,8 @@ public final class DefaultDuoOIDCIntegration
      */
     public synchronized <T extends Principal> void setSupportedPrincipals(
             @Nullable @NonnullElements final Collection<T> principals) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         supportedPrincipals.getPrincipals().clear();
         
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCAuthAPI.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCAuthAPI.java
index 7fc335e..8535354 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCAuthAPI.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCAuthAPI.java
@@ -21,7 +21,8 @@ import javax.annotation.Nonnull;
 import javax.annotation.concurrent.Immutable;
 import javax.annotation.concurrent.ThreadSafe;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * Constants defined in the Duo OIDC Auth API.
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCClient.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCClient.java
index af28ab7..0deaa17 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCClient.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCClient.java
@@ -23,7 +23,8 @@ import javax.annotation.Nullable;
 import com.nimbusds.jwt.JWT;
 
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * A client for handling Duo OIDC 2FA interactions. Clients are shared and required to be thread-safe.
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCIntegration.java
index 2339e87..5f7ea1d 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DuoOIDCIntegration.java
@@ -21,7 +21,8 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import net.shibboleth.idp.authn.principal.PrincipalSupportingComponent;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * Interface to a particular Duo OIDC integration point. In part replaces
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DynamicDuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DynamicDuoOIDCIntegration.java
index 7b0289b..0e409e9 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DynamicDuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/DynamicDuoOIDCIntegration.java
@@ -23,9 +23,10 @@ import java.util.Set;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotLive;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotLive;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+
 
 /**
  * Specialised {@link DuoOIDCIntegration} that allows redirectURIs to be pre-registered or computed dynamically
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
index 5ddc4d0..405adcd 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/SimpleDuoOIDCIntegration.java
@@ -31,15 +31,15 @@ import javax.security.auth.Subject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.component.AbstractInitializableComponent;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.StringSupport;
+
 
 /**
  * A data wrapper for use with Duo OIDC integrations which does not support redirectURI generation. 
@@ -93,7 +93,8 @@ public final class SimpleDuoOIDCIntegration
      * @param host API host
      */
     public synchronized void setAPIHost(@Nonnull @NotEmpty final String host) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         apiHost = Constraint.isNotNull(StringSupport.trimOrNull(host), "API host cannot be null or empty");
     }
@@ -109,7 +110,8 @@ public final class SimpleDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setHealthCheckEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         healthEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Health check endpoint cannot be null or empty");
@@ -126,7 +128,8 @@ public final class SimpleDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setAuthorizeEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         authorizeEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Authorize endpoint cannot be null or empty");
@@ -143,7 +146,8 @@ public final class SimpleDuoOIDCIntegration
      * @param endpoint the endpoint.
      */
     public synchronized void setTokenEndpoint(@Nonnull @NotEmpty final String endpoint) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         tokenEndpoint = Constraint.isNotNull(StringSupport.trimOrNull(endpoint), 
                 "Token endpoint cannot be null or empty");
@@ -160,7 +164,8 @@ public final class SimpleDuoOIDCIntegration
      * @param url the url.
      */
     public synchronized void setRedirectURI(@Nonnull final String url) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         redirectURI = Constraint.isNotNull(StringSupport.trimOrNull(url), "Redirect URI cannot be null or empty");;
     }
@@ -172,7 +177,8 @@ public final class SimpleDuoOIDCIntegration
      * @param id the client identifier.
      */
     public synchronized void setClientId(@Nonnull @NotEmpty final String id) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         clientId = Constraint.isNotNull(StringSupport.trimOrNull(id), "ClientID cannot be null or empty");
     }
@@ -188,7 +194,8 @@ public final class SimpleDuoOIDCIntegration
      * @param key secret key
      */
     public synchronized void setSecretKey(@Nonnull @NotEmpty final String key) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         secretKey = Constraint.isNotNull(StringSupport.trimOrNull(key), "Secret key cannot be null or empty");
     }
@@ -216,7 +223,8 @@ public final class SimpleDuoOIDCIntegration
      */
     public synchronized <T extends Principal> void setSupportedPrincipals(
             @Nullable @NonnullElements final Collection<T> principals) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         supportedPrincipals.getPrincipals().clear();
         
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/URISupport.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/URISupport.java
index a3e6e4d..c7b53cc 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/URISupport.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/URISupport.java
@@ -23,7 +23,9 @@ import java.net.URISyntaxException;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 
-import org.apache.http.client.utils.URIBuilder;
+import org.apache.hc.core5.net.URIBuilder;
+
+
 
 /** URL support class.*/
 @ThreadSafe
@@ -57,19 +59,16 @@ public final class URISupport {
             if (port == 80) {
                 usedPort = -1;
             }
-        } else if ("https".equalsIgnoreCase(scheme)) {
+        } else if ("https".equalsIgnoreCase(scheme) && port == 443) {
             // ignore port iff using the default https port
-            if (port == 443) {
-                usedPort = -1;
-            }
+            usedPort = -1;            
         }
-        final URI uri = new URIBuilder()
+        return new URIBuilder()
                 .setScheme(scheme)
                 .setHost(host)
                 .setPort(usedPort)
                 .setPath(path)
                 .build();
-        return uri;
     }
     
     /**
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AuditFields.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AuditFields.java
index e089aee..5d85d08 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AuditFields.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/AuditFields.java
@@ -19,8 +19,9 @@ package net.shibboleth.idp.plugin.authn.duo.audit;
 
 import javax.annotation.Nonnull;
 
-import net.shibboleth.idp.profile.context.AuditContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.profile.context.AuditContext;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /** Constants to use for Duo audit logging fields stored in an {@link AuditContext}. */
 public final class AuditFields {
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/context/DuoOIDCAuthenticationContext.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/context/DuoOIDCAuthenticationContext.java
index 386953a..22caf9b 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/context/DuoOIDCAuthenticationContext.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/context/DuoOIDCAuthenticationContext.java
@@ -29,6 +29,7 @@ import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 
+
 /**
  * <p>Mutable Context that carries the Duo integration, request-response state, authorization code,
  *  and Duo authentication result token.</p>
diff --git a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/model/DuoHealthCheck.java b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/model/DuoHealthCheck.java
index a8a7884..f7a3e6c 100644
--- a/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/model/DuoHealthCheck.java
+++ b/idp-duo-api/src/main/java/net/shibboleth/idp/plugin/authn/duo/model/DuoHealthCheck.java
@@ -27,7 +27,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 
 /**
  * <p>Represents a health check response from Duo's 2FA endpoint.</p>
diff --git a/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java b/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
index e4c0dfc..8f80ac2 100644
--- a/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
+++ b/idp-duo-api/src/test/java/net/shibboleth/idp/plugin/authn/duo/DefaultDuoOIDCIntegrationTest.java
@@ -17,11 +17,11 @@
 
 package net.shibboleth.idp.plugin.authn.duo;
 
-import org.testng.annotations.Test;
+import java.util.Set;
 
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import org.testng.annotations.Test;
 
-import java.util.Set;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Test for the DefaultDuoOIDCIntegration. */
 public class DefaultDuoOIDCIntegrationTest {
diff --git a/idp-duo-impl/pom.xml b/idp-duo-impl/pom.xml
index 86dbf88..8ebcefb 100644
--- a/idp-duo-impl/pom.xml
+++ b/idp-duo-impl/pom.xml
@@ -6,7 +6,7 @@
 	<parent>
 		<groupId>net.shibboleth.idp.plugin.authn</groupId>
 		<artifactId>idp-plugin-duo-parent</artifactId>
-		<version>1.4.1-SNAPSHOT</version>
+		<version>2.0.0-SNAPSHOT</version>
 	</parent>
 
 	<name>Shibboleth IdP :: Plugins :: Duo 2FA Login Flow Impl</name>
@@ -37,11 +37,6 @@
             <groupId>net.shibboleth.oidc</groupId>
             <artifactId>oidc-common-crypto-impl</artifactId>
             <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>net.shibboleth.oidc</groupId>
-            <artifactId>oidc-common-crypto-api</artifactId>
-            <scope>provided</scope>
         </dependency>
 		<dependency>
 			<groupId>${idp.groupId}</groupId>
@@ -73,21 +68,16 @@
 			<artifactId>opensaml-messaging-api</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		<dependency>
-			<groupId>net.shibboleth.utilities</groupId>
-			<artifactId>java-support</artifactId>
-			<scope>provided</scope>
-		</dependency>
 		<dependency>
 			<groupId>com.google.code.findbugs</groupId>
 			<artifactId>jsr305</artifactId>
 			<scope>provided</scope>
 		</dependency>
-		<dependency>
-			<groupId>javax.servlet</groupId>
-			<artifactId>javax.servlet-api</artifactId>
-			<scope>provided</scope>
-		</dependency>
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
 		<dependency>
 			<groupId>${spring-webflow.groupId}</groupId>
 			<artifactId>spring-webflow</artifactId>
@@ -132,18 +122,23 @@
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>net.shibboleth.idp</groupId>
-			<artifactId>idp-conf</artifactId>
-			<scope>test</scope>
-		</dependency>
+            <groupId>${idp.groupId}</groupId>
+            <artifactId>idp-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
 		<dependency>
 			<groupId>net.shibboleth.idp</groupId>
 			<artifactId>idp-conf-impl</artifactId>
 			<scope>test</scope>
 		</dependency>
+		 <dependency>
+            <groupId>${shib-shared.groupId}</groupId>
+            <artifactId>shib-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
 		<dependency>
-		   <groupId>net.shibboleth.ext</groupId>
-           <artifactId>spring-extensions</artifactId>
+		   <groupId>${shib-shared.groupId}</groupId>
+           <artifactId>shib-spring</artifactId>
            <scope>test</scope>
 		</dependency>
 		<dependency>
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/impl/FixedStringAuditExtractor.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/impl/FixedStringAuditExtractor.java
index d0488da..157b2ed 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/impl/FixedStringAuditExtractor.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/audit/impl/FixedStringAuditExtractor.java
@@ -23,9 +23,9 @@ import javax.annotation.Nonnull;
 
 import org.opensaml.profile.context.ProfileRequestContext;
 
-import net.shibboleth.utilities.java.support.annotation.ParameterName;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.ParameterName;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.logic.Constraint;
 
 /** A simple audit extractor that allows a fixed string to be logged.*/
 public class FixedStringAuditExtractor implements Function<ProfileRequestContext, String> {
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistry.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistry.java
index a5a6aaa..ff6b452 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistry.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistry.java
@@ -38,12 +38,11 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientRegistry;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoRegistryException;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.component.AbstractIdentifiableInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.component.AbstractIdentifiableInitializableComponent;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * <p>The default Duo Client registry for mapping a {@link DuoOIDCIntegration} to either a new
@@ -85,7 +84,7 @@ public class DefaultDuoOIDCClientRegistry extends AbstractIdentifiableInitializa
     /** Constructor.*/
     public DefaultDuoOIDCClientRegistry() {
         //initial capacity is 1, as that is the most likely number ever to be created
-        clientRegistry = new ConcurrentHashMap<DuoOIDCIntegration, DuoOIDCClient>(1);
+        clientRegistry = new ConcurrentHashMap<>(1);
         clientRegistryMappingFunction = new CreateNewClientMappingFunction();
     }
     
@@ -95,8 +94,8 @@ public class DefaultDuoOIDCClientRegistry extends AbstractIdentifiableInitializa
      * @param factory the factory.
      */
     public synchronized void setClientFactory(@Nonnull final DuoOIDCClientFactory factory) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         clientFactory = Constraint.isNotNull(factory, "Duo client factory can not be null");
     }
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategy.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategy.java
index 5475f7b..ed561c2 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategy.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategy.java
@@ -25,16 +25,16 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 import javax.annotation.concurrent.ThreadSafe;
-import javax.servlet.http.HttpServletRequest;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.idp.plugin.authn.duo.DynamicDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.URISupport;
-import net.shibboleth.utilities.java.support.annotation.ParameterName;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.ParameterName;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  *  Constructive, pure, function that returns a redirect_uri from one of (ordered):
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategy.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategy.java
index 87d45fe..018ab28 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategy.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategy.java
@@ -31,9 +31,9 @@ import com.nimbusds.jwt.JWTClaimsSet;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.annotation.ParameterName;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.ParameterName;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.logic.Constraint;
 
 /** 
  * Find the issuer from the {@link DuoOIDCIntegration}. An issuer contains the scheme, host, and optionally, port 
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnController.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnController.java
index c27f4af..4b16c5f 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnController.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnController.java
@@ -23,8 +23,6 @@ import java.util.function.Function;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.GuardedBy;
 import javax.annotation.concurrent.ThreadSafe;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.action.EventIds;
@@ -35,6 +33,8 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import net.shibboleth.idp.authn.ExternalAuthentication;
 import net.shibboleth.idp.authn.ExternalAuthenticationException;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
@@ -43,10 +43,9 @@ import net.shibboleth.idp.plugin.authn.duo.DuoException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.component.AbstractInitializableComponent;
+import net.shibboleth.shared.logic.Constraint;
 
 
 /**
@@ -92,8 +91,8 @@ public class DuoOIDCAuthnController extends AbstractInitializableComponent{
      */
     public synchronized void setDuoContextLookupStrategy(
             @Nonnull final Function<ProfileRequestContext,DuoOIDCAuthenticationContext> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         duoContextLookupStrategy = Constraint.isNotNull(strategy, "DuoContext lookup strategy cannot be null");
     }
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoSupport.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoSupport.java
index 3402970..df2c515 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoSupport.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoSupport.java
@@ -26,7 +26,7 @@ import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.binary.Hex;
 
 import net.shibboleth.idp.plugin.authn.duo.DuoException;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * Helper methods for Duo 2FA. 
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
index 60ba42c..cc6a719 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPI.java
@@ -33,7 +33,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /**
  * An action that checks the health of the Duo 2FA endpoint for the established Duo integration. 
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContext.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContext.java
index 569a6b1..afd4e60 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContext.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContext.java
@@ -22,7 +22,6 @@ import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import javax.servlet.http.HttpServletRequest;
 
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.action.ActionSupport;
@@ -31,6 +30,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.idp.authn.AbstractAuthenticationAction;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
@@ -41,11 +41,11 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DynamicDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.idp.session.context.navigate.CanonicalUsernameLookupStrategy;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.logic.FunctionSupport;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.FunctionSupport;
+
 
 /**
  * An action to create (or lookup) and populate the {@link DuoOIDCAuthenticationContext} 
@@ -101,8 +101,8 @@ public class PopulateDuoAuthenticationContext extends AbstractAuthenticationActi
      * @param duoRegistry the registry
      */
     public void setClientRegistry(@Nonnull final DuoOIDCClientRegistry duoRegistry) { 
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         clientRegistry = Constraint.isNotNull(duoRegistry,"DuoClient registry can not be null");
     }
@@ -114,8 +114,8 @@ public class PopulateDuoAuthenticationContext extends AbstractAuthenticationActi
      */
     public void setUsernameLookupStrategy(
             @Nonnull final Function<ProfileRequestContext, String> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         usernameLookupStrategy = Constraint.isNotNull(strategy, "Username lookup strategy cannot be null");
     }
@@ -128,8 +128,8 @@ public class PopulateDuoAuthenticationContext extends AbstractAuthenticationActi
      */
     public void setRedirectURICreationStrategy(
             @Nonnull final BiFunction<HttpServletRequest, DynamicDuoOIDCIntegration, String> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         redirectURICreationStrategy =  Constraint.isNotNull(strategy, "RedirectURI"
                 + " creation strategy cannot be null");
@@ -142,8 +142,8 @@ public class PopulateDuoAuthenticationContext extends AbstractAuthenticationActi
      */
     public void setDuoContextCreationStrategy(
             @Nonnull final Function<ProfileRequestContext,DuoOIDCAuthenticationContext> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         duoAuthContextCreationStrategy = Constraint.isNotNull(strategy, "DuoAuthenticationContext"
                 + " creation strategy cannot be null");
@@ -156,8 +156,8 @@ public class PopulateDuoAuthenticationContext extends AbstractAuthenticationActi
      */
     public void setDuoIntegrationLookupStrategy(
             @Nonnull final Function<ProfileRequestContext, DuoOIDCIntegration> strategy) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         duoIntegrationLookupStrategy = Constraint.isNotNull(strategy, "DuoIntegration lookup strategy cannot be null");
     }
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseState.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseState.java
index da1e951..b64578b 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseState.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseState.java
@@ -28,7 +28,7 @@ import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.AbstractDuoAuthenticationAction;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /**
  * Authentication action that validates the Duo response state parameter (which is <b>required</b> in the Duo flow) 
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResult.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResult.java
index 6af7791..309b623 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResult.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResult.java
@@ -46,8 +46,7 @@ import net.shibboleth.idp.authn.impl.AbstractAuditingValidationAction;
 import net.shibboleth.idp.plugin.authn.duo.DuoException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /**
  * A validation action that checks for a valid Duo authentication token and directly produces an
@@ -103,8 +102,8 @@ public class ValidateDuoTokenAuthenticationResult extends AbstractAuditingValida
      */
     public void setContextToPrincipalMappingStrategy(@Nullable final 
             Function<ProfileRequestContext,Collection<Principal>> hook) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         contextToPrincipalMappingStrategy = hook;
     }
@@ -272,7 +271,7 @@ public class ValidateDuoTokenAuthenticationResult extends AbstractAuditingValida
         super.buildAuthenticationResult(profileRequestContext, authenticationContext);
 
          // Bypass c14n. We already operate on a canonical name, so just re-confirm it.
-        profileRequestContext.getSubcontext(SubjectCanonicalizationContext.class, true).setPrincipalName(username);
+        profileRequestContext.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName(username);
     }
     
     /**
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaims.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaims.java
index 5713832..7494a25 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaims.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaims.java
@@ -38,10 +38,9 @@ import net.shibboleth.idp.plugin.authn.duo.DuoException;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.oidc.jwt.claims.ClaimsValidator;
 import net.shibboleth.oidc.jwt.claims.JWTValidationException;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * Action that validates the claims of the Duo id_token using the supplied {@link ClaimsValidator}. 
@@ -105,8 +104,8 @@ public class ValidateTokenClaims extends AbstractDuoAuthenticationAction {
      * 
      */
     public void setCleanupHook(@Nullable final Consumer<ProfileRequestContext> hook) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         cleanupHook = hook;
     }
@@ -118,8 +117,8 @@ public class ValidateTokenClaims extends AbstractDuoAuthenticationAction {
      */
     public void setClaimsValidator(
             @Nonnull final ClaimsValidator validator) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         claimsValidator = Constraint.isNotNull(validator, "Claims validator cannot be null");
     }
diff --git a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignature.java b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignature.java
index cd7065d..8342fcd 100644
--- a/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignature.java
+++ b/idp-duo-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignature.java
@@ -44,9 +44,8 @@ import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
 import net.shibboleth.oidc.security.credential.BasicJWKCredential;
 import net.shibboleth.oidc.security.impl.JWTSignatureValidationUtil;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
-import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.ConstraintViolationException;
 
 
 /**
@@ -105,8 +104,8 @@ public class ValidateTokenSignature extends AbstractDuoAuthenticationAction {
      * @param algo the JWS signature algorithm.
      */
     public void setSignatureAlgorithm(@Nonnull final JWSAlgorithm algo) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         
         Constraint.isNotNull(algo, "Signature algorithm can not be null");
         
@@ -169,7 +168,7 @@ public class ValidateTokenSignature extends AbstractDuoAuthenticationAction {
                     JWSAssemblyUtils.getSecretBytes(integration.getSecretKey()), "NONE"));
             jwkCredential.setAlgorithm(signatureAlgorithm);
             final String errorEventId = 
-                    JWTSignatureValidationUtil.validateSignature(List.of(jwkCredential), 
+                    JWTSignatureValidationUtil.validateSignatureEx(List.of(jwkCredential), 
                             (SignedJWT)token, AuthnEventIds.NO_CREDENTIALS);
             
             if (errorEventId != null) {
diff --git a/idp-duo-impl/src/main/resources/META-INF/net.shibboleth.idp/postconfig.xml b/idp-duo-impl/src/main/resources/META-INF/net.shibboleth.idp/postconfig.xml
index f3280dd..cbcf8cd 100644
--- a/idp-duo-impl/src/main/resources/META-INF/net.shibboleth.idp/postconfig.xml
+++ b/idp-duo-impl/src/main/resources/META-INF/net.shibboleth.idp/postconfig.xml
@@ -31,14 +31,6 @@
         </property>
     </bean>
     
-    <!-- 
-        Internal versions of the Http Request/Response proxies to ease the transition to IdP 5.0.
-        Will be removed in IdP 5.0. 
-    -->
-    <bean id="shibboleth.authn.DuoOIDC.internal.HttpServletRequest"
-        class="net.shibboleth.utilities.java.support.net.ThreadLocalHttpServletRequestProxy" lazy-init="true" />
-    <bean id="shibboleth.authn.DuoOIDC.internal.HttpServletResponse"
-        class="net.shibboleth.utilities.java.support.net.ThreadLocalHttpServletResponseProxy" lazy-init="true" />
 
     <!-- Controller implementation -->
     <bean id="shibboleth.DuoOIDCAuthnController"
diff --git a/idp-duo-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/authn/DuoOIDC/duo-oidc-authn-beans.xml b/idp-duo-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/authn/DuoOIDC/duo-oidc-authn-beans.xml
index ee39e60..3d2f72d 100644
--- a/idp-duo-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/authn/DuoOIDC/duo-oidc-authn-beans.xml
+++ b/idp-duo-impl/src/main/resources/META-INF/net/shibboleth/idp/flows/authn/DuoOIDC/duo-oidc-authn-beans.xml
@@ -12,7 +12,7 @@
     <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" p:placeholderPrefix="%{"
         p:placeholderSuffix="}" />
 
-    <bean class="net.shibboleth.ext.spring.config.IdentifiableBeanPostProcessor" />
+    <bean class="net.shibboleth.shared.spring.config.IdentifiableBeanPostProcessor" />
     <bean class="net.shibboleth.idp.profile.impl.ProfileActionBeanPostProcessor" />
     
     <!-- location of the Duo OIDC IdP servlet -->
@@ -75,7 +75,7 @@
     -->
     <bean id="ExtractDuoAuthenticationFromHeaders" scope="prototype"
         class="net.shibboleth.idp.authn.duo.impl.ExtractDuoAuthenticationFromHeaders"
-        p:httpServletRequest-ref="shibboleth.authn.DuoOIDC.internal.HttpServletRequest"
+        p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier"
         p:autoAuthenticationSupported="%{idp.duo.oidc.nonbrowser.auto:true}"
         p:clientAdddressTrusted="%{idp.duo.oidc.nonbrowser.clientAddressTrusted:true}"
         p:factorHeader="%{idp.duo.oidc.nonbrowser.header.factor:X-Shibboleth-Duo-Factor}"
@@ -108,7 +108,7 @@
     <!-- Duo OIDC AuthAPI beans -->
     <bean id="PopulateDuoAuthenticationContext" scope="prototype"
         class="net.shibboleth.idp.plugin.authn.duo.impl.PopulateDuoAuthenticationContext"
-        p:httpServletRequest-ref="shibboleth.authn.DuoOIDC.internal.HttpServletRequest"
+        p:httpServletRequestSupplier-ref="shibboleth.HttpServletRequestSupplier"
         p:duoIntegrationLookupStrategy-ref="shibboleth.authn.DuoOIDC.DuoIntegrationStrategy"
         p:redirectURICreationStrategy-ref="shibboleth.authn.DuoOIDC.RedirectURICreationStrategy"
         p:usernameLookupStrategy-ref="shibboleth.authn.DuoOIDC.UsernameLookupStrategy"
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
index 5c8be05..7b992a1 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractAuthnXmlFlowExecutionTests.java
@@ -63,16 +63,6 @@ import org.springframework.webflow.test.execution.AbstractExternalizedFlowExecut
 
 import com.google.common.net.HttpHeaders;
 
-import net.shibboleth.ext.spring.config.BooleanToPredicateConverter;
-import net.shibboleth.ext.spring.config.FunctionToFunctionConverter;
-import net.shibboleth.ext.spring.config.IdentifiableBeanPostProcessor;
-import net.shibboleth.ext.spring.config.PredicateToPredicateConverter;
-import net.shibboleth.ext.spring.config.StringBooleanToPredicateConverter;
-import net.shibboleth.ext.spring.config.StringToDurationConverter;
-import net.shibboleth.ext.spring.config.StringToIPRangeConverter;
-import net.shibboleth.ext.spring.config.StringToResourceConverter;
-import net.shibboleth.ext.spring.resource.ConditionalResourceResolver;
-import net.shibboleth.ext.spring.util.AnnotationParameterNameDiscoverer;
 import net.shibboleth.idp.authn.AuthenticationFlowDescriptor;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
@@ -82,10 +72,18 @@ import net.shibboleth.idp.plugin.authn.spring.CustomFlowModelFlowBuilder;
 import net.shibboleth.idp.session.IdPSession;
 import net.shibboleth.idp.session.context.SessionContext;
 import net.shibboleth.idp.ui.context.RelyingPartyUIContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.net.HttpServletRequestResponseContext;
-import net.shibboleth.utilities.java.support.security.impl.SecureRandomIdentifierGenerationStrategy;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.security.impl.SecureRandomIdentifierGenerationStrategy;
+import net.shibboleth.shared.servlet.impl.HttpServletRequestResponseContext;
+import net.shibboleth.shared.spring.config.BooleanToPredicateConverter;
+import net.shibboleth.shared.spring.config.IdentifiableBeanPostProcessor;
+import net.shibboleth.shared.spring.config.StringBooleanToPredicateConverter;
+import net.shibboleth.shared.spring.config.StringToDurationConverter;
+import net.shibboleth.shared.spring.config.StringToIPRangeConverter;
+import net.shibboleth.shared.spring.config.StringToResourceConverter;
+import net.shibboleth.shared.spring.resource.ConditionalResourceResolver;
+import net.shibboleth.shared.spring.util.AnnotationParameterNameDiscoverer;
 
 
 /**
@@ -378,8 +376,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends CustomAbstractX
        //like the above converter. TODO check why.
        return Set.of(new StringToDurationConverter(), new StringToResourceConverter(), new StringToIPRangeConverter(),
                new BooleanToPredicateConverter(),new StringBooleanToPredicateConverter(),
-               new StringToResourceConverter(),new FunctionToFunctionConverter<>(),
-               new PredicateToPredicateConverter<>());
+               new StringToResourceConverter());
    }
     
     /**
@@ -406,7 +403,7 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends CustomAbstractX
         builderContext.registerBean("conversionService", conversationService.getObject());
         
         addBeanDefinition(builderContext, "shibboleth.RelyingPartyIdLookup.Simple",BeanDefinitionBuilder.
-                genericBeanDefinition(net.shibboleth.idp.profile.context.navigate.RelyingPartyIdLookupFunction.class)
+                genericBeanDefinition(net.shibboleth.profile.context.navigate.RelyingPartyIdLookupFunction.class)
                 .getBeanDefinition());
         
         addBeanDefinition(builderContext, "shibboleth.MessageContextLookup.Inbound",BeanDefinitionBuilder.
@@ -425,11 +422,11 @@ public abstract class AbstractAuthnXmlFlowExecutionTests extends CustomAbstractX
                 .getBeanDefinition());
         
         addBeanDefinition(builderContext, "shibboleth.HttpServletRequestSupplier",BeanDefinitionBuilder.
-                genericBeanDefinition(net.shibboleth.utilities.java.support.net.ThreadLocalHttpServletRequestSupplier.class)
+                genericBeanDefinition(net.shibboleth.shared.servlet.impl.ThreadLocalHttpServletRequestSupplier.class)
                 .getBeanDefinition()); 
         
         addBeanDefinition(builderContext, "shibboleth.HttpServletResponseSupplier",BeanDefinitionBuilder.
-                genericBeanDefinition(net.shibboleth.utilities.java.support.net.ThreadLocalHttpServletResponseSupplier.class)
+                genericBeanDefinition(net.shibboleth.shared.servlet.impl.ThreadLocalHttpServletResponseSupplier.class)
                 .getBeanDefinition());         
         
         //register shibboleth function constants.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
index 0a009e9..5876171 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/AbstractDuoActionTest.java
@@ -48,12 +48,11 @@ import net.shibboleth.idp.authn.AuthenticationFlowDescriptor;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.idp.profile.testing.RequestContextBuilder;
-
 import net.shibboleth.idp.profile.context.navigate.WebflowRequestContextProfileRequestContextLookup;
-import net.shibboleth.utilities.java.support.codec.Base64Support;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.idp.profile.testing.RequestContextBuilder;
+import net.shibboleth.shared.codec.Base64Support;
+import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 
 /**
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
index 5cd1e0b..243e2ed 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultDuoOIDCClientRegistryTest.java
@@ -40,8 +40,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoRegistryException;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClientFactory_OK_Client;
-
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Tests for the {@link DefaultDuoOIDCClientRegistry}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategyTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategyTest.java
index 5cd2b22..c11ad7f 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategyTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DefaultRedirectURICreationStrategyTest.java
@@ -15,6 +15,23 @@
  * limitations under the License.
  */
 
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  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,
+ * 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.
+ */
+
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
 import static org.testng.Assert.assertEquals;
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
index b64d860..f7a3292 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DualDuoIntegrationStrategy.java
@@ -17,14 +17,14 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.Assert;
 import java.util.function.Function;
 
 import org.opensaml.profile.context.ProfileRequestContext;
+import org.testng.Assert;
 
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
-import net.shibboleth.idp.profile.context.RelyingPartyContext;
+import net.shibboleth.profile.context.RelyingPartyContext;
 
 /**
  * Function for testing multiple duo integrations.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAudienceClaimLookupStrategyTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAudienceClaimLookupStrategyTest.java
index cb64c5e..8b7fee1 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAudienceClaimLookupStrategyTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAudienceClaimLookupStrategyTest.java
@@ -1,17 +1,16 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.annotations.Test;
-
-import com.nimbusds.jwt.JWTClaimsSet;
-
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-
 import static org.testng.Assert.assertEquals;
 
 import javax.annotation.Nonnull;
 
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.nimbusds.jwt.JWTClaimsSet;
+
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Test for the {@link DuoAudienceClaimLookupStrategy}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
index a71eda1..da07fb5 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoAuthnFlowTest.java
@@ -52,10 +52,10 @@ import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClientFactory_OK_Client;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_OK;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_OK_OLD_AUTH_TIME;
 import net.shibboleth.idp.plugin.authn.mock.MockFlowBuilder;
-import net.shibboleth.idp.profile.context.RelyingPartyContext;
 import net.shibboleth.idp.saml.authn.principal.AuthnContextClassRefPrincipal;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
+import net.shibboleth.profile.context.RelyingPartyContext;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
 
 /**
  * Test the Duo 2FA flow using SWF flow testing.
@@ -99,8 +99,8 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
      */
     @Nonnull @NonnullElements @Unmodifiable private final Map<String,String> flowResources = 
             Map.of(
-            "classpath:/net/shibboleth/idp/flows/authn/authn-abstract-flow.xml","authn.abstract",
-            "classpath:/conf/authn/authn-events-flow.xml","authn.events");
+                    "classpath:/net/shibboleth/idp/flows/authn/authn-abstract-flow.xml","authn.abstract",
+                    "classpath:/net/shibboleth/idp/module/conf/authn/authn-events-flow.xml","authn.events");
     
     
     /** Constructor.*/
@@ -547,7 +547,7 @@ public class DuoAuthnFlowTest extends AbstractAuthnXmlFlowExecutionTests {
 
     /** 
      * Test the Duo flow from the external authorization request. This should fail, as forced authn is
-     * requested by the auth_time is from a previous authentication (to far in the past).
+     * requested but the auth_time is from a previous authentication (to far in the past).
      * 
      * @throws DuoClientException if the client can not be created.*/
     @Test 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategyTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategyTest.java
index 6d1166e..da0af22 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategyTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoIssuerClaimLookupStrategyTest.java
@@ -17,17 +17,16 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.annotations.Test;
-
-import com.nimbusds.jwt.JWTClaimsSet;
-
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-
 import static org.testng.Assert.assertEquals;
 
 import javax.annotation.Nonnull;
 
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.nimbusds.jwt.JWTClaimsSet;
+
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Test for the {@link DuoIssuerClaimLookupStrategy}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoNonceClaimLookupStrategyTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoNonceClaimLookupStrategyTest.java
index 6f9eec8..032efbf 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoNonceClaimLookupStrategyTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoNonceClaimLookupStrategyTest.java
@@ -17,17 +17,16 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.annotations.Test;
-
-import com.nimbusds.jwt.JWTClaimsSet;
-
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-
 import static org.testng.Assert.assertEquals;
 
 import javax.annotation.Nonnull;
 
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.nimbusds.jwt.JWTClaimsSet;
+
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Test for the {@link DuoNonceClaimLookupStrategy}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
index 43ebad8..6b85d0d 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoOIDCAuthnControllerTest.java
@@ -25,7 +25,6 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 import javax.annotation.Nonnull;
-import javax.servlet.ServletContext;
 
 import org.apache.commons.codec.binary.Hex;
 import org.mockito.Mockito;
@@ -43,7 +42,6 @@ import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.ServletContextAttributeExporter;
-import org.springframework.web.util.NestedServletException;
 import org.springframework.webflow.core.collection.LocalAttributeMap;
 import org.springframework.webflow.core.collection.MutableAttributeMap;
 import org.springframework.webflow.execution.FlowExecution;
@@ -53,6 +51,8 @@ import org.springframework.webflow.executor.FlowExecutorImpl;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
 import net.shibboleth.idp.authn.AuthenticationFlowDescriptor;
 import net.shibboleth.idp.authn.ExternalAuthentication;
 import net.shibboleth.idp.authn.ExternalAuthenticationException;
@@ -68,7 +68,7 @@ import net.shibboleth.idp.plugin.authn.util.mock.IdPPropertyConfigurer;
 import net.shibboleth.idp.session.IdPSession;
 import net.shibboleth.idp.session.context.SessionContext;
 import net.shibboleth.idp.ui.context.RelyingPartyUIContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 
 /**
  * Tests for the {@link DuoOIDCAuthnController}.
@@ -158,7 +158,7 @@ public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests
                     .param("code", CODE)
                     .param("state",invalidState))
             .andDo(print());
-         }  catch (final NestedServletException e) {
+         }  catch (final ServletException e) {
              assertTrue(e.getCause() instanceof ExternalAuthenticationException);
              log.error("{}",e.getRootCause().getMessage());
          }  
@@ -177,7 +177,7 @@ public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests
                     .param("code", CODE)
                     .param("state",invalidState))
             .andDo(print());
-         }  catch (final NestedServletException e) {
+         }  catch (final ServletException e) {
              assertTrue(e.getCause() instanceof ExternalAuthenticationException);
              log.error("{}",e.getRootCause().getMessage());
          }  
@@ -246,7 +246,7 @@ public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests
          try {   
             mockMvc.perform(get("/Authn/Duo/2FA/duo-callback").param("state",
                     state)).andDo(print());
-         }  catch (final NestedServletException e) {
+         }  catch (final ServletException e) {
              assertTrue(e.getCause() instanceof ExternalAuthenticationException);
              log.error("{}",e.getMessage());
          }    
@@ -265,7 +265,7 @@ public class DuoOIDCAuthnControllerTest extends AbstractTestNGSpringContextTests
                     param("code", CODE)).
             andDo(print());
            
-        } catch (final NestedServletException e) {
+        } catch (final ServletException e) {
             assertTrue(e.getCause() instanceof ExternalAuthenticationException); 
             log.error("{}",e.getMessage());
         }
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoUsernameClaimLookupStrategyTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoUsernameClaimLookupStrategyTest.java
index 8e59fbb..799faab 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoUsernameClaimLookupStrategyTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/DuoUsernameClaimLookupStrategyTest.java
@@ -17,17 +17,16 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.annotations.Test;
-
-import com.nimbusds.jwt.JWTClaimsSet;
-
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-
 import static org.testng.Assert.assertEquals;
 
 import javax.annotation.Nonnull;
 
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.nimbusds.jwt.JWTClaimsSet;
+
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Test for the {@link DuoUsernameClaimLookupStrategy}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
index 73daf4e..375dba8 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ExchangeCodeForDuoTokenTest.java
@@ -17,17 +17,16 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
-import org.testng.annotations.Test;
-import org.testng.annotations.BeforeMethod;
-import org.testng.AssertJUnit;
-
 import org.springframework.webflow.execution.Event;
+import org.testng.AssertJUnit;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoRegistryException;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_OK;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Tests for {@link ExchangeCodeForDuoToken}.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
index 755cd8b..d0cdfb7 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/HealthCheckDuoOIDCAuthAPITest.java
@@ -46,7 +46,7 @@ import net.shibboleth.idp.plugin.authn.duo.DuoRegistryException;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_FAIL;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_OK;
 import net.shibboleth.idp.plugin.authn.mock.MockDuoOIDCClient_UNKNOWN;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 class HealthCheckDuoOIDCAuthAPITest extends AbstractDuoActionTest {
 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
index d2a70f5..a976ca4 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/InMemoryCredentialValidator.java
@@ -30,9 +30,9 @@ import net.shibboleth.idp.authn.AbstractUsernamePasswordCredentialValidator;
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.authn.context.UsernamePasswordContext;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * Simple in-memory credential validator that validates the username and password against a single
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
index 53a766c..05e09dd 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/PopulateDuoAuthenticationContextTest.java
@@ -17,6 +17,7 @@
 
 package net.shibboleth.idp.plugin.authn.duo.impl;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 
@@ -36,8 +37,8 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoRegistryException;
 import net.shibboleth.idp.plugin.authn.duo.SimpleDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import static org.mockito.ArgumentMatchers.any;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.testing.ConstantSupplier;
 
 /**
  * Tests for the {@link PopulateDuoAuthenticationContext} strategy.
@@ -88,7 +89,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         //lookup a username
         action.setUsernameLookupStrategy(prc -> "jdoe");
         
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
         final DuoOIDCClient mockClient = Mockito.mock(DuoOIDCClient.class);
         Mockito.when(mockClientRegistry.getClientOrCreate(any(DuoOIDCIntegration.class))).thenReturn(mockClient);
@@ -123,7 +124,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         request.addHeader("Host", "example.com");
         request.setServerPort(443);
         request.setScheme("https");
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
         final DuoOIDCClient mockClient = Mockito.mock(DuoOIDCClient.class);
@@ -155,7 +156,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         action.setUsernameLookupStrategy(prc -> "jdoe");
         action.setRedirectURICreationStrategy((http,duoInteg) 
                 -> "https://example.com/idp/profile/Authn/Duo/2FA/callback");
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         //set http params
         request.addHeader("Host", "example.com");
         request.setServerPort(443);
@@ -197,7 +198,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         action.setClientRegistry(mockClientRegistry);
         action.setRedirectURICreationStrategy((http,duoInteg) 
                 -> "https://example.com/idp/profile/Authn/Duo/2FA/callback");
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         
         action.initialize();
         final Event event = action.execute(src);
@@ -235,7 +236,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         action.setUsernameLookupStrategy(prc -> null);
         action.setRedirectURICreationStrategy((http,duoInteg) 
                 -> "https://example.com/idp/profile/Authn/Duo/2FA/callback");
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
 
         action.setClientRegistry(mockClientRegistry);
@@ -260,7 +261,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         //lookup a username
         action.setUsernameLookupStrategy(prc -> "jdoe");
         action.setRedirectURICreationStrategy((http,duoInteg) -> null);
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
 
         action.setClientRegistry(mockClientRegistry);
@@ -286,7 +287,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
         action.setUsernameLookupStrategy(prc -> "jdoe");
         action.setRedirectURICreationStrategy((http,duoInteg) 
                 -> "https://example.com/idp/profile/Authn/Duo/2FA/callback");
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
         //throw when asking for a client
         Mockito.when(mockClientRegistry.getClientOrCreate(any(DuoOIDCIntegration.class)))
@@ -347,7 +348,7 @@ public class PopulateDuoAuthenticationContextTest extends AbstractDuoActionTest{
                 -> "https://example.com/idp/profile/Authn/Duo/2FA/callback");
         action.setDuoContextCreationStrategy(prc -> null);
         
-        action.setHttpServletRequest(request);
+        action.setHttpServletRequestSupplier(new ConstantSupplier<>(request));
         
         final DuoOIDCClientRegistry mockClientRegistry = Mockito.mock(DuoOIDCClientRegistry.class);
 
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
index 47e10b1..519cdf2 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoResponseStateTest.java
@@ -24,7 +24,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Tests for the {@link ValidateDuoResponseState} action.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
index afc68c6..45679dd 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateDuoTokenAuthenticationResultTest.java
@@ -45,7 +45,7 @@ import net.shibboleth.idp.authn.context.AuthenticationContext;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.idp.plugin.authn.duo.context.DuoOIDCAuthenticationContext;
 import net.shibboleth.idp.saml.authn.principal.AuthnContextClassRefPrincipal;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Tests for the {@link ValidateDuoTokenAuthenticationResult} action.
@@ -167,7 +167,7 @@ public class ValidateDuoTokenAuthenticationResultTest extends AbstractDuoActionT
         addDuoIntegrationToContext();
         addAttemptedFlow("authn/DuoOIDC");
         
-        final Map<String, Collection<String>> classifiedMessages = new HashMap<String,Collection<String>>();
+        final Map<String, Collection<String>> classifiedMessages = new HashMap<>();
         classifiedMessages.put(AuthnEventIds.ACCOUNT_LOCKED, Arrays.asList(new String[] {"deny"}));
         action.setClassifiedMessages(classifiedMessages);
         
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaimsTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaimsTest.java
index 2bb978b..9152325 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaimsTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenClaimsTest.java
@@ -50,7 +50,7 @@ import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
 import net.shibboleth.oidc.jwt.claims.JWTValidationException;
 import net.shibboleth.oidc.security.jwt.claims.impl.ChainingJWTClaimsValidator;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
  * Tests for the {@link ValidateTokenClaims} class.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignatureTest.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignatureTest.java
index 4dd1287..eec177b 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignatureTest.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/impl/ValidateTokenSignatureTest.java
@@ -47,9 +47,9 @@ import com.nimbusds.jose.JWSAlgorithm;
 
 import net.shibboleth.idp.authn.AuthnEventIds;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCAuthAPI;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
+import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.ConstraintViolationException;
 
 /**
  * Tests for the {@link ValidateTokenSignature} class.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
index 415e87e..b36f1d5 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_FAIL.java
@@ -36,8 +36,8 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientCapabilities;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.codec.EncodingException;
 
 /**
  * Mock a Duo client which is not available (unhealthy).
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
index fa29700..ef59541 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK.java
@@ -36,8 +36,8 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientCapabilities;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.codec.EncodingException;
 
 /**
  * Mock a Duo client which is available and returns a valid response.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
index 1986c7f..2381ee6 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_OK_OLD_AUTH_TIME.java
@@ -36,8 +36,8 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientCapabilities;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.codec.EncodingException;
 
 /**
  * Mock a Duo client which is available and returns a valid response.
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
index a3d8851..9dff9fb 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockDuoOIDCClient_UNKNOWN.java
@@ -36,8 +36,8 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientCapabilities;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.codec.EncodingException;
 
 /**
  * Mock a Duo client which returns an unknown response for the health check and a login failure in the
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockFlowBuilder.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockFlowBuilder.java
index f5d4b1e..cf642db 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockFlowBuilder.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/mock/MockFlowBuilder.java
@@ -29,7 +29,7 @@ import org.springframework.webflow.engine.support.DefaultTargetStateResolver;
 import org.springframework.webflow.execution.Event;
 import org.springframework.webflow.execution.FlowExecutionException;
 
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /**
  * A builder for generating simple mock flows. Mostly used to generate stub subflows when testing
diff --git a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowModelFlowBuilder.java b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowModelFlowBuilder.java
index 68a2568..9db1b2f 100644
--- a/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowModelFlowBuilder.java
+++ b/idp-duo-impl/src/test/java/net/shibboleth/idp/plugin/authn/spring/CustomFlowModelFlowBuilder.java
@@ -116,8 +116,8 @@ import org.springframework.webflow.scope.FlowScope;
 import org.springframework.webflow.scope.ViewScope;
 import org.springframework.webflow.security.SecurityRule;
 
-import net.shibboleth.ext.spring.resource.ConditionalResourceResolver;
-import net.shibboleth.ext.spring.util.AnnotationParameterNameDiscoverer;
+import net.shibboleth.shared.spring.resource.ConditionalResourceResolver;
+import net.shibboleth.shared.spring.util.AnnotationParameterNameDiscoverer;
 
 /**
  * Copy of {@link FlowModelFlowBuilder} for setting the property placeholder prefix of <code>%{</code>, and
diff --git a/idp-duo-impl/src/test/resources/conf/authn/duo-oidc-authn-config-principal-mapping.xml b/idp-duo-impl/src/test/resources/conf/authn/duo-oidc-authn-config-principal-mapping.xml
index e904ae2..a532dd7 100644
--- a/idp-duo-impl/src/test/resources/conf/authn/duo-oidc-authn-config-principal-mapping.xml
+++ b/idp-duo-impl/src/test/resources/conf/authn/duo-oidc-authn-config-principal-mapping.xml
@@ -10,7 +10,7 @@
 
     <!-- need this bean to define the scripted function -->
      <bean id="shibboleth.ContextFunctions.Scripted"
-        class="net.shibboleth.idp.profile.context.navigate.ScriptedContextLookupFunction" abstract="true" />
+        class="net.shibboleth.profile.context.navigate.ScriptedContextLookupFunction" abstract="true" />
 
     <bean id="shibboleth.authn.DuoOIDC.ContextToPrincipalMappingStrategy" parent="shibboleth.ContextFunctions.Scripted"
             factory-method="inlineScript"
diff --git a/idp-duo-nimbus-client-impl/pom.xml b/idp-duo-nimbus-client-impl/pom.xml
index c4d07c0..640d632 100644
--- a/idp-duo-nimbus-client-impl/pom.xml
+++ b/idp-duo-nimbus-client-impl/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>1.4.1-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-nimbus-client-impl</artifactId>
@@ -29,16 +29,6 @@
             <groupId>com.google.code.findbugs</groupId>
             <artifactId>jsr305</artifactId>
             <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>net.shibboleth.utilities</groupId>
-            <artifactId>java-support</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.httpcomponents</groupId>
-            <artifactId>httpcore</artifactId>
-            <scope>provided</scope>
         </dependency>
          <dependency>
             <groupId>com.nimbusds</groupId>
@@ -55,7 +45,11 @@
             <artifactId>oidc-common-crypto-api</artifactId>
             <scope>provided</scope>
         </dependency>
-
+        <dependency>
+            <groupId>${shib-shared.groupId}</groupId>
+            <artifactId>shib-profile-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <!-- Needed for module/plugin impls. -->
         <dependency>
             <groupId>${idp.groupId}</groupId>
@@ -69,8 +63,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>net.shibboleth.idp</groupId>
-            <artifactId>idp-profile-spring</artifactId>
+            <groupId>${shib-shared.groupId}</groupId>
+            <artifactId>shib-spring</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -78,8 +72,6 @@
             <artifactId>spring-core</artifactId>
             <scope>test</scope>
         </dependency>
-
-
     </dependencies>
 
     <build>
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusModule.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusModule.java
index 939782c..921a87a 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusModule.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusModule.java
@@ -19,7 +19,7 @@ package net.shibboleth.idp.plugin.authn.duo.nimbus;
 
 import java.io.IOException;
 
-import net.shibboleth.idp.module.ModuleException;
+import net.shibboleth.profile.module.ModuleException;
 import net.shibboleth.idp.module.impl.PluginIdPModule;
 
 /**
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusPlugin.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusPlugin.java
index 2f79bce..0da77f9 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusPlugin.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/DuoOIDCNimbusPlugin.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 import java.util.Collections;
 
 import net.shibboleth.idp.module.IdPModule;
-import net.shibboleth.idp.module.ModuleException;
-import net.shibboleth.idp.plugin.PluginException;
+import net.shibboleth.profile.module.ModuleException;
+import net.shibboleth.profile.plugin.PluginException;
 import net.shibboleth.idp.plugin.impl.FirstPartyIdPPlugin;
 
 /**
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/DuoHttpClientFactoryBean.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/DuoHttpClientFactoryBean.java
index 930c0b2..501af33 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/DuoHttpClientFactoryBean.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/DuoHttpClientFactoryBean.java
@@ -22,7 +22,7 @@ import net.shibboleth.idp.plugin.authn.duo.Version;
 /**
  * Factory bean customization for the Duo plugin. Uses the plugin product name and version inside the user_agent string.
  */
-public class DuoHttpClientFactoryBean extends net.shibboleth.ext.spring.factory.HttpClientFactoryBean {
+public class DuoHttpClientFactoryBean extends net.shibboleth.shared.spring.httpclient.factory.HttpClientFactoryBean {
 
     /** Constructor. */
     public DuoHttpClientFactoryBean() {
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
index 71e49d4..8bbb6f3 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClient.java
@@ -27,13 +27,13 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 import javax.annotation.concurrent.ThreadSafe;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.methods.RequestBuilder;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.client.utils.URIBuilder;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
+import org.apache.hc.core5.net.URIBuilder;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 import org.opensaml.security.httpclient.HttpClientSecuritySupport;
 import org.slf4j.Logger;
@@ -49,8 +49,8 @@ import net.shibboleth.idp.plugin.authn.duo.AbstractDuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * A Duo client using the Nimbus OIDC library.
@@ -109,8 +109,8 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
                     .setPath(duoIntegration.getHealthCheckEndpoint()).build();            
             log.trace("Using health check endpoint '{}'",uri);
             
-            final RequestBuilder rb =
-                    RequestBuilder.post().setUri(uri).addParameter("client_id",duoIntegration.getClientId())
+            final ClassicRequestBuilder rb =
+                    ClassicRequestBuilder.post().setUri(uri).addParameter("client_id",duoIntegration.getClientId())
                     .addParameter("client_assertion",
                             NimbusClientSupport.createJWS(uri.toString(), 
                                     duoIntegration.getClientId(), duoIntegration.getSecretKey()));
@@ -180,8 +180,8 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
                         + "for acquiring a 2FA result, for client '"+duoIntegration.getClientId()+"'");
             }
             
-            final RequestBuilder rb =
-                    RequestBuilder.post().setUri(uri)
+            final ClassicRequestBuilder rb =
+                    ClassicRequestBuilder.post().setUri(uri)
                     .addParameter("grant_type","authorization_code")
                     .addParameter("code",code)
                     .addParameter("redirect_uri",redirectURI)
@@ -212,17 +212,17 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
      * 
      * @throws DuoClientException if there is an error producing a response
      */
-    private <T> T executeRequest(@Nonnull final HttpUriRequest request, 
+    private <T> T executeRequest(@Nonnull final ClassicHttpRequest request, 
             @Nonnull final TypeReference<T> wrapperTypeRef) throws DuoClientException{
         
         try {
             final HttpClientContext clientContext = HttpClientContext.create();
             HttpClientSecuritySupport.marshalSecurityParameters(clientContext, httpClientSecurityParameters, true);
             HttpClientSecuritySupport.addDefaultTLSTrustEngineCriteria(clientContext, request);
-            final HttpResponse httpResponse = httpClient.execute(request, clientContext);
-            HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getURI().getScheme());
+            final ClassicHttpResponse httpResponse = httpClient.executeOpen(null, request, clientContext);
+            HttpClientSecuritySupport.checkTLSCredentialEvaluated(clientContext, request.getUri().getScheme());
             
-            final int httpStatusCode = httpResponse.getStatusLine().getStatusCode();
+            final int httpStatusCode = httpResponse.getCode();
             if (httpStatusCode != HttpStatus.SC_OK) {
                 //dump the body for logging - if one exists
                 if (httpResponse.getEntity() != null && httpResponse.getEntity().getContent() != null) {
@@ -230,7 +230,7 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
                     log.error("Duo returned a Non-ok message of '{}'",errorContent);
                 }
                 throw new DuoClientException("Non-ok status code (" + httpStatusCode + ") returned from Duo: "
-                        + httpResponse.getStatusLine().getReasonPhrase());
+                        + httpResponse.getReasonPhrase());
             } else if (httpResponse.getEntity() == null) {
                 throw new DuoClientException("No response body returned from Duo");
             }
@@ -242,7 +242,7 @@ public final class NimbusClient extends AbstractDuoOIDCClient{
             } 
             return duoResponse;
             
-        } catch (final IOException e) {
+        } catch (final IOException | URISyntaxException e) {
             throw new DuoClientException("Could not execute Duo HTTP request",e);
         }
     }
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
index 9af8e4e..0aead00 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactory.java
@@ -22,7 +22,7 @@ import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
 import javax.annotation.concurrent.ThreadSafe;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.opensaml.security.httpclient.HttpClientSecurityParameters;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,11 +31,10 @@ import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.component.AbstractInitializableComponent;
+import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
 
 /**
  * <p>
@@ -110,8 +109,8 @@ public final class NimbusClientFactory extends AbstractInitializableComponent im
      * @param client the http client.
      */
     public synchronized void setHttpClient(@Nonnull final HttpClient client) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         httpClient = Constraint.isNotNull(client, "HTTP client cannot be null");
     }
@@ -122,8 +121,8 @@ public final class NimbusClientFactory extends AbstractInitializableComponent im
      * @param params the new client security parameters
      */
     public synchronized void setHttpClientSecurityParameters(@Nullable final HttpClientSecurityParameters params) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         httpClientSecurityParameters = params;
     }
@@ -134,8 +133,8 @@ public final class NimbusClientFactory extends AbstractInitializableComponent im
      * @param mapper object mapper
      */
     public synchronized void setObjectMapper(@Nonnull final ObjectMapper mapper) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
 
         objectMapper = Constraint.isNotNull(mapper, "Object mapper cannot be null");
     }
diff --git a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupport.java b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupport.java
index 6ed3a8b..b8cb8cf 100644
--- a/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupport.java
+++ b/idp-duo-nimbus-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupport.java
@@ -31,9 +31,9 @@ import com.nimbusds.jwt.JWTClaimsSet;
 
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.logic.Constraint;
 
 /** 
  * Helper methods for working with Duo using Nimbus.
diff --git a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactoryTest.java b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactoryTest.java
index 3e5b5f7..19a014e 100644
--- a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactoryTest.java
+++ b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientFactoryTest.java
@@ -5,7 +5,7 @@ import static org.testng.Assert.assertNotNull;
 
 import javax.annotation.Nonnull;
 
-import org.apache.http.client.HttpClient;
+import org.apache.hc.client5.http.classic.HttpClient;
 import org.mockito.Mockito;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -15,7 +15,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 
 /** Test for the NimbusClientFactory class. */
diff --git a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupportTest.java b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupportTest.java
index 4ec718c..dac2ddb 100644
--- a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupportTest.java
+++ b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientSupportTest.java
@@ -30,7 +30,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
-import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Tests for the NimbusClientSupport class.*/
 public class NimbusClientSupportTest {
@@ -45,7 +45,7 @@ public class NimbusClientSupportTest {
     @Nonnull static final String AUD = "audience";
   
     /** Class logger. */
-    @Nonnull private Logger log = LoggerFactory.getLogger(NimbusClientSupportTest.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(NimbusClientSupportTest.class);
     
     /** A dummy integration.*/
     @Nullable private DefaultDuoOIDCIntegration integ;
diff --git a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientTest.java b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientTest.java
index b983f66..cdd8e47 100644
--- a/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientTest.java
+++ b/idp-duo-nimbus-client-impl/src/test/java/net/shibboleth/idp/plugin/authn/duo/nimbus/impl/NimbusClientTest.java
@@ -47,13 +47,13 @@ import java.nio.charset.StandardCharsets;
 
 import javax.annotation.Nonnull;
 
-
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.HttpResponse;
-import org.apache.http.StatusLine;
+import org.apache.hc.client5.http.classic.HttpClient;
+import org.apache.hc.client5.http.classic.methods.HttpUriRequest;
+import org.apache.hc.core5.http.ClassicHttpRequest;
+import org.apache.hc.core5.http.ClassicHttpResponse;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.io.entity.StringEntity;
+import org.apache.hc.core5.http.protocol.HttpContext;
 import org.mockito.Mockito;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -61,11 +61,10 @@ import org.testng.annotations.Test;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.nimbusds.jwt.JWT;
 
-
 import net.shibboleth.idp.plugin.authn.duo.DefaultDuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
 
 /** Tests for the NimbusClient class.*/
 public class NimbusClientTest {
@@ -173,15 +172,12 @@ public class NimbusClientTest {
     public void testTokenExchange() throws Exception {
 
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        final HttpResponse httpResponse = Mockito.mock(HttpResponse.class);
-        final StatusLine statusLine = Mockito.mock(StatusLine.class);
+        final ClassicHttpResponse httpResponse = Mockito.mock(ClassicHttpResponse.class);
 
-        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
-
-        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        Mockito.when(httpResponse.getCode()).thenReturn(200);
         Mockito.when(httpResponse.getEntity()).thenReturn(new StringEntity(ID_TOKEN_RESPONSE));
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), (HttpContext) Mockito.any()))
-                .thenReturn(httpResponse);
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (ClassicHttpRequest) Mockito.any(), 
+                (HttpContext) Mockito.any())).thenReturn(httpResponse);
 
         // create new client with mock response
         client = new NimbusClient(integ, httpClient, null, new ObjectMapper());
@@ -202,15 +198,12 @@ public class NimbusClientTest {
     public void testTokenExchangeInternalServerErrorResponse() throws Exception {
         
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        final HttpResponse httpResponse = Mockito.mock(HttpResponse.class);
-        final StatusLine statusLine = Mockito.mock(StatusLine.class);
-
-        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        final ClassicHttpResponse httpResponse = Mockito.mock(ClassicHttpResponse.class);
 
-        Mockito.when(statusLine.getStatusCode()).thenReturn(500);
+        Mockito.when(httpResponse.getCode()).thenReturn(500);
         Mockito.when(httpResponse.getEntity()).thenReturn(new StringEntity(ID_TOKEN_REPONSE_NULL));
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), (HttpContext) Mockito.any()))
-                .thenReturn(httpResponse);
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (ClassicHttpRequest) Mockito.any(), 
+                (HttpContext) Mockito.any())).thenReturn(httpResponse);
 
         // create new client with mock response
         client = new NimbusClient(integ, httpClient, null, new ObjectMapper());
@@ -227,15 +220,12 @@ public class NimbusClientTest {
      */
     @Test public void testHealthCheck() throws Exception {
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        final HttpResponse httpResponse = Mockito.mock(HttpResponse.class);
-        final StatusLine statusLine = Mockito.mock(StatusLine.class);
+        final ClassicHttpResponse httpResponse = Mockito.mock(ClassicHttpResponse.class);
 
-        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
-
-        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        Mockito.when(httpResponse.getCode()).thenReturn(200);
         Mockito.when(httpResponse.getEntity()).thenReturn(new StringEntity(HEALTH_CHECK_REPONSE));
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), (HttpContext) Mockito.any()))
-                .thenReturn(httpResponse);
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (ClassicHttpRequest) Mockito.any(), 
+                (HttpContext) Mockito.any())).thenReturn(httpResponse);
         
      // create new client with mock response
         client = new NimbusClient(integ, httpClient, null, new ObjectMapper());
@@ -254,15 +244,12 @@ public class NimbusClientTest {
      */
     @Test public void testHealthCheckMoreFields() throws Exception {
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        final HttpResponse httpResponse = Mockito.mock(HttpResponse.class);
-        final StatusLine statusLine = Mockito.mock(StatusLine.class);
-
-        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        final ClassicHttpResponse httpResponse = Mockito.mock(ClassicHttpResponse.class);
 
-        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        Mockito.when(httpResponse.getCode()).thenReturn(200);
         Mockito.when(httpResponse.getEntity()).thenReturn(new StringEntity(HEALTH_CHECK_REPONSE_MORE_FIELDS));
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), (HttpContext) Mockito.any()))
-                .thenReturn(httpResponse);
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (ClassicHttpRequest) Mockito.any(), 
+                (HttpContext) Mockito.any())).thenReturn(httpResponse);
         
         // create new client with mock response
         client = new NimbusClient(integ, httpClient, null, new ObjectMapper());
@@ -281,15 +268,12 @@ public class NimbusClientTest {
      */
     @Test public void testHealthCheckError() throws Exception {
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        final HttpResponse httpResponse = Mockito.mock(HttpResponse.class);
-        final StatusLine statusLine = Mockito.mock(StatusLine.class);
-
-        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        final ClassicHttpResponse httpResponse = Mockito.mock(ClassicHttpResponse.class);
 
-        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        Mockito.when(httpResponse.getCode()).thenReturn(200);
         Mockito.when(httpResponse.getEntity()).thenReturn(new StringEntity(HEALTH_CHECK_REPONSE_ERROR));
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), (HttpContext) Mockito.any()))
-                .thenReturn(httpResponse);
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (ClassicHttpRequest) Mockito.any(), 
+                (HttpContext) Mockito.any())).thenReturn(httpResponse);
         
         // create new client with mock response
         client = new NimbusClient(integ, httpClient, null, new ObjectMapper());
@@ -301,7 +285,7 @@ public class NimbusClientTest {
     @Test(expectedExceptions = DuoClientException.class)
     public void testHealthEndpointTimeout() throws Exception {
         final HttpClient httpClient = Mockito.mock(HttpClient.class);
-        Mockito.when(httpClient.execute((HttpUriRequest) Mockito.any(), 
+        Mockito.when(httpClient.executeOpen((HttpHost) Mockito.any(), (HttpUriRequest) Mockito.any(), 
                 (HttpContext) Mockito.any())).thenThrow(IOException.class);
         
         // create new client with mock response
diff --git a/idp-duo-nimbus-distribution/pom.xml b/idp-duo-nimbus-distribution/pom.xml
index 6c03d6f..7c84911 100644
--- a/idp-duo-nimbus-distribution/pom.xml
+++ b/idp-duo-nimbus-distribution/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>1.4.1-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-nimbus-dist</artifactId>
diff --git a/idp-duo-sdk-client-impl/pom.xml b/idp-duo-sdk-client-impl/pom.xml
index ad27a72..7f04e9a 100644
--- a/idp-duo-sdk-client-impl/pom.xml
+++ b/idp-duo-sdk-client-impl/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>1.4.1-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-sdk-client-impl</artifactId>
@@ -106,11 +106,6 @@
             <artifactId>oidc-common-crypto-api</artifactId>
             <scope>provided</scope>
         </dependency>
-        <dependency>
-            <groupId>net.shibboleth.utilities</groupId>
-            <artifactId>java-support</artifactId>
-            <scope>provided</scope>
-        </dependency>
         <dependency>
             <groupId>${idp.groupId}</groupId>
             <artifactId>idp-conf-impl</artifactId>
@@ -129,9 +124,14 @@
         <!-- Needed for module/plugin impls. -->
         <dependency>
             <groupId>${idp.groupId}</groupId>
-            <artifactId>idp-admin-impl</artifactId>
+            <artifactId>idp-admin-api</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>${idp.groupId}</groupId>
+            <artifactId>idp-admin-impl</artifactId>
+            <scope>provided</scope>
+        </dependency> 
     </dependencies>
 
     <build>
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKModule.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKModule.java
index 11aaace..1ff4db0 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKModule.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKModule.java
@@ -18,9 +18,8 @@
 package net.shibboleth.idp.plugin.authn.duo.sdk;
 
 import java.io.IOException;
-import net.shibboleth.idp.module.ModuleException;
-
 
+import net.shibboleth.profile.module.ModuleException;
 import net.shibboleth.idp.module.impl.PluginIdPModule;
 
 /**
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKPlugin.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKPlugin.java
index 86500a5..735dfed 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKPlugin.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/DuoOIDCWebSDKPlugin.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 import java.util.Collections;
 
 import net.shibboleth.idp.module.IdPModule;
-import net.shibboleth.idp.module.ModuleException;
-import net.shibboleth.idp.plugin.PluginException;
+import net.shibboleth.profile.module.ModuleException;
+import net.shibboleth.profile.plugin.PluginException;
 import net.shibboleth.idp.plugin.impl.FirstPartyIdPPlugin;
 
 /**
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
index baf1664..34942f0 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientAdaptor.java
@@ -49,9 +49,10 @@ import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheck;
 import net.shibboleth.idp.plugin.authn.duo.model.DuoHealthCheckResponse;
 import net.shibboleth.oidc.security.JWSAssemblyUtils;
-import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.codec.EncodingException;
-import net.shibboleth.utilities.java.support.logic.Constraint;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.codec.EncodingException;
+import net.shibboleth.shared.logic.Constraint;
+
 
 /**
  * <p>An Object Adaptor class for bridging between the Duo SDK implementation 
diff --git a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
index adedf96..49ca469 100644
--- a/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
+++ b/idp-duo-sdk-client-impl/src/main/java/net/shibboleth/idp/plugin/authn/duo/sdk/impl/DuoSDKClientFactory.java
@@ -31,11 +31,11 @@ import net.shibboleth.idp.plugin.authn.duo.DuoClientException;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClient;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCClientFactory;
 import net.shibboleth.idp.plugin.authn.duo.DuoOIDCIntegration;
-import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
-import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
-import net.shibboleth.utilities.java.support.component.AbstractInitializableComponent;
-import net.shibboleth.utilities.java.support.component.ComponentSupport;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
+import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.Unmodifiable;
+import net.shibboleth.shared.component.AbstractInitializableComponent;
+import net.shibboleth.shared.primitive.StringSupport;
+
 
 
 /** Abstract factory implementation for the {@link DuoSDKClientAdaptor}. */
@@ -55,8 +55,8 @@ public final class DuoSDKClientFactory extends AbstractInitializableComponent im
      * @param certs the list of certificate pins.
      */
     public synchronized void setCaCerts(@Nullable final List<String> certs) {
-        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
-        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+        ifInitializedThrowUnmodifiabledComponentException();
+        ifDestroyedThrowDestroyedComponentException();
         //check if null, as the native duo client uses the internal defaults if null
         //but will respect an empty list.
         if (certs != null) {
diff --git a/idp-duo-sdk-distribution/pom.xml b/idp-duo-sdk-distribution/pom.xml
index 2414c5f..99c875b 100644
--- a/idp-duo-sdk-distribution/pom.xml
+++ b/idp-duo-sdk-distribution/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>net.shibboleth.idp.plugin.authn</groupId>
         <artifactId>idp-plugin-duo-parent</artifactId>
-        <version>1.4.1-SNAPSHOT</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>idp-plugin-duo-sdk-dist</artifactId>
diff --git a/pom.xml b/pom.xml
index 729f4d6..5efb65f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>net.shibboleth</groupId>
         <artifactId>parent</artifactId>
-        <version>11.3.5</version>
+        <version>17.0.0-SNAPSHOT</version>
     </parent>
 
     <groupId>net.shibboleth.idp.plugin.authn</groupId>
     <artifactId>idp-plugin-duo-parent</artifactId>
-    <version>1.4.1-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
     <name>Shibboleth IdP :: Plugins :: Duo 2FA Login Flow</name>
     <packaging>pom</packaging>
 
@@ -20,14 +20,13 @@
     </description>
 
     <properties>
+        <shib-shared.groupId>net.shibboleth</shib-shared.groupId>
         <idp.groupId>net.shibboleth.idp</idp.groupId>
-        <idp.version>4.3.0</idp.version>
+        <idp.version>5.0.0-SNAPSHOT</idp.version>
         <duo.client.version>1.1.3</duo.client.version>
         <opensaml.groupId>org.opensaml</opensaml.groupId>
-        <opensaml.version>4.3.0</opensaml.version>
-        <java-support.version>8.4.0</java-support.version>   
-        <spring-extensions.version>6.3.0</spring-extensions.version>   
-        <oidc.common.version>2.2.0</oidc.common.version>
+        <opensaml.version>5.0.0-SNAPSHOT</opensaml.version>
+        <oidc.common.version>3.0.0-SNAPSHOT</oidc.common.version>
         <checkstyle.configLocation>${project.basedir}/checkstyle.xml</checkstyle.configLocation>
 	<jdk.version>15.3</jdk.version>
     </properties>
@@ -54,24 +53,6 @@
         <url>https://git.shibboleth.net/view/?p=java-${project.artifactId}.git</url>
     </scm>
 
-    <repositories>
-        <repository>
-            <id>shib-release</id>
-            <url>https://build.shibboleth.net/nexus/content/groups/public</url>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
-        </repository>
-        <repository>
-            <id>shib-snapshot</id>
-            <url>https://build.shibboleth.net/nexus/content/repositories/snapshots</url>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-        </repository>
-    </repositories>
-
-
     <dependencies>
         <!-- Project wide test Dependencies -->
         <dependency>
@@ -113,14 +94,7 @@
                 <version>${oidc.common.version}</version>
                 <type>pom</type>
                 <scope>import</scope>
-            </dependency>
-            <!-- Provided support dependencies -->
-            <dependency>
-                <groupId>net.shibboleth.utilities</groupId>
-                <artifactId>java-support</artifactId>
-                <version>${java-support.version}</version>
-                <scope>provided</scope>
-            </dependency>           
+            </dependency>         
             <!-- Duo client and plugin dependencies -->
             <dependency>
                 <groupId>com.duosecurity</groupId>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list