[java-identity-provider] 02/02: IDP-2069 - Null Handling Task

Rod Widdowson rdw at steadingsoftware.com
Sat Mar 18 10:49:24 UTC 2023


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

rdw pushed a commit to branch main
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=20095374586c15777a2d7831cf434651b01f9584

commit 20095374586c15777a2d7831cf434651b01f9584
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Fri Mar 17 14:53:58 2023 +0000

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    rename BaseContext#getOrCreateSubcontext to ensureSubcontext
---
 ...InitializeAdministrativeProfileContextTree.java |  2 +-
 .../idp/authn/AbstractValidationAction.java        | 10 ++++-----
 .../idp/authn/duo/impl/ValidateDuoAuthAPI.java     |  2 +-
 .../idp/authn/duo/impl/ValidateDuoWebResponse.java |  2 +-
 .../idp/authn/impl/DoLockoutManagerOperation.java  |  2 +-
 .../idp/authn/impl/ExternalAuthenticationImpl.java |  4 ++--
 .../idp/authn/impl/ExtractRemoteUser.java          |  6 ++---
 .../idp/authn/impl/ExtractUserAgentAddress.java    |  2 +-
 .../idp/authn/impl/ExtractUserAgentIdentifier.java |  2 +-
 .../impl/ExtractUsernamePasswordFromBasicAuth.java |  2 +-
 .../ExtractUsernamePasswordFromFormRequest.java    |  2 +-
 .../impl/ExtractUsernamePasswordFromWSSToken.java  |  2 +-
 .../idp/authn/impl/FinalizeAuthentication.java     |  2 +-
 .../idp/authn/impl/LDAPCredentialValidator.java    |  2 +-
 .../authn/impl/ValidateExternalAuthentication.java |  2 +-
 .../shibboleth/idp/authn/impl/X509AuthServlet.java |  2 +-
 .../impl/AttributeRevocationCondition.java         |  2 +-
 .../revocation/impl/RevocationCacheCondition.java  |  2 +-
 ...ontextDerivedAttributeDefinitionParserTest.java |  4 ++--
 .../context/impl/SubjectDataConnectorTest.java     |  8 +++----
 .../SubjectDerivedAttributeValuesFunctionTest.java |  6 ++---
 ...ttributeSourcedSubjectCanonicalizationTest.java | 22 +++++++++---------
 .../DefaultAuthenticationResultSerializerTest.java |  2 +-
 .../impl/HTPasswdCredentialValidatorTest.java      |  4 ++--
 .../InitializeRequestedPrincipalContextTest.java   | 20 ++++++++---------
 .../authn/impl/JAASCredentialValidatorTest.java    |  8 +++----
 .../authn/impl/LDAPCredentialValidatorTest.java    |  4 ++--
 ...pulateMultiFactorAuthenticationContextTest.java |  2 +-
 ...PopulateSubjectCanonicalizationContextTest.java |  2 +-
 ...RelyingPartyMapJAASLoginConfigStrategyTest.java |  2 +-
 .../impl/SimpleSubjectCanonicalizationTest.java    |  8 +++----
 .../StorageBackedAccountLockoutManagerTest.java    |  2 +-
 .../impl/X500SubjectCanonicalizationTest.java      | 18 +++++++--------
 .../spnego/impl/SPNEGOAuthnControllerTest.java     |  2 +-
 .../idp/cas/flow/impl/TestContextBuilder.java      |  4 ++--
 .../idp/flows/admin/resolvertest-flow.xml          |  2 +-
 .../idp/test/flows/SetupForResolver.java           |  4 ++--
 .../test/flows/c14n/actions/SetupForSAML1C14N.java |  2 +-
 .../test/flows/c14n/actions/SetupForSAML2C14N.java |  2 +-
 .../idp/test/flows/c14n/actions/TestAfterC14N.java |  2 +-
 .../idp/test/flows/mapper/SpoofSAMLMessage.java    |  4 ++--
 .../test/flows/saml2/AbstractSAML2SSOFlowTest.java |  6 ++---
 .../impl/AbstractAttributeReleaseActionTest.java   |  2 +-
 .../impl/AttributeValueLookupFunctionTest.java     |  6 ++---
 .../logic/impl/FlowIdLookupFunctionTest.java       |  4 ++--
 .../idp/profile/AbstractProfileAction.java         |  2 +-
 .../WebFlowCurrentEventLookupFunction.java         |  2 +-
 .../impl/InitializeProfileRequestContext.java      |  2 +-
 .../profile/impl/MetadataQueryRequestDecoder.java  |  4 ++--
 .../idp/profile/impl/ResolveAttributes.java        |  2 +-
 .../profile/impl/ResolverTestRequestDecoder.java   |  2 +-
 .../idp/profile/audit/impl/WriteAuditLogTest.java  |  4 ++--
 .../SpringStatusMessageLookupFunctionTest.java     |  2 +-
 .../profile/impl/ExtractSubjectFromRequest.java    |  4 ++--
 .../impl/InitializeOutboundMessageContext.java     |  8 +++----
 .../InitializeOutboundMessageContextForError.java  |  4 ++--
 .../impl/PopulateBindingAndEndpointContexts.java   |  2 +-
 .../PopulateInboundMessageContextWithSAMLSelf.java |  2 +-
 .../impl/IdPInitiatedSSORequestMessageDecoder.java |  6 ++---
 .../impl/IdPInitiatedSSORequestMessageDecoder.java |  2 +-
 .../saml/saml2/profile/impl/SOAPLogoutRequest.java |  2 +-
 .../profile/impl/ValidateSAMLAuthentication.java   |  6 ++---
 .../session/impl/PrepareInboundMessageContext.java |  2 +-
 .../impl/tests/FinalizeAuthenticationTest.java     | 24 ++++++++++----------
 .../profile/impl/tests/FilterAttributesTest.java   | 14 ++++++------
 .../profile/impl/tests/ResolveAttributesTest.java  | 10 ++++-----
 ...uteSourcedSAML1NameIdentifierGeneratorTest.java | 12 +++++-----
 .../AttributeSourcedSAML2NameIDGeneratorTest.java  | 12 +++++-----
 .../impl/CryptoTransientNameIDDecoderTest.java     |  4 ++--
 .../CryptoTransientNameIdentifierDecoderTest.java  |  4 ++--
 ...oTransientSAML1NameIdentifierGeneratorTest.java |  4 ++--
 .../CryptoTransientSAML2NameIDGeneratorTest.java   |  4 ++--
 .../nameid/impl/NameIDCanonicalizationTest.java    |  2 +-
 .../impl/NameIdentifierCanonicalizationTest.java   |  2 +-
 .../impl/PersistentSAML2NameIDGeneratorTest.java   | 16 ++++++-------
 .../nameid/impl/StoredPersistentIdDecoderTest.java | 22 +++++++++---------
 ...dTransientSAML1NameIdentifierGeneratorTest.java |  4 ++--
 .../StoredTransientSAML2NameIDGeneratorTest.java   |  4 ++--
 .../idp/saml/nameid/impl/TransientDecoderTest.java |  4 ++--
 .../DefaultNameIdentifierFormatStrategyTest.java   |  2 +-
 .../FinalizeSAMLSubjectCanonicalizationTest.java   |  4 ++--
 .../impl/InitializeAuthenticationContextTest.java  |  2 +-
 ...itializeOutboundMessageContextForErrorTest.java |  4 ++--
 .../impl/InitializeOutboundMessageContextTest.java |  4 ++--
 ...tializeRelyingPartyContextFromSAMLPeerTest.java |  2 +-
 .../PopulateBindingAndEndpointContextsTest.java    | 26 +++++++++++-----------
 .../AddAuthenticationStatementToAssertionTest.java | 10 ++++-----
 .../FilterByQueriedAttributeDesignatorsTest.java   | 10 ++++-----
 .../IdPInitiatedSSORequestMessageDecoderTest.java  |  6 ++---
 .../profile/impl/SAML1ActionTestingSupport.java    |  2 +-
 ...ultAuthenticationMethodsLookupFunctionTest.java |  6 ++---
 .../tests/ProxyRestrictionLookupFunctionTest.java  |  2 +-
 .../saml2/profile/impl/AddAuthnRequestTest.java    |  8 +++----
 .../impl/AddAuthnStatementToAssertionTest.java     | 16 ++++++-------
 .../impl/EnforceDisallowedSSOFeaturesTest.java     |  2 +-
 .../impl/FilterByQueriedAttributesTest.java        | 10 ++++-----
 .../IdPInitiatedSSORequestMessageDecoderTest.java  |  6 ++---
 .../ProcessAssertionsForAuthenticationTest.java    |  2 +-
 .../profile/impl/ProcessLogoutRequestTest.java     |  2 +-
 .../impl/ProcessRequestedAuthnContextTest.java     |  4 ++--
 .../profile/impl/SAML2ActionTestingSupport.java    |  2 +-
 .../impl/PrepareInboundMessageContextTest.java     |  2 +-
 .../PopulateMultiRPContextFromLogoutContext.java   |  2 +-
 .../idp/session/impl/DestroySessionsTest.java      | 18 +++++++--------
 .../idp/session/impl/DetectIdentitySwitchTest.java |  6 ++---
 .../UpdateSessionWithAuthenticationResultTest.java | 14 ++++++------
 .../impl/UpdateSessionWithSPSessionTest.java       |  4 ++--
 .../idp/profile/testing/RequestContextBuilder.java |  2 +-
 .../idp/saml/impl/testing/TestSources.java         |  4 ++--
 109 files changed, 293 insertions(+), 293 deletions(-)

diff --git a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
index ca092aa6f..e88af670f 100644
--- a/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
+++ b/idp-admin-impl/src/main/java/net/shibboleth/idp/admin/impl/InitializeAdministrativeProfileContextTree.java
@@ -133,7 +133,7 @@ public class InitializeAdministrativeProfileContextTree extends AbstractProfileA
         rpCtx.setRelyingPartyId(descriptor.getId());
         rpCtx.setProfileConfig(descriptor);
         
-        final RelyingPartyUIContext uiCtx = rpCtx.getOrCreateSubcontext(RelyingPartyUIContext.class);
+        final RelyingPartyUIContext uiCtx = rpCtx.ensureSubcontext(RelyingPartyUIContext.class);
         uiCtx.setRPUInfo(descriptor.getUIInfo());
         final NonnullSupplier<HttpServletRequest> supplier = getHttpServletRequestSupplier();
         assert supplier != null;
diff --git a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
index 3a4d5a214..7b6a3df52 100644
--- a/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
+++ b/idp-authn-api/src/main/java/net/shibboleth/idp/authn/AbstractValidationAction.java
@@ -494,7 +494,7 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
             @Nonnull final AuthenticationContext authenticationContext, @Nonnull final Exception e,
             @Nonnull @NotEmpty final String eventId) {
 
-        authenticationContext.getOrCreateSubcontext(AuthenticationErrorContext.class).getExceptions().add(e);
+        authenticationContext.ensureSubcontext(AuthenticationErrorContext.class).getExceptions().add(e);
 
         handleError(profileRequestContext, authenticationContext, e.getMessage(), eventId);
     }
