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

Scott Cantor cantor.2 at osu.edu
Wed Mar 22 16:11:25 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=ab70f50252d0d447a6222481693ba698e2c22cb5

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

commit ab70f50252d0d447a6222481693ba698e2c22cb5
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Mar 22 12:11:18 2023 -0400

    IDP-2069 - Null Handling Task
    
    https://shibboleth.atlassian.net/browse/IDP-2069
    
    Add annotations to soap-api.
    Cleaned opensaml-soap-impl.
    Adjusted some annotations in messaging.
---
 .../AbstractHttpClientResponseMessageDecoder.java  |   5 +-
 .../AbstractHttpServletRequestMessageDecoder.java  |   5 +-
 .../messaging/encoder/AbstractMessageEncoder.java  |   5 +-
 .../AbstractHttpClientRequestMessageEncoder.java   |   5 +-
 .../AbstractHttpServletResponseMessageEncoder.java |   3 +-
 .../BaseHttpServletResponseXMLMessageEncoder.java  |   2 +-
 .../soap/wspolicy/OperatorContentType.java         |   2 +-
 .../org/opensaml/soap/wstrust/AllowPostdating.java |  11 +-
 .../opensaml/soap/wstrust/AuthenticationType.java  |   7 +-
 .../org/opensaml/soap/wstrust/Authenticator.java   |  16 +-
 .../org/opensaml/soap/wstrust/BinaryExchange.java  |  24 +--
 .../org/opensaml/soap/wstrust/BinarySecret.java    |  24 +--
 .../org/opensaml/soap/wstrust/CancelTarget.java    |  16 +-
 .../soap/wstrust/CanonicalizationAlgorithm.java    |   7 +-
 .../java/org/opensaml/soap/wstrust/Challenge.java  |   7 +-
 .../java/org/opensaml/soap/wstrust/Claims.java     |  18 ++-
 .../main/java/org/opensaml/soap/wstrust/Code.java  |  15 +-
 .../org/opensaml/soap/wstrust/CombinedHash.java    |   9 +-
 .../org/opensaml/soap/wstrust/ComputedKey.java     |  15 +-
 .../soap/wstrust/ComputedKeyAlgorithm.java         |   7 +-
 .../org/opensaml/soap/wstrust/Delegatable.java     |   7 +-
 .../java/org/opensaml/soap/wstrust/DelegateTo.java |  16 +-
 .../org/opensaml/soap/wstrust/EncryptWith.java     |   7 +-
 .../java/org/opensaml/soap/wstrust/Encryption.java |  16 +-
 .../opensaml/soap/wstrust/EncryptionAlgorithm.java |   7 +-
 .../java/org/opensaml/soap/wstrust/Entropy.java    |  13 +-
 .../org/opensaml/soap/wstrust/Forwardable.java     |   7 +-
 .../org/opensaml/soap/wstrust/IssuedTokens.java    |   7 +-
 .../java/org/opensaml/soap/wstrust/Issuer.java     |   7 +-
 .../opensaml/soap/wstrust/KeyExchangeToken.java    |  11 +-
 .../java/org/opensaml/soap/wstrust/KeySize.java    |   7 +-
 .../java/org/opensaml/soap/wstrust/KeyType.java    |  17 +-
 .../opensaml/soap/wstrust/KeyWrapAlgorithm.java    |   7 +-
 .../java/org/opensaml/soap/wstrust/Lifetime.java   |  20 ++-
 .../java/org/opensaml/soap/wstrust/OnBehalfOf.java |  11 +-
 .../org/opensaml/soap/wstrust/Participant.java     |   7 +-
 .../org/opensaml/soap/wstrust/ParticipantType.java |  12 +-
 .../org/opensaml/soap/wstrust/Participants.java    |  19 ++-
 .../java/org/opensaml/soap/wstrust/Primary.java    |   7 +-
 .../org/opensaml/soap/wstrust/ProofEncryption.java |  16 +-
 .../java/org/opensaml/soap/wstrust/Reason.java     |   7 +-
 .../org/opensaml/soap/wstrust/RenewTarget.java     |  16 +-
 .../java/org/opensaml/soap/wstrust/Renewing.java   |  32 ++--
 .../java/org/opensaml/soap/wstrust/RequestKET.java |  11 +-
 .../soap/wstrust/RequestSecurityToken.java         |  18 ++-
 .../wstrust/RequestSecurityTokenCollection.java    |  14 +-
 .../soap/wstrust/RequestSecurityTokenResponse.java |  18 ++-
 .../RequestSecurityTokenResponseCollection.java    |  14 +-
 .../org/opensaml/soap/wstrust/RequestType.java     |  31 ++--
 .../soap/wstrust/RequestedAttachedReference.java   |   7 +-
 .../opensaml/soap/wstrust/RequestedProofToken.java |  16 +-
 .../soap/wstrust/RequestedReferenceType.java       |  12 +-
 .../soap/wstrust/RequestedSecurityToken.java       |  16 +-
 .../soap/wstrust/RequestedTokenCancelled.java      |  11 +-
 .../soap/wstrust/RequestedUnattachedReference.java |   7 +-
 .../org/opensaml/soap/wstrust/SignChallenge.java   |   7 +-
 .../soap/wstrust/SignChallengeResponse.java        |   7 +-
 .../opensaml/soap/wstrust/SignChallengeType.java   |  12 +-
 .../java/org/opensaml/soap/wstrust/SignWith.java   |   7 +-
 .../opensaml/soap/wstrust/SignatureAlgorithm.java  |   7 +-
 .../java/org/opensaml/soap/wstrust/Status.java     |  16 +-
 .../java/org/opensaml/soap/wstrust/TokenType.java  |   9 +-
 .../java/org/opensaml/soap/wstrust/UseKey.java     |  22 +--
 .../org/opensaml/soap/wstrust/ValidateTarget.java  |  16 +-
 .../opensaml/soap/wstrust/WSTrustConstants.java    |  63 ++++----
 .../soap/wstrust/WSTrustObjectBuilder.java         |   4 +-
 .../http/impl/HttpClientResponseSOAP11Decoder.java |  69 ++++----
 .../http/impl/HttpClientRequestSOAP11Encoder.java  |  25 +--
 .../config/impl/XMLObjectProviderInitializer.java  |   6 +-
 .../decoder/http/impl/EnvelopeBodyHandler.java     |   2 +-
 .../decoder/http/impl/HTTPSOAP11Decoder.java       |  25 ++-
 .../http/impl/SimplePayloadBodyHandler.java        |  19 ++-
 .../encoder/http/impl/HTTPSOAP11Encoder.java       |  39 +++--
 .../org/opensaml/soap/soap11/impl/BodyBuilder.java |   8 +-
 .../org/opensaml/soap/soap11/impl/BodyImpl.java    |   6 +-
 .../opensaml/soap/soap11/impl/BodyMarshaller.java  |   7 +-
 .../soap/soap11/impl/BodyUnmarshaller.java         |  10 +-
 .../opensaml/soap/soap11/impl/DetailBuilder.java   |   8 +-
 .../org/opensaml/soap/soap11/impl/DetailImpl.java  |   6 +-
 .../soap/soap11/impl/DetailMarshaller.java         |   7 +-
 .../soap/soap11/impl/DetailUnmarshaller.java       |  11 +-
 .../opensaml/soap/soap11/impl/EnvelopeBuilder.java |   8 +-
 .../opensaml/soap/soap11/impl/EnvelopeImpl.java    |  43 +++--
 .../soap/soap11/impl/EnvelopeMarshaller.java       |   7 +-
 .../soap/soap11/impl/EnvelopeUnmarshaller.java     |  10 +-
 .../soap/soap11/impl/FaultActorBuilder.java        |  13 +-
 .../opensaml/soap/soap11/impl/FaultActorImpl.java  |   6 +-
 .../opensaml/soap/soap11/impl/FaultBuilder.java    |   8 +-
 .../soap/soap11/impl/FaultCodeBuilder.java         |  13 +-
 .../opensaml/soap/soap11/impl/FaultCodeImpl.java   |   6 +-
 .../org/opensaml/soap/soap11/impl/FaultImpl.java   |  62 +++++---
 .../opensaml/soap/soap11/impl/FaultMarshaller.java |   7 +-
 .../soap/soap11/impl/FaultStringBuilder.java       |  13 +-
 .../opensaml/soap/soap11/impl/FaultStringImpl.java |   6 +-
 .../soap/soap11/impl/FaultUnmarshaller.java        |  12 +-
 .../opensaml/soap/soap11/impl/HeaderBuilder.java   |   8 +-
 .../org/opensaml/soap/soap11/impl/HeaderImpl.java  |   6 +-
 .../soap/soap11/impl/HeaderMarshaller.java         |   7 +-
 .../soap/soap11/impl/HeaderUnmarshaller.java       |  10 +-
 .../soap/soap11/profile/impl/AddSOAPFault.java     |  48 +++---
 .../impl/AbstractWSAddressingObject.java           |   9 +-
 .../impl/AbstractWSAddressingObjectBuilder.java    |   4 +-
 .../impl/AbstractWSAddressingObjectMarshaller.java |   7 +-
 .../AbstractWSAddressingObjectUnmarshaller.java    |  21 ++-
 .../soap/wsaddressing/impl/ActionBuilder.java      |   8 +-
 .../soap/wsaddressing/impl/ActionImpl.java         |   6 +-
 .../soap/wsaddressing/impl/AddressBuilder.java     |   8 +-
 .../soap/wsaddressing/impl/AddressImpl.java        |   6 +-
 .../wsaddressing/impl/AttributedQNameImpl.java     |  10 +-
 .../impl/AttributedQNameMarshaller.java            |   5 +-
 .../impl/AttributedQNameUnmarshaller.java          |   5 +-
 .../soap/wsaddressing/impl/AttributedURIImpl.java  |  10 +-
 .../wsaddressing/impl/AttributedURIMarshaller.java |   7 +-
 .../impl/AttributedURIUnmarshaller.java            |   7 +-
 .../impl/AttributedUnsignedLongImpl.java           |  17 +-
 .../impl/AttributedUnsignedLongMarshaller.java     |  12 +-
 .../impl/AttributedUnsignedLongUnmarshaller.java   |   7 +-
 .../impl/EndpointReferenceBuilder.java             |   9 +-
 .../wsaddressing/impl/EndpointReferenceImpl.java   |   7 +-
 .../impl/EndpointReferenceTypeImpl.java            |  46 +++---
 .../impl/EndpointReferenceTypeMarshaller.java      |   5 +-
 .../impl/EndpointReferenceTypeUnmarshaller.java    |   9 +-
 .../soap/wsaddressing/impl/FaultToBuilder.java     |   8 +-
 .../soap/wsaddressing/impl/FaultToImpl.java        |   6 +-
 .../soap/wsaddressing/impl/FromBuilder.java        |   8 +-
 .../opensaml/soap/wsaddressing/impl/FromImpl.java  |   6 +-
 .../soap/wsaddressing/impl/MessageIDBuilder.java   |   8 +-
 .../soap/wsaddressing/impl/MessageIDImpl.java      |   6 +-
 .../soap/wsaddressing/impl/MetadataBuilder.java    |   8 +-
 .../soap/wsaddressing/impl/MetadataImpl.java       |  16 +-
 .../soap/wsaddressing/impl/MetadataMarshaller.java |   5 +-
 .../wsaddressing/impl/MetadataUnmarshaller.java    |   9 +-
 .../wsaddressing/impl/ProblemActionBuilder.java    |   8 +-
 .../soap/wsaddressing/impl/ProblemActionImpl.java  |  29 ++--
 .../wsaddressing/impl/ProblemActionMarshaller.java |   5 +-
 .../impl/ProblemActionUnmarshaller.java            |   9 +-
 .../impl/ProblemHeaderQNameBuilder.java            |   9 +-
 .../wsaddressing/impl/ProblemHeaderQNameImpl.java  |   7 +-
 .../soap/wsaddressing/impl/ProblemIRIBuilder.java  |   8 +-
 .../soap/wsaddressing/impl/ProblemIRIImpl.java     |   6 +-
 .../impl/ReferenceParametersBuilder.java           |   9 +-
 .../wsaddressing/impl/ReferenceParametersImpl.java |  17 +-
 .../impl/ReferenceParametersMarshaller.java        |   5 +-
 .../impl/ReferenceParametersUnmarshaller.java      |   9 +-
 .../soap/wsaddressing/impl/RelatesToBuilder.java   |   8 +-
 .../soap/wsaddressing/impl/RelatesToImpl.java      |  16 +-
 .../wsaddressing/impl/RelatesToMarshaller.java     |   5 +-
 .../wsaddressing/impl/RelatesToUnmarshaller.java   |   5 +-
 .../soap/wsaddressing/impl/ReplyToBuilder.java     |   8 +-
 .../soap/wsaddressing/impl/ReplyToImpl.java        |   6 +-
 .../soap/wsaddressing/impl/RetryAfterBuilder.java  |   8 +-
 .../soap/wsaddressing/impl/RetryAfterImpl.java     |   6 +-
 .../soap/wsaddressing/impl/SoapActionBuilder.java  |   8 +-
 .../soap/wsaddressing/impl/SoapActionImpl.java     |   6 +-
 .../opensaml/soap/wsaddressing/impl/ToBuilder.java |   8 +-
 .../opensaml/soap/wsaddressing/impl/ToImpl.java    |   6 +-
 .../messaging/impl/AddActionHandler.java           |  16 +-
 .../messaging/impl/AddMessageIDHandler.java        |  17 +-
 .../messaging/impl/AddRelatesToHandler.java        |   6 +-
 .../messaging/impl/ExtractMessageIDHandler.java    |   6 +-
 .../messaging/impl/ValidateActionHandler.java      |  10 +-
 .../opensaml/soap/wsfed/impl/AddressBuilder.java   |  13 +-
 .../org/opensaml/soap/wsfed/impl/AddressImpl.java  |  17 +-
 .../soap/wsfed/impl/AddressMarshaller.java         |  11 +-
 .../soap/wsfed/impl/AddressUnmarshaller.java       |  13 +-
 .../opensaml/soap/wsfed/impl/AppliesToBuilder.java |  13 +-
 .../opensaml/soap/wsfed/impl/AppliesToImpl.java    |  34 ++--
 .../soap/wsfed/impl/AppliesToMarshaller.java       |  11 +-
 .../soap/wsfed/impl/AppliesToUnmarshaller.java     |  18 ++-
 .../soap/wsfed/impl/EndPointReferenceBuilder.java  |  14 +-
 .../soap/wsfed/impl/EndPointReferenceImpl.java     |  29 ++--
 .../wsfed/impl/EndPointReferenceMarshaller.java    |  11 +-
 .../wsfed/impl/EndPointReferenceUnmarshaller.java  |  18 ++-
 .../impl/RequestSecurityTokenResponseBuilder.java  |   9 +-
 .../impl/RequestSecurityTokenResponseImpl.java     |  28 ++--
 .../RequestSecurityTokenResponseMarshaller.java    |  11 +-
 .../RequestSecurityTokenResponseUnmarshaller.java  |  24 +--
 .../wsfed/impl/RequestedSecurityTokenBuilder.java  |  14 +-
 .../wsfed/impl/RequestedSecurityTokenImpl.java     |  11 +-
 .../impl/RequestedSecurityTokenMarshaller.java     |  11 +-
 .../impl/RequestedSecurityTokenUnmarshaller.java   |  16 +-
 .../soap/wspolicy/impl/AbstractWSPolicyObject.java |   7 +-
 .../impl/AbstractWSPolicyObjectBuilder.java        |   4 +-
 .../impl/AbstractWSPolicyObjectMarshaller.java     |  12 +-
 .../impl/AbstractWSPolicyObjectUnmarshaller.java   |  21 ++-
 .../opensaml/soap/wspolicy/impl/AllBuilder.java    |   8 +-
 .../org/opensaml/soap/wspolicy/impl/AllImpl.java   |   6 +-
 .../soap/wspolicy/impl/AppliesToBuilder.java       |   8 +-
 .../opensaml/soap/wspolicy/impl/AppliesToImpl.java |  16 +-
 .../soap/wspolicy/impl/AppliesToMarshaller.java    |   5 +-
 .../soap/wspolicy/impl/AppliesToUnmarshaller.java  |   9 +-
 .../soap/wspolicy/impl/ExactlyOneBuilder.java      |   8 +-
 .../soap/wspolicy/impl/ExactlyOneImpl.java         |   6 +-
 .../wspolicy/impl/OperatorContentTypeImpl.java     |  31 ++--
 .../impl/OperatorContentTypeUnmarshaller.java      |   6 +-
 .../wspolicy/impl/PolicyAttachmentBuilder.java     |   9 +-
 .../soap/wspolicy/impl/PolicyAttachmentImpl.java   |  37 +++--
 .../wspolicy/impl/PolicyAttachmentMarshaller.java  |   5 +-
 .../impl/PolicyAttachmentUnmarshaller.java         |   9 +-
 .../opensaml/soap/wspolicy/impl/PolicyBuilder.java |   8 +-
 .../opensaml/soap/wspolicy/impl/PolicyImpl.java    |  24 +--
 .../soap/wspolicy/impl/PolicyMarshaller.java       |   8 +-
 .../soap/wspolicy/impl/PolicyReferenceBuilder.java |   9 +-
 .../soap/wspolicy/impl/PolicyReferenceImpl.java    |  30 ++--
 .../wspolicy/impl/PolicyReferenceMarshaller.java   |   5 +-
 .../wspolicy/impl/PolicyReferenceUnmarshaller.java |   4 +-
 .../soap/wspolicy/impl/PolicyUnmarshaller.java     |   4 +-
 .../wssecurity/impl/AbstractWSSecurityObject.java  |   7 +-
 .../impl/AbstractWSSecurityObjectBuilder.java      |   5 +-
 .../impl/AbstractWSSecurityObjectMarshaller.java   |  19 +--
 .../impl/AbstractWSSecurityObjectUnmarshaller.java |  23 ++-
 .../wssecurity/impl/AttributedDateTimeImpl.java    |  34 ++--
 .../impl/AttributedDateTimeMarshaller.java         |  11 +-
 .../impl/AttributedDateTimeUnmarshaller.java       |   6 +-
 .../soap/wssecurity/impl/AttributedStringImpl.java |  23 +--
 .../impl/AttributedStringMarshaller.java           |  11 +-
 .../impl/AttributedStringUnmarshaller.java         |   6 +-
 .../soap/wssecurity/impl/AttributedURIImpl.java    |  16 +-
 .../wssecurity/impl/AttributedURIMarshaller.java   |   5 +-
 .../wssecurity/impl/AttributedURIUnmarshaller.java |   4 +-
 .../impl/BinarySecurityTokenBuilder.java           |   9 +-
 .../wssecurity/impl/BinarySecurityTokenImpl.java   |  13 +-
 .../impl/BinarySecurityTokenMarshaller.java        |   5 +-
 .../impl/BinarySecurityTokenUnmarshaller.java      |   5 +-
 .../soap/wssecurity/impl/CreatedBuilder.java       |  25 ++-
 .../opensaml/soap/wssecurity/impl/CreatedImpl.java |   6 +-
 .../soap/wssecurity/impl/EmbeddedBuilder.java      |   8 +-
 .../soap/wssecurity/impl/EmbeddedImpl.java         |  34 ++--
 .../soap/wssecurity/impl/EmbeddedMarshaller.java   |   5 +-
 .../soap/wssecurity/impl/EmbeddedUnmarshaller.java |   9 +-
 .../soap/wssecurity/impl/EncodedStringImpl.java    |  12 +-
 .../wssecurity/impl/EncodedStringMarshaller.java   |   5 +-
 .../wssecurity/impl/EncodedStringUnmarshaller.java |   5 +-
 .../wssecurity/impl/EncryptedHeaderBuilder.java    |   9 +-
 .../soap/wssecurity/impl/EncryptedHeaderImpl.java  |  74 ++++-----
 .../wssecurity/impl/EncryptedHeaderMarshaller.java |  32 ++--
 .../soap/wssecurity/impl/ExpiresBuilder.java       |  25 ++-
 .../opensaml/soap/wssecurity/impl/ExpiresImpl.java |   6 +-
 .../soap/wssecurity/impl/IterationBuilder.java     |   8 +-
 .../soap/wssecurity/impl/IterationImpl.java        |   6 +-
 .../soap/wssecurity/impl/IterationMarshaller.java  |   9 +-
 .../wssecurity/impl/IterationUnmarshaller.java     |   4 +-
 .../soap/wssecurity/impl/KeyIdentifierBuilder.java |   8 +-
 .../soap/wssecurity/impl/KeyIdentifierImpl.java    |  12 +-
 .../wssecurity/impl/KeyIdentifierMarshaller.java   |   5 +-
 .../wssecurity/impl/KeyIdentifierUnmarshaller.java |   5 +-
 .../soap/wssecurity/impl/NonceBuilder.java         |   8 +-
 .../opensaml/soap/wssecurity/impl/NonceImpl.java   |   6 +-
 .../soap/wssecurity/impl/PasswordBuilder.java      |   8 +-
 .../soap/wssecurity/impl/PasswordImpl.java         |  12 +-
 .../soap/wssecurity/impl/PasswordMarshaller.java   |   5 +-
 .../soap/wssecurity/impl/PasswordUnmarshaller.java |   5 +-
 .../soap/wssecurity/impl/ReferenceBuilder.java     |   8 +-
 .../soap/wssecurity/impl/ReferenceImpl.java        |  22 +--
 .../soap/wssecurity/impl/ReferenceMarshaller.java  |   6 +-
 .../wssecurity/impl/ReferenceUnmarshaller.java     |   5 +-
 .../opensaml/soap/wssecurity/impl/SaltBuilder.java |   8 +-
 .../opensaml/soap/wssecurity/impl/SaltImpl.java    |   6 +-
 .../soap/wssecurity/impl/SaltMarshaller.java       |   4 +-
 .../soap/wssecurity/impl/SaltUnmarshaller.java     |   4 +-
 .../soap/wssecurity/impl/SecurityBuilder.java      |   8 +-
 .../soap/wssecurity/impl/SecurityImpl.java         |  16 +-
 .../soap/wssecurity/impl/SecurityMarshaller.java   |   5 +-
 .../impl/SecurityTokenReferenceBuilder.java        |   9 +-
 .../impl/SecurityTokenReferenceImpl.java           |  45 +++---
 .../impl/SecurityTokenReferenceMarshaller.java     |   8 +-
 .../soap/wssecurity/impl/SecurityUnmarshaller.java |   9 +-
 .../impl/SignatureConfirmationBuilder.java         |   9 +-
 .../wssecurity/impl/SignatureConfirmationImpl.java |  19 ++-
 .../impl/SignatureConfirmationMarshaller.java      |   9 +-
 .../impl/SignatureConfirmationUnmarshaller.java    |   4 +-
 .../soap/wssecurity/impl/TimestampBuilder.java     |   8 +-
 .../soap/wssecurity/impl/TimestampImpl.java        |  46 +++---
 .../soap/wssecurity/impl/TimestampMarshaller.java  |   9 +-
 .../wssecurity/impl/TimestampUnmarshaller.java     |   8 +-
 .../impl/TransformationParametersBuilder.java      |   9 +-
 .../impl/TransformationParametersImpl.java         |  17 +-
 .../impl/TransformationParametersMarshaller.java   |   5 +-
 .../impl/TransformationParametersUnmarshaller.java |   9 +-
 .../soap/wssecurity/impl/UsernameBuilder.java      |   8 +-
 .../soap/wssecurity/impl/UsernameImpl.java         |   6 +-
 .../soap/wssecurity/impl/UsernameTokenBuilder.java |   8 +-
 .../soap/wssecurity/impl/UsernameTokenImpl.java    |  40 ++---
 .../wssecurity/impl/UsernameTokenMarshaller.java   |   9 +-
 .../wssecurity/impl/UsernameTokenUnmarshaller.java |   8 +-
 .../messaging/impl/AddTimestampHandler.java        |  11 +-
 .../soap/wstrust/impl/AbstractWSTrustObject.java   |   7 +-
 .../wstrust/impl/AbstractWSTrustObjectBuilder.java |   6 +-
 .../impl/AbstractWSTrustObjectMarshaller.java      |  21 ++-
 .../impl/AbstractWSTrustObjectUnmarshaller.java    |  21 ++-
 .../soap/wstrust/impl/AllowPostdatingBuilder.java  |   9 +-
 .../soap/wstrust/impl/AllowPostdatingImpl.java     |   8 +-
 .../wstrust/impl/AuthenticationTypeBuilder.java    |   9 +-
 .../soap/wstrust/impl/AuthenticationTypeImpl.java  |   7 +-
 .../soap/wstrust/impl/AuthenticatorBuilder.java    |   8 +-
 .../soap/wstrust/impl/AuthenticatorImpl.java       |  25 +--
 .../wstrust/impl/AuthenticatorUnmarshaller.java    |   6 +-
 .../soap/wstrust/impl/BinaryExchangeBuilder.java   |   8 +-
 .../soap/wstrust/impl/BinaryExchangeImpl.java      |  22 +--
 .../wstrust/impl/BinaryExchangeMarshaller.java     |   5 +-
 .../wstrust/impl/BinaryExchangeUnmarshaller.java   |   5 +-
 .../soap/wstrust/impl/BinarySecretBuilder.java     |   8 +-
 .../soap/wstrust/impl/BinarySecretImpl.java        |  18 ++-
 .../soap/wstrust/impl/BinarySecretMarshaller.java  |   5 +-
 .../wstrust/impl/BinarySecretUnmarshaller.java     |   5 +-
 .../soap/wstrust/impl/CancelTargetBuilder.java     |   8 +-
 .../soap/wstrust/impl/CancelTargetImpl.java        |  24 +--
 .../wstrust/impl/CancelTargetUnmarshaller.java     |   6 +-
 .../impl/CanonicalizationAlgorithmBuilder.java     |   9 +-
 .../impl/CanonicalizationAlgorithmImpl.java        |   7 +-
 .../soap/wstrust/impl/ChallengeBuilder.java        |   8 +-
 .../opensaml/soap/wstrust/impl/ChallengeImpl.java  |   6 +-
 .../opensaml/soap/wstrust/impl/ClaimsBuilder.java  |   8 +-
 .../org/opensaml/soap/wstrust/impl/ClaimsImpl.java |  35 +++--
 .../soap/wstrust/impl/ClaimsMarshaller.java        |   5 +-
 .../soap/wstrust/impl/ClaimsUnmarshaller.java      |   9 +-
 .../opensaml/soap/wstrust/impl/CodeBuilder.java    |   8 +-
 .../org/opensaml/soap/wstrust/impl/CodeImpl.java   |   6 +-
 .../soap/wstrust/impl/CombinedHashBuilder.java     |   8 +-
 .../soap/wstrust/impl/CombinedHashImpl.java        |   6 +-
 .../wstrust/impl/ComputedKeyAlgorithmBuilder.java  |   9 +-
 .../wstrust/impl/ComputedKeyAlgorithmImpl.java     |   7 +-
 .../soap/wstrust/impl/ComputedKeyBuilder.java      |   8 +-
 .../soap/wstrust/impl/ComputedKeyImpl.java         |   6 +-
 .../soap/wstrust/impl/DelegatableBuilder.java      |   8 +-
 .../soap/wstrust/impl/DelegatableImpl.java         |  16 +-
 .../soap/wstrust/impl/DelegatableMarshaller.java   |  10 +-
 .../soap/wstrust/impl/DelegatableUnmarshaller.java |   4 +-
 .../soap/wstrust/impl/DelegateToBuilder.java       |   8 +-
 .../opensaml/soap/wstrust/impl/DelegateToImpl.java |  24 +--
 .../soap/wstrust/impl/DelegateToUnmarshaller.java  |   6 +-
 .../soap/wstrust/impl/EncryptWithBuilder.java      |   8 +-
 .../soap/wstrust/impl/EncryptWithImpl.java         |   6 +-
 .../wstrust/impl/EncryptionAlgorithmBuilder.java   |   9 +-
 .../soap/wstrust/impl/EncryptionAlgorithmImpl.java |   7 +-
 .../soap/wstrust/impl/EncryptionBuilder.java       |   8 +-
 .../opensaml/soap/wstrust/impl/EncryptionImpl.java |  24 +--
 .../soap/wstrust/impl/EncryptionUnmarshaller.java  |   6 +-
 .../opensaml/soap/wstrust/impl/EntropyBuilder.java |   8 +-
 .../opensaml/soap/wstrust/impl/EntropyImpl.java    |  26 +--
 .../soap/wstrust/impl/EntropyMarshaller.java       |   5 +-
 .../soap/wstrust/impl/EntropyUnmarshaller.java     |   9 +-
 .../soap/wstrust/impl/ForwardableBuilder.java      |   8 +-
 .../soap/wstrust/impl/ForwardableImpl.java         |  16 +-
 .../soap/wstrust/impl/ForwardableMarshaller.java   |   8 +-
 .../soap/wstrust/impl/ForwardableUnmarshaller.java |   4 +-
 .../soap/wstrust/impl/IssuedTokensBuilder.java     |   8 +-
 .../soap/wstrust/impl/IssuedTokensImpl.java        |   6 +-
 .../opensaml/soap/wstrust/impl/IssuerBuilder.java  |   8 +-
 .../org/opensaml/soap/wstrust/impl/IssuerImpl.java |   6 +-
 .../soap/wstrust/impl/KeyExchangeTokenBuilder.java |   9 +-
 .../soap/wstrust/impl/KeyExchangeTokenImpl.java    |  22 +--
 .../wstrust/impl/KeyExchangeTokenUnmarshaller.java |   6 +-
 .../opensaml/soap/wstrust/impl/KeySizeBuilder.java |   8 +-
 .../opensaml/soap/wstrust/impl/KeySizeImpl.java    |   6 +-
 .../opensaml/soap/wstrust/impl/KeyTypeBuilder.java |   8 +-
 .../opensaml/soap/wstrust/impl/KeyTypeImpl.java    |   6 +-
 .../soap/wstrust/impl/KeyWrapAlgorithmBuilder.java |   9 +-
 .../soap/wstrust/impl/KeyWrapAlgorithmImpl.java    |   7 +-
 .../soap/wstrust/impl/LifetimeBuilder.java         |   8 +-
 .../opensaml/soap/wstrust/impl/LifetimeImpl.java   |  25 +--
 .../soap/wstrust/impl/LifetimeUnmarshaller.java    |   6 +-
 .../soap/wstrust/impl/OnBehalfOfBuilder.java       |   8 +-
 .../opensaml/soap/wstrust/impl/OnBehalfOfImpl.java |  23 +--
 .../soap/wstrust/impl/OnBehalfOfUnmarshaller.java  |   6 +-
 .../soap/wstrust/impl/ParticipantBuilder.java      |   8 +-
 .../soap/wstrust/impl/ParticipantImpl.java         |   6 +-
 .../soap/wstrust/impl/ParticipantTypeImpl.java     |  24 +--
 .../wstrust/impl/ParticipantTypeUnmarshaller.java  |   6 +-
 .../soap/wstrust/impl/ParticipantsBuilder.java     |   8 +-
 .../soap/wstrust/impl/ParticipantsImpl.java        |  29 ++--
 .../wstrust/impl/ParticipantsUnmarshaller.java     |   6 +-
 .../opensaml/soap/wstrust/impl/PrimaryBuilder.java |   8 +-
 .../opensaml/soap/wstrust/impl/PrimaryImpl.java    |   6 +-
 .../soap/wstrust/impl/ProofEncryptionBuilder.java  |   9 +-
 .../soap/wstrust/impl/ProofEncryptionImpl.java     |  23 +--
 .../wstrust/impl/ProofEncryptionUnmarshaller.java  |   6 +-
 .../opensaml/soap/wstrust/impl/ReasonBuilder.java  |   8 +-
 .../org/opensaml/soap/wstrust/impl/ReasonImpl.java |   6 +-
 .../soap/wstrust/impl/RenewTargetBuilder.java      |   8 +-
 .../soap/wstrust/impl/RenewTargetImpl.java         |  25 +--
 .../soap/wstrust/impl/RenewTargetUnmarshaller.java |   6 +-
 .../soap/wstrust/impl/RenewingBuilder.java         |   8 +-
 .../opensaml/soap/wstrust/impl/RenewingImpl.java   |  28 ++--
 .../soap/wstrust/impl/RenewingMarshaller.java      |  18 ++-
 .../soap/wstrust/impl/RenewingUnmarshaller.java    |   5 +-
 .../soap/wstrust/impl/RequestKETBuilder.java       |   8 +-
 .../opensaml/soap/wstrust/impl/RequestKETImpl.java |   8 +-
 .../wstrust/impl/RequestSecurityTokenBuilder.java  |   9 +-
 .../RequestSecurityTokenCollectionBuilder.java     |   9 +-
 .../impl/RequestSecurityTokenCollectionImpl.java   |  20 +--
 ...RequestSecurityTokenCollectionUnmarshaller.java |   6 +-
 .../wstrust/impl/RequestSecurityTokenImpl.java     |  33 ++--
 .../impl/RequestSecurityTokenMarshaller.java       |   5 +-
 .../impl/RequestSecurityTokenResponseBuilder.java  |   9 +-
 ...uestSecurityTokenResponseCollectionBuilder.java |   9 +-
 ...RequestSecurityTokenResponseCollectionImpl.java |  24 +--
 ...tSecurityTokenResponseCollectionMarshaller.java |   5 +-
 ...ecurityTokenResponseCollectionUnmarshaller.java |   9 +-
 .../impl/RequestSecurityTokenResponseImpl.java     |  31 ++--
 .../RequestSecurityTokenResponseMarshaller.java    |   5 +-
 .../RequestSecurityTokenResponseUnmarshaller.java  |   9 +-
 .../impl/RequestSecurityTokenUnmarshaller.java     |   9 +-
 .../soap/wstrust/impl/RequestTypeBuilder.java      |   8 +-
 .../soap/wstrust/impl/RequestTypeImpl.java         |   6 +-
 .../impl/RequestedAttachedReferenceBuilder.java    |   9 +-
 .../impl/RequestedAttachedReferenceImpl.java       |   7 +-
 .../wstrust/impl/RequestedProofTokenBuilder.java   |   9 +-
 .../soap/wstrust/impl/RequestedProofTokenImpl.java |  26 +--
 .../impl/RequestedProofTokenUnmarshaller.java      |   6 +-
 .../wstrust/impl/RequestedReferenceTypeImpl.java   |  25 +--
 .../impl/RequestedReferenceTypeUnmarshaller.java   |   6 +-
 .../impl/RequestedSecurityTokenBuilder.java        |   9 +-
 .../wstrust/impl/RequestedSecurityTokenImpl.java   |  26 +--
 .../impl/RequestedSecurityTokenUnmarshaller.java   |   6 +-
 .../impl/RequestedTokenCancelledBuilder.java       |   9 +-
 .../wstrust/impl/RequestedTokenCancelledImpl.java  |   9 +-
 .../impl/RequestedUnattachedReferenceBuilder.java  |   9 +-
 .../impl/RequestedUnattachedReferenceImpl.java     |   7 +-
 .../soap/wstrust/impl/SignChallengeBuilder.java    |   8 +-
 .../soap/wstrust/impl/SignChallengeImpl.java       |   6 +-
 .../wstrust/impl/SignChallengeResponseBuilder.java |   9 +-
 .../wstrust/impl/SignChallengeResponseImpl.java    |   7 +-
 .../soap/wstrust/impl/SignChallengeTypeImpl.java   |  30 ++--
 .../wstrust/impl/SignChallengeTypeMarshaller.java  |   5 +-
 .../impl/SignChallengeTypeUnmarshaller.java        |   9 +-
 .../soap/wstrust/impl/SignWithBuilder.java         |   8 +-
 .../opensaml/soap/wstrust/impl/SignWithImpl.java   |   6 +-
 .../wstrust/impl/SignatureAlgorithmBuilder.java    |   9 +-
 .../soap/wstrust/impl/SignatureAlgorithmImpl.java  |   7 +-
 .../opensaml/soap/wstrust/impl/StatusBuilder.java  |   8 +-
 .../org/opensaml/soap/wstrust/impl/StatusImpl.java |  27 ++--
 .../soap/wstrust/impl/StatusUnmarshaller.java      |   6 +-
 .../soap/wstrust/impl/TokenTypeBuilder.java        |   8 +-
 .../opensaml/soap/wstrust/impl/TokenTypeImpl.java  |   6 +-
 .../opensaml/soap/wstrust/impl/UseKeyBuilder.java  |   8 +-
 .../org/opensaml/soap/wstrust/impl/UseKeyImpl.java |  30 ++--
 .../soap/wstrust/impl/UseKeyMarshaller.java        |   5 +-
 .../soap/wstrust/impl/UseKeyUnmarshaller.java      |   9 +-
 .../soap/wstrust/impl/ValidateTargetBuilder.java   |   8 +-
 .../soap/wstrust/impl/ValidateTargetImpl.java      |  25 +--
 .../wstrust/impl/ValidateTargetUnmarshaller.java   |   6 +-
 .../impl/HttpClientResponseSOAP11DecoderTest.java  |  78 ++++-----
 .../impl/HttpClientRequestSOAP11EncoderTest.java   |  29 ++--
 .../decoder/http/impl/HTTPSOAP11DecoderTest.java   |  30 ++--
 .../encoder/http/impl/HTTPSOAP11EncoderTest.java   |  44 ++++--
 .../soap/soap11/profile/impl/AddSOAPFaultTest.java | 175 +++++++++++++--------
 .../soap/testing/SOAPMessagingBaseTestCase.java    |   7 +-
 .../java/org/opensaml/soap/testing/SOAPTest.java   |  54 +++----
 .../impl/WSAddressingObjectsTestCase.java          |   5 +-
 .../messaging/impl/AddActionHandlerTest.java       |  12 +-
 .../messaging/impl/AddMessageIDHandlerTest.java    |   8 +-
 .../messaging/impl/AddRelatesToHandlerTest.java    |   8 +-
 .../impl/ExtractMessageIDHandlerTest.java          |   8 +-
 .../messaging/impl/ValidateActionHandlerTest.java  |   8 +-
 .../wssecurity/impl/WSSecurityObjectsTestCase.java |   8 +-
 .../messaging/impl/AddTimestampHandlerTest.java    | 137 +++++++++-------
 .../soap/wstrust/impl/WSTrustObjectsTestCase.java  |  17 +-
 .../core/testing/XMLObjectBaseTestCase.java        |   7 +-
 459 files changed, 3705 insertions(+), 2139 deletions(-)

diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
index 86e8086b0..6824bbc57 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/httpclient/AbstractHttpClientResponseMessageDecoder.java
@@ -22,6 +22,7 @@ import javax.annotation.Nullable;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.opensaml.messaging.decoder.AbstractMessageDecoder;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -31,10 +32,10 @@ public abstract class AbstractHttpClientResponseMessageDecoder extends AbstractM
         implements HttpClientResponseMessageDecoder {
 
     /** The HTTP client response. */
-    @Nullable private ClassicHttpResponse response;
+    @NonnullAfterInit private ClassicHttpResponse response;
 
     /** {@inheritDoc} */
-    @Nullable public ClassicHttpResponse getHttpResponse() {
+    @NonnullAfterInit public ClassicHttpResponse getHttpResponse() {
         return response;
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
index f49c558fd..23c3ad055 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/decoder/servlet/AbstractHttpServletRequestMessageDecoder.java
@@ -23,6 +23,7 @@ import org.opensaml.messaging.decoder.AbstractMessageDecoder;
 import org.opensaml.messaging.decoder.MessageDecodingException;
 
 import jakarta.servlet.http.HttpServletRequest;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.NonnullSupplier;
 
@@ -33,7 +34,7 @@ public abstract class AbstractHttpServletRequestMessageDecoder extends AbstractM
         implements HttpServletRequestMessageDecoder {
 
     /** Current HTTP request, if available. */
-    @Nullable private NonnullSupplier<HttpServletRequest> httpServletRequestSupplier;
+    @NonnullAfterInit private NonnullSupplier<HttpServletRequest> httpServletRequestSupplier;
 
     /** {@inheritDoc} */
     @Nullable public HttpServletRequest getHttpServletRequest() {
@@ -49,7 +50,7 @@ public abstract class AbstractHttpServletRequestMessageDecoder extends AbstractM
      *
      * @return current HTTP request
      */
-    @Nullable public NonnullSupplier<HttpServletRequest> getHttpServletRequestSupplier() {
+    @NonnullAfterInit public NonnullSupplier<HttpServletRequest> getHttpServletRequestSupplier() {
         return httpServletRequestSupplier;
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
index 6d5f5cc02..98b4e1e7b 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/AbstractMessageEncoder.java
@@ -21,6 +21,7 @@ import javax.annotation.Nullable;
 
 import org.opensaml.messaging.context.MessageContext;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.AbstractInitializableComponent;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.component.UnmodifiableComponent;
@@ -32,7 +33,7 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
         implements MessageEncoder, UnmodifiableComponent {
 
     /** The message context. */
-    @Nullable private MessageContext messageContext;
+    @NonnullAfterInit private MessageContext messageContext;
 
     /** {@inheritDoc} */
     public synchronized void setMessageContext(@Nullable final MessageContext context) {
@@ -60,7 +61,7 @@ public abstract class AbstractMessageEncoder extends AbstractInitializableCompon
      * 
      * @return the message context.
      */
-    @Nullable protected MessageContext getMessageContext() {
+    @NonnullAfterInit protected MessageContext getMessageContext() {
         return messageContext;
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
index 1b3bdb3d0..2dea8bb28 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/httpclient/AbstractHttpClientRequestMessageEncoder.java
@@ -23,6 +23,7 @@ import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.opensaml.messaging.encoder.AbstractMessageEncoder;
 import org.opensaml.messaging.encoder.servlet.HttpServletResponseMessageEncoder;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 
 /**
@@ -32,10 +33,10 @@ public abstract class AbstractHttpClientRequestMessageEncoder extends AbstractMe
         implements HttpClientRequestMessageEncoder {
 
     /** The HTTP client request. */
-    @Nullable private ClassicHttpRequest request;
+    @NonnullAfterInit private ClassicHttpRequest request;
 
     /** {@inheritDoc} */
-    @Nullable public ClassicHttpRequest getHttpRequest() {
+    @NonnullAfterInit public ClassicHttpRequest getHttpRequest() {
         return request;
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
index 9d2294f17..05b11ec0b 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/AbstractHttpServletResponseMessageEncoder.java
@@ -22,6 +22,7 @@ import javax.annotation.Nullable;
 import org.opensaml.messaging.encoder.AbstractMessageEncoder;
 
 import jakarta.servlet.http.HttpServletResponse;
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.primitive.NonnullSupplier;
 
@@ -57,7 +58,7 @@ public abstract class AbstractHttpServletResponseMessageEncoder extends Abstract
      *
      * @return the supplier for the current HTTP response or null
      */
-    @Nullable public NonnullSupplier<HttpServletResponse> getHttpServletResponseSupplier() {
+    @NonnullAfterInit public NonnullSupplier<HttpServletResponse> getHttpServletResponseSupplier() {
         return httpServletResponseSupplier;
     }
 
diff --git a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
index cbe024bf4..84ddd0396 100644
--- a/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
+++ b/opensaml-messaging-api/src/main/java/org/opensaml/messaging/encoder/servlet/BaseHttpServletResponseXMLMessageEncoder.java
@@ -101,7 +101,7 @@ public abstract class BaseHttpServletResponseXMLMessageEncoder  extends Abstract
      * 
      * @throws MessageEncodingException thrown if the give message can not be marshalled into its DOM representation
      */
-    protected Element marshallMessage(@Nonnull final XMLObject message) throws MessageEncodingException {
+    @Nonnull protected Element marshallMessage(@Nonnull final XMLObject message) throws MessageEncodingException {
         log.debug("Marshalling message");
         
         try {
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wspolicy/OperatorContentType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wspolicy/OperatorContentType.java
index c06a1c751..f7de37e20 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wspolicy/OperatorContentType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wspolicy/OperatorContentType.java
@@ -81,6 +81,6 @@ public interface OperatorContentType extends WSPolicyObject {
      * 
      * @return the list of {@link XMLObject} instances
      */
-    @Nonnull public List<XMLObject> getXMLObjects(QName typeOrName);
+    @Nonnull public List<XMLObject> getXMLObjects(@Nonnull QName typeOrName);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AllowPostdating.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AllowPostdating.java
index 9f138c9ea..ff4c33ca4 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AllowPostdating.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AllowPostdating.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:AllowPostdating element.
  * 
@@ -28,17 +31,17 @@ import javax.xml.namespace.QName;
 public interface AllowPostdating extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "AllowPostdating";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "AllowPostdating";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "AllowPostdatingType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "AllowPostdatingType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AuthenticationType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AuthenticationType.java
index 066435d9e..f881f9130 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AuthenticationType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/AuthenticationType.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:AuthenticationType element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface AuthenticationType extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "AuthenticationType";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "AuthenticationType";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Authenticator.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Authenticator.java
index 071c95410..8c90d5fca 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Authenticator.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Authenticator.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Authenticator element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface Authenticator extends ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Authenticator";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Authenticator";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "AuthenticatorType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "AuthenticatorType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -48,13 +52,13 @@ public interface Authenticator extends ElementExtensibleXMLObject, WSTrustObject
      * 
      * @return the {@link CombinedHash} element.
      */
-    public CombinedHash getCombinedHash();
+    @Nullable public CombinedHash getCombinedHash();
 
     /**
      * Sets the wst:CombinedHash child element.
      * 
      * @param combinedHash the {@link CombinedHash} to set.
      */
-    public void setCombinedHash(CombinedHash combinedHash);
+    public void setCombinedHash(@Nullable final CombinedHash combinedHash);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinaryExchange.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinaryExchange.java
index 62f01665f..947dda68c 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinaryExchange.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinaryExchange.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.schema.XSString;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:BinaryExchange element.
  * 
@@ -31,51 +35,51 @@ import org.opensaml.core.xml.schema.XSString;
 public interface BinaryExchange extends XSString, AttributeExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "BinaryExchange";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "BinaryExchange";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "BinaryExchangeType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "BinaryExchangeType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** The ValueType attribute name. */
-    public static final String VALUE_TYPE_ATTRIB_NAME = "ValueType";
+    @Nonnull @NotEmpty public static final String VALUE_TYPE_ATTRIB_NAME = "ValueType";
     
     /** The EncodingType attribute name. */
-    public static final String ENCODING_TYPE_ATTRIB_NAME = "EncodingType";
+    @Nonnull @NotEmpty public static final String ENCODING_TYPE_ATTRIB_NAME = "EncodingType";
     
     /**
      * Returns the ValueType attribute URI value.
      * 
      * @return the ValueType attribute value or <code>null</code>.
      */
-    public String getValueType();
+    @Nullable public String getValueType();
 
     /**
      * Sets the ValueType attribute URI value.
      * 
      * @param newValueType the ValueType attribute value.
      */
-    public void setValueType(String newValueType);
+    public void setValueType(@Nullable final String newValueType);
     
     /**
      * Returns the EncodingType attribute value.
      * 
      * @return the EncodingType attribute value.
      */
-    public String getEncodingType();
+    @Nullable public String getEncodingType();
 
     /**
      * Sets the EncodingType attribute value.
      * 
      * @param newEncodingType the EncodingType attribute value.
      */
-    public void setEncodingType(String newEncodingType);
+    public void setEncodingType(@Nullable final String newEncodingType);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinarySecret.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinarySecret.java
index 10cc38703..a1e5ae317 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinarySecret.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/BinarySecret.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.schema.XSBase64Binary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:BinarySecret element.
  * 
@@ -32,43 +36,43 @@ import org.opensaml.core.xml.schema.XSBase64Binary;
 public interface BinarySecret extends XSBase64Binary, AttributeExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "BinarySecret";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "BinarySecret";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "BinarySecretType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "BinarySecretType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** wst:BinarySecret/@Type attribute local name. */
-    public static final String TYPE_ATTRIB_NAME = "Type";
+    @Nonnull @NotEmpty public static final String TYPE_ATTRIB_NAME = "Type";
 
     /** Type attribute AsymmetricKey URI. */
-    public static final String TYPE_ASYMMETRIC_KEY = WSTrustConstants.WST_NS + "/AsymmetricKey";
+    @Nonnull @NotEmpty public static final String TYPE_ASYMMETRIC_KEY = WSTrustConstants.WST_NS + "/AsymmetricKey";
 
     /** Type attribute SymmetricKey URI. */
-    public static final String TYPE_SYMMETRIC_KEY = WSTrustConstants.WST_NS + "/SymmetricKey";
+    @Nonnull @NotEmpty public static final String TYPE_SYMMETRIC_KEY = WSTrustConstants.WST_NS + "/SymmetricKey";
 
     /** Type attribute Nonce URI. */
-    public static final String TYPE_NONCE = WSTrustConstants.WST_NS + "/Nonce";
+    @Nonnull @NotEmpty public static final String TYPE_NONCE = WSTrustConstants.WST_NS + "/Nonce";
 
     /**
      * Returns the wst:BinarySecret/@Type attribute value.
      * 
      * @return the Type attribute value.
      */
-    public String getType();
+    @Nullable public String getType();
 
     /**
      * Sets the wst:BinarySecret/@Type attribute value.
      * 
      * @param type the Type attribute value to set.
      */
-    public void setType(String type);
+    public void setType(@Nullable final String type);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CancelTarget.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CancelTarget.java
index cdf77d690..02c60d37e 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CancelTarget.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CancelTarget.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:CancelTarget element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface CancelTarget extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "CancelTarget";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "CancelTarget";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "CancelTargetType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "CancelTargetType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface CancelTarget extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CanonicalizationAlgorithm.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CanonicalizationAlgorithm.java
index f5f370fc2..df526ea8c 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CanonicalizationAlgorithm.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CanonicalizationAlgorithm.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:CanonicalizationAlgorithm element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface CanonicalizationAlgorithm extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "CanonicalizationAlgorithm";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "CanonicalizationAlgorithm";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Challenge.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Challenge.java
index cc3481d6b..0e7d27a10 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Challenge.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Challenge.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Challenge element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSString;
 public interface Challenge extends XSString, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Challenge";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Challenge";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Claims.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Claims.java
index c2da7d1b3..cdaec81f5 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Claims.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Claims.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Claims element.
  * 
@@ -31,34 +35,34 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface Claims extends AttributeExtensibleXMLObject, ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Claims";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Claims";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ClaimsType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ClaimsType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The wst:Claims/@Dialect attribute local name. */
-    public static final String DIALECT_ATTRIB_NAME = "Dialect";
+    @Nonnull @NotEmpty public static final String DIALECT_ATTRIB_NAME = "Dialect";
     
     /**
      * Returns the wst:Claims/@Dialect attribute value.
      * 
      * @return the Dialect attribute value
      */
-    public String getDialect();
+    @Nullable public String getDialect();
 
     /**
      * Sets the wst:Claims/@Dialect attribute value.
      * 
      * @param dialect the Dialect attribute value.
      */
-    public void setDialect(String dialect);
+    public void setDialect(@Nullable final String dialect);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Code.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Code.java
index 29bdef0dd..5d3a0671f 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Code.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Code.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Code element within a wst:Status element.
  * 
@@ -31,23 +34,23 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface Code extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Code";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Code";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "StatusCodeOpenEnum"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "StatusCodeOpenEnum"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** Status/Code 'valid' URI value . */
-    public static final String VALID= WSTrustConstants.WST_NS + "/status/valid";
+    @Nonnull @NotEmpty public static final String VALID= WSTrustConstants.WST_NS + "/status/valid";
 
     /** Status/Code 'invalid' URI value. */
-    public static final String INVALID= WSTrustConstants.WST_NS + "/status/invalid";
+    @Nonnull @NotEmpty public static final String INVALID= WSTrustConstants.WST_NS + "/status/invalid";
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CombinedHash.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CombinedHash.java
index 5f9add6e6..057cf6a68 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CombinedHash.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/CombinedHash.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBase64Binary;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:CombinedHash element.
  * 
@@ -30,12 +33,12 @@ import org.opensaml.core.xml.schema.XSBase64Binary;
 public interface CombinedHash extends XSBase64Binary, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "CombinedHash";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "CombinedHash";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The fixed string "AUTH-HASH" used in computing the value of the combined hash. */
-    public static final String AUTH_HASH = "AUTH-HASH";
+    @Nonnull @NotEmpty public static final String AUTH_HASH = "AUTH-HASH";
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKey.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKey.java
index 947575d00..7fe046f0f 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKey.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKey.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:ComputedKey element.
  * 
@@ -30,22 +33,22 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface ComputedKey extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "ComputedKey";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "ComputedKey";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ComputedKeyOpenEnum"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ComputedKeyOpenEnum"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The ComputedKey PSHA1 URI. */
-    public static final String PSHA1= WSTrustConstants.WST_NS + "/CK/PSHA1";
+    @Nonnull @NotEmpty public static final String PSHA1= WSTrustConstants.WST_NS + "/CK/PSHA1";
 
     /** The ComputedKey HASH URI. */
-    public static final String HASH= WSTrustConstants.WST_NS + "/CK/HASH";
+    @Nonnull @NotEmpty public static final String HASH= WSTrustConstants.WST_NS + "/CK/HASH";
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKeyAlgorithm.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKeyAlgorithm.java
index 11154fc15..83e5331a3 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKeyAlgorithm.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ComputedKeyAlgorithm.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:ComputedKeyAlgorithm element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface ComputedKeyAlgorithm extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "ComputedKeyAlgorithm";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "ComputedKeyAlgorithm";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Delegatable.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Delegatable.java
index 44b679e0d..3bbfa8d53 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Delegatable.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Delegatable.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBoolean;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Delegatable element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSBoolean;
 public interface Delegatable extends XSBoolean, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Delegatable";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Delegatable";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/DelegateTo.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/DelegateTo.java
index 2ef3ca24b..7050f4265 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/DelegateTo.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/DelegateTo.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:DelegateTo element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface DelegateTo extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "DelegateTo";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "DelegateTo";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "DelegateToType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "DelegateToType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface DelegateTo extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptWith.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptWith.java
index 80c302af8..518d272bc 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptWith.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptWith.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:EncryptWith element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface EncryptWith extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "EncryptWith";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "EncryptWith";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Encryption.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Encryption.java
index 91c9f15bc..6a7df2020 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Encryption.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Encryption.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Encryption element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface Encryption extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Encryption";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Encryption";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "EncryptionType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "EncryptionType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface Encryption extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptionAlgorithm.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptionAlgorithm.java
index 133b6b4bb..3e96724f1 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptionAlgorithm.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/EncryptionAlgorithm.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:EncryptionAlgorithm element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface EncryptionAlgorithm extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "EncryptionAlgorithm";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "EncryptionAlgorithm";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Entropy.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Entropy.java
index 2c7d60cb0..5c56c4ae5 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Entropy.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Entropy.java
@@ -17,11 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Entropy element.
  * 
@@ -31,20 +34,20 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface Entropy extends AttributeExtensibleXMLObject, ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "Entropy";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "Entropy";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME=
+    @Nonnull public static final QName ELEMENT_NAME=
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "EntropyType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "EntropyType"; 
     
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The wst:Claims/@Dialect attribute local name. */
-    public static final String DIALECT_ATTRIB_NAME = "EntropyType";
+    @Nonnull @NotEmpty public static final String DIALECT_ATTRIB_NAME = "EntropyType";
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Forwardable.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Forwardable.java
index bbe274e4b..a996433b6 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Forwardable.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Forwardable.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBoolean;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Forwardable element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSBoolean;
 public interface Forwardable extends XSBoolean, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "Forwardable";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "Forwardable";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/IssuedTokens.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/IssuedTokens.java
index 42dbb505f..eb697843c 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/IssuedTokens.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/IssuedTokens.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:IssuedTokens element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface IssuedTokens extends RequestSecurityTokenResponseCollection {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "IssuedTokens";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "IssuedTokens";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Issuer.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Issuer.java
index 0dde0d2fe..ceb7c2acd 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Issuer.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Issuer.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.soap.wsaddressing.EndpointReferenceType;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Issuer element.
  * 
@@ -30,9 +33,9 @@ import org.opensaml.soap.wsaddressing.EndpointReferenceType;
 public interface Issuer extends EndpointReferenceType, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Issuer";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Issuer";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyExchangeToken.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyExchangeToken.java
index 69e6ed6df..c0087a2e0 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyExchangeToken.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyExchangeToken.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:KeyExchangeToken element.
  * 
@@ -30,17 +33,17 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface KeyExchangeToken extends ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "KeyExchangeToken";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "KeyExchangeToken";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "KeyExchangeTokenType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "KeyExchangeTokenType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeySize.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeySize.java
index fbc783e6b..a7a773247 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeySize.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeySize.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSInteger;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:KeySize element.
  * 
@@ -28,10 +31,10 @@ import org.opensaml.core.xml.schema.XSInteger;
 public interface KeySize extends XSInteger, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "KeySize";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "KeySize";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyType.java
index 01646bfe3..0026cd95a 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyType.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:KeyType element.
  * 
@@ -30,26 +33,26 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface KeyType extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "KeyType";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "KeyType";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "KeyTypeOpenEnum"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "KeyTypeOpenEnum"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The KeyType PublicKey URI. */
-    public static final String PUBLIC_KEY = WSTrustConstants.WST_NS + "/PublicKey";
+    @Nonnull @NotEmpty public static final String PUBLIC_KEY = WSTrustConstants.WST_NS + "/PublicKey";
 
     /** The KeyType SymmetricKey URI. */
-    public static final String SYMMETRIC_KEY = WSTrustConstants.WST_NS + "/SymmetricKey";
+    @Nonnull @NotEmpty public static final String SYMMETRIC_KEY = WSTrustConstants.WST_NS + "/SymmetricKey";
 
     /** The KeyType Bearer URI. */
-    public static final String BEARER = WSTrustConstants.WST_NS + "/Bearer";
+    @Nonnull @NotEmpty public static final String BEARER = WSTrustConstants.WST_NS + "/Bearer";
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyWrapAlgorithm.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyWrapAlgorithm.java
index ddaec98db..80fd424ed 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyWrapAlgorithm.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/KeyWrapAlgorithm.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:KeyWrapAlgorithm element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface KeyWrapAlgorithm extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "KeyWrapAlgorithm";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "KeyWrapAlgorithm";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Lifetime.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Lifetime.java
index 53fc29253..aca4bfa0a 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Lifetime.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Lifetime.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.soap.wssecurity.Created;
 import org.opensaml.soap.wssecurity.Expires;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Lifetime element.
  * 
@@ -29,17 +33,17 @@ import org.opensaml.soap.wssecurity.Expires;
 public interface Lifetime extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Lifetime";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Lifetime";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "LifetimeType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "LifetimeType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -47,27 +51,27 @@ public interface Lifetime extends WSTrustObject {
      * 
      * @return the {@link Created} child element or <code>null</code>.
      */
-    public Created getCreated();
+    @Nullable public Created getCreated();
 
     /**
      * Sets the wsu:Created child element.
      * 
      * @param created the {@link Created} child element to set.
      */
-    public void setCreated(Created created);
+    public void setCreated(@Nullable final Created created);
 
     /**
      * Returns the wsu:Expires child element.
      * 
      * @return the {@link Expires} child element or <code>null</code>.
      */
-    public Expires getExpires();
+    @Nullable public Expires getExpires();
 
     /**
      * Sets the wsu:Expires child element.
      * 
      * @param expires the {@link Expires} child element.
      */
-    public void setExpires(Expires expires);
+    public void setExpires(@Nullable final Expires expires);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/OnBehalfOf.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/OnBehalfOf.java
index 2cf66c8ee..7196af306 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/OnBehalfOf.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/OnBehalfOf.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:OnBehalfOf element.
  * 
@@ -30,17 +33,17 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface OnBehalfOf extends ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "OnBehalfOf";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "OnBehalfOf";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "OnBehalfOfType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "OnBehalfOfType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participant.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participant.java
index 9ab937d3b..cd08fe55a 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participant.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participant.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Participant element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface Participant extends ParticipantType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Participant";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Participant";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ParticipantType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ParticipantType.java
index c7a38e1c8..a9471beac 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ParticipantType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ParticipantType.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * Interface ParticipantType complex type.
  * 
@@ -28,10 +32,10 @@ import org.opensaml.core.xml.XMLObject;
 public interface ParticipantType extends WSTrustObject {
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ParticipantType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ParticipantType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -39,13 +43,13 @@ public interface ParticipantType extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participants.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participants.java
index d5254bf27..f2f9c7420 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participants.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Participants.java
@@ -19,10 +19,15 @@ package org.opensaml.soap.wstrust;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Participants element.
  * 
@@ -32,17 +37,17 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface Participants extends ElementExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Participants";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Participants";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ParticipantsType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ParticipantsType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -50,20 +55,20 @@ public interface Participants extends ElementExtensibleXMLObject, WSTrustObject
      * 
      * @return the {@link Primary} child element or <code>null</code>.
      */
-    public Primary getPrimary();
+    @Nullable public Primary getPrimary();
 
     /**
      * Sets the wst:Primary child element.
      * 
      * @param primary the {@link Primary} child element to set.
      */
-    public void setPrimary(Primary primary);
+    public void setPrimary(@Nullable final Primary primary);
 
     /**
      * Returns the list of wst:Participant child elements .
      * 
      * @return the list of {@link Participant} child elements
      */
-    public List<Participant> getParticipants();
+    @Nonnull @Live public List<Participant> getParticipants();
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Primary.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Primary.java
index 973801981..800a8e4ed 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Primary.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Primary.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Primary element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface Primary extends ParticipantType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Primary";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Primary";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ProofEncryption.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ProofEncryption.java
index 804395fe0..cc1afa284 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ProofEncryption.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ProofEncryption.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:ProofEncryption element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface ProofEncryption extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "ProofEncryption";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "ProofEncryption";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ProofEncryptionType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ProofEncryptionType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,12 +52,12 @@ public interface ProofEncryption extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Reason.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Reason.java
index 3885aa2b7..e3ed21a98 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Reason.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Reason.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSString;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The <wst:Reason> child element of a <wst:Status> element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSString;
 public interface Reason extends XSString, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Reason";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Reason";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RenewTarget.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RenewTarget.java
index e18591f93..8fed43c82 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RenewTarget.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RenewTarget.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RenewTarget element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface RenewTarget extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "RenewTarget";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "RenewTarget";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RenewTargetType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RenewTargetType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface RenewTarget extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Renewing.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Renewing.java
index 300530b69..54f635977 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Renewing.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Renewing.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSBooleanValue;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Renewing element.
  * 
@@ -30,79 +34,79 @@ import org.opensaml.core.xml.schema.XSBooleanValue;
 public interface Renewing extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Renewing";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Renewing";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RenewingType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RenewingType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The wst:Renewing/@Allow attribute local name. */
-    public static final String ALLOW_ATTRIB_NAME = "Allow";
+    @Nonnull @NotEmpty public static final String ALLOW_ATTRIB_NAME = "Allow";
 
     /** The wst:Renewing/@OK attribute local name. */
-    public static final String OK_ATTRIB_NAME = "OK";
+    @Nonnull @NotEmpty public static final String OK_ATTRIB_NAME = "OK";
 
     /**
      * Returns the wst:Renewing/@Allow attribute value.
      * 
      * @return the Allow attribute value
      */
-    public Boolean isAllow();
+    @Nullable public Boolean isAllow();
     
     /**
      * Returns the wst:Renewing/@Allow attribute value.
      * 
      * @return the Allow attribute value
      */
-    public XSBooleanValue isAllowXSBoolean();
+    @Nullable public XSBooleanValue isAllowXSBoolean();
 
     /**
      * Sets the wst:Renewing/@Allow attribute value.
      * 
      * @param allow the Allow attribute value.
      */
-    public void setAllow(Boolean allow);
+    public void setAllow(@Nullable final Boolean allow);
 
     /**
      * Sets the wst:Renewing/@Allow attribute value.
      * 
      * @param allow the Allow attribute value.
      */
-    public void setAllow(XSBooleanValue allow);
+    public void setAllow(@Nullable final XSBooleanValue allow);
 
     /**
      * Returns the wst:Renewing/@OK attribute value.
      * 
      * @return the OK attribute value
      */
-    public Boolean isOK();
+    @Nullable public Boolean isOK();
     
     /**
      * Returns the wst:Renewing/@OK attribute value.
      * 
      * @return the OK attribute value
      */
-    public XSBooleanValue isOKXSBoolean();
+    @Nullable public XSBooleanValue isOKXSBoolean();
 
     /**
      * Sets the wst:Renewing/@OK attribute value.
      * 
      * @param ok the OK attribute value.
      */
-    public void setOK(Boolean ok);
+    public void setOK(@Nullable final Boolean ok);
     
     /**
      * Sets the wst:Renewing/@OK attribute value.
      * 
      * @param ok the OK attribute value.
      */
-    public void setOK(XSBooleanValue ok);
+    public void setOK(@Nullable final XSBooleanValue ok);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestKET.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestKET.java
index 9ff38ea77..653c57f96 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestKET.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestKET.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestKET element.
  * 
@@ -28,17 +31,17 @@ import javax.xml.namespace.QName;
 public interface RequestKET extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestKET";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestKET";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestKETType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestKETType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityToken.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityToken.java
index e1271cd21..765f4a2a2 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityToken.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityToken.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestSecurityToken element. 
  * 
@@ -31,36 +35,36 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface RequestSecurityToken extends ElementExtensibleXMLObject, AttributeExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "RequestSecurityToken";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "RequestSecurityToken";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
      * The Context attribute name.
      */
-    public static final String CONTEXT_ATTRIB_NAME = "Context";
+    @Nonnull @NotEmpty public static final String CONTEXT_ATTRIB_NAME = "Context";
     
     /**
      * Returns the Context attribute value.
      * 
      * @return The Context attribute value or <code>null</code>.
      */
-    public String getContext();
+    @Nullable public String getContext();
 
     /**
      * Sets the Context attribute value.
      * 
      * @param context The Context attribute value
      */
-    public void setContext(String context);
+    public void setContext(@Nullable final String context);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenCollection.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenCollection.java
index 16c736724..8246b96bd 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenCollection.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenCollection.java
@@ -19,8 +19,12 @@ package org.opensaml.soap.wstrust;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestSecurityTokenCollection element.
  * 
@@ -30,17 +34,17 @@ import javax.xml.namespace.QName;
 public interface RequestSecurityTokenCollection extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestSecurityTokenCollection";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestSecurityTokenCollection";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenCollectionType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenCollectionType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -49,6 +53,6 @@ public interface RequestSecurityTokenCollection extends WSTrustObject {
      * 
      * @return the list of {@link RequestSecurityToken}s.
      */
-    public List<RequestSecurityToken> getRequestSecurityTokens();
+    @Nonnull @Live public List<RequestSecurityToken> getRequestSecurityTokens();
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponse.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponse.java
index 52759e063..e913aba12 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponse.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponse.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestSecurityTokenResponse element.
  * 
@@ -32,36 +36,36 @@ public interface RequestSecurityTokenResponse extends ElementExtensibleXMLObject
         WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "RequestSecurityTokenResponse";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "RequestSecurityTokenResponse";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenResponseType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenResponseType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
      * The Context attribute name.
      */
-    public static final String CONTEXT_ATTRIB_NAME = "Context";
+    @Nonnull @NotEmpty public static final String CONTEXT_ATTRIB_NAME = "Context";
     
     /**
      * Returns the Context attribute value.
      * 
      * @return The Context attribute value or <code>null</code>.
      */
-    public String getContext();
+    @Nullable public String getContext();
 
     /**
      * Sets the Context attribute value.
      * 
      * @param context The Context attribute value
      */
-    public void setContext(String context);
+    public void setContext(@Nullable final String context);
 
 }
\ No newline at end of file
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponseCollection.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponseCollection.java
index 3442a9f2a..9ad48dc37 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponseCollection.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestSecurityTokenResponseCollection.java
@@ -19,10 +19,14 @@ package org.opensaml.soap.wstrust;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.Live;
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestSecurityTokenResponseCollection element.
  * 
@@ -32,17 +36,17 @@ import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 public interface RequestSecurityTokenResponseCollection extends AttributeExtensibleXMLObject, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestSecurityTokenResponseCollection";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestSecurityTokenResponseCollection";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenResponseCollectionType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestSecurityTokenResponseCollectionType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -50,6 +54,6 @@ public interface RequestSecurityTokenResponseCollection extends AttributeExtensi
      * 
      * @return The list of {@link RequestSecurityTokenResponse}s.
      */
-    public List<RequestSecurityTokenResponse> getRequestSecurityTokenResponses();
+    @Nonnull @Live public List<RequestSecurityTokenResponse> getRequestSecurityTokenResponses();
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestType.java
index 116760bc0..6067eeb19 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestType.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestType element.
  * 
@@ -28,51 +31,51 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface RequestType extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestType";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestType";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestTypeOpenEnum"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestTypeOpenEnum"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     // Single action request types
     
     /** RequestType Issue URI. */
-    public static final String ISSUE = WSTrustConstants.WST_NS + "/Issue";
+    @Nonnull @NotEmpty public static final String ISSUE = WSTrustConstants.WST_NS + "/Issue";
 
     /** RequestType Renew URI. */
-    public static final String RENEW = WSTrustConstants.WST_NS + "/Renew";
+    @Nonnull @NotEmpty public static final String RENEW = WSTrustConstants.WST_NS + "/Renew";
 
     /** RequestType Cancel URI. */
-    public static final String CANCEL = WSTrustConstants.WST_NS + "/Cancel";
+    @Nonnull @NotEmpty public static final String CANCEL = WSTrustConstants.WST_NS + "/Cancel";
 
     /** RequestType STSCancel URI. */
-    public static final String STSCANCEL = WSTrustConstants.WST_NS + "/STSCancel";
+    @Nonnull @NotEmpty public static final String STSCANCEL = WSTrustConstants.WST_NS + "/STSCancel";
 
     /** RequestType Validate URI. */
-    public static final String VALIDATE = WSTrustConstants.WST_NS + "/Validate";
+    @Nonnull @NotEmpty public static final String VALIDATE = WSTrustConstants.WST_NS + "/Validate";
     
     /** RequestType Key Exchange Token (KET) URI. */
-    public static final String KET = WSTrustConstants.WST_NS + "/KET";
+    @Nonnull @NotEmpty public static final String KET = WSTrustConstants.WST_NS + "/KET";
     
     // Batch action request types
     
     /** RequestType BatchIssue URI. */
-    public static final String BATCH_ISSUE = WSTrustConstants.WST_NS + "/BatchIssue";
+    @Nonnull @NotEmpty public static final String BATCH_ISSUE = WSTrustConstants.WST_NS + "/BatchIssue";
 
     /** RequestType BatchRenew URI. */
-    public static final String BATCH_RENEW = WSTrustConstants.WST_NS + "/BatchRenew";
+    @Nonnull @NotEmpty public static final String BATCH_RENEW = WSTrustConstants.WST_NS + "/BatchRenew";
 
     /** RequestType BatchCancel URI. */
-    public static final String BATCH_CANCEL = WSTrustConstants.WST_NS + "/BatchCancel";
+    @Nonnull @NotEmpty public static final String BATCH_CANCEL = WSTrustConstants.WST_NS + "/BatchCancel";
 
     /** RequestType BatchValidate URI. */
-    public static final String BATCH_VALIDATE = WSTrustConstants.WST_NS + "/BatchValidate";
+    @Nonnull @NotEmpty public static final String BATCH_VALIDATE = WSTrustConstants.WST_NS + "/BatchValidate";
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedAttachedReference.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedAttachedReference.java
index 076d185f2..50af58ccc 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedAttachedReference.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedAttachedReference.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestedAttachedReference element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface RequestedAttachedReference extends RequestedReferenceType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestedAttachedReference";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestedAttachedReference";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedProofToken.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedProofToken.java
index 2f2dc2894..bc5b37b06 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedProofToken.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedProofToken.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestedProofToken element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface RequestedProofToken extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestedProofToken";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestedProofToken";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestedProofTokenType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestedProofTokenType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface RequestedProofToken extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedReferenceType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedReferenceType.java
index 9baf4beda..a6582ee38 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedReferenceType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedReferenceType.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.soap.wssecurity.SecurityTokenReference;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * Interface for RequestedReferenceType complex type.
  * 
@@ -28,10 +32,10 @@ import org.opensaml.soap.wssecurity.SecurityTokenReference;
 public interface RequestedReferenceType extends WSTrustObject {
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestedReferenceType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestedReferenceType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -40,7 +44,7 @@ public interface RequestedReferenceType extends WSTrustObject {
      * @return the {@link SecurityTokenReference} child element or
      *         <code>null</code>.
      */
-    public SecurityTokenReference getSecurityTokenReference();
+    @Nullable public SecurityTokenReference getSecurityTokenReference();
 
     /**
      * Sets the wsse:SecurityTokenReference child element.
@@ -48,6 +52,6 @@ public interface RequestedReferenceType extends WSTrustObject {
      * @param securityTokenReference
      *            The {@link SecurityTokenReference} child element to be set.
      */
-    public void setSecurityTokenReference(SecurityTokenReference securityTokenReference);
+    public void setSecurityTokenReference(@Nullable final SecurityTokenReference securityTokenReference);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedSecurityToken.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedSecurityToken.java
index 73c477fc5..c82f1f202 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedSecurityToken.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedSecurityToken.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestedSecurityToken element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface RequestedSecurityToken extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestedSecurityToken";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestedSecurityToken";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestedSecurityTokenType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestedSecurityTokenType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface RequestedSecurityToken extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedTokenCancelled.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedTokenCancelled.java
index 83e7ac37b..ac0930674 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedTokenCancelled.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedTokenCancelled.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestedTokenCancelled element.
  * 
@@ -28,17 +31,17 @@ import javax.xml.namespace.QName;
 public interface RequestedTokenCancelled extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestedTokenCancelled";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestedTokenCancelled";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "RequestedTokenCancelledType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "RequestedTokenCancelledType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedUnattachedReference.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedUnattachedReference.java
index 9b8df2bc9..b308d9ca4 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedUnattachedReference.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/RequestedUnattachedReference.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:RequestedUnattachedReference element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface RequestedUnattachedReference extends RequestedReferenceType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "RequestedUnattachedReference";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "RequestedUnattachedReference";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
\ No newline at end of file
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallenge.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallenge.java
index 5c1606fb7..ceb47e030 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallenge.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallenge.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:SignChallenge element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface SignChallenge extends SignChallengeType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "SignChallenge";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "SignChallenge";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeResponse.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeResponse.java
index 9e7c4afa7..4755be93b 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeResponse.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeResponse.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:SignChallengeResponse element.
  * 
@@ -28,10 +31,10 @@ import javax.xml.namespace.QName;
 public interface SignChallengeResponse extends SignChallengeType {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME= "SignChallengeResponse";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME= "SignChallengeResponse";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeType.java
index 66d63d295..f48b7282a 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignChallengeType.java
@@ -17,11 +17,15 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.AttributeExtensibleXMLObject;
 import org.opensaml.core.xml.ElementExtensibleXMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * SignChallengeType complex type. 
  * 
@@ -29,10 +33,10 @@ import org.opensaml.core.xml.ElementExtensibleXMLObject;
 public interface SignChallengeType extends AttributeExtensibleXMLObject, ElementExtensibleXMLObject, WSTrustObject {
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "SignChallengeType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "SignChallengeType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -40,13 +44,13 @@ public interface SignChallengeType extends AttributeExtensibleXMLObject, Element
      * 
      * @return the {@link Challenge} child element or <code>null</code>.
      */
-    public Challenge getChallenge();
+    @Nullable public Challenge getChallenge();
 
     /**
      * Sets the wst:Challenge child element.
      * 
      * @param challenge the {@link Challenge} child element to set.
      */
-    public void setChallenge(Challenge challenge);
+    public void setChallenge(@Nullable final Challenge challenge);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignWith.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignWith.java
index 02c78d410..2e7baff0b 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignWith.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignWith.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:SignWith element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface SignWith extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "SignWith";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "SignWith";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignatureAlgorithm.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignatureAlgorithm.java
index 48fd5b018..a59619ff4 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignatureAlgorithm.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/SignatureAlgorithm.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:SignatureAlgorithm element.
  * 
@@ -30,10 +33,10 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface SignatureAlgorithm extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "SignatureAlgorithm";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "SignatureAlgorithm";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Status.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Status.java
index a72aa1bde..e914c4893 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Status.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/Status.java
@@ -17,8 +17,12 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:Status element.
  * 
@@ -28,10 +32,10 @@ import javax.xml.namespace.QName;
 public interface Status extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "Status";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "Status";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /**
@@ -39,27 +43,27 @@ public interface Status extends WSTrustObject {
      * 
      * @return the {@link Code} child element or <code>null</code>
      */
-    public Code getCode();
+    @Nullable public Code getCode();
 
     /**
      * Sets the wst:Code child element.
      * 
      * @param code the {@link Code} child element to set.
      */
-    public void setCode(Code code);
+    public void setCode(@Nullable final Code code);
 
     /**
      * Returns the wst:Reason child element.
      * 
      * @return the {@link Reason} child element or <code>null</code>.
      */
-    public Reason getReason();
+    @Nullable public Reason getReason();
 
     /**
      * Sets the wst:Reason child element.
      * 
      * @param reason the {@link Reason} child element to set.
      */
-    public void setReason(Reason reason);
+    public void setReason(@Nullable final Reason reason);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/TokenType.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/TokenType.java
index efa8a0fb0..5c4678458 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/TokenType.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/TokenType.java
@@ -17,10 +17,13 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.schema.XSURI;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:TokenType element.
  * 
@@ -28,13 +31,13 @@ import org.opensaml.core.xml.schema.XSURI;
 public interface TokenType extends XSURI, WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "TokenType";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "TokenType";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** TokenType Status URI. */
-    public static final String STATUS = WSTrustConstants.WST_NS + "/RSTR/Status";
+    @Nonnull @NotEmpty public static final String STATUS = WSTrustConstants.WST_NS + "/RSTR/Status";
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/UseKey.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/UseKey.java
index 941041b96..a6453886a 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/UseKey.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/UseKey.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:UseKey element.
  * 
@@ -30,48 +34,48 @@ import org.opensaml.core.xml.XMLObject;
 public interface UseKey extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "UseKey";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "UseKey";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "UseKeyType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "UseKeyType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
 
     /** The wst:UseKey/@Sig attribute local name. */
-    public static final String SIG_ATTRIB_NAME = "Sig";
+    @Nonnull @NotEmpty public static final String SIG_ATTRIB_NAME = "Sig";
     
     /**
      * Get the unknown child element.
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
 
     /**
      * Returns the wst:UseKey/@Sig attribute value.
      * 
      * @return the Sig attribute value or <code>null</code>
      */
-    public String getSig();
+    @Nullable public String getSig();
 
     /**
      * Sets the wst:UseKey/@Sig attribute value.
      * 
      * @param sig the Sig attribute value to set.
      */
-    public void setSig(String sig);
+    public void setSig(@Nullable final String sig);
 
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ValidateTarget.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ValidateTarget.java
index 727ffe6bb..e16c4831f 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ValidateTarget.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/ValidateTarget.java
@@ -17,10 +17,14 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The wst:ValidateTarget element.
  * 
@@ -30,17 +34,17 @@ import org.opensaml.core.xml.XMLObject;
 public interface ValidateTarget extends WSTrustObject {
 
     /** Element local name. */
-    public static final String ELEMENT_LOCAL_NAME = "ValidateTarget";
+    @Nonnull @NotEmpty public static final String ELEMENT_LOCAL_NAME = "ValidateTarget";
 
     /** Default element name. */
-    public static final QName ELEMENT_NAME =
+    @Nonnull public static final QName ELEMENT_NAME =
         new QName(WSTrustConstants.WST_NS, ELEMENT_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /** Local name of the XSI type. */
-    public static final String TYPE_LOCAL_NAME = "ValidateTargetType"; 
+    @Nonnull @NotEmpty public static final String TYPE_LOCAL_NAME = "ValidateTargetType"; 
         
     /** QName of the XSI type. */
-    public static final QName TYPE_NAME = 
+    @Nonnull public static final QName TYPE_NAME = 
         new QName(WSTrustConstants.WST_NS, TYPE_LOCAL_NAME, WSTrustConstants.WST_PREFIX);
     
     /**
@@ -48,13 +52,13 @@ public interface ValidateTarget extends WSTrustObject {
      * 
      * @return the child element
      */
-    public XMLObject getUnknownXMLObject();
+    @Nullable public XMLObject getUnknownXMLObject();
     
     /**
      * Set the unknown child element.
      * 
      * @param unknownObject the new child element
      */
-    public void setUnknownXMLObject(XMLObject unknownObject);
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject);
     
 }
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustConstants.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustConstants.java
index 6d7f055a7..b89613fef 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustConstants.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustConstants.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
+import net.shibboleth.shared.annotation.constraint.NotEmpty;
+
 /**
  * The WS-Trust 1.3 constants.
  * 
@@ -32,13 +35,13 @@ public final class WSTrustConstants {
     //
     
     /** WS-Trust version. */
-    public static final String WST_VERSION= "1.3";
+    @Nonnull @NotEmpty public static final String WST_VERSION= "1.3";
 
     /** WS-Trust namespace prefix. */
-    public static final String WST_PREFIX= "wst";
+    @Nonnull @NotEmpty public static final String WST_PREFIX= "wst";
 
     /** WS-Trust 1.3 namespace. */
-    public static final String WST_NS= "http://docs.oasis-open.org/ws-sx/ws-trust/200512";
+    @Nonnull @NotEmpty public static final String WST_NS= "http://docs.oasis-open.org/ws-sx/ws-trust/200512";
 
     //
     // WS-Addressing
@@ -47,104 +50,104 @@ public final class WSTrustConstants {
     //* WS-Addressing RequestSecurityToken (RST) action URIs.
     
     /** WS-Addressing RequestSecurityToken (RST) action URI 'Issue'. */
-    public static final String WSA_ACTION_RST_ISSUE= WST_NS + "/RST" + "/Issue";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_ISSUE= WST_NS + "/RST" + "/Issue";
 
     /** WS-Addressing RequestSecurityToken (RST) action URI 'Cancel'. */
-    public static final String WSA_ACTION_RST_CANCEL= WST_NS + "/RST" + "/Cancel";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_CANCEL= WST_NS + "/RST" + "/Cancel";
 
     /** WS-Addressing RequestSecurityToken (RST) action URI 'STSCancel'. */
-    public static final String WSA_ACTION_RST_STSCANCEL= WST_NS + "/RST" + "/STSCancel";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_STSCANCEL= WST_NS + "/RST" + "/STSCancel";
 
     /** WS-Addressing RequestSecurityToken (RST) action URI 'Validate'. */
-    public static final String WSA_ACTION_RST_VALIDATE= WST_NS + "/RST" + "/Validate";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_VALIDATE= WST_NS + "/RST" + "/Validate";
 
     /** WS-Addressing RequestSecurityToken (RST) action URI 'Renew'. */
-    public static final String WSA_ACTION_RST_RENEW= WST_NS + "/RST" + "/Renew";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_RENEW= WST_NS + "/RST" + "/Renew";
     
     /** WS-Addressing RequestSecurityToken (RST) action URI 'KET'. */
-    public static final String WSA_ACTION_RST_KET= WST_NS + "/RST" + "/KET";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RST_KET= WST_NS + "/RST" + "/KET";
     
 
     // WS-Addressing RequestSecurityTokenResponse (RSTR) action URIs.
     
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'Issue'. */
-    public static final String WSA_ACTION_RSTR_ISSUE= WST_NS + "/RSTR" + "/Issue";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_ISSUE= WST_NS + "/RSTR" + "/Issue";
 
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'Cancel'. */
-    public static final String WSA_ACTION_RSTR_CANCEL= WST_NS + "/RSTR" + "/Cancel";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_CANCEL= WST_NS + "/RSTR" + "/Cancel";
     
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'CancelFinal'. */
-    public static final String WSA_ACTION_RSTR_CANCEL_FINAL= WST_NS + "/RSTR" + "/CancelFinal";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_CANCEL_FINAL= WST_NS + "/RSTR" + "/CancelFinal";
 
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'Validate'. */
-    public static final String WSA_ACTION_RSTR_VALIDATE= WST_NS + "/RSTR" + "/Validate";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_VALIDATE= WST_NS + "/RSTR" + "/Validate";
 
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'ValidateFinal'. */
-    public static final String WSA_ACTION_RSTR_VALIDATE_FINAL= WST_NS + "/RSTR" + "/ValidateFinal";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_VALIDATE_FINAL= WST_NS + "/RSTR" + "/ValidateFinal";
 
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'Renew'. */
-    public static final String WSA_ACTION_RSTR_RENEW= WST_NS + "/RSTR" + "/Renew";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_RENEW= WST_NS + "/RSTR" + "/Renew";
     
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'RenewFinal'. */
-    public static final String WSA_ACTION_RSTR_RENEW_FINAL= WST_NS + "/RSTR" + "/RenewFinal";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_RENEW_FINAL= WST_NS + "/RSTR" + "/RenewFinal";
     
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'KET'. */
-    public static final String WSA_ACTION_RSTR_KET= WST_NS + "/RSTR" + "/KET";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_KET= WST_NS + "/RSTR" + "/KET";
     
     /** WS-Addressing RequestSecurityTokenResponse (RSTR) action URI 'KETFinal'. */
-    public static final String WSA_ACTION_RSTR_KET_FINAL= WST_NS + "/RSTR" + "/KETFinal";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTR_KET_FINAL= WST_NS + "/RSTR" + "/KETFinal";
     
 
     // WS-Addressing RequestSecurityTokenResponseCollection (RSTRC) action URIs.
     
     /** WS-Addressing RequestSecurityTokenResponseCollection (RSTRC) action URI 'Issue'. */
-    public static final String WSA_ACTION_RSTRC_ISSUE_FINAL= WST_NS + "/RSTRC" + "/IssueFinal";
+    @Nonnull @NotEmpty public static final String WSA_ACTION_RSTRC_ISSUE_FINAL= WST_NS + "/RSTRC" + "/IssueFinal";
     
     
     // SOAP fault codes.
     
     /** WS-Trust SOAP fault code: "wst:InvalidRequest". */
-    public static final QName SOAP_FAULT_INVALID_REQUEST =
+    @Nonnull public static final QName SOAP_FAULT_INVALID_REQUEST =
         new QName(WST_NS, "InvalidRequest", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:FailedAuthentication". */
-    public static final QName SOAP_FAULT_FAILED_AUTHENTICATION = 
+    @Nonnull public static final QName SOAP_FAULT_FAILED_AUTHENTICATION = 
         new QName(WST_NS, "FailedAuthentication", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:RequestFailed". */
-    public static final QName SOAP_FAULT_REQUEST_FAILED = 
+    @Nonnull public static final QName SOAP_FAULT_REQUEST_FAILED = 
         new QName(WST_NS, "RequestFailed", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:InvalidSecurityToken". */
-    public static final QName SOAP_FAULT_INVALID_SECURITY_TOKEN = 
+    @Nonnull public static final QName SOAP_FAULT_INVALID_SECURITY_TOKEN = 
         new QName(WST_NS, "InvalidSecurityToken", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:AuthenticationBadElements". */
-    public static final QName SOAP_FAULT_AUTHENTICATION_BAD_ELEMENTS =
+    @Nonnull public static final QName SOAP_FAULT_AUTHENTICATION_BAD_ELEMENTS =
         new QName(WST_NS, "AuthenticationBadElements", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:BadRequest". */
-    public static final QName SOAP_FAULT_BAD_REQUEST =
+    @Nonnull public static final QName SOAP_FAULT_BAD_REQUEST =
         new QName(WST_NS, "BadRequest", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:ExpiredData". */
-    public static final QName SOAP_FAULT_EXPIRED_DATA = 
+    @Nonnull public static final QName SOAP_FAULT_EXPIRED_DATA = 
         new QName(WST_NS, "ExpiredData", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:InvalidTimeRange". */
-    public static final QName SOAP_FAULT_INVALID_TIME_RANGE =
+    @Nonnull public static final QName SOAP_FAULT_INVALID_TIME_RANGE =
         new QName(WST_NS, "InvalidTimeRange", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:InvalidScope". */
-    public static final QName SOAP_FAULT_INVALID_SCOPE =
+    @Nonnull public static final QName SOAP_FAULT_INVALID_SCOPE =
         new QName(WST_NS, "InvalidScope", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:RenewNeeded". */
-    public static final QName SOAP_FAULT_RENEW_NEEDED =
+    @Nonnull public static final QName SOAP_FAULT_RENEW_NEEDED =
         new QName(WST_NS, "RenewNeeded", WST_PREFIX);
     
     /** WS-Trust SOAP fault code: "wst:UnableToRenew". */
-    public static final QName SOAP_FAULT_UNABLE_TO_RENEW =
+    @Nonnull public static final QName SOAP_FAULT_UNABLE_TO_RENEW =
         new QName(WST_NS, "UnableToRenew", WST_PREFIX);
     
     /** Constructor. Private to prevent instantiation. */
diff --git a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustObjectBuilder.java b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustObjectBuilder.java
index 1b9fce652..9531582ed 100644
--- a/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustObjectBuilder.java
+++ b/opensaml-soap-api/src/main/java/org/opensaml/soap/wstrust/WSTrustObjectBuilder.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObjectBuilder;
 
 /**
@@ -32,5 +34,5 @@ public interface WSTrustObjectBuilder<WSTrustObjectType extends WSTrustObject>
      * 
      * @return the built object
      */
-    public WSTrustObjectType buildObject();
+    @Nonnull public WSTrustObjectType buildObject();
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
index 22349b324..4a8f86765 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11Decoder.java
@@ -20,6 +20,8 @@ package org.opensaml.soap.client.soap11.decoder.http.impl;
 import java.io.IOException;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
@@ -33,12 +35,17 @@ import org.opensaml.messaging.handler.MessageHandler;
 import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.soap.common.SOAP11FaultDecodingException;
 import org.opensaml.soap.messaging.context.SOAP11Context;
+import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.opensaml.soap.soap11.Fault;
+import org.opensaml.soap.soap11.FaultCode;
+import org.opensaml.soap.soap11.FaultString;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.shared.component.ComponentInitializationException;
+import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Basic SOAP 1.1 decoder for HTTP transport via an HttpClient's {@link ClassicHttpResponse}.
@@ -57,17 +64,17 @@ import net.shibboleth.shared.component.ComponentInitializationException;
 public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMessageDecoder {
     
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(HttpClientResponseSOAP11Decoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HttpClientResponseSOAP11Decoder.class);
     
     /** Message handler to use in processing the message body. */
-    private MessageHandler bodyHandler;
+    @NonnullAfterInit private MessageHandler bodyHandler;
     
     /**
      * Get the configured body handler MessageHandler.
      * 
      * @return Returns the bodyHandler.
      */
-    public MessageHandler getBodyHandler() {
+    @NonnullAfterInit public MessageHandler getBodyHandler() {
         return bodyHandler;
     }
 
@@ -76,14 +83,27 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
      * 
      * @param newBodyHandler The bodyHandler to set.
      */
-    public void setBodyHandler(final MessageHandler newBodyHandler) {
-        bodyHandler = newBodyHandler;
+    public void setBodyHandler(@Nonnull final MessageHandler newBodyHandler) {
+        bodyHandler = Constraint.isNotNull(newBodyHandler, "MessageHandler cannot be null");
     }
 
+    /** {@inheritDoc} */
+    @Override
+    protected void doInitialize() throws ComponentInitializationException {
+        super.doInitialize();
+        
+        if (bodyHandler == null) {
+            throw new ComponentInitializationException("Body handler MessageHandler cannot be null");
+        }
+    }    
+    
     /** {@inheritDoc} */
     protected void doDecode() throws MessageDecodingException {
         final MessageContext messageContext = new MessageContext();
         final ClassicHttpResponse response = getHttpResponse();
+        if (response == null) {
+            throw new MessageDecodingException("No HttpResponse available");
+        }
         
         log.debug("Unmarshalling SOAP message");
         try {
@@ -166,7 +186,7 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
      * @throws MessageDecodingException if message can not be unmarshalled
      * @throws IOException if there is a problem with the response entity input stream
      */
-    protected MessageDecodingException buildFaultException(final ClassicHttpResponse response) 
+    @Nonnull protected MessageDecodingException buildFaultException(final ClassicHttpResponse response) 
             throws MessageDecodingException, IOException {
         
         if (response.getEntity() == null) {
@@ -179,14 +199,11 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
             throw new MessageDecodingException("HTTP status code was 500 but SOAP response did not contain a Fault");
         }
         
-        QName code = null;
-        if (fault.getCode() != null) {
-            code = fault.getCode().getValue();
-        }
-        String msg = null;
-        if (fault.getMessage() != null) {
-            msg = fault.getMessage().getValue();
-        }
+        final FaultCode fcode = fault.getCode();
+        final QName code = fcode != null ? fcode.getValue() : null;
+        
+        final FaultString fmsg = fault.getMessage();
+        final String msg = fmsg != null ? fmsg.getValue() : null;
         log.debug("SOAP fault code '{}' with message '{}'", code != null ? code.toString() : "(not set)", msg);
         
         return new SOAP11FaultDecodingException(fault);
@@ -198,30 +215,22 @@ public class HttpClientResponseSOAP11Decoder extends BaseHttpClientResponseXMLMe
      * @param soapMessage the SOAP 1.1. Envelope being processed
      * @return the first Fault element found, or null
      */
-    protected Fault getFault(final Envelope soapMessage) {
-        if (soapMessage.getBody() != null) {
-            final List<XMLObject> faults = soapMessage.getBody().getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
+    @Nullable protected Fault getFault(final Envelope soapMessage) {
+        final Body body = soapMessage.getBody();
+        if (body != null) {
+            final List<XMLObject> faults = body.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
             if (!faults.isEmpty()) {
                 return (Fault) faults.get(0);
             }
         }
         return null;
     }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doInitialize() throws ComponentInitializationException {
-        super.doInitialize();
-        
-        if (getBodyHandler() == null) {
-            throw new ComponentInitializationException("Body handler MessageHandler cannot be null");
-        }
-    }    
     
     /** {@inheritDoc} */
     @Override
-    protected XMLObject getMessageToLog() {
-        return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
+    @Nullable protected XMLObject getMessageToLog() {
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.ensureSubcontext(SOAP11Context.class).getEnvelope() : null;
     }
     
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
index c422d48bf..2f9ee82f1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11Encoder.java
@@ -44,8 +44,9 @@ import org.opensaml.soap.soap11.Envelope;
 import org.opensaml.soap.soap11.Header;
 import org.opensaml.soap.wsaddressing.Action;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.annotation.constraint.NonnullAfterInit;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.SerializeSupport;
 
 /**
@@ -54,13 +55,13 @@ import net.shibboleth.shared.xml.SerializeSupport;
 public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMessageEncoder {
     
     /** Class logger. */
-    private final Logger log = LoggerFactory.getLogger(HttpClientRequestSOAP11Encoder.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(HttpClientRequestSOAP11Encoder.class);
     
     /** SOAP Envelope builder. */
-    private SOAPObjectBuilder<Envelope> envBuilder;
+    @Nonnull private SOAPObjectBuilder<Envelope> envBuilder;
     
     /** SOAP Body builder. */
-    private SOAPObjectBuilder<Body> bodyBuilder;
+    @Nonnull private SOAPObjectBuilder<Body> bodyBuilder;
     
     /** Constructor. */
     public HttpClientRequestSOAP11Encoder() {
@@ -75,7 +76,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * <p>This encoder implementation only operates on instances of {@link HttpPost}.</p>
      * 
      */
-    @Nullable public HttpPost getHttpRequest() {
+    @NonnullAfterInit public HttpPost getHttpRequest() {
         return (HttpPost) super.getHttpRequest();
     }
 
@@ -83,7 +84,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * 
      * <p>This encoder implementation only operates on instances of {@link HttpPost}.</p>
      */
-    public synchronized void setHttpRequest(final ClassicHttpRequest httpRequest) {
+    public synchronized void setHttpRequest(@Nullable final ClassicHttpRequest httpRequest) {
         if (!(httpRequest instanceof HttpPost)) {
             throw new IllegalArgumentException("HttpClient SOAP message encoder only operates on HttpPost");
         }
@@ -109,6 +110,9 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
     /** {@inheritDoc} */
     protected void doEncode() throws MessageEncodingException {
         final Envelope envelope = getSOAPEnvelope();
+        if (envelope == null) {
+            throw new MessageEncodingException("SOAP envelope was null");
+        }
         
         prepareHttpRequest();
 
@@ -125,7 +129,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * 
      * @throws MessageEncodingException thrown if the message could not be marshalled
      */
-    protected HttpEntity createRequestEntity(@Nonnull final Envelope message, @Nullable final Charset charset)
+    protected HttpEntity createRequestEntity(@Nonnull final Envelope message, @Nonnull final Charset charset)
             throws MessageEncodingException {
         try {
             final ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
@@ -142,7 +146,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * 
      * @param envelope the SOAP envelope
      */
-    protected void storeSOAPEnvelope(final Envelope envelope) {
+    protected void storeSOAPEnvelope(@Nullable final Envelope envelope) {
         getMessageContext().ensureSubcontext(SOAP11Context.class).setEnvelope(envelope);
     }
 
@@ -151,7 +155,7 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      * 
      * @return the previously stored SOAP envelope
      */
-    protected Envelope getSOAPEnvelope() {
+    @Nullable protected Envelope getSOAPEnvelope() {
         return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
     }
 
@@ -218,6 +222,9 @@ public class HttpClientRequestSOAP11Encoder extends BaseHttpClientRequestXMLMess
      */
     protected String getSOAPAction() {
         final Envelope env = getSOAPEnvelope();
+        if (env == null) {
+            return null;
+        }
         final Header header = env.getHeader();
         if (header == null) {
             return null;
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/config/impl/XMLObjectProviderInitializer.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/config/impl/XMLObjectProviderInitializer.java
index b6d7401f4..e0346551f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/config/impl/XMLObjectProviderInitializer.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/config/impl/XMLObjectProviderInitializer.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.config.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.config.AbstractXMLObjectProviderInitializer;
 
 /**
@@ -25,7 +27,7 @@ import org.opensaml.core.xml.config.AbstractXMLObjectProviderInitializer;
 public class XMLObjectProviderInitializer extends AbstractXMLObjectProviderInitializer {
     
     /** Config resources. */
-    private static String[] configs = {
+    @Nonnull private static String[] configs = {
         "/soap11-config.xml", 
         "/wsaddressing-config.xml",
         "/wsfed11-protocol-config.xml",
@@ -35,7 +37,7 @@ public class XMLObjectProviderInitializer extends AbstractXMLObjectProviderIniti
         };
 
     /** {@inheritDoc} */
-    protected String[] getConfigResources() {
+    @Nonnull protected String[] getConfigResources() {
         return configs;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/EnvelopeBodyHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/EnvelopeBodyHandler.java
index 89308ec41..22f0f6579 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/EnvelopeBodyHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/EnvelopeBodyHandler.java
@@ -33,7 +33,7 @@ public class EnvelopeBodyHandler extends AbstractMessageHandler {
 
     /** {@inheritDoc} */
     protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
-        final Envelope env = messageContext.getSubcontext(SOAP11Context.class).getEnvelope();
+        final Envelope env = messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
         if (env == null) {
             throw new MessageHandlerException("MessageContext did not contain a SOAP Envelope");
         }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
index 469042be6..890ddda44 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11Decoder.java
@@ -18,9 +18,12 @@
 package org.opensaml.soap.soap11.decoder.http.impl;
 
 import java.io.IOException;
-import java.util.Collections;
+import java.io.InputStream;
 import java.util.Set;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.decoder.MessageDecodingException;
@@ -34,6 +37,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.net.MediaType;
 
+import net.shibboleth.shared.collection.CollectionSupport;
 import net.shibboleth.shared.component.ComponentInitializationException;
 import net.shibboleth.shared.servlet.HttpServletSupport;
 
@@ -56,7 +60,8 @@ import jakarta.servlet.http.HttpServletRequest;
 public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
 
     /** Valid Content-Type media types. */
-    private static final Set<MediaType> SUPPORTED_MEDIA_TYPES = Collections.singleton(MediaType.create("text", "xml"));
+    @Nonnull private static final Set<MediaType> SUPPORTED_MEDIA_TYPES =
+            CollectionSupport.singleton(MediaType.create("text", "xml"));
     
     /** Class logger. */
     private final Logger log = LoggerFactory.getLogger(HTTPSOAP11Decoder.class);
@@ -87,6 +92,9 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
     protected void doDecode() throws MessageDecodingException {
         final MessageContext messageContext = new MessageContext();
         final HttpServletRequest request = getHttpServletRequest();
+        if (request == null) {
+            throw new MessageDecodingException("HttpServletRequest was null");
+        }
 
         if (!"POST".equalsIgnoreCase(request.getMethod())) {
             throw new MessageDecodingException("This message decoder only supports the HTTP POST method");
@@ -94,8 +102,9 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
 
         log.debug("Unmarshalling SOAP message");
         final Envelope soapMessage;
-        try {
-            soapMessage = (Envelope) unmarshallMessage(request.getInputStream());
+        try (final InputStream in = request.getInputStream()) {
+            assert in != null;
+            soapMessage = (Envelope) unmarshallMessage(in);
             messageContext.ensureSubcontext(SOAP11Context.class).setEnvelope(soapMessage);
         } catch (final IOException e) {
             log.error("Unable to obtain input stream from HttpServletRequest: {}", e.getMessage());
@@ -115,7 +124,6 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
         }
         
         setMessageContext(messageContext);
-        
     }
     
     /** {@inheritDoc} */
@@ -130,13 +138,14 @@ public class HTTPSOAP11Decoder extends BaseHttpServletRequestXMLMessageDecoder {
     
     /** {@inheritDoc} */
     @Override
-    protected XMLObject getMessageToLog() {
-        return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
+    @Nullable protected XMLObject getMessageToLog() {
+        final MessageContext mc = getMessageContext();
+        return mc != null ? mc.ensureSubcontext(SOAP11Context.class).getEnvelope() : null;
     }
 
     /** {@inheritDoc} */
     @Override
-    protected void validateHttpRequest(final HttpServletRequest request) throws MessageDecodingException {
+    protected void validateHttpRequest(@Nonnull final HttpServletRequest request) throws MessageDecodingException {
         super.validateHttpRequest(request);
         
         if (!HttpServletSupport.validateContentType(request, SUPPORTED_MEDIA_TYPES, false, false)) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/SimplePayloadBodyHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/SimplePayloadBodyHandler.java
index 26bdd43a0..6c28ae731 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/SimplePayloadBodyHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/decoder/http/impl/SimplePayloadBodyHandler.java
@@ -26,9 +26,11 @@ import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.messaging.handler.AbstractMessageHandler;
 import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.soap.messaging.context.SOAP11Context;
+import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * A body handler for use with {@link HTTPSOAP11Decoder} that populates the 
@@ -41,16 +43,23 @@ public class SimplePayloadBodyHandler extends AbstractMessageHandler {
     @Nonnull private Logger log = LoggerFactory.getLogger(SimplePayloadBodyHandler.class);
 
     /** {@inheritDoc} */
-    protected void doInvoke(final MessageContext messageContext) throws MessageHandlerException {
-        final Envelope env = (Envelope) messageContext.getSubcontext(SOAP11Context.class).getEnvelope();
-        final List<XMLObject> bodyChildren = env.getBody().getUnknownXMLObjects();
+    protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
+        final Envelope env = (Envelope) messageContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
+        if (env == null) {
+            throw new MessageHandlerException("SOAP envelope was null");
+        }
+        
+        final Body body = env.getBody();
+        
+        final List<XMLObject> bodyChildren = body != null ? body.getUnknownXMLObjects() : null;
         if (bodyChildren == null || bodyChildren.isEmpty()) {
             throw new MessageHandlerException("SOAP Envelope Body contained no children");
         } else if (bodyChildren.size() > 1) {
             log.warn("SOAP Envelope Body contained more than one child, returning the first as the message");
         }
             
-        messageContext.setMessage(env.getBody().getUnknownXMLObjects().get(0));
+        assert body != null;
+        messageContext.setMessage(body.getUnknownXMLObjects().get(0));
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
index daee560ec..fe3a02aca 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11Encoder.java
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.util.List;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.XMLObjectBuilderFactory;
@@ -34,6 +35,7 @@ import org.opensaml.soap.messaging.context.SOAP11Context;
 import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.opensaml.soap.soap11.Fault;
+import org.opensaml.soap.soap11.FaultCode;
 import org.opensaml.soap.soap11.Header;
 import org.opensaml.soap.wsaddressing.Action;
 import org.slf4j.Logger;
@@ -71,10 +73,12 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
         final MessageContext messageContext = getMessageContext();
         Object payload = null;
         
+        assert messageContext != null;
         final Fault fault = SOAPMessagingSupport.getSOAP11Fault(messageContext);
         if (fault != null) {
+            final FaultCode fcode = fault.getCode();
             log.debug("Saw SOAP 1.1 Fault payload with fault code, replacing any existing context message: {}", 
-                    fault.getCode() != null ? fault.getCode().getValue() : null);
+                    fcode != null ? fcode.getValue() : null);
             payload = fault;
             messageContext.setMessage(null);
         } else {
@@ -95,12 +99,16 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
     /** {@inheritDoc} */
     protected void doEncode() throws MessageEncodingException {
         final Envelope envelope = getSOAPEnvelope();
+        if (envelope == null) {
+            throw new MessageEncodingException("SOAP envelope was null");
+        }
+        
         final Element envelopeElem = marshallMessage(envelope);
         
-        prepareHttpServletResponse();
+        final HttpServletResponse response = prepareHttpServletResponse();
 
         try {
-            SerializeSupport.writeNode(envelopeElem, getHttpServletResponse().getOutputStream());
+            SerializeSupport.writeNode(envelopeElem, response.getOutputStream());
         } catch (final IOException e) {
             throw new MessageEncodingException("Problem writing SOAP envelope to servlet output stream", e);
         }
@@ -111,7 +119,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * 
      * @param envelope the SOAP envelope
      */
-    protected void storeSOAPEnvelope(final Envelope envelope) {
+    protected void storeSOAPEnvelope(@Nullable final Envelope envelope) {
         getMessageContext().ensureSubcontext(SOAP11Context.class).setEnvelope(envelope);
     }
 
@@ -120,7 +128,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * 
      * @return the previously stored SOAP envelope
      */
-    protected Envelope getSOAPEnvelope() {
+    @Nullable protected Envelope getSOAPEnvelope() {
         return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
     }
 
@@ -168,10 +176,17 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      * the method {@link #getSOAPAction()}.
      * </p>
      * 
+     * @return the prepared response
+     * 
      * @throws MessageEncodingException thrown if there is a problem preprocessing the transport
      */
-    protected void prepareHttpServletResponse() throws MessageEncodingException {
+    @Nonnull protected HttpServletResponse prepareHttpServletResponse() throws MessageEncodingException {
+        
         final HttpServletResponse response = getHttpServletResponse();
+        if (response == null) {
+            throw new MessageEncodingException("HttpServletResponse was null");
+        }
+        
         HttpServletSupport.addNoCacheHeaders(response);
         HttpServletSupport.setUTF8Encoding(response);
         HttpServletSupport.setContentType(response, "text/xml");
@@ -184,6 +199,8 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
         }
         
         response.setStatus(getHTTPResponseStatusCode());
+        
+        return response;
     }
 
     /**
@@ -198,7 +215,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
      */
     protected String getSOAPAction() {
         final Envelope env = getSOAPEnvelope();
-        final Header header = env.getHeader();
+        final Header header = env != null ? env.getHeader() : null;
         if (header == null) {
             return null;
         }
@@ -222,10 +239,10 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
         }
         
         final Envelope envelope = getSOAPEnvelope();
-        if (envelope != null && envelope.getBody() != null) {
+        if (envelope != null) {
             final Body body = envelope.getBody();
-            final List<XMLObject> faults = body.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
-            if (!faults.isEmpty()) {
+            final List<XMLObject> faults = body != null ? body.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME) : null;
+            if (faults != null && !faults.isEmpty()) {
                 return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
             }
         }
@@ -234,7 +251,7 @@ public class HTTPSOAP11Encoder extends BaseHttpServletResponseXMLMessageEncoder
     }
     
     /** {@inheritDoc} */
-    protected XMLObject getMessageToLog() {
+    @Nullable protected XMLObject getMessageToLog() {
         return getMessageContext().ensureSubcontext(SOAP11Context.class).getEnvelope();
     }
     
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyBuilder.java
index 5ac840356..227eee631 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.Body;
@@ -32,12 +35,13 @@ public class BodyBuilder extends AbstractXMLObjectBuilder<Body> implements SOAPO
      * 
      * @return the build Envelope object
      */
-    public Body buildObject(){
+    @Nonnull public Body buildObject(){
         return buildObject(SOAPConstants.SOAP11_NS, Body.DEFAULT_ELEMENT_LOCAL_NAME, SOAPConstants.SOAP11_PREFIX);
     }
     
     /** {@inheritDoc} */
-    public Body buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Body buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new BodyImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyImpl.java
index 775d231b1..efea7205c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.common.AbstractExtensibleSOAPObject;
 import org.opensaml.soap.soap11.Body;
 
@@ -32,7 +35,8 @@ public class BodyImpl extends AbstractExtensibleSOAPObject implements Body {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected BodyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected BodyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyMarshaller.java
index d1cfacb05..b7e004cdc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -30,14 +32,15 @@ import org.w3c.dom.Element;
 public class BodyMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Body body = (Body) xmlObject;
 
         XMLObjectSupport.marshallAttributeMap(body.getUnknownAttributes(), domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         // nothing to do, not element content
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyUnmarshaller.java
index 1be6b8e60..29c81b03b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/BodyUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -33,14 +34,15 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class BodyUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Body body = (Body) parentXMLObject;
         body.getUnknownXMLObjects().add(childXMLObject);
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Body body = (Body) xmlObject;
         final QName attribQName = QNameSupport.constructQName(attribute.getNamespaceURI(), attribute.getLocalName(),
                 attribute.getPrefix());
@@ -51,7 +53,7 @@ public class BodyUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         // do nothing, no child content
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailBuilder.java
index 83f348e97..630e52298 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.Detail;
@@ -31,12 +34,13 @@ public class DetailBuilder extends AbstractXMLObjectBuilder<Detail> implements S
      * 
      * @return the build Envelope object
      */
-    public Detail buildObject(){
+    @Nonnull public Detail buildObject(){
         return buildObject(null, Detail.DEFAULT_ELEMENT_LOCAL_NAME, null);
     }
     
     /** {@inheritDoc} */
-    public Detail buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Detail buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new DetailImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailImpl.java
index f3a7b0ea7..ef419f734 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.common.AbstractExtensibleSOAPObject;
 import org.opensaml.soap.soap11.Detail;
 
@@ -32,7 +35,8 @@ public class DetailImpl extends AbstractExtensibleSOAPObject implements Detail {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected DetailImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected DetailImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailMarshaller.java
index 1b5c374bf..124952cbb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -30,14 +32,15 @@ import org.w3c.dom.Element;
 public class DetailMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Detail detail = (Detail) xmlObject;
 
         XMLObjectSupport.marshallAttributeMap(detail.getUnknownAttributes(), domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         // nothing to do, not element content
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailUnmarshaller.java
index 2acdde645..9f7c5f584 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/DetailUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -33,14 +34,15 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class DetailUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Detail detail = (Detail) parentXMLObject;
         detail.getUnknownXMLObjects().add(childXMLObject);
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Detail detail = (Detail) xmlObject;
         final QName attribQName = QNameSupport.constructQName(attribute.getNamespaceURI(), attribute.getLocalName(),
                 attribute.getPrefix());
@@ -51,7 +53,8 @@ public class DetailUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         // do nothing, no child content
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeBuilder.java
index 8c0a2e709..afaeddf41 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.Envelope;
@@ -32,12 +35,13 @@ public class EnvelopeBuilder extends AbstractXMLObjectBuilder<Envelope> implemen
      * 
      * @return the build Envelope object
      */
-    public Envelope buildObject(){
+    @Nonnull public Envelope buildObject(){
         return buildObject(SOAPConstants.SOAP11_NS, Envelope.DEFAULT_ELEMENT_LOCAL_NAME, SOAPConstants.SOAP11_PREFIX);
     }
     
     /** {@inheritDoc} */
-    public Envelope buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Envelope buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EnvelopeImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeImpl.java
index a2f8c02c2..277fc6a7d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeImpl.java
@@ -18,25 +18,29 @@
 package org.opensaml.soap.soap11.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.common.AbstractExtensibleSOAPObject;
 import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.opensaml.soap.soap11.Header;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implementation of {@link org.opensaml.soap.soap11.Envelope}.
  */
 public class EnvelopeImpl extends AbstractExtensibleSOAPObject implements Envelope {
 
     /** SOAP header. */
-    private Header header;
+    @Nullable private Header header;
 
     /** SOAP body. */
-    private Body body;
+    @Nullable private Body body;
 
     /**
      * Constructor.
@@ -45,38 +49,49 @@ public class EnvelopeImpl extends AbstractExtensibleSOAPObject implements Envelo
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected EnvelopeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected EnvelopeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public Header getHeader() {
+    @Nullable public Header getHeader() {
         return header;
     }
 
     /** {@inheritDoc} */
-    public void setHeader(final Header newHeader) {
+    public void setHeader(@Nullable final Header newHeader) {
         header = prepareForAssignment(header, newHeader);
     }
 
     /** {@inheritDoc} */
-    public Body getBody() {
+    @Nullable public Body getBody() {
         return body;
     }
 
     /** {@inheritDoc} */
-    public void setBody(final Body newBody) {
+    public void setBody(@Nullable final Body newBody) {
         body = prepareForAssignment(body, newBody);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
 
-        children.add(header);
-        children.add(body);
-        children.addAll(super.getOrderedChildren());
+        if (header != null) {
+            children.add(header);
+        }
+        
+        if (body != null) {
+            children.add(body);
+        }
+        
+        final List<XMLObject> superKids = super.getOrderedChildren();
+        if (superKids != null) {
+            children.addAll(superKids);
+        }
 
-        return Collections.unmodifiableList(children);
+        return children.isEmpty() ? null : CollectionSupport.copyToList(children);
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeMarshaller.java
index 10ada8ccc..3e0f8cbc1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeMarshaller.java
@@ -21,6 +21,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -34,14 +36,15 @@ import org.w3c.dom.Element;
 public class EnvelopeMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Envelope envelope = (Envelope) xmlObject;
 
         XMLObjectSupport.marshallAttributeMap(envelope.getUnknownAttributes(), domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         // nothing to do, not element content
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeUnmarshaller.java
index 0aa35fdc5..35337eebc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/EnvelopeUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,8 +36,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class EnvelopeUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Envelope envelope = (Envelope) parentXMLObject;
 
         if (childXMLObject instanceof Header) {
@@ -49,7 +50,8 @@ public class EnvelopeUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Envelope envelope = (Envelope) xmlObject;
         final QName attribQName = QNameSupport.constructQName(attribute.getNamespaceURI(), attribute.getLocalName(),
                 attribute.getPrefix());
@@ -60,7 +62,7 @@ public class EnvelopeUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         // do nothing, no child content
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorBuilder.java
index 517ea0227..c693a7713 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.FaultActor;
@@ -27,12 +30,14 @@ import org.opensaml.soap.soap11.FaultActor;
 public class FaultActorBuilder extends AbstractXMLObjectBuilder<FaultActor> implements SOAPObjectBuilder<FaultActor> {
 
     /** {@inheritDoc} */
-    public FaultActor buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
-        return new FaultActorImpl(namespaceURI, localName, namespacePrefix);
+    @Nonnull public FaultActor buildObject() {
+        return buildObject(null, FaultActor.DEFAULT_ELEMENT_LOCAL_NAME, null);
     }
 
     /** {@inheritDoc} */
-    public FaultActor buildObject() {
-        return buildObject(null, FaultActor.DEFAULT_ELEMENT_LOCAL_NAME, null);
+    @Nonnull public FaultActor buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
+        return new FaultActorImpl(namespaceURI, localName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorImpl.java
index 172ceaefe..03139b1ca 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultActorImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.soap11.FaultActor;
 
@@ -32,7 +35,8 @@ public class FaultActorImpl extends XSURIImpl implements FaultActor {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected FaultActorImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected FaultActorImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultBuilder.java
index 92fec454e..b17267128 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.Fault;
@@ -32,12 +35,13 @@ public class FaultBuilder extends AbstractXMLObjectBuilder<Fault> implements SOA
      * 
      * @return the build Envelope object
      */
-    public Fault buildObject() {
+    @Nonnull public Fault buildObject() {
         return buildObject(SOAPConstants.SOAP11_NS, Fault.DEFAULT_ELEMENT_LOCAL_NAME, SOAPConstants.SOAP11_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public Fault buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Fault buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new FaultImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeBuilder.java
index fa9eef80c..92ba9ca48 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.FaultCode;
@@ -27,12 +30,14 @@ import org.opensaml.soap.soap11.FaultCode;
 public class FaultCodeBuilder extends AbstractXMLObjectBuilder<FaultCode> implements SOAPObjectBuilder<FaultCode> {
 
     /** {@inheritDoc} */
-    public FaultCode buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
-        return new FaultCodeImpl(namespaceURI, localName, namespacePrefix);
+    @Nonnull public FaultCode buildObject() {
+        return buildObject(null, FaultCode.DEFAULT_ELEMENT_LOCAL_NAME, null);
     }
 
     /** {@inheritDoc} */
-    public FaultCode buildObject() {
-        return buildObject(null, FaultCode.DEFAULT_ELEMENT_LOCAL_NAME, null);
+    @Nonnull public FaultCode buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
+        return new FaultCodeImpl(namespaceURI, localName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeImpl.java
index 2b9780c2d..422190aea 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultCodeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSQNameImpl;
 import org.opensaml.soap.soap11.FaultCode;
 
@@ -32,7 +35,8 @@ public class FaultCodeImpl extends XSQNameImpl implements FaultCode {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected FaultCodeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected FaultCodeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultImpl.java
index 8aa5699c1..d03671d19 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultImpl.java
@@ -18,9 +18,11 @@
 package org.opensaml.soap.soap11.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.soap11.Detail;
@@ -29,22 +31,24 @@ import org.opensaml.soap.soap11.FaultActor;
 import org.opensaml.soap.soap11.FaultCode;
 import org.opensaml.soap.soap11.FaultString;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implemenation of {@link org.opensaml.soap.soap11.Fault}.
  */
 public class FaultImpl extends AbstractXMLObject implements Fault {
 
     /** Fault code. */
-    private FaultCode faultCode;
+    @Nullable private FaultCode faultCode;
 
     /** Fault message. */
-    private FaultString message;
+    @Nullable private FaultString message;
 
     /** Actor that faulted. */
-    private FaultActor actor;
+    @Nullable private FaultActor actor;
 
     /** Details of the fault. */
-    private Detail detail;
+    @Nullable private Detail detail;
 
     /**
      * Constructor.
@@ -53,59 +57,75 @@ public class FaultImpl extends AbstractXMLObject implements Fault {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected FaultImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected FaultImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public FaultCode getCode() {
+    @Nullable public FaultCode getCode() {
         return faultCode;
     }
 
     /** {@inheritDoc} */
-    public void setCode(final FaultCode newFaultCode) {
+    public void setCode(@Nullable final FaultCode newFaultCode) {
         faultCode = prepareForAssignment(faultCode, newFaultCode);
     }
 
     /** {@inheritDoc} */
-    public FaultString getMessage() {
+    @Nullable public FaultString getMessage() {
         return message;
     }
 
     /** {@inheritDoc} */
-    public void setMessage(final FaultString newMessage) {
+    public void setMessage(@Nullable final FaultString newMessage) {
         message = prepareForAssignment(message, newMessage);
     }
 
     /** {@inheritDoc} */
-    public FaultActor getActor() {
+    @Nullable public FaultActor getActor() {
         return actor;
     }
 
     /** {@inheritDoc} */
-    public void setActor(final FaultActor newActor) {
+    public void setActor(@Nullable final FaultActor newActor) {
         actor = prepareForAssignment(actor, newActor);
     }
 
     /** {@inheritDoc} */
-    public Detail getDetail() {
+    @Nullable public Detail getDetail() {
         return detail;
     }
 
     /** {@inheritDoc} */
-    public void setDetail(final Detail newDetail) {
+    public void setDetail(@Nullable final Detail newDetail) {
         detail = prepareForAssignment(detail, newDetail);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
 
-        children.add(faultCode);
-        children.add(message);
-        children.add(actor);
-        children.add(detail);
-
-        return Collections.unmodifiableList(children);
+        if (faultCode != null) {
+            children.add(faultCode);
+        }
+        
+        if (message != null) {
+            children.add(message);
+        }
+        
+        if (actor != null) {
+            children.add(actor);
+        }
+        
+        if (detail != null) {
+            children.add(detail);
+        }
+
+        if (children.isEmpty()) {
+            return null;
+        }
+        
+        return CollectionSupport.copyToList(children);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultMarshaller.java
index a3f40686c..09411a36d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -28,12 +30,13 @@ import org.w3c.dom.Element;
 public class FaultMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         // nothing to do, no attributes
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         // nothing to do, no content
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringBuilder.java
index 8320c246e..349c3b93c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.FaultString;
@@ -28,12 +31,14 @@ public class FaultStringBuilder extends AbstractXMLObjectBuilder<FaultString>
     implements SOAPObjectBuilder<FaultString> {
 
     /** {@inheritDoc} */
-    public FaultString buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
-        return new FaultStringImpl(namespaceURI, localName, namespacePrefix);
+    @Nonnull public FaultString buildObject() {
+        return buildObject(null, FaultString.DEFAULT_ELEMENT_LOCAL_NAME, null);
     }
 
     /** {@inheritDoc} */
-    public FaultString buildObject() {
-        return buildObject(null, FaultString.DEFAULT_ELEMENT_LOCAL_NAME, null);
+    @Nonnull public FaultString buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
+        return new FaultStringImpl(namespaceURI, localName, namespacePrefix);
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringImpl.java
index 3ef0f361b..5e2854255 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultStringImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.soap.soap11.FaultString;
 
@@ -32,7 +35,8 @@ public class FaultStringImpl extends XSStringImpl implements FaultString {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected FaultStringImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected FaultStringImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultUnmarshaller.java
index 8653e2516..b0ecef3d0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/FaultUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
@@ -36,8 +38,8 @@ import org.w3c.dom.Attr;
 public class FaultUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Fault fault = (Fault) parentXMLObject;
         
         if(childXMLObject instanceof XSQName){
@@ -52,12 +54,14 @@ public class FaultUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         // nothing to do, no attributes
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         //nothing to do, no element conent
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderBuilder.java
index a804c5d3a..63476085b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.common.SOAPObjectBuilder;
 import org.opensaml.soap.soap11.Header;
@@ -32,12 +35,13 @@ public class HeaderBuilder extends AbstractXMLObjectBuilder<Header> implements S
      * 
      * @return the build Envelope object
      */
-    public Header buildObject() {
+    @Nonnull public Header buildObject() {
         return buildObject(SOAPConstants.SOAP11_NS, Header.DEFAULT_ELEMENT_LOCAL_NAME, SOAPConstants.SOAP11_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public Header buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Header buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new HeaderImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderImpl.java
index bfd1d3a3b..c08ad92e9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.common.AbstractExtensibleSOAPObject;
 import org.opensaml.soap.soap11.Header;
 
@@ -32,7 +35,8 @@ public class HeaderImpl extends AbstractExtensibleSOAPObject implements Header {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected HeaderImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected HeaderImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderMarshaller.java
index 976aa5214..725fc863f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -30,14 +32,15 @@ import org.w3c.dom.Element;
 public class HeaderMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Header header = (Header) xmlObject;
 
         XMLObjectSupport.marshallAttributeMap(header.getUnknownAttributes(), domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         // nothing to do, not element content
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderUnmarshaller.java
index b312de4f5..fba50518e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/impl/HeaderUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.soap11.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -33,14 +34,15 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class HeaderUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Header header = (Header) parentXMLObject;
         header.getUnknownXMLObjects().add(childXMLObject);
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Header header = (Header) xmlObject;
         final QName attribQName = QNameSupport.constructQName(attribute.getNamespaceURI(), attribute.getLocalName(),
                 attribute.getPrefix());
@@ -51,7 +53,7 @@ public class HeaderUnmarshaller extends AbstractXMLObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         // do nothing, no child content
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFault.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFault.java
index 504bcfee3..191f4fc38 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFault.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFault.java
@@ -38,13 +38,12 @@ import org.opensaml.soap.soap11.Fault;
 import org.opensaml.soap.soap11.FaultCode;
 import org.opensaml.soap.soap11.FaultString;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Predicates;
 
 import net.shibboleth.shared.annotation.constraint.NonnullElements;
 import net.shibboleth.shared.annotation.constraint.NotEmpty;
 import net.shibboleth.shared.logic.Constraint;
+import net.shibboleth.shared.logic.PredicateSupport;
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -95,7 +94,7 @@ public class AddSOAPFault extends AbstractProfileAction {
     
     /** Constructor. */
     public AddSOAPFault() {
-        detailedErrorsCondition = Predicates.alwaysFalse();
+        detailedErrorsCondition = PredicateSupport.alwaysFalse();
         defaultFaultCode = FaultCode.SERVER;
         detailedErrors = false;
         contextFaultStrategy = new MessageContextFaultStrategy();
@@ -186,17 +185,23 @@ public class AddSOAPFault extends AbstractProfileAction {
     protected boolean doPreExecute(@Nonnull final ProfileRequestContext profileRequestContext) {
         checkComponentActive();
 
+        if (!super.doPreExecute(profileRequestContext) ) {
+            return false;
+        }
+        
         detailedErrors = detailedErrorsCondition.test(profileRequestContext);
         
         log.debug("{} Detailed errors are {}", getLogPrefix(), detailedErrors ? "enabled" : "disabled");
 
-        if (profileRequestContext.getOutboundMessageContext() != null && nullifyOutboundMessage) {
-            profileRequestContext.getOutboundMessageContext().setMessage(null);
+        final MessageContext mc = profileRequestContext.getOutboundMessageContext();
+        
+        if (mc != null && nullifyOutboundMessage) {
+            mc.setMessage(null);
         } else {
             profileRequestContext.setOutboundMessageContext(new MessageContext());
         }
         
-        return super.doPreExecute(profileRequestContext);
+        return true;
     }
     
     /** {@inheritDoc} */
@@ -208,7 +213,7 @@ public class AddSOAPFault extends AbstractProfileAction {
             fault = buildNewMappedFault(profileRequestContext);
         }
         
-        SOAPMessagingSupport.registerSOAP11Fault(profileRequestContext.getOutboundMessageContext(), fault);
+        SOAPMessagingSupport.registerSOAP11Fault(profileRequestContext.ensureOutboundMessageContext(), fault);
     }
 
     /**
@@ -223,6 +228,7 @@ public class AddSOAPFault extends AbstractProfileAction {
             return null;
         }
         
+        assert contextFaultStrategy != null;
         final Fault fault = contextFaultStrategy.apply(profileRequestContext);
         
         if (fault != null) {
@@ -285,8 +291,8 @@ public class AddSOAPFault extends AbstractProfileAction {
         // faultstring processing.
         if (!detailedErrors || faultStringLookupStrategy == null) {
             if (faultString != null) {
-                log.debug("{} Setting faultstring to defaulted value", getLogPrefix());
                 buildFaultString(fault, faultString);
+                log.debug("{} Setting faultstring to defaulted value", getLogPrefix());
             }
         } else if (faultStringLookupStrategy != null) {
             final String message = faultStringLookupStrategy.apply(profileRequestContext);
@@ -295,9 +301,9 @@ public class AddSOAPFault extends AbstractProfileAction {
                         getLogPrefix());
                 buildFaultString(fault, message);
             } else if (faultString != null) {
+                buildFaultString(fault, faultString);
                 log.debug("{} Current state of request was not mappable, setting faultstring to defaulted value",
                         getLogPrefix());
-                buildFaultString(fault, faultString);
             }
         }
         
@@ -359,11 +365,11 @@ public class AddSOAPFault extends AbstractProfileAction {
         }
         
         /** {@inheritDoc} */
-        @Override
         @Nullable public QName 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 null;
         }
@@ -380,24 +386,26 @@ public class AddSOAPFault extends AbstractProfileAction {
     public static class MessageContextFaultStrategy implements Function<ProfileRequestContext, Fault> {
         
         /** Logger. */
-        private Logger log = LoggerFactory.getLogger(MessageContextFaultStrategy.class);
+        @Nonnull private Logger log = LoggerFactory.getLogger(MessageContextFaultStrategy.class);
 
         /** {@inheritDoc} */
-        @Nullable
-        public Fault apply(@Nullable final ProfileRequestContext input) {
+        @Nullable public Fault apply(@Nullable final ProfileRequestContext input) {
             if (input == null) {
                 return null;
             }
             Fault fault = null;
-            if (input.getOutboundMessageContext() != null) {
-                fault = SOAPMessagingSupport.getSOAP11Fault(input.getOutboundMessageContext());
+            final MessageContext outbound = input.getOutboundMessageContext();
+            if (outbound != null) {
+                fault = SOAPMessagingSupport.getSOAP11Fault(outbound);
                 if (fault != null) {
                     log.debug("Found registered SOAP fault in outbound message context");
                     return fault;
                 }
             }
-            if (input.getInboundMessageContext() != null) {
-                fault = SOAPMessagingSupport.getSOAP11Fault(input.getInboundMessageContext());
+            
+            final MessageContext inbound = input.getInboundMessageContext();
+            if (inbound != null) {
+                fault = SOAPMessagingSupport.getSOAP11Fault(inbound);
                 if (fault != null) {
                     log.debug("Found registered SOAP fault in inbound message context");
                     return fault;
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObject.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObject.java
index 6ee20f8db..ab8146132 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObject.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObject.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wsaddressing.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wsaddressing.WSAddressingObject;
@@ -36,13 +39,13 @@ public abstract class AbstractWSAddressingObject extends AbstractXMLObject imple
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AbstractWSAddressingObject(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AbstractWSAddressingObject(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectBuilder.java
index 72f1d6c05..dbc0bc0e9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectBuilder.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsaddressing.WSAddressingObject;
 import org.opensaml.soap.wsaddressing.WSAddressingObjectBuilder;
@@ -32,5 +34,5 @@ public abstract class AbstractWSAddressingObjectBuilder<WSAddressingObjectType e
         WSAddressingObjectBuilder<WSAddressingObjectType> {
 
     /** {@inheritDoc} */
-    public abstract WSAddressingObjectType buildObject();
+    @Nonnull public abstract WSAddressingObjectType buildObject();
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectMarshaller.java
index f23323503..57be36939 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -35,11 +37,12 @@ public abstract class AbstractWSAddressingObjectMarshaller extends AbstractXMLOb
     }
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectUnmarshaller.java
index ff89ad0d9..47d91f3ae 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AbstractWSAddressingObjectUnmarshaller.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * An abstract unmarshaller implementation for XMLObjects from {@link org.opensaml.soap.wsaddressing.impl}.
  */
@@ -32,28 +35,24 @@ public abstract class AbstractWSAddressingObjectUnmarshaller extends AbstractXML
     /**
      * Logger.
      */
-    private final Logger log = LoggerFactory.getLogger(AbstractWSAddressingObjectUnmarshaller.class);
-
-    /** Constructor. */
-    protected AbstractWSAddressingObjectUnmarshaller() {
-        super();
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractWSAddressingObjectUnmarshaller.class);
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         log.warn("{} ignoring unknown child element {}", parentXMLObject.getElementQName().getLocalPart(),
                 childXMLObject.getElementQName().getLocalPart());
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         log.warn("{} ignoring unknown attribute {}", xmlObject.getElementQName().getLocalPart(), attribute
                 .getLocalName());
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         log.warn("{} ignoring unknown element content: {}", xmlObject.getElementQName().getLocalPart(), elementContent);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionBuilder.java
index d4c141eab..f90e0999b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.Action;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.Action;
 public class ActionBuilder extends AbstractWSAddressingObjectBuilder<Action> {
 
     /** {@inheritDoc} */
-    public Action buildObject() {
+    @Nonnull public Action buildObject() {
         return buildObject(Action.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Action buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Action buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ActionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionImpl.java
index 742e0cd2c..310ae853f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ActionImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.Action;
 
 /**
@@ -32,7 +35,8 @@ public class ActionImpl extends AttributedURIImpl implements Action {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ActionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ActionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressBuilder.java
index 18b4ba655..e39aadd5d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.Address;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.Address;
 public class AddressBuilder extends AbstractWSAddressingObjectBuilder<Address> {
 
     /** {@inheritDoc} */
-    public Address buildObject() {
+    @Nonnull public Address buildObject() {
         return buildObject(Address.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Address buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Address buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AddressImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressImpl.java
index cde9f89e8..259cc0c2d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AddressImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.Address;
 
 /**
@@ -32,7 +35,8 @@ public class AddressImpl extends AttributedURIImpl implements Address {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AddressImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AddressImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameImpl.java
index 6f84e22c6..cf49b6c71 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSQNameImpl;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wsaddressing.AttributedQName;
@@ -27,7 +30,7 @@ import org.opensaml.soap.wsaddressing.AttributedQName;
 public class AttributedQNameImpl extends XSQNameImpl implements AttributedQName {
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -36,13 +39,14 @@ public class AttributedQNameImpl extends XSQNameImpl implements AttributedQName
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AttributedQNameImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AttributedQNameImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameMarshaller.java
index 951a99043..235a0098c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.impl.XSQNameMarshaller;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class AttributedQNameMarshaller extends XSQNameMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedQName attributedQName = (AttributedQName) xmlObject;
         XMLObjectSupport.marshallAttributeMap(attributedQName.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameUnmarshaller.java
index 21da8c312..1ae5c75b3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedQNameUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.schema.impl.XSQNameUnmarshaller;
@@ -30,7 +32,8 @@ import org.w3c.dom.Attr;
 public class AttributedQNameUnmarshaller extends XSQNameUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedQName attributedQName = (AttributedQName) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(attributedQName.getUnknownAttributes(), attribute);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIImpl.java
index 46f29c70e..646b78f01 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wsaddressing.AttributedURI;
@@ -28,7 +31,7 @@ import org.opensaml.soap.wsaddressing.AttributedURI;
 public class AttributedURIImpl extends XSURIImpl implements AttributedURI {
 
     /** xs:anyAttribute for this element. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -37,14 +40,15 @@ public class AttributedURIImpl extends XSURIImpl implements AttributedURI {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AttributedURIImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AttributedURIImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
 
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIMarshaller.java
index 045af6493..255a08d07 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -33,14 +35,15 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class AttributedURIMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final AttributedURI attributedURI = (AttributedURI) xmlObject;
         ElementSupport.appendTextContent(domElement, attributedURI.getURI());
     }
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedURI attributedURI = (AttributedURI) xmlObject;
         XMLObjectSupport.marshallAttributeMap(attributedURI.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIUnmarshaller.java
index ac6824805..8972c8646 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedURIUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,7 @@ import org.w3c.dom.Attr;
 public class AttributedURIUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         if (elementContent != null) {
             final AttributedURI attributedURI = (AttributedURI) xmlObject;
             attributedURI.setURI(elementContent);
@@ -38,7 +40,8 @@ public class AttributedURIUnmarshaller extends AbstractWSAddressingObjectUnmarsh
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedURI attributedURI = (AttributedURI) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(attributedURI.getUnknownAttributes(), attribute);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongImpl.java
index 650ef7aa0..36889347c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wsaddressing.AttributedUnsignedLong;
 
@@ -26,10 +29,10 @@ import org.opensaml.soap.wsaddressing.AttributedUnsignedLong;
 public class AttributedUnsignedLongImpl extends AbstractWSAddressingObject implements AttributedUnsignedLong {
     
     /** Element's long value. */
-    private Long value;
+    @Nullable private Long value;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -38,24 +41,24 @@ public class AttributedUnsignedLongImpl extends AbstractWSAddressingObject imple
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AttributedUnsignedLongImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AttributedUnsignedLongImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public Long getValue() {
+    @Nullable public Long getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final Long newValue) {
+    public void setValue(@Nullable final Long newValue) {
         value = prepareForAssignment(value, newValue);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongMarshaller.java
index cea2c4af4..fb0fc5eff 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,17 +33,19 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class AttributedUnsignedLongMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedUnsignedLong aul = (AttributedUnsignedLong) xmlObject;
         XMLObjectSupport.marshallAttributeMap(aul.getUnknownAttributes(), domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final AttributedUnsignedLong aul = (AttributedUnsignedLong) xmlObject;
-        if (aul.getValue() != null) {
-            ElementSupport.appendTextContent(domElement, aul.getValue().toString());
+        final Long val = aul.getValue();
+        if (val != null) {
+            ElementSupport.appendTextContent(domElement, val.toString());
         }
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongUnmarshaller.java
index f3dc5b941..1b5053563 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/AttributedUnsignedLongUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -29,13 +31,14 @@ import org.w3c.dom.Attr;
 public class AttributedUnsignedLongUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedUnsignedLong aul = (AttributedUnsignedLong) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(aul.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         final AttributedUnsignedLong aul = (AttributedUnsignedLong) xmlObject;
         if (elementContent != null) {
             aul.setValue(Long.valueOf(elementContent.trim()));
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceBuilder.java
index 6fbe8eb4b..8bd096d09 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.EndpointReference;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wsaddressing.EndpointReference;
 public class EndpointReferenceBuilder extends AbstractWSAddressingObjectBuilder<EndpointReference> {
 
     /** {@inheritDoc} */
-    public EndpointReference buildObject() {
+    @Nonnull public EndpointReference buildObject() {
         return buildObject(EndpointReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public EndpointReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public EndpointReference buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EndpointReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceImpl.java
index d4c6d924d..467fbdb84 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.EndpointReference;
 
 /**
@@ -32,8 +35,8 @@ public class EndpointReferenceImpl extends EndpointReferenceTypeImpl implements
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EndpointReferenceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public EndpointReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeImpl.java
index 1d2ad4e9a..98fad1cf6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -31,6 +32,8 @@ import org.opensaml.soap.wsaddressing.EndpointReferenceType;
 import org.opensaml.soap.wsaddressing.Metadata;
 import org.opensaml.soap.wsaddressing.ReferenceParameters;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Abstract implementation of the element of type {@link EndpointReferenceType }.
  * 
@@ -38,19 +41,19 @@ import org.opensaml.soap.wsaddressing.ReferenceParameters;
 public class EndpointReferenceTypeImpl extends AbstractWSAddressingObject implements EndpointReferenceType {
 
     /** {@link Address} child element. */
-    private Address address;
+    @Nullable private Address address;
 
     /** Optional {@link Metadata} child element. */
-    private Metadata metadata;
+    @Nullable private Metadata metadata;
 
     /** Optional {@link ReferenceParameters} child element. */
-    private ReferenceParameters referenceParameters;
+    @Nullable private ReferenceParameters referenceParameters;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject>  unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject>  unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -59,60 +62,61 @@ public class EndpointReferenceTypeImpl extends AbstractWSAddressingObject implem
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EndpointReferenceTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public EndpointReferenceTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public Address getAddress() {
+    @Nullable public Address getAddress() {
         return address;
     }
 
     /** {@inheritDoc} */
-    public void setAddress(final Address newAddress) {
+    public void setAddress(@Nullable final Address newAddress) {
         address = prepareForAssignment(address, newAddress);
     }
 
     /** {@inheritDoc} */
-    public Metadata getMetadata() {
+    @Nullable public Metadata getMetadata() {
         return metadata;
     }
 
     /** {@inheritDoc} */
-    public void setMetadata(final Metadata newMetadata) {
+    public void setMetadata(@Nullable final Metadata newMetadata) {
         metadata = prepareForAssignment(metadata, newMetadata);
     }
 
     /** {@inheritDoc} */
-    public ReferenceParameters getReferenceParameters() {
+    @Nullable public ReferenceParameters getReferenceParameters() {
         return referenceParameters;
     }
 
     /** {@inheritDoc} */
-    public void setReferenceParameters(final ReferenceParameters newReferenceParameters) {
+    public void setReferenceParameters(@Nullable final ReferenceParameters newReferenceParameters) {
         referenceParameters = prepareForAssignment(referenceParameters, newReferenceParameters);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (address != null) {
             children.add(address);
@@ -125,11 +129,9 @@ public class EndpointReferenceTypeImpl extends AbstractWSAddressingObject implem
         }
 
         // xs:any element
-        if (!getUnknownXMLObjects().isEmpty()) {
-            children.addAll(getUnknownXMLObjects());
-        }
+        children.addAll(getUnknownXMLObjects());
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
  
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeMarshaller.java
index 9d4d3c81b..1d63c81f9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class EndpointReferenceTypeMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final EndpointReferenceType eprType = (EndpointReferenceType) xmlObject;
         XMLObjectSupport.marshallAttributeMap(eprType.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeUnmarshaller.java
index e3b2e9b47..db8787cad 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/EndpointReferenceTypeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -33,8 +35,8 @@ import org.w3c.dom.Attr;
 public class EndpointReferenceTypeUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-        throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final EndpointReferenceType epr = (EndpointReferenceType) parentXMLObject;
         if (childXMLObject instanceof Address) {
             epr.setAddress((Address) childXMLObject);
@@ -48,7 +50,8 @@ public class EndpointReferenceTypeUnmarshaller extends AbstractWSAddressingObjec
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final EndpointReferenceType epr = (EndpointReferenceType) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(epr.getUnknownAttributes(), attribute);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToBuilder.java
index d87996198..414e78b8a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.FaultTo;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.FaultTo;
 public class FaultToBuilder extends AbstractWSAddressingObjectBuilder<FaultTo> {
 
     /** {@inheritDoc} */
-    public FaultTo buildObject() {
+    @Nonnull public FaultTo buildObject() {
         return buildObject(FaultTo.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public FaultTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public FaultTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new FaultToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToImpl.java
index 3522c8c98..7ef7af490 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FaultToImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.FaultTo;
 
 /**
@@ -32,7 +35,8 @@ public class FaultToImpl extends EndpointReferenceTypeImpl implements FaultTo {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public FaultToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public FaultToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromBuilder.java
index 0765fea25..b7a6fc3d6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.From;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.From;
 public class FromBuilder extends AbstractWSAddressingObjectBuilder<From> {
 
     /** {@inheritDoc} */
-    public From buildObject() {
+    @Nonnull public From buildObject() {
         return buildObject(From.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public From buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public From buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new FromImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromImpl.java
index 9720e19a1..48206f3bf 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/FromImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.From;
 
 /**
@@ -32,7 +35,8 @@ public class FromImpl extends EndpointReferenceTypeImpl implements From {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public FromImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public FromImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDBuilder.java
index 29c4b775d..8537d1795 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.MessageID;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.MessageID;
 public class MessageIDBuilder extends AbstractWSAddressingObjectBuilder<MessageID> {
 
     /** {@inheritDoc} */
-    public MessageID buildObject() {
+    @Nonnull public MessageID buildObject() {
         return buildObject(MessageID.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public MessageID buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public MessageID buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new MessageIDImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDImpl.java
index 1b37b73d5..c989ce29a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MessageIDImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.MessageID;
 
 /**
@@ -31,7 +34,8 @@ public class MessageIDImpl extends AttributedURIImpl implements MessageID {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public MessageIDImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public MessageIDImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataBuilder.java
index 5e13bd05b..c6a27ee67 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.Metadata;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.Metadata;
 public class MetadataBuilder extends AbstractWSAddressingObjectBuilder<Metadata> {
 
     /** {@inheritDoc} */
-    public Metadata buildObject() {
+    @Nonnull public Metadata buildObject() {
         return buildObject(Metadata.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Metadata buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Metadata buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new MetadataImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataImpl.java
index 1a81f0504..897261aad 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataImpl.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,10 +37,10 @@ import org.opensaml.soap.wsaddressing.Metadata;
 public class MetadataImpl extends AbstractWSAddressingObject implements Metadata {
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -47,24 +49,26 @@ public class MetadataImpl extends AbstractWSAddressingObject implements Metadata
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public MetadataImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public MetadataImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataMarshaller.java
index a0421e468..679985933 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class MetadataMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Metadata metadata = (Metadata) xmlObject;
         XMLObjectSupport.marshallAttributeMap(metadata.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataUnmarshaller.java
index 2b1ef51ce..8f1890c10 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/MetadataUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,14 +32,15 @@ import org.w3c.dom.Attr;
 public class MetadataUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Metadata metadata = (Metadata) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(metadata.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Metadata metadata = (Metadata) parentXMLObject;
         metadata.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionBuilder.java
index 28fad0c72..bc1ad4dcb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ProblemAction;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.ProblemAction;
 public class ProblemActionBuilder extends AbstractWSAddressingObjectBuilder<ProblemAction> {
 
     /** {@inheritDoc} */
-    public ProblemAction buildObject() {
+    @Nonnull public ProblemAction buildObject() {
         return buildObject(ProblemAction.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ProblemAction buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ProblemAction buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ProblemActionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionImpl.java
index 786a15672..768900b7c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionImpl.java
@@ -18,28 +18,32 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wsaddressing.Action;
 import org.opensaml.soap.wsaddressing.ProblemAction;
 import org.opensaml.soap.wsaddressing.SoapAction;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Implementation of {@link ProblemAction}.
  */
 public class ProblemActionImpl extends AbstractWSAddressingObject implements ProblemAction {
     
     /** Action child element. */
-    private Action action;
+    @Nullable private Action action;
     
     /** SoapAction child element. */
-    private SoapAction soapAction;
+    @Nullable private SoapAction soapAction;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -48,38 +52,39 @@ public class ProblemActionImpl extends AbstractWSAddressingObject implements Pro
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ProblemActionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ProblemActionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public Action getAction() {
+    @Nullable public Action getAction() {
         return action;
     }
 
     /** {@inheritDoc} */
-    public SoapAction getSoapAction() {
+    @Nullable public SoapAction getSoapAction() {
         return soapAction;
     }
 
     /** {@inheritDoc} */
-    public void setAction(final Action newAction) {
+    public void setAction(@Nullable final Action newAction) {
         action = prepareForAssignment(action, newAction);
     }
 
     /** {@inheritDoc} */
-    public void setSoapAction(final SoapAction newSoapAction) {
+    public void setSoapAction(@Nullable final SoapAction newSoapAction) {
         soapAction = prepareForAssignment(soapAction, newSoapAction);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (action != null) {
             children.add(action);
@@ -88,7 +93,7 @@ public class ProblemActionImpl extends AbstractWSAddressingObject implements Pro
             children.add(soapAction);
         }
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionMarshaller.java
index 4fd771d78..d18b885dc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -29,7 +31,8 @@ import org.w3c.dom.Element;
 public class ProblemActionMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final ProblemAction pa = (ProblemAction) xmlObject;
         XMLObjectSupport.marshallAttributeMap(pa.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionUnmarshaller.java
index 84825245c..6e55f5089 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemActionUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,14 +33,15 @@ import org.w3c.dom.Attr;
 public class ProblemActionUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final ProblemAction pa = (ProblemAction) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(pa.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final ProblemAction pa = (ProblemAction) parentXMLObject;
         
         if (childXMLObject instanceof Action) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameBuilder.java
index b2314ef3a..f32bcfd03 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ProblemHeaderQName;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wsaddressing.ProblemHeaderQName;
 public class ProblemHeaderQNameBuilder extends AbstractWSAddressingObjectBuilder<ProblemHeaderQName> {
 
     /** {@inheritDoc} */
-    public ProblemHeaderQName buildObject() {
+    @Nonnull public ProblemHeaderQName buildObject() {
         return buildObject(ProblemHeaderQName.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ProblemHeaderQName buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public ProblemHeaderQName buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ProblemHeaderQNameImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameImpl.java
index 854f847d4..d1cd7ed51 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemHeaderQNameImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ProblemHeaderQName;
 
 /**
@@ -31,8 +34,8 @@ public class ProblemHeaderQNameImpl extends AttributedQNameImpl implements Probl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ProblemHeaderQNameImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public ProblemHeaderQNameImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIBuilder.java
index b18f19acd..8b1d553f0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ProblemIRI;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.ProblemIRI;
 public class ProblemIRIBuilder extends AbstractWSAddressingObjectBuilder<ProblemIRI> {
 
     /** {@inheritDoc} */
-    public ProblemIRI buildObject() {
+    @Nonnull public ProblemIRI buildObject() {
         return buildObject(ProblemIRI.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ProblemIRI buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ProblemIRI buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ProblemIRIImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIImpl.java
index ed8ba77fa..edfba86ad 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ProblemIRIImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ProblemIRI;
 
 /**
@@ -32,7 +35,8 @@ public class ProblemIRIImpl extends AttributedURIImpl implements ProblemIRI {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ProblemIRIImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ProblemIRIImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersBuilder.java
index cc6a9b787..2acfaf2c1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ReferenceParameters;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wsaddressing.ReferenceParameters;
 public class ReferenceParametersBuilder extends AbstractWSAddressingObjectBuilder<ReferenceParameters> {
 
     /** {@inheritDoc} */
-    public ReferenceParameters buildObject() {
+    @Nonnull public ReferenceParameters buildObject() {
         return buildObject(ReferenceParameters.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ReferenceParameters buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public ReferenceParameters buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new ReferenceParametersImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersImpl.java
index c030d6459..bd800a137 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersImpl.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,10 +37,10 @@ import org.opensaml.soap.wsaddressing.ReferenceParameters;
 public class ReferenceParametersImpl extends AbstractWSAddressingObject implements ReferenceParameters {
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -47,25 +49,26 @@ public class ReferenceParametersImpl extends AbstractWSAddressingObject implemen
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ReferenceParametersImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public ReferenceParametersImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersMarshaller.java
index 8e0c64902..2c897a699 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wsaddressing.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class ReferenceParametersMarshaller extends AbstractWSAddressingObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final ReferenceParameters rp = (ReferenceParameters) xmlObject;
         XMLObjectSupport.marshallAttributeMap(rp.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersUnmarshaller.java
index c5fc07002..b3e31671e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReferenceParametersUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,14 +32,15 @@ import org.w3c.dom.Attr;
 public class ReferenceParametersUnmarshaller extends AbstractWSAddressingObjectUnmarshaller {
     
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final ReferenceParameters rp = (ReferenceParameters) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(rp.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final ReferenceParameters rp = (ReferenceParameters) parentXMLObject;
         rp.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToBuilder.java
index 55a4b7de3..27551e39c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.RelatesTo;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.RelatesTo;
 public class RelatesToBuilder extends AbstractWSAddressingObjectBuilder<RelatesTo> {
 
     /** {@inheritDoc} */
-    public RelatesTo buildObject() {
+    @Nonnull public RelatesTo buildObject() {
         return buildObject(RelatesTo.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RelatesTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public RelatesTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RelatesToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToImpl.java
index 55b9c435b..28bc7f738 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wsaddressing.RelatesTo;
@@ -27,10 +30,10 @@ import org.opensaml.soap.wsaddressing.RelatesTo;
 public class RelatesToImpl extends XSURIImpl implements RelatesTo {
     
     /** RelationshipType attribute value. */
-    private String relationshipType;
+    @Nullable private String relationshipType;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -39,7 +42,8 @@ public class RelatesToImpl extends XSURIImpl implements RelatesTo {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RelatesToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RelatesToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         // Default attribute value per the schema.
@@ -47,17 +51,17 @@ public class RelatesToImpl extends XSURIImpl implements RelatesTo {
     }
 
     /** {@inheritDoc} */
-    public String getRelationshipType() {
+    @Nullable public String getRelationshipType() {
         return relationshipType;
     }
 
     /** {@inheritDoc} */
-    public void setRelationshipType(final String newRelationshipType) {
+    public void setRelationshipType(@Nullable final String newRelationshipType) {
         relationshipType = prepareForAssignment(relationshipType, newRelationshipType);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToMarshaller.java
index 094360af8..be8505695 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.impl.XSURIMarshaller;
@@ -32,7 +34,8 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class RelatesToMarshaller extends XSURIMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final RelatesTo relatesTo = (RelatesTo) xmlObject;
         
         final String relationshipType = StringSupport.trimOrNull(relatesTo.getRelationshipType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToUnmarshaller.java
index a31a2ccd0..54880ad96 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RelatesToUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.schema.impl.XSURIUnmarshaller;
@@ -32,7 +34,8 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class RelatesToUnmarshaller extends XSURIUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final RelatesTo relatesTo = (RelatesTo) xmlObject;
         
         if (RelatesTo.RELATIONSHIP_TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToBuilder.java
index b9b85303d..8a5c555a1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ReplyTo;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.ReplyTo;
 public class ReplyToBuilder extends AbstractWSAddressingObjectBuilder<ReplyTo> {
 
     /** {@inheritDoc} */
-    public ReplyTo buildObject() {
+    @Nonnull public ReplyTo buildObject() {
         return buildObject(ReplyTo.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ReplyTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ReplyTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ReplyToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToImpl.java
index cd49cdda3..23473be48 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ReplyToImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.ReplyTo;
 
 /**
@@ -32,7 +35,8 @@ public class ReplyToImpl extends EndpointReferenceTypeImpl implements ReplyTo {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ReplyToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ReplyToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterBuilder.java
index d0b11bcba..ee52c2e01 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.RetryAfter;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.RetryAfter;
 public class RetryAfterBuilder extends AbstractWSAddressingObjectBuilder<RetryAfter> {
 
     /** {@inheritDoc} */
-    public RetryAfter buildObject() {
+    @Nonnull public RetryAfter buildObject() {
         return buildObject(RetryAfter.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RetryAfter buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public RetryAfter buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RetryAfterImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterImpl.java
index f26e54fe4..ceadabb09 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/RetryAfterImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.RetryAfter;
 
 /**
@@ -31,7 +34,8 @@ public class RetryAfterImpl extends AttributedUnsignedLongImpl implements RetryA
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RetryAfterImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RetryAfterImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionBuilder.java
index 5724391bc..686fe1571 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.SoapAction;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.SoapAction;
 public class SoapActionBuilder extends AbstractWSAddressingObjectBuilder<SoapAction> {
 
     /** {@inheritDoc} */
-    public SoapAction buildObject() {
+    @Nonnull public SoapAction buildObject() {
         return buildObject(SoapAction.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SoapAction buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public SoapAction buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SoapActionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionImpl.java
index 44e52b1b8..05e41bb2e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/SoapActionImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wsaddressing.SoapAction;
 
@@ -32,7 +35,8 @@ public class SoapActionImpl extends XSURIImpl implements SoapAction {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public SoapActionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public SoapActionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToBuilder.java
index bd8003d6b..d012316d5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.To;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wsaddressing.To;
 public class ToBuilder extends AbstractWSAddressingObjectBuilder<To> {
 
     /** {@inheritDoc} */
-    public To buildObject() {
+    @Nonnull public To buildObject() {
         return buildObject(To.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public To buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public To buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToImpl.java
index deaa2277f..16cf1542b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/impl/ToImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsaddressing.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.To;
 
 /**
@@ -31,7 +34,8 @@ public class ToImpl extends AttributedURIImpl implements To {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandler.java
index 3c981235f..e104c1973 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandler.java
@@ -27,12 +27,13 @@ import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.soap.messaging.AbstractHeaderGeneratingMessageHandler;
 import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.opensaml.soap.soap11.Fault;
+import org.opensaml.soap.soap11.FaultCode;
 import org.opensaml.soap.wsaddressing.Action;
 import org.opensaml.soap.wsaddressing.WSAddressingConstants;
 import org.opensaml.soap.wsaddressing.messaging.WSAddressingContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -55,16 +56,16 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class AddActionHandler extends AbstractHeaderGeneratingMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AddActionHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AddActionHandler.class);
     
     /** The configured Action URI value. */
-    private String actionURI;
+    @Nullable private String actionURI;
     
     /** The configured Fault Action URI value. */
-    private String faultActionURI;
+    @Nullable private String faultActionURI;
     
     /** The actual calculated Action URI to send. */
-    private String sendURI;
+    @Nullable private String sendURI;
     
     /**
      * Get the Action URI.
@@ -146,8 +147,9 @@ public class AddActionHandler extends AbstractHeaderGeneratingMessageHandler {
      */
     @Nonnull protected String selectActionURIForFault(@Nonnull final Fault fault) {
         QName faultCode =  null;
-        if (fault.getCode() != null && fault.getCode().getValue() != null) {
-            faultCode = fault.getCode().getValue(); 
+        final FaultCode fcode = fault.getCode();
+        if (fcode != null) {
+            faultCode = fcode.getValue(); 
         }
         if (faultCode != null && WSAddressingConstants.WS_ADDRESSING_FAULTS.contains(faultCode)) {
             return WSAddressingConstants.ACTION_URI_FAULT;
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
index ef7a5865b..2adaca9e8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandler.java
@@ -30,8 +30,8 @@ import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.opensaml.soap.wsaddressing.MessageID;
 import org.opensaml.soap.wsaddressing.messaging.WSAddressingContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.security.IdentifierGenerationStrategy;
 
 /**
@@ -47,10 +47,10 @@ import net.shibboleth.shared.security.IdentifierGenerationStrategy;
 public class AddMessageIDHandler extends AbstractHeaderGeneratingMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AddMessageIDHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AddMessageIDHandler.class);
     
     /** Strategy for generating identifiers. */
-    private IdentifierGenerationStrategy identifierGenerationStrategy;
+    @Nullable private IdentifierGenerationStrategy identifierGenerationStrategy;
     
     /**
      * Get the identifier generation strategy.
@@ -90,13 +90,14 @@ public class AddMessageIDHandler extends AbstractHeaderGeneratingMessageHandler
      */
     @Nonnull protected String getMessageID(final MessageContext messageContext) {
         final WSAddressingContext addressing = messageContext.getSubcontext(WSAddressingContext.class);
-        if (addressing != null && addressing.getMessageIDURI() != null) {
-            return addressing.getMessageIDURI();
-        } else if (getIdentifierGenerationStrategy() != null) {
-            return getIdentifierGenerationStrategy().generateIdentifier(false);
+        final String id = addressing != null ? addressing.getMessageIDURI() : null;
+        if (id != null) {
+            return id;
+        } else if (identifierGenerationStrategy != null) {
+            return identifierGenerationStrategy.generateIdentifier(false);
         } else {
             return "urn:uuid:" + UUID.randomUUID().toString();
         }
     }
     
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
index a828c6261..653cf2345 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandler.java
@@ -28,8 +28,8 @@ import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.opensaml.soap.wsaddressing.RelatesTo;
 import org.opensaml.soap.wsaddressing.messaging.WSAddressingContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -38,7 +38,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class AddRelatesToHandler extends AbstractHeaderGeneratingMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(AddRelatesToHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(AddRelatesToHandler.class);
     
     /** Optional lookup function for obtaining the RelatesTo URI value. */
     private ContextDataLookupFunction<MessageContext, String> relatesToURILookup;
@@ -113,7 +113,7 @@ public class AddRelatesToHandler extends AbstractHeaderGeneratingMessageHandler
     }
 
     /** {@inheritDoc} */
-    protected void doInvoke(final MessageContext messageContext) throws MessageHandlerException {
+    protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
         log.debug("Issuing WS-Addressing RelatesTo header with URI '{}' and RelationshipType '{}'", 
                 relatesToURI, relationshipType);
         final RelatesTo relatesTo = (RelatesTo) XMLObjectSupport.buildXMLObject(RelatesTo.ELEMENT_NAME);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
index a7d52d4a3..40b152891 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandler.java
@@ -29,8 +29,8 @@ import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.opensaml.soap.wsaddressing.MessageID;
 import org.opensaml.soap.wsaddressing.messaging.WSAddressingContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -44,10 +44,10 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class ExtractMessageIDHandler extends AbstractMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(ExtractMessageIDHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(ExtractMessageIDHandler.class);
 
     /** {@inheritDoc} */
-    protected void doInvoke(final MessageContext messageContext) throws MessageHandlerException {
+    protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
         final MessageID header = getMessageID(messageContext);
         final String headerValue = header != null ? StringSupport.trimOrNull(header.getURI()) : null;
         log.debug("Extracted inbound WS-Addressing MessageID value: {}", headerValue);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
index 832fc2eb4..c5a57a85b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandler.java
@@ -32,8 +32,8 @@ import org.opensaml.soap.wsaddressing.Action;
 import org.opensaml.soap.wsaddressing.WSAddressingConstants;
 import org.opensaml.soap.wsaddressing.messaging.WSAddressingContext;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.primitive.StringSupport;
 
 /**
@@ -48,7 +48,7 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class ValidateActionHandler extends AbstractMessageHandler {
     
     /** Logger. */
-    private Logger log = LoggerFactory.getLogger(ValidateActionHandler.class);
+    @Nonnull private Logger log = LoggerFactory.getLogger(ValidateActionHandler.class);
     
     /** The expected Action URI value. */
     private String expectedActionURI;
@@ -91,11 +91,11 @@ public class ValidateActionHandler extends AbstractMessageHandler {
     }
 
     /** {@inheritDoc} */
-    protected void doInvoke(final MessageContext messageContext) throws MessageHandlerException {
+    protected void doInvoke(@Nonnull final MessageContext messageContext) throws MessageHandlerException {
         final Action header = getAction(messageContext);
         final String headerValue = header != null ? StringSupport.trimOrNull(header.getURI()) : null;
         log.debug("Checking inbound message WS-Addressing Action URI value: {}", headerValue);
-        if (Objects.equals(getExpectedActionURI(), headerValue)) {
+        if (header != null && Objects.equals(getExpectedActionURI(), headerValue)) {
             log.debug("Inbound WS-Addressing Action URI matched expected value");
             SOAPMessagingSupport.registerUnderstoodHeader(messageContext, header);
         } else {
@@ -114,7 +114,7 @@ public class ValidateActionHandler extends AbstractMessageHandler {
      * @param messageContext the current message context
      * @return the message Action header
      */
-    protected Action getAction(@Nonnull final MessageContext messageContext) {
+    @Nullable protected Action getAction(@Nonnull final MessageContext messageContext) {
         final List<XMLObject> actions = SOAPMessagingSupport.getInboundHeaderBlock(messageContext, Action.ELEMENT_NAME);
         if (actions != null && !actions.isEmpty()) {
             return (Action) actions.get(0);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressBuilder.java
index 65098c7f9..03f2fe2b3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsfed.Address;
 import org.opensaml.soap.wsfed.WSFedConstants;
@@ -25,19 +28,15 @@ import org.opensaml.soap.wsfed.WSFedObjectBuilder;
 /** Builder of {@link AddressImpl} objects. */
 public class AddressBuilder extends AbstractXMLObjectBuilder<Address> implements WSFedObjectBuilder<Address> {
 
-    /** Constructor. */
-    public AddressBuilder() {
-
-    }
-
     /** {@inheritDoc} */
-    public final Address buildObject() {
+    @Nonnull public final Address buildObject() {
         return buildObject(WSFedConstants.WSADDRESS_NS, Address.DEFAULT_ELEMENT_LOCAL_NAME,
                 WSFedConstants.WSADDRESS_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public Address buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Address buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AddressImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressImpl.java
index 92a1eadf6..56aec7a76 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressImpl.java
@@ -17,9 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wsfed.Address;
@@ -28,7 +30,7 @@ import org.opensaml.soap.wsfed.Address;
 public class AddressImpl extends AbstractXMLObject implements Address {
 
     /** Address value. */
-    private String value;
+    @Nullable private String value;
 
     /**
      * Constructor.
@@ -37,23 +39,24 @@ public class AddressImpl extends AbstractXMLObject implements Address {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AddressImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected AddressImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getValue() {
+    @Nullable public String getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final String newValue) {
+    public void setValue(@Nullable final String newValue) {
         value = prepareForAssignment(value, newValue);
 
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        return new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return null;
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressMarshaller.java
index 26464c44d..03507293c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressMarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
+import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wsfed.Address;
 import org.w3c.dom.Element;
 
@@ -28,13 +31,15 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class AddressMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject fedObject, final Element domElement) {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject fedObject, final Element domElement) {
-        final Address address = (Address) fedObject;
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
+        final Address address = (Address) xmlObject;
 
         if (address.getValue() != null) {
             ElementSupport.appendTextContent(domElement, address.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressUnmarshaller.java
index 558c4b113..a9b021c20 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AddressUnmarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wsfed.Address;
 import org.w3c.dom.Attr;
 
@@ -26,18 +29,20 @@ import org.w3c.dom.Attr;
 public class AddressUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject fedObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject fedObject, @Nonnull final String elementContent) {
         final Address address = (Address) fedObject;
         address.setValue(elementContent);
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject fedObject, final Attr attribute) {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject fedObject, final XMLObject child) {
-
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToBuilder.java
index 5a2e9898d..90e514895 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsfed.AppliesTo;
 import org.opensaml.soap.wsfed.WSFedConstants;
@@ -25,19 +28,15 @@ import org.opensaml.soap.wsfed.WSFedObjectBuilder;
 /** Builder of {@link AppliesToImpl} objects. */
 public class AppliesToBuilder extends AbstractXMLObjectBuilder<AppliesTo> implements WSFedObjectBuilder<AppliesTo> {
 
-    /** Constructor. */
-    public AppliesToBuilder() {
-
-    }
-
     /** {@inheritDoc} */
-    public AppliesTo buildObject() {
+    @Nonnull public AppliesTo buildObject() {
         return buildObject(WSFedConstants.WSPOLICY_NS, AppliesTo.DEFAULT_ELEMENT_LOCAL_NAME,
                 WSFedConstants.WSPOLICY_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public AppliesTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public AppliesTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AppliesToImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToImpl.java
index 816bf38da..9922a6c93 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToImpl.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.soap.wsfed.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wsfed.AppliesTo;
 import org.opensaml.soap.wsfed.EndPointReference;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /** Implementation of the {@link AppliesTo} Object. */
 public class AppliesToImpl extends AbstractXMLObject implements AppliesTo {
 
     /** Endpoint reference. */
-    private EndPointReference endPointReference;
+    @Nullable private EndPointReference endpointReference;
 
     /**
      * Constructor.
@@ -39,26 +42,29 @@ public class AppliesToImpl extends AbstractXMLObject implements AppliesTo {
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected AppliesToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected AppliesToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public EndPointReference getEndPointReference() {
-        return endPointReference;
+    @Nullable public EndPointReference getEndPointReference() {
+        return endpointReference;
     }
 
     /** {@inheritDoc} */
-    public void setEndPointReference(final EndPointReference reference) {
-        endPointReference = prepareForAssignment(endPointReference, reference);
+    public void setEndPointReference(@Nullable final EndPointReference reference) {
+        endpointReference = prepareForAssignment(endpointReference, reference);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-
-        children.add(endPointReference);
-
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
+        if (endpointReference != null) {
+            return CollectionSupport.singletonList(endpointReference);
+        }
+        
+        return null;
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToMarshaller.java
index 465ed0481..ecdf814e8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToMarshaller.java
@@ -17,20 +17,25 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
+import org.opensaml.core.xml.io.MarshallingException;
 import org.w3c.dom.Element;
 
 /** A thread safe marshaller for {@link org.opensaml.soap.wsfed.AppliesTo} objects. */
 public class AppliesToMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject fedObject, final Element domElement) {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject fedObject, final Element domElement) {
-
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToUnmarshaller.java
index 0ff24c2c6..def00c9bd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/AppliesToUnmarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wsfed.AppliesTo;
 import org.opensaml.soap.wsfed.EndPointReference;
 import org.w3c.dom.Attr;
@@ -27,22 +30,23 @@ import org.w3c.dom.Attr;
 public class AppliesToUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentFedObject, final XMLObject childFedObject) {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
 
-        final AppliesTo appliesTo = (AppliesTo) parentFedObject;
+        final AppliesTo appliesTo = (AppliesTo) parentXMLObject;
 
-        if (childFedObject instanceof EndPointReference) {
-            appliesTo.setEndPointReference((EndPointReference) childFedObject);
+        if (childXMLObject instanceof EndPointReference) {
+            appliesTo.setEndPointReference((EndPointReference) childXMLObject);
         }
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject fedObject, final Attr attribute) {
-
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject fedObject, final String content) {
+    protected void processElementContent(@Nonnull final XMLObject fedObject, @Nonnull final String content) {
 
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceBuilder.java
index da87d0959..920ad5d19 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsfed.EndPointReference;
 import org.opensaml.soap.wsfed.WSFedConstants;
@@ -26,20 +29,15 @@ import org.opensaml.soap.wsfed.WSFedObjectBuilder;
 public class EndPointReferenceBuilder extends AbstractXMLObjectBuilder<EndPointReference> implements
         WSFedObjectBuilder<EndPointReference> {
 
-    /** Constructor. */
-    public EndPointReferenceBuilder() {
-
-    }
-
     /** {@inheritDoc} */
-    public EndPointReference buildObject() {
+    @Nonnull public EndPointReference buildObject() {
         return buildObject(WSFedConstants.WSADDRESS_NS, EndPointReference.DEFAULT_ELEMENT_LOCAL_NAME,
                 WSFedConstants.WSADDRESS_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public EndPointReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public EndPointReference buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EndPointReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceImpl.java
index 76a155738..c55815729 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceImpl.java
@@ -17,20 +17,23 @@
 
 package org.opensaml.soap.wsfed.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wsfed.Address;
 import org.opensaml.soap.wsfed.EndPointReference;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /** Implementation of the {@link EndPointReference} object. */
 public class EndPointReferenceImpl extends AbstractXMLObject implements EndPointReference {
 
     /** Address of the endpoint. */
-    private Address address;
+    @Nullable private Address address;
 
     /**
      * Constructor.
@@ -39,28 +42,28 @@ public class EndPointReferenceImpl extends AbstractXMLObject implements EndPoint
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    protected EndPointReferenceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    protected EndPointReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
 
     }
 
     /** {@inheritDoc} */
-    public Address getAddress() {
+    @Nullable public Address getAddress() {
         return address;
     }
 
     /** {@inheritDoc} */
-    public void setAddress(final Address newAddress) {
+    public void setAddress(@Nullable final Address newAddress) {
         address = prepareForAssignment(address, newAddress);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-
-        children.add(address);
-
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        if (address != null) {
+            return CollectionSupport.singletonList(address);
+        }
+        
+        return null;
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceMarshaller.java
index 6c9f1c747..40989742a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceMarshaller.java
@@ -17,20 +17,25 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
+import org.opensaml.core.xml.io.MarshallingException;
 import org.w3c.dom.Element;
 
 /** A thread safe marshaller for {@link org.opensaml.soap.wsfed.EndPointReference} objects. */
 public class EndPointReferenceMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject fedObject, final Element domElement) {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject fedObject, final Element domElement) {
-
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceUnmarshaller.java
index 7f272211d..a40dc26e6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/EndPointReferenceUnmarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wsfed.Address;
 import org.opensaml.soap.wsfed.EndPointReference;
 import org.w3c.dom.Attr;
@@ -27,21 +30,22 @@ import org.w3c.dom.Attr;
 public class EndPointReferenceUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentSAMLObject, final XMLObject childSAMLObject) {
-        final EndPointReference endPointReference = (EndPointReference) parentSAMLObject;
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
+        final EndPointReference endPointReference = (EndPointReference) parentXMLObject;
 
-        if (childSAMLObject instanceof Address) {
-            endPointReference.setAddress((Address) childSAMLObject);
+        if (childXMLObject instanceof Address) {
+            endPointReference.setAddress((Address) childXMLObject);
         }
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject fedObject, final Attr attribute) {
-
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject fedObject, final String content) {
+    protected void processElementContent(@Nonnull final XMLObject fedObject, @Nonnull final String content) {
 
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseBuilder.java
index 70378fad1..5ea5bc804 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsfed.RequestSecurityTokenResponse;
 import org.opensaml.soap.wsfed.WSFedConstants;
@@ -32,14 +35,14 @@ public class RequestSecurityTokenResponseBuilder extends AbstractXMLObjectBuilde
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponse buildObject() {
+    @Nonnull public RequestSecurityTokenResponse buildObject() {
         return buildObject(WSFedConstants.WSFED11P_NS, RequestSecurityTokenResponse.DEFAULT_ELEMENT_LOCAL_NAME,
                 WSFedConstants.WSFED1P_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponse buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestSecurityTokenResponse buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestSecurityTokenResponseImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseImpl.java
index cdbeccc7a..6d22fb7cb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseImpl.java
@@ -18,9 +18,11 @@
 package org.opensaml.soap.wsfed.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.XMLObjectChildrenList;
@@ -28,14 +30,16 @@ import org.opensaml.soap.wsfed.AppliesTo;
 import org.opensaml.soap.wsfed.RequestSecurityTokenResponse;
 import org.opensaml.soap.wsfed.RequestedSecurityToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /** Implementation of the {@link RequestSecurityTokenResponse} object. */
 public class RequestSecurityTokenResponseImpl extends AbstractXMLObject implements RequestSecurityTokenResponse {
 
     /** List of all the request security tokens. */
-    private final XMLObjectChildrenList<RequestedSecurityToken> requestedSecurityTokens;
+    @Nonnull private final XMLObjectChildrenList<RequestedSecurityToken> requestedSecurityTokens;
 
     /** Entity to whom the tokens apply. */
-    private AppliesTo appliesTo;
+    @Nullable private AppliesTo appliesTo;
 
     /**
      * Constructor.
@@ -44,34 +48,36 @@ public class RequestSecurityTokenResponseImpl extends AbstractXMLObject implemen
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    RequestSecurityTokenResponseImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    RequestSecurityTokenResponseImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         requestedSecurityTokens = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<RequestedSecurityToken> getRequestedSecurityToken() {
+    @Nonnull public List<RequestedSecurityToken> getRequestedSecurityToken() {
         return requestedSecurityTokens;
     }
 
     /** {@inheritDoc} */
-    public AppliesTo getAppliesTo() {
+    @Nullable public AppliesTo getAppliesTo() {
         return appliesTo;
     }
 
     /** {@inheritDoc} */
-    public void setAppliesTo(final AppliesTo newappliesTo) {
+    public void setAppliesTo(@Nullable final AppliesTo newappliesTo) {
         this.appliesTo = prepareForAssignment(this.appliesTo, newappliesTo);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>(1 + requestedSecurityTokens.size());
 
         children.addAll(requestedSecurityTokens);
-        children.add(appliesTo);
+        if (appliesTo != null) {
+            children.add(appliesTo);
+        }
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseMarshaller.java
index f0b26fb05..bbb057503 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseMarshaller.java
@@ -17,20 +17,25 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
+import org.opensaml.core.xml.io.MarshallingException;
 import org.w3c.dom.Element;
 
 /** A thread safe marshaller for {@link org.opensaml.soap.wsfed.RequestSecurityTokenResponse} objects. */
 public class RequestSecurityTokenResponseMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject fedObject, final Element domElement) {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject fedObject, final Element domElement) {
-
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseUnmarshaller.java
index a64b49de9..cd89ceebc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestSecurityTokenResponseUnmarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wsfed.AppliesTo;
 import org.opensaml.soap.wsfed.RequestSecurityTokenResponse;
 import org.opensaml.soap.wsfed.RequestedSecurityToken;
@@ -28,23 +31,24 @@ import org.w3c.dom.Attr;
 public class RequestSecurityTokenResponseUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentSAMLObject, final XMLObject childSAMLObject) {
-        final RequestSecurityTokenResponse response = (RequestSecurityTokenResponse) parentSAMLObject;
-
-        if (childSAMLObject instanceof RequestedSecurityToken) {
-            response.getRequestedSecurityToken().add((RequestedSecurityToken) childSAMLObject);
-        } else if (childSAMLObject instanceof AppliesTo) {
-            response.setAppliesTo((AppliesTo) childSAMLObject);
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
+        final RequestSecurityTokenResponse response = (RequestSecurityTokenResponse) parentXMLObject;
+
+        if (childXMLObject instanceof RequestedSecurityToken) {
+            response.getRequestedSecurityToken().add((RequestedSecurityToken) childXMLObject);
+        } else if (childXMLObject instanceof AppliesTo) {
+            response.setAppliesTo((AppliesTo) childXMLObject);
         }
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject fedObject, final Attr attribute) {
-
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject fedObject, final String content) {
+    protected void processElementContent(@Nonnull final XMLObject fedObject, @Nonnull final String content) {
 
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenBuilder.java
index b78e24a4a..ceeeb17bd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wsfed.RequestedSecurityToken;
 import org.opensaml.soap.wsfed.WSFedConstants;
@@ -26,20 +29,15 @@ import org.opensaml.soap.wsfed.WSFedObjectBuilder;
 public class RequestedSecurityTokenBuilder extends AbstractXMLObjectBuilder<RequestedSecurityToken> implements
         WSFedObjectBuilder<RequestedSecurityToken> {
 
-    /** Constructor. */
-    public RequestedSecurityTokenBuilder() {
-
-    }
-
     /** {@inheritDoc} */
-    public RequestedSecurityToken buildObject() {
+    @Nonnull public RequestedSecurityToken buildObject() {
         return buildObject(WSFedConstants.WSFED11P_NS, RequestedSecurityToken.DEFAULT_ELEMENT_LOCAL_NAME,
                 WSFedConstants.WSFED1P_PREFIX);
     }
 
     /** {@inheritDoc} */
-    public RequestedSecurityToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedSecurityToken buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedSecurityTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenImpl.java
index 3b0036b99..24663d72a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenImpl.java
@@ -21,6 +21,9 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.XMLObjectChildrenList;
@@ -30,7 +33,7 @@ import org.opensaml.soap.wsfed.RequestedSecurityToken;
 public class RequestedSecurityTokenImpl extends AbstractXMLObject implements RequestedSecurityToken {
 
     /** List of all the security tokens. */
-    private final XMLObjectChildrenList<XMLObject> tokens;
+    @Nonnull private final XMLObjectChildrenList<XMLObject> tokens;
 
     /**
      * Constructor.
@@ -39,14 +42,14 @@ public class RequestedSecurityTokenImpl extends AbstractXMLObject implements Req
      * @param elementLocalName the local name of the XML element this Object represents
      * @param namespacePrefix the prefix for the given namespace
      */
-    public RequestedSecurityTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedSecurityTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         tokens = new XMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getSecurityTokens() {
+    @Nonnull public List<XMLObject> getSecurityTokens() {
         return tokens;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenMarshaller.java
index fbb0b4880..5aae84505 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenMarshaller.java
@@ -17,20 +17,25 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
+import org.opensaml.core.xml.io.MarshallingException;
 import org.w3c.dom.Element;
 
 /** A thread safe marshaller for {@link org.opensaml.soap.wsfed.RequestedSecurityToken} objects. */
 public class RequestedSecurityTokenMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject fedObject, final Element domElement) {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject fedObject, final Element domElement) {
-
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
+
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenUnmarshaller.java
index e88adc678..7b404ec94 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wsfed/impl/RequestedSecurityTokenUnmarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wsfed.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wsfed.RequestedSecurityToken;
 import org.w3c.dom.Attr;
 
@@ -26,18 +29,19 @@ import org.w3c.dom.Attr;
 public class RequestedSecurityTokenUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentSAMLObject, final XMLObject childSAMLObject) {
-        final RequestedSecurityToken requestedSecurityToken = (RequestedSecurityToken) parentSAMLObject;
-        requestedSecurityToken.getSecurityTokens().add(childSAMLObject);
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
+        final RequestedSecurityToken requestedSecurityToken = (RequestedSecurityToken) parentXMLObject;
+        requestedSecurityToken.getSecurityTokens().add(childXMLObject);
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject fedObject, final Attr attribute) {
-
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject fedObject, final String content) {
+    protected void processElementContent(@Nonnull final XMLObject fedObject, @Nonnull final String content) {
 
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObject.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObject.java
index a66939010..6ef637c98 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObject.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObject.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.soap.wspolicy.WSPolicyObject;
 
@@ -33,8 +36,8 @@ public abstract class AbstractWSPolicyObject extends AbstractXMLObject implement
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public AbstractWSPolicyObject(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AbstractWSPolicyObject(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectBuilder.java
index 9440cd460..51d75147d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectBuilder.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wspolicy.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wspolicy.WSPolicyObject;
 import org.opensaml.soap.wspolicy.WSPolicyObjectBuilder;
@@ -31,5 +33,5 @@ public abstract class AbstractWSPolicyObjectBuilder<T extends WSPolicyObject>
         extends AbstractXMLObjectBuilder<T> implements WSPolicyObjectBuilder<T> {
 
     /** {@inheritDoc} */
-    public abstract T buildObject();
+    @Nonnull public abstract T buildObject();
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectMarshaller.java
index 7261490c5..f85243ea2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -28,13 +30,13 @@ import org.w3c.dom.Element;
 public abstract class AbstractWSPolicyObjectMarshaller extends AbstractXMLObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
-
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
-
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectUnmarshaller.java
index 78b88bcdb..9ba643f1b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AbstractWSPolicyObjectUnmarshaller.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * An abstract unmarshaller implementation for XMLObjects from WS-Policy.
  */
@@ -32,28 +35,24 @@ public abstract class AbstractWSPolicyObjectUnmarshaller extends AbstractXMLObje
     /**
      * Logger.
      */
-    private final Logger log = LoggerFactory.getLogger(AbstractWSPolicyObjectUnmarshaller.class);
-
-    /** Constructor.  */
-    protected AbstractWSPolicyObjectUnmarshaller() {
-        super();
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractWSPolicyObjectUnmarshaller.class);
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         log.warn("{} ignoring unknown child element {}", parentXMLObject.getElementQName().getLocalPart(),
                 childXMLObject.getElementQName().getLocalPart());
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         log.warn("{} ignoring unknown attribute {}", xmlObject.getElementQName().getLocalPart(), attribute
                 .getLocalName());
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         log.warn("{} ignoring unknown element content: {}", xmlObject.getElementQName().getLocalPart(), elementContent);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllBuilder.java
index ccc344962..5a60437b1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.All;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wspolicy.All;
 public class AllBuilder extends AbstractWSPolicyObjectBuilder<All> {
 
     /** {@inheritDoc} */
-    public All buildObject() {
+    @Nonnull public All buildObject() {
         return buildObject(All.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public All buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public All buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AllImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllImpl.java
index 5afa3b7fa..7043ae8e9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AllImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.All;
 
 /**
@@ -32,7 +35,8 @@ public class AllImpl extends OperatorContentTypeImpl implements All {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    protected AllImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected AllImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToBuilder.java
index 4d4c285c3..8b6b7554e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.AppliesTo;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wspolicy.AppliesTo;
 public class AppliesToBuilder extends AbstractWSPolicyObjectBuilder<AppliesTo> {
 
     /** {@inheritDoc} */
-    public AppliesTo buildObject() {
+    @Nonnull public AppliesTo buildObject() {
         return buildObject(AppliesTo.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public AppliesTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public AppliesTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AppliesToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToImpl.java
index 3809fdf07..423e06cb3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToImpl.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,10 +37,10 @@ import org.opensaml.soap.wspolicy.AppliesTo;
 public class AppliesToImpl extends AbstractWSPolicyObject implements AppliesTo {
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -47,24 +49,26 @@ public class AppliesToImpl extends AbstractWSPolicyObject implements AppliesTo {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    protected AppliesToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected AppliesToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToMarshaller.java
index 0c712bdac..12f524ea8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class AppliesToMarshaller extends AbstractWSPolicyObjectMarshaller {
     
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AppliesTo at = (AppliesTo) xmlObject;
         XMLObjectSupport.marshallAttributeMap(at.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToUnmarshaller.java
index 5dc0a81e2..d78ff6f8f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/AppliesToUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,14 +32,15 @@ import org.w3c.dom.Attr;
 public class AppliesToUnmarshaller extends AbstractWSPolicyObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AppliesTo at = (AppliesTo) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(at.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final AppliesTo at = (AppliesTo) parentXMLObject;
         at.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneBuilder.java
index a961073f3..c293d08eb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.ExactlyOne;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wspolicy.ExactlyOne;
 public class ExactlyOneBuilder extends AbstractWSPolicyObjectBuilder<ExactlyOne> {
 
     /** {@inheritDoc} */
-    public ExactlyOne buildObject() {
+    @Nonnull public ExactlyOne buildObject() {
         return buildObject(ExactlyOne.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ExactlyOne buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ExactlyOne buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ExactlyOneImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneImpl.java
index 70a07179d..43209ae6a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/ExactlyOneImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.ExactlyOne;
 
 /**
@@ -32,7 +35,8 @@ public class ExactlyOneImpl extends OperatorContentTypeImpl implements ExactlyOn
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    protected ExactlyOneImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected ExactlyOneImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeImpl.java
index 0bdcf7cbe..534927898 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -31,13 +31,16 @@ import org.opensaml.soap.wspolicy.OperatorContentType;
 import org.opensaml.soap.wspolicy.Policy;
 import org.opensaml.soap.wspolicy.PolicyReference;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * OperatorContentTypeImpl.
  */
+ at SuppressWarnings("unchecked")
 public class OperatorContentTypeImpl extends AbstractWSPolicyObject implements OperatorContentType {
     
     /** All child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> xmlObjects;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> xmlObjects;
 
     /**
      * Constructor.
@@ -46,47 +49,45 @@ public class OperatorContentTypeImpl extends AbstractWSPolicyObject implements O
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public OperatorContentTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public OperatorContentTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         xmlObjects = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<All> getAlls() {
+    @Nonnull public List<All> getAlls() {
         return (List<All>) xmlObjects.subList(All.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<ExactlyOne> getExactlyOnes() {
+    @Nonnull public List<ExactlyOne> getExactlyOnes() {
         return (List<ExactlyOne>) xmlObjects.subList(ExactlyOne.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<Policy> getPolicies() {
+    @Nonnull public List<Policy> getPolicies() {
         return (List<Policy>) xmlObjects.subList(Policy.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<PolicyReference> getPolicyReferences() {
+    @Nonnull public List<PolicyReference> getPolicyReferences() {
         return (List<PolicyReference>) xmlObjects.subList(PolicyReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getXMLObjects() {
+    @Nonnull public List<XMLObject> getXMLObjects() {
         return xmlObjects;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getXMLObjects(final QName typeOrName) {
+    @Nonnull public List<XMLObject> getXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) xmlObjects.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(xmlObjects);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(xmlObjects);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeUnmarshaller.java
index 71a8eb59d..687877efd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/OperatorContentTypeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wspolicy.OperatorContentType;
@@ -27,8 +29,8 @@ import org.opensaml.soap.wspolicy.OperatorContentType;
 public class OperatorContentTypeUnmarshaller extends AbstractWSPolicyObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject) 
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final OperatorContentType oct = (OperatorContentType) parentXMLObject;
         oct.getXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentBuilder.java
index fad76f842..e77ba01a5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.PolicyAttachment;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wspolicy.PolicyAttachment;
 public class PolicyAttachmentBuilder extends AbstractWSPolicyObjectBuilder<PolicyAttachment> {
 
     /** {@inheritDoc} */
-    public PolicyAttachment buildObject() {
+    @Nonnull public PolicyAttachment buildObject() {
         return buildObject(PolicyAttachment.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public PolicyAttachment buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public PolicyAttachment buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new PolicyAttachmentImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentImpl.java
index c0c494fdb..d37a0324c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wspolicy.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -31,22 +32,25 @@ import org.opensaml.soap.wspolicy.Policy;
 import org.opensaml.soap.wspolicy.PolicyAttachment;
 import org.opensaml.soap.wspolicy.PolicyReference;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * PolicyAttachmentImpl.
  */
+ at SuppressWarnings("unchecked")
 public class PolicyAttachmentImpl extends AbstractWSPolicyObject implements PolicyAttachment {
     
     /** AppliesTo Child element. */
-    private AppliesTo appliesTo;
+    @Nullable private AppliesTo appliesTo;
     
     /** Policy and PolicyReference children. */
-    private IndexedXMLObjectChildrenList<XMLObject> policiesAndReferences;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> policiesAndReferences;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -55,8 +59,8 @@ public class PolicyAttachmentImpl extends AbstractWSPolicyObject implements Poli
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public PolicyAttachmentImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public PolicyAttachmentImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         policiesAndReferences = new IndexedXMLObjectChildrenList<>(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
@@ -64,49 +68,50 @@ public class PolicyAttachmentImpl extends AbstractWSPolicyObject implements Poli
     }
 
     /** {@inheritDoc} */
-    public AppliesTo getAppliesTo() {
+    @Nullable public AppliesTo getAppliesTo() {
         return appliesTo;
     }
 
     /** {@inheritDoc} */
-    public void setAppliesTo(final AppliesTo newAppliesTo) {
+    public void setAppliesTo(@Nullable final AppliesTo newAppliesTo) {
         appliesTo = prepareForAssignment(appliesTo, newAppliesTo);
     }
 
     /** {@inheritDoc} */
-    public List<Policy> getPolicies() {
+    @Nonnull public List<Policy> getPolicies() {
         return (List<Policy>) policiesAndReferences.subList(Policy.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<PolicyReference> getPolicyReferences() {
+    @Nonnull public List<PolicyReference> getPolicyReferences() {
         return (List<PolicyReference>) policiesAndReferences.subList(PolicyReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (appliesTo != null) {
             children.add(appliesTo);
         }
         children.addAll(policiesAndReferences);
         children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+        
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentMarshaller.java
index f3c3fc1ee..30836358e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -29,7 +31,8 @@ import org.w3c.dom.Element;
 public class PolicyAttachmentMarshaller extends AbstractWSPolicyObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final PolicyAttachment pa = (PolicyAttachment) xmlObject;
         XMLObjectSupport.marshallAttributeMap(pa.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentUnmarshaller.java
index e4d4f3c38..189462a15 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyAttachmentUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,14 +34,15 @@ import org.w3c.dom.Attr;
 public class PolicyAttachmentUnmarshaller extends AbstractWSPolicyObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final PolicyAttachment pa = (PolicyAttachment) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(pa.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final PolicyAttachment pa = (PolicyAttachment) parentXMLObject;
         
         if (childXMLObject instanceof AppliesTo) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyBuilder.java
index 223a05b6c..e266d1ffd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.Policy;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wspolicy.Policy;
 public class PolicyBuilder extends AbstractWSPolicyObjectBuilder<Policy> {
 
     /** {@inheritDoc} */
-    public Policy buildObject() {
+    @Nonnull public Policy buildObject() {
         return buildObject(Policy.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Policy buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Policy buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new PolicyImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyImpl.java
index 096c67c56..bf8d358e1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wspolicy.Policy;
 import org.opensaml.soap.wssecurity.IdBearing;
@@ -28,13 +31,13 @@ import org.opensaml.soap.wssecurity.IdBearing;
 public class PolicyImpl extends OperatorContentTypeImpl implements Policy {
 
     /** The wsu:Id attribute value. */
-    private String id;
+    @Nullable private String id;
 
     /** The Name attribute value. */
-    private String name;
+    @Nullable private String name;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -43,29 +46,30 @@ public class PolicyImpl extends OperatorContentTypeImpl implements Policy {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    protected PolicyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected PolicyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
 
     /** {@inheritDoc} */
-    public String getName() {
+    @Nullable public String getName() {
         return name;
     }
 
     /** {@inheritDoc} */
-    public void setName(final String newName) {
+    public void setName(@Nullable final String newName) {
         name = prepareForAssignment(name, newName);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -73,8 +77,8 @@ public class PolicyImpl extends OperatorContentTypeImpl implements Policy {
     }
     
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyMarshaller.java
index 0ebde540c..6c72e71ad 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,7 +34,8 @@ import org.w3c.dom.Element;
 public class PolicyMarshaller extends OperatorContentTypeMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Policy policy = (Policy) xmlObject;
         
         if (policy.getName() != null) {
@@ -47,7 +50,8 @@ public class PolicyMarshaller extends OperatorContentTypeMarshaller {
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(XMLObject xmlObject, Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(IdBearing.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceBuilder.java
index 9539f5c93..ac77ce3dd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wspolicy.PolicyReference;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wspolicy.PolicyReference;
 public class PolicyReferenceBuilder extends AbstractWSPolicyObjectBuilder<PolicyReference> {
 
     /** {@inheritDoc} */
-    public PolicyReference buildObject() {
+    @Nonnull public PolicyReference buildObject() {
         return buildObject(PolicyReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public PolicyReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public PolicyReference buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new PolicyReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceImpl.java
index 5aba2d44b..772c618d0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wspolicy.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wspolicy.PolicyReference;
@@ -30,16 +33,16 @@ import org.opensaml.soap.wspolicy.PolicyReference;
 public class PolicyReferenceImpl extends AbstractWSPolicyObject implements PolicyReference {
 
     /** URI attribute value. */
-    private String uri;
+    @Nullable private String uri;
 
     /** Digest attribute value. */
-    private String digest;
+    @Nullable private String digest;
 
     /** DigestAlgorithm attribute value. */
-    private String digestAlgorithm;
+    @Nullable private String digestAlgorithm;
 
     /** xs:anyAttribute attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -48,48 +51,49 @@ public class PolicyReferenceImpl extends AbstractWSPolicyObject implements Polic
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public PolicyReferenceImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public PolicyReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getDigest() {
+    @Nullable public String getDigest() {
         return digest;
     }
 
     /** {@inheritDoc} */
-    public String getDigestAlgorithm() {
+    @Nullable public String getDigestAlgorithm() {
         return digestAlgorithm;
     }
 
     /** {@inheritDoc} */
-    public String getURI() {
+    @Nullable public String getURI() {
         return uri;
     }
 
     /** {@inheritDoc} */
-    public void setDigest(final String newDigest) {
+    public void setDigest(@Nullable final String newDigest) {
         digest = prepareForAssignment(digest, newDigest);
     }
 
     /** {@inheritDoc} */
-    public void setDigestAlgorithm(final String newDigestAlgorithm) {
+    public void setDigestAlgorithm(@Nullable final String newDigestAlgorithm) {
         digestAlgorithm = prepareForAssignment(digestAlgorithm, newDigestAlgorithm);
     }
 
     /** {@inheritDoc} */
-    public void setURI(final String newURI) {
+    public void setURI(@Nullable final String newURI) {
         uri = prepareForAssignment(uri, newURI);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceMarshaller.java
index 2e4bf3915..41116edb4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class PolicyReferenceMarshaller extends AbstractWSPolicyObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final PolicyReference pr = (PolicyReference) xmlObject;
         
         if (pr.getURI() != null) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceUnmarshaller.java
index 8872703c6..e0a4b82cc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyReferenceUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -34,7 +35,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class PolicyReferenceUnmarshaller extends AbstractWSPolicyObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final PolicyReference pr = (PolicyReference) xmlObject;
 
         final QName uriName = new QName(PolicyReference.URI_ATTRIB_NAME);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyUnmarshaller.java
index 4cb477590..78b2f49d8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wspolicy/impl/PolicyUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wspolicy.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -36,7 +37,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class PolicyUnmarshaller extends OperatorContentTypeUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Policy policy = (Policy) xmlObject;
         
         final QName nameQName = new QName(Policy.NAME_ATTRIB_NAME);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObject.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObject.java
index c49654104..844190765 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObject.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObject.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wssecurity.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wssecurity.WSSecurityObject;
@@ -35,8 +38,8 @@ public abstract class AbstractWSSecurityObject extends AbstractXMLObject impleme
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AbstractWSSecurityObject(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AbstractWSSecurityObject(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectBuilder.java
index 2e6184769..c99fbb8ef 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectBuilder.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wssecurity.WSSecurityObject;
 import org.opensaml.soap.wssecurity.WSSecurityObjectBuilder;
@@ -32,6 +34,5 @@ public abstract class AbstractWSSecurityObjectBuilder<WSSecurityObjectType exten
         WSSecurityObjectBuilder<WSSecurityObjectType> {
 
     /** {@inheritDoc} */
-    @Override
-    public abstract WSSecurityObjectType buildObject();
+    @Nonnull public abstract WSSecurityObjectType buildObject();
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectMarshaller.java
index 26fb9e2f0..79f2e5c58 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
@@ -27,21 +29,14 @@ import org.w3c.dom.Element;
  */
 public abstract class AbstractWSSecurityObjectMarshaller extends AbstractXMLObjectMarshaller {
 
-    /**
-     * Constructor.
-     */
-    protected AbstractWSSecurityObjectMarshaller() {
-        super();
-    }
-
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
-
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
-
     }
-}
+
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectUnmarshaller.java
index e640325cd..8d8c66949 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AbstractWSSecurityObjectUnmarshaller.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * An abstract unmarshaller implementation for XMLObjects from WS-Security.
  */
@@ -32,30 +35,24 @@ public abstract class AbstractWSSecurityObjectUnmarshaller extends AbstractXMLOb
     /**
      * Logger.
      */
-    private final Logger log = LoggerFactory.getLogger(AbstractWSSecurityObjectUnmarshaller.class);
-
-    /**
-     * Constructor.
-     */
-    protected AbstractWSSecurityObjectUnmarshaller() {
-        super();
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractWSSecurityObjectUnmarshaller.class);
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         log.warn("{} ignoring unknown child element {}", parentXMLObject.getElementQName().getLocalPart(),
                 childXMLObject.getElementQName().getLocalPart());
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         log.warn("{} ignoring unknown attribute {}", xmlObject.getElementQName().getLocalPart(), attribute
                 .getLocalName());
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         log.warn("{} ignoring unknown element content: {}", xmlObject.getElementQName().getLocalPart(), elementContent);
     }
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeImpl.java
index d9a95b947..dd24bd344 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wssecurity.impl;
 
 import java.time.Instant;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wssecurity.AttributedDateTime;
 import org.opensaml.soap.wssecurity.IdBearing;
@@ -32,16 +35,16 @@ import net.shibboleth.shared.xml.DOMTypeSupport;
 public class AttributedDateTimeImpl extends AbstractWSSecurityObject implements AttributedDateTime {
 
     /** DateTime object. */
-    private Instant dateTimeValue;
+    @Nullable private Instant dateTimeValue;
 
     /** String dateTime representation. */
-    private String stringValue;
+    @Nullable private String stringValue;
     
     /** wsu:id attribute value. */
-    private String id;
+    @Nullable private String id;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -50,41 +53,42 @@ public class AttributedDateTimeImpl extends AbstractWSSecurityObject implements
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AttributedDateTimeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AttributedDateTimeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public Instant getDateTime() {
+    @Nullable public Instant getDateTime() {
         return dateTimeValue;
     }
 
     /** {@inheritDoc} */
-    public void setDateTime(final Instant newDateTime) {
+    public void setDateTime(@Nullable final Instant newDateTime) {
         dateTimeValue = newDateTime;
-        stringValue = prepareForAssignment(stringValue, DOMTypeSupport.instantToString(dateTimeValue));
+        stringValue = prepareForAssignment(stringValue,
+                dateTimeValue != null ? DOMTypeSupport.instantToString(dateTimeValue) : null);
     }
 
     /** {@inheritDoc} */
-    public String getValue() {
+    @Nullable public String getValue() {
         return stringValue;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final String newValue) {
-        dateTimeValue = DOMTypeSupport.stringToInstant(newValue);
+    public void setValue(@Nullable final String newValue) {
+        dateTimeValue = newValue != null ? DOMTypeSupport.stringToInstant(newValue) : null;
         stringValue = prepareForAssignment(stringValue, newValue);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldID = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldID, id);
@@ -92,7 +96,7 @@ public class AttributedDateTimeImpl extends AbstractWSSecurityObject implements
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
     
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeMarshaller.java
index be9729b8e..13f8280e5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -34,7 +36,8 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class AttributedDateTimeMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedDateTime dateTime = (AttributedDateTime) xmlObject;
         
         if (!Strings.isNullOrEmpty(dateTime.getWSUId())) {
@@ -47,15 +50,15 @@ public class AttributedDateTimeMarshaller extends AbstractWSSecurityObjectMarsha
     }
 
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject,
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(AttributedDateTime.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final AttributedDateTime dateTime = (AttributedDateTime) xmlObject;
         ElementSupport.appendTextContent(domElement, dateTime.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeUnmarshaller.java
index 07017ea3e..2b9590056 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedDateTimeUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -36,7 +37,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class AttributedDateTimeUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
     
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedDateTime dateTime = (AttributedDateTime) xmlObject;
         
         final QName attrName =
@@ -50,7 +52,7 @@ public class AttributedDateTimeUnmarshaller extends AbstractWSSecurityObjectUnma
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         final AttributedDateTime dateTime = (AttributedDateTime) xmlObject;
         if (!Strings.isNullOrEmpty(elementContent)) {
             dateTime.setValue(elementContent);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringImpl.java
index a4c0aa2c2..01c93714f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wssecurity.AttributedString;
 import org.opensaml.soap.wssecurity.IdBearing;
@@ -27,13 +30,13 @@ import org.opensaml.soap.wssecurity.IdBearing;
 public class AttributedStringImpl extends AbstractWSSecurityObject implements AttributedString {
     
     /** The string value. */
-    private String value;
+    @Nullable private String value;
     
     /** The wsu:Id attribute value. */
-    private String id;
+    @Nullable private String id;
     
     /** The wildcard attributes. */
-    private AttributeMap attributes;
+    @Nonnull private final AttributeMap attributes;
     
     /**
      * Constructor.
@@ -42,29 +45,29 @@ public class AttributedStringImpl extends AbstractWSSecurityObject implements At
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AttributedStringImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AttributedStringImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         attributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getValue() {
+    @Nullable public String getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final String newValue) {
+    public void setValue(@Nullable final String newValue) {
         value = prepareForAssignment(value, newValue);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -72,7 +75,7 @@ public class AttributedStringImpl extends AbstractWSSecurityObject implements At
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return attributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringMarshaller.java
index 58522221d..41433a541 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -33,7 +35,8 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class AttributedStringMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedString attributedString = (AttributedString) xmlObject;
         
         if (!Strings.isNullOrEmpty(attributedString.getWSUId())) {
@@ -46,15 +49,15 @@ public class AttributedStringMarshaller extends AbstractWSSecurityObjectMarshall
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject,
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(AttributedString.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final AttributedString attributedString = (AttributedString) xmlObject;
         ElementSupport.appendTextContent(domElement, attributedString.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringUnmarshaller.java
index fdb82ce5f..f33a7c80c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedStringUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -33,7 +34,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class AttributedStringUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedString attributedString = (AttributedString) xmlObject;
         
         final QName attribQName = 
@@ -47,7 +49,7 @@ public class AttributedStringUnmarshaller extends AbstractWSSecurityObjectUnmars
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         final AttributedString attributedString = (AttributedString) xmlObject;
         attributedString.setValue(elementContent);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIImpl.java
index 8da7c39b5..a4ac15e69 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wssecurity.AttributedURI;
@@ -28,10 +31,10 @@ import org.opensaml.soap.wssecurity.IdBearing;
 public class AttributedURIImpl extends XSURIImpl implements AttributedURI {
     
     /** The wsu:Id attribute value. */
-    private String id;
+    @Nullable private String id;
     
     /** The wildcard attributes. */
-    private AttributeMap attributes;
+    @Nonnull private final AttributeMap attributes;
     
     /**
      * Constructor.
@@ -40,18 +43,19 @@ public class AttributedURIImpl extends XSURIImpl implements AttributedURI {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AttributedURIImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AttributedURIImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         attributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -59,7 +63,7 @@ public class AttributedURIImpl extends XSURIImpl implements AttributedURI {
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return attributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIMarshaller.java
index 15d108a2e..25fb853cd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.impl.XSURIMarshaller;
@@ -32,7 +34,8 @@ import com.google.common.base.Strings;
 public class AttributedURIMarshaller extends XSURIMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final AttributedURI attributedURI = (AttributedURI) xmlObject;
         
         if (!Strings.isNullOrEmpty(attributedURI.getWSUId())) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIUnmarshaller.java
index bd09dc056..a170dc9ef 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/AttributedURIUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -34,7 +35,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class AttributedURIUnmarshaller extends XSURIUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final AttributedURI attributedURI = (AttributedURI) xmlObject;
         
         final QName attribQName = 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenBuilder.java
index 00d5b9b07..5435b5f31 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.BinarySecurityToken;
 
 /**
@@ -25,13 +28,13 @@ import org.opensaml.soap.wssecurity.BinarySecurityToken;
 public class BinarySecurityTokenBuilder extends AbstractWSSecurityObjectBuilder<BinarySecurityToken> {
 
     /** {@inheritDoc} */
-    public BinarySecurityToken buildObject() {
+    @Nonnull public BinarySecurityToken buildObject() {
         return buildObject(BinarySecurityToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public BinarySecurityToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public BinarySecurityToken buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new BinarySecurityTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenImpl.java
index 187103817..911f53afe 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.BinarySecurityToken;
 
 /**
@@ -25,7 +28,7 @@ import org.opensaml.soap.wssecurity.BinarySecurityToken;
 public class BinarySecurityTokenImpl extends EncodedStringImpl implements BinarySecurityToken {
 
     /** wsse:BinarySecurityToken/@ValueType attribute. */
-    private String valueType;
+    @Nullable private String valueType;
 
     /**
      * Constructor. Default EncodingType is <code>BinarySecurityToken.ENCODINGTYPE_BASE64_BINARY</code>
@@ -34,20 +37,20 @@ public class BinarySecurityTokenImpl extends EncodedStringImpl implements Binary
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public BinarySecurityTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public BinarySecurityTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         // default encoding type
         setEncodingType(BinarySecurityToken.ENCODING_TYPE_BASE64_BINARY);
     }
 
     /** {@inheritDoc} */
-    public String getValueType() {
+    @Nullable public String getValueType() {
         return valueType;
     }
 
     /** {@inheritDoc} */
-    public void setValueType(final String newValueType) {
+    public void setValueType(@Nullable final String newValueType) {
         valueType = prepareForAssignment(valueType, newValueType);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenMarshaller.java
index d926e8bf0..70af69206 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.BinarySecurityToken;
@@ -30,7 +32,8 @@ import com.google.common.base.Strings;
 public class BinarySecurityTokenMarshaller extends EncodedStringMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final BinarySecurityToken token = (BinarySecurityToken) xmlObject;
         if (!Strings.isNullOrEmpty(token.getValueType())) {
             domElement.setAttributeNS(null, BinarySecurityToken.ENCODING_TYPE_ATTRIB_NAME, token.getValueType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenUnmarshaller.java
index 688fe1b19..fad73f2a7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/BinarySecurityTokenUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.BinarySecurityToken;
@@ -28,7 +30,8 @@ import org.w3c.dom.Attr;
 public class BinarySecurityTokenUnmarshaller extends EncodedStringUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final BinarySecurityToken token = (BinarySecurityToken) xmlObject;
         if (BinarySecurityToken.VALUE_TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
             token.setValueType(attribute.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedBuilder.java
index 3c3ea88df..21ef6df40 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Created;
 
 /**
@@ -25,26 +28,16 @@ import org.opensaml.soap.wssecurity.Created;
  */
 public class CreatedBuilder extends AbstractWSSecurityObjectBuilder<Created> {
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opensaml.soap.wssecurity.impl.AbstractWSSecurityObjectBuilder#buildObject()
-     */
     @Override
-    public Created buildObject() {
+    @Nonnull public Created buildObject() {
         return buildObject(Created.ELEMENT_NAME);
     }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opensaml.xml.AbstractXMLObjectBuilder#buildObject(java.lang.String,
-     *      java.lang.String, java.lang.String)
-     */
+    
+    /** {@inheritDoc} */
     @Override
-    public Created buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public Created buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new CreatedImpl(namespaceURI, localName, namespacePrefix);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedImpl.java
index b8016041e..497aff8ed 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/CreatedImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Created;
 
 /**
@@ -32,7 +35,8 @@ public class CreatedImpl extends AttributedDateTimeImpl implements Created {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public CreatedImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public CreatedImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedBuilder.java
index 5bcb8bc50..5495ccac2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Embedded;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Embedded;
 public class EmbeddedBuilder extends AbstractWSSecurityObjectBuilder<Embedded> {
 
     /** {@inheritDoc} */
-    public Embedded buildObject() {
+    @Nonnull public Embedded buildObject() {
         return buildObject(Embedded.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Embedded buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Embedded buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EmbeddedImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedImpl.java
index 3498481ff..22443844d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +28,8 @@ import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wssecurity.Embedded;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * EmbeddedImpl is the concrete implementation of {@link Embedded}.
  * 
@@ -35,13 +37,13 @@ import org.opensaml.soap.wssecurity.Embedded;
 public class EmbeddedImpl extends AbstractWSSecurityObject implements Embedded {
 
     /** wsse:Embedded/@wsse:ValueType attribute. */
-    private String valueType;
+    @Nullable private String valueType;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -50,45 +52,43 @@ public class EmbeddedImpl extends AbstractWSSecurityObject implements Embedded {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected EmbeddedImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected EmbeddedImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public String getValueType() {
+    @Nullable public String getValueType() {
         return valueType;
     }
 
     /** {@inheritDoc} */
-    public void setValueType(final String newValueType) {
+    public void setValueType(@Nullable final String newValueType) {
         valueType = prepareForAssignment(valueType, newValueType);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         
-        if (!getUnknownXMLObjects().isEmpty()) {
-            children.addAll(getUnknownXMLObjects());
-        }
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedMarshaller.java
index d8f080db7..4c0465e4e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,7 +34,8 @@ import com.google.common.base.Strings;
 public class EmbeddedMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Embedded embedded = (Embedded) xmlObject;
         if (!Strings.isNullOrEmpty(embedded.getValueType())) {
             domElement.setAttributeNS(null, Embedded.VALUE_TYPE_ATTRIB_NAME, embedded.getValueType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedUnmarshaller.java
index 6a300f200..98b6e2c3f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EmbeddedUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Attr;
 public class EmbeddedUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Embedded embedded = (Embedded) xmlObject;
         final String attrName = attribute.getLocalName();
         if (Embedded.VALUE_TYPE_ATTRIB_NAME.equals(attrName)) {
@@ -41,8 +44,8 @@ public class EmbeddedUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Embedded embedded = (Embedded) parentXMLObject;
         embedded.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringImpl.java
index 7f18650b4..4b243a1e0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.EncodedString;
 
 /**
@@ -25,7 +28,7 @@ import org.opensaml.soap.wssecurity.EncodedString;
 public class EncodedStringImpl extends AttributedStringImpl implements EncodedString {
     
     /** The encodingType attribute value. */
-    private String encodingType;
+    @Nullable private String encodingType;
 
     /**
      * Constructor.
@@ -34,17 +37,18 @@ public class EncodedStringImpl extends AttributedStringImpl implements EncodedSt
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public EncodedStringImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public EncodedStringImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getEncodingType() {
+    @Nullable public String getEncodingType() {
         return encodingType;
     }
 
     /** {@inheritDoc} */
-    public void setEncodingType(final String newEncodingType) {
+    public void setEncodingType(@Nullable final String newEncodingType) {
         encodingType = prepareForAssignment(encodingType, newEncodingType);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringMarshaller.java
index 53e64f1e0..e9797f0ea 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.EncodedString;
@@ -30,7 +32,8 @@ import com.google.common.base.Strings;
 public class EncodedStringMarshaller extends AttributedStringMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final EncodedString encodedString = (EncodedString) xmlObject;
         if (!Strings.isNullOrEmpty(encodedString.getEncodingType())){
             domElement.setAttributeNS(null, EncodedString.ENCODING_TYPE_ATTRIB_NAME, encodedString.getEncodingType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringUnmarshaller.java
index c6f48b02a..07cd83c31 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncodedStringUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.EncodedString;
@@ -28,7 +30,8 @@ import org.w3c.dom.Attr;
 public class EncodedStringUnmarshaller extends AttributedStringUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final EncodedString encodedString= (EncodedString) xmlObject;
         if (EncodedString.ENCODING_TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
             encodedString.setEncodingType(attribute.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderBuilder.java
index c5db70125..bcb7ef08a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.EncryptedHeader;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wssecurity.EncryptedHeader;
 public class EncryptedHeaderBuilder extends AbstractWSSecurityObjectBuilder<EncryptedHeader> {
 
     /** {@inheritDoc} */
-    public EncryptedHeader buildObject() {
+    @Nonnull public EncryptedHeader buildObject() {
         return buildObject(EncryptedHeader.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public EncryptedHeader buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public EncryptedHeader buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EncryptedHeaderImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderImpl.java
index 0fa25b30c..7d8f28e84 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderImpl.java
@@ -17,9 +17,11 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.soap11.ActorBearing;
@@ -30,7 +32,7 @@ import org.opensaml.soap.wssecurity.EncryptedHeader;
 import org.opensaml.soap.wssecurity.IdBearing;
 import org.opensaml.xmlsec.encryption.EncryptedData;
 
-import net.shibboleth.shared.collection.LazyList;
+import net.shibboleth.shared.collection.CollectionSupport;
 
 /**
  * Implementation of {@link EncryptedHeader}.
@@ -38,25 +40,25 @@ import net.shibboleth.shared.collection.LazyList;
 public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements EncryptedHeader {
     
     /** EncryptedData child element. */
-    private EncryptedData encryptedData;
+    @Nullable private EncryptedData encryptedData;
     
     /** The <code>@wsu:Id</code> atribute. */
-    private String wsuId;
+    @Nullable private String wsuId;
     
     /** The <code>@soap11:mustUnderstand</code> atribute. */
-    private XSBooleanValue soap11MustUnderstand;
+    @Nullable private XSBooleanValue soap11MustUnderstand;
     
     /** The <code>@soap11:actor</code> atribute. */
-    private String soap11Actor;
+    @Nullable private String soap11Actor;
     
     /** The <code>@soap12:mustUnderstand</code> atribute. */
-    private XSBooleanValue soap12MustUnderstand;
+    @Nullable private XSBooleanValue soap12MustUnderstand;
     
     /** The <code>@soap12:role</code> atribute. */
-    private String soap12Role;
+    @Nullable private String soap12Role;
     
     /** The <code>@soap12:relay</code> atribute. */
-    private XSBooleanValue soap12Relay;
+    @Nullable private XSBooleanValue soap12Relay;
     
     /**
      * Constructor.
@@ -65,27 +67,28 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public EncryptedHeaderImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public EncryptedHeaderImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public EncryptedData getEncryptedData() {
+    @Nullable public EncryptedData getEncryptedData() {
         return encryptedData;
     }
 
     /** {@inheritDoc} */
-    public void setEncryptedData(final EncryptedData newEncryptedData) {
+    public void setEncryptedData(@Nullable final EncryptedData newEncryptedData) {
         encryptedData = prepareForAssignment(encryptedData, newEncryptedData);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return wsuId;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = wsuId;
         wsuId = prepareForAssignment(wsuId, newId);
         registerOwnID(oldId, wsuId);
@@ -93,7 +96,7 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public Boolean isSOAP11MustUnderstand() {
+    @Nullable public Boolean isSOAP11MustUnderstand() {
         if (soap11MustUnderstand != null) {
             return soap11MustUnderstand.getValue();
         }
@@ -101,12 +104,12 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP11MustUnderstandXSBoolean() {
         return soap11MustUnderstand;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final Boolean newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final Boolean newMustUnderstand) {
         if (newMustUnderstand != null) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, 
                     new XSBooleanValue(newMustUnderstand, true));
@@ -118,25 +121,25 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11MustUnderstand(final XSBooleanValue newMustUnderstand) {
+    public void setSOAP11MustUnderstand(@Nullable final XSBooleanValue newMustUnderstand) {
             soap11MustUnderstand = prepareForAssignment(soap11MustUnderstand, newMustUnderstand);
             manageQualifiedAttributeNamespace(MustUnderstandBearing.SOAP11_MUST_UNDERSTAND_ATTR_NAME, 
                     soap11MustUnderstand != null);
     }
 
     /** {@inheritDoc} */
-    public String getSOAP11Actor() {
+    @Nullable public String getSOAP11Actor() {
         return soap11Actor;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP11Actor(final String newActor) {
+    public void setSOAP11Actor(@Nullable final String newActor) {
         soap11Actor = prepareForAssignment(soap11Actor, newActor);
         manageQualifiedAttributeNamespace(ActorBearing.SOAP11_ACTOR_ATTR_NAME, soap11Actor != null);
     }
     
     /** {@inheritDoc} */
-    public Boolean isSOAP12MustUnderstand() {
+    @Nullable public Boolean isSOAP12MustUnderstand() {
         if (soap12MustUnderstand != null) {
             return soap12MustUnderstand.getValue();
         }
@@ -144,12 +147,12 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isSOAP12MustUnderstandXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP12MustUnderstandXSBoolean() {
         return soap12MustUnderstand;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP12MustUnderstand(final Boolean newMustUnderstand) {
+    public void setSOAP12MustUnderstand(@Nullable final Boolean newMustUnderstand) {
         if (newMustUnderstand != null) {
             soap12MustUnderstand = prepareForAssignment(soap12MustUnderstand, 
                     new XSBooleanValue(newMustUnderstand, false));
@@ -160,24 +163,24 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public void setSOAP12MustUnderstand(final XSBooleanValue newMustUnderstand) {
+    public void setSOAP12MustUnderstand(@Nullable final XSBooleanValue newMustUnderstand) {
             soap12MustUnderstand = prepareForAssignment(soap12MustUnderstand, newMustUnderstand);
             manageQualifiedAttributeNamespace(SOAP12_MUST_UNDERSTAND_ATTR_NAME,  soap12MustUnderstand != null);
     }
 
     /** {@inheritDoc} */
-    public String getSOAP12Role() {
+    @Nullable public String getSOAP12Role() {
         return soap12Role;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP12Role(final String newRole) {
+    public void setSOAP12Role(@Nullable final String newRole) {
         soap12Role = prepareForAssignment(soap12Role, newRole);
         manageQualifiedAttributeNamespace(RoleBearing.SOAP12_ROLE_ATTR_NAME, soap12Role != null);
     }
 
     /** {@inheritDoc} */
-    public Boolean isSOAP12Relay() {
+    @Nullable public Boolean isSOAP12Relay() {
         if (soap12Relay != null) {
             return soap12Relay.getValue();
         }
@@ -185,12 +188,12 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isSOAP12RelayXSBoolean() {
+    @Nullable public XSBooleanValue isSOAP12RelayXSBoolean() {
         return soap12Relay;
     }
 
     /** {@inheritDoc} */
-    public void setSOAP12Relay(final Boolean newRelay) {
+    public void setSOAP12Relay(@Nullable final Boolean newRelay) {
         if (newRelay != null) {
             soap12Relay = prepareForAssignment(soap12Relay, 
                     new XSBooleanValue(newRelay, false));
@@ -201,18 +204,19 @@ public class EncryptedHeaderImpl extends AbstractWSSecurityObject implements Enc
     }
 
     /** {@inheritDoc} */
-    public void setSOAP12Relay(final XSBooleanValue newRelay) {
+    public void setSOAP12Relay(@Nullable final XSBooleanValue newRelay) {
             soap12Relay = prepareForAssignment(soap12Relay, newRelay);
             manageQualifiedAttributeNamespace(RelayBearing.SOAP12_RELAY_ATTR_NAME, soap12Relay != null);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final LazyList<XMLObject> children = new LazyList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
         if (encryptedData != null) {
-            children.add(encryptedData);
+            return CollectionSupport.singletonList(encryptedData);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderMarshaller.java
index 8bdcda85a..c48590fc9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/EncryptedHeaderMarshaller.java
@@ -17,8 +17,11 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.core.xml.util.XMLObjectSupport;
 import org.opensaml.soap.wssecurity.EncryptedHeader;
 import org.w3c.dom.Element;
@@ -29,43 +32,52 @@ import org.w3c.dom.Element;
 public class EncryptedHeaderMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final EncryptedHeader eh = (EncryptedHeader) xmlObject;
         
         if (eh.getWSUId() != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.WSU_ID_ATTR_NAME, 
                     eh.getWSUId(), domElement, true);
         }
-        if (eh.isSOAP11MustUnderstandXSBoolean() != null) {
+        
+        XSBooleanValue xsbool = eh.isSOAP11MustUnderstandXSBoolean();
+        if (xsbool != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.SOAP11_MUST_UNDERSTAND_ATTR_NAME, 
-                    eh.isSOAP11MustUnderstandXSBoolean().toString(), domElement, false);
+                    xsbool.toString(), domElement, false);
         }
+        
         if (eh.getSOAP11Actor() != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.SOAP11_ACTOR_ATTR_NAME, 
                     eh.getSOAP11Actor(), domElement, false);
         }
-        if (eh.isSOAP12MustUnderstandXSBoolean() != null) {
+        
+        xsbool = eh.isSOAP12MustUnderstandXSBoolean();
+        if (xsbool != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.SOAP12_MUST_UNDERSTAND_ATTR_NAME, 
-                    eh.isSOAP12MustUnderstandXSBoolean().toString(), domElement, false);
+                    xsbool.toString(), domElement, false);
         }
+        
         if (eh.getSOAP12Role() != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.SOAP12_ROLE_ATTR_NAME,
                     eh.getSOAP12Role(), domElement, false);
         }
-        if (eh.isSOAP12RelayXSBoolean() != null) {
+        
+        xsbool = eh.isSOAP12RelayXSBoolean();
+        if (xsbool != null) {
             XMLObjectSupport.marshallAttribute(EncryptedHeader.SOAP12_RELAY_ATTR_NAME, 
-                    eh.isSOAP12RelayXSBoolean().toString(), domElement, false);
+                    xsbool.toString(), domElement, false);
         }
         
         super.marshallAttributes(xmlObject, domElement);
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject,
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(EncryptedHeader.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresBuilder.java
index d9584a976..2c659a576 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Expires;
 
 /**
@@ -24,25 +27,15 @@ import org.opensaml.soap.wssecurity.Expires;
  */
 public class ExpiresBuilder extends AbstractWSSecurityObjectBuilder<Expires> {
 
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opensaml.soap.wssecurity.impl.AbstractWSSecurityObjectBuilder#buildObject()
-     */
+    /** {@inheritDoc} */
     @Override
-    public Expires buildObject() {
+    @Nonnull public Expires buildObject() {
         return buildObject(Expires.ELEMENT_NAME);
     }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.opensaml.xml.AbstractXMLObjectBuilder#buildObject(java.lang.String,
-     *      java.lang.String, java.lang.String)
-     */
-    @Override
-    public Expires buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    
+    /** {@inheritDoc} */
+    @Nonnull public Expires buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ExpiresImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresImpl.java
index eea1bce37..fab59642c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ExpiresImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Expires;
 
 /**
@@ -32,7 +35,8 @@ public class ExpiresImpl extends AttributedDateTimeImpl implements Expires {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public ExpiresImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ExpiresImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationBuilder.java
index 541ac70b0..d136d2a21 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Iteration;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Iteration;
 public class IterationBuilder extends AbstractWSSecurityObjectBuilder<Iteration> {
 
     /** {@inheritDoc} */
-    public Iteration buildObject() {
+    @Nonnull public Iteration buildObject() {
         return buildObject(Iteration.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Iteration buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Iteration buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new IterationImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationImpl.java
index 21cbf102e..2e27ebb1b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSIntegerImpl;
 import org.opensaml.soap.wssecurity.Iteration;
 
@@ -33,7 +36,8 @@ public class IterationImpl extends XSIntegerImpl implements Iteration {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public IterationImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public IterationImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationMarshaller.java
index c93ccd3d5..d8889c5f1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.Iteration;
@@ -32,12 +34,13 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class IterationMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final Iteration iteration = (Iteration) xmlObject;
         
-        if (iteration.getValue() != null) {
-            ElementSupport.appendTextContent(domElement, iteration.getValue().toString());
+        final Integer i = iteration.getValue();
+        if (i != null) {
+            ElementSupport.appendTextContent(domElement, i.toString());
         }
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationUnmarshaller.java
index 85e751cc1..5126c2f2b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/IterationUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wssecurity.Iteration;
 
@@ -28,7 +30,7 @@ import org.opensaml.soap.wssecurity.Iteration;
 public class IterationUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         final Iteration iteration = (Iteration) xmlObject;
         if (elementContent != null) {
             iteration.setValue(Integer.valueOf(elementContent));
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierBuilder.java
index 852868bc9..badce5448 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.KeyIdentifier;
 
 /**
@@ -25,12 +28,13 @@ import org.opensaml.soap.wssecurity.KeyIdentifier;
 public class KeyIdentifierBuilder extends AbstractWSSecurityObjectBuilder<KeyIdentifier> {
 
     /** {@inheritDoc} */
-    public KeyIdentifier buildObject() {
+    @Nonnull public KeyIdentifier buildObject() {
         return buildObject(KeyIdentifier.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public KeyIdentifier buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public KeyIdentifier buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new KeyIdentifierImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierImpl.java
index 96c7582a3..7279e0439 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierImpl.java
@@ -18,6 +18,9 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.KeyIdentifier;
 
 /**
@@ -26,7 +29,7 @@ import org.opensaml.soap.wssecurity.KeyIdentifier;
 public class KeyIdentifierImpl extends EncodedStringImpl implements KeyIdentifier {
 
     /** wsse:KeyIdentifier/@ValueType attribute. */
-    private String valueType;
+    @Nullable private String valueType;
 
     /**
      * Constructor.
@@ -35,17 +38,18 @@ public class KeyIdentifierImpl extends EncodedStringImpl implements KeyIdentifie
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public KeyIdentifierImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public KeyIdentifierImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getValueType() {
+    @Nullable public String getValueType() {
         return valueType;
     }
 
     /** {@inheritDoc} */
-    public void setValueType(final String newValueType) {
+    public void setValueType(@Nullable final String newValueType) {
         valueType = prepareForAssignment(valueType, newValueType);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierMarshaller.java
index 108053b55..881cb9571 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.KeyIdentifier;
@@ -32,7 +34,8 @@ import com.google.common.base.Strings;
 public class KeyIdentifierMarshaller extends EncodedStringMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final KeyIdentifier keyIdentifier = (KeyIdentifier) xmlObject;
         if (!Strings.isNullOrEmpty(keyIdentifier.getValueType())) {
             domElement.setAttributeNS(null, KeyIdentifier.VALUE_TYPE_ATTRIB_NAME, keyIdentifier.getValueType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierUnmarshaller.java
index 2e9f263f2..ab076563f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/KeyIdentifierUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.KeyIdentifier;
@@ -29,7 +31,8 @@ import org.w3c.dom.Attr;
 public class KeyIdentifierUnmarshaller extends EncodedStringUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final KeyIdentifier keyIdentifier = (KeyIdentifier) xmlObject;
         if (KeyIdentifier.VALUE_TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
             keyIdentifier.setValueType(attribute.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceBuilder.java
index f7470128f..145d35721 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Nonce;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Nonce;
 public class NonceBuilder extends AbstractWSSecurityObjectBuilder<Nonce> {
 
     /** {@inheritDoc} */
-    public Nonce buildObject() {
+    @Nonnull public Nonce buildObject() {
         return buildObject(Nonce.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Nonce buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Nonce buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new NonceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceImpl.java
index 30fa191c9..091361289 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/NonceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Nonce;
 
 /**
@@ -32,7 +35,8 @@ public class NonceImpl extends EncodedStringImpl implements Nonce {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public NonceImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public NonceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordBuilder.java
index 156cd2d52..e63e608f5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Password;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Password;
 public class PasswordBuilder extends AbstractWSSecurityObjectBuilder<Password> {
 
     /** {@inheritDoc} */
-    public Password buildObject() {
+    @Nonnull public Password buildObject() {
         return buildObject(Password.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Password buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Password buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new PasswordImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordImpl.java
index dacbee05b..8626f8937 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Password;
 
 /**
@@ -25,7 +28,7 @@ import org.opensaml.soap.wssecurity.Password;
 public class PasswordImpl extends AttributedStringImpl implements Password {
 
     /** wsse:Password/@Type attribute. */
-    private String type;
+    @Nullable private String type;
 
     /**
      * Constructor. Default Type attribute: <code>Password.TYPE_PASSWORD_TEXT</code>
@@ -34,19 +37,20 @@ public class PasswordImpl extends AttributedStringImpl implements Password {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public PasswordImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public PasswordImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         // set default type
         type = Password.TYPE_PASSWORD_TEXT;
     }
 
     /** {@inheritDoc} */
-    public String getType() {
+    @Nullable public String getType() {
         return type;
     }
 
     /** {@inheritDoc} */
-    public void setType(final String newType) {
+    public void setType(@Nullable final String newType) {
         type = prepareForAssignment(type, newType);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordMarshaller.java
index edab02b99..a6c290bd4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.Password;
@@ -30,7 +32,8 @@ import com.google.common.base.Strings;
 public class PasswordMarshaller extends AttributedStringMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Password password = (Password) xmlObject;
         if (!Strings.isNullOrEmpty(password.getType())) {
             domElement.setAttributeNS(null, Password.TYPE_ATTRIB_NAME, password.getType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordUnmarshaller.java
index 870ca7e17..33a0e5e96 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/PasswordUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.Password;
@@ -30,7 +32,8 @@ import org.w3c.dom.Attr;
 public class PasswordUnmarshaller extends AttributedStringUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Password password= (Password) xmlObject;
         if (Password.TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
             password.setType(attribute.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceBuilder.java
index 6ff324243..67aa18be5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Reference;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Reference;
 public class ReferenceBuilder extends AbstractWSSecurityObjectBuilder<Reference> {
 
     /** {@inheritDoc} */
-    public Reference buildObject() {
+    @Nonnull public Reference buildObject() {
         return buildObject(Reference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Reference buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Reference buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceImpl.java
index 72d66020d..761c798e2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wssecurity.Reference;
 
@@ -27,13 +30,13 @@ import org.opensaml.soap.wssecurity.Reference;
 public class ReferenceImpl extends AbstractWSSecurityObject implements Reference {
     
     /** wsse:Reference/@URI attribute. */
-    private String uri;
+    @Nullable private String uri;
 
     /** wsse:Reference/@ValueType attribute. */
-    private String valueType;
+    @Nullable private String valueType;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -42,33 +45,34 @@ public class ReferenceImpl extends AbstractWSSecurityObject implements Reference
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public ReferenceImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getURI() {
+    @Nullable public String getURI() {
         return uri;
     }
 
     /** {@inheritDoc} */
-    public void setURI(final String newURI) {
+    public void setURI(@Nullable final String newURI) {
         uri = prepareForAssignment(uri, newURI);
     }
 
     /** {@inheritDoc} */
-    public String getValueType() {
+    @Nullable public String getValueType() {
         return valueType;
     }
 
     /** {@inheritDoc} */
-    public void setValueType(final String newValueType) {
+    public void setValueType(@Nullable final String newValueType) {
         valueType = prepareForAssignment(valueType, newValueType);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceMarshaller.java
index 1f823e61d..37f1c6b5c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -33,7 +35,8 @@ import com.google.common.base.Strings;
 public class ReferenceMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Reference reference = (Reference) xmlObject;
         
         if (!Strings.isNullOrEmpty(reference.getURI())) {
@@ -45,7 +48,6 @@ public class ReferenceMarshaller extends AbstractWSSecurityObjectMarshaller {
         }
         
         XMLObjectSupport.marshallAttributeMap(reference.getUnknownAttributes(), domElement);
-        
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceUnmarshaller.java
index 6d0ffd75f..5ec98a792 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/ReferenceUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Attr;
 public class ReferenceUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Reference reference = (Reference) xmlObject;
         final String attrName = attribute.getLocalName();
         if (Reference.URI_ATTRIB_NAME.equals(attrName)) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltBuilder.java
index 78f5586ae..d194296e8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Salt;
 
 /**
@@ -25,12 +28,13 @@ import org.opensaml.soap.wssecurity.Salt;
 public class SaltBuilder extends AbstractWSSecurityObjectBuilder<Salt> {
 
     /** {@inheritDoc} */
-    public Salt buildObject() {
+    @Nonnull public Salt buildObject() {
         return buildObject(Salt.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Salt buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Salt buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SaltImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltImpl.java
index 82ae4ae59..2d8efc647 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
 import org.opensaml.soap.wssecurity.Salt;
 
@@ -33,7 +36,8 @@ public class SaltImpl extends XSBase64BinaryImpl implements Salt {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    protected SaltImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    protected SaltImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltMarshaller.java
index 1e613beb3..e4ad03e86 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wssecurity.Salt;
@@ -31,7 +33,7 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class SaltMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final Salt salt = (Salt) xmlObject;
         ElementSupport.appendTextContent(domElement, salt.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltUnmarshaller.java
index eacfde552..61eae7331 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SaltUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wssecurity.Salt;
 
@@ -27,7 +29,7 @@ import org.opensaml.soap.wssecurity.Salt;
 public class SaltUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         final Salt salt = (Salt) xmlObject;
         salt.setValue(elementContent);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityBuilder.java
index 1f30dd28b..753824820 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Security;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Security;
 public class SecurityBuilder extends AbstractWSSecurityObjectBuilder<Security> {
 
     /** {@inheritDoc} */
-    public Security buildObject() {
+    @Nonnull public Security buildObject() {
         return buildObject(Security.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Security buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Security buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SecurityImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityImpl.java
index 8685f19fe..2b8e63c13 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityImpl.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,10 +37,10 @@ import org.opensaml.soap.wssecurity.Security;
 public class SecurityImpl extends AbstractWSSecurityObject implements Security {
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -47,24 +49,26 @@ public class SecurityImpl extends AbstractWSSecurityObject implements Security {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public SecurityImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public SecurityImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityMarshaller.java
index e83566c28..671f60aa6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class SecurityMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Security security = (Security) xmlObject;
         XMLObjectSupport.marshallAttributeMap(security.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceBuilder.java
index 6a3b27a0c..0cca40af0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.SecurityTokenReference;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wssecurity.SecurityTokenReference;
 public class SecurityTokenReferenceBuilder extends AbstractWSSecurityObjectBuilder<SecurityTokenReference> {
 
     /** {@inheritDoc} */
-    public SecurityTokenReference buildObject() {
+    @Nonnull public SecurityTokenReference buildObject() {
         return buildObject(SecurityTokenReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SecurityTokenReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public SecurityTokenReference buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new SecurityTokenReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceImpl.java
index 87c5b5fa8..8b2432ad5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -30,6 +30,8 @@ import org.opensaml.soap.wssecurity.IdBearing;
 import org.opensaml.soap.wssecurity.SecurityTokenReference;
 import org.opensaml.soap.wssecurity.UsageBearing;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * SecurityTokenReferenceImpl.
  * 
@@ -37,16 +39,16 @@ import org.opensaml.soap.wssecurity.UsageBearing;
 public class SecurityTokenReferenceImpl extends AbstractWSSecurityObject implements SecurityTokenReference {
 
     /** The <wsu:Id> attribute value. */
-    private String id;
+    @Nullable private String id;
 
     /** List of <wsse:Usage> attribute values. */
-    private List<String> usages;
+    @Nullable private List<String> usages;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -55,33 +57,32 @@ public class SecurityTokenReferenceImpl extends AbstractWSSecurityObject impleme
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public SecurityTokenReferenceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public SecurityTokenReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
-        usages = new ArrayList<>();
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
     
 
     /** {@inheritDoc} */
-    public List<String> getWSSEUsages() {
+    @Nullable public List<String> getWSSEUsages() {
         return usages;
     }
 
     /** {@inheritDoc} */
-    public void setWSSEUsages(final List<String> newUsages) {
+    public void setWSSEUsages(@Nullable final List<String> newUsages) {
         usages = prepareForAssignment(usages, newUsages);
-        manageQualifiedAttributeNamespace(UsageBearing.WSSE_USAGE_ATTR_NAME, !usages.isEmpty());
+        manageQualifiedAttributeNamespace(UsageBearing.WSSE_USAGE_ATTR_NAME, usages != null && !usages.isEmpty());
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -90,28 +91,24 @@ public class SecurityTokenReferenceImpl extends AbstractWSSecurityObject impleme
 
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final List<XMLObject> children = new ArrayList<>();
-
-        if (!getUnknownXMLObjects().isEmpty()) {
-            children.addAll(getUnknownXMLObjects());
-        }
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceMarshaller.java
index 81d7be770..235a7f30c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityTokenReferenceMarshaller.java
@@ -19,6 +19,8 @@ package org.opensaml.soap.wssecurity.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -34,7 +36,8 @@ import com.google.common.base.Strings;
 public class SecurityTokenReferenceMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final SecurityTokenReference str = (SecurityTokenReference) xmlObject;
         
         if (!Strings.isNullOrEmpty(str.getWSUId())) {
@@ -51,7 +54,8 @@ public class SecurityTokenReferenceMarshaller extends AbstractWSSecurityObjectMa
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(XMLObject xmlObject, Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(SecurityTokenReference.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityUnmarshaller.java
index d81394199..024da024e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SecurityUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,14 +32,15 @@ import org.w3c.dom.Attr;
 public class SecurityUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Security security = (Security) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(security.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Security security = (Security) parentXMLObject;
         security.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationBuilder.java
index c52ad6dff..cd1ca9f61 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.SignatureConfirmation;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wssecurity.SignatureConfirmation;
 public class SignatureConfirmationBuilder extends AbstractWSSecurityObjectBuilder<SignatureConfirmation> {
 
     /** {@inheritDoc} */
-    public SignatureConfirmation buildObject() {
+    @Nonnull public SignatureConfirmation buildObject() {
         return buildObject(SignatureConfirmation.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SignatureConfirmation buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public SignatureConfirmation buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new SignatureConfirmationImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationImpl.java
index 3cd7dba6b..1fafc79e2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.IdBearing;
 import org.opensaml.soap.wssecurity.SignatureConfirmation;
 
@@ -26,10 +29,10 @@ import org.opensaml.soap.wssecurity.SignatureConfirmation;
 public class SignatureConfirmationImpl extends AbstractWSSecurityObject implements SignatureConfirmation {
     
     /** wsu:Id attribute value. */
-    private String id;
+    @Nullable private String id;
     
     /** the Value attribute value. */
-    private String value;
+    @Nullable private String value;
 
     /**
      * Constructor.
@@ -38,28 +41,28 @@ public class SignatureConfirmationImpl extends AbstractWSSecurityObject implemen
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public SignatureConfirmationImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public SignatureConfirmationImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getValue() {
+    @Nullable public String getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final String newValue) {
+    public void setValue(@Nullable final String newValue) {
         value = prepareForAssignment(value, newValue);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationMarshaller.java
index 8644619ec..ada2230c4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import com.google.common.base.Strings;
 public class SignatureConfirmationMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final SignatureConfirmation sc = (SignatureConfirmation) xmlObject;
         
         if (!Strings.isNullOrEmpty(sc.getWSUId())) {
@@ -43,8 +46,8 @@ public class SignatureConfirmationMarshaller extends AbstractWSSecurityObjectMar
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject, 
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(SignatureConfirmation.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationUnmarshaller.java
index b904b2b14..713c3eaa3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/SignatureConfirmationUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -32,7 +33,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class SignatureConfirmationUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final SignatureConfirmation sc = (SignatureConfirmation) xmlObject;
         
         final QName attrName =
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampBuilder.java
index b729379f3..10532bed4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Timestamp;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wssecurity.Timestamp;
 public class TimestampBuilder extends AbstractWSSecurityObjectBuilder<Timestamp> {
 
     /** {@inheritDoc} */
-    public Timestamp buildObject() {
+    @Nonnull public Timestamp buildObject() {
         return buildObject(Timestamp.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Timestamp buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Timestamp buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new TimestampImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampImpl.java
index f7d150e92..8a6e1cbc6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wssecurity.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -31,6 +32,8 @@ import org.opensaml.soap.wssecurity.Expires;
 import org.opensaml.soap.wssecurity.IdBearing;
 import org.opensaml.soap.wssecurity.Timestamp;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Concrete implementation of {@link org.opensaml.soap.wssecurity.Timestamp}.
  * 
@@ -38,19 +41,19 @@ import org.opensaml.soap.wssecurity.Timestamp;
 public class TimestampImpl extends AbstractWSSecurityObject implements Timestamp {
 
     /** wsu:Timestamp/@wsu:Id attribute. */
-    private String id;
+    @Nullable private String id;
 
     /** wsu:Timestamp/wsu:Created element. */
-    private Created created;
+    @Nullable private Created created;
 
     /** wsu:Timestamp/wsu:Expires element. */
-    private Expires expires;
+    @Nullable private Expires expires;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -59,39 +62,40 @@ public class TimestampImpl extends AbstractWSSecurityObject implements Timestamp
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public TimestampImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public TimestampImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public Created getCreated() {
+    @Nullable public Created getCreated() {
         return created;
     }
 
     /** {@inheritDoc} */
-    public Expires getExpires() {
+    @Nullable public Expires getExpires() {
         return expires;
     }
 
     /** {@inheritDoc} */
-    public void setCreated(final Created newCreated) {
+    public void setCreated(@Nullable final Created newCreated) {
         created = prepareForAssignment(created, newCreated);
     }
 
     /** {@inheritDoc} */
-    public void setExpires(final Expires newExpires) {
+    public void setExpires(@Nullable final Expires newExpires) {
         expires = prepareForAssignment(expires, newExpires);
     }
  
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -99,22 +103,23 @@ public class TimestampImpl extends AbstractWSSecurityObject implements Timestamp
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (created != null) {
             children.add(created);
@@ -122,11 +127,10 @@ public class TimestampImpl extends AbstractWSSecurityObject implements Timestamp
         if (expires != null) {
             children.add(expires);
         }
-        if (!getUnknownXMLObjects().isEmpty()) {
-            children.addAll(getUnknownXMLObjects());
-        }
+        
+        children.addAll(getUnknownXMLObjects());
 
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampMarshaller.java
index 52a96c02e..4016b3666 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,7 +34,8 @@ import com.google.common.base.Strings;
 public class TimestampMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Timestamp timestamp = (Timestamp) xmlObject;
         
         if (!Strings.isNullOrEmpty(timestamp.getWSUId())) {
@@ -43,8 +46,8 @@ public class TimestampMarshaller extends AbstractWSSecurityObjectMarshaller {
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject,
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(Timestamp.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampUnmarshaller.java
index caf92c539..803a1d121 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TimestampUnmarshaller.java
@@ -18,6 +18,7 @@
 package org.opensaml.soap.wssecurity.impl;
 
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -37,8 +38,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class TimestampUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Timestamp timestamp = (Timestamp) parentXMLObject;
         
         if (childXMLObject instanceof Created) {
@@ -51,7 +52,8 @@ public class TimestampUnmarshaller extends AbstractWSSecurityObjectUnmarshaller
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Timestamp timestamp = (Timestamp) xmlObject;
         
         final QName attrName =
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersBuilder.java
index ad50158e5..ca4f91de5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.TransformationParameters;
 
 /**
@@ -25,13 +28,13 @@ import org.opensaml.soap.wssecurity.TransformationParameters;
 public class TransformationParametersBuilder extends AbstractWSSecurityObjectBuilder<TransformationParameters> {
 
     /** {@inheritDoc} */
-    public TransformationParameters buildObject() {
+    @Nonnull public TransformationParameters buildObject() {
         return buildObject(TransformationParameters.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public TransformationParameters buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public TransformationParameters buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new TransformationParametersImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersImpl.java
index 4813f0b95..d4b98bfbf 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersImpl.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -35,10 +37,10 @@ import org.opensaml.soap.wssecurity.TransformationParameters;
 public class TransformationParametersImpl extends AbstractWSSecurityObject implements TransformationParameters {
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -47,25 +49,26 @@ public class TransformationParametersImpl extends AbstractWSSecurityObject imple
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public TransformationParametersImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public TransformationParametersImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersMarshaller.java
index 3211cac7d..1c7163d35 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class TransformationParametersMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final TransformationParameters tp = (TransformationParameters) xmlObject;
         XMLObjectSupport.marshallAttributeMap(tp.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersUnmarshaller.java
index 4a5cfa577..7cadcb953 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/TransformationParametersUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,14 +32,15 @@ import org.w3c.dom.Attr;
 public class TransformationParametersUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final TransformationParameters tp = (TransformationParameters) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(tp.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final TransformationParameters tp = (TransformationParameters) parentXMLObject;
         tp.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameBuilder.java
index be79ef5cd..392830af5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Username;
 
 /**
@@ -25,12 +28,13 @@ import org.opensaml.soap.wssecurity.Username;
 public class UsernameBuilder extends AbstractWSSecurityObjectBuilder<Username> {
 
     /** {@inheritDoc} */
-    public Username buildObject() {
+    @Nonnull public Username buildObject() {
         return buildObject(Username.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Username buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Username buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new UsernameImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameImpl.java
index db9c7b7a9..5e79df1c5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.Username;
 
 /**
@@ -31,7 +34,8 @@ public class UsernameImpl extends AttributedStringImpl implements Username {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the elements
      */
-    public UsernameImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public UsernameImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenBuilder.java
index 948fd53ee..9f5760ee2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wssecurity.UsernameToken;
 
 /**
@@ -26,12 +29,13 @@ public class UsernameTokenBuilder extends
         AbstractWSSecurityObjectBuilder<UsernameToken> {
 
     /** {@inheritDoc} */
-    public UsernameToken buildObject() {
+    @Nonnull public UsernameToken buildObject() {
         return buildObject(UsernameToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public UsernameToken buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public UsernameToken buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new UsernameTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenImpl.java
index 9ee08d0ce..4ae4b674b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wssecurity.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -30,22 +31,24 @@ import org.opensaml.soap.wssecurity.IdBearing;
 import org.opensaml.soap.wssecurity.Username;
 import org.opensaml.soap.wssecurity.UsernameToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * Implementation of {@link UsernameToken}.
  */
 public class UsernameTokenImpl extends AbstractWSSecurityObject implements UsernameToken {
 
     /** The <wsu:Id> attribute value. */
-    private String id;
+    @Nullable private String id;
 
     /** The <wsse:Username> child element. */
-    private Username username;
+    @Nullable private Username username;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -54,29 +57,30 @@ public class UsernameTokenImpl extends AbstractWSSecurityObject implements Usern
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public UsernameTokenImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public UsernameTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
  
     /** {@inheritDoc} */
-    public Username getUsername() {
+    @Nullable public Username getUsername() {
         return username;
     }
 
     /** {@inheritDoc} */
-    public void setUsername(final Username newUsername) {
+    public void setUsername(@Nullable final Username newUsername) {
         username = prepareForAssignment(username, newUsername);
     }
 
     /** {@inheritDoc} */
-    public String getWSUId() {
+    @Nullable public String getWSUId() {
         return id;
     }
 
     /** {@inheritDoc} */
-    public void setWSUId(final String newId) {
+    public void setWSUId(@Nullable final String newId) {
         final String oldId = id;
         id = prepareForAssignment(id, newId);
         registerOwnID(oldId, id);
@@ -84,31 +88,31 @@ public class UsernameTokenImpl extends AbstractWSSecurityObject implements Usern
     }
     
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (username != null) {
             children.add(username);
         }
         
-        if (!getUnknownXMLObjects().isEmpty()) {
-            children.addAll(getUnknownXMLObjects());
-        }
-        return Collections.unmodifiableList(children);
+        children.addAll(getUnknownXMLObjects());
+        
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenMarshaller.java
index a53ec290b..6f150a684 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import com.google.common.base.Strings;
 public class UsernameTokenMarshaller extends AbstractWSSecurityObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final UsernameToken usernameToken = (UsernameToken) xmlObject;
         
         if (!Strings.isNullOrEmpty(usernameToken.getWSUId())) {
@@ -44,8 +47,8 @@ public class UsernameTokenMarshaller extends AbstractWSSecurityObjectMarshaller
     }
     
     /** {@inheritDoc} */
-    protected void marshallAttributeIDness(final XMLObject xmlObject,
-            final Element domElement) throws MarshallingException {
+    protected void marshallAttributeIDness(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         XMLObjectSupport.marshallAttributeIDness(UsernameToken.WSU_ID_ATTR_NAME, domElement, true);
         
         super.marshallAttributeIDness(xmlObject, domElement);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenUnmarshaller.java
index c00045273..898df48a5 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/impl/UsernameTokenUnmarshaller.java
@@ -17,6 +17,7 @@
 
 package org.opensaml.soap.wssecurity.impl;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -34,8 +35,8 @@ import net.shibboleth.shared.xml.QNameSupport;
 public class UsernameTokenUnmarshaller extends AbstractWSSecurityObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final UsernameToken token = (UsernameToken) parentXMLObject;
         if (childXMLObject instanceof Username) {
             token.setUsername((Username) childXMLObject);
@@ -45,7 +46,8 @@ public class UsernameTokenUnmarshaller extends AbstractWSSecurityObjectUnmarshal
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final UsernameToken token = (UsernameToken) xmlObject;
         
         final QName attribQName = 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
index 294452a96..c1fe37a35 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandler.java
@@ -34,7 +34,8 @@ import org.opensaml.soap.wssecurity.Timestamp;
 import org.opensaml.soap.wssecurity.messaging.WSSecurityContext;
 import org.opensaml.soap.wssecurity.messaging.WSSecurityMessagingSupport;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import net.shibboleth.shared.primitive.LoggerFactory;
 
 /**
  * Handler implementation that adds a wsse:Timestamp header to the wsse:Security header
@@ -198,8 +199,8 @@ public class AddTimestampHandler extends AbstractHeaderGeneratingMessageHandler
             value = security.getTimestampCreated();
         }
         
-        if (value == null && getCreatedLookup() != null) {
-            value = getCreatedLookup().apply(messageContext);
+        if (value == null && createdLookup != null) {
+            value = createdLookup.apply(messageContext);
         }
         
         if (value == null) {
@@ -226,8 +227,8 @@ public class AddTimestampHandler extends AbstractHeaderGeneratingMessageHandler
             value = security.getTimestampExpires();
         }
         
-        if (value == null && getExpiresLookup() != null) {
-            value = getExpiresLookup().apply(messageContext);
+        if (value == null && expiresLookup != null) {
+            value = expiresLookup.apply(messageContext);
         }
         
         if (value == null) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObject.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObject.java
index 237d06229..2385f1f88 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObject.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObject.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.AbstractXMLObject;
 import org.opensaml.soap.wstrust.WSTrustObject;
 
@@ -32,8 +35,8 @@ public abstract class AbstractWSTrustObject extends AbstractXMLObject implements
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AbstractWSTrustObject(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AbstractWSTrustObject(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectBuilder.java
index bd7e56f8b..397c35f0d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectBuilder.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.AbstractXMLObjectBuilder;
 import org.opensaml.soap.wstrust.WSTrustObject;
 import org.opensaml.soap.wstrust.WSTrustObjectBuilder;
@@ -33,6 +35,6 @@ public abstract class AbstractWSTrustObjectBuilder<WSTrustObjectType extends WST
         implements WSTrustObjectBuilder<WSTrustObjectType> {
 
     /** {@inheritDoc} */
-    public abstract WSTrustObjectType buildObject();
+    @Nonnull public abstract WSTrustObjectType buildObject();
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectMarshaller.java
index 8ca7f92db..5eb59b2ea 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectMarshaller.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectMarshaller;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * An abstract marshaller implementation for XMLObjects from WS-Trust.
  * 
@@ -31,22 +34,18 @@ import org.w3c.dom.Element;
 public abstract class AbstractWSTrustObjectMarshaller extends AbstractXMLObjectMarshaller {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractWSTrustObjectMarshaller.class);
-
-    /** Constructor. */
-    protected AbstractWSTrustObjectMarshaller() {
-        super();
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractWSTrustObjectMarshaller.class);
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
-        log.debug("{} has no more attribute to marshall.", xmlObject.getElementQName().getLocalPart());
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
+        log.trace("{} has no more attribute to marshall.", xmlObject.getElementQName().getLocalPart());
 
     }
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
-        log.debug("{} has no content to marshall.", xmlObject.getElementQName().getLocalPart());
+        log.trace("{} has no content to marshall.", xmlObject.getElementQName().getLocalPart());
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectUnmarshaller.java
index 7d6f7fe74..491fd9206 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AbstractWSTrustObjectUnmarshaller.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.AbstractXMLObjectUnmarshaller;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
+
 /**
  * An abstract unmarshaller implementation for XMLObjects from WS-Trust.
  * 
@@ -31,28 +34,24 @@ import org.w3c.dom.Attr;
 public abstract class AbstractWSTrustObjectUnmarshaller extends AbstractXMLObjectUnmarshaller {
 
     /** Logger. */
-    private final Logger log = LoggerFactory.getLogger(AbstractWSTrustObjectUnmarshaller.class);
-
-    /** Constructor.  */
-    protected AbstractWSTrustObjectUnmarshaller() {
-        super();
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(AbstractWSTrustObjectUnmarshaller.class);
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         log.warn("{} ignoring unknown child element {}", parentXMLObject.getElementQName().getLocalPart(),
                 childXMLObject.getElementQName().getLocalPart());
     }
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         log.warn("{} ignoring unknown attribute {}", xmlObject.getElementQName().getLocalPart(), attribute
                 .getLocalName());
     }
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         log.warn("{} ignoring unknown element content: {}", xmlObject.getElementQName().getLocalPart(), elementContent);
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingBuilder.java
index fedd59c8a..bfeed58eb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.AllowPostdating;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.AllowPostdating;
 public class AllowPostdatingBuilder extends AbstractWSTrustObjectBuilder<AllowPostdating> {
 
     /** {@inheritDoc} */
-    public AllowPostdating buildObject() {
+    @Nonnull public AllowPostdating buildObject() {
         return buildObject(AllowPostdating.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public AllowPostdating buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public AllowPostdating buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AllowPostdatingImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingImpl.java
index 33328f968..055ecc584 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AllowPostdatingImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.AllowPostdating;
 
@@ -35,12 +38,13 @@ public class AllowPostdatingImpl extends AbstractWSTrustObject implements AllowP
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AllowPostdatingImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AllowPostdatingImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeBuilder.java
index 0b0f68b30..a871d6ace 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.AuthenticationType;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.AuthenticationType;
 public class AuthenticationTypeBuilder extends AbstractWSTrustObjectBuilder<AuthenticationType> {
 
     /** {@inheritDoc} */
-    public AuthenticationType buildObject() {
+    @Nonnull public AuthenticationType buildObject() {
         return buildObject(AuthenticationType.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public AuthenticationType buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public AuthenticationType buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AuthenticationTypeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeImpl.java
index 721278911..bc8120353 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticationTypeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.AuthenticationType;
 
@@ -33,8 +36,8 @@ public class AuthenticationTypeImpl extends XSURIImpl implements AuthenticationT
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AuthenticationTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public AuthenticationTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorBuilder.java
index f801a0806..ec71d335e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Authenticator;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Authenticator;
 public class AuthenticatorBuilder extends AbstractWSTrustObjectBuilder<Authenticator> {
 
     /** {@inheritDoc} */
-    public Authenticator buildObject() {
+    @Nonnull public Authenticator buildObject() {
         return buildObject(Authenticator.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Authenticator buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Authenticator buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new AuthenticatorImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorImpl.java
index 3f2c0d3f9..028af0f1c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +29,8 @@ import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.Authenticator;
 import org.opensaml.soap.wstrust.CombinedHash;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * AuthenticatorImpl.
  * 
@@ -35,10 +38,10 @@ import org.opensaml.soap.wstrust.CombinedHash;
 public class AuthenticatorImpl extends AbstractWSTrustObject implements Authenticator {
     
     /** the wst:Authenticator/wst:CombinedHash child element. */
-    private CombinedHash combinedHash;
+    @Nullable private CombinedHash combinedHash;
 
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /**
      * Constructor.
@@ -47,39 +50,41 @@ public class AuthenticatorImpl extends AbstractWSTrustObject implements Authenti
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public AuthenticatorImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public AuthenticatorImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public CombinedHash getCombinedHash() {
+    @Nullable public CombinedHash getCombinedHash() {
         return combinedHash;
     }
 
     /** {@inheritDoc} */
-    public void setCombinedHash(final CombinedHash newCombinedHash) {
+    public void setCombinedHash(@Nullable final CombinedHash newCombinedHash) {
         combinedHash = prepareForAssignment(combinedHash, newCombinedHash);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (combinedHash != null) {
             children.add(combinedHash);
         }
         children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorUnmarshaller.java
index 6b8a2552f..72649dd3f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/AuthenticatorUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.Authenticator;
@@ -30,8 +32,8 @@ import org.opensaml.soap.wstrust.CombinedHash;
 public class AuthenticatorUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject) 
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Authenticator authenticator = (Authenticator) parentXMLObject;
         
         if (childXMLObject instanceof CombinedHash) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeBuilder.java
index 0dbe5820d..44b4d1b4a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.BinaryExchange;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.BinaryExchange;
 public class BinaryExchangeBuilder extends AbstractWSTrustObjectBuilder<BinaryExchange> {
 
     /** {@inheritDoc} */
-    public BinaryExchange buildObject() {
+    @Nonnull public BinaryExchange buildObject() {
         return buildObject(BinaryExchange.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public BinaryExchange buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public BinaryExchange buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new BinaryExchangeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeImpl.java
index e80445a52..891f6cc4f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wstrust.BinaryExchange;
@@ -28,13 +31,13 @@ import org.opensaml.soap.wstrust.BinaryExchange;
 public class BinaryExchangeImpl extends XSStringImpl implements BinaryExchange {
 
     /** The wst:BinaryExchange/@ValueType attribute value. */
-    private String valueType;
+    @Nullable private String valueType;
 
     /** The wst:BinaryExchange/@EncodingType attribute value. */
-    private String encodingType;
+    @Nullable private String encodingType;
 
     /** xs:anyAttribute for this element. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -43,33 +46,34 @@ public class BinaryExchangeImpl extends XSStringImpl implements BinaryExchange {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public BinaryExchangeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public BinaryExchangeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getEncodingType() {
+    @Nullable public String getEncodingType() {
         return encodingType;
     }
 
     /** {@inheritDoc} */
-    public void setEncodingType(final String newEncodingType) {
+    public void setEncodingType(@Nullable final String newEncodingType) {
         encodingType = prepareForAssignment(encodingType, newEncodingType);
     }
 
     /** {@inheritDoc} */
-    public String getValueType() {
+    @Nullable public String getValueType() {
         return valueType;
     }
 
     /** {@inheritDoc} */
-    public void setValueType(final String newValueType) {
+    public void setValueType(@Nullable final String newValueType) {
         valueType = prepareForAssignment(valueType, newValueType);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeMarshaller.java
index 7b7f84605..5841c2039 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.impl.XSStringMarshaller;
@@ -35,7 +37,8 @@ import net.shibboleth.shared.primitive.StringSupport;
 public class BinaryExchangeMarshaller extends XSStringMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final BinaryExchange binaryExchange = (BinaryExchange) xmlObject;
         
         final String valueType = StringSupport.trimOrNull(binaryExchange.getValueType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeUnmarshaller.java
index 393c6fe77..995ac445d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinaryExchangeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.schema.impl.XSStringUnmarshaller;
@@ -33,7 +35,8 @@ import org.w3c.dom.Attr;
 public class BinaryExchangeUnmarshaller extends XSStringUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final BinaryExchange binaryExchange = (BinaryExchange) xmlObject;
         
         final String attrName = attribute.getLocalName();
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretBuilder.java
index 119ac22f5..3196af333 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.BinarySecret;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.BinarySecret;
 public class BinarySecretBuilder extends AbstractWSTrustObjectBuilder<BinarySecret> {
 
     /** {@inheritDoc} */
-    public BinarySecret buildObject() {
+    @Nonnull public BinarySecret buildObject() {
         return buildObject(BinarySecret.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public BinarySecret buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public BinarySecret buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new BinarySecretImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretImpl.java
index 4eced3cc1..0cc3e58b4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
 import org.opensaml.core.xml.util.AttributeMap;
@@ -31,10 +34,10 @@ import org.opensaml.soap.wstrust.BinarySecret;
 public class BinarySecretImpl extends XSBase64BinaryImpl implements BinarySecret {
 
     /** The Type attribute value. */
-    private String type;
+    @Nullable private String type;
 
     /** Wildcard attributes. */
-    private AttributeMap unknownChildren;
+    @Nonnull private final AttributeMap unknownChildren;
 
     /**
      * Constructor.
@@ -43,28 +46,29 @@ public class BinarySecretImpl extends XSBase64BinaryImpl implements BinarySecret
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public BinarySecretImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public BinarySecretImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getType() {
+    @Nullable public String getType() {
         return type;
     }
 
     /** {@inheritDoc} */
-    public void setType(final String newType) {
+    public void setType(@Nullable final String newType) {
         type = prepareForAssignment(type, newType);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
     
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretMarshaller.java
index d9d8fa2d4..f31781241 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryMarshaller;
@@ -33,7 +35,8 @@ import org.w3c.dom.Element;
 public class BinarySecretMarshaller extends XSBase64BinaryMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final BinarySecret bs = (BinarySecret) xmlObject;
         if (bs.getType() != null) {
             domElement.setAttributeNS(null, BinarySecret.TYPE_ATTRIB_NAME, bs.getType());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretUnmarshaller.java
index 7b9630510..f03d79e80 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/BinarySecretUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryUnmarshaller;
@@ -31,7 +33,8 @@ import org.w3c.dom.Attr;
 public class BinarySecretUnmarshaller extends XSBase64BinaryUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final BinarySecret bs = (BinarySecret) xmlObject;
         if (BinarySecret.TYPE_ATTRIB_NAME.equals(attribute.getLocalName())) {
             bs.setType(attribute.getValue());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetBuilder.java
index 790708712..4f16f846a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.CancelTarget;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.CancelTarget;
 public class CancelTargetBuilder extends AbstractWSTrustObjectBuilder<CancelTarget> {
 
     /** {@inheritDoc} */
-    public CancelTarget buildObject() {
+    @Nonnull public CancelTarget buildObject() {
         return buildObject(CancelTarget.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public CancelTarget buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public CancelTarget buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new CancelTargetImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetImpl.java
index ed3d4e8dd..886dcb79c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.CancelTarget;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * CancelTargetImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.CancelTarget;
 public class CancelTargetImpl extends AbstractWSTrustObject implements CancelTarget {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,28 @@ public class CancelTargetImpl extends AbstractWSTrustObject implements CancelTar
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public CancelTargetImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public CancelTargetImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetUnmarshaller.java
index 2286c6af6..024d30197 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CancelTargetUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.CancelTarget;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.CancelTarget;
 public class CancelTargetUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final CancelTarget ct = (CancelTarget) parentXMLObject;
         ct.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmBuilder.java
index a3b1fc64e..bced19427 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.CanonicalizationAlgorithm;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.CanonicalizationAlgorithm;
 public class CanonicalizationAlgorithmBuilder extends AbstractWSTrustObjectBuilder<CanonicalizationAlgorithm> {
 
     /** {@inheritDoc} */
-    public CanonicalizationAlgorithm buildObject() {
+    @Nonnull public CanonicalizationAlgorithm buildObject() {
         return buildObject(CanonicalizationAlgorithm.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public CanonicalizationAlgorithm buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public CanonicalizationAlgorithm buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new CanonicalizationAlgorithmImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmImpl.java
index df4fea310..210c8ccca 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CanonicalizationAlgorithmImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.CanonicalizationAlgorithm;
 
@@ -33,8 +36,8 @@ public class CanonicalizationAlgorithmImpl extends XSURIImpl implements Canonica
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public CanonicalizationAlgorithmImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public CanonicalizationAlgorithmImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeBuilder.java
index b5334e3ed..b4cae5ed6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Challenge;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Challenge;
 public class ChallengeBuilder extends AbstractWSTrustObjectBuilder<Challenge> {
 
     /** {@inheritDoc} */
-    public Challenge buildObject() {
+    @Nonnull public Challenge buildObject() {
         return buildObject(Challenge.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Challenge buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Challenge buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ChallengeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeImpl.java
index cda5f960b..bfbb61aca 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ChallengeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.soap.wstrust.Challenge;
 
@@ -33,7 +36,8 @@ public class ChallengeImpl extends XSStringImpl implements Challenge {
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public ChallengeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ChallengeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsBuilder.java
index c53eec647..a76020844 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Claims;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Claims;
 public class ClaimsBuilder extends AbstractWSTrustObjectBuilder<Claims> {
 
     /** {@inheritDoc} */
-    public Claims buildObject() {
+    @Nonnull public Claims buildObject() {
         return buildObject(Claims.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Claims buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Claims buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ClaimsImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsImpl.java
index bc1a243ad..c396bef29 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +28,8 @@ import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.Claims;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * ClaimsImpl.
  * 
@@ -35,13 +37,13 @@ import org.opensaml.soap.wstrust.Claims;
 public class ClaimsImpl extends AbstractWSTrustObject implements Claims {
 
     /** The Dialect attribute value. */
-    private String dialect;
+    @Nullable private String dialect;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
     
 
     /**
@@ -51,43 +53,42 @@ public class ClaimsImpl extends AbstractWSTrustObject implements Claims {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ClaimsImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ClaimsImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getDialect() {
+    @Nullable public String getDialect() {
         return dialect;
     }
 
     /** {@inheritDoc} */
-    public void setDialect(final String newDialect) {
+    public void setDialect(@Nullable final String newDialect) {
         dialect = prepareForAssignment(dialect, newDialect);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
-
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsMarshaller.java
index 4a387bdbd..5475a55b7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class ClaimsMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Claims claims = (Claims) xmlObject;
         if (claims.getDialect() != null) {
             domElement.setAttributeNS(null, Claims.DIALECT_ATTRIB_NAME, claims.getDialect());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsUnmarshaller.java
index f7b0cbe87..f804b5a44 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ClaimsUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,7 +34,8 @@ import org.w3c.dom.Attr;
 public class ClaimsUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Claims claims = (Claims) xmlObject;
         if (Claims.DIALECT_ATTRIB_NAME.equals(attribute.getLocalName())) {
             claims.setDialect(attribute.getValue());
@@ -42,8 +45,8 @@ public class ClaimsUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Claims claims = (Claims) parentXMLObject;
         claims.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeBuilder.java
index 763284dc4..079b3baa6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Code;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Code;
 public class CodeBuilder extends AbstractWSTrustObjectBuilder<Code> {
 
     /** {@inheritDoc} */
-    public Code buildObject() {
+    @Nonnull public Code buildObject() {
         return buildObject(Code.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Code buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Code buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new CodeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeImpl.java
index 828729c19..9bd89eb62 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CodeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.Code;
 
@@ -33,7 +36,8 @@ public class CodeImpl extends XSURIImpl implements Code {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public CodeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public CodeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashBuilder.java
index b75f55343..8747b0587 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.CombinedHash;
 
 /**
@@ -27,13 +30,14 @@ public class CombinedHashBuilder extends AbstractWSTrustObjectBuilder<CombinedHa
 
     /** {@inheritDoc} */
     @Override
-    public CombinedHash buildObject() {
+    @Nonnull public CombinedHash buildObject() {
         return buildObject(CombinedHash.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
     @Override
-    public CombinedHash buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public CombinedHash buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new CombinedHashImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashImpl.java
index 4c1b13607..d3b020ee8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/CombinedHashImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
 import org.opensaml.soap.wstrust.CombinedHash;
 
@@ -33,7 +36,8 @@ public class CombinedHashImpl extends XSBase64BinaryImpl implements CombinedHash
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public CombinedHashImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public CombinedHashImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmBuilder.java
index 1867d5c5b..9d112d0c7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.ComputedKeyAlgorithm;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.ComputedKeyAlgorithm;
 public class ComputedKeyAlgorithmBuilder extends AbstractWSTrustObjectBuilder<ComputedKeyAlgorithm> {
 
     /** {@inheritDoc} */
-    public ComputedKeyAlgorithm buildObject() {
+    @Nonnull public ComputedKeyAlgorithm buildObject() {
         return buildObject(ComputedKeyAlgorithm.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ComputedKeyAlgorithm buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public ComputedKeyAlgorithm buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new ComputedKeyAlgorithmImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmImpl.java
index 7c6d33e67..483c16ca7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyAlgorithmImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.ComputedKeyAlgorithm;
 
@@ -33,8 +36,8 @@ public class ComputedKeyAlgorithmImpl extends XSURIImpl implements ComputedKeyAl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ComputedKeyAlgorithmImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public ComputedKeyAlgorithmImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyBuilder.java
index b6e497213..1f9f85fa0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.ComputedKey;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.ComputedKey;
 public class ComputedKeyBuilder extends AbstractWSTrustObjectBuilder<ComputedKey> {
 
     /** {@inheritDoc} */
-    public ComputedKey buildObject() {
+    @Nonnull public ComputedKey buildObject() {
         return buildObject(ComputedKey.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ComputedKey buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ComputedKey buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ComputedKeyImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyImpl.java
index 247649e4b..47e70e0dd 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ComputedKeyImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.ComputedKey;
 
@@ -33,7 +36,8 @@ public class ComputedKeyImpl extends XSURIImpl implements ComputedKey {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ComputedKeyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ComputedKeyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableBuilder.java
index afdeb0056..c50afb3cb 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Delegatable;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Delegatable;
 public class DelegatableBuilder extends AbstractWSTrustObjectBuilder<Delegatable> {
 
     /** {@inheritDoc} */
-    public Delegatable buildObject() {
+    @Nonnull public Delegatable buildObject() {
         return buildObject(Delegatable.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Delegatable buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Delegatable buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new DelegatableImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableImpl.java
index d8e518ea5..62be49a17 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Delegatable;
@@ -30,10 +33,10 @@ import org.opensaml.soap.wstrust.Delegatable;
 public class DelegatableImpl extends AbstractWSTrustObject implements Delegatable {
 
     /** Default value. */
-    private static final Boolean DEFAULT_VALUE = Boolean.FALSE;
+    @Nonnull private static final Boolean DEFAULT_VALUE = Boolean.FALSE;
 
     /** The wst:Forwardable content. */
-    private XSBooleanValue value;
+    @Nullable private XSBooleanValue value;
 
     /**
      * Constructor. Default value is <code>FALSE</code>.
@@ -42,18 +45,19 @@ public class DelegatableImpl extends AbstractWSTrustObject implements Delegatabl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public DelegatableImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public DelegatableImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         value = new XSBooleanValue(DEFAULT_VALUE, false);
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue getValue() {
+    @Nullable public XSBooleanValue getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final XSBooleanValue newValue) {
+    public void setValue(@Nullable final XSBooleanValue newValue) {
         if (newValue != null) {
             value = prepareForAssignment(value, newValue);
         } else {
@@ -62,7 +66,7 @@ public class DelegatableImpl extends AbstractWSTrustObject implements Delegatabl
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableMarshaller.java
index 35be06074..52497d9d7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.XSBooleanValue;
@@ -33,11 +35,13 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class DelegatableMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final Delegatable delegatable = (Delegatable) xmlObject;
         final XSBooleanValue value= delegatable.getValue();
-        ElementSupport.appendTextContent(domElement, value.toString());
+        if (value != null) {
+            ElementSupport.appendTextContent(domElement, value.toString());
+        }
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableUnmarshaller.java
index 82b41c94d..7a163c17f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegatableUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Delegatable;
@@ -29,7 +31,7 @@ import org.opensaml.soap.wstrust.Delegatable;
 public class DelegatableUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         if (elementContent != null) {
             final Delegatable delegatable = (Delegatable) xmlObject;
             final XSBooleanValue value = XSBooleanValue.valueOf(elementContent);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToBuilder.java
index 48d800c1e..134b6bc6c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.DelegateTo;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.DelegateTo;
 public class DelegateToBuilder extends AbstractWSTrustObjectBuilder<DelegateTo> {
 
     /** {@inheritDoc} */
-    public DelegateTo buildObject() {
+    @Nonnull public DelegateTo buildObject() {
         return buildObject(DelegateTo.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public DelegateTo buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public DelegateTo buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new DelegateToImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToImpl.java
index f5048103f..78bf18fd4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.DelegateTo;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * DelegateToImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.DelegateTo;
 public class DelegateToImpl extends AbstractWSTrustObject implements DelegateTo {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,28 @@ public class DelegateToImpl extends AbstractWSTrustObject implements DelegateTo
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public DelegateToImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public DelegateToImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToUnmarshaller.java
index 5da69279d..8f4ff6279 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/DelegateToUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.DelegateTo;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.DelegateTo;
 public class DelegateToUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final DelegateTo delegateTo = (DelegateTo) parentXMLObject;
         delegateTo.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithBuilder.java
index 823c05f2c..e338bcc99 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.EncryptWith;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.EncryptWith;
 public class EncryptWithBuilder extends AbstractWSTrustObjectBuilder<EncryptWith> {
 
     /** {@inheritDoc} */
-    public EncryptWith buildObject() {
+    @Nonnull public EncryptWith buildObject() {
         return buildObject(EncryptWith.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public EncryptWith buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public EncryptWith buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EncryptWithImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithImpl.java
index dae2bcbbe..5f23d823f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptWithImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.EncryptWith;
 
@@ -33,7 +36,8 @@ public class EncryptWithImpl extends XSURIImpl implements EncryptWith {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EncryptWithImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public EncryptWithImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmBuilder.java
index cbc6babb1..02af23ad6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.EncryptionAlgorithm;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.EncryptionAlgorithm;
 public class EncryptionAlgorithmBuilder extends AbstractWSTrustObjectBuilder<EncryptionAlgorithm> {
 
     /** {@inheritDoc} */
-    public EncryptionAlgorithm buildObject() {
+    @Nonnull public EncryptionAlgorithm buildObject() {
         return buildObject(EncryptionAlgorithm.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public EncryptionAlgorithm buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public EncryptionAlgorithm buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new EncryptionAlgorithmImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmImpl.java
index c7a6954d5..d3294aa6a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionAlgorithmImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.EncryptionAlgorithm;
 
@@ -33,8 +36,8 @@ public class EncryptionAlgorithmImpl extends XSURIImpl implements EncryptionAlgo
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EncryptionAlgorithmImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public EncryptionAlgorithmImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionBuilder.java
index 5c1f3f27e..1ce83d24b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Encryption;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Encryption;
 public class EncryptionBuilder extends AbstractWSTrustObjectBuilder<Encryption> {
 
     /** {@inheritDoc} */
-    public Encryption buildObject() {
+    @Nonnull public Encryption buildObject() {
         return buildObject(Encryption.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Encryption buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Encryption buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EncryptionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionImpl.java
index 58500ebe8..870b1b028 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.Encryption;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * EncryptionImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.Encryption;
 public class EncryptionImpl extends AbstractWSTrustObject implements Encryption {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,28 @@ public class EncryptionImpl extends AbstractWSTrustObject implements Encryption
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EncryptionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public EncryptionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionUnmarshaller.java
index 2d3f39616..763c7b94e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EncryptionUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.Encryption;
@@ -30,8 +32,8 @@ import org.opensaml.soap.wstrust.Encryption;
 public class EncryptionUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Encryption enc = (Encryption) parentXMLObject;
         enc.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyBuilder.java
index 2ad79d63f..16546bbc1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Entropy;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Entropy;
 public class EntropyBuilder extends AbstractWSTrustObjectBuilder<Entropy> {
 
     /** {@inheritDoc} */
-    public Entropy buildObject() {
+    @Nonnull public Entropy buildObject() {
         return buildObject(Entropy.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Entropy buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Entropy buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new EntropyImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyImpl.java
index 3981bf2e8..2ad0ed7b8 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +28,8 @@ import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.Entropy;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * EntropyImpl.
  * 
@@ -35,10 +37,10 @@ import org.opensaml.soap.wstrust.Entropy;
 public class EntropyImpl extends AbstractWSTrustObject implements Entropy {
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -47,32 +49,32 @@ public class EntropyImpl extends AbstractWSTrustObject implements Entropy {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public EntropyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public EntropyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyMarshaller.java
index 6938ad6a0..d8984f265 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class EntropyMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Entropy entropy = (Entropy) xmlObject;
         XMLObjectSupport.marshallAttributeMap(entropy.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyUnmarshaller.java
index 0ba944b31..b1287803c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/EntropyUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,14 +34,15 @@ import org.w3c.dom.Attr;
 public class EntropyUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Entropy entropy = (Entropy) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(entropy.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Entropy entropy = (Entropy) parentXMLObject;
         entropy.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableBuilder.java
index 618e64a3a..d9a260f18 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Forwardable;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Forwardable;
 public class ForwardableBuilder extends AbstractWSTrustObjectBuilder<Forwardable> {
 
     /** {@inheritDoc} */
-    public Forwardable buildObject() {
+    @Nonnull public Forwardable buildObject() {
         return buildObject(Forwardable.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Forwardable buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Forwardable buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ForwardableImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableImpl.java
index 8bc3c2cf3..048bd036a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Forwardable;
@@ -30,10 +33,10 @@ import org.opensaml.soap.wstrust.Forwardable;
 public class ForwardableImpl extends AbstractWSTrustObject implements Forwardable {
 
     /** Default value. */
-    private static final Boolean DEFAULT_VALUE = Boolean.TRUE;
+    @Nonnull private static final Boolean DEFAULT_VALUE = Boolean.TRUE;
 
     /** The wst:Forwardable content. */
-    private XSBooleanValue value;
+    @Nullable private XSBooleanValue value;
     
     /**
      * Constructor. Default value is <code>TRUE</code>.
@@ -42,18 +45,19 @@ public class ForwardableImpl extends AbstractWSTrustObject implements Forwardabl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ForwardableImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ForwardableImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         value = new XSBooleanValue(DEFAULT_VALUE, false);
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue getValue() {
+    @Nullable public XSBooleanValue getValue() {
         return value;
     }
 
     /** {@inheritDoc} */
-    public void setValue(final XSBooleanValue newValue) {
+    public void setValue(@Nullable final XSBooleanValue newValue) {
         if (newValue != null) {
             value = prepareForAssignment(value, newValue);
         } else {
@@ -62,7 +66,7 @@ public class ForwardableImpl extends AbstractWSTrustObject implements Forwardabl
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableMarshaller.java
index 10ccc425d..b07d8056d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.schema.XSBooleanValue;
@@ -33,10 +35,12 @@ import net.shibboleth.shared.xml.ElementSupport;
 public class ForwardableMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallElementContent(final XMLObject xmlObject, final Element domElement)
+    protected void marshallElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
             throws MarshallingException {
         final Forwardable forwardable = (Forwardable) xmlObject;
         final XSBooleanValue value= forwardable.getValue();
-        ElementSupport.appendTextContent(domElement, value.toString());
+        if (value != null) {
+            ElementSupport.appendTextContent(domElement, value.toString());
+        }
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableUnmarshaller.java
index 8a3f3681d..1eae6dd0e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ForwardableUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Forwardable;
@@ -29,7 +31,7 @@ import org.opensaml.soap.wstrust.Forwardable;
 public class ForwardableUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processElementContent(final XMLObject xmlObject, final String elementContent) {
+    protected void processElementContent(@Nonnull final XMLObject xmlObject, @Nonnull final String elementContent) {
         if (elementContent != null) {
             final Forwardable forwardable = (Forwardable) xmlObject;
             final XSBooleanValue value = XSBooleanValue.valueOf(elementContent);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensBuilder.java
index 615b018fc..6ff54f5c9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.IssuedTokens;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.IssuedTokens;
 public class IssuedTokensBuilder extends AbstractWSTrustObjectBuilder<IssuedTokens> {
 
     /** {@inheritDoc} */
-    public IssuedTokens buildObject() {
+    @Nonnull public IssuedTokens buildObject() {
         return buildObject(IssuedTokens.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public IssuedTokens buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public IssuedTokens buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new IssuedTokensImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensImpl.java
index f69c5fef9..a88d4a362 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuedTokensImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.IssuedTokens;
 
 /**
@@ -32,7 +35,8 @@ public class IssuedTokensImpl extends RequestSecurityTokenResponseCollectionImpl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public IssuedTokensImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public IssuedTokensImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerBuilder.java
index d9e622cb7..ee2908a06 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Issuer;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Issuer;
 public class IssuerBuilder extends AbstractWSTrustObjectBuilder<Issuer> {
 
     /** {@inheritDoc} */
-    public Issuer buildObject() {
+    @Nonnull public Issuer buildObject() {
         return buildObject(Issuer.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Issuer buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Issuer buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new IssuerImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerImpl.java
index 192a167de..3770f3b53 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/IssuerImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wsaddressing.impl.EndpointReferenceTypeImpl;
 import org.opensaml.soap.wstrust.Issuer;
 
@@ -33,7 +36,8 @@ public class IssuerImpl extends EndpointReferenceTypeImpl implements Issuer {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public IssuerImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public IssuerImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenBuilder.java
index 6ac82419c..576821d8f 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.KeyExchangeToken;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.KeyExchangeToken;
 public class KeyExchangeTokenBuilder extends AbstractWSTrustObjectBuilder<KeyExchangeToken> {
 
     /** {@inheritDoc} */
-    public KeyExchangeToken buildObject() {
+    @Nonnull public KeyExchangeToken buildObject() {
         return buildObject(KeyExchangeToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public KeyExchangeToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public KeyExchangeToken buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new KeyExchangeTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenImpl.java
index 68b9c2c5e..ff0850054 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenImpl.java
@@ -17,15 +17,18 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.KeyExchangeToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * KeyExchangeTokenImpl.
  * 
@@ -33,7 +36,7 @@ import org.opensaml.soap.wstrust.KeyExchangeToken;
 public class KeyExchangeTokenImpl extends AbstractWSTrustObject implements KeyExchangeToken {
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -42,25 +45,26 @@ public class KeyExchangeTokenImpl extends AbstractWSTrustObject implements KeyEx
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public KeyExchangeTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public KeyExchangeTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        return Collections.unmodifiableList(unknownChildren);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenUnmarshaller.java
index b3f7b4031..bfbcae07c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyExchangeTokenUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.KeyExchangeToken;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.KeyExchangeToken;
 public class KeyExchangeTokenUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final KeyExchangeToken ket = (KeyExchangeToken) parentXMLObject;
         ket.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeBuilder.java
index edee53b65..70ede966a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.KeySize;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.KeySize;
 public class KeySizeBuilder extends AbstractWSTrustObjectBuilder<KeySize> {
 
     /** {@inheritDoc} */
-    public KeySize buildObject() {
+    @Nonnull public KeySize buildObject() {
         return buildObject(KeySize.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public KeySize buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public KeySize buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new KeySizeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeImpl.java
index b7a93b199..adac11344 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeySizeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSIntegerImpl;
 import org.opensaml.soap.wstrust.KeySize;
 
@@ -33,7 +36,8 @@ public class KeySizeImpl extends XSIntegerImpl implements KeySize {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public KeySizeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public KeySizeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeBuilder.java
index 7ce443912..aa988e627 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.KeyType;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.KeyType;
 public class KeyTypeBuilder extends AbstractWSTrustObjectBuilder<KeyType> {
 
     /** {@inheritDoc} */
-    public KeyType buildObject() {
+    @Nonnull public KeyType buildObject() {
         return buildObject(KeyType.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public KeyType buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public KeyType buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new KeyTypeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeImpl.java
index 50fca0183..e8f81e933 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyTypeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.KeyType;
 
@@ -33,7 +36,8 @@ public class KeyTypeImpl extends XSURIImpl implements KeyType {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public KeyTypeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public KeyTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmBuilder.java
index a4a2a9394..77ee4fa1a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.KeyWrapAlgorithm;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.KeyWrapAlgorithm;
 public class KeyWrapAlgorithmBuilder extends AbstractWSTrustObjectBuilder<KeyWrapAlgorithm> {
 
     /** {@inheritDoc} */
-    public KeyWrapAlgorithm buildObject() {
+    @Nonnull public KeyWrapAlgorithm buildObject() {
         return buildObject(KeyWrapAlgorithm.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public KeyWrapAlgorithm buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public KeyWrapAlgorithm buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new KeyWrapAlgorithmImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmImpl.java
index 6f1310bb7..3cf9a66e3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/KeyWrapAlgorithmImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.KeyWrapAlgorithm;
 
@@ -33,8 +36,8 @@ public class KeyWrapAlgorithmImpl extends XSURIImpl implements KeyWrapAlgorithm
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public KeyWrapAlgorithmImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public KeyWrapAlgorithmImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeBuilder.java
index e70a68a48..1ae90e50a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Lifetime;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Lifetime;
 public class LifetimeBuilder extends AbstractWSTrustObjectBuilder<Lifetime> {
 
     /** {@inheritDoc} */
-    public Lifetime buildObject() {
+    @Nonnull public Lifetime buildObject() {
         return buildObject(Lifetime.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Lifetime buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Lifetime buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new LifetimeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeImpl.java
index 940601163..14006c096 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeImpl.java
@@ -18,14 +18,18 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wssecurity.Created;
 import org.opensaml.soap.wssecurity.Expires;
 import org.opensaml.soap.wstrust.Lifetime;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * LifetimeImpl.
  * 
@@ -33,10 +37,10 @@ import org.opensaml.soap.wstrust.Lifetime;
 public class LifetimeImpl extends AbstractWSTrustObject implements Lifetime {
 
     /** The wsu:Created child element. */
-    private Created created;
+    @Nullable private Created created;
 
     /** The wsu:Expires child element. */
-    private Expires expires;
+    @Nullable private Expires expires;
 
     /**
      * Constructor.
@@ -45,32 +49,33 @@ public class LifetimeImpl extends AbstractWSTrustObject implements Lifetime {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public LifetimeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public LifetimeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public Created getCreated() {
+    @Nullable public Created getCreated() {
         return created;
     }
 
     /** {@inheritDoc} */
-    public Expires getExpires() {
+    @Nullable public Expires getExpires() {
         return expires;
     }
 
     /** {@inheritDoc} */
-    public void setCreated(final Created newCreated) {
+    public void setCreated(@Nullable final Created newCreated) {
         created = prepareForAssignment(created, newCreated);
     }
 
     /** {@inheritDoc} */
-    public void setExpires(final Expires newExpires) {
+    public void setExpires(@Nullable final Expires newExpires) {
         expires = prepareForAssignment(expires, newExpires);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (created != null) {
             children.add(created);
@@ -78,7 +83,7 @@ public class LifetimeImpl extends AbstractWSTrustObject implements Lifetime {
         if (expires != null) {
             children.add(expires);
         }
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeUnmarshaller.java
index cf4a22d56..37a151247 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/LifetimeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.Created;
@@ -31,8 +33,8 @@ import org.opensaml.soap.wstrust.Lifetime;
 public class LifetimeUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Lifetime lifetime = (Lifetime) parentXMLObject;
         if (childXMLObject instanceof Created) {
             lifetime.setCreated((Created) childXMLObject);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfBuilder.java
index c5d51d0f5..ddd3052a4 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.OnBehalfOf;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.OnBehalfOf;
 public class OnBehalfOfBuilder extends AbstractWSTrustObjectBuilder<OnBehalfOf> {
 
     /** {@inheritDoc} */
-    public OnBehalfOf buildObject() {
+    @Nonnull public OnBehalfOf buildObject() {
         return buildObject(OnBehalfOf.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public OnBehalfOf buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public OnBehalfOf buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new OnBehalfOfImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfImpl.java
index 6b09c58a1..ea41f31ea 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfImpl.java
@@ -17,16 +17,18 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.OnBehalfOf;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * OnBehalfOfImpl.
  * 
@@ -34,7 +36,7 @@ import org.opensaml.soap.wstrust.OnBehalfOf;
 public class OnBehalfOfImpl extends AbstractWSTrustObject implements OnBehalfOf {
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -43,26 +45,27 @@ public class OnBehalfOfImpl extends AbstractWSTrustObject implements OnBehalfOf
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public OnBehalfOfImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public OnBehalfOfImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final List<XMLObject> children = new ArrayList<>();
-        children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfUnmarshaller.java
index 341398369..40a5f9933 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/OnBehalfOfUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.OnBehalfOf;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.OnBehalfOf;
 public class OnBehalfOfUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject) 
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final OnBehalfOf obo = (OnBehalfOf) parentXMLObject;
         obo.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantBuilder.java
index 4f8ad021e..e0af17648 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Participant;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Participant;
 public class ParticipantBuilder extends AbstractWSTrustObjectBuilder<Participant> {
 
     /** {@inheritDoc} */
-    public Participant buildObject() {
+    @Nonnull public Participant buildObject() {
         return buildObject(Participant.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Participant buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Participant buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ParticipantImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantImpl.java
index f033ed426..ddb73d108 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Participant;
 
 /**
@@ -32,7 +35,8 @@ public class ParticipantImpl extends ParticipantTypeImpl implements Participant
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ParticipantImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ParticipantImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeImpl.java
index 376e6a33a..22cd7dfc1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.ParticipantType;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * ParticipantTypeImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.ParticipantType;
 public class ParticipantTypeImpl extends AbstractWSTrustObject implements ParticipantType {
     
     /** Unknown child elements. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,28 @@ public class ParticipantTypeImpl extends AbstractWSTrustObject implements Partic
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public ParticipantTypeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ParticipantTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeUnmarshaller.java
index fc0ca5103..8e607f77b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantTypeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.ParticipantType;
@@ -28,8 +30,8 @@ import org.opensaml.soap.wstrust.ParticipantType;
 public class ParticipantTypeUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final ParticipantType pt = (ParticipantType) parentXMLObject;
         pt.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsBuilder.java
index 12b74d9f3..2ecf78089 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Participants;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Participants;
 public class ParticipantsBuilder extends AbstractWSTrustObjectBuilder<Participants> {
 
     /** {@inheritDoc} */
-    public Participants buildObject() {
+    @Nonnull public Participants buildObject() {
         return buildObject(Participants.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Participants buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Participants buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ParticipantsImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsImpl.java
index 3fd73f6c8..c257fd03e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -29,6 +30,8 @@ import org.opensaml.soap.wstrust.Participant;
 import org.opensaml.soap.wstrust.Participants;
 import org.opensaml.soap.wstrust.Primary;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * ParticipantsImpl.
  * 
@@ -36,13 +39,13 @@ import org.opensaml.soap.wstrust.Primary;
 public class ParticipantsImpl extends AbstractWSTrustObject implements Participants {
 
     /** The {@link Primary} child element. */
-    private Primary primary;
+    @Nullable private Primary primary;
 
     /** The list of {@link Participant} child elements. */
-    private List<Participant> participants;
+    @Nonnull private final List<Participant> participants;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
 
     /**
      * Constructor.
@@ -51,39 +54,41 @@ public class ParticipantsImpl extends AbstractWSTrustObject implements Participa
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ParticipantsImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ParticipantsImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         participants = new ArrayList<>();
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
     }
 
     /** {@inheritDoc} */
-    public Primary getPrimary() {
+    @Nullable public Primary getPrimary() {
         return primary;
     }
 
     /** {@inheritDoc} */
-    public void setPrimary(final Primary newPrimary) {
+    public void setPrimary(@Nullable final Primary newPrimary) {
         primary = prepareForAssignment(primary, newPrimary);
     }
 
     /** {@inheritDoc} */
-    public List<Participant> getParticipants() {
+    @Nonnull public List<Participant> getParticipants() {
         return participants;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final List<XMLObject> children = new ArrayList<>();
         if (primary != null) {
             children.add(primary);
@@ -93,7 +98,7 @@ public class ParticipantsImpl extends AbstractWSTrustObject implements Participa
         
         children.addAll(unknownChildren);
         
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsUnmarshaller.java
index ab7ef7918..830d4b4ec 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ParticipantsUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.Participant;
@@ -31,8 +33,8 @@ import org.opensaml.soap.wstrust.Primary;
 public class ParticipantsUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject) 
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Participants participants = (Participants) parentXMLObject;
         
         if (childXMLObject instanceof Primary) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryBuilder.java
index ca6830d2b..1bbfcdb19 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Primary;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Primary;
 public class PrimaryBuilder extends AbstractWSTrustObjectBuilder<Primary> {
 
     /** {@inheritDoc} */
-    public Primary buildObject() {
+    @Nonnull public Primary buildObject() {
         return buildObject(Primary.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Primary buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Primary buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new PrimaryImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryImpl.java
index c5cb8804b..993d76586 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/PrimaryImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Primary;
 
 /**
@@ -32,7 +35,8 @@ public class PrimaryImpl extends ParticipantTypeImpl implements Primary {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public PrimaryImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public PrimaryImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionBuilder.java
index 74d8c7435..cb1a2dd63 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.ProofEncryption;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.ProofEncryption;
 public class ProofEncryptionBuilder extends AbstractWSTrustObjectBuilder<ProofEncryption> {
 
     /** {@inheritDoc} */
-    public ProofEncryption buildObject() {
+    @Nonnull public ProofEncryption buildObject() {
         return buildObject(ProofEncryption.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ProofEncryption buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public ProofEncryption buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ProofEncryptionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionImpl.java
index c1b481386..c90578875 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.ProofEncryption;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * ProofEncryptionImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.ProofEncryption;
 public class ProofEncryptionImpl extends AbstractWSTrustObject implements ProofEncryption {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,29 @@ public class ProofEncryptionImpl extends AbstractWSTrustObject implements ProofE
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ProofEncryptionImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ProofEncryptionImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
     public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+        
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionUnmarshaller.java
index 788584b4b..07c7af0d0 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ProofEncryptionUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.ProofEncryption;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.ProofEncryption;
 public class ProofEncryptionUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final ProofEncryption pe = (ProofEncryption) parentXMLObject;
         pe.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonBuilder.java
index 7f6463a83..6669330ef 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Reason;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Reason;
 public class ReasonBuilder extends AbstractWSTrustObjectBuilder<Reason> {
 
     /** {@inheritDoc} */
-    public Reason buildObject() {
+    @Nonnull public Reason buildObject() {
         return buildObject(Reason.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Reason buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Reason buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ReasonImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonImpl.java
index 7bb1bf824..4518148a7 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ReasonImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSStringImpl;
 import org.opensaml.soap.wstrust.Reason;
 
@@ -33,7 +36,8 @@ public class ReasonImpl extends XSStringImpl implements Reason {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ReasonImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ReasonImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetBuilder.java
index 3d91714ac..4838f10d1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RenewTarget;
 
 /**
@@ -27,13 +30,14 @@ public class RenewTargetBuilder extends AbstractWSTrustObjectBuilder<RenewTarget
 
     /** {@inheritDoc} */
     @Override
-    public RenewTarget buildObject() {
+    @Nonnull public RenewTarget buildObject() {
         return buildObject(RenewTarget.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
     @Override
-    public RenewTarget buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public RenewTarget buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RenewTargetImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetImpl.java
index a53e79c4c..ecaf48417 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RenewTarget;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RenewTargetImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.RenewTarget;
 public class RenewTargetImpl extends AbstractWSTrustObject implements RenewTarget {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,27 +43,29 @@ public class RenewTargetImpl extends AbstractWSTrustObject implements RenewTarge
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RenewTargetImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RenewTargetImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = unknownObject;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetUnmarshaller.java
index 95e67c91f..953255ac6 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewTargetUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.RenewTarget;
@@ -30,8 +32,8 @@ import org.opensaml.soap.wstrust.RenewTarget;
 public class RenewTargetUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RenewTarget rt = (RenewTarget) parentXMLObject;
         rt.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingBuilder.java
index 77e545bfd..72798b52d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Renewing;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Renewing;
 public class RenewingBuilder extends AbstractWSTrustObjectBuilder<Renewing> {
 
     /** {@inheritDoc} */
-    public Renewing buildObject() {
+    @Nonnull public Renewing buildObject() {
         return buildObject(Renewing.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Renewing buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Renewing buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RenewingImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingImpl.java
index c54d63e09..da900ac1d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Renewing;
@@ -30,10 +33,10 @@ import org.opensaml.soap.wstrust.Renewing;
 public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
     
     /** The Allow attribute value. */
-    private XSBooleanValue allow;
+    @Nullable private XSBooleanValue allow;
     
     /** The OK attribute value. */
-    private XSBooleanValue ok;
+    @Nullable private XSBooleanValue ok;
 
     /**
      * Constructor.
@@ -42,12 +45,13 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RenewingImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RenewingImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public Boolean isAllow() {
+    @Nullable public Boolean isAllow() {
         if (allow != null) {
             return allow.getValue();
         }
@@ -57,12 +61,12 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isAllowXSBoolean() {
+    @Nullable public XSBooleanValue isAllowXSBoolean() {
         return allow;
     }
 
     /** {@inheritDoc} */
-    public void setAllow(final Boolean newAllow) {
+    public void setAllow(@Nullable final Boolean newAllow) {
         if (newAllow != null) {
             allow = prepareForAssignment(allow, new XSBooleanValue(newAllow, false));
         } else {
@@ -71,12 +75,12 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
     }
 
     /** {@inheritDoc} */
-    public void setAllow(final XSBooleanValue newAllow) {
+    public void setAllow(@Nullable final XSBooleanValue newAllow) {
         allow = prepareForAssignment(allow, newAllow);
     }
 
     /** {@inheritDoc} */
-    public Boolean isOK() {
+    @Nullable public Boolean isOK() {
         if (ok != null) {
             return ok.getValue();
         }
@@ -86,12 +90,12 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
     }
 
     /** {@inheritDoc} */
-    public XSBooleanValue isOKXSBoolean() {
+    @Nullable public XSBooleanValue isOKXSBoolean() {
         return ok;
     }
 
     /** {@inheritDoc} */
-    public void setOK(final Boolean newOK) {
+    public void setOK(@Nullable final Boolean newOK) {
         if (newOK != null) {
             ok = prepareForAssignment(ok, new XSBooleanValue(newOK, false));
         } else {
@@ -100,7 +104,7 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
     }
 
     /** {@inheritDoc} */
-    public void setOK(final XSBooleanValue newOK) {
+    public void setOK(@Nullable final XSBooleanValue newOK) {
         ok = prepareForAssignment(ok, newOK);
     }
 
@@ -109,4 +113,4 @@ public class RenewingImpl extends AbstractWSTrustObject implements Renewing {
         return null;
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingMarshaller.java
index c6665a387..bb9d87398 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingMarshaller.java
@@ -18,8 +18,11 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.schema.XSBooleanValue;
 import org.opensaml.soap.wstrust.Renewing;
 import org.w3c.dom.Element;
 
@@ -30,16 +33,19 @@ import org.w3c.dom.Element;
 public class RenewingMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final Renewing renewing = (Renewing) xmlObject;
         
-        if (renewing.isAllowXSBoolean() != null) {
-            domElement.setAttributeNS(null, Renewing.ALLOW_ATTRIB_NAME, renewing.isAllowXSBoolean().toString());
+        final XSBooleanValue allow = renewing.isAllowXSBoolean();
+        if (allow != null && allow.getValue() != null) {
+            domElement.setAttributeNS(null, Renewing.ALLOW_ATTRIB_NAME, allow.toString());
         }
         
-        if (renewing.isOKXSBoolean() != null) {
-            domElement.setAttributeNS(null, Renewing.OK_ATTRIB_NAME, renewing.isOKXSBoolean().toString());
+        final XSBooleanValue ok = renewing.isOKXSBoolean();
+        if (ok != null && ok.getValue() != null) {
+            domElement.setAttributeNS(null, Renewing.OK_ATTRIB_NAME, ok.toString());
         }
     }
     
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingUnmarshaller.java
index 3f25cc966..23e28f051 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RenewingUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.schema.XSBooleanValue;
@@ -31,7 +33,8 @@ import org.w3c.dom.Attr;
 public class RenewingUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final Renewing renewing = (Renewing) xmlObject;
         
         if (attribute.getLocalName().equals(Renewing.ALLOW_ATTRIB_NAME)) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETBuilder.java
index 9163c0580..bd4ebe7bc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestKET;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.RequestKET;
 public class RequestKETBuilder extends AbstractWSTrustObjectBuilder<RequestKET> {
 
     /** {@inheritDoc} */
-    public RequestKET buildObject() {
+    @Nonnull public RequestKET buildObject() {
         return buildObject(RequestKET.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestKET buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public RequestKET buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RequestKETImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETImpl.java
index 03c8df9ae..b48995b0e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestKETImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RequestKET;
 
@@ -35,12 +38,13 @@ public class RequestKETImpl extends AbstractWSTrustObject implements RequestKET
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestKETImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RequestKETImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenBuilder.java
index 9d3b82a85..de316fe8d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestSecurityToken;
 
 /**
@@ -28,13 +31,13 @@ import org.opensaml.soap.wstrust.RequestSecurityToken;
 public class RequestSecurityTokenBuilder extends AbstractWSTrustObjectBuilder<RequestSecurityToken> {
 
     /** {@inheritDoc} */
-    public RequestSecurityToken buildObject() {
+    @Nonnull public RequestSecurityToken buildObject() {
         return buildObject(RequestSecurityToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestSecurityToken buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestSecurityTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionBuilder.java
index fafbdad0c..1abb1dd52 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestSecurityTokenCollection;
 
 /**
@@ -27,13 +30,13 @@ public class RequestSecurityTokenCollectionBuilder extends
         AbstractWSTrustObjectBuilder<RequestSecurityTokenCollection> {
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenCollection buildObject() {
+    @Nonnull public RequestSecurityTokenCollection buildObject() {
         return buildObject(RequestSecurityTokenCollection.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenCollection buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestSecurityTokenCollection buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestSecurityTokenCollectionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionImpl.java
index a6d375d8f..e050f3fab 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionImpl.java
@@ -18,13 +18,17 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RequestSecurityToken;
 import org.opensaml.soap.wstrust.RequestSecurityTokenCollection;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestSecurityTokenCollectionImpl.
  * 
@@ -33,7 +37,7 @@ public class RequestSecurityTokenCollectionImpl extends AbstractWSTrustObject
         implements RequestSecurityTokenCollection {
 
     /** The list of wst:RequestSecurityToken child elements. */
-    private List<RequestSecurityToken> requestSecurityTokens;
+    @Nonnull private final List<RequestSecurityToken> requestSecurityTokens;
 
     /**
      * Constructor.
@@ -42,22 +46,20 @@ public class RequestSecurityTokenCollectionImpl extends AbstractWSTrustObject
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestSecurityTokenCollectionImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestSecurityTokenCollectionImpl(@Nullable final String namespaceURI,
+            @Nonnull final String elementLocalName, @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         requestSecurityTokens = new ArrayList<>();
     }
 
     /** {@inheritDoc} */
-    public List<RequestSecurityToken> getRequestSecurityTokens() {
+    @Nonnull public List<RequestSecurityToken> getRequestSecurityTokens() {
         return requestSecurityTokens;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final List<XMLObject> children = new ArrayList<>();
-        children.addAll(requestSecurityTokens);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(requestSecurityTokens);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionUnmarshaller.java
index 621aae5fa..0be5613b2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenCollectionUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.RequestSecurityToken;
@@ -30,8 +32,8 @@ import org.opensaml.soap.wstrust.RequestSecurityTokenCollection;
 public class RequestSecurityTokenCollectionUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestSecurityTokenCollection rstc = (RequestSecurityTokenCollection) parentXMLObject;
         if (childXMLObject instanceof RequestSecurityToken) {
             rstc.getRequestSecurityTokens().add((RequestSecurityToken) childXMLObject);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenImpl.java
index 8605a6c5e..e8d83cbae 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +28,8 @@ import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.RequestSecurityToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestSecurityTokenImpl.
  * 
@@ -35,13 +37,13 @@ import org.opensaml.soap.wstrust.RequestSecurityToken;
 public class RequestSecurityTokenImpl extends AbstractWSTrustObject implements RequestSecurityToken {
     
     /** Context attribute value. */
-    private String context;
+    @Nullable private String context;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -50,43 +52,42 @@ public class RequestSecurityTokenImpl extends AbstractWSTrustObject implements R
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestSecurityTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestSecurityTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getContext() {
+    @Nullable public String getContext() {
         return context;
     }
 
     /** {@inheritDoc} */
-    public void setContext(final String newContext) {
+    public void setContext(@Nullable final String newContext) {
         context = prepareForAssignment(context, newContext);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenMarshaller.java
index 39c86ab09..97e678d0e 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class RequestSecurityTokenMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final RequestSecurityToken rst = (RequestSecurityToken) xmlObject;
         if (rst.getContext() != null) {
             domElement.setAttributeNS(null, RequestSecurityToken.CONTEXT_ATTRIB_NAME, rst.getContext());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseBuilder.java
index 4c5a1aee1..e3f1a5cef 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestSecurityTokenResponse;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestSecurityTokenResponse;
 public class RequestSecurityTokenResponseBuilder extends AbstractWSTrustObjectBuilder<RequestSecurityTokenResponse> {
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponse buildObject() {
+    @Nonnull public RequestSecurityTokenResponse buildObject() {
         return buildObject(RequestSecurityTokenResponse.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponse buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestSecurityTokenResponse buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestSecurityTokenResponseImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionBuilder.java
index 6f1d7e295..54f29551c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestSecurityTokenResponseCollection;
 
 /**
@@ -27,13 +30,13 @@ public class RequestSecurityTokenResponseCollectionBuilder extends
         AbstractWSTrustObjectBuilder<RequestSecurityTokenResponseCollection> {
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponseCollection buildObject() {
+    @Nonnull public RequestSecurityTokenResponseCollection buildObject() {
         return buildObject(RequestSecurityTokenResponseCollection.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestSecurityTokenResponseCollection buildObject( final String namespaceURI, final String localName, 
-            final String namespacePrefix) {
+    @Nonnull public RequestSecurityTokenResponseCollection buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestSecurityTokenResponseCollectionImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionImpl.java
index ded912088..3afc2c092 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionImpl.java
@@ -18,14 +18,18 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.soap.wstrust.RequestSecurityTokenResponse;
 import org.opensaml.soap.wstrust.RequestSecurityTokenResponseCollection;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestSecurityTokenResponseCollectionImpl.
  * 
@@ -34,10 +38,10 @@ public class RequestSecurityTokenResponseCollectionImpl extends AbstractWSTrustO
         RequestSecurityTokenResponseCollection {
 
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /** The list of wst:RequestSecurityTokenResponse child elements. */
-    private List<RequestSecurityTokenResponse> requestSecurityTokenResponses;
+    @Nonnull private final List<RequestSecurityTokenResponse> requestSecurityTokenResponses;
 
     /**
      * Constructor.
@@ -47,28 +51,26 @@ public class RequestSecurityTokenResponseCollectionImpl extends AbstractWSTrustO
      * @param namespacePrefix The namespace prefix of the element
      * 
      */
-    public RequestSecurityTokenResponseCollectionImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestSecurityTokenResponseCollectionImpl(@Nullable final String namespaceURI,
+            @Nonnull final String elementLocalName, @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownAttributes = new AttributeMap(this);
         requestSecurityTokenResponses = new ArrayList<>();
     }
     
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<RequestSecurityTokenResponse> getRequestSecurityTokenResponses() {
+    @Nonnull public List<RequestSecurityTokenResponse> getRequestSecurityTokenResponses() {
         return requestSecurityTokenResponses;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final List<XMLObject> children = new ArrayList<>();
-        children.addAll(requestSecurityTokenResponses);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(requestSecurityTokenResponses);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionMarshaller.java
index 33692136f..a2a63c4b2 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class RequestSecurityTokenResponseCollectionMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final RequestSecurityTokenResponseCollection rstrc = (RequestSecurityTokenResponseCollection) xmlObject;
         XMLObjectSupport.marshallAttributeMap(rstrc.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionUnmarshaller.java
index 75fe0ae83..c8967d2d1 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseCollectionUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,14 +34,15 @@ import org.w3c.dom.Attr;
 public class RequestSecurityTokenResponseCollectionUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final RequestSecurityTokenResponseCollection rstrc = (RequestSecurityTokenResponseCollection) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(rstrc.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestSecurityTokenResponseCollection rstrc = (RequestSecurityTokenResponseCollection) parentXMLObject;
         if (childXMLObject instanceof RequestSecurityTokenResponse) {
             rstrc.getRequestSecurityTokenResponses().add((RequestSecurityTokenResponse) childXMLObject);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseImpl.java
index 7a6abb181..162a3f8cf 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseImpl.java
@@ -17,10 +17,10 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -28,6 +28,8 @@ import org.opensaml.core.xml.util.AttributeMap;
 import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.RequestSecurityTokenResponse;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestSecurityTokenResponseImpl.
  * 
@@ -38,10 +40,10 @@ public class RequestSecurityTokenResponseImpl extends AbstractWSTrustObject impl
     private String context;
     
     /** Wildcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /**
      * Constructor.
@@ -50,43 +52,42 @@ public class RequestSecurityTokenResponseImpl extends AbstractWSTrustObject impl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestSecurityTokenResponseImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestSecurityTokenResponseImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public String getContext() {
+    @Nullable public String getContext() {
         return context;
     }
 
     /** {@inheritDoc} */
-    public void setContext(final String newContext) {
+    public void setContext(@Nullable final String newContext) {
         context = prepareForAssignment(context, newContext);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
-        children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        return CollectionSupport.copyToList(unknownChildren);
     }
     
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseMarshaller.java
index 8d0dc3d36..1242f9f67 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class RequestSecurityTokenResponseMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final RequestSecurityTokenResponse rstr= (RequestSecurityTokenResponse) xmlObject;
         if (rstr.getContext() != null) {
             domElement.setAttributeNS(null, RequestSecurityTokenResponse.CONTEXT_ATTRIB_NAME, rstr.getContext());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseUnmarshaller.java
index 1041b9e62..a7bd1a8f9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenResponseUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -32,7 +34,8 @@ import org.w3c.dom.Attr;
 public class RequestSecurityTokenResponseUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
     
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final RequestSecurityTokenResponse rstr = (RequestSecurityTokenResponse) xmlObject;
         if (RequestSecurityTokenResponse.CONTEXT_ATTRIB_NAME.equals(attribute.getLocalName())) {
             rstr.setContext(attribute.getValue());
@@ -42,8 +45,8 @@ public class RequestSecurityTokenResponseUnmarshaller extends AbstractWSTrustObj
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestSecurityTokenResponse rstr = (RequestSecurityTokenResponse) parentXMLObject;
         rstr.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenUnmarshaller.java
index 528760429..cdb450ff3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestSecurityTokenUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Attr;
 public class RequestSecurityTokenUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final RequestSecurityToken rst = (RequestSecurityToken) xmlObject;
         if (RequestSecurityToken.CONTEXT_ATTRIB_NAME.equals(attribute.getLocalName())) {
             rst.setContext(attribute.getValue());
@@ -41,8 +44,8 @@ public class RequestSecurityTokenUnmarshaller extends AbstractWSTrustObjectUnmar
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestSecurityToken rst = (RequestSecurityToken) parentXMLObject;
         rst.getUnknownXMLObjects().add(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeBuilder.java
index 3ac6207d9..1f16a8c79 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestType;
 
 /**
@@ -28,12 +31,13 @@ import org.opensaml.soap.wstrust.RequestType;
 public class RequestTypeBuilder extends AbstractWSTrustObjectBuilder<RequestType> {
 
     /** {@inheritDoc} */
-    public RequestType buildObject() {
+    @Nonnull public RequestType buildObject() {
         return buildObject(RequestType.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestType buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public RequestType buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new RequestTypeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeImpl.java
index 6d47fcbcf..0e0e1a570 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestTypeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.RequestType;
 
@@ -33,7 +36,8 @@ public class RequestTypeImpl extends XSURIImpl implements RequestType {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestTypeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public RequestTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceBuilder.java
index 5ad2329c8..2c387f2d9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedAttachedReference;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestedAttachedReference;
 public class RequestedAttachedReferenceBuilder extends AbstractWSTrustObjectBuilder<RequestedAttachedReference> {
 
     /** {@inheritDoc} */
-    public RequestedAttachedReference buildObject() {
+    @Nonnull public RequestedAttachedReference buildObject() {
         return buildObject(RequestedAttachedReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestedAttachedReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedAttachedReference buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedAttachedReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceImpl.java
index 983e6b0a2..534bbe148 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedAttachedReferenceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedAttachedReference;
 
 /**
@@ -33,8 +36,8 @@ public class RequestedAttachedReferenceImpl extends RequestedReferenceTypeImpl i
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestedAttachedReferenceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedAttachedReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenBuilder.java
index c17325e96..ccd7d069a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedProofToken;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestedProofToken;
 public class RequestedProofTokenBuilder extends AbstractWSTrustObjectBuilder<RequestedProofToken> {
 
     /** {@inheritDoc} */
-    public RequestedProofToken buildObject() {
+    @Nonnull public RequestedProofToken buildObject() {
         return buildObject(RequestedProofToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestedProofToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedProofToken buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedProofTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenImpl.java
index 1f4f7d810..14ad86a32 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RequestedProofToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestedProofTokenImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.RequestedProofToken;
 public class RequestedProofTokenImpl extends AbstractWSTrustObject implements RequestedProofToken {
     
     /** Unknown child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,28 +43,29 @@ public class RequestedProofTokenImpl extends AbstractWSTrustObject implements Re
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestedProofTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedProofTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenUnmarshaller.java
index 8e123451c..e2cd8e433 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedProofTokenUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.RequestedProofToken;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.RequestedProofToken;
 public class RequestedProofTokenUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestedProofToken rpt = (RequestedProofToken) parentXMLObject;
         rpt.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeImpl.java
index 167945903..07337695d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeImpl.java
@@ -17,14 +17,17 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wssecurity.SecurityTokenReference;
 import org.opensaml.soap.wstrust.RequestedReferenceType;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestedReferenceTypeImpl.
  * 
@@ -32,7 +35,7 @@ import org.opensaml.soap.wstrust.RequestedReferenceType;
 public class RequestedReferenceTypeImpl extends AbstractWSTrustObject implements RequestedReferenceType {
     
     /** SecurityTokenReference child element. */
-    private SecurityTokenReference securityTokenReference;
+    @Nullable private SecurityTokenReference securityTokenReference;
 
     /**
      * Constructor.
@@ -41,28 +44,28 @@ public class RequestedReferenceTypeImpl extends AbstractWSTrustObject implements
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public RequestedReferenceTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedReferenceTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public SecurityTokenReference getSecurityTokenReference() {
+    @Nullable public SecurityTokenReference getSecurityTokenReference() {
         return securityTokenReference;
     }
 
     /** {@inheritDoc} */
-    public void setSecurityTokenReference(final SecurityTokenReference newSecurityTokenReference) {
+    public void setSecurityTokenReference(@Nullable final SecurityTokenReference newSecurityTokenReference) {
         securityTokenReference = prepareForAssignment(securityTokenReference, newSecurityTokenReference);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final List<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (securityTokenReference != null) {
-            children.add(securityTokenReference);
+            return CollectionSupport.singletonList(securityTokenReference);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeUnmarshaller.java
index f93519620..fc90562de 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedReferenceTypeUnmarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wssecurity.SecurityTokenReference;
@@ -31,8 +33,8 @@ import org.opensaml.soap.wstrust.RequestedReferenceType;
 public class RequestedReferenceTypeUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestedReferenceType rrt = (RequestedReferenceType) parentXMLObject;
         if (childXMLObject instanceof SecurityTokenReference) {
             rrt.setSecurityTokenReference((SecurityTokenReference) childXMLObject);
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenBuilder.java
index b4b5f1daa..1ce2fc823 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedSecurityToken;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestedSecurityToken;
 public class RequestedSecurityTokenBuilder extends AbstractWSTrustObjectBuilder<RequestedSecurityToken> {
 
     /** {@inheritDoc} */
-    public RequestedSecurityToken buildObject() {
+    @Nonnull public RequestedSecurityToken buildObject() {
         return buildObject(RequestedSecurityToken.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestedSecurityToken buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedSecurityToken buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedSecurityTokenImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenImpl.java
index 16a73d222..2b576ce78 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RequestedSecurityToken;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * RequestedSecurityTokenImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.RequestedSecurityToken;
 public class RequestedSecurityTokenImpl extends AbstractWSTrustObject implements RequestedSecurityToken {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,28 +43,29 @@ public class RequestedSecurityTokenImpl extends AbstractWSTrustObject implements
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestedSecurityTokenImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedSecurityTokenImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = unknownObject;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+        
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenUnmarshaller.java
index c2c8c169a..1aabb1512 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedSecurityTokenUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.RequestedSecurityToken;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.RequestedSecurityToken;
 public class RequestedSecurityTokenUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final RequestedSecurityToken reqToken = (RequestedSecurityToken) parentXMLObject;
         reqToken.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledBuilder.java
index 9ba6ae7a7..a31420257 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedTokenCancelled;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestedTokenCancelled;
 public class RequestedTokenCancelledBuilder extends AbstractWSTrustObjectBuilder<RequestedTokenCancelled> {
 
     /** {@inheritDoc} */
-    public RequestedTokenCancelled buildObject() {
+    @Nonnull public RequestedTokenCancelled buildObject() {
         return buildObject(RequestedTokenCancelled.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestedTokenCancelled buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedTokenCancelled buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedTokenCancelledImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledImpl.java
index 633306b7b..15bbcf5ff 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedTokenCancelledImpl.java
@@ -19,6 +19,9 @@ package org.opensaml.soap.wstrust.impl;
 
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.RequestedTokenCancelled;
 
@@ -35,13 +38,13 @@ public class RequestedTokenCancelledImpl extends AbstractWSTrustObject implement
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestedTokenCancelledImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedTokenCancelledImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         return null;
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceBuilder.java
index a86417abb..2cf77b42d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedUnattachedReference;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.RequestedUnattachedReference;
 public class RequestedUnattachedReferenceBuilder extends AbstractWSTrustObjectBuilder<RequestedUnattachedReference> {
 
     /** {@inheritDoc} */
-    public RequestedUnattachedReference buildObject() {
+    @Nonnull public RequestedUnattachedReference buildObject() {
         return buildObject(RequestedUnattachedReference.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public RequestedUnattachedReference buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public RequestedUnattachedReference buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new RequestedUnattachedReferenceImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceImpl.java
index 8a455965d..7c82c0594 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/RequestedUnattachedReferenceImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.RequestedUnattachedReference;
 
 /**
@@ -33,8 +36,8 @@ public class RequestedUnattachedReferenceImpl extends RequestedReferenceTypeImpl
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public RequestedUnattachedReferenceImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public RequestedUnattachedReferenceImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeBuilder.java
index 43023e824..054596a15 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignChallenge;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.SignChallenge;
 public class SignChallengeBuilder extends AbstractWSTrustObjectBuilder<SignChallenge> {
 
     /** {@inheritDoc} */
-    public SignChallenge buildObject() {
+    @Nonnull public SignChallenge buildObject() {
         return buildObject(SignChallenge.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SignChallenge buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public SignChallenge buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SignChallengeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeImpl.java
index d69cb87c7..340be9f8a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignChallenge;
 
 /**
@@ -32,7 +35,8 @@ public class SignChallengeImpl extends SignChallengeTypeImpl implements SignChal
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public SignChallengeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public SignChallengeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseBuilder.java
index 2d6664830..54740c138 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignChallengeResponse;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.SignChallengeResponse;
 public class SignChallengeResponseBuilder extends AbstractWSTrustObjectBuilder<SignChallengeResponse> {
 
     /** {@inheritDoc} */
-    public SignChallengeResponse buildObject() {
+    @Nonnull public SignChallengeResponse buildObject() {
         return buildObject(SignChallengeResponse.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SignChallengeResponse buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public SignChallengeResponse buildObject(@Nullable final String namespaceURI,
+            @Nonnull final String localName, @Nullable final String namespacePrefix) {
         return new SignChallengeResponseImpl(namespaceURI, localName, namespacePrefix); }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseImpl.java
index 53a008072..52619db57 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeResponseImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignChallengeResponse;
 
 /**
@@ -32,8 +35,8 @@ public class SignChallengeResponseImpl extends SignChallengeTypeImpl implements
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public SignChallengeResponseImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public SignChallengeResponseImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeImpl.java
index 980adcde6..da3fb1bca 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeImpl.java
@@ -18,9 +18,10 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.XMLObject;
@@ -29,6 +30,8 @@ import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
 import org.opensaml.soap.wstrust.Challenge;
 import org.opensaml.soap.wstrust.SignChallengeType;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * SignChallengeTypeImpl.
  * 
@@ -36,13 +39,13 @@ import org.opensaml.soap.wstrust.SignChallengeType;
 public class SignChallengeTypeImpl extends AbstractWSTrustObject implements SignChallengeType {
     
     /** Wilcard child elements. */
-    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+    @Nonnull private final IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
     
     /** Wildcard attributes. */
-    private AttributeMap unknownAttributes;
+    @Nonnull private final AttributeMap unknownAttributes;
 
     /** {@link Challenge} child element. */
-    private Challenge challenge;
+    @Nullable private Challenge challenge;
 
     /**
      * Constructor.
@@ -51,46 +54,47 @@ public class SignChallengeTypeImpl extends AbstractWSTrustObject implements Sign
      * @param elementLocalName name of the element
      * @param namespacePrefix namespace prefix of the element
      */
-    public SignChallengeTypeImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public SignChallengeTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
         unknownChildren = new IndexedXMLObjectChildrenList<>(this);
         unknownAttributes = new AttributeMap(this);
     }
 
     /** {@inheritDoc} */
-    public Challenge getChallenge() {
+    @Nullable public Challenge getChallenge() {
         return challenge;
     }
 
     /** {@inheritDoc} */
-    public void setChallenge(final Challenge newChallenge) {
+    public void setChallenge(@Nullable final Challenge newChallenge) {
         challenge = prepareForAssignment(challenge, newChallenge);
     }
 
     /** {@inheritDoc} */
-    public AttributeMap getUnknownAttributes() {
+    @Nonnull public AttributeMap getUnknownAttributes() {
         return unknownAttributes;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects() {
+    @Nonnull public List<XMLObject> getUnknownXMLObjects() {
         return unknownChildren;
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getUnknownXMLObjects(final QName typeOrName) {
+    @SuppressWarnings("unchecked")
+    @Nonnull public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
         return (List<XMLObject>) unknownChildren.subList(typeOrName);
     }
     
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final List<XMLObject> children = new ArrayList<>();
         if (challenge != null) {
             children.add(challenge);
         }
         children.addAll(unknownChildren);
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeMarshaller.java
index 444878dfe..b7fde2737 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeMarshaller.java
@@ -17,6 +17,8 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -31,7 +33,8 @@ import org.w3c.dom.Element;
 public class SignChallengeTypeMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final SignChallengeType signChallengeType = (SignChallengeType) xmlObject;
         XMLObjectSupport.marshallAttributeMap(signChallengeType.getUnknownAttributes(), domElement);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeUnmarshaller.java
index a0baf9289..17de9f2ad 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignChallengeTypeUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.util.XMLObjectSupport;
@@ -33,14 +35,15 @@ import org.w3c.dom.Attr;
 public class SignChallengeTypeUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final SignChallengeType signChallengeType= (SignChallengeType) xmlObject;
         XMLObjectSupport.unmarshallToAttributeMap(signChallengeType.getUnknownAttributes(), attribute);
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final SignChallengeType signChallengeType= (SignChallengeType) parentXMLObject;
         
         if (childXMLObject instanceof Challenge) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithBuilder.java
index fe7394db8..532a3f904 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignWith;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.SignWith;
 public class SignWithBuilder extends AbstractWSTrustObjectBuilder<SignWith> {
 
     /** {@inheritDoc} */
-    public SignWith buildObject() {
+    @Nonnull public SignWith buildObject() {
         return buildObject(SignWith.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SignWith buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public SignWith buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SignWithImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithImpl.java
index 6c8452745..aacad48a9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignWithImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.SignWith;
 
@@ -33,7 +36,8 @@ public class SignWithImpl extends XSURIImpl implements SignWith {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public SignWithImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public SignWithImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmBuilder.java
index ce4a760b2..0902840df 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.SignatureAlgorithm;
 
 /**
@@ -26,13 +29,13 @@ import org.opensaml.soap.wstrust.SignatureAlgorithm;
 public class SignatureAlgorithmBuilder extends AbstractWSTrustObjectBuilder<SignatureAlgorithm> {
 
     /** {@inheritDoc} */
-    public SignatureAlgorithm buildObject() {
+    @Nonnull public SignatureAlgorithm buildObject() {
         return buildObject(SignatureAlgorithm.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public SignatureAlgorithm buildObject(final String namespaceURI, final String localName,
-            final String namespacePrefix) {
+    @Nonnull public SignatureAlgorithm buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new SignatureAlgorithmImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmImpl.java
index bda7ee6fd..c306da31a 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/SignatureAlgorithmImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.SignatureAlgorithm;
 
@@ -33,8 +36,8 @@ public class SignatureAlgorithmImpl extends XSURIImpl implements SignatureAlgori
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public SignatureAlgorithmImpl(final String namespaceURI, final String elementLocalName,
-            final String namespacePrefix) {
+    public SignatureAlgorithmImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusBuilder.java
index cd6c7daa7..0922237fe 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.Status;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.Status;
 public class StatusBuilder extends AbstractWSTrustObjectBuilder<Status> {
 
     /** {@inheritDoc} */
-    public Status buildObject() {
+    @Nonnull public Status buildObject() {
         return buildObject(Status.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public Status buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public Status buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new StatusImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusImpl.java
index 7bf609f76..979227f87 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusImpl.java
@@ -18,14 +18,18 @@
 package org.opensaml.soap.wstrust.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.Code;
 import org.opensaml.soap.wstrust.Reason;
 import org.opensaml.soap.wstrust.Status;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * StatusImpl.
  * 
@@ -33,10 +37,10 @@ import org.opensaml.soap.wstrust.Status;
 public class StatusImpl extends AbstractWSTrustObject implements Status {
 
     /** The Code child element. */
-    private Code code;
+    @Nullable private Code code;
 
     /** The Reason child element. */
-    private Reason reason;
+    @Nullable private Reason reason;
 
     /**
      * Constructor.
@@ -45,32 +49,33 @@ public class StatusImpl extends AbstractWSTrustObject implements Status {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public StatusImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public StatusImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public Code getCode() {
+    @Nullable public Code getCode() {
         return code;
     }
 
     /** {@inheritDoc} */
-    public Reason getReason() {
+    @Nullable public Reason getReason() {
         return reason;
     }
 
     /** {@inheritDoc} */
-    public void setCode(final Code newCode) {
+    public void setCode(@Nullable final Code newCode) {
         code = prepareForAssignment(code, newCode);
     }
 
     /** {@inheritDoc} */
-    public void setReason(final Reason newReason) {
+    public void setReason(@Nullable final Reason newReason) {
         reason = prepareForAssignment(reason, newReason);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
+    @Nullable public List<XMLObject> getOrderedChildren() {
         final ArrayList<XMLObject> children = new ArrayList<>();
         if (code != null) {
             children.add(code);
@@ -78,7 +83,7 @@ public class StatusImpl extends AbstractWSTrustObject implements Status {
         if (reason != null) {
             children.add(reason);
         }
-        return Collections.unmodifiableList(children);
+        return CollectionSupport.copyToList(children);
     }
 
-}
+}
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusUnmarshaller.java
index ef51ae444..761d22e0d 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/StatusUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.Code;
@@ -31,8 +33,8 @@ import org.opensaml.soap.wstrust.Status;
 public class StatusUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject) 
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final Status status= (Status) parentXMLObject;
         
         if (childXMLObject instanceof Code) {
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeBuilder.java
index ba1df6c43..c1dd8412b 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.TokenType;
 
 /**
@@ -28,12 +31,13 @@ import org.opensaml.soap.wstrust.TokenType;
 public class TokenTypeBuilder extends AbstractWSTrustObjectBuilder<TokenType> {
 
     /** {@inheritDoc} */
-    public TokenType buildObject() {
+    @Nonnull public TokenType buildObject() {
         return buildObject(TokenType.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public TokenType buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public TokenType buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new TokenTypeImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeImpl.java
index 7c44ac6f9..ae2d81302 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/TokenTypeImpl.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.schema.impl.XSURIImpl;
 import org.opensaml.soap.wstrust.TokenType;
 
@@ -33,7 +36,8 @@ public class TokenTypeImpl extends XSURIImpl implements TokenType {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public TokenTypeImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public TokenTypeImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyBuilder.java
index d9ca183fc..c73bdf2f3 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.UseKey;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.UseKey;
 public class UseKeyBuilder extends AbstractWSTrustObjectBuilder<UseKey> {
 
     /** {@inheritDoc} */
-    public UseKey buildObject() {
+    @Nonnull public UseKey buildObject() {
         return buildObject(UseKey.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public UseKey buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public UseKey buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new UseKeyImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyImpl.java
index 656e6c9d9..25f2e3d50 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.UseKey;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * UseKeyImpl.
  * 
@@ -31,10 +34,10 @@ import org.opensaml.soap.wstrust.UseKey;
 public class UseKeyImpl extends AbstractWSTrustObject implements UseKey {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /** wst:UseKey/@Sig attribute value. */
-    private String sig;
+    @Nullable private String sig;
 
     /**
      * Constructor.
@@ -43,37 +46,38 @@ public class UseKeyImpl extends AbstractWSTrustObject implements UseKey {
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public UseKeyImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public UseKeyImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public String getSig() {
+    @Nullable public String getSig() {
         return sig;
     }
 
     /** {@inheritDoc} */
-    public void setSig(final String newSig) {
+    public void setSig(@Nullable final String newSig) {
         sig = prepareForAssignment(sig, newSig);
     }
     
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyMarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyMarshaller.java
index 75205041b..f1d8ccdaa 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyMarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyMarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.soap.wstrust.UseKey;
@@ -30,7 +32,8 @@ import org.w3c.dom.Element;
 public class UseKeyMarshaller extends AbstractWSTrustObjectMarshaller {
 
     /** {@inheritDoc} */
-    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+    protected void marshallAttributes(@Nonnull final XMLObject xmlObject, @Nonnull final Element domElement)
+            throws MarshallingException {
         final UseKey useKey = (UseKey) xmlObject;
         if (useKey.getSig() != null) {
             domElement.setAttributeNS(null, UseKey.SIG_ATTRIB_NAME, useKey.getSig());
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyUnmarshaller.java
index ac779913f..73585a8a9 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/UseKeyUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.UseKey;
@@ -30,7 +32,8 @@ import org.w3c.dom.Attr;
 public class UseKeyUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+    protected void processAttribute(@Nonnull final XMLObject xmlObject, @Nonnull final Attr attribute)
+            throws UnmarshallingException {
         final UseKey uk = (UseKey) xmlObject;
         
         if (UseKey.SIG_ATTRIB_NAME.equals(attribute.getLocalName())) {
@@ -41,8 +44,8 @@ public class UseKeyUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
     }
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final UseKey uk = (UseKey) parentXMLObject;
         uk.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetBuilder.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetBuilder.java
index 1cfba22ff..295007b10 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetBuilder.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetBuilder.java
@@ -17,6 +17,9 @@
 
 package org.opensaml.soap.wstrust.impl;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.soap.wstrust.ValidateTarget;
 
 /**
@@ -26,12 +29,13 @@ import org.opensaml.soap.wstrust.ValidateTarget;
 public class ValidateTargetBuilder extends AbstractWSTrustObjectBuilder<ValidateTarget> {
 
     /** {@inheritDoc} */
-    public ValidateTarget buildObject() {
+    @Nonnull public ValidateTarget buildObject() {
         return buildObject(ValidateTarget.ELEMENT_NAME);
     }
 
     /** {@inheritDoc} */
-    public ValidateTarget buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+    @Nonnull public ValidateTarget buildObject(@Nullable final String namespaceURI, @Nonnull final String localName,
+            @Nullable final String namespacePrefix) {
         return new ValidateTargetImpl(namespaceURI, localName, namespacePrefix);
     }
 
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetImpl.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetImpl.java
index e73124b5f..2fde31d2c 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetImpl.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetImpl.java
@@ -17,13 +17,16 @@
 
 package org.opensaml.soap.wstrust.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.soap.wstrust.ValidateTarget;
 
+import net.shibboleth.shared.collection.CollectionSupport;
+
 /**
  * ValidateTargetImpl.
  * 
@@ -31,7 +34,7 @@ import org.opensaml.soap.wstrust.ValidateTarget;
 public class ValidateTargetImpl extends AbstractWSTrustObject implements ValidateTarget {
     
     /** Wildcard child element. */
-    private XMLObject unknownChild;
+    @Nullable private XMLObject unknownChild;
 
     /**
      * Constructor.
@@ -40,26 +43,28 @@ public class ValidateTargetImpl extends AbstractWSTrustObject implements Validat
      * @param elementLocalName The local name of the element
      * @param namespacePrefix The namespace prefix of the element
      */
-    public ValidateTargetImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+    public ValidateTargetImpl(@Nullable final String namespaceURI, @Nonnull final String elementLocalName,
+            @Nullable final String namespacePrefix) {
         super(namespaceURI, elementLocalName, namespacePrefix);
     }
 
     /** {@inheritDoc} */
-    public XMLObject getUnknownXMLObject() {
+    @Nullable public XMLObject getUnknownXMLObject() {
         return unknownChild;
     }
 
     /** {@inheritDoc} */
-    public void setUnknownXMLObject(final XMLObject unknownObject) {
+    public void setUnknownXMLObject(@Nullable final XMLObject unknownObject) {
         unknownChild = prepareForAssignment(unknownChild, unknownObject);
     }
 
     /** {@inheritDoc} */
-    public List<XMLObject> getOrderedChildren() {
-        final ArrayList<XMLObject> children = new ArrayList<>();
+    @Nullable public List<XMLObject> getOrderedChildren() {
+
         if (unknownChild != null) {
-            children.add(unknownChild);
+            return CollectionSupport.singletonList(unknownChild);
         }
-        return Collections.unmodifiableList(children);
+        
+        return null;
     }
 }
diff --git a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetUnmarshaller.java b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetUnmarshaller.java
index 79c1bc026..ef87d91bc 100644
--- a/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetUnmarshaller.java
+++ b/opensaml-soap-impl/src/main/java/org/opensaml/soap/wstrust/impl/ValidateTargetUnmarshaller.java
@@ -18,6 +18,8 @@
 package org.opensaml.soap.wstrust.impl;
 
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.soap.wstrust.ValidateTarget;
@@ -29,8 +31,8 @@ import org.opensaml.soap.wstrust.ValidateTarget;
 public class ValidateTargetUnmarshaller extends AbstractWSTrustObjectUnmarshaller {
 
     /** {@inheritDoc} */
-    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
-            throws UnmarshallingException {
+    protected void processChildElement(@Nonnull final XMLObject parentXMLObject,
+            @Nonnull final XMLObject childXMLObject) throws UnmarshallingException {
         final ValidateTarget vt = (ValidateTarget) parentXMLObject;
         vt.setUnknownXMLObject(childXMLObject);
     }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
index f58d29b6d..c1699e01d 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/decoder/http/impl/HttpClientResponseSOAP11DecoderTest.java
@@ -20,6 +20,7 @@ package org.opensaml.soap.client.soap11.decoder.http.impl;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
@@ -28,10 +29,8 @@ import net.shibboleth.shared.xml.SerializeSupport;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.HttpStatus;
-import org.apache.hc.core5.http.HttpVersion;
 import org.apache.hc.core5.http.io.entity.ByteArrayEntity;
 import org.apache.hc.core5.http.message.BasicClassicHttpResponse;
-import org.apache.hc.core5.http.message.BasicHttpResponse;
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.io.MarshallingException;
 import org.opensaml.core.xml.mock.SimpleXMLObject;
@@ -51,6 +50,7 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import org.w3c.dom.Element;
 
+ at SuppressWarnings("javadoc")
 public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
     
     private HttpClientResponseSOAP11Decoder decoder;
@@ -63,9 +63,11 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
     
     @Test
     public void testDecodeToPayload() throws ComponentInitializationException, MessageDecodingException, MarshallingException, IOException {
-        Envelope envelope = buildMessageSkeleton();
-        envelope.getBody().getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
-        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
+        final Envelope envelope = buildMessageSkeleton();
+        final Body body = envelope.getBody();
+        assert body != null;
+        body.getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
+        final ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
         
         decoder.setBodyHandler(new TestPayloadBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -73,23 +75,24 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
         
         decoder.decode();
         
-        MessageContext messageContext = decoder.getMessageContext();
-        
-        Assert.assertNotNull(messageContext);
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
         Assert.assertNotNull(messageContext.getMessage());
         Assert.assertTrue(messageContext.getMessage() instanceof SimpleXMLObject);
         
-        SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class, false);
-        Assert.assertNotNull(soapContext);
+        final SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
+        assert soapContext != null;
         Assert.assertNotNull(soapContext.getEnvelope());
         Assert.assertEquals(soapContext.getHTTPResponseStatus(), Integer.valueOf(HttpStatus.SC_OK));
     }
     
     @Test
     public void testDecodeToEnvelope() throws ComponentInitializationException, MessageDecodingException, MarshallingException, IOException {
-        Envelope envelope = buildMessageSkeleton();
-        envelope.getBody().getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
-        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
+        final Envelope envelope = buildMessageSkeleton();
+        final Body body = envelope.getBody();
+        assert body != null;
+        body.getUnknownXMLObjects().add(buildXMLObject(simpleXMLObjectQName));
+        final ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_OK, envelope);
         
         decoder.setBodyHandler(new TestEnvelopeBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -97,25 +100,26 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
         
         decoder.decode();
         
-        MessageContext messageContext = decoder.getMessageContext();
-        
-        Assert.assertNotNull(messageContext);
+        final MessageContext messageContext = decoder.getMessageContext();
+        assert messageContext != null;
         Assert.assertNotNull(messageContext.getMessage());
         Assert.assertTrue(messageContext.getMessage() instanceof Envelope);
         
-        SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class, false);
-        Assert.assertNotNull(soapContext);
+        final SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
+        assert soapContext != null;
         Assert.assertNotNull(soapContext.getEnvelope());
         Assert.assertEquals(soapContext.getHTTPResponseStatus(), Integer.valueOf(HttpStatus.SC_OK));
     }
     
     @Test(expectedExceptions=SOAP11FaultDecodingException.class)
     public void testFault() throws ComponentInitializationException, MessageDecodingException, MarshallingException, IOException {
-        Fault fault = SOAPSupport.buildSOAP11Fault(new QName("urn:test:soap:fault:foo", "TestFault", "foo"), "Test fault", null, null, null);
+        final Fault fault = SOAPSupport.buildSOAP11Fault(new QName("urn:test:soap:fault:foo", "TestFault", "foo"), "Test fault", null, null, null);
         
-        Envelope envelope = buildMessageSkeleton();
-        envelope.getBody().getUnknownXMLObjects().add(fault);
-        ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, envelope);
+        final Envelope envelope = buildMessageSkeleton();
+        final Body body = envelope.getBody();
+        assert body != null;
+        body.getUnknownXMLObjects().add(fault);
+        final ClassicHttpResponse httpResponse = buildResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR, envelope);
         
         decoder.setBodyHandler(new TestPayloadBodyHandler());
         decoder.setHttpResponse(httpResponse);
@@ -124,39 +128,43 @@ public class HttpClientResponseSOAP11DecoderTest extends XMLObjectBaseTestCase {
         decoder.decode();
     }
     
-    private ClassicHttpResponse buildResponse(int statusResponseCode, Envelope envelope) throws MarshallingException, IOException {
-        BasicClassicHttpResponse response = new BasicClassicHttpResponse(statusResponseCode, null);
-        Element envelopeElement = XMLObjectSupport.marshall(envelope);
+    @Nonnull private ClassicHttpResponse buildResponse(int statusResponseCode, @Nonnull final Envelope envelope)
+            throws MarshallingException, IOException {
+        final BasicClassicHttpResponse response = new BasicClassicHttpResponse(statusResponseCode, null);
+        final Element envelopeElement = XMLObjectSupport.marshall(envelope);
         
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         SerializeSupport.writeNode(envelopeElement, baos);
         baos.flush();
         
-        ByteArrayEntity entity = new ByteArrayEntity(baos.toByteArray(), ContentType.TEXT_XML);
+        final ByteArrayEntity entity = new ByteArrayEntity(baos.toByteArray(), ContentType.TEXT_XML);
         response.setEntity(entity);
         return response;
     }
 
-    private Envelope buildMessageSkeleton() {
-        Envelope envelope = buildXMLObject(Envelope.DEFAULT_ELEMENT_NAME);
-        Body body = buildXMLObject(Body.DEFAULT_ELEMENT_NAME);
+    @Nonnull private Envelope buildMessageSkeleton() {
+        final Envelope envelope = buildXMLObject(Envelope.DEFAULT_ELEMENT_NAME);
+        final Body body = buildXMLObject(Body.DEFAULT_ELEMENT_NAME);
         envelope.setBody(body);
         return envelope;
     }
     
     public class TestEnvelopeBodyHandler extends AbstractMessageHandler {
         /** {@inheritDoc} */
-        protected void doInvoke(MessageContext msgContext) throws MessageHandlerException {
-            Envelope env = (Envelope) msgContext.getSubcontext(SOAP11Context.class).getEnvelope();
+        protected void doInvoke(@Nonnull final MessageContext msgContext) throws MessageHandlerException {
+            final Envelope env = (Envelope) msgContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
             msgContext.setMessage(env);
         }
     }
     
     public class TestPayloadBodyHandler extends AbstractMessageHandler {
         /** {@inheritDoc} */
-        protected void doInvoke(MessageContext msgContext) throws MessageHandlerException {
-            Envelope env = (Envelope) msgContext.getSubcontext(SOAP11Context.class).getEnvelope();
-            msgContext.setMessage(env.getBody().getUnknownXMLObjects().get(0));
+        protected void doInvoke(@Nonnull final MessageContext msgContext) throws MessageHandlerException {
+            final Envelope env = (Envelope) msgContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
+            assert env != null;
+            final Body body = env.getBody();
+            assert body != null;
+            msgContext.setMessage(body.getUnknownXMLObjects().get(0));
         }
     }
 
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
index d00dcdf21..39e728261 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/client/soap11/encoder/http/impl/HttpClientRequestSOAP11EncoderTest.java
@@ -32,6 +32,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
+ at SuppressWarnings("javadoc")
 public class HttpClientRequestSOAP11EncoderTest extends XMLObjectBaseTestCase {
     
     private HttpClientRequestSOAP11Encoder encoder;
@@ -53,15 +54,15 @@ public class HttpClientRequestSOAP11EncoderTest extends XMLObjectBaseTestCase {
     
     @Test
     public void testBasic() throws ComponentInitializationException, MessageEncodingException {
-        SimpleXMLObject sxo = buildXMLObject(SimpleXMLObject.ELEMENT_NAME);
+        final SimpleXMLObject sxo = buildXMLObject(SimpleXMLObject.ELEMENT_NAME);
         messageContext.setMessage(sxo);
         
         encoder.initialize();
         encoder.prepareContext();
         
-        SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
-        Assert.assertNotNull(soapContext);
-        Envelope envelope = soapContext.getEnvelope();
+        final SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
+        assert soapContext != null;
+        final Envelope envelope = soapContext.getEnvelope();
         Assert.assertNotNull(envelope);
         
         encoder.encode();
@@ -75,24 +76,26 @@ public class HttpClientRequestSOAP11EncoderTest extends XMLObjectBaseTestCase {
 
     @Test
     public void testAction() throws ComponentInitializationException, MessageEncodingException {
-        SimpleXMLObject sxo = buildXMLObject(SimpleXMLObject.ELEMENT_NAME);
+        final SimpleXMLObject sxo = buildXMLObject(SimpleXMLObject.ELEMENT_NAME);
         messageContext.setMessage(sxo);
         
         encoder.initialize();
         encoder.prepareContext();
         
-        SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
-        Assert.assertNotNull(soapContext);
-        Envelope envelope = soapContext.getEnvelope();
-        Assert.assertNotNull(envelope);
+        final SOAP11Context soapContext = messageContext.getSubcontext(SOAP11Context.class);
+        assert soapContext != null;
+        final Envelope envelope = soapContext.getEnvelope();
+        assert envelope != null;
         
         // "For real" this would be added by a MessageHandler.  Here just add manually.
-        Action action = buildXMLObject(Action.ELEMENT_NAME);
+        final Action action = buildXMLObject(Action.ELEMENT_NAME);
         action.setURI("urn:test:action:foo");
-        if (envelope.getHeader() == null) {
-            envelope.setHeader((Header) buildXMLObject(Header.DEFAULT_ELEMENT_NAME));
+        Header header = envelope.getHeader();
+        if (header == null) {
+            header = (Header) buildXMLObject(Header.DEFAULT_ELEMENT_NAME);
+            envelope.setHeader(header);
         }
-        envelope.getHeader().getUnknownXMLObjects().add(action);
+        header.getUnknownXMLObjects().add(action);
         
         encoder.encode();
         
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11DecoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11DecoderTest.java
index 7a7751841..3acc6d9ac 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11DecoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/decoder/http/impl/HTTPSOAP11DecoderTest.java
@@ -19,6 +19,8 @@ package org.opensaml.soap.soap11.decoder.http.impl;
 
 import java.io.IOException;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.schema.XSAny;
 import org.opensaml.messaging.context.MessageContext;
@@ -26,6 +28,7 @@ import org.opensaml.messaging.decoder.MessageDecodingException;
 import org.opensaml.messaging.handler.AbstractMessageHandler;
 import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.soap.messaging.context.SOAP11Context;
+import org.opensaml.soap.soap11.Body;
 import org.opensaml.soap.soap11.Envelope;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.testng.Assert;
@@ -73,11 +76,10 @@ public class HTTPSOAP11DecoderTest extends XMLObjectBaseTestCase {
         decoder.initialize();
         
         decoder.decode();
-        MessageContext msgContext = decoder.getMessageContext();
-        
-        Object msg = msgContext.getMessage();
-        Assert.assertNotNull(msg);
+        final MessageContext msgContext = decoder.getMessageContext();
+        assert msgContext != null;
         
+        final Object msg = msgContext.getMessage();
         Assert.assertTrue(msg instanceof Envelope);
     }
     
@@ -96,11 +98,10 @@ public class HTTPSOAP11DecoderTest extends XMLObjectBaseTestCase {
         decoder.initialize();
         
         decoder.decode();
-        MessageContext msgContext = decoder.getMessageContext();
-        
-        Object msg = msgContext.getMessage();
-        Assert.assertNotNull(msg);
+        final MessageContext msgContext = decoder.getMessageContext();
+        assert msgContext != null;
         
+        final Object msg = msgContext.getMessage();
         Assert.assertTrue(msg instanceof XSAny);
     }
     
@@ -161,17 +162,20 @@ public class HTTPSOAP11DecoderTest extends XMLObjectBaseTestCase {
 
     public class TestEnvelopeBodyHandler extends AbstractMessageHandler {
         /** {@inheritDoc} */
-        protected void doInvoke(MessageContext msgContext) throws MessageHandlerException {
-            Envelope env = (Envelope) msgContext.getSubcontext(SOAP11Context.class).getEnvelope();
+        protected void doInvoke(@Nonnull final MessageContext msgContext) throws MessageHandlerException {
+            final Envelope env = (Envelope) msgContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
             msgContext.setMessage(env);
         }
     }
     
     public class TestPayloadBodyHandler extends AbstractMessageHandler {
         /** {@inheritDoc} */
-        protected void doInvoke(MessageContext msgContext) throws MessageHandlerException {
-            Envelope env = (Envelope) msgContext.getSubcontext(SOAP11Context.class).getEnvelope();
-            msgContext.setMessage(env.getBody().getUnknownXMLObjects().get(0));
+        protected void doInvoke(@Nonnull final MessageContext msgContext) throws MessageHandlerException {
+            final Envelope env = (Envelope) msgContext.ensureSubcontext(SOAP11Context.class).getEnvelope();
+            assert env != null;
+            final Body body = env.getBody();
+            assert body != null;
+            msgContext.setMessage(body.getUnknownXMLObjects().get(0));
         }
     }
     
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
index 0cbaca116..eab9464fe 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/encoder/http/impl/HTTPSOAP11EncoderTest.java
@@ -21,6 +21,8 @@ import java.io.ByteArrayInputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 
+import javax.annotation.Nonnull;
+
 import org.opensaml.core.testing.XMLObjectBaseTestCase;
 import org.opensaml.core.xml.XMLObject;
 import org.opensaml.core.xml.XMLObjectBuilder;
@@ -55,6 +57,7 @@ import net.shibboleth.shared.xml.XMLParserException;
 /**
  * Test basic SOAP 1.1 message encoding.
  */
+ at SuppressWarnings("javadoc")
 public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
     
     /**
@@ -310,16 +313,21 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         Assert.assertEquals(response.getStatus(), 500);
         
-        Envelope encodedEnv = (Envelope) parseUnmarshallResourceByteArray(response.getContentAsByteArray(), false);
+        final Envelope encodedEnv = (Envelope) parseUnmarshallResourceByteArray(response.getContentAsByteArray(), false);
         
         Assert.assertNotNull(encodedEnv);
         Assert.assertNotNull(encodedEnv.getBody());
-        Body encodedBody = encodedEnv.getBody();
-        List<XMLObject> faults = encodedBody.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
+        final Body encodedBody = encodedEnv.getBody();
+        assert encodedBody != null;
+        final List<XMLObject> faults = encodedBody.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
         Assert.assertEquals(faults.size(), 1);
-        Fault encodedFault = (Fault) faults.get(0);
-        Assert.assertEquals(encodedFault.getCode().getValue(), FaultCode.SERVER);
-        Assert.assertEquals(encodedFault.getMessage().getValue(), "Something bad happened");
+        final Fault encodedFault = (Fault) faults.get(0);
+        final FaultCode fcode = encodedFault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.SERVER);
+        final FaultString fstring = encodedFault.getMessage();
+        assert fstring != null;
+        Assert.assertEquals(fstring.getValue(), "Something bad happened");
     }
     
     @Test
@@ -361,16 +369,22 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
         Assert.assertEquals(response.getHeader("Cache-control"), "no-cache, no-store", "Unexpected cache controls");
         Assert.assertEquals(response.getStatus(), 500);
         
-        Envelope encodedEnv = (Envelope) parseUnmarshallResourceByteArray(response.getContentAsByteArray(), false);
+        final Envelope encodedEnv = (Envelope) parseUnmarshallResourceByteArray(response.getContentAsByteArray(), false);
         
         Assert.assertNotNull(encodedEnv);
         Assert.assertNotNull(encodedEnv.getBody());
-        Body encodedBody = encodedEnv.getBody();
+        final Body encodedBody = encodedEnv.getBody();
+        assert encodedBody != null;
         List<XMLObject> faults = encodedBody.getUnknownXMLObjects(Fault.DEFAULT_ELEMENT_NAME);
         Assert.assertEquals(faults.size(), 1);
-        Fault encodedFault = (Fault) faults.get(0);
-        Assert.assertEquals(encodedFault.getCode().getValue(), FaultCode.SERVER);
-        Assert.assertEquals(encodedFault.getMessage().getValue(), "Something bad happened");
+        final Fault encodedFault = (Fault) faults.get(0);
+        assert encodedFault != null;
+        final FaultCode fcode = encodedFault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.SERVER);
+        final FaultString fstring = encodedFault.getMessage();
+        assert fstring != null;
+        Assert.assertEquals(fstring.getValue(), "Something bad happened");
     }
     
     @Test
@@ -399,20 +413,20 @@ public class HTTPSOAP11EncoderTest extends XMLObjectBaseTestCase {
     // Helper stuff
     //
 
-    protected XMLObject parseUnmarshallResource(String resource, boolean dropDOM) throws XMLParserException, UnmarshallingException {
+    @Nonnull protected XMLObject parseUnmarshallResource(@Nonnull final String resource, boolean dropDOM) throws XMLParserException, UnmarshallingException {
         Document soapDoc = parserPool.parse(this.getClass().getResourceAsStream(resource));
         return unmarshallXMLObject(soapDoc, dropDOM);
     }
     
-    protected XMLObject parseUnmarshallResourceByteArray(byte [] input, boolean dropDOM) throws XMLParserException, UnmarshallingException {
+    @Nonnull protected XMLObject parseUnmarshallResourceByteArray(byte [] input, boolean dropDOM) throws XMLParserException, UnmarshallingException {
         ByteArrayInputStream bais = new ByteArrayInputStream(input);
         Document soapDoc = parserPool.parse(bais);
         return unmarshallXMLObject(soapDoc, dropDOM);
     }
 
-    protected XMLObject unmarshallXMLObject(Document soapDoc, boolean dropDOM) throws UnmarshallingException {
+    @Nonnull protected XMLObject unmarshallXMLObject(@Nonnull final Document soapDoc, boolean dropDOM) throws UnmarshallingException {
         Element envelopeElem = soapDoc.getDocumentElement();
-        Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(envelopeElem);
+        Unmarshaller unmarshaller = unmarshallerFactory.ensureUnmarshaller(envelopeElem);
         
         Envelope envelope = (Envelope) unmarshaller.unmarshall(envelopeElem);
         if (dropDOM) {
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFaultTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFaultTest.java
index 377ae2153..90dcf77cd 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFaultTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/soap11/profile/impl/AddSOAPFaultTest.java
@@ -17,28 +17,31 @@
 
 package org.opensaml.soap.soap11.profile.impl;
 
-import java.util.Collections;
-
+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.mock.SimpleXMLObject;
 import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.messaging.context.MessageContext;
 import org.opensaml.profile.context.ProfileRequestContext;
 import org.opensaml.profile.testing.ActionTestingSupport;
 import org.opensaml.profile.testing.RequestContextBuilder;
 import org.opensaml.soap.messaging.context.SOAP11Context;
+import org.opensaml.soap.soap11.Detail;
 import org.opensaml.soap.soap11.Fault;
+import org.opensaml.soap.soap11.FaultActor;
 import org.opensaml.soap.soap11.FaultCode;
+import org.opensaml.soap.soap11.FaultString;
 import org.opensaml.soap.util.SOAPSupport;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicates;
-
 /** {@link AddSOAPFault} unit test. */
+ at SuppressWarnings("javadoc")
 public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
     
     private ProfileRequestContext prc;
@@ -56,13 +59,17 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+        
+        Assert.assertNull(mc.getMessage());
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.SERVER);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.SERVER);
         
         Assert.assertNull(fault.getMessage());
     }
@@ -73,39 +80,50 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
+
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+
+        Assert.assertNull(mc.getMessage());
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
-        
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.SERVER);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.SERVER);
         
-        Assert.assertEquals(fault.getMessage().getValue(), "Foo");
+        final FaultString fstring = fault.getMessage();
+        assert fstring != null;
+        Assert.assertEquals(fstring.getValue(), "Foo");
     }
     
     @Test public void testCodeAndStringViaLookupWithDetailedErrors() throws ComponentInitializationException {
         action.setFaultCodeLookupStrategy(FunctionSupport.constant(FaultCode.CLIENT));
         action.setFaultStringLookupStrategy(FunctionSupport.constant("TheClientError"));
         
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysTrue());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysTrue());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
+
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+
+        Assert.assertNull(mc.getMessage());
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
-        
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
-        Assert.assertNotNull(fault.getMessage());
-        Assert.assertEquals(fault.getMessage().getValue(), "TheClientError");
+        final FaultString fstring = fault.getMessage();
+        assert fstring != null;
+        Assert.assertEquals(fstring.getValue(), "TheClientError");
         
         Assert.assertNull(fault.getActor());
         
@@ -116,20 +134,24 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
         action.setFaultCodeLookupStrategy(FunctionSupport.constant(FaultCode.CLIENT));
         action.setFaultStringLookupStrategy(FunctionSupport.constant("TheClientError"));
         
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysFalse());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysFalse());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        Assert.assertNull(mc.getMessage());
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
+        
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
         Assert.assertNull(fault.getMessage());
         
@@ -140,52 +162,63 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void testContextFaultWithDetailedErrors() throws ComponentInitializationException {
         final Fault contextFault = SOAPSupport.buildSOAP11Fault(FaultCode.CLIENT, "TheClientError", "TheFaultActor", 
-                Collections.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
+                CollectionSupport.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
         
         action.setContextFaultStrategy(FunctionSupport.constant(contextFault));
         
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysTrue());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysTrue());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+        Assert.assertNull(mc.getMessage());
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
-        Assert.assertEquals(fault.getMessage().getValue(), "TheClientError");
+        final FaultString fstring = fault.getMessage();
+        assert fstring != null;
+        Assert.assertEquals(fstring.getValue(), "TheClientError");
         
-        Assert.assertEquals(fault.getActor().getURI(), "TheFaultActor");
+        final FaultActor actor = fault.getActor();
+        assert actor != null;
+        Assert.assertEquals(actor.getURI(), "TheFaultActor");
         
-        Assert.assertNotNull(fault.getDetail());
-        Assert.assertEquals(fault.getDetail().getUnknownXMLObjects().size(), 1);
+        final Detail detail = fault.getDetail();
+        assert detail != null;
+        Assert.assertEquals(detail.getUnknownXMLObjects().size(), 1);
     }
     
     @Test public void testContextFaultWithoutDetailedErrors() throws ComponentInitializationException {
         final Fault contextFault = SOAPSupport.buildSOAP11Fault(FaultCode.CLIENT, "TheClientError", "TheFaultActor", 
-                Collections.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
+                CollectionSupport.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
         
         action.setContextFaultStrategy(FunctionSupport.constant(contextFault));
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysFalse());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysFalse());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+        Assert.assertNull(mc.getMessage());
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
         Assert.assertNull(fault.getMessage());
         
@@ -196,23 +229,29 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void testDefaultContextFaultStrategyFromOutbound() throws ComponentInitializationException {
         final Fault contextFault = SOAPSupport.buildSOAP11Fault(FaultCode.CLIENT, "TheClientError", "TheFaultActor", 
-                Collections.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
-        prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).setFault(contextFault);
+                CollectionSupport.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
+        
+        final MessageContext inbound = prc.getInboundMessageContext();
+        assert inbound != null;
+        inbound.ensureSubcontext(SOAP11Context.class).setFault(contextFault);
         
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysFalse());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysFalse());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+        Assert.assertNull(mc.getMessage());
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
         Assert.assertNull(fault.getMessage());
         
@@ -223,23 +262,29 @@ public class AddSOAPFaultTest extends OpenSAMLInitBaseTestCase {
     
     @Test public void testDefaultContextFaultStrategyFromInbound() throws ComponentInitializationException {
         final Fault contextFault = SOAPSupport.buildSOAP11Fault(FaultCode.CLIENT, "TheClientError", "TheFaultActor", 
-                Collections.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
-        prc.getInboundMessageContext().getSubcontext(SOAP11Context.class, true).setFault(contextFault);
+                CollectionSupport.singletonList(XMLObjectSupport.buildXMLObject(SimpleXMLObject.ELEMENT_NAME)), null);
+        
+        final MessageContext inbound = prc.getInboundMessageContext();
+        assert inbound != null;
+        inbound.ensureSubcontext(SOAP11Context.class).setFault(contextFault);
         
-        action.setDetailedErrorsCondition(Predicates.<ProfileRequestContext>alwaysFalse());
+        action.setDetailedErrorsCondition(PredicateSupport.alwaysFalse());
         
         action.initialize();
         
         action.execute(prc);
         ActionTestingSupport.assertProceedEvent(prc);
         
-        Assert.assertNull(prc.getOutboundMessageContext().getMessage());
+        final MessageContext mc = prc.getOutboundMessageContext();
+        assert mc != null;
+        Assert.assertNull(mc.getMessage());
         
-        final Fault fault = prc.getOutboundMessageContext().getSubcontext(SOAP11Context.class, true).getFault();
-        Assert.assertNotNull(fault);
+        final Fault fault = mc.ensureSubcontext(SOAP11Context.class).getFault();
+        assert fault != null;
         
-        Assert.assertNotNull(fault.getCode());
-        Assert.assertEquals(fault.getCode().getValue(), FaultCode.CLIENT);
+        final FaultCode fcode = fault.getCode();
+        assert fcode != null;
+        Assert.assertEquals(fcode.getValue(), FaultCode.CLIENT);
         
         Assert.assertNull(fault.getMessage());
         
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPMessagingBaseTestCase.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPMessagingBaseTestCase.java
index 04bf71b5a..dc5bbcb30 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPMessagingBaseTestCase.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPMessagingBaseTestCase.java
@@ -48,9 +48,10 @@ public class SOAPMessagingBaseTestCase extends XMLObjectBaseTestCase {
         messageContext.setMessage(buildXMLObject(simpleXMLObjectQName));
         
         envelope = buildXMLObject(Envelope.DEFAULT_ELEMENT_NAME);
-        envelope.setBody((Body) buildXMLObject(Body.DEFAULT_ELEMENT_NAME));
-        envelope.getBody().getUnknownXMLObjects().add((XMLObject) messageContext.getMessage());
-        messageContext.getSubcontext(SOAP11Context.class, true).setEnvelope(envelope);
+        final Body body = buildXMLObject(Body.DEFAULT_ELEMENT_NAME);
+        envelope.setBody(body);
+        body.getUnknownXMLObjects().add((XMLObject) messageContext.getMessage());
+        messageContext.ensureSubcontext(SOAP11Context.class).setEnvelope(envelope);
     }
 
 }
\ No newline at end of file
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPTest.java
index 3c3fdd4c4..6c47a376e 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/testing/SOAPTest.java
@@ -82,25 +82,25 @@ public class SOAPTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testSOAPMessage() throws XMLParserException, UnmarshallingException{
-        Document soapDoc = parserPool.parse(SOAPTest.class.getResourceAsStream(soapMessage));
-        Element envelopeElem = soapDoc.getDocumentElement();
-        Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(envelopeElem);
+        final Document soapDoc = parserPool.parse(SOAPTest.class.getResourceAsStream(soapMessage));
+        final Element envelopeElem = soapDoc.getDocumentElement();
+        final Unmarshaller unmarshaller = unmarshallerFactory.ensureUnmarshaller(envelopeElem);
         
-        Envelope envelope = (Envelope) unmarshaller.unmarshall(envelopeElem);
+        final Envelope envelope = (Envelope) unmarshaller.unmarshall(envelopeElem);
         
         // Check to make sure everything unmarshalled okay
-        QName encodingStyleName = new QName("http://schemas.xmlsoap.org/soap/envelope/", "encodingStyle");
+        final QName encodingStyleName = new QName("http://schemas.xmlsoap.org/soap/envelope/", "encodingStyle");
         String encodingStyleValue = envelope.getUnknownAttributes().get(encodingStyleName);
         Assert.assertNotNull(encodingStyleValue, "Encoding style was null");
         Assert.assertEquals(encodingStyleValue, 
                 "http://schemas.xmlsoap.org/soap/encoding/", "Encoding style had unexpected value");
         
-        Header header = envelope.getHeader();
-        Assert.assertNotNull(header, "Header was null");
+        final Header header = envelope.getHeader();
+        assert header != null;
         Assert.assertEquals(header.getUnknownXMLObjects().size(), 1, "Unexpected number of Header children");
         
-        Body body = envelope.getBody();
-        Assert.assertNotNull(body, "Body was null");
+        final Body body = envelope.getBody();
+        assert body != null;
         Assert.assertEquals(body.getUnknownXMLObjects().size(), 1, "Unexpected number of Body children");
         
         // Drop the DOM and remarshall, hopefully we get the same document back
@@ -116,37 +116,37 @@ public class SOAPTest extends XMLObjectBaseTestCase {
      */
     @Test
     public void testSOAPFault() throws XMLParserException, UnmarshallingException{
-        Document soapFaultDoc = parserPool.parse(SOAPTest.class.getResourceAsStream(soapFault));
-        Element envelopeElem = soapFaultDoc.getDocumentElement();
-        Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(envelopeElem);
+        final Document soapFaultDoc = parserPool.parse(SOAPTest.class.getResourceAsStream(soapFault));
+        final Element envelopeElem = soapFaultDoc.getDocumentElement();
+        final Unmarshaller unmarshaller = unmarshallerFactory.ensureUnmarshaller(envelopeElem);
         
-        Envelope envelope = (Envelope) unmarshaller.unmarshall(envelopeElem);
+        final Envelope envelope = (Envelope) unmarshaller.unmarshall(envelopeElem);
         
         // Check to make sure everything unmarshalled okay
-        Header header = envelope.getHeader();
+        final Header header = envelope.getHeader();
         Assert.assertNull(header, "Header was not null");
         
-        Body body = envelope.getBody();
-        Assert.assertNotNull(body, "Body was null");
+        final Body body = envelope.getBody();
+        assert body != null;
         Assert.assertEquals(body.getUnknownXMLObjects().size(), 1, "Unexpected number of Body children");
         
-        Fault fault = (Fault) body.getUnknownXMLObjects().get(0);
-        Assert.assertNotNull(fault, "Fault was null");
+        final Fault fault = (Fault) body.getUnknownXMLObjects().get(0);
+        assert fault != null;
         
-        FaultActor actor = fault.getActor();
-        Assert.assertNotNull(actor, "FaultActor was null");
+        final FaultActor actor = fault.getActor();
+        assert actor != null;
         Assert.assertEquals(actor.getURI(), expectedFaultActor, "FaultActor had unexpected value");
         
-        FaultCode code = fault.getCode();
-        Assert.assertNotNull(code, "FaultCode was null");
+        final FaultCode code = fault.getCode();
+        assert code != null;
         Assert.assertEquals(code.getValue(), expectedFaultCode, "FaultCode had unexpected value");
         
-        FaultString message = fault.getMessage();
-        Assert.assertNotNull(message, "FaultString was null");
+        final FaultString message = fault.getMessage();
+        assert message != null;
         Assert.assertEquals(message.getValue(), expectedFaultString, "FaultString had unexpected value");
         
-        Detail detail = fault.getDetail();
-        Assert.assertNotNull(detail, "Detail was null");
+        final Detail detail = fault.getDetail();
+        assert detail != null;
         Assert.assertEquals(detail.getUnknownXMLObjects().size(), 1, "Unexpected number of Body children");
         
         // Drop the DOM and remarshall, hopefully we get the same document back
@@ -188,7 +188,7 @@ public class SOAPTest extends XMLObjectBaseTestCase {
         Detail detail = (Detail) buildXMLObject(Detail.DEFAULT_ELEMENT_NAME);
         fault.setDetail(detail);
         
-        marshallerFactory.getMarshaller(envelope).marshall(envelope);
+        marshallerFactory.ensureMarshaller(envelope).marshall(envelope);
         assertXMLEquals("Marshalled DOM was not the same as control DOM", soapDoc, envelope);
         
     }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/impl/WSAddressingObjectsTestCase.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/impl/WSAddressingObjectsTestCase.java
index 578fad68e..26dc9b2fe 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/impl/WSAddressingObjectsTestCase.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/impl/WSAddressingObjectsTestCase.java
@@ -24,17 +24,14 @@ import org.opensaml.soap.wsaddressing.Address;
 import org.opensaml.soap.wsaddressing.EndpointReference;
 import org.opensaml.soap.wsaddressing.Metadata;
 import org.opensaml.soap.wsaddressing.ReferenceParameters;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * WSAddressingObjectTestCase is the test case for the WS-Addressing objects.
  * 
  */
+ at SuppressWarnings("javadoc")
 public class WSAddressingObjectsTestCase extends WSBaseTestCase {
 
-    public Logger log= LoggerFactory.getLogger(WSAddressingObjectsTestCase.class);
-
     @Test
     public void testAction() throws Exception {
         Action action= buildXMLObject(Action.ELEMENT_NAME);
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandlerTest.java
index ff905ba03..dd3e58543 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddActionHandlerTest.java
@@ -32,9 +32,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class AddActionHandlerTest extends SOAPMessagingBaseTestCase {
     
     private AddActionHandler handler;
@@ -66,7 +64,7 @@ public class AddActionHandlerTest extends SOAPMessagingBaseTestCase {
 
     @Test
     public void testContext() throws ComponentInitializationException, MessageHandlerException {
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setActionURI("urn:test:action1");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setActionURI("urn:test:action1");
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -79,7 +77,7 @@ public class AddActionHandlerTest extends SOAPMessagingBaseTestCase {
     @Test
     public void testContextOverride() throws ComponentInitializationException, MessageHandlerException {
         handler.setActionURI("urn:test:action1");
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setActionURI("urn:test:action2");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setActionURI("urn:test:action2");
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -109,7 +107,7 @@ public class AddActionHandlerTest extends SOAPMessagingBaseTestCase {
         Fault fault = SOAPSupport.buildSOAP11Fault(FaultCode.SERVER, "MyFault", null, null, null);
         SOAPMessagingSupport.registerSOAP11Fault(getMessageContext(), fault);
         
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setFaultActionURI("urn:test:action1");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setFaultActionURI("urn:test:action1");
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -125,7 +123,7 @@ public class AddActionHandlerTest extends SOAPMessagingBaseTestCase {
         SOAPMessagingSupport.registerSOAP11Fault(getMessageContext(), fault);
         
         handler.setFaultActionURI("urn:test:action1");
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setFaultActionURI("urn:test:action2");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setFaultActionURI("urn:test:action2");
         
         handler.initialize();
         handler.invoke(getMessageContext());
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandlerTest.java
index 59dab4928..b71d402dd 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddMessageIDHandlerTest.java
@@ -31,6 +31,7 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+ at SuppressWarnings("javadoc")
 public class AddMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
     
     private AddMessageIDHandler handler;
@@ -47,7 +48,8 @@ public class AddMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), MessageID.ELEMENT_NAME).isEmpty());
         MessageID messageID = (MessageID) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), MessageID.ELEMENT_NAME).get(0);
-        Assert.assertTrue(messageID.getURI().startsWith("urn:uuid:"));
+        final String uri = messageID.getURI();
+        Assert.assertTrue(uri != null && uri.startsWith("urn:uuid:"));
     }
 
     @Test
@@ -75,7 +77,7 @@ public class AddMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
     
     @Test
     public void testContext() throws ComponentInitializationException, MessageHandlerException {
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setMessageIDURI("urn:test:abc123");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setMessageIDURI("urn:test:abc123");
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -99,7 +101,7 @@ public class AddMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
             }
         });
         
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setMessageIDURI("urn:test:def456");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setMessageIDURI("urn:test:def456");
         
         handler.initialize();
         handler.invoke(getMessageContext());
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandlerTest.java
index c92283c09..2d44a47f8 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/AddRelatesToHandlerTest.java
@@ -32,9 +32,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class AddRelatesToHandlerTest extends SOAPMessagingBaseTestCase {
     
     private AddRelatesToHandler handler;
@@ -54,8 +52,8 @@ public class AddRelatesToHandlerTest extends SOAPMessagingBaseTestCase {
 
     @Test
     public void testContext() throws ComponentInitializationException, MessageHandlerException {
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setRelatesToURI("urn:test:abc123");
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setRelatesToRelationshipType(RelatesTo.RELATIONSHIP_TYPE_REPLY);
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setRelatesToURI("urn:test:abc123");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setRelatesToRelationshipType(RelatesTo.RELATIONSHIP_TYPE_REPLY);
         
         handler.initialize();
         handler.invoke(getMessageContext());
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandlerTest.java
index 74ae7e00c..c7cd3df69 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ExtractMessageIDHandlerTest.java
@@ -28,9 +28,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class ExtractMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
     
     private ExtractMessageIDHandler handler;
@@ -49,7 +47,7 @@ public class ExtractMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
         handler.initialize();
         handler.invoke(getMessageContext());
         
-        Assert.assertEquals(getMessageContext().getSubcontext(WSAddressingContext.class, true).getMessageIDURI(), "abc123");
+        Assert.assertEquals(getMessageContext().ensureSubcontext(WSAddressingContext.class).getMessageIDURI(), "abc123");
         
         Assert.assertTrue(SOAPMessagingSupport.checkUnderstoodHeader(getMessageContext(), messageID));
     }
@@ -59,7 +57,7 @@ public class ExtractMessageIDHandlerTest extends SOAPMessagingBaseTestCase {
         handler.initialize();
         handler.invoke(getMessageContext());
         
-        Assert.assertNull(getMessageContext().getSubcontext(WSAddressingContext.class, false));
+        Assert.assertNull(getMessageContext().getSubcontext(WSAddressingContext.class));
         
         Assert.assertTrue(SOAPMessagingSupport.getInboundSOAPContext(getMessageContext()).getUnderstoodHeaders().isEmpty());
     }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandlerTest.java
index 935c37cbd..1a904d787 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wsaddressing/messaging/impl/ValidateActionHandlerTest.java
@@ -28,9 +28,7 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.shared.component.ComponentInitializationException;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class ValidateActionHandlerTest extends SOAPMessagingBaseTestCase {
     
     private ValidateActionHandler handler;
@@ -72,7 +70,7 @@ public class ValidateActionHandlerTest extends SOAPMessagingBaseTestCase {
         action.setURI("urn:test:action1");
         SOAPMessagingSupport.addHeaderBlock(getMessageContext(), action);
         
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setActionURI("urn:test:action1");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setActionURI("urn:test:action1");
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -87,7 +85,7 @@ public class ValidateActionHandlerTest extends SOAPMessagingBaseTestCase {
         SOAPMessagingSupport.addHeaderBlock(getMessageContext(), action);
         
         handler.setExpectedActionURI("urn:test:action2");
-        getMessageContext().getSubcontext(WSAddressingContext.class, true).setActionURI("urn:test:action1");
+        getMessageContext().ensureSubcontext(WSAddressingContext.class).setActionURI("urn:test:action1");
         
         handler.initialize();
         handler.invoke(getMessageContext());
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/impl/WSSecurityObjectsTestCase.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/impl/WSSecurityObjectsTestCase.java
index 6d969fc4f..9839980e4 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/impl/WSSecurityObjectsTestCase.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/impl/WSSecurityObjectsTestCase.java
@@ -42,7 +42,6 @@ import org.opensaml.soap.wssecurity.Username;
 import org.opensaml.soap.wssecurity.UsernameToken;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.xmlunit.builder.DiffBuilder;
 import org.xmlunit.diff.Diff;
@@ -52,6 +51,7 @@ import org.xmlunit.diff.Diff;
  * objects.
  * 
  */
+ at SuppressWarnings("javadoc")
 public class WSSecurityObjectsTestCase extends WSBaseTestCase {
 
     public Logger log= LoggerFactory.getLogger(WSSecurityObjectsTestCase.class);
@@ -216,6 +216,7 @@ public class WSSecurityObjectsTestCase extends WSBaseTestCase {
         Assert.assertEquals(password.getType(), Password.TYPE_PASSWORD_TEXT);
 
         final List<XMLObject> children= usernameToken.getOrderedChildren();
+        assert children != null;
         Assert.assertEquals(children.size(), 3);
 
         marshallAndUnmarshall(usernameToken);
@@ -237,7 +238,10 @@ public class WSSecurityObjectsTestCase extends WSBaseTestCase {
 
         // unmarshall directly from file
         final UsernameToken ut= unmarshallElement("/org/opensaml/soap/wssecurity/impl/UsernameToken.xml");
-        Assert.assertEquals(ut.getUsername().getValue(), "test");
+        assert ut != null;
+        final Username u = ut.getUsername();
+        assert u != null;
+        Assert.assertEquals(u.getValue(), "test");
         final Password utPassword = (Password) ut.getUnknownXMLObjects(Password.ELEMENT_NAME).get(0);
         Assert.assertNotNull(utPassword);
         Assert.assertEquals(utPassword.getValue(), "test");
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandlerTest.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandlerTest.java
index 43bb10a64..2fc3d5e78 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandlerTest.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wssecurity/messaging/impl/AddTimestampHandlerTest.java
@@ -27,6 +27,8 @@ import net.shibboleth.shared.logic.FunctionSupport;
 import org.opensaml.messaging.handler.MessageHandlerException;
 import org.opensaml.soap.messaging.SOAPMessagingSupport;
 import org.opensaml.soap.testing.SOAPMessagingBaseTestCase;
+import org.opensaml.soap.wssecurity.Created;
+import org.opensaml.soap.wssecurity.Expires;
 import org.opensaml.soap.wssecurity.Security;
 import org.opensaml.soap.wssecurity.Timestamp;
 import org.opensaml.soap.wssecurity.messaging.WSSecurityContext;
@@ -34,9 +36,7 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-/**
- *
- */
+ at SuppressWarnings("javadoc")
 public class AddTimestampHandlerTest extends SOAPMessagingBaseTestCase {
     
     private AddTimestampHandler handler;
@@ -63,41 +63,51 @@ public class AddTimestampHandlerTest extends SOAPMessagingBaseTestCase {
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertNotNull(timestamp.getCreated().getDateTime());
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), timestamp.getCreated().getDateTime().plusMillis(5*60*1000));
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+        
+        final Created created = timestamp.getCreated();
+        assert created != null;
+        final Instant ts = created.getDateTime();
+        assert ts != null;
+        
+        final Expires expires = timestamp.getExpires();
+        assert expires != null;
+        
+        Assert.assertEquals(expires.getDateTime(), ts.plusMillis(5*60*1000));
     }
     
     @Test
     public void testContextBothValues() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        Instant expires = created.plus(5, ChronoUnit.MINUTES);
-        getMessageContext().getSubcontext(WSSecurityContext.class, true).setTimestampCreated(created);
-        getMessageContext().getSubcontext(WSSecurityContext.class, true).setTimestampExpires(expires);
+        final Instant created = Instant.now();
+        final Instant expires = created.plus(5, ChronoUnit.MINUTES);
+        getMessageContext().ensureSubcontext(WSSecurityContext.class).setTimestampCreated(created);
+        getMessageContext().ensureSubcontext(WSSecurityContext.class).setTimestampExpires(expires);
         
         handler.initialize();
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertEquals(timestamp.getCreated().getDateTime(), created);
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), expires);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+
+        final Created c2 = timestamp.getCreated();
+        assert c2 != null;
+        Assert.assertEquals(c2.getDateTime(), created);
+
+        final Expires e2 = timestamp.getExpires();
+        assert e2 != null;
+        Assert.assertEquals(e2.getDateTime(), expires);
     }
     
     @Test
     public void testContextCreated() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        getMessageContext().getSubcontext(WSSecurityContext.class, true).setTimestampCreated(created);
+        final Instant created = Instant.now();
+        getMessageContext().ensureSubcontext(WSSecurityContext.class).setTimestampCreated(created);
         
         handler.initialize();
         handler.invoke(getMessageContext());
@@ -106,56 +116,63 @@ public class AddTimestampHandlerTest extends SOAPMessagingBaseTestCase {
         Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertEquals(timestamp.getCreated().getDateTime(), created);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+        final Created c2 = timestamp.getCreated();
+        assert c2 != null;
+        Assert.assertEquals(c2.getDateTime(), created);
         Assert.assertNull(timestamp.getExpires());
     }
     
     @Test
     public void testContextExpires() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        Instant expires = created.plus(5, ChronoUnit.MINUTES);
-        getMessageContext().getSubcontext(WSSecurityContext.class, true).setTimestampExpires(expires);
+        final Instant created = Instant.now();
+        final Instant expires = created.plus(5, ChronoUnit.MINUTES);
+        getMessageContext().ensureSubcontext(WSSecurityContext.class).setTimestampExpires(expires);
         
         handler.initialize();
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
         Assert.assertNull(timestamp.getCreated());
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), expires);
+
+        final Expires e2 = timestamp.getExpires();
+        assert e2 != null;
+        Assert.assertEquals(e2.getDateTime(), expires);
     }
     
     @Test
     public void testContextCreatedWithOffset() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        Instant expires = created.plus(5, ChronoUnit.MINUTES);
-        getMessageContext().getSubcontext(WSSecurityContext.class, true).setTimestampCreated(created);
+        final Instant created = Instant.now();
+        final Instant expires = created.plus(5, ChronoUnit.MINUTES);
+        getMessageContext().ensureSubcontext(WSSecurityContext.class).setTimestampCreated(created);
         handler.setExpiresOffsetFromCreated(Duration.ofMinutes(5));
         
         handler.initialize();
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertEquals(timestamp.getCreated().getDateTime(), created);
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), expires);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+
+        final Created c2 = timestamp.getCreated();
+        assert c2 != null;
+        Assert.assertEquals(c2.getDateTime(), created);
+
+        final Expires e2 = timestamp.getExpires();
+        assert e2 != null;
+        Assert.assertEquals(e2.getDateTime(), expires);
     }
     
     @Test
     public void testLookupBothValues() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        Instant expires = created.plus(5, ChronoUnit.MINUTES);
+        final Instant created = Instant.now();
+        final Instant expires = created.plus(5, ChronoUnit.MINUTES);
         handler.setCreatedLookup(FunctionSupport.constant(created));
         handler.setExpiresLookup(FunctionSupport.constant(expires));
         
@@ -163,20 +180,24 @@ public class AddTimestampHandlerTest extends SOAPMessagingBaseTestCase {
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertEquals(timestamp.getCreated().getDateTime(), created);
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), expires);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+        
+        final Created c2 = timestamp.getCreated();
+        assert c2 != null;
+        Assert.assertEquals(c2.getDateTime(), created);
+
+        final Expires e2 = timestamp.getExpires();
+        assert e2 != null;
+        Assert.assertEquals(e2.getDateTime(), expires);
     }
     
     @Test
     public void testLookupCreatedWithOffset() throws ComponentInitializationException, MessageHandlerException {
-        Instant created = Instant.now();
-        Instant expires = created.plus(5, ChronoUnit.MINUTES);
+        final Instant created = Instant.now();
+        final Instant expires = created.plus(5, ChronoUnit.MINUTES);
         handler.setCreatedLookup(FunctionSupport.constant(created));
         handler.setExpiresOffsetFromCreated(Duration.ofMinutes(5));
         
@@ -185,14 +206,18 @@ public class AddTimestampHandlerTest extends SOAPMessagingBaseTestCase {
         handler.invoke(getMessageContext());
         
         Assert.assertFalse(SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).isEmpty());
-        Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
+        final Security security = (Security) SOAPMessagingSupport.getOutboundHeaderBlock(getMessageContext(), Security.ELEMENT_NAME).get(0);
         
         Assert.assertFalse(security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).isEmpty());
-        Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
-        Assert.assertNotNull(timestamp.getCreated());
-        Assert.assertEquals(timestamp.getCreated().getDateTime(), created);
-        Assert.assertNotNull(timestamp.getExpires());
-        Assert.assertEquals(timestamp.getExpires().getDateTime(), expires);
+        final Timestamp timestamp = (Timestamp) security.getUnknownXMLObjects(Timestamp.ELEMENT_NAME).get(0);
+        
+        final Created c2 = timestamp.getCreated();
+        assert c2 != null;
+        Assert.assertEquals(c2.getDateTime(), created);
+
+        final Expires e2 = timestamp.getExpires();
+        assert e2 != null;
+        Assert.assertEquals(e2.getDateTime(), expires);
     }
     
 }
diff --git a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wstrust/impl/WSTrustObjectsTestCase.java b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wstrust/impl/WSTrustObjectsTestCase.java
index e954bc0bc..9e435574e 100644
--- a/opensaml-soap-impl/src/test/java/org/opensaml/soap/wstrust/impl/WSTrustObjectsTestCase.java
+++ b/opensaml-soap-impl/src/test/java/org/opensaml/soap/wstrust/impl/WSTrustObjectsTestCase.java
@@ -23,6 +23,7 @@ import org.testng.annotations.BeforeMethod;
 
 import java.time.Instant;
 
+import javax.annotation.Nonnull;
 import javax.xml.namespace.QName;
 
 import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
@@ -60,12 +61,13 @@ import org.opensaml.soap.wstrust.TokenType;
  * WSTrustObjectsTestCase is the base test case for the WS-Trust objects.
  * 
  */
+ at SuppressWarnings("javadoc")
 public class WSTrustObjectsTestCase extends WSBaseTestCase {
     
     /**
      * QName for test Claims element.
      */
-    private static final QName TEST_CLAIMS_QNAME = new QName("urn:test:claims:ns", "TestClaim", "tc");
+    @Nonnull private static final QName TEST_CLAIMS_QNAME = new QName("urn:test:claims:ns", "TestClaim", "tc");
 
     @BeforeMethod
     protected void setUp() throws Exception {
@@ -171,13 +173,19 @@ public class WSTrustObjectsTestCase extends WSBaseTestCase {
     public void testDelegatable() throws Exception {
         Delegatable delegatable= buildXMLObject(Delegatable.ELEMENT_NAME);
         XSBooleanValue value= delegatable.getValue();
-        Assert.assertFalse(value.getValue());
+        assert value != null;
+        Boolean flag = value.getValue();
+        assert flag != null;
+        Assert.assertFalse(flag);
         marshallAndUnmarshall(delegatable);
 
         delegatable= buildXMLObject(Delegatable.ELEMENT_NAME);
         delegatable.setValue(new XSBooleanValue(true, false));
         value= delegatable.getValue();
-        Assert.assertTrue(value.getValue());
+        assert value != null;
+        flag = value.getValue();
+        assert flag != null;
+        Assert.assertTrue(flag);
         marshallAndUnmarshall(delegatable);
     }
 
@@ -332,7 +340,8 @@ public class WSTrustObjectsTestCase extends WSBaseTestCase {
         rst.getUnknownXMLObjects().add(timestamp);
         marshallAndUnmarshall(rst);
 
-        rst= unmarshallElement("/org/opensaml/soap/wstrust/impl/RequestSecurityToken.xml");
+        rst = unmarshallElement("/org/opensaml/soap/wstrust/impl/RequestSecurityToken.xml");
+        assert rst != null;
         rst.releaseDOM();
         marshallAndUnmarshall(rst);
     }
diff --git a/opensaml-testing/src/main/java/org/opensaml/core/testing/XMLObjectBaseTestCase.java b/opensaml-testing/src/main/java/org/opensaml/core/testing/XMLObjectBaseTestCase.java
index dfa5597b9..328b84aec 100644
--- a/opensaml-testing/src/main/java/org/opensaml/core/testing/XMLObjectBaseTestCase.java
+++ b/opensaml-testing/src/main/java/org/opensaml/core/testing/XMLObjectBaseTestCase.java
@@ -38,7 +38,6 @@ import org.opensaml.core.xml.io.UnmarshallerFactory;
 import org.opensaml.core.xml.io.UnmarshallingException;
 import org.opensaml.core.xml.mock.SimpleXMLObject;
 import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.w3c.dom.Document;
@@ -47,6 +46,7 @@ import org.w3c.dom.Node;
 import org.xmlunit.builder.DiffBuilder;
 import org.xmlunit.diff.Diff;
 
+import net.shibboleth.shared.primitive.LoggerFactory;
 import net.shibboleth.shared.xml.ParserPool;
 import net.shibboleth.shared.xml.QNameSupport;
 import net.shibboleth.shared.xml.SerializeSupport;
@@ -58,7 +58,7 @@ import net.shibboleth.shared.xml.XMLParserException;
 public abstract class XMLObjectBaseTestCase extends OpenSAMLInitBaseTestCase {
 
     /** Logger */
-    private final Logger log = LoggerFactory.getLogger(XMLObjectBaseTestCase.class);
+    @Nonnull private final Logger log = LoggerFactory.getLogger(XMLObjectBaseTestCase.class);
 
     /** Parser pool */
     protected static ParserPool parserPool;
@@ -73,7 +73,8 @@ public abstract class XMLObjectBaseTestCase extends OpenSAMLInitBaseTestCase {
     protected static UnmarshallerFactory unmarshallerFactory;
 
     /** QName for SimpleXMLObject */
-    protected static QName simpleXMLObjectQName = new QName(SimpleXMLObject.NAMESPACE, SimpleXMLObject.LOCAL_NAME);
+    @Nonnull protected static QName simpleXMLObjectQName =
+            new QName(SimpleXMLObject.NAMESPACE, SimpleXMLObject.LOCAL_NAME);
 
     @BeforeClass
 	protected void initXMLObjectSupport() throws Exception {

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


More information about the commits mailing list