[java-opensaml] branch main updated: IDP-2069 - Null Handling Task

Scott Cantor cantor.2 at osu.edu
Thu Apr 13 17:24:50 UTC 2023


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

scantor pushed a commit to branch main
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=360489cc070f5200e78ed5348d6be94c4d9f0ed9

The following commit(s) were added to refs/heads/main by this push:
     new 360489cc0 IDP-2069 - Null Handling Task
360489cc0 is described below

commit 360489cc070f5200e78ed5348d6be94c4d9f0ed9
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Apr 13 13:24:47 2023 -0400

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    SAML 2 profile action cleanup.
    Added missing componentActive check to base class.
---
 .../profile/action/AbstractProfileAction.java      |   5 +-
 .../profile/action/impl/SetProfileIdTest.java      |   6 +-
 .../saml2/profile/impl/AbstractDecryptAction.java  |  25 ++--
 .../saml2/profile/impl/AbstractEncryptAction.java  |  12 +-
 .../profile/impl/AbstractResponseShellAction.java  |   7 +-
 .../impl/AddChannelBindingsToAssertions.java       |  12 +-
 .../profile/impl/AddGeneratedKeyToAssertions.java  |  17 ++-
 .../saml2/profile/impl/AddNameIDToSubjects.java    |  41 ++++---
 .../impl/AddOneTimeUseConditionToAssertions.java   |  14 ++-
 .../impl/AddProxyRestrictionToAssertions.java      |  21 ++--
 .../saml2/profile/impl/AddStatusResponseShell.java |   7 +-
 .../saml2/profile/impl/AddStatusToResponse.java    |  37 +++---
 .../impl/AddSubjectConfirmationToSubjects.java     |  33 +++--
 .../saml2/profile/impl/CopyNameIDFromRequest.java  |  23 ++--
 .../saml/saml2/profile/impl/DecryptAssertions.java |  13 +-
 .../saml/saml2/profile/impl/DecryptAttributes.java |  18 +--
 .../saml/saml2/profile/impl/DecryptNameIDs.java    |  93 ++++++++------
 .../DefaultAssertionValidationContextBuilder.java  | 130 ++++++++++++--------
 .../saml/saml2/profile/impl/EncryptAssertions.java |  14 ++-
 .../saml/saml2/profile/impl/EncryptAttributes.java |  12 +-
 .../saml/saml2/profile/impl/EncryptNameIDs.java    | 136 ++++++++++++---------
 .../saml2/profile/impl/PopulateECPContext.java     |  14 ++-
 .../saml/saml2/profile/impl/ResolveArtifact.java   |  35 +++---
 .../saml2/profile/impl/ValidateAssertions.java     | 120 ++++++------------
 ...ultSAML20AssertionValidationContextBuilder.java |  44 ++++---
 .../impl/SAML20AssertionTokenValidationInput.java  |   8 +-
 ...ecuritySAML20AssertionTokenSecurityHandler.java |  91 +++++---------
 .../impl/AbstractSAML2NameIDGeneratorTest.java     |  10 +-
 .../impl/AddChannelBindingsToAssertionsTest.java   |  37 +++---
 .../impl/AddGeneratedKeyToAssertionsTest.java      |  53 +++++---
 .../profile/impl/AddNameIDToSubjectsTest.java      | 131 +++++++++++---------
 .../AddOneTimeUseConditionToAssertionsTest.java    |  20 ++-
 .../impl/AddProxyRestrictionToAssertionsTest.java  |  53 +++++---
 .../profile/impl/AddStatusResponseShellTest.java   |  46 ++++---
 .../profile/impl/AddStatusToResponseTest.java      |  44 ++++---
 .../impl/AddSubjectConfirmationToSubjectsTest.java |  30 ++---
 .../profile/impl/CopyNameIDFromRequestTest.java    |  35 +++---
 .../saml2/profile/impl/DecryptNameIDsTest.java     |  78 ++++++++----
 .../saml2/profile/impl/EncryptAssertionsTest.java  |  31 +++--
 .../saml2/profile/impl/EncryptAttributesTest.java  |  30 +++--
 .../saml2/profile/impl/EncryptNameIDsTest.java     |  51 +++++---
 .../saml2/profile/impl/PopulateECPContextTest.java |  15 +--
 .../saml2/profile/impl/ResolveArtifactTest.java    |  25 ++--
 .../saml2/profile/impl/TestSelfEncryption.java     |  53 ++++----
 .../saml2/profile/impl/ValidateAssertionsTest.java |  25 +---
 ...AML20AssertionValidationContextBuilderTest.java |  55 +++++----
 ...itySAML20AssertionTokenSecurityHandlerTest.java | 108 +++++++++-------
 47 files changed, 1060 insertions(+), 858 deletions(-)