@@ -528,7 +528,7 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
                 if (Iterables.any(entry.getValue(), checker::test)) {
                     final String key = entry.getKey();
                     assert key!=null;
-                    authenticationContext.getOrCreateSubcontext(
+                    authenticationContext.ensureSubcontext(
                             AuthenticationErrorContext.class).getClassifiedErrors().add(key);
                     if (!eventSet) {
                         eventSet = true;
@@ -539,7 +539,7 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
         }
         
         if (!eventSet) {
-            authenticationContext.getOrCreateSubcontext(
+            authenticationContext.ensureSubcontext(
                     AuthenticationErrorContext.class).getClassifiedErrors().add(eventId);
             ActionSupport.buildEvent(profileRequestContext, eventId);
         }
@@ -574,7 +574,7 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
                 if (Iterables.any(entry.getValue(), checker::test)) {
                     final String key = entry.getKey();
                     assert key!=null;
-                    authenticationContext.getOrCreateSubcontext(
+                    authenticationContext.ensureSubcontext(
                             AuthenticationWarningContext.class).getClassifiedWarnings().add(key);
                     if (!eventSet) {
                         eventSet = true;
@@ -585,7 +585,7 @@ public abstract class AbstractValidationAction extends AbstractAuthenticationAct
         }
         
         if (!eventSet) {
-            authenticationContext.getOrCreateSubcontext(
+            authenticationContext.ensureSubcontext(
                     AuthenticationWarningContext.class).getClassifiedWarnings().add(eventId);
             ActionSupport.buildEvent(profileRequestContext, eventId);
         }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
index 106716f32..76232d22e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoAuthAPI.java
@@ -335,7 +335,7 @@ public class ValidateDuoAuthAPI extends AbstractAuditingValidationAction {
         super.buildAuthenticationResult(profileRequestContext, authenticationContext);
 
         // Bypass c14n. We already operate on a canonical name, so just re-confirm it.
-        profileRequestContext.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName(username);
+        profileRequestContext.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName(username);
     }
 
     /** {@inheritDoc} */
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
index 81de852af..0ec7d6876 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/duo/impl/ValidateDuoWebResponse.java
@@ -230,7 +230,7 @@ public class ValidateDuoWebResponse extends AbstractAuditingValidationAction {
         super.buildAuthenticationResult(profileRequestContext, authenticationContext);
         
         // Bypass c14n. We already operate on a canonical name, so just re-confirm it.
-        profileRequestContext.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName(username);
+        profileRequestContext.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName(username);
     }
 
     /** {@inheritDoc} */
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
index f85896589..169a3bd95 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/DoLockoutManagerOperation.java
@@ -168,7 +168,7 @@ public class DoLockoutManagerOperation extends AbstractProfileAction {
     /** {@inheritDoc} */
     @Override protected void doExecute(final @Nonnull ProfileRequestContext profileRequestContext) {
 
-        profileRequestContext.getOrCreateSubcontext(LockoutManagerContext.class).setKey(key);
+        profileRequestContext.ensureSubcontext(LockoutManagerContext.class).setKey(key);
         
         try {
             final HttpServletRequest request = getHttpServletRequest();
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
index 930e53e9d..a984e0c68 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExternalAuthenticationImpl.java
@@ -145,7 +145,7 @@ public class ExternalAuthenticationImpl extends ExternalAuthentication {
         
         attr = request.getAttribute(ATTRIBUTES_KEY);
         if (attr != null && attr instanceof Collection<?>) {
-            final AttributeContext ac = extContext.getOrCreateSubcontext(AttributeContext.class);
+            final AttributeContext ac = extContext.ensureSubcontext(AttributeContext.class);
             ac.setUnfilteredIdPAttributes(
                     (Collection<IdPAttribute>) attr);
             ac.setIdPAttributes(
@@ -175,7 +175,7 @@ public class ExternalAuthenticationImpl extends ExternalAuthentication {
         attr = request.getAttribute(REVOKECONSENT_KEY);
         if (attr != null && attr instanceof Boolean && ((Boolean) attr).booleanValue()) {
             final ConsentManagementContext consentCtx =
-                    profileRequestContext.getOrCreateSubcontext(ConsentManagementContext.class);
+                    profileRequestContext.ensureSubcontext(ConsentManagementContext.class);
             consentCtx.setRevokeConsent(true);
         }
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractRemoteUser.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractRemoteUser.java
index a332cfded..d235301ea 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractRemoteUser.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractRemoteUser.java
@@ -128,7 +128,7 @@ public class ExtractRemoteUser extends AbstractExtractionAction {
             username = request.getRemoteUser();
             if (username != null && !username.isEmpty()) {
                 log.debug("{} User identity extracted from REMOTE_USER: {}", getLogPrefix(), username);
-                authenticationContext.getOrCreateSubcontext(UsernameContext.class).setUsername(
+                authenticationContext.ensureSubcontext(UsernameContext.class).setUsername(
                         applyTransforms(username));
                 return;
             }
@@ -138,7 +138,7 @@ public class ExtractRemoteUser extends AbstractExtractionAction {
             final Object attr = request.getAttribute(s);
             if (attr != null && !attr.toString().isEmpty()) {
                 log.debug("{} User identity extracted from attribute {}: {}", getLogPrefix(), s, attr);
-                authenticationContext.getOrCreateSubcontext(UsernameContext.class).setUsername(
+                authenticationContext.ensureSubcontext(UsernameContext.class).setUsername(
                         applyTransforms(attr.toString()));
                 return;
             }
@@ -148,7 +148,7 @@ public class ExtractRemoteUser extends AbstractExtractionAction {
             username = request.getHeader(s);
             if (username != null && !username.isEmpty()) {
                 log.debug("{} User identity extracted from header {}: {}", getLogPrefix(), s, username);
-                authenticationContext.getOrCreateSubcontext(UsernameContext.class).setUsername(
+                authenticationContext.ensureSubcontext(UsernameContext.class).setUsername(
                         applyTransforms(username));
                 return;
             }
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentAddress.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentAddress.java
index 56ae57571..6a27cc400 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentAddress.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentAddress.java
@@ -69,7 +69,7 @@ public class ExtractUserAgentAddress extends AbstractExtractionAction {
             return;
         }
 
-        authenticationContext.getOrCreateSubcontext(UserAgentContext.class).setAddress(
+        authenticationContext.ensureSubcontext(UserAgentContext.class).setAddress(
                 InetAddresses.forString(addressString));
     }
     
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentIdentifier.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentIdentifier.java
index a83365b70..0504db908 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentIdentifier.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUserAgentIdentifier.java
@@ -68,7 +68,7 @@ public class ExtractUserAgentIdentifier extends AbstractExtractionAction {
             return;
         }
 
-        authenticationContext.getOrCreateSubcontext(UserAgentContext.class).setIdentifier(applyTransforms(agent));
+        authenticationContext.ensureSubcontext(UserAgentContext.class).setIdentifier(applyTransforms(agent));
     }
     // CheckStyle: ReturnCount ON
 }
\ No newline at end of file
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromBasicAuth.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromBasicAuth.java
index df9ed522f..fe7c1924e 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromBasicAuth.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromBasicAuth.java
@@ -66,7 +66,7 @@ public class ExtractUsernamePasswordFromBasicAuth extends AbstractExtractionActi
             @Nonnull final AuthenticationContext authenticationContext) {
 
         final UsernamePasswordContext upCtx =
-                authenticationContext.getOrCreateSubcontext(UsernamePasswordContext.class);
+                authenticationContext.ensureSubcontext(UsernamePasswordContext.class);
         upCtx.setUsername(null);
         upCtx.setPassword(null);
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromFormRequest.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromFormRequest.java
index 68e9774a5..0c10c3ca7 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromFormRequest.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromFormRequest.java
@@ -105,7 +105,7 @@ public class ExtractUsernamePasswordFromFormRequest extends AbstractExtractionAc
             @Nonnull final AuthenticationContext authenticationContext) {
 
         final UsernamePasswordContext upCtx =
-                authenticationContext.getOrCreateSubcontext(UsernamePasswordContext.class);
+                authenticationContext.ensureSubcontext(UsernamePasswordContext.class);
         upCtx.setUsername(null);
         upCtx.setPassword(null);
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
index cb4309460..6a94d4990 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ExtractUsernamePasswordFromWSSToken.java
@@ -87,7 +87,7 @@ public class ExtractUsernamePasswordFromWSSToken extends AbstractExtractionActio
             return;
         }
 
-        authenticationContext.getOrCreateSubcontext(UsernamePasswordContext.class)
+        authenticationContext.ensureSubcontext(UsernamePasswordContext.class)
                 .setUsername(usernamePassword.getFirst()).setPassword(usernamePassword.getSecond());
     }
 
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
index 199e8ce2b..c5d4cc0db 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/FinalizeAuthentication.java
@@ -198,7 +198,7 @@ public class FinalizeAuthentication extends AbstractAuthenticationAction {
                 return;
             }
             
-            final SubjectContext sc = profileRequestContext.getOrCreateSubcontext(SubjectContext.class);
+            final SubjectContext sc = profileRequestContext.ensureSubcontext(SubjectContext.class);
             sc.setPrincipalName(canonicalPrincipalName);
             
             log.info("{} Principal {} authenticated", getLogPrefix(), canonicalPrincipalName);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
index d48f9f17b..90793c136 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidator.java
@@ -172,7 +172,7 @@ public class LDAPCredentialValidator extends AbstractUsernamePasswordCredentialV
         }
 
         log.debug("{} Authentication response {}", getLogPrefix(), response);
-        authenticationContext.getOrCreateSubcontext(LDAPResponseContext.class).setAuthenticationResponse(response);
+        authenticationContext.ensureSubcontext(LDAPResponseContext.class).setAuthenticationResponse(response);
         if (response.isSuccess()) {
             log.info("{} Login by '{}' succeeded", getLogPrefix(), username);
             if (response.getAccountState() != null) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
index e0fe26010..bb7b9cc35 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/ValidateExternalAuthentication.java
@@ -353,7 +353,7 @@ public class ValidateExternalAuthentication extends AbstractAuditingValidationAc
             ac.setIdPAttributes(null);
             return;
         }
-        final AttributeFilterContext filterContext = localExtContext.getOrCreateSubcontext(AttributeFilterContext.class);
+        final AttributeFilterContext filterContext = localExtContext.ensureSubcontext(AttributeFilterContext.class);
         
         populateFilterContext(filterContext);
         
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
index cd05b49e7..fbcf60ff4 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/impl/X509AuthServlet.java
@@ -166,7 +166,7 @@ public class X509AuthServlet extends HttpServlet {
             final ProfileRequestContext prc = ExternalAuthentication.getProfileRequestContext(key, httpRequest);
             final AuthenticationContext authnCtx = prc.getSubcontext(AuthenticationContext.class);
             if (authnCtx != null) {
-                final CertificateContext cc = authnCtx.getOrCreateSubcontext(CertificateContext.class);
+                final CertificateContext cc = authnCtx.ensureSubcontext(CertificateContext.class);
                 cc.setCertificate(cert);
                 if (certs.length > 1) {
                     for (int i = 1; i < certs.length; i++) {
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
index e4bdb18ce..36fac02e6 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/AttributeRevocationCondition.java
@@ -171,7 +171,7 @@ public class AttributeRevocationCondition extends AbstractInitializableComponent
         log.debug("Checking revocation for principal name {} for {} result via attribute resolver", principal,
                 input2.getAuthenticationFlowId());
         
-        final ScratchContext context = input.getOrCreateSubcontext(ScratchContext.class);
+        final ScratchContext context = input.ensureSubcontext(ScratchContext.class);
         
         if (!context.getMap().containsKey(getClass())) {
             final AttributeResolutionContext resolutionContext = buildResolutionContext(input, principal);
diff --git a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
index ec662ce6e..288532701 100644
--- a/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
+++ b/idp-authn-impl/src/main/java/net/shibboleth/idp/authn/revocation/impl/RevocationCacheCondition.java
@@ -134,7 +134,7 @@ public class RevocationCacheCondition extends AbstractInitializableComponent
         log.debug("Checking revocation for principal name {} for {} result", principal,
                 input2.getAuthenticationFlowId());
         
-        final ScratchContext context = input.getOrCreateSubcontext(ScratchContext.class);
+        final ScratchContext context = input.ensureSubcontext(ScratchContext.class);
         if (!context.getMap().containsKey(getClass())) {
             try {
                 final String principalRecord = revocationCache.getRevocationRecord(REVOCATION_CONTEXT,
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/ContextDerivedAttributeDefinitionParserTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/ContextDerivedAttributeDefinitionParserTest.java
index f42a49f3c..64b974450 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/ContextDerivedAttributeDefinitionParserTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/ContextDerivedAttributeDefinitionParserTest.java
@@ -73,9 +73,9 @@ public class ContextDerivedAttributeDefinitionParserTest extends BaseAttributeDe
         final BaseContext parent = ctx.getParent();
         assert parent != null;
         if (c14n) {
-            parent.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+            parent.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         } else {
-            final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+            final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
             final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
             authnResults.put("one", new AuthenticationResult("1", subject));
         }
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDataConnectorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDataConnectorTest.java
index d36066052..2a7b8f78c 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDataConnectorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDataConnectorTest.java
@@ -72,7 +72,7 @@ public class SubjectDataConnectorTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
         final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
         final Subject subject = new Subject();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr));
@@ -113,7 +113,7 @@ public class SubjectDataConnectorTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectCanonicalizationContext sc = parent.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = parent.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr));
         subject.getPrincipals().add(new AuthenticationMethodPrincipal(SIMPLE_VALUE + "2"));
@@ -149,7 +149,7 @@ public class SubjectDataConnectorTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
         final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
         final Subject subject = new Subject();
         subject.getPrincipals().add(new AuthenticationMethodPrincipal(SIMPLE_VALUE + "2"));
@@ -178,7 +178,7 @@ public class SubjectDataConnectorTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
         final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
         final Subject subject = new Subject();
         subject.getPrincipals().add(new AuthenticationMethodPrincipal(SIMPLE_VALUE + "2"));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
index 2d737e544..74a837f5f 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/context/impl/SubjectDerivedAttributeValuesFunctionTest.java
@@ -109,7 +109,7 @@ public class SubjectDerivedAttributeValuesFunctionTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
         final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
         final Subject subject = new Subject();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr));
@@ -192,7 +192,7 @@ public class SubjectDerivedAttributeValuesFunctionTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectCanonicalizationContext sc = parent.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = parent.ensureSubcontext(SubjectCanonicalizationContext.class);
         sc.setSubject(subject);
         
         final List<IdPAttributeValue> foo =  doResolve(defn, ctx);
@@ -226,7 +226,7 @@ public class SubjectDerivedAttributeValuesFunctionTest {
                         TestSources.SP_ENTITY_ID);
         final BaseContext parent = ctx.getParent();
         assert parent != null;
-        final SubjectContext sc = parent.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = parent.ensureSubcontext(SubjectContext.class);
         final Map<String, AuthenticationResult> authnResults = sc.getAuthenticationResults();
         final Subject subject = new Subject();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
index 46a6718d0..822780fac 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/AttributeSourcedSubjectCanonicalizationTest.java
@@ -69,7 +69,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
 
         Subject subject = new Subject();
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -83,7 +83,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         action.initialize();
         
         Subject subject = new Subject();
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -98,10 +98,10 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
         inputAttribute.setValues(Collections.singletonList(new StringAttributeValue("foo")));
         
-        final SubjectCanonicalizationContext sc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         sc.setSubject(new Subject());
         
-        sc.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(inputAttribute));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(inputAttribute));
         
         final Event event = action.execute(src);
         
@@ -115,7 +115,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
         inputAttribute.setValues(Collections.singletonList(new StringAttributeValue("foo")));
-        final SubjectCanonicalizationContext sc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(inputAttribute));
@@ -132,7 +132,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         
         final IdPAttribute inputAttribute = new IdPAttribute("attr2");
         inputAttribute.setValues(Collections.singletonList(new ScopedStringAttributeValue("foo", "scope")));
-        final SubjectCanonicalizationContext sc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(inputAttribute));
@@ -153,12 +153,12 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         final IdPAttribute attr2bar = new IdPAttribute("attr2");
         attr2bar.setValues(Collections.singletonList(new StringAttributeValue("bar")));
 
-        final SubjectCanonicalizationContext sc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2));
         
-        sc.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2bar));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2bar));
         
         Event event = action.execute(src);
         
@@ -167,7 +167,7 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
 
         subject.getPrincipals().clear();
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2bar));
-        sc.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr2));
 
         event = action.execute(src);
         
@@ -185,12 +185,12 @@ public class AttributeSourcedSubjectCanonicalizationTest extends BaseAuthenticat
         final IdPAttribute attr1 = new IdPAttribute("attr1");
         attr1.setValues(Collections.singletonList(new StringAttributeValue("foo")));
 
-        final SubjectCanonicalizationContext sc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext sc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         sc.setSubject(subject);
         subject.getPrincipals().add(new IdPAttributePrincipal(attr2));
         
-        sc.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr1));
+        sc.ensureSubcontext(AttributeContext.class).setIdPAttributes(Collections.singleton(attr1));
         
         final Event event = action.execute(src);
         
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializerTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializerTest.java
index 473e66f66..8426fe3cc 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializerTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/DefaultAuthenticationResultSerializerTest.java
@@ -511,7 +511,7 @@ public class DefaultAuthenticationResultSerializerTest {
     
     @Nonnull private ProfileRequestContext getProfileRequestContext(@Nonnull final List<AuthenticationFlowDescriptor> flows) {
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
-        final AuthenticationContext ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext ac = prc.ensureSubcontext(AuthenticationContext.class);
         for (final AuthenticationFlowDescriptor flow : flows) {
             ac.getAvailableFlows().put(flow.getId(), flow);
         }
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
index 33316defa..89644db4c 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/HTPasswdCredentialValidatorTest.java
@@ -117,7 +117,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        final RequestedPrincipalContext rpc = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        final RequestedPrincipalContext rpc = ac.ensureSubcontext(RequestedPrincipalContext.class);
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
@@ -324,7 +324,7 @@ public class HTPasswdCredentialValidatorTest extends BaseAuthenticationContextTe
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        final RequestedPrincipalContext rpc = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        final RequestedPrincipalContext rpc = ac.ensureSubcontext(RequestedPrincipalContext.class);
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
index 24f2b7e79..7607d6782 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/InitializeRequestedPrincipalContextTest.java
@@ -71,8 +71,8 @@ public class InitializeRequestedPrincipalContextTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testNoReplace() throws Exception {
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
-        authCtx.getOrCreateSubcontext(RequestedPrincipalContext.class).setOperator("foo");
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
+        authCtx.ensureSubcontext(RequestedPrincipalContext.class).setOperator("foo");
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -88,7 +88,7 @@ public class InitializeRequestedPrincipalContextTest {
      */
     @Test public void testNoRelyingPartyContext() throws Exception {
         prc.removeSubcontext(RelyingPartyContext.class);
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, IdPEventIds.INVALID_RELYING_PARTY_CTX);
@@ -102,7 +102,7 @@ public class InitializeRequestedPrincipalContextTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testNoProfileConfiguration() throws Exception {
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, IdPEventIds.INVALID_PROFILE_CONFIG);
@@ -118,7 +118,7 @@ public class InitializeRequestedPrincipalContextTest {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
                 Collections.<ProfileConfiguration>singleton(new MockProfileConfiguration("mock"))).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, IdPEventIds.INVALID_PROFILE_CONFIG);
@@ -137,9 +137,9 @@ public class InitializeRequestedPrincipalContextTest {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
                 Collections.<ProfileConfiguration>singleton(mock)).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
         
-        authCtx.getOrCreateSubcontext(RequestedPrincipalContext.class).setOperator("foo");
+        authCtx.ensureSubcontext(RequestedPrincipalContext.class).setOperator("foo");
 
         action = new InitializeRequestedPrincipalContext();
         action.setReplaceExistingContext(true);
@@ -164,9 +164,9 @@ public class InitializeRequestedPrincipalContextTest {
         src = new RequestContextBuilder().setRelyingPartyProfileConfigurations(
                 Collections.<ProfileConfiguration>singleton(mock)).buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        final AuthenticationContext authCtx = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = prc.ensureSubcontext(AuthenticationContext.class);
 
-        authCtx.getOrCreateSubcontext(RequestedPrincipalContext.class).setOperator("foo");
+        authCtx.ensureSubcontext(RequestedPrincipalContext.class).setOperator("foo");
 
         action = new InitializeRequestedPrincipalContext();
         action.setReplaceExistingContext(true);
@@ -174,7 +174,7 @@ public class InitializeRequestedPrincipalContextTest {
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
-        RequestedPrincipalContext rpCtx = authCtx.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        RequestedPrincipalContext rpCtx = authCtx.ensureSubcontext(RequestedPrincipalContext.class);
         assert rpCtx != null;
         Assert.assertEquals(rpCtx.getOperator(), "exact");
         Assert.assertEquals(rpCtx.getRequestedPrincipals().size(), 1);
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
index 71757fa97..57f4b6a26 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/JAASCredentialValidatorTest.java
@@ -137,7 +137,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
-        ac.getOrCreateSubcontext(UsernamePasswordContext.class);
+        ac.ensureSubcontext(UsernamePasswordContext.class);
         
         validator.initialize();
         action.initialize();
@@ -200,7 +200,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        final RequestedPrincipalContext rpc = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        final RequestedPrincipalContext rpc = ac.ensureSubcontext(RequestedPrincipalContext.class);
         assert rpc!= null;
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
@@ -229,7 +229,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
-        ac.getOrCreateSubcontext(UsernamePasswordContext.class);
+        ac.ensureSubcontext(UsernamePasswordContext.class);
         
         validator.setMatchExpression(Pattern.compile("foo.+"));
         validator.initialize();
@@ -349,7 +349,7 @@ public class JAASCredentialValidatorTest extends BaseAuthenticationContextTest {
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
         
-        final RequestedPrincipalContext rpc = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        final RequestedPrincipalContext rpc = ac.ensureSubcontext(RequestedPrincipalContext.class);
         rpc.getPrincipalEvalPredicateFactoryRegistry().register(
                 TestPrincipal.class, "exact", new ExactPrincipalEvalPredicateFactory());
         rpc.setOperator("exact");
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
index 09656f680..0ae46a94f 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/LDAPCredentialValidatorTest.java
@@ -165,7 +165,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
-        ac.getOrCreateSubcontext(UsernamePasswordContext.class);
+        ac.ensureSubcontext(UsernamePasswordContext.class);
         
         validator.setAuthenticator(authenticator);
         validator.initialize();
@@ -188,7 +188,7 @@ public class LDAPCredentialValidatorTest extends BaseAuthenticationContextTest {
         AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(authenticationFlows.get(0));
-        ac.getOrCreateSubcontext(UsernamePasswordContext.class);
+        ac.ensureSubcontext(UsernamePasswordContext.class);
         
         validator.setAuthenticator(authenticator);
         validator.setMatchExpression(Pattern.compile("foo.+"));
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
index 0ec0b6836..19c0f7b56 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateMultiFactorAuthenticationContextTest.java
@@ -55,7 +55,7 @@ public class PopulateMultiFactorAuthenticationContextTest {
     @BeforeMethod public void setUp() throws ComponentInitializationException {
         rc = new RequestContextBuilder().buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(rc);
-        final AuthenticationContext authCtx = ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authCtx = ac = prc.ensureSubcontext(AuthenticationContext.class);
         final AuthenticationFlowDescriptor flow =new AuthenticationFlowDescriptor();
         authCtx.setAttemptedFlow(flow);
         flow.setId("authn/MFA");
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateSubjectCanonicalizationContextTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateSubjectCanonicalizationContextTest.java
index 2c4d9bc48..a42e51263 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateSubjectCanonicalizationContextTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/PopulateSubjectCanonicalizationContextTest.java
@@ -45,7 +45,7 @@ public class PopulateSubjectCanonicalizationContextTest {
     @BeforeMethod public void setUp() throws Exception {        
         src = new RequestContextBuilder().buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(new Subject());
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(new Subject());
 
         c14nFlows = List.of(new SubjectCanonicalizationFlowDescriptor(),
                 new SubjectCanonicalizationFlowDescriptor(), new SubjectCanonicalizationFlowDescriptor());
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/RelyingPartyMapJAASLoginConfigStrategyTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/RelyingPartyMapJAASLoginConfigStrategyTest.java
index e025b5692..758760d4a 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/RelyingPartyMapJAASLoginConfigStrategyTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/RelyingPartyMapJAASLoginConfigStrategyTest.java
@@ -53,7 +53,7 @@ public class RelyingPartyMapJAASLoginConfigStrategyTest {
     public void setUp() {
         profileRequestContext = new ProfileRequestContext();
 
-        relyingPartyContext = profileRequestContext.getOrCreateSubcontext(RelyingPartyContext.class);
+        relyingPartyContext = profileRequestContext.ensureSubcontext(RelyingPartyContext.class);
         relyingPartyContext.setRelyingPartyId(entityID);
 
         rpMap = new HashMap<>();
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalizationTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalizationTest.java
index 71fc25856..a2109353d 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalizationTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/SimpleSubjectCanonicalizationTest.java
@@ -55,7 +55,7 @@ public class SimpleSubjectCanonicalizationTest extends BaseAuthenticationContext
 
     @Test public void testNoPrincipal() {
         Subject subject = new Subject();
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -69,7 +69,7 @@ public class SimpleSubjectCanonicalizationTest extends BaseAuthenticationContext
         Subject subject = new Subject();
         subject.getPrincipals().add(new UsernamePrincipal("foo"));
         subject.getPrincipals().add(new UsernamePrincipal("bar"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -82,7 +82,7 @@ public class SimpleSubjectCanonicalizationTest extends BaseAuthenticationContext
     @Test public void testSuccess() {
         Subject subject = new Subject();
         subject.getPrincipals().add(new UsernamePrincipal("foo"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -95,7 +95,7 @@ public class SimpleSubjectCanonicalizationTest extends BaseAuthenticationContext
     @Test public void testTransform() {
         Subject subject = new Subject();
         subject.getPrincipals().add(new UsernamePrincipal("foo at osu.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManagerTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManagerTest.java
index 9cf1cb76f..4c9acd476 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManagerTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/StorageBackedAccountLockoutManagerTest.java
@@ -61,7 +61,7 @@ public class StorageBackedAccountLockoutManagerTest extends BaseAuthenticationCo
         ((MockHttpServletRequest) src.getExternalContext().getNativeRequest()).setRemoteAddr("192.168.1.1");
         final AuthenticationContext authCtx = prc.getSubcontext(AuthenticationContext.class);
         assert authCtx != null;
-        authCtx.getOrCreateSubcontext(UsernamePasswordContext.class).setUsername("jdoe");
+        authCtx.ensureSubcontext(UsernamePasswordContext.class).setUsername("jdoe");
     }
 
     @Test public void noKey() { 
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalizationTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalizationTest.java
index 6ccc4bda2..fe30870f7 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalizationTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/impl/X500SubjectCanonicalizationTest.java
@@ -56,7 +56,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
 
     @Test public void testNoPrincipal() {
         final Subject subject = new Subject();
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -70,7 +70,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("CN=foo"));
         subject.getPrincipals().add(new X500Principal("CN=bar"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -83,7 +83,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testNone() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("CN=foo at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -95,7 +95,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testSuccess() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("EMAILADDRESS=foo at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -108,7 +108,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testComplex() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("EMAILADDRESS=foo at example.edu\\, EMAILADDRESS=bar at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -121,7 +121,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testTransform() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("EMAILADDRESS=foo at osu.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -134,7 +134,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testMultipleTypes() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("EMAILADDRESS=foo at example.edu, 0.9.2342.19200300.100.1.1=bar at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -147,7 +147,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testMultipleValues() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("EMAILADDRESS=foo at example.edu, EMAILADDRESS=bar at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
@@ -160,7 +160,7 @@ public class X500SubjectCanonicalizationTest extends BaseAuthenticationContextTe
     @Test public void testSecondary() {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new X500Principal("0.9.2342.19200300.100.1.1=bar at example.edu"));
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setSubject(subject);
         
         final Event event = action.execute(src);
         
diff --git a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
index 6cdc36c24..f86c9d025 100644
--- a/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
+++ b/idp-authn-impl/src/test/java/net/shibboleth/idp/authn/spnego/impl/SPNEGOAuthnControllerTest.java
@@ -452,7 +452,7 @@ public class SPNEGOAuthnControllerTest {
                 (ProfileRequestContext) rc.getConversationScope().get(ProfileRequestContext.BINDING_KEY); 
         ((MockServletContext) rc.getExternalContext().getNativeContext()).setAttribute(ExternalAuthentication.SWF_KEY, prc);
         
-        final AuthenticationContext ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext ac = prc.ensureSubcontext(AuthenticationContext.class);
         assert ac != null;
         ac.setAttemptedFlow(new AuthenticationFlowDescriptor());
         
diff --git a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/TestContextBuilder.java b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/TestContextBuilder.java
index 92b65f319..bccc262d2 100644
--- a/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/TestContextBuilder.java
+++ b/idp-cas-impl/src/test/java/net/shibboleth/idp/cas/flow/impl/TestContextBuilder.java
@@ -84,7 +84,7 @@ public class TestContextBuilder {
     }
 
     @Nonnull public TestContextBuilder addTicketContext(@Nonnull final Ticket ticket) {
-        final ProtocolContext<?,?> context = profileRequestContext.getOrCreateSubcontext(ProtocolContext.class);
+        final ProtocolContext<?,?> context = profileRequestContext.ensureSubcontext(ProtocolContext.class);
         context.addSubcontext(new TicketContext(ticket));
         return this;
     }
@@ -100,7 +100,7 @@ public class TestContextBuilder {
     }
 
     @Nonnull public TestContextBuilder addServiceContext(@Nonnull final Service service) {
-        final ProtocolContext<?,?> context = profileRequestContext.getOrCreateSubcontext(ProtocolContext.class);
+        final ProtocolContext<?,?> context = profileRequestContext.ensureSubcontext(ProtocolContext.class);
         context.addSubcontext(new ServiceContext(service));
         return this;
     }
diff --git a/idp-conf-impl/src/main/resources/net/shibboleth/idp/flows/admin/resolvertest-flow.xml b/idp-conf-impl/src/main/resources/net/shibboleth/idp/flows/admin/resolvertest-flow.xml
index 750503a3b..0bd539096 100644
--- a/idp-conf-impl/src/main/resources/net/shibboleth/idp/flows/admin/resolvertest-flow.xml
+++ b/idp-conf-impl/src/main/resources/net/shibboleth/idp/flows/admin/resolvertest-flow.xml
@@ -99,7 +99,7 @@
             <evaluate expression="WriteAuditLog" />
             <evaluate expression="environment" result="requestScope.environment" />
             <evaluate expression="opensamlProfileRequestContext" result="requestScope.profileRequestContext" />
-            <evaluate expression="opensamlProfileRequestContext.getOrCreateSubcontext(T(net.shibboleth.profile.context.RelyingPartyContext)).getSubcontext(T(net.shibboleth.idp.attribute.context.AttributeContext))" result="requestScope.attributeContext" />
+            <evaluate expression="opensamlProfileRequestContext.ensureSubcontext(T(net.shibboleth.profile.context.RelyingPartyContext)).getSubcontext(T(net.shibboleth.idp.attribute.context.AttributeContext))" result="requestScope.attributeContext" />
             <evaluate expression="T(org.opensaml.core.xml.util.XMLObjectSupport)" result="requestScope.XMLObjectSupport" />
             <evaluate expression="T(net.shibboleth.shared.xml.SerializeSupport)" result="requestScope.SerializeSupport" />
             <evaluate expression="T(net.shibboleth.shared.codec.HTMLEncoder)" result="requestScope.encoder" />
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/SetupForResolver.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/SetupForResolver.java
index cb88ee2ce..11100dd12 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/SetupForResolver.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/SetupForResolver.java
@@ -37,10 +37,10 @@ public class SetupForResolver extends AbstractProfileAction {
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
 
-        final SubjectContext sc = profileRequestContext.getOrCreateSubcontext(SubjectContext.class);
+        final SubjectContext sc = profileRequestContext.ensureSubcontext(SubjectContext.class);
         sc.setPrincipalName("PETER_THE_PRINCIPAL");
         
-        final RelyingPartyContext rpContext = profileRequestContext.getOrCreateSubcontext(RelyingPartyContext.class);
+        final RelyingPartyContext rpContext = profileRequestContext.ensureSubcontext(RelyingPartyContext.class);
         rpContext.setRelyingPartyId(AbstractFlowTest.SP_ENTITY_ID);
         
         final BasicRelyingPartyConfiguration config = new BasicRelyingPartyConfiguration();
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
index cd57607f7..f57a0c3a4 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML1C14N.java
@@ -120,7 +120,7 @@ public class SetupForSAML1C14N extends AbstractProfileAction {
         sub.getPrincipals().add(nidp);
 
         final SubjectCanonicalizationContext scc =
-                profileRequestContext.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+                profileRequestContext.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setSubject(sub);
         scc.setRequesterId(rpc.getRelyingPartyId());
         final RelyingPartyConfiguration rpConfig = (RelyingPartyConfiguration) rpc.getConfiguration();
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
index a5fb0764f..a50d08b85 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/SetupForSAML2C14N.java
@@ -121,7 +121,7 @@ public class SetupForSAML2C14N extends AbstractProfileAction {
         sub.getPrincipals().add(nidp);
 
         final SubjectCanonicalizationContext scc =
-                profileRequestContext.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+                profileRequestContext.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setSubject(sub);
         scc.setRequesterId(rpc.getRelyingPartyId());
         final RelyingPartyConfiguration rpConfig = (RelyingPartyConfiguration) rpc.getConfiguration();
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/TestAfterC14N.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/TestAfterC14N.java
index 9e78743dd..4c62d39e7 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/TestAfterC14N.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/c14n/actions/TestAfterC14N.java
@@ -37,7 +37,7 @@ public class TestAfterC14N extends AbstractProfileAction {
         
         SubjectCanonicalizationContext scc = profileRequestContext.getSubcontext(SubjectCanonicalizationContext.class);
         assert scc != null;
-        SubjectContext sc = profileRequestContext.getOrCreateSubcontext(SubjectContext.class);
+        SubjectContext sc = profileRequestContext.ensureSubcontext(SubjectContext.class);
         
         Assert.assertEquals(sc.getPrincipalName(), scc.getPrincipalName());
         
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/mapper/SpoofSAMLMessage.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/mapper/SpoofSAMLMessage.java
index fa46a9cd8..24dcdbedd 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/mapper/SpoofSAMLMessage.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/mapper/SpoofSAMLMessage.java
@@ -36,10 +36,10 @@ public class SpoofSAMLMessage extends AbstractProfileAction {
 
         final MessageContext mc = new MessageContext();
         profileRequestContext.setInboundMessageContext(mc);
-        SAMLPeerEntityContext spec = mc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext spec = mc.ensureSubcontext(SAMLPeerEntityContext.class);
         spec.setEntityId("https://sp.example.org");
         spec.setRole(SPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        mc.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML20P_NS);
+        mc.ensureSubcontext(SAMLProtocolContext.class).setProtocol(SAMLConstants.SAML20P_NS);
                 
     }
     
diff --git a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
index 5d28de885..841571135 100644
--- a/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
+++ b/idp-conf/src/test/java/net/shibboleth/idp/test/flows/saml2/AbstractSAML2SSOFlowTest.java
@@ -234,16 +234,16 @@ public abstract class AbstractSAML2SSOFlowTest extends AbstractSAML2FlowTest {
         final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(authnRequest);
 
-        SAMLPeerEntityContext peerContext = messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext peerContext = messageContext.ensureSubcontext(SAMLPeerEntityContext.class);
         peerContext.setEntityId(AbstractFlowTest.IDP_ENTITY_ID);
 
-        SAMLEndpointContext endpointContext = peerContext.getOrCreateSubcontext(SAMLEndpointContext.class);
+        SAMLEndpointContext endpointContext = peerContext.ensureSubcontext(SAMLEndpointContext.class);
         endpointContext.setEndpoint(buildIdpSsoEndpoint(bindingUri, authnRequest.getDestination()));
 
         SignatureSigningParameters signingParameters = new SignatureSigningParameters();
         signingParameters.setSigningCredential(spCredential);
         SecurityParametersContext secParamsContext =
-                messageContext.getOrCreateSubcontext(SecurityParametersContext.class);
+                messageContext.ensureSubcontext(SecurityParametersContext.class);
         secParamsContext.setSignatureSigningParameters(signingParameters);
 
         return messageContext;
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseActionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseActionTest.java
index f08f4374a..e161da4ce 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseActionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/flow/ar/impl/AbstractAttributeReleaseActionTest.java
@@ -37,7 +37,7 @@ public abstract class AbstractAttributeReleaseActionTest extends AbstractConsent
     @BeforeMethod public void setUpAttributeReleaseAction() throws Exception {
         final AttributeContext attributeCtx = new AttributeContext();
         attributeCtx.setIdPAttributes(ConsentTestingSupport.newAttributeMap().values());
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).addSubcontext(attributeCtx);
+        prc.ensureSubcontext(RelyingPartyContext.class).addSubcontext(attributeCtx);
 
         prc.addSubcontext(new AttributeReleaseContext(), true);
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
index 34d4ec028..ff35118de 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/AttributeValueLookupFunctionTest.java
@@ -63,7 +63,7 @@ public class AttributeValueLookupFunctionTest {
         unfilteredAttributes.put(attribute4.getId(), attribute4);
         attributeCtx.setUnfilteredIdPAttributes(unfilteredAttributes.values());
         
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).addSubcontext(attributeCtx);
+        prc.ensureSubcontext(RelyingPartyContext.class).addSubcontext(attributeCtx);
     }
 
     @Test(expectedExceptions = ConstraintViolationException.class) public void testEmptyConstructor() {
@@ -94,7 +94,7 @@ public class AttributeValueLookupFunctionTest {
 
     @Test public void testAttributeWithNoValues() {
         final AttributeContext attributeCtx =
-                prc.getOrCreateSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
+                prc.ensureSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
         assert attributeCtx!=null;
         attributeCtx.setIdPAttributes(Collections.singleton(new IdPAttribute("EmptyAttribute")));
 
@@ -109,7 +109,7 @@ public class AttributeValueLookupFunctionTest {
         byteAttribute.setValues(Collections.singletonList(new ByteAttributeValue(data)));
 
         final AttributeContext attributeCtx =
-                prc.getOrCreateSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
+                prc.ensureSubcontext(RelyingPartyContext.class).getSubcontext(AttributeContext.class);
         assert attributeCtx!=null;
         attributeCtx.setIdPAttributes(Collections.singleton(byteAttribute));
 
diff --git a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunctionTest.java b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunctionTest.java
index 3571d22ce..ceb8c7f0b 100644
--- a/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunctionTest.java
+++ b/idp-consent-impl/src/test/java/net/shibboleth/idp/consent/logic/impl/FlowIdLookupFunctionTest.java
@@ -54,7 +54,7 @@ public class FlowIdLookupFunctionTest {
     }
 
     @Test public void testNullWebFlowRequestContext() {
-        prc.getOrCreateSubcontext(SpringRequestContext.class);
+        prc.ensureSubcontext(SpringRequestContext.class);
         final SpringRequestContext context = prc.getSubcontext(SpringRequestContext.class);
         assert context != null;
         Assert.assertNull(context.getRequestContext());
@@ -70,7 +70,7 @@ public class FlowIdLookupFunctionTest {
     }
 
     @Test public void testFlowId() {
-        final SpringRequestContext context = prc.getOrCreateSubcontext(SpringRequestContext.class);
+        final SpringRequestContext context = prc.ensureSubcontext(SpringRequestContext.class);
         assert context != null;
         context.setRequestContext(src);
         final SpringRequestContext ctx2 = prc.getSubcontext(SpringRequestContext.class);
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
index dd10c497f..ec631e0ea 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/AbstractProfileAction.java
@@ -152,7 +152,7 @@ public abstract class AbstractProfileAction
         
         // Attach the Spring context to the context tree.
         final SpringRequestContext springSubcontext =
-                profileRequestContext.getOrCreateSubcontext(SpringRequestContext.class);
+                profileRequestContext.ensureSubcontext(SpringRequestContext.class);
         assert springSubcontext != null;
         springSubcontext.setRequestContext(springRequestContext);
 
diff --git a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
index a69d1926a..9b5471c7f 100644
--- a/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
+++ b/idp-profile-api/src/main/java/net/shibboleth/idp/profile/context/navigate/WebFlowCurrentEventLookupFunction.java
@@ -57,7 +57,7 @@ public class WebFlowCurrentEventLookupFunction implements Function<ProfileReques
 
         final Object current = eventCtx != null ? eventCtx.getEvent() : null;
         if (current == null || !Objects.equals(current.toString(), springRequest.getCurrentEvent().getId())) {
-            eventCtx = input.getOrCreateSubcontext(EventContext.class);
+            eventCtx = input.ensureSubcontext(EventContext.class);
             eventCtx.setEvent(springRequest.getCurrentEvent());
         }
         
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/InitializeProfileRequestContext.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/InitializeProfileRequestContext.java
index caa8a4637..0fe8babec 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/InitializeProfileRequestContext.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/InitializeProfileRequestContext.java
@@ -144,7 +144,7 @@ public final class InitializeProfileRequestContext extends AbstractProfileAction
         if (captureQueryParameters) {
             final HttpServletRequest request = getHttpServletRequest();
             if (request != null) {
-                ((Map<Object,Object>) prc.getOrCreateSubcontext(ScratchContext.class).getMap()).putAll(
+                ((Map<Object,Object>) prc.ensureSubcontext(ScratchContext.class).getMap()).putAll(
                         request.getParameterMap());
             }
         }
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/MetadataQueryRequestDecoder.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/MetadataQueryRequestDecoder.java
index 3fea4f5fc..035fd8889 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/MetadataQueryRequestDecoder.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/MetadataQueryRequestDecoder.java
@@ -79,11 +79,11 @@ public class MetadataQueryRequestDecoder extends AbstractHttpServletRequestMessa
         messageContext.addSubcontext(peerCtx, true);
         
         if (message.getProtocol() != null) {
-            messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(message.getProtocol());
+            messageContext.ensureSubcontext(SAMLProtocolContext.class).setProtocol(message.getProtocol());
         }
         
         if (message.getDetectDuplicateEntityIDs() != null) {
-           messageContext.getOrCreateSubcontext(SAMLMetadataLookupParametersContext.class)
+           messageContext.ensureSubcontext(SAMLMetadataLookupParametersContext.class)
                .setDetectDuplicateEntityIDs(message.getDetectDuplicateEntityIDs());
         }
     }
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
index c91b82826..4f967ef14 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolveAttributes.java
@@ -258,7 +258,7 @@ public final class ResolveAttributes extends AbstractProfileAction {
 
         final AttributeResolutionContext resolutionContext;
         if (createResolutionContext) {
-            resolutionContext = profileRequestContext.getOrCreateSubcontext(AttributeResolutionContext.class);
+            resolutionContext = profileRequestContext.ensureSubcontext(AttributeResolutionContext.class);
             populateResolutionContext(profileRequestContext, resolutionContext);
         } else {
             resolutionContext = profileRequestContext.getSubcontext(AttributeResolutionContext.class);
diff --git a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestRequestDecoder.java b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestRequestDecoder.java
index 54f9b1f98..f762cc4f2 100644
--- a/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestRequestDecoder.java
+++ b/idp-profile-impl/src/main/java/net/shibboleth/idp/profile/impl/ResolverTestRequestDecoder.java
@@ -75,7 +75,7 @@ public class ResolverTestRequestDecoder extends AbstractHttpServletRequestMessag
         messageContext.addSubcontext(peerCtx, true);
         
         if (message.getProtocol() != null) {
-            messageContext.getOrCreateSubcontext(SAMLProtocolContext.class).setProtocol(message.getProtocol());
+            messageContext.ensureSubcontext(SAMLProtocolContext.class).setProtocol(message.getProtocol());
         }
     }
 
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
index 884a4c49e..22a0095c6 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/audit/impl/WriteAuditLogTest.java
@@ -104,7 +104,7 @@ public class WriteAuditLogTest {
     }
     
     @Test public void testTwo() throws ComponentInitializationException {
-        final AuditContext ac = prc.getOrCreateSubcontext(AuditContext.class);
+        final AuditContext ac = prc.ensureSubcontext(AuditContext.class);
         ac.getFieldValues("A").add("foo");
         ac.getFieldValues("B").add("bar");
         ac.getFieldValues("B").add("baz");
@@ -118,7 +118,7 @@ public class WriteAuditLogTest {
     }
 
     @Test public void testMissing() throws ComponentInitializationException {
-        final AuditContext ac = prc.getOrCreateSubcontext(AuditContext.class);
+        final AuditContext ac = prc.ensureSubcontext(AuditContext.class);
         ac.getFieldValues("A").add("foo");
         ac.getFieldValues("B").add("bar");
         ac.getFieldValues("B").add("baz");
diff --git a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/context/navigate/tests/SpringStatusMessageLookupFunctionTest.java b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/context/navigate/tests/SpringStatusMessageLookupFunctionTest.java
index f995c1520..d5911b5b7 100644
--- a/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/context/navigate/tests/SpringStatusMessageLookupFunctionTest.java
+++ b/idp-profile-impl/src/test/java/net/shibboleth/idp/profile/context/navigate/tests/SpringStatusMessageLookupFunctionTest.java
@@ -49,7 +49,7 @@ public class SpringStatusMessageLookupFunctionTest {
     @BeforeMethod public void setUp() throws ComponentInitializationException {
         springRequestContext = (MockRequestContext) new RequestContextBuilder().buildRequestContext();
         prc = (ProfileRequestContext) springRequestContext.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
-        prc.getOrCreateSubcontext(SpringRequestContext.class).setRequestContext(springRequestContext);
+        prc.ensureSubcontext(SpringRequestContext.class).setRequestContext(springRequestContext);
     }
 
     @Test public void testMappedMessage() {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
index d3ec02938..ba39d452f 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/ExtractSubjectFromRequest.java
@@ -134,7 +134,7 @@ public class ExtractSubjectFromRequest extends AbstractProfileAction {
             return false;
         }
 
-        nameIdentifier = msgCtx.getOrCreateSubcontext(SAMLSubjectNameIdentifierContext.class).getSubjectNameIdentifier();
+        nameIdentifier = msgCtx.ensureSubcontext(SAMLSubjectNameIdentifierContext.class).getSubjectNameIdentifier();
         if (nameIdentifier == null) {
             log.debug("{} No Subject NameID/NameIdentifier in message needs inbound processing", getLogPrefix());
             ActionSupport.buildEvent(profileRequestContext, NO_SUBJECT);
@@ -207,7 +207,7 @@ public class ExtractSubjectFromRequest extends AbstractProfileAction {
             if (profileRequestContext != null) {
                 final MessageContext msgCtx = profileRequestContext.getInboundMessageContext();
                 if (msgCtx != null) {
-                    return msgCtx.getOrCreateSubcontext(SAMLSubjectNameIdentifierContext.class)
+                    return msgCtx.ensureSubcontext(SAMLSubjectNameIdentifierContext.class)
                             .getSubjectNameIdentifier();
                 }
             }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
index aad68496f..ce6e5767a 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContext.java
@@ -128,23 +128,23 @@ public class InitializeOutboundMessageContext extends AbstractProfileAction {
         final MessageContext msgCtx = new MessageContext();
         profileRequestContext.setOutboundMessageContext(msgCtx);
 
-        final SAMLSelfEntityContext selfContext = msgCtx.getOrCreateSubcontext(SAMLSelfEntityContext.class);
+        final SAMLSelfEntityContext selfContext = msgCtx.ensureSubcontext(SAMLSelfEntityContext.class);
         selfContext.setEntityId(selfIdentityLookupStrategy.apply(profileRequestContext));
 
-        final SAMLPeerEntityContext peerContext = msgCtx.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        final SAMLPeerEntityContext peerContext = msgCtx.ensureSubcontext(SAMLPeerEntityContext.class);
         SAMLPeerEntityContext pec = peerEntityCtx;
         assert pec!=null;
         peerContext.setEntityId(pec.getEntityId());
 
         final SAMLMetadataContext inboundMetadataCtx = pec.getSubcontext(SAMLMetadataContext.class);
         if (inboundMetadataCtx != null) {
-            final SAMLMetadataContext outboundMetadataCtx = peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
+            final SAMLMetadataContext outboundMetadataCtx = peerContext.ensureSubcontext(SAMLMetadataContext.class);
             outboundMetadataCtx.setEntityDescriptor(inboundMetadataCtx.getEntityDescriptor());
             outboundMetadataCtx.setRoleDescriptor(inboundMetadataCtx.getRoleDescriptor());
             final AttributeConsumingServiceContext acsCtx =
                     inboundMetadataCtx.getSubcontext(AttributeConsumingServiceContext.class);
             if (null != acsCtx) {
-                outboundMetadataCtx.getOrCreateSubcontext(AttributeConsumingServiceContext.class)
+                outboundMetadataCtx.ensureSubcontext(AttributeConsumingServiceContext.class)
                         .setAttributeConsumingService(acsCtx.getAttributeConsumingService());
             }
         }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
index 98da8820e..ae1429f63 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForError.java
@@ -172,7 +172,7 @@ public class InitializeOutboundMessageContextForError extends AbstractProfileAct
                 
         // Copy SAML peer context and metadata if it exists.
         if (peerEntityCtx != null) {
-            final SAMLPeerEntityContext peerContext = msgCtx.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+            final SAMLPeerEntityContext peerContext = msgCtx.ensureSubcontext(SAMLPeerEntityContext.class);
             SAMLPeerEntityContext pec = peerEntityCtx;
             assert pec!=null;
             peerContext.setEntityId(pec.getEntityId());
@@ -180,7 +180,7 @@ public class InitializeOutboundMessageContextForError extends AbstractProfileAct
             final SAMLMetadataContext inboundMetadataCtx = pec.getSubcontext(SAMLMetadataContext.class);
             if (inboundMetadataCtx != null) {
                 final SAMLMetadataContext outboundMetadataCtx =
-                        peerContext.getOrCreateSubcontext(SAMLMetadataContext.class);
+                        peerContext.ensureSubcontext(SAMLMetadataContext.class);
                 outboundMetadataCtx.setEntityDescriptor(inboundMetadataCtx.getEntityDescriptor());
                 outboundMetadataCtx.setRoleDescriptor(inboundMetadataCtx.getRoleDescriptor());
             }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
index 2d694c1ca..c7b00152e 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContexts.java
@@ -488,7 +488,7 @@ public class PopulateBindingAndEndpointContexts extends AbstractProfileAction {
                 log.debug("{} Use of artifact binding implies the channel will be secure, "
                         + "overriding MessageChannelSecurityContext flags", getLogPrefix());
                 final MessageChannelSecurityContext channelCtx =
-                        profileRequestContext.getOrCreateSubcontext(MessageChannelSecurityContext.class);
+                        profileRequestContext.ensureSubcontext(MessageChannelSecurityContext.class);
                 channelCtx.setIntegrityActive(true);
                 channelCtx.setConfidentialityActive(true);
             }            
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
index 281a36914..fd054f1c0 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/profile/impl/PopulateInboundMessageContextWithSAMLSelf.java
@@ -72,7 +72,7 @@ public class PopulateInboundMessageContextWithSAMLSelf extends AbstractProfileAc
 
         final MessageContext msgCtx = Constraint.isNotNull(profileRequestContext.getInboundMessageContext(), "No Inbound Message Context");
 
-        final SAMLSelfEntityContext selfContext = msgCtx.getOrCreateSubcontext(SAMLSelfEntityContext.class);
+        final SAMLSelfEntityContext selfContext = msgCtx.ensureSubcontext(SAMLSelfEntityContext.class);
         selfContext.setEntityId(selfIdentityLookupStrategy.apply(profileRequestContext));
 
         log.debug("{} Populated inbound message context with SAML self entityID: {}", getLogPrefix(),
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
index 889996613..ee8856870 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
@@ -59,9 +59,9 @@ public class IdPInitiatedSSORequestMessageDecoder extends BaseIdPInitiatedSSOReq
         final MessageContext messageContext = new MessageContext();
         messageContext.setMessage(ssoRequest);
         
-        messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class).setEntityId(ssoRequest.getEntityId());
+        messageContext.ensureSubcontext(SAMLPeerEntityContext.class).setEntityId(ssoRequest.getEntityId());
         
-        final SAMLMessageInfoContext msgInfoContext = messageContext.getOrCreateSubcontext(SAMLMessageInfoContext.class);
+        final SAMLMessageInfoContext msgInfoContext = messageContext.ensureSubcontext(SAMLMessageInfoContext.class);
         msgInfoContext.setMessageIssueInstant(ssoRequest.getTime());
         msgInfoContext.setMessageId(getMessageID());
         
@@ -86,7 +86,7 @@ public class IdPInitiatedSSORequestMessageDecoder extends BaseIdPInitiatedSSOReq
         }
         log.debug("Decoded SAML relay state: {}", relayState);
         
-        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
+        final SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         bindingContext.setRelayState(relayState);
         bindingContext.setBindingUri(getBindingURI());
         bindingContext.setBindingDescriptor(getBindingDescriptor());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoder.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
index 3aee3c6db..d3d81c5da 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoder.java
@@ -141,7 +141,7 @@ public class IdPInitiatedSSORequestMessageDecoder extends BaseIdPInitiatedSSOReq
         final String relayState = ssoRequest.getRelayState();
         log.debug("Decoded SAML RelayState of: {}", relayState);
         
-        final SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
+        final SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         bindingContext.setRelayState(relayState);
         
         bindingContext.setBindingUri(getBindingURI());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
index 6e86079d4..1a1a7a030 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/SOAPLogoutRequest.java
@@ -288,7 +288,7 @@ public class SOAPLogoutRequest extends AbstractProfileAction {
             assert prcImc != null;
             
             prcImc.setMessage(response);
-            final SAMLBindingContext bctx = prcImc.getOrCreateSubcontext(SAMLBindingContext.class);
+            final SAMLBindingContext bctx = prcImc.ensureSubcontext(SAMLBindingContext.class);
             final MessageContext prcOmc = profileRequestContext.getOutboundMessageContext();
             assert prcOmc != null;
             final SAMLBindingContext omcBc = prcOmc.getSubcontext(SAMLBindingContext.class);
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
index 015518c92..87f44ae2d 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/saml2/profile/impl/ValidateSAMLAuthentication.java
@@ -277,7 +277,7 @@ public class ValidateSAMLAuthentication extends AbstractValidationAction {
             if (ac == null) {
                 final RelyingPartyContext rpcCtx = profileRequestContext.getSubcontext(RelyingPartyContext.class);
                 assert rpcCtx!= null;
-                ac = attributeContext = rpcCtx.getOrCreateSubcontext(AttributeContext.class);
+                ac = attributeContext = rpcCtx.ensureSubcontext(AttributeContext.class);
             }
             final Collection<IdPAttribute> attributes = new ArrayList<>(ac.getIdPAttributes().values());
             final Collection<IdPAttribute> newAttributes = aes.apply(profileRequestContext);
@@ -505,7 +505,7 @@ public class ValidateSAMLAuthentication extends AbstractValidationAction {
         if (!mapped.isEmpty()) {
             final RelyingPartyContext rpCtx = profileRequestContext.getSubcontext(RelyingPartyContext.class);
             assert rpCtx != null;
-            final AttributeContext ac = attributeContext = rpCtx.getOrCreateSubcontext(AttributeContext.class);
+            final AttributeContext ac = attributeContext = rpCtx.ensureSubcontext(AttributeContext.class);
             ac.setUnfilteredIdPAttributes(mapped.values());
             ac.setIdPAttributes(null);
             filterAttributes(profileRequestContext);
@@ -557,7 +557,7 @@ public class ValidateSAMLAuthentication extends AbstractValidationAction {
         }
 
         final AttributeFilterContext filterContext =
-                profileRequestContext.getOrCreateSubcontext(AttributeFilterContext.class);
+                profileRequestContext.ensureSubcontext(AttributeFilterContext.class);
 
         populateFilterContext(profileRequestContext, filterContext);
         try (final ServiceableComponent<AttributeFilter> component = service.getServiceableComponent()) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
index a4e9a6c0d..ae5dcfd4a 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContext.java
@@ -137,7 +137,7 @@ public class PrepareInboundMessageContext extends AbstractProfileAction {
         final MessageContext msgCtx = new MessageContext();
         profileRequestContext.setInboundMessageContext(msgCtx);
 
-        final SAMLPeerEntityContext peerContext = msgCtx.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        final SAMLPeerEntityContext peerContext = msgCtx.ensureSubcontext(SAMLPeerEntityContext.class);
         peerContext.setEntityId(relyingPartyId);
 
         log.debug("{} Initialized inbound context for message to {}", getLogPrefix(), relyingPartyId);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/authn/impl/tests/FinalizeAuthenticationTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/authn/impl/tests/FinalizeAuthenticationTest.java
index cc662d639..388cf3b1d 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/authn/impl/tests/FinalizeAuthenticationTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/authn/impl/tests/FinalizeAuthenticationTest.java
@@ -111,14 +111,14 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         
         authCtx.setAuthenticationResult(active);
 
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("bar");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("bar");
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_SUBJECT);
     }
 
     @Test public void testRequestUnsupported() {
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("bar2"));
@@ -141,7 +141,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
     }
 
     @Test public void testSwitchesPrincipal() {
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         final AuthenticationResult active = new AuthenticationResult("test2", new Subject());
         active.getSubject().getPrincipals().add(new TestPrincipal("bar2"));
@@ -171,7 +171,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
     }
 
     @Test public void testNothingActive() {
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         final Event event = action.execute(src);
         
@@ -187,7 +187,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         Event event = action.execute(src);
         
@@ -198,7 +198,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         Assert.assertEquals(sc.getAuthenticationResults().size(), 1);
         
         prc.removeSubcontext(SubjectContext.class);
-        authCtx.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        authCtx.ensureSubcontext(RequestedPrincipalContext.class);
         
         event = action.execute(src);
         
@@ -216,7 +216,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active1));
         authCtx.setAuthenticationResult(active2);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         final Event event = action.execute(src);
         
@@ -237,7 +237,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.REQUEST_UNSUPPORTED);
@@ -254,7 +254,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
 
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!= null;
@@ -279,7 +279,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
 
         prc.removeSubcontext(RelyingPartyContext.class);
 
@@ -303,7 +303,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
 
         final Event event = action.execute(src);
         
@@ -325,7 +325,7 @@ public class FinalizeAuthenticationTest extends OpenSAMLInitBaseTestCase {
         assert authCtx!=null;
         authCtx.setActiveResults(CollectionSupport.arrayAsList(active));
         authCtx.setAuthenticationResult(active);
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
 
         final Event event = action.execute(src);
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/FilterAttributesTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/FilterAttributesTest.java
index 14e8a8192..a711dcc2e 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/FilterAttributesTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/FilterAttributesTest.java
@@ -74,7 +74,7 @@ public class FilterAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testNoAttributeContext() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final AttributeFilterImpl engine = new AttributeFilterImpl("test", Collections.emptyList());
         engine.initialize();
@@ -92,11 +92,11 @@ public class FilterAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testNoAttributes() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!= null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class);
+        rpCtx.ensureSubcontext(AttributeContext.class);
 
         final AttributeFilterImpl engine = new AttributeFilterImpl("test", Collections.emptyList());
         engine.initialize();
@@ -142,7 +142,7 @@ public class FilterAttributesTest {
         attribute1Matcher.initialize();
         engine.initialize();
 
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final AttributeContext attributeCtx = new AttributeContext();
         attributeCtx.setIdPAttributes(attributes);
@@ -206,7 +206,7 @@ public class FilterAttributesTest {
         attribute1Matcher.initialize();
         engine.initialize();
 
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final AttributeContext attributeCtx = new AttributeContext();
         attributeCtx.setIdPAttributes(attributes);
@@ -269,7 +269,7 @@ public class FilterAttributesTest {
         attribute1Matcher.initialize();
         engine.initialize();
 
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final AttributeContext attributeCtx = new AttributeContext();
         attributeCtx.setIdPAttributes(attributes);
@@ -297,7 +297,7 @@ public class FilterAttributesTest {
         final IdPAttribute attribute1 = new MockUncloneableAttribute("attribute1");
         attribute1.setValues(Arrays.asList(new StringAttributeValue("one"), new StringAttributeValue("two")));
 
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final AttributeContext attributeCtx = new AttributeContext();
         final List<IdPAttribute> attributes = Collections.singletonList(attribute1);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/ResolveAttributesTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/ResolveAttributesTest.java
index 62ffdf5ff..ab8292450 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/ResolveAttributesTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/profile/impl/tests/ResolveAttributesTest.java
@@ -75,7 +75,7 @@ public class ResolveAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testResolveAttributes() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final IdPAttribute attribute = new IdPAttribute("ad1");
         attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
@@ -116,7 +116,7 @@ public class ResolveAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testResolveSpecificAttributes() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final IdPAttribute attribute = new IdPAttribute("ad1");
         attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
@@ -156,7 +156,7 @@ public class ResolveAttributesTest {
         // now test requesting an attribute that does not exist
         src = new RequestContextBuilder().buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         attributeResolutionCtx = new AttributeResolutionContext();
         attributeResolutionCtx.setRequestedIdPAttributeNames(CollectionSupport.singleton("dne"));
@@ -181,7 +181,7 @@ public class ResolveAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testUnableToResolveAttributes() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final IdPAttribute attribute = new IdPAttribute("ad1");
         attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
@@ -211,7 +211,7 @@ public class ResolveAttributesTest {
      * @throws Exception if something goes wrong
      */
     @Test public void testUnableToFindResolver() throws Exception {
-        prc.getOrCreateSubcontext(SubjectContext.class);
+        prc.ensureSubcontext(SubjectContext.class);
 
         final IdPAttribute attribute = new IdPAttribute("ad1");
         attribute.setValues(CollectionSupport.singletonList(new StringAttributeValue("value1")));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGeneratorTest.java
index b80256d0d..9ddfc354c 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML1NameIdentifierGeneratorTest.java
@@ -128,7 +128,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
 
         final IdPAttribute inputAttribute = new IdPAttribute(ATTR_NAME);
         inputAttribute.setValues(values);
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        prc.ensureSubcontext(RelyingPartyContext.class).ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -144,7 +144,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
         inputAttribute.setValues(List.of(saml1NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setFormat(NameIdentifier.EMAIL);
@@ -160,7 +160,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
         inputAttribute.setValues(List.of(saml1NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -180,7 +180,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
         inputAttribute.setValues(List.of(saml2NameIdFor(OTHERID), saml1NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -200,7 +200,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
         inputAttribute.setValues(List.of(new StringAttributeValue(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -225,7 +225,7 @@ public class AttributeSourcedSAML1NameIdentifierGeneratorTest extends OpenSAMLIn
         inputAttribute.setValues(List.of(new ScopedStringAttributeValue(NAME_1, QUALIFIER)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGeneratorTest.java
index cbacbf80e..50da769de 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/AttributeSourcedSAML2NameIDGeneratorTest.java
@@ -129,7 +129,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(values);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -144,7 +144,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(List.of(saml2NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setFormat(NameID.EMAIL);
@@ -160,7 +160,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(List.of(saml2NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -180,7 +180,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(List.of(saml2NameIdFor(OTHERID), saml1NameIdFor(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -200,7 +200,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(List.of(new StringAttributeValue(NAME_1)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
@@ -222,7 +222,7 @@ public class AttributeSourcedSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTe
         inputAttribute.setValues(List.of(new ScopedStringAttributeValue(NAME_1, QUALIFIER)));
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
-        rpCtx.getOrCreateSubcontext(AttributeContext.class).setIdPAttributes(
+        rpCtx.ensureSubcontext(AttributeContext.class).setIdPAttributes(
                 CollectionSupport.singleton(inputAttribute));
 
         generator.setAttributeSourceIds(CollectionSupport.singletonList(ATTR_NAME));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIDDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIDDecoderTest.java
index db49d4954..6cb8d3443 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIDDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIDDecoderTest.java
@@ -166,7 +166,7 @@ public class CryptoTransientNameIDDecoderTest extends OpenSAMLInitBaseTestCase {
     
         ProfileRequestContext prc =
                 new RequestContextBuilder().setInboundMessageIssuer(TestSources.SP_ENTITY_ID).buildProfileRequestContext();
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
         
         final NameID nameID = generator.generate(prc, generator.getFormat());
         assert nameID!=null;
@@ -180,7 +180,7 @@ public class CryptoTransientNameIDDecoderTest extends OpenSAMLInitBaseTestCase {
         canon.initialize();
 
         prc = new ProfileRequestContext();
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
 
         subject.getPrincipals().add(new NameIDPrincipal(nameID));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIdentifierDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIdentifierDecoderTest.java
index 2069a667d..08802dfd2 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIdentifierDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientNameIdentifierDecoderTest.java
@@ -102,7 +102,7 @@ public class CryptoTransientNameIdentifierDecoderTest extends OpenSAMLInitBaseTe
     
         ProfileRequestContext prc =
                 new RequestContextBuilder().setInboundMessageIssuer(TestSources.SP_ENTITY_ID).buildProfileRequestContext();
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
         
         final NameIdentifier nameID = generator.generate(prc, generator.getFormat());
         assert nameID!=null;
@@ -117,7 +117,7 @@ public class CryptoTransientNameIdentifierDecoderTest extends OpenSAMLInitBaseTe
         canon.initialize();
 
         prc = new ProfileRequestContext();
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
 
         subject.getPrincipals().add(new NameIdentifierPrincipal(nameID));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML1NameIdentifierGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML1NameIdentifierGeneratorTest.java
index c07e48b22..9570fa231 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML1NameIdentifierGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML1NameIdentifierGeneratorTest.java
@@ -106,7 +106,7 @@ public class CryptoTransientSAML1NameIdentifierGeneratorTest extends OpenSAMLIni
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
         rpc.setRelyingPartyId(null);
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameIdentifier name = generator.generate(prc, generator.getFormat());
         
@@ -118,7 +118,7 @@ public class CryptoTransientSAML1NameIdentifierGeneratorTest extends OpenSAMLIni
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameIdentifier name = generator.generate(prc, generator.getFormat());
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML2NameIDGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML2NameIDGeneratorTest.java
index 04eba83a7..9ab840ee2 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML2NameIDGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/CryptoTransientSAML2NameIDGeneratorTest.java
@@ -107,7 +107,7 @@ public class CryptoTransientSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTes
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
         rpc.setRelyingPartyId(null);
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameID name = generator.generate(prc, generator.getFormat());
         
@@ -119,7 +119,7 @@ public class CryptoTransientSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTes
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameID name = generator.generate(prc, generator.getFormat());
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalizationTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalizationTest.java
index ab7948f70..984a335c9 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalizationTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIDCanonicalizationTest.java
@@ -89,7 +89,7 @@ public class NameIDCanonicalizationTest extends OpenSAMLInitBaseTestCase {
     }
 
     private void setSubContext(@Nullable Subject subject, @Nullable String responder, @Nullable String requester) {
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         if (subject != null) {
             scc.setSubject(subject);
         }
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalizationTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalizationTest.java
index db29470c2..365043ec5 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalizationTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/NameIdentifierCanonicalizationTest.java
@@ -91,7 +91,7 @@ public class NameIdentifierCanonicalizationTest extends OpenSAMLInitBaseTestCase
     }
 
     private void setSubContext(@Nullable Subject subject, @Nullable String responder, @Nullable String requester) {
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         if (subject != null) {
             scc.setSubject(subject);
         }
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGeneratorTest.java
index 67e6b2d15..3692fda7a 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/PersistentSAML2NameIDGeneratorTest.java
@@ -136,12 +136,12 @@ public class PersistentSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase
         generator.setAttributeSourceIds(Collections.singletonList("SOURCE"));
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(new IdPAttribute("SOURCE")));
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
     }
@@ -156,14 +156,14 @@ public class PersistentSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase
         generator.setAttributeSourceIds(Collections.singletonList("SOURCE"));
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(Collections.singleton(source));
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(Collections.singleton(source));
         final NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
         Assert.assertEquals(id.getValue(), RESULT);
@@ -211,14 +211,14 @@ public class PersistentSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase
         generator.setAttributeSourceIds(Collections.singletonList("SOURCE"));
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(source));
         NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
@@ -278,14 +278,14 @@ public class PersistentSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase
         generator.setAttributeSourceIds(CollectionSupport.singletonList("SOURCE"));
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(source));
         NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredPersistentIdDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredPersistentIdDecoderTest.java
index 8b6b5467b..6eec32cb4 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredPersistentIdDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredPersistentIdDecoderTest.java
@@ -90,7 +90,7 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testMissingID() throws Exception {
 
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setRequesterId(TestSources.SP_ENTITY_ID);
         scc.setResponderId(TestSources.IDP_ENTITY_ID);
         
@@ -101,7 +101,7 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
     @Test(expectedExceptions={NameDecoderException.class})
     public void testNoQualifiers() throws Exception {
 
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         
         final Subject subject = SAML2ActionTestingSupport.buildSubject("foo");
         decoder.decode(scc, subject.getNameID());
@@ -111,14 +111,14 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
     public void testBadQualifier() throws Exception {
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(source));
         final NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
@@ -128,7 +128,7 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
         id.setNameQualifier(null);
         id.setSPNameQualifier(null);
         
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setRequesterId("Bad");
         scc.setResponderId(TestSources.IDP_ENTITY_ID);
         
@@ -139,14 +139,14 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
     public void testStoredIdDecode() throws Exception {
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(source));
         final NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
@@ -155,7 +155,7 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
         Assert.assertEquals(id.getNameQualifier(), TestSources.IDP_ENTITY_ID);
         Assert.assertEquals(id.getSPNameQualifier(), TestSources.SP_ENTITY_ID);
 
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setRequesterId(TestSources.SP_ENTITY_ID);
         scc.setResponderId(TestSources.IDP_ENTITY_ID);
         
@@ -168,14 +168,14 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
         generator.setSPNameQualifier("http://affiliation.org");
         generator.initialize();
         
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("foo");
         Assert.assertNull(generator.generate(prc, NameID.PERSISTENT));
         
         final IdPAttribute source = new IdPAttribute("SOURCE");
         source.setValues(Collections.singletonList(new StringAttributeValue(TestSources.COMMON_ATTRIBUTE_VALUE_STRING)));
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        rpc.getOrCreateSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
+        rpc.ensureSubcontext(AttributeContext.class).setUnfilteredIdPAttributes(
                 Collections.singleton(source));
         final NameID id = generator.generate(prc, NameID.PERSISTENT);
         assert id!=null;
@@ -184,7 +184,7 @@ public class StoredPersistentIdDecoderTest extends OpenSAMLInitBaseTestCase {
         Assert.assertEquals(id.getNameQualifier(), TestSources.IDP_ENTITY_ID);
         Assert.assertEquals(id.getSPNameQualifier(), "http://affiliation.org");
 
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         scc.setRequesterId(TestSources.SP_ENTITY_ID);
         scc.setResponderId(TestSources.IDP_ENTITY_ID);
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
index 08018e8f8..fc99ee464 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML1NameIdentifierGeneratorTest.java
@@ -81,7 +81,7 @@ public class StoredTransientSAML1NameIdentifierGeneratorTest extends OpenSAMLIni
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
         rpc.setRelyingPartyId(null);
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameIdentifier name = generator.generate(prc, generator.getFormat());
         
@@ -93,7 +93,7 @@ public class StoredTransientSAML1NameIdentifierGeneratorTest extends OpenSAMLIni
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameIdentifier name = generator.generate(prc, generator.getFormat());
         assert name!=null;
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
index 854776fb9..e6de39e0f 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/StoredTransientSAML2NameIDGeneratorTest.java
@@ -82,7 +82,7 @@ public class StoredTransientSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTes
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
         assert rpc!=null;
         rpc.setRelyingPartyId(null);
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameID name = generator.generate(prc, generator.getFormat());
         
@@ -96,7 +96,7 @@ public class StoredTransientSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTes
         assert rpc!=null;
         final RelyingPartyConfiguration rpConfig = rpc.getConfiguration();
         assert rpConfig!=null;
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("jdoe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("jdoe");
         
         final NameID name = generator.generate(prc, generator.getFormat());
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
index 1145c5d02..4a447ff89 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
@@ -141,7 +141,7 @@ public class TransientDecoderTest extends OpenSAMLInitBaseTestCase {
     
         ProfileRequestContext prc =
                 new RequestContextBuilder().setInboundMessageIssuer(TestSources.SP_ENTITY_ID).buildProfileRequestContext();
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName(TestSources.PRINCIPAL_ID);
         
         final NameID nameid = generator.generate(prc, generator.getFormat());
         assert nameid!=null;
@@ -160,7 +160,7 @@ public class TransientDecoderTest extends OpenSAMLInitBaseTestCase {
         canon.initialize();
         
         prc = new ProfileRequestContext();
-        final SubjectCanonicalizationContext scc = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        final SubjectCanonicalizationContext scc = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         final Subject subject = new Subject();
         subject.getPrincipals().add(new NameIDPrincipal(nameid));
         scc.setSubject(subject);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/context/navigate/tests/DefaultNameIdentifierFormatStrategyTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/context/navigate/tests/DefaultNameIdentifierFormatStrategyTest.java
index 0e2c74899..6f6e38053 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/context/navigate/tests/DefaultNameIdentifierFormatStrategyTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/context/navigate/tests/DefaultNameIdentifierFormatStrategyTest.java
@@ -72,7 +72,7 @@ public class DefaultNameIdentifierFormatStrategyTest extends OpenSAMLInitBaseTes
         entity.getRoleDescriptors().add(role);
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
-        imc.getOrCreateSubcontext(SAMLPeerEntityContext.class).getOrCreateSubcontext(SAMLMetadataContext.class).setEntityDescriptor(entity);
+        imc.ensureSubcontext(SAMLPeerEntityContext.class).ensureSubcontext(SAMLMetadataContext.class).setEntityDescriptor(entity);
         final SAMLPeerEntityContext pec = imc.getSubcontext(SAMLPeerEntityContext.class);
         assert pec!=null;
         final SAMLMetadataContext mctx = pec.getSubcontext(SAMLMetadataContext.class);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/FinalizeSAMLSubjectCanonicalizationTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/FinalizeSAMLSubjectCanonicalizationTest.java
index f3faf6fee..0d7100970 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/FinalizeSAMLSubjectCanonicalizationTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/FinalizeSAMLSubjectCanonicalizationTest.java
@@ -55,7 +55,7 @@ public class FinalizeSAMLSubjectCanonicalizationTest {
     }
 
     @Test public void testNoPrincipal() {
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class);
         
         final Event event = action.execute(rc);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_SUBJECT_C14N_CTX);
@@ -63,7 +63,7 @@ public class FinalizeSAMLSubjectCanonicalizationTest {
     }
     
     @Test public void testMatch() {
-        prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
+        prc.ensureSubcontext(SubjectCanonicalizationContext.class).setPrincipalName("foo");
         
         final Event event = action.execute(rc);
         
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContextTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContextTest.java
index fd3f737af..1cc199f9e 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContextTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeAuthenticationContextTest.java
@@ -193,7 +193,7 @@ public class InitializeAuthenticationContextTest extends OpenSAMLInitBaseTestCas
         final BrowserSSOProfileConfiguration config = new BrowserSSOProfileConfiguration();
         config.setDisallowedFeatures(BrowserSSOProfileConfiguration.FEATURE_SCOPING);
         
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).setProfileConfig(config);
+        prc.ensureSubcontext(RelyingPartyContext.class).setProfileConfig(config);
         
         final Event event = action.execute(requestCtx);
         ActionTestingSupport.assertEvent(event, EventIds.ACCESS_DENIED);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
index cbb8bd213..e8fed419b 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextForErrorTest.java
@@ -105,7 +105,7 @@ public class InitializeOutboundMessageContextForErrorTest extends OpenSAMLInitBa
     @Test public void testPeerEntityContextNoIssuer() {
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
-        SAMLPeerEntityContext ctx = imc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext ctx = imc.ensureSubcontext(SAMLPeerEntityContext.class);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
         rpCtx.setRelyingPartyIdContextTree(ctx);
@@ -125,7 +125,7 @@ public class InitializeOutboundMessageContextForErrorTest extends OpenSAMLInitBa
     @Test public void testPeerEntityContextIssuer() {
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
-        SAMLPeerEntityContext ctx = imc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext ctx = imc.ensureSubcontext(SAMLPeerEntityContext.class);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
         rpCtx.setRelyingPartyIdContextTree(ctx);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextTest.java
index 2451a9a52..489fae396 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeOutboundMessageContextTest.java
@@ -75,7 +75,7 @@ public class InitializeOutboundMessageContextTest extends OpenSAMLInitBaseTestCa
     @Test public void testPeerEntityContextNoIssuer() {
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
-        SAMLPeerEntityContext ctx = imc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext ctx = imc.ensureSubcontext(SAMLPeerEntityContext.class);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
         rpCtx.setRelyingPartyIdContextTree(ctx);
@@ -93,7 +93,7 @@ public class InitializeOutboundMessageContextTest extends OpenSAMLInitBaseTestCa
     @Test public void testPeerEntityContextIssuer() {
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
-        SAMLPeerEntityContext ctx = imc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+        SAMLPeerEntityContext ctx = imc.ensureSubcontext(SAMLPeerEntityContext.class);
         final RelyingPartyContext rpCtx = prc.getSubcontext(RelyingPartyContext.class);
         assert rpCtx!=null;
         rpCtx.setRelyingPartyIdContextTree(ctx);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeerTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeerTest.java
index 978ab5dec..16e209be9 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeerTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/InitializeRelyingPartyContextFromSAMLPeerTest.java
@@ -66,7 +66,7 @@ public class InitializeRelyingPartyContextFromSAMLPeerTest {
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc!=null;
         final SAMLPeerEntityContext peer =
-                imc.getOrCreateSubcontext(SAMLPeerEntityContext.class);
+                imc.ensureSubcontext(SAMLPeerEntityContext.class);
         peer.setEntityId("foo");
         
         final Event event = action.execute(src);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
index e8e2d12c4..1c6effdb6 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/profile/impl/PopulateBindingAndEndpointContextsTest.java
@@ -96,7 +96,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(rc);
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc !=null;
-        imc.getOrCreateSubcontext(SAMLBindingContext.class).setRelayState(RELAY_STATE);
+        imc.ensureSubcontext(SAMLBindingContext.class).setRelayState(RELAY_STATE);
         
         // Set these up so the context will be seen as anonymous or not based on metadata in the outbound context.
         final RelyingPartyContext rpc = prc.getSubcontext(RelyingPartyContext.class);
@@ -104,7 +104,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         rpc.setVerificationLookupStrategy(new SAMLVerificationLookupStrategy());
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        rpc.setRelyingPartyIdContextTree(omc.getOrCreateSubcontext(SAMLPeerEntityContext.class));
+        rpc.setRelyingPartyIdContextTree(omc.ensureSubcontext(SAMLPeerEntityContext.class));
         
         action = new PopulateBindingAndEndpointContexts();
         action.setEndpointResolver(new DefaultEndpointResolver<>());
@@ -190,7 +190,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         final Event event = action.execute(rc);
         ActionTestingSupport.assertEvent(event, SAMLEventIds.ENDPOINT_RESOLUTION_FAILED);
@@ -209,7 +209,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         Event event = action.execute(rc);
         ActionTestingSupport.assertEvent(event, SAMLEventIds.ENDPOINT_RESOLUTION_FAILED);
@@ -260,7 +260,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
@@ -286,7 +286,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
 
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
         final AuthnRequest authnRequest = (AuthnRequest) imc.getMessage();
@@ -310,7 +310,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
@@ -336,7 +336,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
 
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
@@ -400,7 +400,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         final Event event = action.execute(rc);
         ActionTestingSupport.assertProceedEvent(event);
@@ -435,7 +435,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
 
         
         final MessageContext imc = prc.getInboundMessageContext();
@@ -478,7 +478,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
 
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
@@ -505,7 +505,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
 
         final MessageContext imc = prc.getInboundMessageContext();
         assert imc != null;
@@ -546,7 +546,7 @@ public class PopulateBindingAndEndpointContextsTest extends XMLObjectBaseTestCas
         mdCtx.setRoleDescriptor(entity.getSPSSODescriptor("required"));
         final MessageContext omc = prc.getOutboundMessageContext();
         assert omc!=null;
-        omc.getOrCreateSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
+        omc.ensureSubcontext(SAMLPeerEntityContext.class).addSubcontext(mdCtx);
         
         final IdPInitiatedSSORequest saml1Request = new IdPInitiatedSSORequest("foo", LOCATION_POST, null, null);
         final MessageContext imc = prc.getInboundMessageContext();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertionTest.java
index c26da29ec..7b6029d70 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/AddAuthenticationStatementToAssertionTest.java
@@ -98,7 +98,7 @@ public class AddAuthenticationStatementToAssertionTest extends OpenSAMLInitBaseT
      * @throws Exception if something goes wrong
      */
     @Test public void testNoRelyingPartyContext() throws Exception {
-        prc.getOrCreateSubcontext(AuthenticationContext.class);
+        prc.ensureSubcontext(AuthenticationContext.class);
         prc.removeSubcontext(RelyingPartyContext.class);
 
         final Event event = action.execute(rc);
@@ -112,7 +112,7 @@ public class AddAuthenticationStatementToAssertionTest extends OpenSAMLInitBaseT
      */
     @Test public void testNoContext() throws Exception {
         prc.setOutboundMessageContext(null);
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", new AuthenticationMethodPrincipal("Test")));
 
         final Event event = action.execute(rc);
@@ -125,7 +125,7 @@ public class AddAuthenticationStatementToAssertionTest extends OpenSAMLInitBaseT
      * @throws Exception if something goes wrong
      */
     @Test public void testNoAuthenticationStatement() throws Exception {
-        prc.getOrCreateSubcontext(AuthenticationContext.class);
+        prc.ensureSubcontext(AuthenticationContext.class);
 
         final Event event = action.execute(rc);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_AUTHN_CTX);
@@ -149,7 +149,7 @@ public class AddAuthenticationStatementToAssertionTest extends OpenSAMLInitBaseT
         fd.setResultSerializer(serializer);
         fd.initialize();
         
-        prc.getOrCreateSubcontext(AuthenticationContext.class).getAvailableFlows().put("Test", fd);
+        prc.ensureSubcontext(AuthenticationContext.class).getAvailableFlows().put("Test", fd);
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac!=null;
         ac.setAuthenticationResult(
@@ -191,7 +191,7 @@ public class AddAuthenticationStatementToAssertionTest extends OpenSAMLInitBaseT
         final Subject subject = new Subject();
         subject.getPrincipals().add(new AuthenticationMethodPrincipal("Foo"));
         subject.getPrincipals().add(new AuthenticationMethodPrincipal("Bar"));
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", subject));
         final RequestedPrincipalContext requested = new RequestedPrincipalContext();
         requested.setMatchingPrincipal(new AuthenticationMethodPrincipal("Bar"));
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
index eac0a1cc9..cd8ce4675 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/FilterByQueriedAttributeDesignatorsTest.java
@@ -111,14 +111,14 @@ public class FilterByQueriedAttributeDesignatorsTest extends XMLObjectBaseTestCa
     }
 
     @Test public void noAttributes() {
-        prc.getOrCreateSubcontext(RelyingPartyContext.class);
+        prc.ensureSubcontext(RelyingPartyContext.class);
         final Event event = action.execute(rc);
         ActionTestingSupport.assertProceedEvent(event);
     }
 
     @Test public void noValues() {
-        final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
-        final AttributeContext ac = rpc.getOrCreateSubcontext(AttributeContext.class);
+        final RelyingPartyContext rpc = prc.ensureSubcontext(RelyingPartyContext.class);
+        final AttributeContext ac = rpc.ensureSubcontext(AttributeContext.class);
         final List<IdPAttribute> attributes = List.of(
                 new IdPAttribute("eduPersonAssurance"),
                 new IdPAttribute("flooby"),
@@ -132,8 +132,8 @@ public class FilterByQueriedAttributeDesignatorsTest extends XMLObjectBaseTestCa
 
     /** This is a non-issue for SAML 1, but just for completeness. */
     @Test public void values() {
-        final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
-        final AttributeContext ac = rpc.getOrCreateSubcontext(AttributeContext.class);
+        final RelyingPartyContext rpc = prc.ensureSubcontext(RelyingPartyContext.class);
+        final AttributeContext ac = rpc.ensureSubcontext(AttributeContext.class);
         final IdPAttribute eduPersonAssurance = new IdPAttribute("eduPersonAssurance");
         eduPersonAssurance.setValues(List.of(new StringAttributeValue("green-blue"))); // not turquoise
         final IdPAttribute flooby = new IdPAttribute("flooby");
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
index 3ea0a8bb4..1dd1f1d49 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
@@ -90,15 +90,15 @@ public class IdPInitiatedSSORequestMessageDecoderTest {
         Assert.assertEquals(ssoRequest.getRelayState(), relayState, "Incorrect decoded relay state value");
         Assert.assertEquals(ssoRequest.getTime(), time.truncatedTo(ChronoUnit.SECONDS), "Incorrect decoded time value");
         
-        Assert.assertEquals(messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class).getEntityId(), entityId,
+        Assert.assertEquals(messageContext.ensureSubcontext(SAMLPeerEntityContext.class).getEntityId(), entityId,
                 "Incorrect decoded entityId value in peer context");
         
-        SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
+        SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         Assert.assertEquals(bindingContext.getRelayState(), relayState, "Incorrect decoded relay state value in binding context");
         Assert.assertEquals(bindingContext.getBindingUri(), "urn:mace:shibboleth:1.0:profiles:AuthnRequest",
                 "Incorrect binding URI in binding context");
         
-        SAMLMessageInfoContext msgInfoContext = messageContext.getOrCreateSubcontext(SAMLMessageInfoContext.class);
+        SAMLMessageInfoContext msgInfoContext = messageContext.ensureSubcontext(SAMLMessageInfoContext.class);
         Assert.assertEquals(msgInfoContext.getMessageIssueInstant(), time.truncatedTo(ChronoUnit.SECONDS),
                 "Incorrect decoded issue instant value in message info context");
         Assert.assertEquals(msgInfoContext.getMessageId(), messageID,
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/SAML1ActionTestingSupport.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/SAML1ActionTestingSupport.java
index 188173850..c10556967 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/SAML1ActionTestingSupport.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml1/profile/impl/SAML1ActionTestingSupport.java
@@ -75,7 +75,7 @@ public final class SAML1ActionTestingSupport extends org.opensaml.saml.saml1.tes
         rpConfig.setProfileConfigurations(buildProfileConfigurations());
         rpConfig.initialize();
 
-        final RelyingPartyContext subcontext = parent.getOrCreateSubcontext(RelyingPartyContext.class);
+        final RelyingPartyContext subcontext = parent.ensureSubcontext(RelyingPartyContext.class);
         subcontext.setRelyingPartyId(id);
         subcontext.setProfileConfig(rpConfig.getProfileConfiguration(null, BrowserSSOProfileConfiguration.PROFILE_ID));
         subcontext.setConfiguration(rpConfig);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyAwareDefaultAuthenticationMethodsLookupFunctionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyAwareDefaultAuthenticationMethodsLookupFunctionTest.java
index 04e128273..bf56b90df 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyAwareDefaultAuthenticationMethodsLookupFunctionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyAwareDefaultAuthenticationMethodsLookupFunctionTest.java
@@ -53,9 +53,9 @@ public class ProxyAwareDefaultAuthenticationMethodsLookupFunctionTest extends Op
     @BeforeMethod
     public void setUp() throws ComponentInitializationException {
         prc1 = new RequestContextBuilder().buildProfileRequestContext();
-        ac = prc1.getOrCreateSubcontext(AuthenticationContext.class);
-        prc2 = ac.getOrCreateSubcontext(ProfileRequestContext.class);
-        rpc = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        ac = prc1.ensureSubcontext(AuthenticationContext.class);
+        prc2 = ac.ensureSubcontext(ProfileRequestContext.class);
+        rpc = ac.ensureSubcontext(RequestedPrincipalContext.class);
         fn = new ProxyAwareDefaultAuthenticationMethodsLookupFunction();
     }
     
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyRestrictionLookupFunctionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyRestrictionLookupFunctionTest.java
index 5365db4db..45473e205 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyRestrictionLookupFunctionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/config/navigate/tests/ProxyRestrictionLookupFunctionTest.java
@@ -62,7 +62,7 @@ public class ProxyRestrictionLookupFunctionTest extends OpenSAMLInitBaseTestCase
         config = (BrowserSSOProfileConfiguration)rpCfg.getProfileConfiguration(
                 prc, BrowserSSOProfileConfiguration.PROFILE_ID);
         rpc.setProfileConfig(config);
-        sc = prc.getOrCreateSubcontext(SubjectContext.class);
+        sc = prc.ensureSubcontext(SubjectContext.class);
         sc.getAuthenticationResults().put("test1", new AuthenticationResult("test1", new Subject()));
         sc.getAuthenticationResults().put("test2", new AuthenticationResult("test2", new Subject()));
         fn = new ProxyRestrictionLookupFunction();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequestTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequestTest.java
index 0f79dc673..9f0d143bd 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequestTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnRequestTest.java
@@ -86,11 +86,11 @@ public class AddAuthnRequestTest extends OpenSAMLInitBaseTestCase {
     @BeforeMethod public void setUp() throws ComponentInitializationException {
         rc = new RequestContextBuilder().buildRequestContext();
         prc1 = new WebflowRequestContextProfileRequestContextLookup().apply(rc);
-        ac = prc1.getOrCreateSubcontext(AuthenticationContext.class);
-        prc2 = ac.getOrCreateSubcontext(ProfileRequestContext.class);
+        ac = prc1.ensureSubcontext(AuthenticationContext.class);
+        prc2 = ac.ensureSubcontext(ProfileRequestContext.class);
         prc2.setOutboundMessageContext(new MessageContext());
         
-        rpc = prc2.getOrCreateSubcontext(RelyingPartyContext.class);
+        rpc = prc2.ensureSubcontext(RelyingPartyContext.class);
         rpc.setRelyingPartyId(ActionTestingSupport.INBOUND_MSG_ISSUER);
         final BasicRelyingPartyConfiguration rp = new BasicRelyingPartyConfiguration();
         rp.setId("mock");
@@ -392,7 +392,7 @@ public class AddAuthnRequestTest extends OpenSAMLInitBaseTestCase {
 
     /** Test that the action works for RequestedAuthnContext. */
     @Test public void testAuthnContext() {
-        final RequestedPrincipalContext reqctx = ac.getOrCreateSubcontext(RequestedPrincipalContext.class);
+        final RequestedPrincipalContext reqctx = ac.ensureSubcontext(RequestedPrincipalContext.class);
         reqctx.setOperator("exact");
         reqctx.setRequestedPrincipals(
                 Arrays.asList(new AuthnContextClassRefPrincipal(AuthnContext.KERBEROS_AUTHN_CTX),
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertionTest.java
index 379d2cb6f..7b6ac57bf 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/AddAuthnStatementToAssertionTest.java
@@ -85,7 +85,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
 
     /** Test that the action errors out properly if there is no relying party context. */
     @Test public void testNoRelyingPartyContext() {
-        prc.getOrCreateSubcontext(AuthenticationContext.class);
+        prc.ensureSubcontext(AuthenticationContext.class);
         prc.removeSubcontext(RelyingPartyContext.class);
 
         final Event event = action.execute(rc);
@@ -95,7 +95,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
     /** Test that the action errors out properly if there is no context. */
     @Test public void testNoContext() {
         prc.setOutboundMessageContext(null);
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", new AuthnContextClassRefPrincipal("Test")));
 
         final Event event = action.execute(rc);
@@ -108,7 +108,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
      * @throws Exception if something goes wrong
      */
     @Test public void testNoAuthenticationStatement() throws Exception {
-        prc.getOrCreateSubcontext(AuthenticationContext.class);
+        prc.ensureSubcontext(AuthenticationContext.class);
 
         final Event event = action.execute(rc);
         ActionTestingSupport.assertEvent(event, AuthnEventIds.INVALID_AUTHN_CTX);
@@ -133,7 +133,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
         fd.setResultSerializer(serializer);
         fd.initialize();
         
-        prc.getOrCreateSubcontext(AuthenticationContext.class).getAvailableFlows().put("Test", fd);
+        prc.ensureSubcontext(AuthenticationContext.class).getAvailableFlows().put("Test", fd);
         final AuthenticationContext ac = prc.getSubcontext(AuthenticationContext.class);
         assert ac !=null;
         ac.setAuthenticationResult(
@@ -185,7 +185,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
         assert rpCtx!=null;
         rpCtx.setProfileConfig(ssoConfig);
         
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", new AuthnContextClassRefPrincipal("Test")));
 
         final Event event = action.execute(rc);
@@ -206,7 +206,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
         final Subject subject = new Subject();
         subject.getPrincipals().add(new AuthnContextClassRefPrincipal("Foo"));
         subject.getPrincipals().add(new AuthnContextClassRefPrincipal("Bar"));
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", subject));
         final RequestedPrincipalContext requested = new RequestedPrincipalContext();
         requested.setMatchingPrincipal(new AuthnContextClassRefPrincipal("Bar"));
@@ -241,7 +241,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
     }
     
     @Test public void testAuthenticatingAuthorities() {
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", new ProxyAuthenticationPrincipal(CollectionSupport.listOf("foo", "bar", "baz"))));
         
         final Event event = action.execute(rc);
@@ -269,7 +269,7 @@ public class AddAuthnStatementToAssertionTest extends OpenSAMLInitBaseTestCase {
         assert rpCtx!=null;
         rpCtx.setProfileConfig(ssoConfig);
 
-        prc.getOrCreateSubcontext(AuthenticationContext.class).setAuthenticationResult(
+        prc.ensureSubcontext(AuthenticationContext.class).setAuthenticationResult(
                 new AuthenticationResult("Test", new ProxyAuthenticationPrincipal(CollectionSupport.listOf("foo", "bar", "baz"))));
         
         final Event event = action.execute(rc);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/EnforceDisallowedSSOFeaturesTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/EnforceDisallowedSSOFeaturesTest.java
index d3f9da174..c45906d10 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/EnforceDisallowedSSOFeaturesTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/EnforceDisallowedSSOFeaturesTest.java
@@ -60,7 +60,7 @@ public class EnforceDisallowedSSOFeaturesTest extends OpenSAMLInitBaseTestCase {
         src = (MockRequestContext) new RequestContextBuilder().buildRequestContext();
         prc = (ProfileRequestContext) src.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
         profileConfig = new BrowserSSOProfileConfiguration();
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).setProfileConfig(profileConfig);
+        prc.ensureSubcontext(RelyingPartyContext.class).setProfileConfig(profileConfig);
         
         action = new EnforceDisallowedSSOFeatures();
         action.initialize();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
index ae0b9dba2..46bc4b142 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/FilterByQueriedAttributesTest.java
@@ -113,14 +113,14 @@ public class FilterByQueriedAttributesTest extends XMLObjectBaseTestCase {
     }
 
     @Test public void noAttributes() {
-        prc.getOrCreateSubcontext(RelyingPartyContext.class);
+        prc.ensureSubcontext(RelyingPartyContext.class);
         final Event event = action.execute(rc);
         ActionTestingSupport.assertProceedEvent(event);
     }
 
     @Test public void noValues() {
-        final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
-        final AttributeContext ac = rpc.getOrCreateSubcontext(AttributeContext.class);
+        final RelyingPartyContext rpc = prc.ensureSubcontext(RelyingPartyContext.class);
+        final AttributeContext ac = rpc.ensureSubcontext(AttributeContext.class);
         final List<IdPAttribute> attributes = List.of(
                 new IdPAttribute("eduPersonAssurance"),
                 new IdPAttribute("flooby"),
@@ -133,8 +133,8 @@ public class FilterByQueriedAttributesTest extends XMLObjectBaseTestCase {
     }
     
     @Test public void values() {
-        final RelyingPartyContext rpc = prc.getOrCreateSubcontext(RelyingPartyContext.class);
-        final AttributeContext ac = rpc.getOrCreateSubcontext(AttributeContext.class);
+        final RelyingPartyContext rpc = prc.ensureSubcontext(RelyingPartyContext.class);
+        final AttributeContext ac = rpc.ensureSubcontext(AttributeContext.class);
         final IdPAttribute eduPersonAssurance = new IdPAttribute("eduPersonAssurance");
         eduPersonAssurance.setValues(List.of(new StringAttributeValue("green-blue"))); // not turquoise
         final IdPAttribute flooby = new IdPAttribute("flooby");
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
index 5c28b92ae..b16fdbb04 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/IdPInitiatedSSORequestMessageDecoderTest.java
@@ -93,16 +93,16 @@ public class IdPInitiatedSSORequestMessageDecoderTest extends XMLObjectBaseTestC
                 "Incorrect decoded message issue instant value");
         Assert.assertEquals(authnRequest.getID(), messageID, "Incorrect decoded message ID value");
         
-        Assert.assertEquals(messageContext.getOrCreateSubcontext(SAMLPeerEntityContext.class).getEntityId(), entityId,
+        Assert.assertEquals(messageContext.ensureSubcontext(SAMLPeerEntityContext.class).getEntityId(), entityId,
                 "Incorrect decoded entityId value in peer context");
         
-        SAMLBindingContext bindingContext = messageContext.getOrCreateSubcontext(SAMLBindingContext.class);
+        SAMLBindingContext bindingContext = messageContext.ensureSubcontext(SAMLBindingContext.class);
         Assert.assertEquals(bindingContext.getRelayState(), relayState,
                 "Incorrect decoded relay state value in binding context");
         Assert.assertEquals(bindingContext.getBindingUri(), "urn:mace:shibboleth:2.0:profiles:AuthnRequest",
                 "Incorrect binding URI in binding context");
         
-        SAMLMessageInfoContext msgInfoContext = messageContext.getOrCreateSubcontext(SAMLMessageInfoContext.class);
+        SAMLMessageInfoContext msgInfoContext = messageContext.ensureSubcontext(SAMLMessageInfoContext.class);
         Assert.assertEquals(msgInfoContext.getMessageIssueInstant(), time.truncatedTo(ChronoUnit.SECONDS),
                 "Incorrect decoded issue instant value in message info context");
         Assert.assertEquals(msgInfoContext.getMessageId(), messageID,
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessAssertionsForAuthenticationTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessAssertionsForAuthenticationTest.java
index 6221d0f15..85ff6afae 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessAssertionsForAuthenticationTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessAssertionsForAuthenticationTest.java
@@ -88,7 +88,7 @@ public class ProcessAssertionsForAuthenticationTest extends OpenSAMLInitBaseTest
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
         
-        final AuthenticationContext authnContext = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        final AuthenticationContext authnContext = prc.ensureSubcontext(AuthenticationContext.class);
         samlAuthnContext = new SAMLAuthnContext(new MockProfileAction(), new MockMessageDecoderFunction());
         authnContext.addSubcontext(samlAuthnContext);
         authnContext.addSubcontext(prcInner);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequestTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequestTest.java
index b50fd5a1c..a6d6a6d2b 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequestTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessLogoutRequestTest.java
@@ -366,7 +366,7 @@ public class ProcessLogoutRequestTest extends SessionManagerBaseTestCase {
         assert idpSession!=null;
         Assert.assertEquals(session.getId(), idpSession.getId());
         
-        final LogoutContext logoutCtx = prc.getOrCreateSubcontext(LogoutContext.class);
+        final LogoutContext logoutCtx = prc.ensureSubcontext(LogoutContext.class);
         Assert.assertEquals(logoutCtx.getIdPSessions().size(), 1);
         Assert.assertSame(logoutCtx.getIdPSessions().iterator().next(), sessionCtx.getIdPSession());
         Assert.assertEquals(logoutCtx.getSessionMap().size(), 1);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContextTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContextTest.java
index 5bf8810d8..2c3a7b6a9 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContextTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/ProcessRequestedAuthnContextTest.java
@@ -77,8 +77,8 @@ public class ProcessRequestedAuthnContextTest extends OpenSAMLInitBaseTestCase {
         
         src = (MockRequestContext) new RequestContextBuilder().buildRequestContext();
         prc = (ProfileRequestContext) src.getConversationScope().get(ProfileRequestContext.BINDING_KEY);
-        ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
-        prc.getOrCreateSubcontext(RelyingPartyContext.class).setProfileConfig(new BrowserSSOProfileConfiguration());
+        ac = prc.ensureSubcontext(AuthenticationContext.class);
+        prc.ensureSubcontext(RelyingPartyContext.class).setProfileConfig(new BrowserSSOProfileConfiguration());
         
         action = new ProcessRequestedAuthnContext();
         action.initialize();
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/SAML2ActionTestingSupport.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/SAML2ActionTestingSupport.java
index 4bc3d7eb1..52a4929e2 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/SAML2ActionTestingSupport.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/saml2/profile/impl/SAML2ActionTestingSupport.java
@@ -75,7 +75,7 @@ public final class SAML2ActionTestingSupport extends org.opensaml.saml.saml2.tes
         rpConfig.setProfileConfigurations(buildProfileConfigurations());
         rpConfig.initialize();
 
-        final RelyingPartyContext subcontext = parent.getOrCreateSubcontext(RelyingPartyContext.class);
+        final RelyingPartyContext subcontext = parent.ensureSubcontext(RelyingPartyContext.class);
         subcontext.setRelyingPartyId(id);
         subcontext.setProfileConfig(rpConfig.getProfileConfiguration(null, BrowserSSOProfileConfiguration.PROFILE_ID));
         subcontext.setConfiguration(rpConfig);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContextTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContextTest.java
index d3032ad25..9da0a22b9 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContextTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/session/impl/PrepareInboundMessageContextTest.java
@@ -57,7 +57,7 @@ public class PrepareInboundMessageContextTest extends OpenSAMLInitBaseTestCase {
                
         final SAML2SPSession session = new SAML2SPSession("https://sp.example.org", Instant.now(),
                 Instant.now().plusSeconds(1800), SAML2ActionTestingSupport.buildNameID("jdoe"), "foo", null, true);
-        prc.getOrCreateSubcontext(LogoutPropagationContext.class).setSession(session);
+        prc.ensureSubcontext(LogoutPropagationContext.class).setSession(session);
         
         action = new PrepareInboundMessageContext();
         action.initialize();
diff --git a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
index 970e39896..73bda42c9 100644
--- a/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
+++ b/idp-session-impl/src/main/java/net/shibboleth/idp/session/impl/PopulateMultiRPContextFromLogoutContext.java
@@ -187,7 +187,7 @@ public class PopulateMultiRPContextFromLogoutContext extends AbstractProfileActi
                     continue;
                 }
 
-                final SAMLMetadataContext metadataCtx = rpCtx.getOrCreateSubcontext(SAMLMetadataContext.class);
+                final SAMLMetadataContext metadataCtx = rpCtx.ensureSubcontext(SAMLMetadataContext.class);
                 metadataCtx.setEntityDescriptor((EntityDescriptor) roleMetadata.getParent());
                 metadataCtx.setRoleDescriptor(roleMetadata);
 
diff --git a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DestroySessionsTest.java b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DestroySessionsTest.java
index 08e1e25a4..67523bfa9 100644
--- a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DestroySessionsTest.java
+++ b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DestroySessionsTest.java
@@ -88,7 +88,7 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
     }
 
     @Test public void testNoSessions() {
-        prc.getOrCreateSubcontext(LogoutContext.class);
+        prc.ensureSubcontext(LogoutContext.class);
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
     }
@@ -104,7 +104,7 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         final String sessionId = session.getId();
         assert sessionId != null;
         
-        prc.getOrCreateSubcontext(LogoutContext.class).getIdPSessions().add(session);
+        prc.ensureSubcontext(LogoutContext.class).getIdPSessions().add(session);
 
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -128,8 +128,8 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         final String sessionId = session.getId();
         assert sessionId != null;
 
-        prc.getOrCreateSubcontext(LogoutContext.class).getIdPSessions().add(session);
-        prc.getOrCreateSubcontext(SessionContext.class).setIdPSession(session);
+        prc.ensureSubcontext(LogoutContext.class).getIdPSessions().add(session);
+        prc.ensureSubcontext(SessionContext.class).setIdPSession(session);
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -154,7 +154,7 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         IdPSession session = sessionManager.resolveSingle(new CriteriaSet(new HttpServletRequestCriterion()));
         assert session!= null;
 
-        prc.getOrCreateSubcontext(LogoutContext.class).getIdPSessions().add(session);
+        prc.ensureSubcontext(LogoutContext.class).getIdPSessions().add(session);
 
         cookie = createSession("joe");
 
@@ -164,7 +164,7 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         session = sessionManager.resolveSingle(new CriteriaSet(new HttpServletRequestCriterion()));
         assert session!= null;
                 
-        prc.getOrCreateSubcontext(SessionContext.class).setIdPSession(session);
+        prc.ensureSubcontext(SessionContext.class).setIdPSession(session);
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
@@ -187,7 +187,7 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         IdPSession session = sessionManager.resolveSingle(new CriteriaSet(new HttpServletRequestCriterion()));
         assert session!= null;
 
-        prc.getOrCreateSubcontext(LogoutContext.class).getIdPSessions().add(session);
+        prc.ensureSubcontext(LogoutContext.class).getIdPSessions().add(session);
 
         cookie = createSession("joe");
 
@@ -197,8 +197,8 @@ public class DestroySessionsTest extends SessionManagerBaseTestCase {
         session = sessionManager.resolveSingle(new CriteriaSet(new HttpServletRequestCriterion()));
         Assert.assertNotNull(session);
                 
-        prc.getOrCreateSubcontext(LogoutContext.class).getIdPSessions().add(session);
-        prc.getOrCreateSubcontext(SessionContext.class).setIdPSession(session);
+        prc.ensureSubcontext(LogoutContext.class).getIdPSessions().add(session);
+        prc.ensureSubcontext(SessionContext.class).setIdPSession(session);
         
         final Event event = action.execute(src);
         ActionTestingSupport.assertProceedEvent(event);
diff --git a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DetectIdentitySwitchTest.java b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DetectIdentitySwitchTest.java
index 83983fc77..7fc4a541b 100644
--- a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DetectIdentitySwitchTest.java
+++ b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/DetectIdentitySwitchTest.java
@@ -59,9 +59,9 @@ public class DetectIdentitySwitchTest extends SessionManagerBaseTestCase {
     @BeforeMethod public void setUpAction() throws ComponentInitializationException {
         src = new RequestContextBuilder().buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
-        sc = prc.getOrCreateSubcontext(SessionContext.class);
-        c14n = prc.getOrCreateSubcontext(SubjectCanonicalizationContext.class);
+        ac = prc.ensureSubcontext(AuthenticationContext.class);
+        sc = prc.ensureSubcontext(SessionContext.class);
+        c14n = prc.ensureSubcontext(SubjectCanonicalizationContext.class);
 
         action = new DetectIdentitySwitch();
         action.setSessionManager(sessionManager);
diff --git a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResultTest.java b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResultTest.java
index cea014600..76ea47c12 100644
--- a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResultTest.java
+++ b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithAuthenticationResultTest.java
@@ -66,7 +66,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
     @BeforeMethod public void setUpAction() throws ComponentInitializationException {
         src = new RequestContextBuilder().buildRequestContext();
         prc = new WebflowRequestContextProfileRequestContextLookup().apply(src);
-        ac = prc.getOrCreateSubcontext(AuthenticationContext.class);
+        ac = prc.ensureSubcontext(AuthenticationContext.class);
 
         action = new UpdateSessionWithAuthenticationResult();
         action.setSessionManager(sessionManager);
@@ -94,7 +94,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
 
     @Test public void testNoFlow() throws SessionException {
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("joe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("joe");
         ac.setAttemptedFlow(flowDescriptor);
         ac.setAuthenticationResult(new AuthenticationResult("test2", new UsernamePrincipal("joe")));
         
@@ -116,7 +116,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
         ac.setAuthenticationResult(new AuthenticationResult("test1", new UsernamePrincipal("joe")));
         ac.setResultCacheable(false);
         
-        SessionContext sessionCtx = prc.getOrCreateSubcontext(SessionContext.class);
+        SessionContext sessionCtx = prc.ensureSubcontext(SessionContext.class);
         assert sessionCtx!=null;
         sessionCtx.setIdPSession(sessionManager.createSession("joe"));
         
@@ -130,7 +130,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
     
     @Test public void testNewSession() throws SessionException {
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
-        prc.getOrCreateSubcontext(SubjectContext.class).setPrincipalName("joe");
+        prc.ensureSubcontext(SubjectContext.class).setPrincipalName("joe");
         ac.setAttemptedFlow(flowDescriptor);
         ac.setAuthenticationResult(new AuthenticationResult("test1", new UsernamePrincipal("joe")));
         
@@ -152,7 +152,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
         ac.setAttemptedFlow(flowDescriptor);
         ac.setAuthenticationResult(new AuthenticationResult("test1", new UsernamePrincipal("joe")));
         
-        SessionContext sessionCtx = prc.getOrCreateSubcontext(SessionContext.class);
+        SessionContext sessionCtx = prc.ensureSubcontext(SessionContext.class);
         sessionCtx.setIdPSession(sessionManager.createSession("joe"));
         
         final Event event = action.execute(src);
@@ -167,7 +167,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
         ac.setAuthenticationResult(new AuthenticationResult("test1", new UsernamePrincipal("joe")));
         
-        SessionContext sessionCtx = prc.getOrCreateSubcontext(SessionContext.class);
+        SessionContext sessionCtx = prc.ensureSubcontext(SessionContext.class);
         sessionCtx.setIdPSession(sessionManager.createSession("joe"));
         
         final Event event = action.execute(src);
@@ -182,7 +182,7 @@ public class UpdateSessionWithAuthenticationResultTest extends SessionManagerBas
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
         ac.setAuthenticationResult(new AuthenticationResult("test1", new UsernamePrincipal("joe")));
         
-        final SessionContext sessionCtx = prc.getOrCreateSubcontext(SessionContext.class);
+        final SessionContext sessionCtx = prc.ensureSubcontext(SessionContext.class);
         sessionCtx.setIdPSession(sessionManager.createSession("joe"));
         final IdPSession idpSession = sessionCtx.getIdPSession();
         assert idpSession!=null;
diff --git a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
index fa74e6179..aa0717eb8 100644
--- a/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
+++ b/idp-session-impl/src/test/java/net/shibboleth/idp/session/impl/UpdateSessionWithSPSessionTest.java
@@ -89,7 +89,7 @@ public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
         
         final IdPSession session = sessionManager.createSession("joe");
-        prc.getOrCreateSubcontext(SessionContext.class).setIdPSession(session);
+        prc.ensureSubcontext(SessionContext.class).setIdPSession(session);
         
         action.setSPSessionCreationStrategy(FunctionSupport.constant(null));
         action.initialize();
@@ -102,7 +102,7 @@ public class UpdateSessionWithSPSessionTest extends SessionManagerBaseTestCase {
         HttpServletRequestResponseContext.loadCurrent(new MockHttpServletRequest(), new MockHttpServletResponse());
         
         final IdPSession session = sessionManager.createSession("joe");
-        prc.getOrCreateSubcontext(SessionContext.class).setIdPSession(session);
+        prc.ensureSubcontext(SessionContext.class).setIdPSession(session);
         
         final Instant creation = Instant.now();
         final Instant expiration = creation.plusSeconds(3600);
diff --git a/idp-testing/src/main/java/net/shibboleth/idp/profile/testing/RequestContextBuilder.java b/idp-testing/src/main/java/net/shibboleth/idp/profile/testing/RequestContextBuilder.java
index e10bfdece..1829e4595 100644
--- a/idp-testing/src/main/java/net/shibboleth/idp/profile/testing/RequestContextBuilder.java
+++ b/idp-testing/src/main/java/net/shibboleth/idp/profile/testing/RequestContextBuilder.java
@@ -399,7 +399,7 @@ public class RequestContextBuilder {
      */
     @Nonnull protected RelyingPartyContext buildRelyingPartyContext(
             @Nonnull final ProfileRequestContext profileRequestContext) throws ComponentInitializationException {
-        final RelyingPartyContext rpCtx = profileRequestContext.getOrCreateSubcontext(RelyingPartyContext.class);
+        final RelyingPartyContext rpCtx = profileRequestContext.ensureSubcontext(RelyingPartyContext.class);
         if (Objects.equals(NO_VAL, inboundMessageIssuer) || inboundMessageIssuer == null) {
             rpCtx.setRelyingPartyId(ActionTestingSupport.INBOUND_MSG_ISSUER);
         } else {
diff --git a/idp-testing/src/main/java/net/shibboleth/idp/saml/impl/testing/TestSources.java b/idp-testing/src/main/java/net/shibboleth/idp/saml/impl/testing/TestSources.java
index 5df8d90b1..20967767d 100644
--- a/idp-testing/src/main/java/net/shibboleth/idp/saml/impl/testing/TestSources.java
+++ b/idp-testing/src/main/java/net/shibboleth/idp/saml/impl/testing/TestSources.java
@@ -241,13 +241,13 @@ public final class TestSources {
     public static AttributeResolutionContext createResolutionContext(@Nonnull String principal, @Nonnull String issuerID,
             @Nonnull String recipientId) {
         ProfileRequestContext parent = new ProfileRequestContext();
-        AttributeResolutionContext retVal = parent.getOrCreateSubcontext(AttributeResolutionContext.class);
+        AttributeResolutionContext retVal = parent.ensureSubcontext(AttributeResolutionContext.class);
 
         retVal.setAttributeIssuerID(issuerID);
         retVal.setAttributeRecipientID(recipientId);
         retVal.setPrincipal(principal);
 
-        retVal.getOrCreateSubcontext(AttributeResolverWorkContext.class);
+        retVal.ensureSubcontext(AttributeResolverWorkContext.class);
         return retVal;
     }
 

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


More information about the commits mailing list