diff --git a/opensaml-profile-api/src/main/java/org/opensaml/profile/action/AbstractProfileAction.java b/opensaml-profile-api/src/main/java/org/opensaml/profile/action/AbstractProfileAction.java
index 51294095f..573749a5f 100644
--- a/opensaml-profile-api/src/main/java/org/opensaml/profile/action/AbstractProfileAction.java
+++ b/opensaml-profile-api/src/main/java/org/opensaml/profile/action/AbstractProfileAction.java
@@ -120,7 +120,8 @@ public abstract class AbstractProfileAction extends AbstractInitializableCompone
 
     /** {@inheritDoc} */
     @Override public void execute(@Nonnull final ProfileRequestContext profileRequestContext) {
-
+        checkComponentActive();
+        
         // Clear any existing EventContext that might be hanging around, and if it exists,
         // copy the Event to a PreviousEventContext. Don't clear any existing PreviousEventContext
         // because it may be from an earlier error of interest to other actions.
@@ -251,6 +252,8 @@ public abstract class AbstractProfileAction extends AbstractInitializableCompone
      * returned it is correct, if false is returned is is not safe to make any assumptions (even if
      * there was an call in flight.
      *
+     * @return whether the preExecute hook was called 
+     *
      * @since 5.0.0
      */
     protected boolean isPreExecuteCalled() {
diff --git a/opensaml-profile-impl/src/test/java/org/opensaml/profile/action/impl/SetProfileIdTest.java b/opensaml-profile-impl/src/test/java/org/opensaml/profile/action/impl/SetProfileIdTest.java
index dce05fa0b..2ecbcd231 100644
--- a/opensaml-profile-impl/src/test/java/org/opensaml/profile/action/impl/SetProfileIdTest.java
+++ b/opensaml-profile-impl/src/test/java/org/opensaml/profile/action/impl/SetProfileIdTest.java
@@ -22,6 +22,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.ConstraintViolationException;
 
 @SuppressWarnings("javadoc")
@@ -34,16 +35,17 @@ public class SetProfileIdTest {
         try {
             new SetProfileId("  ");
             Assert.fail();
-        } catch (ConstraintViolationException e) {
+        } catch (final ConstraintViolationException e) {
             // expected this
         }
     }
 
     @Test
-    public void testExecute() throws Exception {
+    public void testExecute() throws ComponentInitializationException {
         ProfileRequestContext context = new ProfileRequestContext();
 
         SetProfileId action = new SetProfileId("foo");
+        action.initialize();
         action.execute(context);
         Assert.assertEquals(context.getProfileId(), "foo");
         Assert.assertNull(context.getSubcontext(EventContext.class));
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractDecryptAction.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractDecryptAction.java
index 898bced8f..8bad22de7 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractDecryptAction.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractDecryptAction.java
@@ -36,12 +36,12 @@ import org.opensaml.saml.saml2.encryption.Decrypter;
 import org.opensaml.xmlsec.DecryptionParameters;
 import org.opensaml.xmlsec.context.SecurityParametersContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Abstract base class for actions that perform SAML decryption.
@@ -75,7 +75,7 @@ public abstract class AbstractDecryptAction extends AbstractProfileAction {
     @Nullable private Decrypter decrypter;
     
     /** Message to operate on. */
-    @Nullable private SAMLObject message;
+    @NonnullBeforeExec private SAMLObject message;
     
     /** Constructor. */
     public AbstractDecryptAction() {
@@ -83,8 +83,9 @@ public abstract class AbstractDecryptAction extends AbstractProfileAction {
         securityParamsLookupStrategy =
                 new ChildContextLookup<>(SecurityParametersContext.class).compose(
                         new InboundMessageContextLookup());
-        messageLookupStrategy = new MessageLookup<>(Object.class).compose(new InboundMessageContextLookup());
-        decryptionPredicate = Predicates.alwaysTrue();
+        messageLookupStrategy = new MessageLookup<>(Object.class).compose(
+                new InboundMessageContextLookup());
+        decryptionPredicate = PredicateSupport.alwaysTrue();
     }
     
     /**
@@ -168,13 +169,17 @@ public abstract class AbstractDecryptAction extends AbstractProfileAction {
      * 
      * @return  the object to act on
      */
-    @Nullable public SAMLObject getSAMLObject() {
+    @NonnullBeforeExec public SAMLObject getSAMLObject() {
         return message;
     }
     
     /** {@inheritDoc} */
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         final Object theMessage = messageLookupStrategy.apply(profileRequestContext);
         if (theMessage == null) {
             log.debug("{} No message was returned by lookup strategy", getLogPrefix());
@@ -188,15 +193,15 @@ public abstract class AbstractDecryptAction extends AbstractProfileAction {
         message = (SAMLObject) theMessage;
         
         final SecurityParametersContext paramsCtx = securityParamsLookupStrategy.apply(profileRequestContext);
-        if (paramsCtx == null || paramsCtx.getDecryptionParameters() == null) {
+        final DecryptionParameters params = paramsCtx != null ? paramsCtx.getDecryptionParameters() : null;
+        if (params == null) {
             log.debug("{} No security parameter context or decryption parameters", getLogPrefix());
         } else {
-            final DecryptionParameters params = paramsCtx.getDecryptionParameters();
             decrypter = new Decrypter(params.getDataKeyInfoCredentialResolver(),
                     params.getKEKKeyInfoCredentialResolver(), params.getEncryptedKeyResolver());
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractEncryptAction.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractEncryptAction.java
index c552f1f7b..10a6e06b3 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractEncryptAction.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractEncryptAction.java
@@ -38,13 +38,13 @@ import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.encryption.support.DataEncryptionParameters;
 import org.opensaml.xmlsec.encryption.support.KeyEncryptionParameters;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Abstract base class for actions that perform simple unicast SAML encryption to a single
@@ -80,7 +80,7 @@ public abstract class AbstractEncryptAction extends AbstractConditionalProfileAc
     @Nullable private Function<ProfileRequestContext, String> selfRecipientLookupStrategy;
     
     /** The encryption object. */
-    @Nullable private Encrypter encrypter;
+    @NonnullBeforeExec private Encrypter encrypter;
     
     /** Constructor. */
     public AbstractEncryptAction() {
@@ -88,7 +88,7 @@ public abstract class AbstractEncryptAction extends AbstractConditionalProfileAc
                 new ChildContextLookup<>(EncryptionContext.class).compose(
                         new OutboundMessageContextLookup());
         keyPlacementLookupStrategy = FunctionSupport.constant(KeyPlacement.INLINE);
-        encryptToSelf = Predicates.alwaysFalse();
+        encryptToSelf = PredicateSupport.alwaysFalse();
     }
     
     /**
@@ -167,7 +167,7 @@ public abstract class AbstractEncryptAction extends AbstractConditionalProfileAc
      * 
      * @return  the encrypter
      */
-    @Nullable public Encrypter getEncrypter() {
+    @NonnullBeforeExec public Encrypter getEncrypter() {
         return encrypter;
     }
     
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractResponseShellAction.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractResponseShellAction.java
index 297000fba..5c855fffd 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractResponseShellAction.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AbstractResponseShellAction.java
@@ -38,9 +38,10 @@ import org.opensaml.saml.saml2.core.Status;
 import org.opensaml.saml.saml2.core.StatusCode;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy.ProviderType;
 
@@ -76,7 +77,7 @@ public abstract class AbstractResponseShellAction<MessageType extends StatusResp
     @Nullable private Function<ProfileRequestContext,String> issuerLookupStrategy;
     
     /** The generator to use. */
-    @Nullable private IdentifierGenerationStrategy idGenerator;
+    @NonnullBeforeExec private IdentifierGenerationStrategy idGenerator;
 
     /** EntityID to populate into Issuer element. */
     @Nullable private String issuerId;
@@ -193,7 +194,7 @@ public abstract class AbstractResponseShellAction<MessageType extends StatusResp
             log.debug("{} No issuer value available, leaving Issuer unset", getLogPrefix());
         }
 
-        profileRequestContext.getOutboundMessageContext().setMessage(response);
+        profileRequestContext.ensureOutboundMessageContext().setMessage(response);
     }
 
     /**
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertions.java
index 8d84ef25a..51cee4aeb 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertions.java
@@ -20,7 +20,6 @@ package org.opensaml.saml.saml2.profile.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -38,9 +37,10 @@ import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to add {@link ChannelBindings} extension(s) to every {@link Assertion} in a {@link Response} message.
@@ -65,17 +65,18 @@ public class AddChannelBindingsToAssertions extends AbstractConditionalProfileAc
     @Nonnull private Function<ProfileRequestContext,Response> responseLookupStrategy;
 
     /** ChannelBindingsContext to read from. */
-    @Nullable private ChannelBindingsContext channelBindingsContext;
+    @NonnullBeforeExec private ChannelBindingsContext channelBindingsContext;
     
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
 
     /** Constructor. */
     public AddChannelBindingsToAssertions() {
         channelBindingsContextLookupStrategy =
                 new ChildContextLookup<>(ChannelBindingsContext.class).compose(
                         new OutboundMessageContextLookup());
-        responseLookupStrategy = new MessageLookup<>(Response.class).compose(new OutboundMessageContextLookup());
+        responseLookupStrategy = new MessageLookup<>(Response.class).compose(
+                new OutboundMessageContextLookup());
     }
 
     /**
@@ -140,6 +141,7 @@ public class AddChannelBindingsToAssertions extends AbstractConditionalProfileAc
                         ChannelBindings.DEFAULT_ELEMENT_NAME);
 
         for (final Assertion assertion : response.getAssertions()) {
+            assert assertion != null;
             final Advice advice = SAML2ActionSupport.addAdviceToAssertion(this, assertion);
             for (final ChannelBindings cb : channelBindingsContext.getChannelBindings()) {
                 final ChannelBindings newCB = cbBuilder.buildObject();
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertions.java
index 260f3664e..b548fc374 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertions.java
@@ -20,7 +20,6 @@ package org.opensaml.saml.saml2.profile.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -38,11 +37,12 @@ import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.codec.Base64Support;
 import net.shibboleth.shared.codec.EncodingException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to add a {@link GeneratedKey} extension to every {@link Assertion} in a {@link Response} message.
@@ -68,17 +68,18 @@ public class AddGeneratedKeyToAssertions extends AbstractConditionalProfileActio
     @Nonnull private Function<ProfileRequestContext,Response> responseLookupStrategy;
 
     /** ECPContext to read from. */
-    @Nullable private ECPContext ecpContext;
+    @NonnullBeforeExec private ECPContext ecpContext;
     
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
 
     /** Constructor. */
     public AddGeneratedKeyToAssertions() {
         ecpContextLookupStrategy =
                 new ChildContextLookup<>(ECPContext.class).compose(
                         new OutboundMessageContextLookup());
-        responseLookupStrategy = new MessageLookup<>(Response.class).compose(new OutboundMessageContextLookup());
+        responseLookupStrategy = new MessageLookup<>(Response.class).compose(
+                new OutboundMessageContextLookup());
     }
 
     /**
@@ -142,9 +143,13 @@ public class AddGeneratedKeyToAssertions extends AbstractConditionalProfileActio
                         GeneratedKey.DEFAULT_ELEMENT_NAME);
 
         try {
-            final String key = Base64Support.encode(ecpContext.getSessionKey(), false);
+            final byte[] keyBytes = ecpContext.getSessionKey();
+            // Checked above.
+            assert keyBytes != null;
+            final String key = Base64Support.encode(keyBytes, false);
             
             for (final Assertion assertion : response.getAssertions()) {
+                assert assertion != null;
                 final Advice advice = SAML2ActionSupport.addAdviceToAssertion(this, assertion);
                 final GeneratedKey gk = keyBuilder.buildObject();
                 gk.setValue(key);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjects.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjects.java
index c28e7b3bb..cba0e3d3c 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjects.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjects.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.saml.saml2.profile.impl;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -26,6 +25,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.context.navigate.MessageLookup;
 import org.opensaml.profile.action.AbstractProfileAction;
 import org.opensaml.profile.action.ActionSupport;
@@ -49,14 +49,15 @@ import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.opensaml.saml.saml2.profile.SAML2NameIDGenerator;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy.ProviderType;
 
@@ -117,7 +118,7 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
     @NonnullAfterInit private SAML2NameIDGenerator generator;
 
     /** Formats to try. */
-    @Nonnull @NonnullElements private List<String> formats;
+    @NonnullBeforeExec private List<String> formats;
     
     /** Format required by requested {@link NameIDPolicy}. */
     @Nullable private String requiredFormat;
@@ -126,10 +127,10 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
     @Nullable private AuthnRequest request;
     
     /** Response to modify. */
-    @Nullable private List<Assertion> assertions;
+    @NonnullBeforeExec private List<Assertion> assertions;
     
     /** The generator to use. */
-    @Nullable private IdentifierGenerationStrategy idGenerator;
+    @NonnullBeforeExec private IdentifierGenerationStrategy idGenerator;
 
     /** EntityID to populate into Issuer element. */
     @Nullable private String issuerId;
@@ -164,7 +165,7 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         ((DefaultNameIDPolicyPredicate) nameIDPolicyPredicate).initialize();
         
         formatLookupStrategy = new MetadataNameIdentifierFormatStrategy();
-        formats = Collections.emptyList();
+        formats = CollectionSupport.emptyList();
     }
     
     /**
@@ -304,7 +305,7 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         
         requiredFormat = getRequiredFormat(profileRequestContext);
         if (requiredFormat != null) {
-            formats = Collections.singletonList(requiredFormat);
+            formats = CollectionSupport.singletonList(requiredFormat);
             log.debug("{} Request specified NameID format: {}", getLogPrefix(), requiredFormat);
         } else {
             formats = formatLookupStrategy.apply(profileRequestContext);
@@ -337,6 +338,7 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         int count = 0;
         
         for (final Assertion assertion : assertions) {
+            assert assertion != null;
             final Subject subject = getAssertionSubject(assertion);
             final NameID existing = subject.getNameID();
             if (existing == null || overwriteExisting) {
@@ -384,6 +386,7 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         
         // See if we can generate one.
         for (final String format : formats) {
+            assert format != null;
             log.debug("{} Trying to generate NameID with Format {}", getLogPrefix(), format);
             try {
                 final NameID nameId = generator.generate(profileRequestContext, format);
@@ -407,11 +410,12 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
      * @return the assertion to which the name identifier will be added
      */
     @Nonnull private Subject getAssertionSubject(@Nonnull final Assertion assertion) {
-        if (assertion.getSubject() != null) {
-            return assertion.getSubject();
+        Subject subject = assertion.getSubject();
+        if (subject != null) {
+            return subject;
         }
         
-        final Subject subject = subjectBuilder.buildObject();
+        subject = subjectBuilder.buildObject();
         assertion.setSubject(subject);
         return subject;
     }
@@ -447,15 +451,16 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         /** {@inheritDoc} */
         @Override
         @Nullable public List<Assertion> apply(@Nullable final ProfileRequestContext input) {
-            if (input != null && input.getOutboundMessageContext() != null) {
-                final Object outboundMessage = input.getOutboundMessageContext().getMessage();
+            final MessageContext outboundContext = input != null ? input.getOutboundMessageContext() : null;
+            if (outboundContext != null) {
+                final Object outboundMessage = outboundContext.getMessage();
                 if (outboundMessage == null) {
                     final Assertion ret = SAML2ActionSupport.buildAssertion(AddNameIDToSubjects.this,
                             idGenerator, issuerId);
-                    input.getOutboundMessageContext().setMessage(ret);
-                    return Collections.singletonList(ret);
+                    outboundContext.setMessage(ret);
+                    return CollectionSupport.singletonList(ret);
                 } else if (outboundMessage instanceof Assertion) {
-                    return Collections.singletonList((Assertion) outboundMessage);
+                    return CollectionSupport.singletonList((Assertion) outboundMessage);
                 } else if (outboundMessage instanceof Response) {
                     return ((Response) outboundMessage).getAssertions();
                 }
@@ -532,9 +537,9 @@ public class AddNameIDToSubjects extends AbstractProfileAction {
         @Nullable public String apply(@Nullable final ProfileRequestContext profileRequestContext) {
             
             final RequestAbstractType request = requestLookupStrategy.apply(profileRequestContext);
-            if (request != null && request.getIssuer() != null) {
+            if (request != null) {
                 final Issuer issuer = request.getIssuer();
-                if (issuer.getFormat() == null || NameID.ENTITY.equals(issuer.getFormat())) {
+                if (issuer != null && (issuer.getFormat() == null || NameID.ENTITY.equals(issuer.getFormat()))) {
                     return issuer.getValue();
                 }
             }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertions.java
index 3b8a8a215..d88843bb3 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertions.java
@@ -20,7 +20,6 @@ package org.opensaml.saml.saml2.profile.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.messaging.context.navigate.MessageLookup;
@@ -36,9 +35,10 @@ import org.opensaml.saml.saml2.core.OneTimeUse;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to add a {@link OneTimeUse} condition to every {@link Assertion} in a {@link Response} message.
@@ -56,7 +56,7 @@ public class AddOneTimeUseConditionToAssertions extends AbstractConditionalProfi
     @Nonnull private Function<ProfileRequestContext,Response> responseLookupStrategy;
 
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
 
     /** Constructor. */
     public AddOneTimeUseConditionToAssertions() {
@@ -77,6 +77,11 @@ public class AddOneTimeUseConditionToAssertions extends AbstractConditionalProfi
     /** {@inheritDoc} */
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         log.debug("{} Attempting to add OneTimeUse condition to every Assertion in Response", getLogPrefix());
 
         response = responseLookupStrategy.apply(profileRequestContext);
@@ -89,7 +94,7 @@ public class AddOneTimeUseConditionToAssertions extends AbstractConditionalProfi
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -101,6 +106,7 @@ public class AddOneTimeUseConditionToAssertions extends AbstractConditionalProfi
                         OneTimeUse.DEFAULT_ELEMENT_NAME);
 
         for (final Assertion assertion : response.getAssertions()) {
+            assert assertion != null;
             final Conditions conditions = SAML2ActionSupport.addConditionsToAssertion(this, assertion);
             if (conditions.getOneTimeUse() == null) {
                 conditions.getConditions().add(conditionBuilder.buildObject());
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertions.java
index 45377b56f..5b1350240 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertions.java
@@ -38,11 +38,13 @@ import org.opensaml.saml.saml2.core.ProxyRestriction;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action adds an {@link ProxyRestriction} to every {@link Assertion} contained in a SAML 2
@@ -61,10 +63,10 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
     @Nonnull private Function<ProfileRequestContext,Response> responseLookupStrategy;
 
     /** Strategy used to obtain the material to add. */
-    @Nullable private Function<ProfileRequestContext,Pair<Integer,Set<String>>> proxyRestrictionLookupStrategy;
+    @NonnullAfterInit private Function<ProfileRequestContext,Pair<Integer,Set<String>>> proxyRestrictionLookupStrategy;
     
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
 
     /** ProxyCount to add. */
     @Nullable private Integer proxyCount;
@@ -123,9 +125,12 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
         if (result != null) {
             proxyCount = result.getFirst();
             audiences = result.getSecond();
+            if (audiences != null && audiences.isEmpty()) {
+                audiences = null;
+            }
         }
         
-        if (proxyCount == null && (audiences == null || audiences.isEmpty())) {
+        if (proxyCount == null && audiences == null) {
             log.debug("{} No restrictions to add, nothing to do", getLogPrefix());
             return false;
         }
@@ -150,6 +155,7 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         
         for (final Assertion assertion : response.getAssertions()) {
+            assert assertion != null;
             addProxyRestriction(profileRequestContext, SAML2ActionSupport.addConditionsToAssertion(this, assertion));
             log.debug("{} Added ProxyRestriction to Assertion {}", getLogPrefix(), assertion.getID());
         }
@@ -176,6 +182,7 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
             final SAMLObjectBuilder<Audience> audienceBuilder = (SAMLObjectBuilder<Audience>)
                     XMLObjectProviderRegistrySupport.getBuilderFactory().<Audience>ensureBuilder(
                             Audience.DEFAULT_ELEMENT_NAME);
+            assert audiences != null;
             for (final String audienceId : audiences) {
                 log.debug("{} Adding {} as an Audience of the ProxyRestriction", getLogPrefix(), audienceId);
                 final Audience audience = audienceBuilder.buildObject();
@@ -194,9 +201,8 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
      */
     @Nonnull private ProxyRestriction getProxyRestriction(@Nonnull final Conditions conditions) {
         
-        final ProxyRestriction condition;
-
-        if (conditions.getProxyRestriction() == null) {
+        ProxyRestriction condition = conditions.getProxyRestriction();
+        if (condition == null) {
             final SAMLObjectBuilder<ProxyRestriction> conditionBuilder = (SAMLObjectBuilder<ProxyRestriction>)
                     XMLObjectProviderRegistrySupport.getBuilderFactory().<ProxyRestriction>ensureBuilder(
                             ProxyRestriction.DEFAULT_ELEMENT_NAME);
@@ -205,7 +211,6 @@ public class AddProxyRestrictionToAssertions extends AbstractConditionalProfileA
             conditions.getConditions().add(condition);
         } else {
             log.debug("{} Conditions already contained an ProxyRestriction, using it", getLogPrefix());
-            condition = conditions.getProxyRestriction();
         }
 
         return condition;
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShell.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShell.java
index 183264a03..12d9fdacf 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShell.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShell.java
@@ -39,11 +39,12 @@ import org.opensaml.saml.saml2.core.Status;
 import org.opensaml.saml.saml2.core.StatusCode;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy.ProviderType;
 
@@ -79,7 +80,7 @@ public class AddStatusResponseShell extends AbstractProfileAction {
     @Nullable private Function<ProfileRequestContext,String> issuerLookupStrategy;
     
     /** The generator to use. */
-    @Nullable private IdentifierGenerationStrategy idGenerator;
+    @NonnullBeforeExec private IdentifierGenerationStrategy idGenerator;
 
     /** EntityID to populate into Issuer element. */
     @Nullable private String issuerId;
@@ -222,7 +223,7 @@ public class AddStatusResponseShell extends AbstractProfileAction {
             log.debug("{} No issuer value available, leaving Issuer unset", getLogPrefix());
         }
 
-        profileRequestContext.getOutboundMessageContext().setMessage(response);
+        profileRequestContext.ensureOutboundMessageContext().setMessage(response);
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponse.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponse.java
index 5a7d33e34..0ac7b34aa 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponse.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponse.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.saml.saml2.profile.impl;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -43,13 +42,14 @@ import org.opensaml.saml.saml2.core.StatusCode;
 import org.opensaml.saml.saml2.core.StatusMessage;
 import org.opensaml.saml.saml2.core.StatusResponseType;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -91,14 +91,14 @@ public class AddStatusToResponse extends AbstractProfileAction {
     private boolean detailedErrors;
     
     /** Response to modify. */
-    @Nullable private StatusResponseType response;
+    @NonnullBeforeExec private StatusResponseType response;
     
     /** Constructor. */
     public AddStatusToResponse() {
         responseLookupStrategy =
                 new MessageLookup<>(StatusResponseType.class).compose(new OutboundMessageContextLookup());
-        detailedErrorsCondition = Predicates.alwaysFalse();
-        defaultStatusCodes = Collections.emptyList();
+        detailedErrorsCondition = PredicateSupport.alwaysFalse();
+        defaultStatusCodes = CollectionSupport.emptyList();
         detailedErrors = false;
     }
 
@@ -154,10 +154,11 @@ public class AddStatusToResponse extends AbstractProfileAction {
      * 
      * @param codes list of status code values to insert
      */
-    public void setStatusCodes(@Nonnull @NonnullElements final List<String> codes) {
+    public void setStatusCodes(@Nonnull final List<String> codes) {
         checkSetterPreconditions();
         
-        defaultStatusCodes = List.copyOf(Constraint.isNotNull(codes, "Status code list cannot be null"));
+        defaultStatusCodes = CollectionSupport.copyToList(
+                Constraint.isNotNull(codes, "Status code list cannot be null"));
     }
     
     /**
@@ -175,8 +176,11 @@ public class AddStatusToResponse extends AbstractProfileAction {
     /** {@inheritDoc} */
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
-        checkComponentActive();
-
+        
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         response = responseLookupStrategy.apply(profileRequestContext);
         if (response == null) {
             log.debug("{} Response message was not returned by lookup strategy", getLogPrefix());
@@ -188,7 +192,7 @@ public class AddStatusToResponse extends AbstractProfileAction {
         
         log.debug("{} Detailed errors are {}", getLogPrefix(), detailedErrors ? "enabled" : "disabled");
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -216,6 +220,7 @@ public class AddStatusToResponse extends AbstractProfileAction {
         if (!detailedErrors || statusMessageLookupStrategy == null) {
             if (statusMessage != null) {
                 log.debug("{} Setting StatusMessage to defaulted value", getLogPrefix());
+                assert statusMessage != null;
                 buildStatusMessage(status, statusMessage);
             }
         } else if (statusMessageLookupStrategy != null) {
@@ -227,6 +232,7 @@ public class AddStatusToResponse extends AbstractProfileAction {
             } else if (statusMessage != null) {
                 log.debug("{} Current state of request was not mappable, setting StatusMessage to defaulted value",
                         getLogPrefix());
+                assert statusMessage != null;
                 buildStatusMessage(status, statusMessage);
             }
         }
@@ -319,10 +325,11 @@ public class AddStatusToResponse extends AbstractProfileAction {
         @Nullable public List<String> apply(@Nullable final ProfileRequestContext input) {
             
             final EventContext eventCtx = eventContextLookupStrategy.apply(input);
-            if (eventCtx != null && eventCtx.getEvent() != null) {
-                return codeMappings.get(eventCtx.getEvent().toString());
+            final Object event = eventCtx != null ? eventCtx.getEvent() : null;
+            if (event != null) {
+                return codeMappings.get(event.toString());
             }
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
     }
 
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjects.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjects.java
index d00e63e1d..fe185b6d4 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjects.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjects.java
@@ -25,6 +25,7 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.context.navigate.MessageLookup;
 import org.opensaml.profile.action.AbstractProfileAction;
 import org.opensaml.profile.action.ActionSupport;
@@ -40,12 +41,14 @@ import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.core.SubjectConfirmation;
 import org.opensaml.saml.saml2.core.SubjectConfirmationData;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 
@@ -100,7 +103,7 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
     @NonnullAfterInit private String confirmationMethod;
     
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
     
     /** Constructor. */
     public AddSubjectConfirmationToSubjects() {
@@ -132,9 +135,10 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
         // Default pulls from SAML endpoint on outbound message context.
         recipientLookupStrategy = new Function<>() {
             public String apply(final ProfileRequestContext input) {
-                if (input.getOutboundMessageContext() != null) {
+                final MessageContext mc = input != null ? input.getOutboundMessageContext() : null;
+                if (mc != null) {
                     try {
-                        final URI uri = SAMLBindingSupport.getEndpointURL(input.getOutboundMessageContext());
+                        final URI uri = SAMLBindingSupport.getEndpointURL(mc);
                         if (uri != null) {
                             final String url = uri.toString();
                             log.debug("{} Setting confirmation data Recipient to {}", getLogPrefix(), url);
@@ -254,6 +258,11 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
     /** {@inheritDoc} */
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+
         log.debug("{} Attempting to add SubjectConfirmation to assertions in outgoing Response", getLogPrefix());
 
         response = responseLookupStrategy.apply(profileRequestContext);
@@ -266,7 +275,7 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
  // Checkstyle: CyclomaticComplexity OFF
@@ -336,11 +345,12 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
      * @return the subject to which the confirmation will be added
      */
     @Nonnull private Subject getAssertionSubject(@Nonnull final Assertion assertion) {
-        if (assertion.getSubject() != null) {
-            return assertion.getSubject();
+        Subject subject = assertion.getSubject();
+        if (subject != null) {
+            return subject;
         }
         
-        final Subject subject = subjectBuilder.buildObject();
+        subject = subjectBuilder.buildObject();
         assertion.setSubject(subject);
         return subject;
     }
@@ -379,12 +389,13 @@ public class AddSubjectConfirmationToSubjects extends AbstractProfileAction {
 
         /** {@inheritDoc} */
         @Nullable public String apply(@Nullable final ProfileRequestContext t) {
-            if (getHttpServletRequest() != null) {
-                return HttpServletSupport.getRemoteAddr(getHttpServletRequest());
+            final HttpServletRequest request = getHttpServletRequest();
+            if (request != null) {
+                return HttpServletSupport.getRemoteAddr(request);
             }
             
             return null;
         }
-        
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequest.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequest.java
index 69bd279ab..249aa9a76 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequest.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequest.java
@@ -20,7 +20,6 @@ package org.opensaml.saml.saml2.profile.impl;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
@@ -38,9 +37,10 @@ import org.opensaml.saml.saml2.core.NameID;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Subject;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action that builds a {@link NameID} and adds it to the {@link Subject} of all the statements
@@ -78,10 +78,10 @@ public class CopyNameIDFromRequest extends AbstractProfileAction {
     @Nonnull private Function<ProfileRequestContext,Response> responseLookupStrategy;
 
     /** NameID to copy. */
-    @Nullable private NameID nameId; 
+    @NonnullBeforeExec private NameID nameId; 
     
     /** Response to modify. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
     
     /** Constructor. */
     public CopyNameIDFromRequest() {
@@ -139,6 +139,11 @@ public class CopyNameIDFromRequest extends AbstractProfileAction {
     /** {@inheritDoc} */
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
+        
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         log.debug("{} Attempting to add NameID to statements in outgoing Response", getLogPrefix());
 
         response = responseLookupStrategy.apply(profileRequestContext);
@@ -165,7 +170,7 @@ public class CopyNameIDFromRequest extends AbstractProfileAction {
             return false;
         }
                 
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -175,6 +180,7 @@ public class CopyNameIDFromRequest extends AbstractProfileAction {
         int count = 0;
         
         for (final Assertion assertion : response.getAssertions()) {
+            assert assertion != null;
             final Subject subject = getAssertionSubject(assertion);
             final NameID existing = subject.getNameID();
             if (existing == null || overwriteExisting) {
@@ -196,11 +202,12 @@ public class CopyNameIDFromRequest extends AbstractProfileAction {
      * @return the assertion to which the name identifier will be added
      */
     @Nonnull private Subject getAssertionSubject(@Nonnull final Assertion assertion) {
-        if (assertion.getSubject() != null) {
-            return assertion.getSubject();
+        Subject subject = assertion.getSubject();
+        if (subject != null) {
+            return subject;
         }
         
-        final Subject subject = subjectBuilder.buildObject();
+        subject = subjectBuilder.buildObject();
         assertion.setSubject(subject);
         return subject;
     }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAssertions.java
index 61662fb60..07d1b6688 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAssertions.java
@@ -32,13 +32,13 @@ import org.opensaml.saml.common.SAMLObject;
 import org.opensaml.saml.common.profile.SAMLEventIds;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.EncryptedAssertion;
-import org.opensaml.saml.saml2.core.EncryptedElementType;
 import org.opensaml.saml.saml2.core.Response;
+import org.opensaml.saml.saml2.encryption.Decrypter;
 import org.opensaml.xmlsec.encryption.support.DecryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to decrypt an {@link EncryptedAssertion} element and replace it with the decrypted
@@ -90,16 +90,16 @@ public class DecryptAssertions extends AbstractDecryptAction {
     @Nullable private Assertion processEncryptedAssertion(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final EncryptedAssertion encAssert) throws DecryptionException {
         
-        if (!getDecryptionPredicate().test(
-                new Pair<ProfileRequestContext,EncryptedElementType>(profileRequestContext, encAssert))) {
+        if (!getDecryptionPredicate().test(new Pair<>(profileRequestContext, encAssert))) {
             return null;
         }
         
-        if (getDecrypter() == null) {
+        final Decrypter decrypter = getDecrypter();
+        if (decrypter == null) {
             throw new DecryptionException("No decryption parameters, unable to decrypt EncryptedAssertion");
         }
         
-        return getDecrypter().decrypt(encAssert);
+        return decrypter.decrypt(encAssert);
     }
 
     /**
@@ -121,6 +121,7 @@ public class DecryptAssertions extends AbstractDecryptAction {
             log.debug("{} Decrypting EncryptedAssertion in Response", getLogPrefix());
             try {
                 final EncryptedAssertion encrypted = i.next();
+                assert encrypted != null;
                 final Assertion decrypted = processEncryptedAssertion(profileRequestContext, encrypted);
                 if (decrypted != null) {
                     encrypteds.add(encrypted);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAttributes.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAttributes.java
index 28673e778..54a44c591 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAttributes.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptAttributes.java
@@ -34,11 +34,12 @@ import org.opensaml.saml.saml2.core.AttributeStatement;
 import org.opensaml.saml.saml2.core.EncryptedAttribute;
 import org.opensaml.saml.saml2.core.EncryptedElementType;
 import org.opensaml.saml.saml2.core.Response;
+import org.opensaml.saml.saml2.encryption.Decrypter;
 import org.opensaml.xmlsec.encryption.support.DecryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to decrypt an {@link EncryptedAttribute} element and replace it with the decrypted
@@ -63,12 +64,13 @@ public class DecryptAttributes extends AbstractDecryptAction {
         final SAMLObject message = getSAMLObject();
         
         try {
-            if (message instanceof Response) {
-                for (final Assertion a : ((Response) message).getAssertions()) {
+            if (message instanceof Response resp) {
+                for (final Assertion a : resp.getAssertions()) {
+                    assert a != null;
                     processAssertion(profileRequestContext, a);
                 }
-            } else if (message instanceof Assertion) {
-                processAssertion(profileRequestContext, (Assertion) message);
+            } else if (message instanceof Assertion a) {
+                processAssertion(profileRequestContext, a);
             } else {
                 log.debug("{} Message was of unrecognized type {}, nothing to do", getLogPrefix(),
                         message.getClass().getName());
@@ -99,11 +101,12 @@ public class DecryptAttributes extends AbstractDecryptAction {
             return null;
         }
         
-        if (getDecrypter() == null) {
+        final Decrypter decrypter = getDecrypter();
+        if (decrypter == null) {
             throw new DecryptionException("No decryption parameters, unable to decrypt EncryptedAttribute");
         }
         
-        return getDecrypter().decrypt(encAttr);
+        return decrypter.decrypt(encAttr);
     }
 
     /**
@@ -128,6 +131,7 @@ public class DecryptAttributes extends AbstractDecryptAction {
                 
                 try {
                     final EncryptedAttribute encrypted = i.next();
+                    assert encrypted != null;
                     final Attribute decrypted = processEncryptedAttribute(profileRequestContext, encrypted);
                     if (decrypted != null) {
                         encrypteds.add(encrypted);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDs.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDs.java
index 24eb7f350..2120129b2 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDs.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDs.java
@@ -29,6 +29,7 @@ import org.opensaml.saml.ext.saml2delrestrict.DelegationRestrictionType;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 import org.opensaml.saml.saml2.core.Condition;
+import org.opensaml.saml.saml2.core.Conditions;
 import org.opensaml.saml.saml2.core.EncryptedElementType;
 import org.opensaml.saml.saml2.core.EncryptedID;
 import org.opensaml.saml.saml2.core.LogoutRequest;
@@ -42,11 +43,12 @@ import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.core.SubjectConfirmation;
 import org.opensaml.saml.saml2.core.SubjectQuery;
+import org.opensaml.saml.saml2.encryption.Decrypter;
 import org.opensaml.xmlsec.encryption.support.DecryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to decrypt an {@link EncryptedID} element and replace it with the decrypted {@link NameID}
@@ -72,24 +74,25 @@ public class DecryptNameIDs extends AbstractDecryptAction {
         final SAMLObject message = getSAMLObject();
         
         try {
-            if (message instanceof AuthnRequest) {
-                processSubject(profileRequestContext, ((AuthnRequest) message).getSubject());
-            } else if (message instanceof SubjectQuery) {
-                processSubject(profileRequestContext, ((SubjectQuery) message).getSubject());
-            } else if (message instanceof Response) {
-                for (final Assertion a : ((Response) message).getAssertions()) {
+            if (message instanceof AuthnRequest r) {
+                processSubject(profileRequestContext, r.getSubject());
+            } else if (message instanceof SubjectQuery r) {
+                processSubject(profileRequestContext, r.getSubject());
+            } else if (message instanceof Response r) {
+                for (final Assertion a : r.getAssertions()) {
+                    assert a != null;
                     processAssertion(profileRequestContext, a);
                 }
-            } else if (message instanceof LogoutRequest) {
-                processLogoutRequest(profileRequestContext, (LogoutRequest) message);
-            } else if (message instanceof ManageNameIDRequest) {
-                processManageNameIDRequest(profileRequestContext, (ManageNameIDRequest) message);
-            } else if (message instanceof NameIDMappingRequest) {
-                processNameIDMappingRequest(profileRequestContext, (NameIDMappingRequest) message);
-            } else if (message instanceof NameIDMappingResponse) {
-                processNameIDMappingResponse(profileRequestContext, (NameIDMappingResponse) message);
-            } else if (message instanceof Assertion) {
-                processAssertion(profileRequestContext, (Assertion) message);
+            } else if (message instanceof LogoutRequest r) {
+                processLogoutRequest(profileRequestContext, r);
+            } else if (message instanceof ManageNameIDRequest r) {
+                processManageNameIDRequest(profileRequestContext, r);
+            } else if (message instanceof NameIDMappingRequest r) {
+                processNameIDMappingRequest(profileRequestContext, r);
+            } else if (message instanceof NameIDMappingResponse r) {
+                processNameIDMappingResponse(profileRequestContext, r);
+            } else if (message instanceof Assertion a) {
+                processAssertion(profileRequestContext, a);
             } else {
                 log.debug("{} Message was of unrecognized type {}, nothing to do", getLogPrefix(),
                         message.getClass().getName());
@@ -122,11 +125,12 @@ public class DecryptNameIDs extends AbstractDecryptAction {
             return null;
         }
         
-        if (getDecrypter() == null) {
+        final Decrypter decrypter = getDecrypter();
+        if (decrypter == null) {
             throw new DecryptionException("No decryption parameters, unable to decrypt EncryptedID");
         }
         
-        final SAMLObject object = getDecrypter().decrypt(encID);
+        final SAMLObject object = decrypter.decrypt(encID);
         if (object instanceof NameID) {
             return (NameID) object;
         }
@@ -151,11 +155,12 @@ public class DecryptNameIDs extends AbstractDecryptAction {
             return null;
         }
 
-        if (getDecrypter() == null) {
+        final Decrypter decrypter = getDecrypter();
+        if (decrypter == null) {
             throw new DecryptionException("No decryption parameters, unable to decrypt NewEncryptedID");
         }
 
-        return getDecrypter().decrypt(encID);
+        return decrypter.decrypt(encID);
     }
     
 // Checkstyle: CyclomaticComplexity OFF
@@ -171,10 +176,11 @@ public class DecryptNameIDs extends AbstractDecryptAction {
             @Nullable final Subject subject) throws DecryptionException {
         
         if (subject != null) {
-            if (subject.getEncryptedID() != null) {
+            EncryptedID encID = subject.getEncryptedID();
+            if (encID != null) {
                 log.debug("{} Decrypting EncryptedID in Subject", getLogPrefix());
                 try {
-                    final NameID decrypted = processEncryptedID(profileRequestContext, subject.getEncryptedID());
+                    final NameID decrypted = processEncryptedID(profileRequestContext, encID);
                     if (decrypted != null) {
                         subject.setNameID(decrypted);
                         subject.setEncryptedID(null);
@@ -188,10 +194,11 @@ public class DecryptNameIDs extends AbstractDecryptAction {
             }
             
             for (final SubjectConfirmation sc : subject.getSubjectConfirmations()) {
-                if (sc.getEncryptedID() != null) {
+                encID = sc.getEncryptedID();
+                if (encID != null) {
                     log.debug("{} Decrypting EncryptedID in SubjectConfirmation", getLogPrefix());
                     try {
-                        final NameID decrypted = processEncryptedID(profileRequestContext, subject.getEncryptedID());
+                        final NameID decrypted = processEncryptedID(profileRequestContext, encID);
                         if (decrypted != null) {
                             sc.setNameID(decrypted);
                             sc.setEncryptedID(null);
@@ -219,9 +226,10 @@ public class DecryptNameIDs extends AbstractDecryptAction {
     private void processLogoutRequest(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final LogoutRequest request) throws DecryptionException {
         
-        if (request.getEncryptedID() != null) {
+        final EncryptedID encID = request.getEncryptedID();
+        if (encID != null) {
             log.debug("{} Decrypting EncryptedID in LogoutRequest", getLogPrefix());
-            final NameID decrypted = processEncryptedID(profileRequestContext, request.getEncryptedID());
+            final NameID decrypted = processEncryptedID(profileRequestContext, encID);
             if (decrypted != null) {
                 request.setNameID(decrypted);
                 request.setEncryptedID(null);
@@ -240,18 +248,20 @@ public class DecryptNameIDs extends AbstractDecryptAction {
     private void processManageNameIDRequest(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final ManageNameIDRequest request) throws DecryptionException {
         
-        if (request.getEncryptedID() != null) {
+        final EncryptedID encID = request.getEncryptedID();
+        if (encID != null) {
             log.debug("{} Decrypting EncryptedID in ManageNameIDRequest", getLogPrefix());
-            final NameID decrypted = processEncryptedID(profileRequestContext, request.getEncryptedID());
+            final NameID decrypted = processEncryptedID(profileRequestContext, encID);
             if (decrypted != null) {
                 request.setNameID(decrypted);
                 request.setEncryptedID(null);
             }
         }
         
-        if (request.getNewEncryptedID() != null) {
+        final NewEncryptedID newID = request.getNewEncryptedID();
+        if (newID != null) {
             log.debug("{} Decrypting NewEncryptedID in ManageNameIDRequest", getLogPrefix());
-            final NewID decrypted = processNewEncryptedID(profileRequestContext, request.getNewEncryptedID());
+            final NewID decrypted = processNewEncryptedID(profileRequestContext, newID);
             if (decrypted != null) {
                 request.setNewID(decrypted);
                 request.setNewEncryptedID(null);
@@ -270,9 +280,10 @@ public class DecryptNameIDs extends AbstractDecryptAction {
     private void processNameIDMappingRequest(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final NameIDMappingRequest request) throws DecryptionException {
         
-        if (request.getEncryptedID() != null) {
+        final EncryptedID encID = request.getEncryptedID();
+        if (encID != null) {
             log.debug("{} Decrypting EncryptedID in NameIDMappingRequest", getLogPrefix());
-            final NameID decrypted = processEncryptedID(profileRequestContext, request.getEncryptedID());
+            final NameID decrypted = processEncryptedID(profileRequestContext, encID);
             if (decrypted != null) {
                 request.setNameID(decrypted);
                 request.setEncryptedID(null);
@@ -291,9 +302,10 @@ public class DecryptNameIDs extends AbstractDecryptAction {
     private void processNameIDMappingResponse(@Nonnull final ProfileRequestContext profileRequestContext,
             @Nonnull final NameIDMappingResponse response) throws DecryptionException {
         
-        if (response.getEncryptedID() != null) {
+        final EncryptedID encID = response.getEncryptedID();
+        if (encID != null) {
             log.debug("{} Decrypting EncryptedID in NameIDMappingRequest", getLogPrefix());
-            final NameID decrypted = processEncryptedID(profileRequestContext, response.getEncryptedID());
+            final NameID decrypted = processEncryptedID(profileRequestContext, encID);
             if (decrypted != null) {
                 response.setNameID(decrypted);
                 response.setEncryptedID(null);
@@ -322,17 +334,18 @@ public class DecryptNameIDs extends AbstractDecryptAction {
             log.warn("{} Trapped failure decrypting EncryptedIDs in Subject", getLogPrefix(), e);
         }
             
-        
-        if (assertion.getConditions() != null) {
-            for (final Condition c : assertion.getConditions().getConditions()) {
+        final Conditions conditions = assertion.getConditions();
+        if (conditions != null) {
+            for (final Condition c : conditions.getConditions()) {
                 if (!(c instanceof DelegationRestrictionType)) {
                     continue;
                 }
                 for (final Delegate d : ((DelegationRestrictionType) c).getDelegates()) {
-                    if (d.getEncryptedID() != null) {
+                    final EncryptedID encID = d.getEncryptedID();
+                    if (encID != null) {
                         log.debug("{} Decrypting EncryptedID in Delegate", getLogPrefix());
                         try {
-                            final NameID decrypted = processEncryptedID(profileRequestContext, d.getEncryptedID());
+                            final NameID decrypted = processEncryptedID(profileRequestContext, encID);
                             if (decrypted != null) {
                                 d.setNameID(decrypted);
                                 d.setEncryptedID(null);
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DefaultAssertionValidationContextBuilder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DefaultAssertionValidationContextBuilder.java
index 4138cef3b..bbf5dfa00 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DefaultAssertionValidationContextBuilder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/DefaultAssertionValidationContextBuilder.java
@@ -23,7 +23,6 @@ import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 import java.time.Duration;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -58,24 +57,27 @@ import org.opensaml.saml.criterion.ProtocolCriterion;
 import org.opensaml.saml.criterion.RoleDescriptorCriterion;
 import org.opensaml.saml.saml2.assertion.SAML2AssertionValidationParameters;
 import org.opensaml.saml.saml2.core.Assertion;
+import org.opensaml.saml.saml2.core.Issuer;
+import org.opensaml.saml.saml2.metadata.RoleDescriptor;
 import org.opensaml.saml.saml2.profile.impl.ValidateAssertions.AssertionValidationInput;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.UsageType;
 import org.opensaml.security.criteria.UsageCriterion;
 import org.opensaml.security.messaging.ServletRequestX509CredentialAdapter;
 import org.opensaml.security.x509.X509Credential;
+import org.opensaml.xmlsec.SignatureValidationParameters;
 import org.opensaml.xmlsec.context.SecurityParametersContext;
 import org.opensaml.xmlsec.signature.support.SignatureValidationParametersCriterion;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
 import jakarta.servlet.http.HttpServletRequest;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.logic.Constraint;
 import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.servlet.HttpServletSupport;
@@ -145,16 +147,16 @@ public class DefaultAssertionValidationContextBuilder
      * Constructor.
      */
     public DefaultAssertionValidationContextBuilder() {
-        signatureRequired = Predicates.alwaysTrue();
-        includeSelfEntityIDAsRecipient = Predicates.alwaysFalse();
-        checkAddress = Predicates.alwaysTrue();
+        signatureRequired = PredicateSupport.alwaysTrue();
+        includeSelfEntityIDAsRecipient = PredicateSupport.alwaysFalse();
+        checkAddress = PredicateSupport.alwaysTrue();
         inResponseTo = new DefaultValidInResponseToLookupFunction();
-        inResponseToRequired = Predicates.alwaysFalse();
-        recipientRequired = Predicates.alwaysFalse();
-        notOnOrAfterRequired = Predicates.alwaysFalse();
-        notBeforeRequired = Predicates.alwaysFalse();
-        addressRequired = Predicates.alwaysFalse();
-        requiredConditions = Collections.emptySet();
+        inResponseToRequired = PredicateSupport.alwaysFalse();
+        recipientRequired = PredicateSupport.alwaysFalse();
+        notOnOrAfterRequired = PredicateSupport.alwaysFalse();
+        notBeforeRequired = PredicateSupport.alwaysFalse();
+        addressRequired = PredicateSupport.alwaysFalse();
+        requiredConditions = CollectionSupport.emptySet();
         validIssuers = new DefaultValidIssuersLookupFunction();
 
         securityParametersLookupStrategy = new ChildContextLookup<>(SecurityParametersContext.class)
@@ -263,9 +265,11 @@ public class DefaultAssertionValidationContextBuilder
      */
     public void setRequiredConditions(@Nullable final Set<QName> conditions) {
         if (conditions != null) {
-            requiredConditions = conditions.stream().filter(Objects::nonNull).collect(Collectors.toUnmodifiableSet());
+            requiredConditions = conditions.stream()
+                    .filter(Objects::nonNull)
+                    .collect(CollectionSupport.nonnullCollector(Collectors.toUnmodifiableSet())).get();
         } else {
-            requiredConditions = Collections.emptySet();
+            requiredConditions = CollectionSupport.emptySet();
         }
     }
 
@@ -630,15 +634,17 @@ public class DefaultAssertionValidationContextBuilder
         final TreeMap<String, Object> staticParams = new TreeMap<>();
         
         // Clock skew
-        if (getClockSkew() != null) {
+        final var skewFunc = getClockSkew();
+        if (skewFunc != null) {
             staticParams.put(SAML2AssertionValidationParameters.CLOCK_SKEW,
-                    getClockSkew().apply(input.getProfileRequestContext()));
+                    skewFunc.apply(input.getProfileRequestContext()));
         }
         
         // Lifetime (for IssueInstant)
-        if (getLifetime() != null) {
+        final var lifetimeFunc = getLifetime();
+        if (lifetimeFunc != null) {
             staticParams.put(SAML2AssertionValidationParameters.LIFETIME,
-                    getLifetime().apply(input.getProfileRequestContext()));
+                    lifetimeFunc.apply(input.getProfileRequestContext()));
         }
         
         // Issuer
@@ -653,6 +659,7 @@ public class DefaultAssertionValidationContextBuilder
         
         final Set<InetAddress> validAddresses = getValidAddresses(input);
         final Boolean checkAddressEnabled = Boolean.valueOf(getCheckAddress().test(input.getProfileRequestContext()));
+        assert checkAddressEnabled != null;
         
         // SubjectConfirmation
         populateSubjectConfirmationParameters(staticParams, input, validAddresses, checkAddressEnabled);
@@ -678,11 +685,15 @@ public class DefaultAssertionValidationContextBuilder
                 Boolean.valueOf(getSignatureRequired().test(input.getProfileRequestContext())));
         staticParams.put(SAML2AssertionValidationParameters.SIGNATURE_VALIDATION_CRITERIA_SET, 
                 getSignatureCriteriaSet(input));
+        
         final SecurityParametersContext securityParameters = getSecurityParametersLookupStrategy()
                 .apply(input.getProfileRequestContext());
-        if (securityParameters != null && securityParameters.getSignatureValidationParameters() != null) {
+        
+        final SignatureValidationParameters valParams = securityParameters != null
+                ? securityParameters.getSignatureValidationParameters() : null;
+        if (valParams != null) {
             staticParams.put(SAML2AssertionValidationParameters.SIGNATURE_VALIDATION_TRUST_ENGINE,
-                    securityParameters.getSignatureValidationParameters().getSignatureTrustEngine());
+                    valParams.getSignatureTrustEngine());
         }
     }
     
@@ -735,9 +746,11 @@ public class DefaultAssertionValidationContextBuilder
         
         staticParams.put(SAML2AssertionValidationParameters.SC_IN_RESPONSE_TO_REQUIRED,
                 Boolean.valueOf(getInResponseToRequired().test(input.getProfileRequestContext())));
-        if (getInResponseTo() != null) {
+        
+        final var irtFunc = getInResponseTo();
+        if (irtFunc != null) {
             staticParams.put(SAML2AssertionValidationParameters.SC_VALID_IN_RESPONSE_TO,
-                    getInResponseTo().apply(input.getProfileRequestContext()));
+                    irtFunc.apply(input.getProfileRequestContext()));
         }
         
         staticParams.put(SAML2AssertionValidationParameters.SC_NOT_BEFORE_REQUIRED,
@@ -760,9 +773,11 @@ public class DefaultAssertionValidationContextBuilder
         // For AuthnStatement
         staticParams.put(SAML2AssertionValidationParameters.STMT_AUTHN_VALID_ADDRESSES, validAddresses);
         staticParams.put(SAML2AssertionValidationParameters.STMT_AUTHN_CHECK_ADDRESS, checkAddressEnabled);
-        if (getMaximumTimeSinceAuthn() != null) {
+        
+        final var maxTimeFunc = getMaximumTimeSinceAuthn();
+        if (maxTimeFunc != null) {
             staticParams.put(SAML2AssertionValidationParameters.STMT_AUTHN_MAX_TIME, 
-                    getMaximumTimeSinceAuthn().apply(input.getProfileRequestContext()));
+                    maxTimeFunc.apply(input.getProfileRequestContext()));
         }
     }
     
@@ -810,8 +825,9 @@ public class DefaultAssertionValidationContextBuilder
     @Nonnull protected CriteriaSet getSignatureCriteriaSet(@Nonnull final AssertionValidationInput input) {
         final CriteriaSet criteriaSet = new CriteriaSet();
         
-        if (getSignatureCriteriaSetFunction() != null) {
-            final CriteriaSet dynamicCriteria = getSignatureCriteriaSetFunction().apply(
+        final var sigCritFunc = getSignatureCriteriaSetFunction();
+        if (sigCritFunc != null) {
+            final CriteriaSet dynamicCriteria = sigCritFunc.apply(
                     new Pair<>(input.getProfileRequestContext(), input.getAssertion()));
             if (dynamicCriteria != null) {
                 criteriaSet.addAll(dynamicCriteria);
@@ -819,13 +835,13 @@ public class DefaultAssertionValidationContextBuilder
         }
         
         if (!criteriaSet.contains(EntityIdCriterion.class)) {
-            String issuer = null;
-            if (input.getAssertion().getIssuer() != null) {
-                issuer = StringSupport.trimOrNull(input.getAssertion().getIssuer().getValue());
-            }
-            if (issuer != null) {
-                log.debug("Adding internally-generated EntityIdCriterion with value of: {}", issuer);
-                criteriaSet.add(new EntityIdCriterion(issuer));
+            final Issuer issuerObj = input.getAssertion().getIssuer();
+            if (issuerObj != null) {
+                final String issuer = StringSupport.trimOrNull(issuerObj.getValue());
+                if (issuer != null) {
+                    log.debug("Adding internally-generated EntityIdCriterion with value of: {}", issuer);
+                    criteriaSet.add(new EntityIdCriterion(issuer));
+                }
             }
         }
         
@@ -864,8 +880,11 @@ public class DefaultAssertionValidationContextBuilder
         if (peerContext != null) {
             if (!criteriaSet.contains(RoleDescriptorCriterion.class)) {
                 final SAMLMetadataContext metadataContext = peerContext.getSubcontext(SAMLMetadataContext.class);
-                if (metadataContext != null && metadataContext.getRoleDescriptor() != null) {
-                    criteriaSet.add(new RoleDescriptorCriterion(metadataContext.getRoleDescriptor()));
+                if (metadataContext != null) {
+                    final RoleDescriptor role = metadataContext.getRoleDescriptor();
+                    if (role != null) {
+                        criteriaSet.add(new RoleDescriptorCriterion(role));
+                    }
                 }
             }
             if (!criteriaSet.contains(EntityRoleCriterion.class)) {
@@ -877,17 +896,21 @@ public class DefaultAssertionValidationContextBuilder
         }
 
         final SAMLProtocolContext protocolContext = inboundContext.getSubcontext(SAMLProtocolContext.class);
-        if (!criteriaSet.contains(ProtocolCriterion.class)
-                && protocolContext != null && protocolContext.getProtocol() != null) {
-            criteriaSet.add(new ProtocolCriterion(protocolContext.getProtocol()));
+        if (!criteriaSet.contains(ProtocolCriterion.class) && protocolContext != null) {
+            final String protocol = protocolContext.getProtocol();
+            if (protocol != null) {
+                criteriaSet.add(new ProtocolCriterion(protocol));
+            }
         }
         
         if (!criteriaSet.contains(SignatureValidationParametersCriterion.class)) {
             final SecurityParametersContext secParamsContext =
                     inboundContext.getSubcontext(SecurityParametersContext.class);
-            if (secParamsContext != null && secParamsContext.getSignatureValidationParameters() != null) {
-                criteriaSet.add(new SignatureValidationParametersCriterion(
-                        secParamsContext.getSignatureValidationParameters()));
+            if (secParamsContext != null) {
+                final SignatureValidationParameters valParams = secParamsContext.getSignatureValidationParameters();
+                if (valParams != null) {
+                    criteriaSet.add(new SignatureValidationParametersCriterion(valParams));
+                }
             }
         }
     }
@@ -959,7 +982,7 @@ public class DefaultAssertionValidationContextBuilder
         
         try {
             final String endpoint = SAMLBindingSupport.getActualReceiverEndpointURI(
-                    input.getProfileRequestContext().getInboundMessageContext(), input.getHttpServletRequest());
+                    input.getProfileRequestContext().ensureInboundMessageContext(), input.getHttpServletRequest());
             if (endpoint != null) {
                 validRecipients.add(endpoint);
             }
@@ -1004,10 +1027,10 @@ public class DefaultAssertionValidationContextBuilder
                 return validAddresses;
             }
             log.warn("Could not determine attester IP address. Validation of Assertion may or may not succeed");
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         } catch (final UnknownHostException e) {
             log.warn("Processing of attester IP address failed. Validation of Assertion may or may not succeed", e);
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
     }
     
@@ -1022,7 +1045,7 @@ public class DefaultAssertionValidationContextBuilder
      * 
      * @return the IP address of the attester
      */
-    @Nonnull protected String getAttesterIPAddress(@Nonnull final AssertionValidationInput input) {
+    @Nullable protected String getAttesterIPAddress(@Nonnull final AssertionValidationInput input) {
         //TODO support indirection via SAMLBindingSupport and use of SAMLMessageReceivedEndpointContext?
         return HttpServletSupport.getRemoteAddr(input.getHttpServletRequest());
     }
@@ -1050,8 +1073,9 @@ public class DefaultAssertionValidationContextBuilder
             validAudiences.add(selfEntityID);
         }
         
-        if (getAdditionalAudiences() != null) {
-            final Set<String> additional = getAdditionalAudiences().apply(input.getProfileRequestContext());
+        final var audFunc = getAdditionalAudiences();
+        if (audFunc != null) {
+            final Set<String> additional = audFunc.apply(input.getProfileRequestContext());
             if (additional != null) {
                 validAudiences.addAll(additional);
             }
@@ -1070,7 +1094,7 @@ public class DefaultAssertionValidationContextBuilder
      */
     @Nullable protected String getSelfEntityID(@Nonnull final AssertionValidationInput input) {
         final SAMLSelfEntityContext selfContext = input.getProfileRequestContext()
-                .getInboundMessageContext()
+                .ensureInboundMessageContext()
                 .getSubcontext(SAMLSelfEntityContext.class);
         
         if (selfContext != null) {
@@ -1084,7 +1108,7 @@ public class DefaultAssertionValidationContextBuilder
     public static class DefaultValidInResponseToLookupFunction implements Function<ProfileRequestContext, String> {
 
         /** The lookup delegate. */
-        private Function<MessageContext, String> delegate;
+        @Nonnull private Function<MessageContext, String> delegate;
 
         /** Constructor. */
         public DefaultValidInResponseToLookupFunction() {
@@ -1115,7 +1139,7 @@ public class DefaultAssertionValidationContextBuilder
     public static class DefaultValidIssuersLookupFunction implements Function<ProfileRequestContext, Set<String>> {
         
         /** The lookup delegate. */
-        private Function<MessageContext, String> delegate;
+        @Nonnull private Function<MessageContext, String> delegate;
 
         /** Constructor. */
         public DefaultValidIssuersLookupFunction() {
@@ -1133,9 +1157,9 @@ public class DefaultAssertionValidationContextBuilder
             // Note: Doesn't matter whether we apply to inbound or outbound
             final String entityID = delegate.apply(prc.getInboundMessageContext());
             if (entityID != null) {
-                return Collections.singleton(entityID);
+                return CollectionSupport.singleton(entityID);
             }
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
         
     }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertions.java
index bf8c3fdba..dd978edc9 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertions.java
@@ -40,10 +40,11 @@ import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -61,13 +62,13 @@ public class EncryptAssertions extends AbstractEncryptAction {
     @Nonnull private final Logger log = LoggerFactory.getLogger(EncryptAssertions.class);
 
     /** Used to log protocol messages. */
-    private Logger protocolMessageLog = LoggerFactory.getLogger("PROTOCOL_MESSAGE");
+    @Nonnull private Logger protocolMessageLog = LoggerFactory.getLogger("PROTOCOL_MESSAGE");
 
     /** Strategy used to locate the {@link Response} to operate on. */
     @Nonnull private Function<ProfileRequestContext,StatusResponseType> responseLookupStrategy;
     
     /** The message to operate on. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
     
     /** Constructor. */
 
@@ -101,6 +102,10 @@ public class EncryptAssertions extends AbstractEncryptAction {
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         final StatusResponseType message = responseLookupStrategy.apply(profileRequestContext);
         if (message != null) {
             if (message instanceof Response) {
@@ -116,7 +121,7 @@ public class EncryptAssertions extends AbstractEncryptAction {
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -136,6 +141,7 @@ public class EncryptAssertions extends AbstractEncryptAction {
         final List<EncryptedAssertion> accumulator = new ArrayList<>(response.getAssertions().size());
         
         for (final Assertion assertion : response.getAssertions()) {
+            assert assertion != null;
             try {
                 accumulator.add(getEncrypter().encrypt(assertion));
             } catch (final EncryptionException e) {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributes.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributes.java
index 6316f0c04..827385e46 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributes.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributes.java
@@ -42,10 +42,11 @@ import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -68,7 +69,7 @@ public class EncryptAttributes extends AbstractEncryptAction {
     @Nonnull private Function<ProfileRequestContext,StatusResponseType> responseLookupStrategy;
     
     /** The message to operate on. */
-    @Nullable private Response response;
+    @NonnullBeforeExec private Response response;
     
     /** Constructor. */
     public EncryptAttributes() {
@@ -101,6 +102,10 @@ public class EncryptAttributes extends AbstractEncryptAction {
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         final StatusResponseType message = responseLookupStrategy.apply(profileRequestContext);
         if (message != null) {
             if (message instanceof Response) {
@@ -116,7 +121,7 @@ public class EncryptAttributes extends AbstractEncryptAction {
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -129,6 +134,7 @@ public class EncryptAttributes extends AbstractEncryptAction {
                 final List<EncryptedAttribute> accumulator = new ArrayList<>(statement.getAttributes().size());
                 
                 for (final Attribute attribute : statement.getAttributes()) {
+                    assert attribute != null;
                     try {
                         if (log.isDebugEnabled()) {
                             try {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDs.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDs.java
index 7a83fd296..00b74dde9 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDs.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDs.java
@@ -18,7 +18,6 @@
 package org.opensaml.saml.saml2.profile.impl;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Set;
 import java.util.function.Function;
 
@@ -39,6 +38,7 @@ import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.AuthnRequest;
 import org.opensaml.saml.saml2.core.Condition;
+import org.opensaml.saml.saml2.core.Conditions;
 import org.opensaml.saml.saml2.core.EncryptedID;
 import org.opensaml.saml.saml2.core.LogoutRequest;
 import org.opensaml.saml.saml2.core.ManageNameIDRequest;
@@ -46,6 +46,7 @@ import org.opensaml.saml.saml2.core.NameID;
 import org.opensaml.saml.saml2.core.NameIDMappingRequest;
 import org.opensaml.saml.saml2.core.NameIDMappingResponse;
 import org.opensaml.saml.saml2.core.NewEncryptedID;
+import org.opensaml.saml.saml2.core.NewID;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.core.SubjectConfirmation;
@@ -54,11 +55,12 @@ import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
-import net.shibboleth.shared.annotation.constraint.NonnullElements;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.xml.SerializeSupport;
 
@@ -83,15 +85,16 @@ public class EncryptNameIDs extends AbstractEncryptAction {
     @Nonnull private Function<ProfileRequestContext,SAMLObject> messageLookupStrategy;
     
     /** Formats to exclude from encryption. */
-    @Nonnull @NonnullElements private Set<String> excludedFormats;
+    @Nonnull private Set<String> excludedFormats;
     
     /** The message to operate on. */
-    @Nullable private SAMLObject message;
+    @NonnullBeforeExec private SAMLObject message;
     
     /** Constructor. */
     public EncryptNameIDs() {
-        messageLookupStrategy = new MessageLookup<>(SAMLObject.class).compose(new OutboundMessageContextLookup());
-        excludedFormats = Collections.singleton(NameID.ENTITY);
+        messageLookupStrategy = new MessageLookup<>(SAMLObject.class).compose(
+                new OutboundMessageContextLookup());
+        excludedFormats = CollectionSupport.singleton(NameID.ENTITY);
     }
 
     /**
@@ -110,8 +113,8 @@ public class EncryptNameIDs extends AbstractEncryptAction {
      * 
      * @param formats   formats to exclude
      */
-    public void setExcludedFormats(@Nonnull @NonnullElements final Collection<String> formats) {
-        excludedFormats = Set.copyOf(StringSupport.normalizeStringCollection(formats));
+    public void setExcludedFormats(@Nonnull final Collection<String> formats) {
+        excludedFormats = CollectionSupport.copyToSet(StringSupport.normalizeStringCollection(formats));
     }
 
     /** {@inheritDoc} */
@@ -127,6 +130,10 @@ public class EncryptNameIDs extends AbstractEncryptAction {
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+        
         message = messageLookupStrategy.apply(profileRequestContext);
 
         if (message != null && message instanceof ArtifactResponse) {
@@ -138,7 +145,7 @@ public class EncryptNameIDs extends AbstractEncryptAction {
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
 // Checkstyle: CyclomaticComplexity OFF
@@ -147,24 +154,25 @@ public class EncryptNameIDs extends AbstractEncryptAction {
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         try {
             
-            if (message instanceof AuthnRequest) {
-                processSubject(((AuthnRequest) message).getSubject());
-            } else if (message instanceof SubjectQuery) {
-                processSubject(((SubjectQuery) message).getSubject());
-            } else if (message instanceof Response) {
-                for (final Assertion a : ((Response) message).getAssertions()) {
+            if (message instanceof AuthnRequest m) {
+                processSubject(m.getSubject());
+            } else if (message instanceof SubjectQuery m) {
+                processSubject(m.getSubject());
+            } else if (message instanceof Response m) {
+                for (final Assertion a : m.getAssertions()) {
+                    assert a != null;
                     processAssertion(a);
                 }
-            } else if (message instanceof LogoutRequest) {
-                processLogoutRequest((LogoutRequest) message);
-            } else if (message instanceof ManageNameIDRequest) {
-                processManageNameIDRequest((ManageNameIDRequest) message);
-            } else if (message instanceof NameIDMappingRequest) {
-                processNameIDMappingRequest((NameIDMappingRequest) message);
-            } else if (message instanceof NameIDMappingResponse) {
-                processNameIDMappingResponse((NameIDMappingResponse) message);
-            } else if (message instanceof Assertion) {
-                processAssertion((Assertion) message);
+            } else if (message instanceof LogoutRequest m) {
+                processLogoutRequest(m);
+            } else if (message instanceof ManageNameIDRequest m) {
+                processManageNameIDRequest(m);
+            } else if (message instanceof NameIDMappingRequest m) {
+                processNameIDMappingRequest(m);
+            } else if (message instanceof NameIDMappingResponse m) {
+                processNameIDMappingResponse(m);
+            } else if (message instanceof Assertion m) {
+                processAssertion(m);
             } else {
                 log.debug("{} Message was of unrecognized type {}, nothing to do", getLogPrefix(),
                         message.getClass().getName());
@@ -184,24 +192,22 @@ public class EncryptNameIDs extends AbstractEncryptAction {
      * 
      * @return  true iff encryption should happen
      */
-    private boolean shouldEncrypt(@Nullable final NameID name) {
-        if (name != null) {
-            String format = name.getFormat();
-            if (format == null) {
-                format = NameID.UNSPECIFIED;
-            }
-            if (!excludedFormats.contains(format)) {
-                if (log.isDebugEnabled()) {
-                    try {
-                        final Element dom = XMLObjectSupport.marshall(name);
-                        log.debug("{} NameID before encryption:\n{}", getLogPrefix(),
-                                SerializeSupport.prettyPrintXML(dom));
-                    } catch (final MarshallingException e) {
-                        log.error("{} Unable to marshall NameID for logging purposes", getLogPrefix(), e);
-                    }
+    private boolean shouldEncrypt(@Nonnull final NameID name) {
+        String format = name.getFormat();
+        if (format == null) {
+            format = NameID.UNSPECIFIED;
+        }
+        if (!excludedFormats.contains(format)) {
+            if (log.isDebugEnabled()) {
+                try {
+                    final Element dom = XMLObjectSupport.marshall(name);
+                    log.debug("{} NameID before encryption:\n{}", getLogPrefix(),
+                            SerializeSupport.prettyPrintXML(dom));
+                } catch (final MarshallingException e) {
+                    log.error("{} Unable to marshall NameID for logging purposes", getLogPrefix(), e);
                 }
-                return true;
             }
+            return true;
         }
         return false;
     }
@@ -216,17 +222,19 @@ public class EncryptNameIDs extends AbstractEncryptAction {
     private void processSubject(@Nullable final Subject subject) throws EncryptionException {
         
         if (subject != null) {
-            if (shouldEncrypt(subject.getNameID())) {
+            NameID nameID = subject.getNameID();
+            if (nameID != null && shouldEncrypt(nameID)) {
                 log.debug("{} Encrypt NameID in Subject", getLogPrefix());
-                final EncryptedID encrypted = getEncrypter().encrypt(subject.getNameID());
+                final EncryptedID encrypted = getEncrypter().encrypt(nameID);
                 subject.setEncryptedID(encrypted);
                 subject.setNameID(null);
             }
             
             for (final SubjectConfirmation sc : subject.getSubjectConfirmations()) {
-                if (shouldEncrypt(sc.getNameID())) {
+                nameID = sc.getNameID();
+                if (nameID != null && shouldEncrypt(nameID)) {
                     log.debug("{} Encrypt NameID in SubjectConfirmation", getLogPrefix());
-                    final EncryptedID encrypted = getEncrypter().encrypt(sc.getNameID());
+                    final EncryptedID encrypted = getEncrypter().encrypt(nameID);
                     sc.setEncryptedID(encrypted);
                     sc.setNameID(null);
                 }
@@ -242,10 +250,10 @@ public class EncryptNameIDs extends AbstractEncryptAction {
      * @throws EncryptionException if an error occurs
      */
     private void processLogoutRequest(@Nonnull final LogoutRequest request) throws EncryptionException {
-        
-        if (shouldEncrypt(request.getNameID())) {
+        final NameID nameID = request.getNameID();
+        if (nameID != null && shouldEncrypt(nameID)) {
             log.debug("{} Encrypting NameID in LogoutRequest", getLogPrefix());
-            final EncryptedID encrypted = getEncrypter().encrypt(request.getNameID());
+            final EncryptedID encrypted = getEncrypter().encrypt(nameID);
             request.setEncryptedID(encrypted);
             request.setNameID(null);
         }
@@ -260,16 +268,18 @@ public class EncryptNameIDs extends AbstractEncryptAction {
      */
     private void processManageNameIDRequest(@Nonnull final ManageNameIDRequest request) throws EncryptionException {
         
-        if (shouldEncrypt(request.getNameID())) {
+        final NameID nameID = request.getNameID();
+        if (nameID != null && shouldEncrypt(nameID)) {
             log.debug("{} Encrypting NameID in ManageNameIDRequest", getLogPrefix());
-            final EncryptedID encrypted = getEncrypter().encrypt(request.getNameID());
+            final EncryptedID encrypted = getEncrypter().encrypt(nameID);
             request.setEncryptedID(encrypted);
             request.setNameID(null);
         }
         
-        if (request.getNewID() != null) {
+        final NewID newID = request.getNewID();
+        if (newID != null && request.getNewID() != null) {
             log.debug("{} Encrypting NewID in ManageNameIDRequest", getLogPrefix());
-            final NewEncryptedID encrypted = getEncrypter().encrypt(request.getNewID());
+            final NewEncryptedID encrypted = getEncrypter().encrypt(newID);
             request.setNewEncryptedID(encrypted);
             request.setNewID(null);
         }
@@ -284,9 +294,10 @@ public class EncryptNameIDs extends AbstractEncryptAction {
      */
     private void processNameIDMappingRequest(@Nonnull final NameIDMappingRequest request) throws EncryptionException {
         
-        if (shouldEncrypt(request.getNameID())) {
+        final NameID nameID = request.getNameID();
+        if (nameID != null && shouldEncrypt(nameID)) {
             log.debug("{} Encrypting NameID in NameIDMappingRequest", getLogPrefix());
-            final EncryptedID encrypted = getEncrypter().encrypt(request.getNameID());
+            final EncryptedID encrypted = getEncrypter().encrypt(nameID);
             request.setEncryptedID(encrypted);
             request.setNameID(null);
         }
@@ -302,9 +313,10 @@ public class EncryptNameIDs extends AbstractEncryptAction {
     private void processNameIDMappingResponse(@Nonnull final NameIDMappingResponse response)
             throws EncryptionException {
         
-        if (shouldEncrypt(response.getNameID())) {
+        final NameID nameID = response.getNameID();
+        if (nameID != null && shouldEncrypt(nameID)) {
             log.debug("{} Encrypting NameID in NameIDMappingResponse", getLogPrefix());
-            final EncryptedID encrypted = getEncrypter().encrypt(response.getNameID());
+            final EncryptedID encrypted = getEncrypter().encrypt(nameID);
             response.setEncryptedID(encrypted);
             response.setNameID(null);
         }
@@ -321,15 +333,17 @@ public class EncryptNameIDs extends AbstractEncryptAction {
 
         processSubject(assertion.getSubject());            
         
-        if (assertion.getConditions() != null) {
-            for (final Condition c : assertion.getConditions().getConditions()) {
+        final Conditions conditions = assertion.getConditions();
+        if (conditions != null) {
+            for (final Condition c : conditions.getConditions()) {
                 if (!(c instanceof DelegationRestrictionType)) {
                     continue;
                 }
                 for (final Delegate d : ((DelegationRestrictionType) c).getDelegates()) {
-                    if (shouldEncrypt(d.getNameID())) {
+                    final NameID nameID = d.getNameID();
+                    if (nameID != null && shouldEncrypt(nameID)) {
                         log.debug("{} Encrypting NameID in Delegate", getLogPrefix());
-                        final EncryptedID encrypted = getEncrypter().encrypt(d.getNameID());
+                        final EncryptedID encrypted = getEncrypter().encrypt(nameID);
                         d.setEncryptedID(encrypted);
                         d.setNameID(null);
                     }
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContext.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContext.java
index 03e1eca4d..e9fa02745 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContext.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContext.java
@@ -24,6 +24,7 @@ import java.util.function.Function;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.context.navigate.ChildContextLookup;
 import org.opensaml.profile.action.AbstractConditionalProfileAction;
 import org.opensaml.profile.action.ActionSupport;
@@ -34,9 +35,9 @@ import org.opensaml.saml.common.binding.SAMLBindingSupport;
 import org.opensaml.saml.common.messaging.context.ECPContext;
 import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action to create and populate an {@link ECPContext} based on the request and, when encryption is in use,
@@ -44,6 +45,7 @@ import net.shibboleth.shared.logic.Constraint;
  * 
  * @event {@link EventIds#PROCEED_EVENT_ID}
  * @event {@link EventIds#INVALID_MSG_CTX}
+ * @event {@link EventIds#INVALID_SEC_CFG}
  */
 public class PopulateECPContext extends AbstractConditionalProfileAction {
 
@@ -141,8 +143,8 @@ public class PopulateECPContext extends AbstractConditionalProfileAction {
             return;
         }
         
-        ecpContext.setRequestAuthenticated(
-                SAMLBindingSupport.isMessageSigned(profileRequestContext.getInboundMessageContext()));
+        final MessageContext inbound = profileRequestContext.getInboundMessageContext();
+        ecpContext.setRequestAuthenticated(inbound != null && SAMLBindingSupport.isMessageSigned(inbound));
         log.debug("{} RequestAuthenticated: {}", getLogPrefix(), ecpContext.isRequestAuthenticated());
         
         boolean generateKey = true;
@@ -156,8 +158,14 @@ public class PopulateECPContext extends AbstractConditionalProfileAction {
         }
      
         if (generateKey) {
+            if (randomGenerator == null) {
+                log.warn("{} Unable to generate ECP session key, random source was null");
+                ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_SEC_CFG);
+                return;
+            }
             log.debug("{} Generating session key for use by ECP peers", getLogPrefix());
             final byte[] key = new byte[32];
+            assert randomGenerator != null;
             randomGenerator.nextBytes(key);
             ecpContext.setSessionKey(key);
         } else {
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifact.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifact.java
index 066140a51..a9dd023a2 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifact.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifact.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import org.opensaml.messaging.context.navigate.MessageLookup;
 import org.opensaml.profile.action.AbstractProfileAction;
@@ -34,14 +33,16 @@ import org.opensaml.saml.common.binding.artifact.SAMLArtifactMap;
 import org.opensaml.saml.common.binding.artifact.SAMLArtifactMap.SAMLArtifactMapEntry;
 import org.opensaml.saml.common.messaging.context.navigate.SAMLMessageContextIssuerFunction;
 import org.opensaml.saml.common.profile.SAMLEventIds;
+import org.opensaml.saml.saml2.core.Artifact;
 import org.opensaml.saml.saml2.core.ArtifactResolve;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Action that resolves a SAML 2.0 artifact inside an {@link ArtifactResolve} request located
@@ -75,18 +76,18 @@ public class ResolveArtifact extends AbstractProfileAction {
     
     /** Artifact mapper. */
     @NonnullAfterInit private SAMLArtifactMap artifactMap;
-
-    /** Request to process. */
-    @Nullable private ArtifactResolve request;
+    
+    /** Artifact to resolve. */
+    @NonnullBeforeExec private String artifact;
     
     /** Response to populate. */
-    @Nullable private ArtifactResponse response;
+    @NonnullBeforeExec private ArtifactResponse response;
     
     /** Identity of issuer. */
-    @Nullable private String issuerId;
+    @NonnullBeforeExec private String issuerId;
 
     /** Identity of requester. */
-    @Nullable private String requesterId;
+    @NonnullBeforeExec private String requesterId;
     
     /** Constructor. */
     public ResolveArtifact() {
@@ -167,13 +168,21 @@ public class ResolveArtifact extends AbstractProfileAction {
     @Override
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         
-        request = requestLookupStrategy.apply(profileRequestContext);
+        if (!super.doPreExecute(profileRequestContext)) {
+            return false;
+        }
+
+        final ArtifactResolve request = requestLookupStrategy.apply(profileRequestContext);
         if (request == null) {
             log.debug("{} No request located", getLogPrefix());
             ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MSG_CTX);
             return false;
-        } else if (request.getArtifact() == null || request.getArtifact().getValue() == null) {
-            log.debug("{} No Artifact element found in request, nothing to do", getLogPrefix());
+        }
+        
+        final Artifact artifactObject = request.getArtifact();
+        artifact = artifactObject != null ? artifactObject.getValue() : null;
+        if (artifact== null) {
+            log.debug("{} No Artifact found in request, nothing to do", getLogPrefix());
             ActionSupport.buildEvent(profileRequestContext, EventIds.INVALID_MSG_CTX);
             return false;
         }
@@ -199,14 +208,12 @@ public class ResolveArtifact extends AbstractProfileAction {
             return false;
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
 
     /** {@inheritDoc} */
     @Override
     protected void doExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
-        
-        final String artifact = request.getArtifact().getValue();
 
         SAMLArtifactMapEntry entry = null;
         
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertions.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertions.java
index 41f106a4d..60522c33c 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertions.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertions.java
@@ -37,13 +37,14 @@ import org.opensaml.saml.saml2.assertion.SAML20AssertionValidator;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.Response;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import jakarta.servlet.http.HttpServletRequest;
-import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.annotation.constraint.NonnullBeforeExec;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A profile action which resolves SAML 2.0 Assertions from the profile request context
@@ -63,29 +64,26 @@ public class ValidateAssertions extends AbstractProfileAction {
     /** Flag which indicates whether a failure of Assertion validation should be considered fatal. */
     private boolean invalidFatal;
     
-    /** The SAML 2.0 Assertion validator, may be null.*/
-    @Nullable private SAML20AssertionValidator assertionValidator;
-    
     /** The SAML 2.0 Assertion validator lookup function, may be null.*/
-    @Nullable
+    @Nonnull
     private Function<Pair<ProfileRequestContext, Assertion>, SAML20AssertionValidator> assertionValidatorLookup;
     
     /** Function that builds a {@link ValidationContext} instance based on a 
      * {@link AssertionValidationInput} instance. */
-    @NonnullAfterInit private Function<AssertionValidationInput, ValidationContext> validationContextBuilder;
+    @Nonnull private Function<AssertionValidationInput, ValidationContext> validationContextBuilder;
     
     /** The resolver for the list of assertions to be validated. */
     @Nonnull private Function<ProfileRequestContext, List<Assertion>> assertionResolver;
     
     /** The resolved assertions to be validated. */
-    private List<Assertion> assertions;
+    @NonnullBeforeExec private List<Assertion> assertions;
     
     /** Constructor. */
     public ValidateAssertions() {
-        super();
         setInvalidFatal(true);
-        setValidationContextBuilder(new DefaultAssertionValidationContextBuilder());
-        setAssertionResolver(new DefaultAssertionResolver());
+        assertionValidatorLookup = FunctionSupport.constant(null);
+        validationContextBuilder = new DefaultAssertionValidationContextBuilder();
+        assertionResolver = new DefaultAssertionResolver();
     }
 
     /**
@@ -104,7 +102,7 @@ public class ValidateAssertions extends AbstractProfileAction {
      */
     public void setAssertionResolver(@Nonnull final Function<ProfileRequestContext, List<Assertion>> function) {
         checkSetterPreconditions();
-        assertionResolver = function;
+        assertionResolver = Constraint.isNotNull(function, "Assertion resolver cannot be null");
     }
 
     /**
@@ -117,7 +115,7 @@ public class ValidateAssertions extends AbstractProfileAction {
      * 
      * @return the builder function
      */
-    @NonnullAfterInit
+    @Nonnull
     public Function<AssertionValidationInput, ValidationContext> getValidationContextBuilder() {
         return validationContextBuilder;
     }
@@ -135,7 +133,7 @@ public class ValidateAssertions extends AbstractProfileAction {
     public void setValidationContextBuilder(
             @Nonnull final Function<AssertionValidationInput, ValidationContext> builder) {
         checkSetterPreconditions();
-        validationContextBuilder = builder;
+        validationContextBuilder = Constraint.isNotNull(builder, "ValidationContext builder cannot be null");
     }
 
     /**
@@ -166,12 +164,16 @@ public class ValidateAssertions extends AbstractProfileAction {
     }
     
     /**
-     * Get the locally-configured Assertion validator.
+     * Get the configured Assertion validator.
+     * 
+     * @param profileRequestContext  profile request context
+     * @param assertion assertion
      * 
-     * @return the local Assertion validator, or null
+     * @return the Assertion validator, or null
      */
-    @Nullable public SAML20AssertionValidator getAssertionValidator() {
-        return assertionValidator;
+    @Nullable public SAML20AssertionValidator getAssertionValidator(
+            @Nonnull final ProfileRequestContext profileRequestContext, @Nonnull final Assertion assertion) {
+        return assertionValidatorLookup.apply(new Pair<>(profileRequestContext, assertion));
     }
 
     /**
@@ -181,17 +183,7 @@ public class ValidateAssertions extends AbstractProfileAction {
      */
     public void setAssertionValidator(@Nullable final SAML20AssertionValidator validator) {
         checkSetterPreconditions();
-        assertionValidator = validator;
-    }
-    
-    /**
-     * Get the Assertion validator lookup function.
-     * 
-     * @return the Assertion validator lookup function, or null
-     */
-    @Nullable
-    public Function<Pair<ProfileRequestContext, Assertion>, SAML20AssertionValidator> getAssertionValidatorLookup() {
-        return assertionValidatorLookup;
+        assertionValidatorLookup = FunctionSupport.constant(validator);
     }
 
     /**
@@ -200,33 +192,18 @@ public class ValidateAssertions extends AbstractProfileAction {
      * @param function the Assertion validator lookup function, may be null
      */
     public void setAssertionValidatorLookup(
-            @Nullable final Function<Pair<ProfileRequestContext, Assertion>, SAML20AssertionValidator> function) {
+            @Nonnull final Function<Pair<ProfileRequestContext, Assertion>, SAML20AssertionValidator> function) {
         checkSetterPreconditions();
-        assertionValidatorLookup = function;
+        assertionValidatorLookup = Constraint.isNotNull(function, "AssertionValidator lookup function cannot be null");
     }
 
     /** {@inheritDoc} */
     protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
         
-        if (getAssertionResolver() == null) {
-            throw new ComponentInitializationException("Assertion resolver function cannot be null");
-        }
-
-        if (getValidationContextBuilder() == null) {
-            throw new ComponentInitializationException("ValidationContext builder cannot be null");
-        }
-        
         if (getHttpServletRequest() == null) {
             throw new ComponentInitializationException("HttpServletRequest cannot be null");
         }
-        
-        if (getAssertionValidator() == null) {
-            if (getAssertionValidatorLookup() == null) {
-                throw new ComponentInitializationException("Both Assertion validator and lookup function were null");
-            }
-            log.info("{} Assertion validator is null, must be resovleable via the lookup function", getLogPrefix());
-        }
     }
 
     /** {@inheritDoc} */
@@ -249,7 +226,8 @@ public class ValidateAssertions extends AbstractProfileAction {
     protected void doExecute(@Nonnull final ProfileRequestContext profileContext) {
         boolean sawNonValid = false;
         for (final Assertion assertion : assertions) {
-            final SAML20AssertionValidator validator = resolveValidator(profileContext, assertion);
+            assert assertion != null;
+            final SAML20AssertionValidator validator = getAssertionValidator(profileContext, assertion);
             if (validator == null) {
                 log.warn("{} No SAML20AssertionValidator was available, terminating", getLogPrefix());
                 ActionSupport.buildEvent(profileContext, SAMLEventIds.UNABLE_VALIDATE_ASSERTION);
@@ -299,36 +277,6 @@ public class ValidateAssertions extends AbstractProfileAction {
         assertion.getObjectMetadata().put(new ValidationProcessingData(validationContext, validationResult));
     }
 
-    /**
-     * Resolve the Assertion token validator to use with the specified Assertion.
-     * 
-     * @param profileContext the current profile context
-     * @param assertion the assertion being evaluated
-     * 
-     * @return the token validator
-     */
-    @Nullable protected SAML20AssertionValidator resolveValidator(@Nonnull final ProfileRequestContext profileContext, 
-            @Nonnull final Assertion assertion) {
-        
-        if (getAssertionValidatorLookup() != null) {
-            log.debug("{} Attempting to resolve SAML 2 Assertion validator via lookup function", getLogPrefix());
-            final SAML20AssertionValidator validator = getAssertionValidatorLookup().apply(
-                    new Pair<>(profileContext, assertion));
-            if (validator != null) {
-                log.debug("{} Resolved SAML 2 Assertion validator via lookup function", getLogPrefix());
-                return validator;
-            }
-        }
-        
-        if (getAssertionValidator() != null) {
-            log.debug("{} Resolved locally configured SAML 2 Assertion validator", getLogPrefix());
-            return getAssertionValidator();
-        }
-        
-        log.debug("{} No SAML 2 Assertion validator could be resolved", getLogPrefix());
-        return null;
-    }
-
     /**
      * Build the Assertion ValidationContext.
      * 
@@ -342,8 +290,10 @@ public class ValidateAssertions extends AbstractProfileAction {
     @Nonnull protected ValidationContext buildValidationContext(@Nonnull final ProfileRequestContext profileContext, 
             @Nonnull final Assertion assertion) throws AssertionValidationException {
         
+        final HttpServletRequest servletRequest = getHttpServletRequest();
+        assert servletRequest != null;
         final ValidationContext validationContext = getValidationContextBuilder().apply(
-                new AssertionValidationInput(profileContext, getHttpServletRequest(), assertion));
+                new AssertionValidationInput(profileContext, servletRequest, assertion));
         
         if (validationContext == null) {
             log.warn("{} ValidationContext produced was null", getLogPrefix());
@@ -359,8 +309,9 @@ public class ValidateAssertions extends AbstractProfileAction {
     public class DefaultAssertionResolver implements Function<ProfileRequestContext, List<Assertion>> {
 
         /** {@inheritDoc} */
-        public List<Assertion> apply(@Nonnull final ProfileRequestContext profileContext) {
-            final SAMLObject message = (SAMLObject) profileContext.getInboundMessageContext().getMessage();
+        public List<Assertion> apply(@Nullable final ProfileRequestContext profileContext) {
+            final SAMLObject message = profileContext != null
+                    ? (SAMLObject) profileContext.ensureInboundMessageContext().getMessage() : null;
             if (message instanceof Response) {
                 return ((Response) message).getAssertions();
             }
@@ -375,13 +326,13 @@ public class ValidateAssertions extends AbstractProfileAction {
      */
     public static class AssertionValidationInput {
         /** The profile request context input. */
-        private ProfileRequestContext profileContext;
+        @Nonnull private ProfileRequestContext profileContext;
         
         /** The HTTP request input. */
-        private HttpServletRequest httpServletRequest;
+        @Nonnull private HttpServletRequest httpServletRequest;
         
         /** The Assertion being evaluated. */
-        private Assertion assertion;
+        @Nonnull private Assertion assertion;
 
         /**
          * Constructor.
@@ -423,7 +374,6 @@ public class ValidateAssertions extends AbstractProfileAction {
         @Nonnull public Assertion getAssertion() {
             return assertion;
         }
-
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilder.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilder.java
index f2ce46381..85939929d 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilder.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilder.java
@@ -22,7 +22,6 @@ import java.net.UnknownHostException;
 import java.security.PublicKey;
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -31,8 +30,10 @@ import java.util.function.Function;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazySet;
 import net.shibboleth.shared.collection.Pair;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 import net.shibboleth.shared.resolver.CriteriaSet;
 import net.shibboleth.shared.servlet.HttpServletSupport;
@@ -43,15 +44,16 @@ import org.opensaml.saml.common.assertion.ValidationContext;
 import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.opensaml.saml.saml2.assertion.SAML2AssertionValidationParameters;
 import org.opensaml.saml.saml2.core.Assertion;
+import org.opensaml.saml.saml2.core.Issuer;
 import org.opensaml.security.SecurityException;
 import org.opensaml.security.credential.UsageType;
 import org.opensaml.security.criteria.UsageCriterion;
 import org.opensaml.security.messaging.ServletRequestX509CredentialAdapter;
 import org.opensaml.security.x509.X509Credential;
+import org.opensaml.xmlsec.SignatureValidationParameters;
 import org.opensaml.xmlsec.context.SecurityParametersContext;
 import org.opensaml.xmlsec.signature.support.SignatureValidationParametersCriterion;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  *  Function which implements default behavior for building an instance of {@link ValidationContext}
@@ -61,10 +63,10 @@ public class DefaultSAML20AssertionValidationContextBuilder
         implements Function<SAML20AssertionTokenValidationInput, ValidationContext> {
     
     /** Logger. */
-    @Nullable private Logger log = LoggerFactory.getLogger(DefaultSAML20AssertionValidationContextBuilder.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(DefaultSAML20AssertionValidationContextBuilder.class);
     
     /** A function for resolving the signature validation CriteriaSet for a particular function. */
-    private Function<Pair<MessageContext, Assertion>, CriteriaSet> signatureCriteriaSetFunction;
+    @Nullable private Function<Pair<MessageContext, Assertion>, CriteriaSet> signatureCriteriaSetFunction;
     
     /** Flag indicating whether an Assertion signature is required. */
     private boolean signatureRequired;
@@ -195,8 +197,9 @@ public class DefaultSAML20AssertionValidationContextBuilder
     @Nonnull protected CriteriaSet getSignatureCriteriaSet(@Nonnull final SAML20AssertionTokenValidationInput input) {
         final CriteriaSet criteriaSet = new CriteriaSet();
         
-        if (getSignatureCriteriaSetFunction() != null) {
-            final CriteriaSet dynamicCriteria = getSignatureCriteriaSetFunction().apply(
+        final var criteriaFunction = getSignatureCriteriaSetFunction(); 
+        if (criteriaFunction != null) {
+            final CriteriaSet dynamicCriteria = criteriaFunction.apply(
                     new Pair<>(input.getMessageContext(), input.getAssertion()));
             if (dynamicCriteria != null) {
                 criteriaSet.addAll(dynamicCriteria);
@@ -204,13 +207,13 @@ public class DefaultSAML20AssertionValidationContextBuilder
         }
         
         if (!criteriaSet.contains(EntityIdCriterion.class)) {
-            String issuer = null;
-            if (input.getAssertion().getIssuer() != null) {
-                issuer = StringSupport.trimOrNull(input.getAssertion().getIssuer().getValue());
-            }
-            if (issuer != null) {
-                log.debug("Adding internally-generated EntityIdCriterion with value of: {}", issuer);
-                criteriaSet.add(new EntityIdCriterion(issuer));
+            final Issuer issuerObj = input.getAssertion().getIssuer();
+            if (issuerObj != null) {
+                final String issuer = StringSupport.trimOrNull(issuerObj.getValue());
+                if (issuer != null) {
+                    log.debug("Adding internally-generated EntityIdCriterion with value of: {}", issuer);
+                    criteriaSet.add(new EntityIdCriterion(issuer));
+                }
             }
         }
         
@@ -222,9 +225,10 @@ public class DefaultSAML20AssertionValidationContextBuilder
         if (!criteriaSet.contains(SignatureValidationParametersCriterion.class)) {
             final SecurityParametersContext secParamsContext =
                     input.getMessageContext().getSubcontext(SecurityParametersContext.class);
-            if (secParamsContext != null && secParamsContext.getSignatureValidationParameters() != null) {
-                criteriaSet.add(new SignatureValidationParametersCriterion(
-                        secParamsContext.getSignatureValidationParameters()));
+            final SignatureValidationParameters params = secParamsContext != null
+                    ? secParamsContext.getSignatureValidationParameters() : null;
+            if (params != null) {
+                criteriaSet.add(new SignatureValidationParametersCriterion(params));
             }
         }
         
@@ -333,10 +337,10 @@ public class DefaultSAML20AssertionValidationContextBuilder
                 return validAddresses;
             }
             log.warn("Could not determine attester IP address. Validation of Assertion may or may not succeed");
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         } catch (final UnknownHostException e) {
             log.warn("Processing of attester IP address failed. Validation of Assertion may or may not succeed", e);
-            return Collections.emptySet();
+            return CollectionSupport.emptySet();
         }
     }
     
@@ -351,7 +355,7 @@ public class DefaultSAML20AssertionValidationContextBuilder
      * 
      * @return the IP address of the attester
      */
-    @Nonnull protected String getAttesterIPAddress(@Nonnull final SAML20AssertionTokenValidationInput input) {
+    @Nullable protected String getAttesterIPAddress(@Nonnull final SAML20AssertionTokenValidationInput input) {
         return HttpServletSupport.getRemoteAddr(input.getHttpServletRequest());
     }
     
@@ -379,4 +383,4 @@ public class DefaultSAML20AssertionValidationContextBuilder
         return validAudiences;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/SAML20AssertionTokenValidationInput.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/SAML20AssertionTokenValidationInput.java
index 345a04e4d..992ea260c 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/SAML20AssertionTokenValidationInput.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/SAML20AssertionTokenValidationInput.java
@@ -31,13 +31,13 @@ import net.shibboleth.shared.logic.Constraint;
 public class SAML20AssertionTokenValidationInput {
     
     /** The message context input. */
-    private MessageContext messageContext;
+    @Nonnull private MessageContext messageContext;
     
     /** The HTTP request input. */
-    private HttpServletRequest httpServletRequest;
+    @Nonnull private HttpServletRequest httpServletRequest;
     
     /** The Assertion being evaluated. */
-    private Assertion assertion;
+    @Nonnull private Assertion assertion;
 
     /**
      * Constructor.
@@ -80,4 +80,4 @@ public class SAML20AssertionTokenValidationInput {
         return assertion;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
index f94e70008..f2eabb597 100644
--- a/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
+++ b/opensaml-saml-impl/src/main/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandler.java
@@ -17,7 +17,6 @@
 
 package org.opensaml.saml.saml2.wssecurity.messaging.impl;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
 
@@ -43,16 +42,18 @@ import org.opensaml.soap.wssecurity.WSSecurityConstants;
 import org.opensaml.soap.wssecurity.messaging.Token.ValidationStatus;
 import org.opensaml.soap.wssecurity.messaging.WSSecurityContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
 import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.collection.LazyList;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.NonnullSupplier;
 
 /**
@@ -71,11 +72,8 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
     /** Flag which indicates whether a failure of Assertion validation should be considered fatal. */
     private boolean invalidFatal;
     
-    /** The SAML 2.0 Assertion validator, may be null.*/
-    @Nullable private SAML20AssertionValidator assertionValidator;
-    
-    /** The SAML 2.0 Assertion validator lookup function, may be null.*/
-    @Nullable private Function<Pair<MessageContext, Assertion>, SAML20AssertionValidator> assertionValidatorLookup;
+    /** The SAML 2.0 Assertion validator lookup function.*/
+    @Nonnull private Function<Pair<MessageContext, Assertion>, SAML20AssertionValidator> assertionValidatorLookup;
     
     /** Function that builds a {@link ValidationContext} instance based on a 
      * {@link SAML20AssertionTokenValidationInput} instance. */
@@ -86,6 +84,7 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
     public WSSecuritySAML20AssertionTokenSecurityHandler() {
         setInvalidFatal(true);
         setValidationContextBuilder(new DefaultSAML20AssertionValidationContextBuilder());
+        assertionValidatorLookup = FunctionSupport.constant(null);
     }
 
     /**
@@ -125,10 +124,10 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
      * @return current HTTP request
      */
     @Nullable public HttpServletRequest getHttpServletRequest() {
-        if (httpServletRequestSupplier == null) {
-            return null;
+        if (httpServletRequestSupplier != null) {
+            return httpServletRequestSupplier.get();
         }
-        return httpServletRequestSupplier.get();
+        return null;
     }
 
     /**
@@ -179,22 +178,26 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
     }
     
     /**
-     * Get the locally-configured Assertion validator.
+     * Get the configured Assertion validator.
+     * 
+     * @param messageContext input message context 
+     * @param assertion input assertion
      * 
-     * @return the local Assertion validator, or null
+     * @return the configured Assertion validator, or null
      */
-    @Nullable public SAML20AssertionValidator getAssertionValidator() {
-        return assertionValidator;
+    @Nullable public SAML20AssertionValidator getAssertionValidator(@Nullable final MessageContext messageContext,
+            @Nullable final Assertion assertion) {
+        return assertionValidatorLookup.apply(new Pair<>(messageContext, assertion));
     }
 
     /**
-     * Set the locally-configured Assertion validator.
+     * Set a locally-configured Assertion validator.
      * 
      * @param validator the local Assertion validator, may be null
      */
     public void setAssertionValidator(@Nullable final SAML20AssertionValidator validator) {
         checkSetterPreconditions();
-        assertionValidator = validator;
+        assertionValidatorLookup = FunctionSupport.constant(validator);
     }
     
     /**
@@ -212,9 +215,9 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
      * @param function the Assertion validator lookup function, may be null
      */
     public void setAssertionValidatorLookup(
-            @Nullable final Function<Pair<MessageContext, Assertion>, SAML20AssertionValidator> function) {
+            @Nonnull final Function<Pair<MessageContext, Assertion>, SAML20AssertionValidator> function) {
         checkSetterPreconditions();
-        assertionValidatorLookup = function;
+        assertionValidatorLookup = Constraint.isNotNull(function, "Assertion validator lookup function cannot be null");
     }
 
     /** {@inheritDoc} */
@@ -228,13 +231,6 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
         if (getHttpServletRequest() == null) {
             throw new ComponentInitializationException("HttpServletRequest cannot be null");
         }
-        
-        if (getAssertionValidator() == null) {
-            if (getAssertionValidatorLookup() == null) {
-                throw new ComponentInitializationException("Both Assertion validator and lookup function were null");
-            }
-            log.info("Assertion validator is null, must be resovleable via the lookup function");
-        }
     }
 
 // Checkstyle: ReturnCount OFF
@@ -254,7 +250,8 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
         final WSSecurityContext wsContext = messageContext.ensureSubcontext(WSSecurityContext.class);
         
         for (final Assertion assertion : assertions) {
-            final SAML20AssertionValidator validator = resolveValidator(messageContext, assertion);
+            assert assertion != null;
+            final SAML20AssertionValidator validator = getAssertionValidator(messageContext, assertion);
             if (validator == null) {
                 log.warn("No SAML20AssertionValidator was available, terminating");
                 SOAPMessagingSupport.registerSOAP11Fault(messageContext, FaultCode.SERVER, 
@@ -340,36 +337,6 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
         
     }
 
-    /**
-     * Resolve the Assertion token validator to use with the specified Assertion.
-     * 
-     * @param messageContext the current message context
-     * @param assertion the assertion being evaluated
-     * 
-     * @return the token validator
-     */
-    @Nullable protected SAML20AssertionValidator resolveValidator(@Nonnull final MessageContext messageContext, 
-            @Nonnull final Assertion assertion) {
-        
-        if (getAssertionValidatorLookup() != null) {
-            log.debug("Attempting to resolve SAML 2 Assertion validator via lookup function");
-            final SAML20AssertionValidator validator = getAssertionValidatorLookup().apply(
-                    new Pair<>(messageContext, assertion));
-            if (validator != null) {
-                log.debug("Resolved SAML 2 Assertion validator via lookup function");
-                return validator;
-            }
-        }
-        
-        if (getAssertionValidator() != null) {
-            log.debug("Resolved locally configured SAML 2 Assertion validator");
-            return getAssertionValidator();
-        }
-        
-        log.debug("No SAML 2 Assertion validator could be resolved");
-        return null;
-    }
-
     /**
      * Build the Assertion ValidationContext.
      * 
@@ -383,8 +350,16 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
     @Nonnull protected ValidationContext buildValidationContext(@Nonnull final MessageContext messageContext, 
             @Nonnull final Assertion assertion) throws MessageHandlerException {
         
+        final HttpServletRequest servletRequest = getHttpServletRequest();
+        if (servletRequest == null) {
+            log.warn("HttpServletRequest was null");
+            SOAPMessagingSupport.registerSOAP11Fault(messageContext, FaultCode.SERVER, 
+                    "Internal processing error", null, null, null);
+            throw new MessageHandlerException("HttpServletRequest was null");
+        }
+        
         final ValidationContext validationContext = getValidationContextBuilder().apply(
-                new SAML20AssertionTokenValidationInput(messageContext, getHttpServletRequest(), assertion));
+                new SAML20AssertionTokenValidationInput(messageContext, servletRequest, assertion));
         
         if (validationContext == null) {
             log.warn("ValidationContext produced was null");
@@ -408,7 +383,7 @@ public class WSSecuritySAML20AssertionTokenSecurityHandler extends AbstractMessa
                 Security.ELEMENT_NAME);
         if (securityHeaders == null || securityHeaders.isEmpty()) {
             log.debug("No WS-Security Security header found in inbound SOAP message. Skipping further processing.");
-            return Collections.emptyList();
+            return CollectionSupport.emptyList();
         }
         
         final LazyList<Assertion> assertions = new LazyList<>();
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AbstractSAML2NameIDGeneratorTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AbstractSAML2NameIDGeneratorTest.java
index 668c086d0..7e5894624 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AbstractSAML2NameIDGeneratorTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AbstractSAML2NameIDGeneratorTest.java
@@ -48,7 +48,7 @@ public class AbstractSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase {
         mock.initialize();
         
         final NameID nameId = mock.generate(new ProfileRequestContext(), mock.getFormat());
-        Assert.assertNotNull(nameId);
+        assert nameId != null;
         Assert.assertEquals(nameId.getValue(), "foo");
         Assert.assertEquals(nameId.getSPProvidedID(), "bar");
         Assert.assertEquals(nameId.getNameQualifier(), NAME_QUALIFIER);
@@ -65,7 +65,7 @@ public class AbstractSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase {
         mock.initialize();
         
         final NameID nameId = mock.generate(new ProfileRequestContext(), mock.getFormat());
-        Assert.assertNotNull(nameId);
+        assert nameId != null;
         Assert.assertEquals(nameId.getValue(), "foo");
         Assert.assertNull(nameId.getNameQualifier());
         Assert.assertNull(nameId.getSPNameQualifier());
@@ -79,7 +79,7 @@ public class AbstractSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase {
         mock.initialize();
         
         final NameID nameId = mock.generate(new ProfileRequestContext(), mock.getFormat());
-        Assert.assertNotNull(nameId);
+        assert nameId != null;
         Assert.assertEquals(nameId.getValue(), "foo");
         Assert.assertNull(nameId.getNameQualifier());
         Assert.assertNull(nameId.getSPNameQualifier());
@@ -92,7 +92,7 @@ public class AbstractSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase {
         mock.initialize();
         
         final NameID nameId = mock.generate(new ProfileRequestContext(), mock.getFormat());
-        Assert.assertNotNull(nameId);
+        assert nameId != null;
         Assert.assertEquals(nameId.getValue(), "foo");
         Assert.assertEquals(nameId.getNameQualifier(), NAME_QUALIFIER);
         Assert.assertEquals(nameId.getSPNameQualifier(), SP_NAME_QUALIFIER);
@@ -108,7 +108,7 @@ public class AbstractSAML2NameIDGeneratorTest extends OpenSAMLInitBaseTestCase {
         
         /** {@inheritDoc} */
         @Override
-        protected String getIdentifier(ProfileRequestContext profileRequestContext) throws SAMLException {
+        protected String getIdentifier(@Nonnull final ProfileRequestContext profileRequestContext) throws SAMLException {
             return "foo";
         }
     }
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertionsTest.java
index 64cbbb35e..235ff98ac 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddChannelBindingsToAssertionsTest.java
@@ -26,6 +26,7 @@ import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.saml.common.messaging.context.ChannelBindingsContext;
 import org.opensaml.saml.ext.saml2cb.ChannelBindings;
+import org.opensaml.saml.saml2.core.Advice;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
@@ -43,6 +44,11 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
     
     private AddChannelBindingsToAssertions action;
     
+    /**
+     * Test set up.
+     * 
+     * @throws ComponentInitializationException
+     */
     @BeforeMethod
     public void setUp() throws ComponentInitializationException {
         
@@ -62,7 +68,7 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
     @Test
     public void testNoResponse() {
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(cbc);
+        prc.ensureOutboundMessageContext().addSubcontext(cbc);
 
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, EventIds.INVALID_MSG_CTX);
@@ -82,7 +88,7 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
     public void testNoAssertion() {
         final ProfileRequestContext prc = new RequestContextBuilder().setOutboundMessage(
                 SAML2ActionTestingSupport.buildResponse()).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(cbc);
+        prc.ensureOutboundMessageContext().addSubcontext(cbc);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -101,7 +107,7 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(cbc);
+        prc.ensureOutboundMessageContext().addSubcontext(cbc);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -109,9 +115,10 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getAdvice());
-        Assert.assertEquals(assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
-        Assert.assertEquals(((ChannelBindings) assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
+        final Advice advice = assertion.getAdvice();
+        assert advice != null;
+        Assert.assertEquals(advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
+        Assert.assertEquals(((ChannelBindings) advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
     }
 
     /**
@@ -129,14 +136,15 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(cbc);
+        prc.ensureOutboundMessageContext().addSubcontext(cbc);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        Assert.assertNotNull(assertion.getAdvice());
-        Assert.assertEquals(assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
-        Assert.assertEquals(((ChannelBindings) assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
+        final Advice advice = assertion.getAdvice();
+        assert advice != null;
+        Assert.assertEquals(advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
+        Assert.assertEquals(((ChannelBindings) advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
     }
 
     /** Test that the advice is properly added if there are multiple assertions in the response. */
@@ -149,7 +157,7 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(cbc);
+        prc.ensureOutboundMessageContext().addSubcontext(cbc);
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -158,9 +166,10 @@ public class AddChannelBindingsToAssertionsTest  extends OpenSAMLInitBaseTestCas
         Assert.assertEquals(response.getAssertions().size(), 3);
 
         for (final Assertion assertion : response.getAssertions()) {
-            Assert.assertNotNull(assertion.getAdvice());
-            Assert.assertEquals(assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
-            Assert.assertEquals(((ChannelBindings) assertion.getAdvice().getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
+            final Advice advice = assertion.getAdvice();
+            assert advice != null;
+            Assert.assertEquals(advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).size(), 1);
+            Assert.assertEquals(((ChannelBindings) advice.getChildren(ChannelBindings.DEFAULT_ELEMENT_NAME).get(0)).getType(), "foo");
         }
     }
     
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertionsTest.java
index fdd469c68..d7e17a4a5 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddGeneratedKeyToAssertionsTest.java
@@ -28,6 +28,7 @@ import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.common.messaging.context.ECPContext;
 import org.opensaml.saml.ext.samlec.GeneratedKey;
+import org.opensaml.saml.saml2.core.Advice;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.profile.SAML2ActionSupport;
@@ -41,13 +42,24 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
 
     private ECPContext ecp;
     
+    private String encodedKey;
+    
     private AddGeneratedKeyToAssertions action;
     
+    /**
+     * Test set up.
+     * 
+     * @throws ComponentInitializationException
+     * @throws EncodingException 
+     */
     @BeforeMethod
-    public void setUp() throws ComponentInitializationException {
+    public void setUp() throws ComponentInitializationException, EncodingException {
         
         ecp = new ECPContext();
-        ecp.setSessionKey(new byte[]{1, 2, 3});
+        final byte[] key = new byte[]{1, 2, 3};
+        ecp.setSessionKey(key);
+        
+        encodedKey = Base64Support.encode(key, false);
         
         action = new AddGeneratedKeyToAssertions();
         action.initialize();
@@ -57,7 +69,7 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
     @Test
     public void testNoResponse() {
         final ProfileRequestContext prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(ecp);
+        prc.ensureOutboundMessageContext().addSubcontext(ecp);
 
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, EventIds.INVALID_MSG_CTX);
@@ -77,7 +89,7 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
     public void testNoAssertion() {
         final ProfileRequestContext prc = new RequestContextBuilder().setOutboundMessage(
                 SAML2ActionTestingSupport.buildResponse()).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(ecp);
+        prc.ensureOutboundMessageContext().addSubcontext(ecp);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -97,7 +109,7 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(ecp);
+        prc.ensureOutboundMessageContext().addSubcontext(ecp);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -105,10 +117,11 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getAdvice());
-        Assert.assertEquals(assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
-        final GeneratedKey key = ((GeneratedKey) assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
-        Assert.assertEquals(key.getValue(), Base64Support.encode(ecp.getSessionKey(), false));
+        final Advice advice = assertion.getAdvice();
+        assert advice != null;
+        Assert.assertEquals(advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
+        final GeneratedKey key = ((GeneratedKey) advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
+        Assert.assertEquals(key.getValue(), encodedKey);
     }
 
     /**
@@ -127,15 +140,16 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(ecp);
+        prc.ensureOutboundMessageContext().addSubcontext(ecp);
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        Assert.assertNotNull(assertion.getAdvice());
-        Assert.assertEquals(assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
-        final GeneratedKey key = ((GeneratedKey) assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
-        Assert.assertEquals(key.getValue(), Base64Support.encode(ecp.getSessionKey(), false));
+        final Advice advice = assertion.getAdvice();
+        assert advice != null;
+        Assert.assertEquals(advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
+        final GeneratedKey key = ((GeneratedKey) advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
+        Assert.assertEquals(key.getValue(), encodedKey);
     }
 
     /** Test that the advice is properly added if there are multiple assertions in the response. 
@@ -149,7 +163,7 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
 
         final ProfileRequestContext prc =
                 new RequestContextBuilder().setOutboundMessage(response).buildProfileRequestContext();
-        prc.getOutboundMessageContext().addSubcontext(ecp);
+        prc.ensureOutboundMessageContext().addSubcontext(ecp);
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
@@ -158,10 +172,11 @@ public class AddGeneratedKeyToAssertionsTest  extends OpenSAMLInitBaseTestCase {
         Assert.assertEquals(response.getAssertions().size(), 3);
 
         for (final Assertion assertion : response.getAssertions()) {
-            Assert.assertNotNull(assertion.getAdvice());
-            Assert.assertEquals(assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
-            final GeneratedKey key = ((GeneratedKey) assertion.getAdvice().getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
-            Assert.assertEquals(key.getValue(), Base64Support.encode(ecp.getSessionKey(), false));
+            final Advice advice = assertion.getAdvice();
+            assert advice != null;
+            Assert.assertEquals(advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).size(), 1);
+            final GeneratedKey key = ((GeneratedKey) advice.getChildren(GeneratedKey.DEFAULT_ELEMENT_NAME).get(0));
+            Assert.assertEquals(key.getValue(), encodedKey);
         }
     }
     
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjectsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjectsTest.java
index a34c15770..f61aeba0f 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjectsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddNameIDToSubjectsTest.java
@@ -26,7 +26,9 @@ import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.PredicateSupport;
 import net.shibboleth.shared.resolver.ResolverException;
 
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
@@ -37,12 +39,12 @@ import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.common.SAMLException;
 import org.opensaml.saml.common.SAMLObjectBuilder;
 import org.opensaml.saml.common.binding.impl.SAMLMetadataLookupHandlerTest;
-import org.opensaml.saml.common.profile.NameIdentifierGenerator;
 import org.opensaml.saml.common.profile.SAMLEventIds;
 import org.opensaml.saml.common.profile.logic.AffiliationNameIDPolicyPredicate;
 import org.opensaml.saml.metadata.resolver.impl.FilesystemMetadataResolver;
 import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.opensaml.saml.saml2.core.Issuer;
 import org.opensaml.saml.saml2.core.NameID;
 import org.opensaml.saml.saml2.core.NameIDPolicy;
 import org.opensaml.saml.saml2.core.Response;
@@ -55,9 +57,8 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicates;
-
 /** Test for {@link AddNameIDToSubjects}. */
+ at SuppressWarnings("javadoc")
 public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
 
     private static final String NAME_QUALIFIER = "https://idp.example.org";
@@ -101,7 +102,7 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
 
         final MockSAML2NameIDGenerator mock2 = new MockSAML2NameIDGenerator("bar");
         mock2.setFormat(NameID.EMAIL);
-        mock2.setActivationCondition(Predicates.<ProfileRequestContext>alwaysFalse());
+        mock2.setActivationCondition(PredicateSupport.alwaysFalse());
         mock2.initialize();
 
         final MockSAML2NameIDGenerator mock3 = new MockSAML2NameIDGenerator("baz");
@@ -113,7 +114,7 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         mock4.initialize();
         
         generator = new ChainingSAML2NameIDGenerator();
-        generator.setGenerators(Arrays.<NameIdentifierGenerator<NameID>>asList(mock, mock2, mock3, mock4));
+        generator.setGenerators(CollectionSupport.listOf(mock, mock2, mock3, mock4));
 
         action.setNameIDGenerator(generator);
         
@@ -128,18 +129,18 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = (Assertion) prc.getOutboundMessageContext().getMessage();
-        Subject subject = assertion.getSubject();
+        final Assertion assertion = (Assertion) prc.ensureOutboundMessageContext().ensureMessage();
+        final Subject subject = assertion.getSubject();
         Assert.assertNull(subject);
     }
 
     @Test
     public void testNoAssertions() throws ComponentInitializationException {
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
         action.initialize();
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertTrue(((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().isEmpty());
+        Assert.assertTrue(((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().isEmpty());
     }
 
     @Test void testRequiredFormat() throws ComponentInitializationException {
@@ -148,25 +149,27 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         final NameIDPolicy policy = policyBuilder.buildObject();
         policy.setFormat(NameID.EMAIL);
         request.setNameIDPolicy(policy);
-        prc.getInboundMessageContext().setMessage(request);
+        prc.ensureInboundMessageContext().setMessage(request);
         
         action.initialize();
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baz");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.EMAIL);
+        assert subject != null;
+        NameID nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baz");
+        Assert.assertEquals(nameID.getFormat(), NameID.EMAIL);
 
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(1);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(1);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baz");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.EMAIL);
+        assert subject != null;
+        nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baz");
+        Assert.assertEquals(nameID.getFormat(), NameID.EMAIL);
     }
 
     @Test void testRequiredFormatError() throws ComponentInitializationException {
@@ -175,13 +178,13 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         final NameIDPolicy policy = policyBuilder.buildObject();
         policy.setFormat(NameID.KERBEROS);
         request.setNameIDPolicy(policy);
-        prc.getInboundMessageContext().setMessage(request);
+        prc.ensureInboundMessageContext().setMessage(request);
         
         action.initialize();
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.INVALID_NAMEID_POLICY);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
         Assert.assertNull(subject);
     }
@@ -193,26 +196,29 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         policy.setFormat(NameID.PERSISTENT);
         policy.setSPNameQualifier("foo");
         request.setNameIDPolicy(policy);
-        prc.getInboundMessageContext().setMessage(request);
+        prc.ensureInboundMessageContext().setMessage(request);
         
         action.initialize();
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.INVALID_NAMEID_POLICY);
 
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
         Assert.assertNull(subject);
         
-        policy.setSPNameQualifier(request.getIssuer().getValue());
+        final Issuer issuer = request.getIssuer();
+        assert issuer != null;
+        policy.setSPNameQualifier(issuer.getValue());
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baf");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.PERSISTENT);
+        assert subject != null;
+        final NameID nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baf");
+        Assert.assertEquals(nameID.getFormat(), NameID.PERSISTENT);
     }
     
     @Test void testAffiliation() throws ComponentInitializationException {
@@ -222,7 +228,7 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         policy.setFormat(NameID.UNSPECIFIED);
         policy.setSPNameQualifier("foo");
         request.setNameIDPolicy(policy);
-        prc.getInboundMessageContext().setMessage(request);
+        prc.ensureInboundMessageContext().setMessage(request);
         
         final AffiliationNameIDPolicyPredicate predicate = new AffiliationNameIDPolicyPredicate();
         predicate.setMetadataResolver(metadataResolver);
@@ -234,7 +240,7 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.INVALID_NAMEID_POLICY);
 
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
         Assert.assertNull(subject);
         
@@ -243,12 +249,13 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baf");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.PERSISTENT);
+        assert subject != null;
+        final NameID nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baf");
+        Assert.assertEquals(nameID.getFormat(), NameID.PERSISTENT);
     }
     
     @Test void testArbitraryFormat() throws ComponentInitializationException {
@@ -258,11 +265,11 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
         Assert.assertNull(subject);
 
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(1);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(1);
         subject = assertion.getSubject();
         Assert.assertNull(subject);
     }
@@ -275,19 +282,21 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "foo");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.X509_SUBJECT);
+        assert subject != null;
+        NameID nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "foo");
+        Assert.assertEquals(nameID.getFormat(), NameID.X509_SUBJECT);
 
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(1);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(1);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "foo");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.X509_SUBJECT);
+        assert subject != null;
+        nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "foo");
+        Assert.assertEquals(nameID.getFormat(), NameID.X509_SUBJECT);
     }
 
     @Test void testMultipleGenerators() throws ComponentInitializationException {
@@ -298,19 +307,21 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baz");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.EMAIL);
+        assert subject != null;
+        NameID nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baz");
+        Assert.assertEquals(nameID.getFormat(), NameID.EMAIL);
 
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(1);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(1);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "baz");
-        Assert.assertEquals(subject.getNameID().getFormat(), NameID.EMAIL);
+        assert subject != null;
+        nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "baz");
+        Assert.assertEquals(nameID.getFormat(), NameID.EMAIL);
     }
     
     /** Set up the test message with some assertions. */
@@ -318,7 +329,7 @@ public class AddNameIDToSubjectsTest extends XMLObjectBaseTestCase {
         final Response response = SAML2ActionTestingSupport.buildResponse();
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
     }
     
     private class MockSAML2NameIDGenerator extends AbstractSAML2NameIDGenerator {
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertionsTest.java
index d9b4fb0c5..9cf2069bf 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddOneTimeUseConditionToAssertionsTest.java
@@ -40,6 +40,11 @@ public class AddOneTimeUseConditionToAssertionsTest  extends OpenSAMLInitBaseTes
 
     private AddOneTimeUseConditionToAssertions action;
     
+    /**
+     * Test set up.
+     * 
+     * @throws ComponentInitializationException
+     */
     @BeforeMethod
     public void setUp() throws ComponentInitializationException {
         action = new AddOneTimeUseConditionToAssertions();
@@ -85,8 +90,9 @@ public class AddOneTimeUseConditionToAssertionsTest  extends OpenSAMLInitBaseTes
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getOneTimeUse());
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getOneTimeUse());
     }
 
     /**
@@ -118,8 +124,9 @@ public class AddOneTimeUseConditionToAssertionsTest  extends OpenSAMLInitBaseTes
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getOneTimeUse());
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getOneTimeUse());
     }
 
     /** Test that the condition is properly added if there are multiple assertions in the response. */
@@ -140,8 +147,9 @@ public class AddOneTimeUseConditionToAssertionsTest  extends OpenSAMLInitBaseTes
         Assert.assertEquals(response.getAssertions().size(), 3);
 
         for (final Assertion assertion : response.getAssertions()) {
-            Assert.assertNotNull(assertion.getConditions());
-            Assert.assertNotNull(assertion.getConditions().getOneTimeUse());
+            final Conditions c = assertion.getConditions();
+            assert c != null;
+            Assert.assertNotNull(c.getOneTimeUse());
         }
     }
     
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertionsTest.java
index f87c0de8a..ce9ff2aa7 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddProxyRestrictionToAssertionsTest.java
@@ -49,6 +49,9 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
     
     private AddProxyRestrictionToAssertions action;
     
+    /**
+     * Test set up.
+     */
     @BeforeMethod public void setUp() {
         action = new AddProxyRestrictionToAssertions();
         action.setProxyRestrictionLookupStrategy(FunctionSupport.constant(new Pair<>(1,CollectionSupport.setOf(AUDIENCE1, AUDIENCE2))));
@@ -103,9 +106,11 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-        final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getProxyRestriction());
+        final ProxyRestriction proxy = c.getProxyRestriction();
+        assert proxy != null;
         Assert.assertEquals(proxy.getProxyCount(), Integer.valueOf(0));
         Assert.assertTrue(proxy.getAudiences().isEmpty());
     }
@@ -132,9 +137,11 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-        final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getProxyRestriction());
+        final ProxyRestriction proxy = c.getProxyRestriction();
+        assert proxy != null;
         Assert.assertEquals(proxy.getProxyCount(), Integer.valueOf(1));
         Assert.assertTrue(proxy.getAudiences().isEmpty());
     }
@@ -161,9 +168,11 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-        final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getProxyRestriction());
+        final ProxyRestriction proxy = c.getProxyRestriction();
+        assert proxy != null;
         Assert.assertNull(proxy.getProxyCount());
         Assert.assertEquals(proxy.getAudiences().stream().map(Audience::getURI).collect(Collectors.toUnmodifiableSet()),
                 CollectionSupport.setOf(AUDIENCE1, AUDIENCE2));
@@ -190,9 +199,11 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         Assert.assertNotNull(response.getAssertions());
         Assert.assertEquals(response.getAssertions().size(), 1);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-        final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getProxyRestriction());
+        final ProxyRestriction proxy = c.getProxyRestriction();
+        assert proxy != null;
         Assert.assertEquals(proxy.getProxyCount(), Integer.valueOf(1));
         Assert.assertEquals(proxy.getAudiences().stream().map(Audience::getURI).collect(Collectors.toUnmodifiableSet()),
                 CollectionSupport.setOf(AUDIENCE1, AUDIENCE2));
@@ -222,9 +233,11 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        Assert.assertNotNull(assertion.getConditions());
-        Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-        final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+        final Conditions c = assertion.getConditions();
+        assert c != null;
+        Assert.assertNotNull(c.getProxyRestriction());
+        final ProxyRestriction proxy = c.getProxyRestriction();
+        assert proxy != null;
         Assert.assertEquals(proxy.getProxyCount(), Integer.valueOf(1));
         Assert.assertEquals(proxy.getAudiences().stream().map(Audience::getURI).collect(Collectors.toUnmodifiableSet()),
                 CollectionSupport.setOf(AUDIENCE1, AUDIENCE2));
@@ -250,13 +263,15 @@ public class AddProxyRestrictionToAssertionsTest extends OpenSAMLInitBaseTestCas
         Assert.assertEquals(response.getAssertions().size(), 3);
 
         for (Assertion assertion : response.getAssertions()) {
-            Assert.assertNotNull(assertion.getConditions());
-            Assert.assertNotNull(assertion.getConditions().getProxyRestriction());
-            final ProxyRestriction proxy = assertion.getConditions().getProxyRestriction();
+            final Conditions c = assertion.getConditions();
+            assert c != null;
+            Assert.assertNotNull(c.getProxyRestriction());
+            final ProxyRestriction proxy = c.getProxyRestriction();
+            assert proxy != null;
             Assert.assertEquals(proxy.getProxyCount(), Integer.valueOf(1));
             Assert.assertEquals(proxy.getAudiences().stream().map(Audience::getURI).collect(Collectors.toUnmodifiableSet()),
                     CollectionSupport.setOf(AUDIENCE1, AUDIENCE2));
         }
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShellTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShellTest.java
index bdbfb5d6e..7c57043a2 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShellTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusResponseShellTest.java
@@ -18,13 +18,13 @@
 package org.opensaml.saml.saml2.profile.impl;
 
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
-import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.profile.action.EventIds;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.common.SAMLVersion;
 import org.opensaml.saml.saml2.core.ArtifactResponse;
+import org.opensaml.saml.saml2.core.Issuer;
 import org.opensaml.saml.saml2.core.LogoutResponse;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Status;
@@ -37,6 +37,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link AddStatusResponseShell} unit test. */
+ at SuppressWarnings("javadoc")
 public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
 
     private String issuer;
@@ -60,10 +61,8 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        final MessageContext outMsgCtx = prc.getOutboundMessageContext();
-        final Response response = (Response) outMsgCtx.getMessage();
+        final Response response = (Response) prc.ensureOutboundMessageContext().ensureMessage();
 
-        Assert.assertNotNull(response);
         Assert.assertNotNull(response.getID());
         Assert.assertNotNull(response.getIssueInstant());
         Assert.assertEquals(response.getVersion(), SAMLVersion.VERSION_20);
@@ -71,9 +70,10 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         Assert.assertNull(response.getIssuer());
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
-        Assert.assertNotNull(status.getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getValue(), StatusCode.SUCCESS);
+        assert status != null;
+        final StatusCode code = status.getStatusCode();
+        assert code != null;
+        Assert.assertEquals(code.getValue(), StatusCode.SUCCESS);
     }
 
     @Test public void testAddResponseWithIssuer() throws ComponentInitializationException {
@@ -87,13 +87,11 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        final MessageContext outMsgCtx = prc.getOutboundMessageContext();
-        final Response response = (Response) outMsgCtx.getMessage();
-
-        Assert.assertNotNull(response);
+        final Response response = (Response) prc.ensureOutboundMessageContext().ensureMessage();
         
-        Assert.assertNotNull(response.getIssuer());
-        Assert.assertEquals(response.getIssuer().getValue(), "foo");
+        final Issuer issuer = response.getIssuer();
+        assert issuer != null;
+        Assert.assertEquals(issuer.getValue(), "foo");
     }
     
     @Test public void testAddResponseWhenResponseAlreadyExist() throws ComponentInitializationException {
@@ -116,10 +114,8 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        final MessageContext outMsgCtx = prc.getOutboundMessageContext();
-        final ArtifactResponse response = (ArtifactResponse) outMsgCtx.getMessage();
+        final ArtifactResponse response = (ArtifactResponse) prc.ensureOutboundMessageContext().ensureMessage();
 
-        Assert.assertNotNull(response);
         Assert.assertNotNull(response.getID());
         Assert.assertNotNull(response.getIssueInstant());
         Assert.assertEquals(response.getVersion(), SAMLVersion.VERSION_20);
@@ -127,9 +123,10 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         Assert.assertNull(response.getIssuer());
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
-        Assert.assertNotNull(status.getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getValue(), StatusCode.SUCCESS);
+        assert status != null;
+        final StatusCode code = status.getStatusCode();
+        assert code != null;
+        Assert.assertEquals(code.getValue(), StatusCode.SUCCESS);
     }
     
     @Test public void testAddLogoutResponse() throws ComponentInitializationException {
@@ -141,10 +138,8 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
 
-        final MessageContext outMsgCtx = prc.getOutboundMessageContext();
-        final LogoutResponse response = (LogoutResponse) outMsgCtx.getMessage();
+        final LogoutResponse response = (LogoutResponse) prc.ensureOutboundMessageContext().ensureMessage();
 
-        Assert.assertNotNull(response);
         Assert.assertNotNull(response.getID());
         Assert.assertNotNull(response.getIssueInstant());
         Assert.assertEquals(response.getVersion(), SAMLVersion.VERSION_20);
@@ -152,9 +147,10 @@ public class AddStatusResponseShellTest extends OpenSAMLInitBaseTestCase {
         Assert.assertNull(response.getIssuer());
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
-        Assert.assertNotNull(status.getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getValue(), StatusCode.SUCCESS);
+        assert status != null;
+        final StatusCode code = status.getStatusCode();
+        assert code != null;
+        Assert.assertEquals(code.getValue(), StatusCode.SUCCESS);
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponseTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponseTest.java
index 4bec94621..dc0be09fc 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponseTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddStatusToResponseTest.java
@@ -17,8 +17,6 @@
 
 package org.opensaml.saml.saml2.profile.impl;
 
-import java.util.Arrays;
-
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
@@ -26,14 +24,17 @@ import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Status;
 import org.opensaml.saml.saml2.core.StatusCode;
+import org.opensaml.saml.saml2.core.StatusMessage;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** {@link AddStatusToResponse} unit test. */
+ at SuppressWarnings("javadoc")
 public class AddStatusToResponseTest extends OpenSAMLInitBaseTestCase {
     
     private ProfileRequestContext prc;
@@ -52,35 +53,38 @@ public class AddStatusToResponseTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final Response response = (Response) prc.getOutboundMessageContext().getMessage();
+        final Response response = (Response) prc.ensureOutboundMessageContext().ensureMessage();
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
-        
-        Assert.assertNotNull(status.getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getValue(), StatusCode.RESPONDER);
-        Assert.assertNull(status.getStatusCode().getStatusCode());
+        assert status != null;
+        final StatusCode code = status.getStatusCode();
+        assert code != null;
+        Assert.assertEquals(code.getValue(), StatusCode.RESPONDER);
+        Assert.assertNull(code.getStatusCode());
         
         Assert.assertNull(status.getStatusMessage());
     }
 
     @Test public void testMultiStatus() throws ComponentInitializationException {
-        action.setStatusCodes(Arrays.asList(StatusCode.REQUESTER, StatusCode.REQUEST_VERSION_DEPRECATED));
+        action.setStatusCodes(CollectionSupport.listOf(StatusCode.REQUESTER, StatusCode.REQUEST_VERSION_DEPRECATED));
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final Response response = (Response) prc.getOutboundMessageContext().getMessage();
+        final Response response = (Response) prc.ensureOutboundMessageContext().ensureMessage();
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
+        assert status != null;
+        StatusCode code = status.getStatusCode();
+        assert code != null;
+        
+        Assert.assertEquals(code.getValue(), StatusCode.REQUESTER);
         
-        Assert.assertNotNull(status.getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getValue(), StatusCode.REQUESTER);
-        Assert.assertNotNull(status.getStatusCode().getStatusCode());
-        Assert.assertEquals(status.getStatusCode().getStatusCode().getValue(), StatusCode.REQUEST_VERSION_DEPRECATED);
-        Assert.assertNull(status.getStatusCode().getStatusCode().getStatusCode());
+        code = code.getStatusCode();
+        assert code != null;
+        Assert.assertEquals(code.getValue(), StatusCode.REQUEST_VERSION_DEPRECATED);
+        Assert.assertNull(code.getStatusCode());
         
         Assert.assertNull(status.getStatusMessage());
     }
@@ -92,11 +96,13 @@ public class AddStatusToResponseTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final Response response = (Response) prc.getOutboundMessageContext().getMessage();
+        final Response response = (Response) prc.ensureOutboundMessageContext().ensureMessage();
 
         final Status status = response.getStatus();
-        Assert.assertNotNull(status);
-        Assert.assertEquals(status.getStatusMessage().getValue(), "Foo");
+        assert status != null;
+        final StatusMessage msg = status.getStatusMessage();
+        assert msg != null;
+        Assert.assertEquals(msg.getValue(), "Foo");
     }
     
  }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjectsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjectsTest.java
index dab672997..ff871a606 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjectsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/AddSubjectConfirmationToSubjectsTest.java
@@ -72,14 +72,14 @@ public class AddSubjectConfirmationToSubjectsTest extends OpenSAMLInitBaseTestCa
 
     @Test
     public void testNoAssertions() throws ComponentInitializationException {
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
         
         action.setMethod(SubjectConfirmation.METHOD_BEARER);
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertTrue(((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().isEmpty());
+        Assert.assertTrue(((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().isEmpty());
     }
 
     @Test void testSuccess() throws ComponentInitializationException {
@@ -91,24 +91,24 @@ public class AddSubjectConfirmationToSubjectsTest extends OpenSAMLInitBaseTestCa
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         Subject subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
+        assert subject != null;
         Assert.assertEquals(subject.getSubjectConfirmations().size(), 1);
         Assert.assertEquals(subject.getSubjectConfirmations().get(0).getMethod(), SubjectConfirmation.METHOD_BEARER);
         
-        assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(1);
+        assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(1);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
+        assert subject != null;
         Assert.assertEquals(subject.getSubjectConfirmations().size(), 1);
         Assert.assertEquals(subject.getSubjectConfirmations().get(0).getMethod(), SubjectConfirmation.METHOD_BEARER);
         
         final SubjectConfirmationData data = subject.getSubjectConfirmations().get(0).getSubjectConfirmationData();
-        Assert.assertNotNull(data);
+        assert data != null;
         Assert.assertNull(data.getRecipient());
         Assert.assertNotNull(data.getNotOnOrAfter());
         Assert.assertEquals(data.getAddress(), "127.0.0.1");
-        Assert.assertEquals(data.getInResponseTo(), ((AuthnRequest) prc.getInboundMessageContext().getMessage()).getID());
+        Assert.assertEquals(data.getInResponseTo(), ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getID());
     }
 
     @Test void testNoAddress() throws ComponentInitializationException {
@@ -121,13 +121,13 @@ public class AddSubjectConfirmationToSubjectsTest extends OpenSAMLInitBaseTestCa
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        final Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         final Subject subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
+        assert subject != null;
         Assert.assertEquals(subject.getSubjectConfirmations().size(), 1);
         
         final SubjectConfirmationData data = subject.getSubjectConfirmations().get(0).getSubjectConfirmationData();
-        Assert.assertNotNull(data);
+        assert data != null;
         Assert.assertNull(data.getAddress());
     }
 
@@ -136,10 +136,10 @@ public class AddSubjectConfirmationToSubjectsTest extends OpenSAMLInitBaseTestCa
         final Response response = SAML2ActionTestingSupport.buildResponse();
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
-        prc.getOutboundMessageContext().setMessage(response);
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAuthnRequest());
-        prc.getInboundMessageContext().getSubcontext(SAMLMessageInfoContext.class, true);
-        response.setInResponseTo(((AuthnRequest) prc.getInboundMessageContext().getMessage()).getID());
+        prc.ensureOutboundMessageContext().setMessage(response);
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAuthnRequest());
+        prc.ensureInboundMessageContext().ensureSubcontext(SAMLMessageInfoContext.class);
+        response.setInResponseTo(((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getID());
     }
     
 }
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequestTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequestTest.java
index 2613aad57..747a8c8ad 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequestTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/CopyNameIDFromRequestTest.java
@@ -23,6 +23,7 @@ import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.saml2.core.Assertion;
+import org.opensaml.saml.saml2.core.NameID;
 import org.opensaml.saml.saml2.core.Response;
 import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
@@ -33,6 +34,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Test for {@link CopyNameIDFromRequest}. */
+ at SuppressWarnings("javadoc")
 public class CopyNameIDFromRequestTest extends OpenSAMLInitBaseTestCase {
 
     private static final String NAME_QUALIFIER = "https://idp.example.org";
@@ -57,17 +59,17 @@ public class CopyNameIDFromRequestTest extends OpenSAMLInitBaseTestCase {
 
     @Test
     public void testNoAssertions() {
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
 
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertTrue(((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().isEmpty());
+        Assert.assertTrue(((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().isEmpty());
     }
 
     @Test
     public void testNoRequest() {
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
-        ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         addAssertions();
 
         action.execute(prc);
@@ -76,11 +78,11 @@ public class CopyNameIDFromRequestTest extends OpenSAMLInitBaseTestCase {
 
     @Test
     public void testNoName() {
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
-        ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         addAssertions();
 
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAttributeQueryRequest(null));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAttributeQueryRequest(null));
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, EventIds.INVALID_MSG_CTX);
@@ -89,19 +91,22 @@ public class CopyNameIDFromRequestTest extends OpenSAMLInitBaseTestCase {
     @Test void testCopy() {
         
         Subject subject = SAML2ActionTestingSupport.buildSubject("jdoe");
-        subject.getNameID().setNameQualifier(NAME_QUALIFIER);
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAttributeQueryRequest(subject));
+        NameID nameID = subject.getNameID();
+        assert nameID != null;
+        nameID.setNameQualifier(NAME_QUALIFIER);
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildAttributeQueryRequest(subject));
         addAssertions();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assertion assertion = ((Response) prc.getOutboundMessageContext().getMessage()).getAssertions().get(0);
+        Assertion assertion = ((Response) prc.ensureOutboundMessageContext().ensureMessage()).getAssertions().get(0);
         subject = assertion.getSubject();
-        Assert.assertNotNull(subject);
-        Assert.assertNotNull(subject.getNameID());
-        Assert.assertEquals(subject.getNameID().getValue(), "jdoe");
-        Assert.assertEquals(subject.getNameID().getNameQualifier(), NAME_QUALIFIER);
+        assert subject != null;
+        nameID = subject.getNameID();
+        assert nameID != null;
+        Assert.assertEquals(nameID.getValue(), "jdoe");
+        Assert.assertEquals(nameID.getNameQualifier(), NAME_QUALIFIER);
     }
 
     /** Set up the test message with some assertions. */
@@ -109,7 +114,7 @@ public class CopyNameIDFromRequestTest extends OpenSAMLInitBaseTestCase {
         final Response response = SAML2ActionTestingSupport.buildResponse();
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDsTest.java
index 78c25f291..154bc13e7 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/DecryptNameIDsTest.java
@@ -70,6 +70,12 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
 
     private SAMLObjectBuilder<Subject> subjectBuilder;
     
+    /**
+     * Test set up.
+     * 
+     * @throws NoSuchAlgorithmException
+     * @throws KeyException
+     */
     @BeforeMethod
     public void setUp() throws NoSuchAlgorithmException, KeyException {
         encURI = EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128;
@@ -92,12 +98,17 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         decParams.setDataKeyInfoCredentialResolver(keyResolver);
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getInboundMessageContext().getSubcontext(
-                SecurityParametersContext.class, true).setDecryptionParameters(decParams);
+        prc.ensureInboundMessageContext().ensureSubcontext(
+                SecurityParametersContext.class).setDecryptionParameters(decParams);
         
         action = new DecryptNameIDs();
     }
     
+    /**
+     * Test with no message.
+     * 
+     * @throws ComponentInitializationException
+     */
     @Test
     public void testNoMessage() throws ComponentInitializationException {
         action.initialize();
@@ -115,8 +126,8 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEncryptedNameIDNoParams() throws EncryptionException, ComponentInitializationException {
         final AuthnRequest authnRequest = SAML2ActionTestingSupport.buildAuthnRequest();
-        prc.getInboundMessageContext().setMessage(authnRequest);
-        final Subject subject = subjectBuilder.buildObject();
+        prc.ensureInboundMessageContext().setMessage(authnRequest);
+        Subject subject = subjectBuilder.buildObject();
         authnRequest.setSubject(subject);
         
         final NameID nameId = nameIdBuilder.buildObject();
@@ -128,11 +139,14 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
 
         action.initialize();
         
-        prc.getInboundMessageContext().removeSubcontext(SecurityParametersContext.class);
+        prc.ensureInboundMessageContext().removeSubcontext(SecurityParametersContext.class);
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.DECRYPT_NAMEID_FAILED);
-        Assert.assertNull(authnRequest.getSubject().getNameID());
+        
+        subject = ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
         
         action = new DecryptNameIDs();
         action.setErrorFatal(false);
@@ -140,7 +154,10 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertNull(authnRequest.getSubject().getNameID());
+
+        subject = ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
     }
 
     
@@ -153,11 +170,11 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEncryptedNameID() throws EncryptionException, ComponentInitializationException {
         final AuthnRequest authnRequest = SAML2ActionTestingSupport.buildAuthnRequest();
-        prc.getInboundMessageContext().setMessage(authnRequest);
-        final Subject subject = subjectBuilder.buildObject();
+        prc.ensureInboundMessageContext().setMessage(authnRequest);
+        Subject subject = subjectBuilder.buildObject();
         authnRequest.setSubject(subject);
         
-        final NameID nameId = nameIdBuilder.buildObject();
+        NameID nameId = nameIdBuilder.buildObject();
         nameId.setFormat(NameID.TRANSIENT);
         nameId.setValue("foo");
         
@@ -168,9 +185,12 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertNotNull(authnRequest.getSubject().getNameID());
-        Assert.assertEquals(authnRequest.getSubject().getNameID().getValue(), "foo");
-        Assert.assertEquals(authnRequest.getSubject().getNameID().getFormat(), NameID.TRANSIENT);
+        subject = ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getSubject();
+        assert subject != null;
+        nameId = subject.getNameID();
+        assert nameId != null;
+        Assert.assertEquals(nameId.getValue(), "foo");
+        Assert.assertEquals(nameId.getFormat(), NameID.TRANSIENT);
     }
 
     /**
@@ -181,8 +201,8 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testWrongKeyFatal() throws Exception {
         final AuthnRequest authnRequest = SAML2ActionTestingSupport.buildAuthnRequest();
-        prc.getInboundMessageContext().setMessage(authnRequest);
-        final Subject subject = subjectBuilder.buildObject();
+        prc.ensureInboundMessageContext().setMessage(authnRequest);
+        Subject subject = subjectBuilder.buildObject();
         authnRequest.setSubject(subject);
         
         final NameID nameId = nameIdBuilder.buildObject();
@@ -194,15 +214,19 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
 
         Credential encCred = AlgorithmSupport.generateSymmetricKeyAndCredential(encURI);
         KeyInfoCredentialResolver badKeyResolver = new StaticKeyInfoCredentialResolver(encCred);
-        prc.getInboundMessageContext().getSubcontext(
-                SecurityParametersContext.class).getDecryptionParameters().setDataKeyInfoCredentialResolver(
-                        badKeyResolver);
+        final DecryptionParameters params = prc.ensureInboundMessageContext().ensureSubcontext(
+                SecurityParametersContext.class).getDecryptionParameters();
+        assert params != null;
+        params.setDataKeyInfoCredentialResolver(badKeyResolver);
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.DECRYPT_NAMEID_FAILED);
-        Assert.assertNull(authnRequest.getSubject().getNameID());
+        
+        subject = ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
     }
 
     /**
@@ -213,8 +237,8 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testWrongKeyNonFatal() throws Exception {
         final AuthnRequest authnRequest = SAML2ActionTestingSupport.buildAuthnRequest();
-        prc.getInboundMessageContext().setMessage(authnRequest);
-        final Subject subject = subjectBuilder.buildObject();
+        prc.ensureInboundMessageContext().setMessage(authnRequest);
+        Subject subject = subjectBuilder.buildObject();
         authnRequest.setSubject(subject);
         
         final NameID nameId = nameIdBuilder.buildObject();
@@ -226,16 +250,20 @@ public class DecryptNameIDsTest extends OpenSAMLInitBaseTestCase {
 
         Credential encCred = AlgorithmSupport.generateSymmetricKeyAndCredential(encURI);
         KeyInfoCredentialResolver badKeyResolver = new StaticKeyInfoCredentialResolver(encCred);
-        prc.getInboundMessageContext().getSubcontext(
-                SecurityParametersContext.class).getDecryptionParameters().setDataKeyInfoCredentialResolver(
-                        badKeyResolver);
+        final DecryptionParameters params = prc.ensureInboundMessageContext().ensureSubcontext(
+                SecurityParametersContext.class).getDecryptionParameters();
+        assert params != null;
+        params.setDataKeyInfoCredentialResolver(badKeyResolver);
         
         action.setErrorFatal(false);
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertNull(authnRequest.getSubject().getNameID());
+        
+        subject = ((AuthnRequest) prc.ensureInboundMessageContext().ensureMessage()).getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
     }
     
 }
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertionsTest.java
index a8d403a78..43215622c 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAssertionsTest.java
@@ -32,9 +32,12 @@ import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
+import org.opensaml.xmlsec.encryption.EncryptedData;
+import org.opensaml.xmlsec.encryption.EncryptionMethod;
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.opensaml.xmlsec.keyinfo.impl.BasicKeyInfoGeneratorFactory;
+import org.opensaml.xmlsec.signature.KeyInfo;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -44,6 +47,7 @@ import com.google.common.base.Strings;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Unit test for {@link EncryptAssertions}. */
+ at SuppressWarnings("javadoc")
 public class EncryptAssertionsTest extends OpenSAMLInitBaseTestCase {
     
     private EncryptionParameters encParams;
@@ -67,7 +71,7 @@ public class EncryptAssertionsTest extends OpenSAMLInitBaseTestCase {
         encParams.setKeyTransportKeyInfoGenerator(generator.newInstance());
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().getSubcontext(EncryptionContext.class, true).setAssertionEncryptionParameters(encParams);
+        prc.ensureOutboundMessageContext().ensureSubcontext(EncryptionContext.class).setAssertionEncryptionParameters(encParams);
         
         action = new EncryptAssertions();
     }
@@ -79,7 +83,7 @@ public class EncryptAssertionsTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
     }
@@ -87,7 +91,7 @@ public class EncryptAssertionsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEncryptedAssertion() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         action.initialize();
@@ -99,21 +103,22 @@ public class EncryptAssertionsTest extends OpenSAMLInitBaseTestCase {
         Assert.assertEquals(response.getEncryptedAssertions().size(), 2);
         
         final EncryptedAssertion encTarget = response.getEncryptedAssertions().get(0);
-
-        Assert.assertEquals(encTarget.getEncryptedData().getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
-        Assert.assertEquals(encTarget.getEncryptedData().getEncryptionMethod().getAlgorithm(),
-                EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
-        Assert.assertNotNull(encTarget.getEncryptedData().getKeyInfo(), "KeyInfo");
-        Assert.assertEquals(encTarget.getEncryptedData().getKeyInfo().getEncryptedKeys().size(), 1, 
-                "Number of EncryptedKeys");
-        Assert.assertFalse(Strings.isNullOrEmpty(encTarget.getEncryptedData().getID()),
-                "EncryptedData ID attribute was empty");
+        final EncryptedData encData = encTarget.getEncryptedData();
+        assert encData != null;
+        Assert.assertEquals(encData.getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
+        final EncryptionMethod method = encData.getEncryptionMethod();
+        assert method != null;
+        Assert.assertEquals(method.getAlgorithm(), EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
+        final KeyInfo keyInfo = encData.getKeyInfo();
+        assert keyInfo != null;
+        Assert.assertEquals(keyInfo.getEncryptedKeys().size(), 1, "Number of EncryptedKeys");
+        Assert.assertFalse(Strings.isNullOrEmpty(encData.getID()), "EncryptedData ID attribute was empty");
     }
     
     @Test
     public void testFailure() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         action.initialize();
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributesTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributesTest.java
index 38fb50552..0b1726e9c 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributesTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptAttributesTest.java
@@ -36,9 +36,12 @@ import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
+import org.opensaml.xmlsec.encryption.EncryptedData;
+import org.opensaml.xmlsec.encryption.EncryptionMethod;
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.opensaml.xmlsec.keyinfo.impl.BasicKeyInfoGeneratorFactory;
+import org.opensaml.xmlsec.signature.KeyInfo;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -49,6 +52,7 @@ import com.google.common.base.Strings;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Unit test for {@link EncryptAttributes}. */
+ at SuppressWarnings("javadoc")
 public class EncryptAttributesTest extends OpenSAMLInitBaseTestCase {
     
     private SAMLObjectBuilder<Attribute> builder;
@@ -81,7 +85,7 @@ public class EncryptAttributesTest extends OpenSAMLInitBaseTestCase {
         encParams.setKeyTransportKeyInfoGenerator(generator.newInstance());
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().getSubcontext(EncryptionContext.class, true).setAttributeEncryptionParameters(encParams);
+        prc.ensureOutboundMessageContext().ensureSubcontext(EncryptionContext.class).setAttributeEncryptionParameters(encParams);
         
         action = new EncryptAttributes();
     }
@@ -93,7 +97,7 @@ public class EncryptAttributesTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
     }
@@ -101,7 +105,7 @@ public class EncryptAttributesTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEncryptedAttributes() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         final AttributeStatement statement = SAML2ActionTestingSupport.buildAttributeStatement();
         response.getAssertions().get(0).getAttributeStatements().add(statement);
@@ -118,20 +122,22 @@ public class EncryptAttributesTest extends OpenSAMLInitBaseTestCase {
         
         final EncryptedAttribute encTarget = statement.getEncryptedAttributes().get(0);
 
-        Assert.assertEquals(encTarget.getEncryptedData().getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
-        Assert.assertEquals(encTarget.getEncryptedData().getEncryptionMethod().getAlgorithm(),
-                EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
-        Assert.assertNotNull(encTarget.getEncryptedData().getKeyInfo(), "KeyInfo");
-        Assert.assertEquals(encTarget.getEncryptedData().getKeyInfo().getEncryptedKeys().size(), 1, 
-                "Number of EncryptedKeys");
-        Assert.assertFalse(Strings.isNullOrEmpty(encTarget.getEncryptedData().getID()),
-                "EncryptedData ID attribute was empty");
+        final EncryptedData encData = encTarget.getEncryptedData();
+        assert encData != null;
+        Assert.assertEquals(encData.getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
+        final EncryptionMethod method = encData.getEncryptionMethod();
+        assert method != null;
+        Assert.assertEquals(method.getAlgorithm(), EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
+        final KeyInfo keyInfo = encData.getKeyInfo();
+        assert keyInfo != null;
+        Assert.assertEquals(keyInfo.getEncryptedKeys().size(), 1, "Number of EncryptedKeys");
+        Assert.assertFalse(Strings.isNullOrEmpty(encData.getID()), "EncryptedData ID attribute was empty");
     }
     
     @Test
     public void testFailure() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         final AttributeStatement statement = SAML2ActionTestingSupport.buildAttributeStatement();
         response.getAssertions().get(0).getAttributeStatements().add(statement);
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDsTest.java
index d526f27d9..4d78fad34 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/EncryptNameIDsTest.java
@@ -26,15 +26,20 @@ import org.opensaml.profile.action.EventIds;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
+import org.opensaml.saml.saml2.core.Assertion;
 import org.opensaml.saml.saml2.core.EncryptedID;
 import org.opensaml.saml.saml2.core.Response;
+import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
+import org.opensaml.xmlsec.encryption.EncryptedData;
+import org.opensaml.xmlsec.encryption.EncryptionMethod;
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.opensaml.xmlsec.keyinfo.impl.BasicKeyInfoGeneratorFactory;
+import org.opensaml.xmlsec.signature.KeyInfo;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -44,6 +49,7 @@ import com.google.common.base.Strings;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /** Unit test for {@link EncryptNameIDs}. */
+ at SuppressWarnings("javadoc")
 public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     
     private EncryptionParameters encParams;
@@ -67,7 +73,7 @@ public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         encParams.setKeyTransportKeyInfoGenerator(generator.newInstance());
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().getSubcontext(EncryptionContext.class, true).setIdentifierEncryptionParameters(encParams);
+        prc.ensureOutboundMessageContext().ensureSubcontext(EncryptionContext.class).setIdentifierEncryptionParameters(encParams);
         
         action = new EncryptNameIDs();
     }
@@ -79,7 +85,7 @@ public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        prc.getOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
+        prc.ensureOutboundMessageContext().setMessage(SAML2ActionTestingSupport.buildResponse());
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
     }
@@ -87,7 +93,7 @@ public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testEncryptedNameID() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().get(0).setSubject(SAML2ActionTestingSupport.buildSubject("morpheus"));
         action.initialize();
@@ -96,25 +102,32 @@ public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         ActionTestingSupport.assertProceedEvent(prc);
         
         Assert.assertEquals(response.getAssertions().size(), 1);
-        Assert.assertNull(response.getAssertions().get(0).getSubject().getNameID());
-        Assert.assertNotNull(response.getAssertions().get(0).getSubject().getEncryptedID());
+        final Assertion assertion = response.getAssertions().get(0);
+        assert assertion != null;
+        final Subject subject = assertion.getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
+        Assert.assertNotNull(subject.getEncryptedID());
         
-        final EncryptedID encTarget = response.getAssertions().get(0).getSubject().getEncryptedID();
+        final EncryptedID encTarget = subject.getEncryptedID();
+        assert encTarget != null;
 
-        Assert.assertEquals(encTarget.getEncryptedData().getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
-        Assert.assertEquals(encTarget.getEncryptedData().getEncryptionMethod().getAlgorithm(),
-                EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
-        Assert.assertNotNull(encTarget.getEncryptedData().getKeyInfo(), "KeyInfo");
-        Assert.assertEquals(encTarget.getEncryptedData().getKeyInfo().getEncryptedKeys().size(), 1, 
-                "Number of EncryptedKeys");
-        Assert.assertFalse(Strings.isNullOrEmpty(encTarget.getEncryptedData().getID()),
-                "EncryptedData ID attribute was empty");
+        final EncryptedData encData = encTarget.getEncryptedData();
+        assert encData != null;
+        Assert.assertEquals(encData.getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
+        final EncryptionMethod method = encData.getEncryptionMethod();
+        assert method != null;
+        Assert.assertEquals(method.getAlgorithm(), EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
+        final KeyInfo keyInfo = encData.getKeyInfo();
+        assert keyInfo != null;
+        Assert.assertEquals(keyInfo.getEncryptedKeys().size(), 1, "Number of EncryptedKeys");
+        Assert.assertFalse(Strings.isNullOrEmpty(encData.getID()), "EncryptedData ID attribute was empty");
     }
     
     @Test
     public void testFailure() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().get(0).setSubject(SAML2ActionTestingSupport.buildSubject("morpheus"));
         
@@ -126,8 +139,12 @@ public class EncryptNameIDsTest extends OpenSAMLInitBaseTestCase {
         ActionTestingSupport.assertEvent(prc, EventIds.UNABLE_TO_ENCRYPT);
         
         Assert.assertEquals(response.getAssertions().size(), 1);
-        Assert.assertNotNull(response.getAssertions().get(0).getSubject().getNameID());
-        Assert.assertNull(response.getAssertions().get(0).getSubject().getEncryptedID());
+        final Assertion assertion = response.getAssertions().get(0);
+        assert assertion != null;
+        final Subject subject = assertion.getSubject();
+        assert subject != null;
+        Assert.assertNotNull(subject.getNameID());
+        Assert.assertNull(subject.getEncryptedID());
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContextTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContextTest.java
index 613b003cc..78ef9b029 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContextTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/PopulateECPContextTest.java
@@ -38,6 +38,7 @@ import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.xmlsec.EncryptionParameters;
 
 /** Unit test for {@link PopulateECPContext}. */
+ at SuppressWarnings("javadoc")
 public class PopulateECPContextTest extends OpenSAMLInitBaseTestCase {
     
     private ProfileRequestContext prc;
@@ -58,7 +59,7 @@ public class PopulateECPContextTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final ECPContext ecp = prc.getOutboundMessageContext().getSubcontext(ECPContext.class);
+        final ECPContext ecp = prc.ensureOutboundMessageContext().getSubcontext(ECPContext.class);
         if (ecp != null) {
             Assert.assertFalse(ecp.isRequestAuthenticated());
             Assert.assertNull(ecp.getSessionKey());
@@ -68,14 +69,14 @@ public class PopulateECPContextTest extends OpenSAMLInitBaseTestCase {
     @Test
     public void testAuthenticated() throws ComponentInitializationException {
         
-        prc.getInboundMessageContext().getSubcontext(SAMLBindingContext.class, true).setHasBindingSignature(true);
+        prc.ensureInboundMessageContext().ensureSubcontext(SAMLBindingContext.class).setHasBindingSignature(true);
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final ECPContext ecp = prc.getOutboundMessageContext().getSubcontext(ECPContext.class);
+        final ECPContext ecp = prc.ensureOutboundMessageContext().ensureSubcontext(ECPContext.class);
         Assert.assertTrue(ecp.isRequestAuthenticated());
         Assert.assertNull(ecp.getSessionKey());
     }
@@ -89,22 +90,22 @@ public class PopulateECPContextTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final ECPContext ecp = prc.getOutboundMessageContext().getSubcontext(ECPContext.class);
+        final ECPContext ecp = prc.ensureOutboundMessageContext().ensureSubcontext(ECPContext.class);
         Assert.assertNotNull(ecp.getSessionKey());
     }
     
     @Test
     public void testEncrypted() throws ComponentInitializationException {
         
-        prc.getOutboundMessageContext().getSubcontext(
-                EncryptionContext.class, true).setAssertionEncryptionParameters(new EncryptionParameters());
+        prc.ensureOutboundMessageContext().ensureSubcontext(
+                EncryptionContext.class).setAssertionEncryptionParameters(new EncryptionParameters());
 
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        final ECPContext ecp = prc.getOutboundMessageContext().getSubcontext(ECPContext.class);
+        final ECPContext ecp = prc.ensureOutboundMessageContext().ensureSubcontext(ECPContext.class);
         Assert.assertNotNull(ecp.getSessionKey());
     }
 
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifactTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifactTest.java
index 7a340846b..73bcaea92 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifactTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ResolveArtifactTest.java
@@ -39,6 +39,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 /** {@link ResolveArtifact} unit test. */
+ at SuppressWarnings("javadoc")
 public class ResolveArtifactTest extends OpenSAMLInitBaseTestCase {
 
     private BasicSAMLArtifactMap artifactMap;
@@ -50,7 +51,7 @@ public class ResolveArtifactTest extends OpenSAMLInitBaseTestCase {
     @BeforeMethod public void setUp() throws ComponentInitializationException {
         prc = new RequestContextBuilder().setOutboundMessage(
                 SAML2ActionTestingSupport.buildArtifactResponse()).buildProfileRequestContext();
-        prc.getInboundMessageContext().getSubcontext(SAMLPeerEntityContext.class, true).setEntityId("SP");
+        prc.ensureInboundMessageContext().ensureSubcontext(SAMLPeerEntityContext.class).setEntityId("SP");
         
         artifactMap = new BasicSAMLArtifactMap();
         artifactMap.initialize();
@@ -67,55 +68,55 @@ public class ResolveArtifactTest extends OpenSAMLInitBaseTestCase {
     }
 
     @Test public void testNoArtifacts() {
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve(null));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve(null));
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, EventIds.INVALID_MSG_CTX);
     }
     
     @Test public void testNoResponse() {
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
-        prc.getOutboundMessageContext().setMessage(null);
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
+        prc.ensureOutboundMessageContext().setMessage(null);
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, EventIds.INVALID_MSG_CTX);
     }
     
     @Test public void testMissingArtifacts() throws IOException {
         artifactMap.put("bar", "SP", "IdP", SAML2ActionTestingSupport.buildResponse());
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.UNABLE_RESOLVE_ARTIFACT);
-        Assert.assertNull(((ArtifactResponse) prc.getOutboundMessageContext().getMessage()).getMessage());
+        Assert.assertNull(((ArtifactResponse) prc.ensureOutboundMessageContext().ensureMessage()).getMessage());
     }
 
     @Test public void testWrongSP() throws IOException {
         artifactMap.put("foo", "SP2", "IdP", SAML2ActionTestingSupport.buildResponse());
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.UNABLE_RESOLVE_ARTIFACT);
-        Assert.assertNull(((ArtifactResponse) prc.getOutboundMessageContext().getMessage()).getMessage());
+        Assert.assertNull(((ArtifactResponse) prc.ensureOutboundMessageContext().ensureMessage()).getMessage());
         Assert.assertNull(artifactMap.get("foo"));
     }
 
     @Test public void testWrongIdP() throws IOException {
         artifactMap.put("foo", "SP", "IdP2", SAML2ActionTestingSupport.buildResponse());
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
         
         action.execute(prc);
         ActionTestingSupport.assertEvent(prc, SAMLEventIds.UNABLE_RESOLVE_ARTIFACT);
-        Assert.assertNull(((ArtifactResponse) prc.getOutboundMessageContext().getMessage()).getMessage());
+        Assert.assertNull(((ArtifactResponse) prc.ensureOutboundMessageContext().ensureMessage()).getMessage());
         Assert.assertNull(artifactMap.get("foo"));
     }
 
     @Test public void testOne() throws IOException {
         artifactMap.put("foo", "SP", "IdP", SAML2ActionTestingSupport.buildResponse());
-        prc.getInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
+        prc.ensureInboundMessageContext().setMessage(SAML2ActionTestingSupport.buildArtifactResolve("foo"));
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
-        Assert.assertTrue(((ArtifactResponse) prc.getOutboundMessageContext().getMessage()).getMessage() instanceof Response);
+        Assert.assertTrue(((ArtifactResponse) prc.ensureOutboundMessageContext().ensureMessage()).getMessage() instanceof Response);
         Assert.assertNull(artifactMap.get("foo"));
     }
 
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/TestSelfEncryption.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/TestSelfEncryption.java
index 83ef0843c..659bb9686 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/TestSelfEncryption.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/TestSelfEncryption.java
@@ -19,11 +19,12 @@ package org.opensaml.saml.saml2.profile.impl;
 
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchProviderException;
-import java.util.Collections;
 import java.util.List;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.logic.FunctionSupport;
+import net.shibboleth.shared.logic.PredicateSupport;
 
 import org.opensaml.core.testing.OpenSAMLInitBaseTestCase;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -33,21 +34,25 @@ import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.saml.saml2.core.EncryptedID;
 import org.opensaml.saml.saml2.core.Response;
+import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.profile.context.EncryptionContext;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.xmlsec.EncryptionParameters;
 import org.opensaml.xmlsec.algorithm.AlgorithmSupport;
+import org.opensaml.xmlsec.encryption.EncryptedData;
+import org.opensaml.xmlsec.encryption.EncryptionMethod;
 import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
 import org.opensaml.xmlsec.encryption.support.EncryptionException;
 import org.opensaml.xmlsec.keyinfo.impl.BasicKeyInfoGeneratorFactory;
+import org.opensaml.xmlsec.signature.KeyInfo;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicates;
 import com.google.common.base.Strings;
 
 /** Unit test for self-encryption support in {@link AbstractEncryptAction} (using {@link EncryptNameIDs} as the concrete impl.) */
+ at SuppressWarnings("javadoc")
 public class TestSelfEncryption extends OpenSAMLInitBaseTestCase {
     
     private EncryptionParameters encParams, encParamsSelf1, encParamsSelf2;
@@ -87,7 +92,7 @@ public class TestSelfEncryption extends OpenSAMLInitBaseTestCase {
         encParamsSelf2.setKeyTransportKeyInfoGenerator(generator.newInstance());
         
         prc = new RequestContextBuilder().buildProfileRequestContext();
-        prc.getOutboundMessageContext().getSubcontext(EncryptionContext.class, true).setIdentifierEncryptionParameters(encParams);
+        prc.ensureOutboundMessageContext().ensureSubcontext(EncryptionContext.class).setIdentifierEncryptionParameters(encParams);
         
         action = new EncryptNameIDs();
     }
@@ -95,11 +100,11 @@ public class TestSelfEncryption extends OpenSAMLInitBaseTestCase {
     @Test
     public void testSelfEncryption() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().get(0).setSubject(SAML2ActionTestingSupport.buildSubject("morpheus"));
         
-        action.setEncryptToSelf(Predicates.<ProfileRequestContext>alwaysTrue());
+        action.setEncryptToSelf(PredicateSupport.alwaysTrue());
         action.setEncryptToSelfParametersStrategy(FunctionSupport.constant(List.of(encParamsSelf1, encParamsSelf2)));
         action.setSelfRecipientLookupStrategy(FunctionSupport.constant("https://idp.example.org"));
         
@@ -109,30 +114,34 @@ public class TestSelfEncryption extends OpenSAMLInitBaseTestCase {
         ActionTestingSupport.assertProceedEvent(prc);
         
         Assert.assertEquals(response.getAssertions().size(), 1);
-        Assert.assertNull(response.getAssertions().get(0).getSubject().getNameID());
-        Assert.assertNotNull(response.getAssertions().get(0).getSubject().getEncryptedID());
+        final Subject subject = response.getAssertions().get(0).getSubject();
+        assert subject != null;
+        Assert.assertNull(subject.getNameID());
         
-        final EncryptedID encTarget = response.getAssertions().get(0).getSubject().getEncryptedID();
+        final EncryptedID encTarget = subject.getEncryptedID();
+        assert encTarget != null;
 
-        Assert.assertEquals(encTarget.getEncryptedData().getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
-        Assert.assertEquals(encTarget.getEncryptedData().getEncryptionMethod().getAlgorithm(),
-                EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
-        Assert.assertNotNull(encTarget.getEncryptedData().getKeyInfo(), "KeyInfo");
-        Assert.assertEquals(encTarget.getEncryptedData().getKeyInfo().getEncryptedKeys().size(), 3, 
-                "Number of EncryptedKeys");
-        Assert.assertFalse(Strings.isNullOrEmpty(encTarget.getEncryptedData().getID()),
-                "EncryptedData ID attribute was empty");
+        final EncryptedData encData = encTarget.getEncryptedData();
+        assert encData != null;
+        Assert.assertEquals(encData.getType(), EncryptionConstants.TYPE_ELEMENT, "Type attribute");
+        final EncryptionMethod method = encData.getEncryptionMethod();
+        assert method != null;
+        Assert.assertEquals(method.getAlgorithm(), EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128, "Algorithm attribute");
+        final KeyInfo keyInfo = encData.getKeyInfo();
+        assert keyInfo != null;
+        Assert.assertEquals(keyInfo.getEncryptedKeys().size(), 3, "Number of EncryptedKeys");
+        Assert.assertFalse(Strings.isNullOrEmpty(encData.getID()), "EncryptedData ID attribute was empty");
     }
     
     @Test
     public void testFailureNoSelfEncryptionCreds() throws EncryptionException, ComponentInitializationException, MarshallingException {
         final Response response = SAML2ActionTestingSupport.buildResponse();
-        prc.getOutboundMessageContext().setMessage(response);
+        prc.ensureOutboundMessageContext().setMessage(response);
         response.getAssertions().add(SAML2ActionTestingSupport.buildAssertion());
         response.getAssertions().get(0).setSubject(SAML2ActionTestingSupport.buildSubject("morpheus"));
         
-        action.setEncryptToSelf(Predicates.<ProfileRequestContext>alwaysTrue());
-        action.setEncryptToSelfParametersStrategy(FunctionSupport.constant(Collections.emptyList()));
+        action.setEncryptToSelf(PredicateSupport.alwaysTrue());
+        action.setEncryptToSelfParametersStrategy(FunctionSupport.constant(CollectionSupport.emptyList()));
         action.setSelfRecipientLookupStrategy(FunctionSupport.constant("https://idp.example.org"));
         
         action.initialize();
@@ -141,8 +150,10 @@ public class TestSelfEncryption extends OpenSAMLInitBaseTestCase {
         ActionTestingSupport.assertEvent(prc, EventIds.UNABLE_TO_ENCRYPT);
         
         Assert.assertEquals(response.getAssertions().size(), 1);
-        Assert.assertNotNull(response.getAssertions().get(0).getSubject().getNameID());
-        Assert.assertNull(response.getAssertions().get(0).getSubject().getEncryptedID());
+        final Subject subject = response.getAssertions().get(0).getSubject();
+        assert subject != null;
+        Assert.assertNotNull(subject.getNameID());
+        Assert.assertNull(subject.getEncryptedID());
     }
     
 }
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertionsTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertionsTest.java
index 1b4aa9706..09218a25b 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertionsTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/profile/impl/ValidateAssertionsTest.java
@@ -43,6 +43,7 @@ import org.testng.annotations.Test;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.testing.ConstantSupplier;
 
+ at SuppressWarnings("javadoc")
 public class ValidateAssertionsTest extends OpenSAMLInitBaseTestCase {
     
     private ValidateAssertions action;
@@ -276,36 +277,12 @@ public class ValidateAssertionsTest extends OpenSAMLInitBaseTestCase {
         checkObjectMetadataEmpty(samlResponse.getAssertions().get(0));
     }
 
-    @Test(expectedExceptions = ComponentInitializationException.class)
-    public void testNoAssertionResolver() throws ComponentInitializationException {
-        action.setAssertionResolver(null);
-        
-        action.initialize();
-    }
-
-    @Test(expectedExceptions = ComponentInitializationException.class)
-    public void testNoValidators() throws ComponentInitializationException {
-        action.setAssertionValidator(null);
-        action.setAssertionValidatorLookup(null);
-        
-        action.initialize();
-    }
-
     @Test(expectedExceptions = ComponentInitializationException.class)
     public void testNoHttpRequest() throws ComponentInitializationException {
         action.setHttpServletRequestSupplier(null);
         
         action.initialize();
     }
-
-    @Test(expectedExceptions = ComponentInitializationException.class)
-    public void testNoContextBuilder() throws ComponentInitializationException {
-        action.setValidationContextBuilder(null);
-        
-        action.initialize();
-    }
-
-    
     
     // Helpers
     
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilderTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilderTest.java
index 6cdaf078b..8c6f8943e 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilderTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/DefaultSAML20AssertionValidationContextBuilderTest.java
@@ -24,6 +24,7 @@ import java.security.cert.X509Certificate;
 import java.util.Set;
 import java.util.function.Function;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 import org.opensaml.core.criterion.EntityIdCriterion;
@@ -50,9 +51,7 @@ import jakarta.servlet.http.HttpServletRequest;
 import net.shibboleth.shared.collection.Pair;
 import net.shibboleth.shared.resolver.CriteriaSet;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class DefaultSAML20AssertionValidationContextBuilderTest extends XMLObjectBaseTestCase {
     
     private DefaultSAML20AssertionValidationContextBuilder builder;
@@ -74,19 +73,20 @@ public class DefaultSAML20AssertionValidationContextBuilderTest extends XMLObjec
     
     @Test
     public void testDefaults() {
-        ValidationContext context = builder.apply(input);
-        
-        Assert.assertNotNull(context);
+        final ValidationContext context = builder.apply(input);
+        assert context != null;
         
         // Signature
         Assert.assertEquals(context.getStaticParameters().get(SAML2AssertionValidationParameters.SIGNATURE_REQUIRED), Boolean.TRUE);
         
         CriteriaSet signatureCriteriaSet = (CriteriaSet) context.getStaticParameters().get(SAML2AssertionValidationParameters.SIGNATURE_VALIDATION_CRITERIA_SET);
         Assert.assertEquals(signatureCriteriaSet.size(), 2);
-        Assert.assertTrue(signatureCriteriaSet.contains(EntityIdCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(EntityIdCriterion.class).getEntityId(), issuerEntityID);
-        Assert.assertTrue(signatureCriteriaSet.contains(UsageCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(UsageCriterion.class).getUsage(), UsageType.SIGNING);
+        final EntityIdCriterion entityCrit = signatureCriteriaSet.get(EntityIdCriterion.class); 
+        assert entityCrit != null;
+        Assert.assertEquals(entityCrit.getEntityId(), issuerEntityID);
+        final UsageCriterion usageCrit = signatureCriteriaSet.get(UsageCriterion.class);
+        assert usageCrit != null;
+        Assert.assertEquals(usageCrit.getUsage(), UsageType.SIGNING);
         
         // Subject confirmation
         Assert.assertEquals(context.getStaticParameters().get(SAML2AssertionValidationParameters.SC_HOK_PRESENTER_CERT), clientTLSCert);
@@ -118,23 +118,26 @@ public class DefaultSAML20AssertionValidationContextBuilderTest extends XMLObjec
                 });
         
         
-        ValidationContext context = builder.apply(input);
-        
-        Assert.assertNotNull(context);
+        final ValidationContext context = builder.apply(input);
+        assert context != null;
         
         // Signature
         Assert.assertEquals(context.getStaticParameters().get(SAML2AssertionValidationParameters.SIGNATURE_REQUIRED), Boolean.FALSE);
         
         CriteriaSet signatureCriteriaSet = (CriteriaSet) context.getStaticParameters().get(SAML2AssertionValidationParameters.SIGNATURE_VALIDATION_CRITERIA_SET);
         Assert.assertEquals(signatureCriteriaSet.size(), 4);
-        Assert.assertTrue(signatureCriteriaSet.contains(EntityIdCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(EntityIdCriterion.class).getEntityId(), issuerEntityID);
-        Assert.assertTrue(signatureCriteriaSet.contains(UsageCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(UsageCriterion.class).getUsage(), UsageType.SIGNING);
-        Assert.assertTrue(signatureCriteriaSet.contains(EntityRoleCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(EntityRoleCriterion.class).getRole(), IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
-        Assert.assertTrue(signatureCriteriaSet.contains(ProtocolCriterion.class));
-        Assert.assertEquals(signatureCriteriaSet.get(ProtocolCriterion.class).getProtocol(), SAMLConstants.SAML20P_NS);
+        final EntityIdCriterion entityCrit = signatureCriteriaSet.get(EntityIdCriterion.class); 
+        assert entityCrit != null;
+        Assert.assertEquals(entityCrit.getEntityId(), issuerEntityID);
+        final UsageCriterion usageCrit = signatureCriteriaSet.get(UsageCriterion.class);
+        assert usageCrit != null;
+        Assert.assertEquals(usageCrit.getUsage(), UsageType.SIGNING);
+        final EntityRoleCriterion roleCrit = signatureCriteriaSet.get(EntityRoleCriterion.class); 
+        assert roleCrit != null;
+        Assert.assertEquals(roleCrit.getRole(), IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
+        final ProtocolCriterion protocolCrit = signatureCriteriaSet.get(ProtocolCriterion.class); 
+        assert protocolCrit != null;
+        Assert.assertEquals(protocolCrit.getProtocol(), SAMLConstants.SAML20P_NS);
         
         // Subject confirmation
         Assert.assertEquals(context.getStaticParameters().get(SAML2AssertionValidationParameters.SC_HOK_PRESENTER_CERT), clientTLSCert);
@@ -152,13 +155,13 @@ public class DefaultSAML20AssertionValidationContextBuilderTest extends XMLObjec
         
     }
 
-    private MessageContext buildMessageContext() {
+    @Nonnull private MessageContext buildMessageContext() {
         final MessageContext messageContext = new MessageContext();
-        messageContext.getSubcontext(SAMLSelfEntityContext.class, true).setEntityId(rpEntityID);
+        messageContext.ensureSubcontext(SAMLSelfEntityContext.class).setEntityId(rpEntityID);
         return messageContext;
     }
 
-    private HttpServletRequest buildHttpServletRequest() throws URISyntaxException, CertificateException {
+    @Nonnull private HttpServletRequest buildHttpServletRequest() throws URISyntaxException, CertificateException {
         MockHttpServletRequest request = new MockHttpServletRequest();
         request.setScheme("https");
         request.setServerName("rp.example.com");
@@ -173,11 +176,11 @@ public class DefaultSAML20AssertionValidationContextBuilderTest extends XMLObjec
         return request;
     }
 
-    private Assertion buildAssertion() {
+    @Nonnull private Assertion buildAssertion() {
         Assertion assertion = SAML2ActionTestingSupport.buildAssertion();
         assertion.setSubject(SAML2ActionTestingSupport.buildSubject("barney"));
         assertion.setIssuer(SAML2ActionTestingSupport.buildIssuer(issuerEntityID));
         return assertion;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandlerTest.java b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandlerTest.java
index 58ff2b8c9..0aac53519 100644
--- a/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandlerTest.java
+++ b/opensaml-saml-impl/src/test/java/org/opensaml/saml/saml2/wssecurity/messaging/impl/WSSecuritySAML20AssertionTokenSecurityHandlerTest.java
@@ -37,6 +37,7 @@ import org.opensaml.saml.common.messaging.context.SAMLSelfEntityContext;
 import org.opensaml.saml.saml2.assertion.SAML20AssertionValidator;
 import org.opensaml.saml.saml2.assertion.SAML2AssertionValidationParameters;
 import org.opensaml.saml.saml2.core.Assertion;
+import org.opensaml.saml.saml2.core.Subject;
 import org.opensaml.saml.saml2.core.SubjectConfirmation;
 import org.opensaml.saml.saml2.testing.SAML2ActionTestingSupport;
 import org.opensaml.saml.saml2.wssecurity.SAML20AssertionToken;
@@ -96,8 +97,8 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         
         handler.invoke(messageContext);
         
-        WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
-        Assert.assertNotNull(securityContext);
+        final WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
+        assert securityContext != null;
         Assert.assertEquals(securityContext.getTokens().size(), 1);
         Assert.assertTrue(securityContext.getTokens().get(0) instanceof SAML20AssertionToken);
         SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
@@ -114,10 +115,12 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         try {
             handler.invoke(messageContext);
             Assert.fail("Assertion validation should have failed");
-        } catch (MessageHandlerException e) {
-            Fault fault = messageContext.getSubcontext(SOAP11Context.class, true).getFault();
-            Assert.assertNotNull(fault);
-            Assert.assertEquals(fault.getCode().getValue(), WSSecurityConstants.SOAP_FAULT_INVALID_SECURITY_TOKEN);
+        } catch (final MessageHandlerException e) {
+            Fault fault = messageContext.ensureSubcontext(SOAP11Context.class).getFault();
+            assert fault != null;
+            final FaultCode code = fault.getCode();
+            assert code != null;
+            Assert.assertEquals(code.getValue(), WSSecurityConstants.SOAP_FAULT_INVALID_SECURITY_TOKEN);
         }
     }
     
@@ -129,10 +132,12 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         try {
             handler.invoke(messageContext);
             Assert.fail("Assertion validation should have failed");
-        } catch (MessageHandlerException e) {
-            Fault fault = messageContext.getSubcontext(SOAP11Context.class, true).getFault();
-            Assert.assertNotNull(fault);
-            Assert.assertEquals(fault.getCode().getValue(), WSSecurityConstants.SOAP_FAULT_INVALID_SECURITY_TOKEN);
+        } catch (final MessageHandlerException e) {
+            Fault fault = messageContext.ensureSubcontext(SOAP11Context.class).getFault();
+            assert fault != null;
+            final FaultCode code = fault.getCode();
+            assert code != null;
+            Assert.assertEquals(code.getValue(), WSSecurityConstants.SOAP_FAULT_INVALID_SECURITY_TOKEN);
         }
     }
     
@@ -150,11 +155,11 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         
         handler.invoke(messageContext);
         
-        WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
-        Assert.assertNotNull(securityContext);
+        final WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
+        assert securityContext != null;
         Assert.assertEquals(securityContext.getTokens().size(), 1);
         Assert.assertTrue(securityContext.getTokens().get(0) instanceof SAML20AssertionToken);
-        SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
+        final SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
         Assert.assertSame(token.getWrappedToken(), assertion);
         Assert.assertEquals(token.getValidationStatus(), ValidationStatus.VALID);
         Assert.assertSame(token.getSubjectConfirmation(), subjectConfirmation);
@@ -168,11 +173,11 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         
         handler.invoke(messageContext);
         
-        WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
-        Assert.assertNotNull(securityContext);
+        final WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
+        assert securityContext != null;
         Assert.assertEquals(securityContext.getTokens().size(), 1);
         Assert.assertTrue(securityContext.getTokens().get(0) instanceof SAML20AssertionToken);
-        SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
+        final SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
         Assert.assertSame(token.getWrappedToken(), assertion);
         Assert.assertEquals(token.getValidationStatus(), ValidationStatus.INVALID);
         Assert.assertSame(token.getSubjectConfirmation(), null);
@@ -186,11 +191,11 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         
         handler.invoke(messageContext);
         
-        WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
-        Assert.assertNotNull(securityContext);
+        final WSSecurityContext securityContext = messageContext.getSubcontext(WSSecurityContext.class);
+        assert securityContext != null;
         Assert.assertEquals(securityContext.getTokens().size(), 1);
         Assert.assertTrue(securityContext.getTokens().get(0) instanceof SAML20AssertionToken);
-        SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
+        final SAML20AssertionToken token = (SAML20AssertionToken) securityContext.getTokens().get(0);
         Assert.assertSame(token.getWrappedToken(), assertion);
         Assert.assertEquals(token.getValidationStatus(), ValidationStatus.INDETERMINATE);
         Assert.assertSame(token.getSubjectConfirmation(), null);
@@ -204,10 +209,12 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         try {
             handler.invoke(messageContext);
             Assert.fail("Assertion validation should have failed");
-        } catch (MessageHandlerException e) {
-            Fault fault = messageContext.getSubcontext(SOAP11Context.class, true).getFault();
-            Assert.assertNotNull(fault);
-            Assert.assertEquals(fault.getCode().getValue(), FaultCode.SERVER);
+        } catch (final MessageHandlerException e) {
+            Fault fault = messageContext.ensureSubcontext(SOAP11Context.class).getFault();
+            assert fault != null;
+            final FaultCode code = fault.getCode();
+            assert code != null;
+            Assert.assertEquals(code.getValue(), FaultCode.SERVER);
         }
     }
     
@@ -226,7 +233,13 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
     
     @Test
     public void testNoAssertions() throws ComponentInitializationException, MessageHandlerException {
-        messageContext.getSubcontext(SOAP11Context.class).getEnvelope().getHeader().getUnknownXMLObjects().clear();
+        final Envelope env = messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
+        if (env != null) {
+            final Header header = env.getHeader();
+            if (header != null) {
+                header.getUnknownXMLObjects().clear();
+            }
+        }
         
         handler.setAssertionValidator(new MockAssertionValidator(ValidationResult.VALID, subjectConfirmation, false));
         handler.initialize();
@@ -239,7 +252,10 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
     
     @Test
     public void testNoHeader() throws ComponentInitializationException, MessageHandlerException {
-        messageContext.getSubcontext(SOAP11Context.class).getEnvelope().setHeader(null);
+        final Envelope env = messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
+        if (env != null) {
+            env.setHeader(null);
+        }
         
         handler.setAssertionValidator(new MockAssertionValidator(ValidationResult.VALID, subjectConfirmation, false));
         handler.initialize();
@@ -250,13 +266,6 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         Assert.assertNull(securityContext);
     }
     
-    @Test(expectedExceptions=ComponentInitializationException.class)
-    public void testNoValidatorOrLookup() throws ComponentInitializationException, MessageHandlerException {
-        handler.setAssertionValidator(null);
-        handler.setAssertionValidatorLookup(null);
-        handler.initialize();
-    }
-    
     @Test(expectedExceptions=MessageHandlerException.class)
     public void testNoValidatorAndFailedLookup() throws ComponentInitializationException, MessageHandlerException {
         handler.setAssertionValidator(null);
@@ -294,25 +303,27 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
     // Helper classes and methods
     //
 
-    private MessageContext buildMessageContext() {
+    @Nonnull private MessageContext buildMessageContext() {
         final MessageContext mc = new MessageContext();
-        mc.getSubcontext(SAMLSelfEntityContext.class, true).setEntityId(rpEntityID);
-        XMLObject payload = buildXMLObject(simpleXMLObjectQName);
+        mc.ensureSubcontext(SAMLSelfEntityContext.class).setEntityId(rpEntityID);
+        final XMLObject payload = buildXMLObject(simpleXMLObjectQName);
         mc.setMessage(payload);
         if (assertion == null) {
             throw new RuntimeException("Assertion wasn't built");
         }
-        Envelope envelope = buildXMLObject(Envelope.DEFAULT_ELEMENT_NAME);
-        envelope.setBody((Body)buildXMLObject(Body.DEFAULT_ELEMENT_NAME));
-        envelope.getBody().getUnknownXMLObjects().add(payload);
-        envelope.setHeader((Header)buildXMLObject(Header.DEFAULT_ELEMENT_NAME));
+        final Body body = buildXMLObject(Body.DEFAULT_ELEMENT_NAME);
+        body.getUnknownXMLObjects().add(payload);
+        final Envelope envelope = buildXMLObject(Envelope.DEFAULT_ELEMENT_NAME);
+        envelope.setBody(body);
+        final Header header = buildXMLObject(Header.DEFAULT_ELEMENT_NAME);
+        envelope.setHeader(header);
         
-        Security security = buildXMLObject(Security.ELEMENT_NAME);
+        final Security security = buildXMLObject(Security.ELEMENT_NAME);
         SOAPSupport.addSOAP11MustUnderstandAttribute(security, true);
         security.getUnknownXMLObjects().add(assertion);
-        envelope.getHeader().getUnknownXMLObjects().add(security);
+        header.getUnknownXMLObjects().add(security);
         
-        mc.getSubcontext(SOAP11Context.class, true).setEnvelope(envelope);
+        mc.ensureSubcontext(SOAP11Context.class).setEnvelope(envelope);
         
         return mc;
     }
@@ -327,13 +338,14 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         return request;
     }
 
-    private Assertion buildAssertion() throws SecurityException, MarshallingException, SignatureException {
+    @Nonnull private Assertion buildAssertion() throws SecurityException, MarshallingException, SignatureException {
         Assertion a = SAML2ActionTestingSupport.buildAssertion();
         a.setIssuer(SAML2ActionTestingSupport.buildIssuer(issuerEntityID));
-        a.setSubject(SAML2ActionTestingSupport.buildSubject("barney"));
+        final Subject subject = SAML2ActionTestingSupport.buildSubject("barney");
         subjectConfirmation = buildXMLObject(SubjectConfirmation.DEFAULT_ELEMENT_NAME);
         subjectConfirmation.setMethod(SubjectConfirmation.METHOD_BEARER);
-        a.getSubject().getSubjectConfirmations().add(subjectConfirmation);
+        subject.getSubjectConfirmations().add(subjectConfirmation);
+        a.setSubject(subject);
         a.getAuthnStatements().add(SAML2ActionTestingSupport.buildAuthnStatement());
         return a;
     }
@@ -344,7 +356,7 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
         private boolean isThrowException;
         private SubjectConfirmation confirmedSubjectConfirmation;
         
-        public MockAssertionValidator(ValidationResult result, SubjectConfirmation confirmed, boolean throwException) {
+        public MockAssertionValidator(final ValidationResult result, final SubjectConfirmation confirmed, boolean throwException) {
             super(null, null, null, null, null, null);
             validationResult = result;
             confirmedSubjectConfirmation = confirmed;
@@ -360,6 +372,10 @@ public class WSSecuritySAML20AssertionTokenSecurityHandlerTest extends XMLObject
             if (confirmedSubjectConfirmation != null) {
                 context.getDynamicParameters().put(SAML2AssertionValidationParameters.CONFIRMED_SUBJECT_CONFIRMATION, confirmedSubjectConfirmation);
             }
+            
+            if (validationResult == null) {
+                throw new AssertionValidationException("Mock result was null");
+            }
             return validationResult;
         }
     }

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


More information about the commits mailing list